summaryrefslogtreecommitdiffstats
path: root/krebs/5pkgs
diff options
context:
space:
mode:
authorlassulus <lassulus@lassul.us>2020-05-25 16:08:23 +0200
committerlassulus <lassulus@lassul.us>2020-05-25 16:08:23 +0200
commitbf77db83651898c9e94f84ea5919d8acc15f185a (patch)
treec2b800c5a746fd2021b3621b9c1f83b310e253be /krebs/5pkgs
parent6c8210f93ae6715cbf5aa2adfef8bfd6bfc908b2 (diff)
parenta406f014ea148fe11eb2303a4d631678e41bcd6f (diff)
Merge remote-tracking branch 'ni/master'
Diffstat (limited to 'krebs/5pkgs')
-rw-r--r--krebs/5pkgs/default.nix6
-rw-r--r--krebs/5pkgs/haskell/flameshot-once.nix6
-rw-r--r--krebs/5pkgs/override/default.nix51
-rw-r--r--krebs/5pkgs/simple/flameshot-once/default.nix1
-rw-r--r--krebs/5pkgs/simple/flameshot-once/profile.nix68
-rw-r--r--krebs/5pkgs/simple/htgen-imgur/default.nix29
-rw-r--r--krebs/5pkgs/simple/htgen-imgur/src/htgen-imgur209
-rw-r--r--krebs/5pkgs/simple/htgen/default.nix4
-rw-r--r--krebs/5pkgs/simple/xwaitforwindow.nix15
9 files changed, 377 insertions, 12 deletions
diff --git a/krebs/5pkgs/default.nix b/krebs/5pkgs/default.nix
index 4cdaedebf..ab25934c8 100644
--- a/krebs/5pkgs/default.nix
+++ b/krebs/5pkgs/default.nix
@@ -16,10 +16,4 @@ foldl' mergeAttrs {}
reaktor2 = self.haskellPackages.reaktor2;
ReaktorPlugins = self.callPackage ./simple/Reaktor/plugins.nix {};
-
- # https://github.com/proot-me/PRoot/issues/106
- proot = self.writeDashBin "proot" ''
- export PROOT_NO_SECCOMP=1
- exec ${super.proot}/bin/proot "$@"
- '';
}
diff --git a/krebs/5pkgs/haskell/flameshot-once.nix b/krebs/5pkgs/haskell/flameshot-once.nix
index 5b369362e..1b54f7db6 100644
--- a/krebs/5pkgs/haskell/flameshot-once.nix
+++ b/krebs/5pkgs/haskell/flameshot-once.nix
@@ -4,11 +4,11 @@
}:
mkDerivation {
pname = "flameshot-once";
- version = "1.2.0";
+ version = "1.3.0";
src = fetchgit {
url = "https://cgit.krebsco.de/flameshot-once";
- sha256 = "01c11dk8ss37awfn9xqsgx668dcrf4kvzfxlq7ycnqsnpbjjvm0a";
- rev = "cebaefa37095e74ad2253c4e2f9d9ab390f88737";
+ sha256 = "1jy73379srnkq79i7k3al406r0kb3pxwgg6f64i89jhzxjn7zmzl";
+ rev = "81ce6b9bb68c2739ec5bda067fcfaeab931d55dd";
fetchSubmodules = true;
};
isLibrary = false;
diff --git a/krebs/5pkgs/override/default.nix b/krebs/5pkgs/override/default.nix
new file mode 100644
index 000000000..7a7b979c4
--- /dev/null
+++ b/krebs/5pkgs/override/default.nix
@@ -0,0 +1,51 @@
+with import <stockholm/lib>;
+self: super: {
+
+ flameshot = super.flameshot.overrideAttrs (old: rec {
+ patches = old.patches or [] ++ [
+ (self.writeText "flameshot-imgur.patch" /* diff */ ''
+--- a/src/tools/imgur/imguruploader.cpp
++++ b/src/tools/imgur/imguruploader.cpp
+@@ -40,6 +40,7 @@
+ #include <QTimer>
+ #include <QJsonDocument>
+ #include <QJsonObject>
++#include <stdlib.h>
+
+ ImgurUploader::ImgurUploader(const QPixmap &capture, QWidget *parent) :
+ QWidget(parent), m_pixmap(capture)
+@@ -74,7 +75,10 @@ void ImgurUploader::handleReply(QNetworkReply *reply) {
+ QJsonObject json = response.object();
+ QJsonObject data = json["data"].toObject();
+ m_imageURL.setUrl(data["link"].toString());
+- m_deleteImageURL.setUrl(QString("https://imgur.com/delete/%1").arg(
++ char *deleteImageURLPattern = secure_getenv("IMGUR_DELETE_URL");
++ if (deleteImageURLPattern == NULL)
++ deleteImageURLPattern = "https://imgur.com/delete/%1";
++ m_deleteImageURL.setUrl(QString(deleteImageURLPattern).arg(
+ data["deletehash"].toString()));
+ onUploadOk();
+ } else {
+@@ -105,7 +109,10 @@ void ImgurUploader::upload() {
+ QString description = FileNameHandler().parsedPattern();
+ urlQuery.addQueryItem("description", description);
+
+- QUrl url("https://api.imgur.com/3/image");
++ char *createImageURLPattern = secure_getenv("IMGUR_CREATE_URL");
++ if (createImageURLPattern == NULL)
++ createImageURLPattern = "https://api.imgur.com/3/image";
++ QUrl url(createImageURLPattern);
+ url.setQuery(urlQuery);
+ QNetworkRequest request(url);
+ request.setHeader(QNetworkRequest::ContentTypeHeader,
+ '')
+ ];
+ });
+
+ # https://github.com/proot-me/PRoot/issues/106
+ proot = self.writeDashBin "proot" ''
+ export PROOT_NO_SECCOMP=1
+ exec ${super.proot}/bin/proot "$@"
+ '';
+
+}
diff --git a/krebs/5pkgs/simple/flameshot-once/default.nix b/krebs/5pkgs/simple/flameshot-once/default.nix
index c442a2e96..20c709fb5 100644
--- a/krebs/5pkgs/simple/flameshot-once/default.nix
+++ b/krebs/5pkgs/simple/flameshot-once/default.nix
@@ -16,6 +16,7 @@ in
pkgs.flameshot
pkgs.qt5.qtbase
pkgs.xclip
+ pkgs.xwaitforwindow
]}
${optionalString (config != null) /* sh */ ''
. ${import ./profile.nix { inherit config pkgs; }}
diff --git a/krebs/5pkgs/simple/flameshot-once/profile.nix b/krebs/5pkgs/simple/flameshot-once/profile.nix
index 8ea8a850c..4427e5b23 100644
--- a/krebs/5pkgs/simple/flameshot-once/profile.nix
+++ b/krebs/5pkgs/simple/flameshot-once/profile.nix
@@ -48,7 +48,9 @@ let
"SAVE"
"EXIT"
"BLUR"
- ];
+ ]
+ ++ optional cfg.imgur.enable "IMAGEUPLOADER"
+ ;
type = types.listOf (types.enum (attrNames ButtonType));
};
disabledTrayIcon = mkOption {
@@ -65,6 +67,44 @@ let
# This is types.filename extended by [%:][%:+]*
types.addCheck types.str (test "[%:0-9A-Za-z._][%:+0-9A-Za-z._-]*");
};
+ imgur = mkOption {
+ default = {};
+ type = types.submodule {
+ options = {
+ enable = mkEnableOption "imgur";
+ createUrl = mkOption {
+ example = "http://p.r/image";
+ type = types.str;
+ };
+ deleteUrl = mkOption {
+ example = "http://p.r/image/delete/%1";
+ type = types.str;
+ };
+ xdg-open = mkOption {
+ default = {};
+ type = types.submodule {
+ options = {
+ enable = mkEnableOption "imgur.xdg-open" // {
+ default = true;
+ };
+ browser = mkOption {
+ default = "${pkgs.coreutils}/bin/false";
+ type = types.str;
+ };
+ createPrefix = mkOption {
+ default = cfg.imgur.createUrl;
+ type = types.str;
+ };
+ deletePrefix = mkOption {
+ default = removeSuffix "/%1" cfg.imgur.deleteUrl;
+ type = types.str;
+ };
+ };
+ };
+ };
+ };
+ };
+ };
savePath = mkOption {
default = "/tmp";
type = types.absolute-pathname;
@@ -135,4 +175,30 @@ in
export FLAMESHOT_CAPTURE_PATH=${cfg.savePath}
export FLAMESHOT_ONCE_TIMEOUT=${toString cfg.timeout}
export XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
+ ${optionalString cfg.imgur.enable /* sh */ ''
+ export IMGUR_CREATE_URL=${shell.escape cfg.imgur.createUrl}
+ export IMGUR_DELETE_URL=${shell.escape cfg.imgur.deleteUrl}
+ ${optionalString cfg.imgur.xdg-open.enable /* sh */ ''
+ PATH=$PATH:${makeBinPath [
+ (pkgs.writeDashBin "xdg-open" ''
+ set -efu
+ uri=$1
+ prefix=$(${pkgs.coreutils}/bin/dirname "$uri")
+ case $prefix in
+ (${shell.escape cfg.imgur.xdg-open.createPrefix})
+ echo "opening image in browser: $uri" >&2
+ exec ${config.imgur.xdg-open.browser} "$uri"
+ ;;
+ (${shell.escape cfg.imgur.xdg-open.deletePrefix})
+ echo "deleting image: $uri" >&2
+ exec ${pkgs.curl}/bin/curl -fsS -X DELETE "$uri"
+ ;;
+ (*)
+ echo "don't know how to open URI: $uri" >&2
+ exit 1
+ esac
+ '')
+ ]}
+ ''}
+ ''}
''
diff --git a/krebs/5pkgs/simple/htgen-imgur/default.nix b/krebs/5pkgs/simple/htgen-imgur/default.nix
new file mode 100644
index 000000000..fe0b2ab04
--- /dev/null
+++ b/krebs/5pkgs/simple/htgen-imgur/default.nix
@@ -0,0 +1,29 @@
+with import <stockholm/lib>;
+{ attr, coreutils, exiv2, findutils, gnugrep, jq, nix, utillinux, stdenv }:
+stdenv.mkDerivation rec {
+ pname = "htgen-imgur";
+ version = "1.0.0";
+
+ src = ./src;
+
+ buildPhase = ''
+ (
+ exec > htgen-imgur
+ echo PATH=${makeBinPath [
+ attr
+ coreutils
+ exiv2
+ findutils
+ gnugrep
+ jq
+ nix utillinux
+ ]}
+ echo STATEDIR=${shell.escape "\${STATEDIR-$HOME}"}
+ cat $src/htgen-imgur
+ )
+ '';
+
+ installPhase = ''
+ install -D htgen-imgur $out/bin/htgen-imgur
+ '';
+}
diff --git a/krebs/5pkgs/simple/htgen-imgur/src/htgen-imgur b/krebs/5pkgs/simple/htgen-imgur/src/htgen-imgur
new file mode 100644
index 000000000..af092d007
--- /dev/null
+++ b/krebs/5pkgs/simple/htgen-imgur/src/htgen-imgur
@@ -0,0 +1,209 @@
+find_item() {
+ if test ${#1} -ge 7; then
+ set -- "$(find "$STATEDIR/items" -mindepth 1 -maxdepth 1 \
+ -regex "$STATEDIR/items/$1[0-9A-Za-z]*$")"
+ if test -n "$1" && test $(echo "$1" | wc -l) = 1; then
+ echo "$1"
+ return 0
+ fi
+ fi
+ return 1
+}
+
+# https://api.imgur.com/models/basic
+basic_response() {(
+ status_code=$1
+ status_reason=$2
+ data=${3-null}
+
+ response_body=$(jq -cn \
+ --argjson data "$data" \
+ --argjson status "$status_code" \
+ '
+ {
+ data: $data,
+ status: $status,
+ success: (200 <= $status and $status <= 299),
+ }
+ ')
+
+ printf "HTTP/1.1 $status_code $status_reason\r\n"
+ printf 'Connection: close\r\n'
+ printf 'Content-Length: %d\r\n' $(expr ${#response_body} + 1)
+ printf 'Content-Type: application/json; charset=UTF-8\r\n'
+ printf 'Server: %s\r\n' "$Server"
+ printf '\r\n'
+ printf '%s\n' "$response_body"
+
+)}
+
+file_response() {
+ jq -n -r \
+ --argjson data "$(attr -q -g data "$1")" \
+ --arg server "$Server" \
+ '
+ [ "HTTP/1.1 200 OK\r"
+ , "Connection: close\r"
+ , "Content-Length: \($data.size)\r"
+ , "Content-Type: \($data.type)\r"
+ , "Server: \($server)\r"
+ , "\r"
+ ][]
+ '
+ cat "$1"
+}
+
+read_uri() {
+ jq -cn --arg uri "$1" '
+ $uri |
+ capture("^((?<scheme>[^:]*):)?(//(?<authority>[^/]*))?(?<path>[^?#]*)([?](?<query>[^#]*))?([#](?<fragment>.*))?$") |
+ . + {
+ query: (.query | if . != null then
+ split("&") |
+ map(split("=") | {key:.[0],value:.[1]}) |
+ from_entries
+ else . end)
+ }
+ '
+}
+
+uri=$(read_uri "$Request_URI")
+path=$(jq -nr --argjson uri "$uri" '$uri.path')
+
+case "$Method $path" in
+ 'POST /image')
+ echo create image >&2
+
+ content=$(mktemp -t htgen.$$.content.XXXXXXXX)
+ trap "rm $content >&2" EXIT
+
+ case ${req_expect-} in 100-continue)
+ printf 'HTTP/1.1 100 Continue\r\n\r\n'
+ esac
+
+ head -c $req_content_length > $content
+
+ sha256=$(sha256sum -b $content | cut -d\ -f1)
+ base32=$(nix-hash --to-base32 --type sha256 $sha256)
+ item=$STATEDIR/items/$base32
+
+ if ! test -e $item; then
+ mkdir -v -p $STATEDIR/items >&2
+ cp -v $content $item >&2
+ fi
+
+ base32short=$(echo $base32 | cut -b-7)
+
+ scheme=${req_x_forwarded_proto-http}
+ link=$scheme://$req_host/image/$base32short
+
+ if item=$(find_item $base32short); then
+
+ deletehash=$(uuidgen)
+
+ info=$(
+ exiv2 print "$item" |
+ jq -csR '
+ split("\n") |
+ map(
+ match("^(.*\\S)\\s*:\\s*(.*)").captures |
+ map(.string) |
+ {key:.[0],value:.[1]}
+ ) |
+ from_entries |
+
+ . + (
+ .["Image size"] |
+ match("^(?<width>[0-9]+)\\s*x\\s*(?<height>[0-9]+)$").captures |
+ map({key:.name,value:(.string|tonumber)}) |
+ from_entries
+ ) |
+ . + (
+ .["File size"] |
+ match("^(?<size>[0-9]+)\\s*Bytes$").captures |
+ map({key:.name,value:(.string|tonumber)}) |
+ from_entries
+ ) |
+ .
+ '
+ )
+
+ data=$(jq -cn \
+ --arg deletehash "$deletehash" \
+ --arg id "$base32" \
+ --arg link "$link" \
+ --argjson info "$info" \
+ --argjson uri "$uri" \
+ '
+ {
+ id: $id,
+ title: $uri.query.title,
+ description: $uri.query.description,
+ datetime: now,
+ type: $info["MIME type"],
+ animated: false,
+ width: $info.width,
+ height: $info.height,
+ size: $info.size,
+ views: 0,
+ bandwidth: 0,
+ vote: null,
+ favorite: false,
+ nsfw: null,
+ section: null,
+ account_url: null,
+ acount_id: 0,
+ is_ad: false,
+ is_most_viral: false,
+ tags: [],
+ ad_type: 0,
+ ad_url: "",
+ in_gallery: false,
+ deletehash: @uri "\($id)?deletehash=\($deletehash)",
+ name: "",
+ link: $link,
+ }
+ ')
+
+ attr -q -s deletehash -V "$deletehash" "$item"
+ attr -q -s data -V "$data" "$item"
+
+ basic_response 200 OK "$data"
+ exit
+ fi
+ ;;
+ 'GET /image/'*)
+ basename=$(basename "$path")
+ if printf %s "$basename" | grep -q '^[0-9a-z]\+$'; then
+ if item=$(find_item "$basename"); then
+ echo get image >&2
+ file_response "$item"
+ exit
+ fi
+ fi
+ ;;
+ 'DELETE /image/delete/'*)
+ basename=$(basename "$path")
+ if printf %s "$basename" | grep -q '^[0-9a-z]\+$'; then
+ if item=$(find_item "$basename"); then
+
+ deletehash=$(jq -nr --argjson uri "$uri" '$uri.query.deletehash')
+
+ stored_deletehash=$(attr -q -g deletehash "$item")
+
+ if test "$deletehash" = "$stored_deletehash"; then
+ echo "delete image" >&2
+
+ rm -v "$item" >&2
+
+ basic_response 200 OK
+ exit
+ else
+ echo "delete image error: bad deletehash provided: $deletehash" >&2
+ basic_response 401 'Unauthorized'
+ exit
+ fi
+ fi
+ fi
+ ;;
+esac
diff --git a/krebs/5pkgs/simple/htgen/default.nix b/krebs/5pkgs/simple/htgen/default.nix
index 0fca8bdf2..a44c1a7d0 100644
--- a/krebs/5pkgs/simple/htgen/default.nix
+++ b/krebs/5pkgs/simple/htgen/default.nix
@@ -1,14 +1,14 @@
{ coreutils, dash, fetchgit, gnused, stdenv, ucspi-tcp }:
with import <stockholm/lib>;
let
- version = "1.2.2";
+ version = "1.2.3";
in stdenv.mkDerivation {
name = "htgen-${version}";
src = fetchgit {
url = "http://cgit.krebsco.de/htgen";
rev = "refs/tags/v${version}";
- sha256 = "0a8vn35vq6pxgk6d3d2cjp0vdxzq9nqf0zgkvnd6668v4cmdf91b";
+ sha256 = "0lml336w31ckgspp633ym2jnppzln3f8mvmy3y2vz9yanf59j0hb";
};
installPhase = ''
diff --git a/krebs/5pkgs/simple/xwaitforwindow.nix b/krebs/5pkgs/simple/xwaitforwindow.nix
new file mode 100644
index 000000000..41ce65022
--- /dev/null
+++ b/krebs/5pkgs/simple/xwaitforwindow.nix
@@ -0,0 +1,15 @@
+{ writeDashBin, xdotool, xorg }:
+writeDashBin "xwaitforwindow" ''
+ # usage: xwaitforwindow ARGS
+ # see xdotool search for possible ARGS
+ # example: xwaitforwindow -name WINDOWNAME
+ set -efu
+
+ if id=$(${xdotool}/bin/xdotool search "$@"); then
+ printf 'waiting for window %#x\n' "$id" >&2
+ exec ${xorg.xprop}/bin/xprop -spy -id "$id" >/dev/null
+ else
+ printf 'no window found with xdotool search %s\n' "$*" >&2
+ exit 1
+ fi
+''