about summary refs log tree commit diff
path: root/pkgs/aszlig
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/aszlig')
-rwxr-xr-xpkgs/aszlig/aacolorize/aacolorize.py182
-rw-r--r--pkgs/aszlig/aacolorize/default.nix13
-rw-r--r--pkgs/aszlig/axbo/default.nix53
-rw-r--r--pkgs/aszlig/default.nix14
-rw-r--r--pkgs/aszlig/git-detach/default.nix33
-rw-r--r--pkgs/aszlig/grandpa/default.nix18
-rw-r--r--pkgs/aszlig/librxtx-java/default.nix47
-rw-r--r--pkgs/aszlig/lockdev/default.nix23
-rw-r--r--pkgs/aszlig/nixops/default.nix37
-rw-r--r--pkgs/aszlig/pvolctrl/default.nix35
-rw-r--r--pkgs/aszlig/santander/default.nix155
-rw-r--r--pkgs/aszlig/santander/pipelight.patch13
-rw-r--r--pkgs/aszlig/santander/wine-no-unixfs.patch292
-rw-r--r--pkgs/aszlig/santander/winscard.patch11
-rw-r--r--pkgs/aszlig/tomahawk/default.nix90
15 files changed, 1016 insertions, 0 deletions
diff --git a/pkgs/aszlig/aacolorize/aacolorize.py b/pkgs/aszlig/aacolorize/aacolorize.py
new file mode 100755
index 00000000..ff19b687
--- /dev/null
+++ b/pkgs/aszlig/aacolorize/aacolorize.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+import os
+import sys
+
+from optparse import Option, OptionParser
+
+COLORS = {
+    "k": (30, "Black"),
+    "r": (31, "Red"),
+    "g": (32, "Green"),
+    "y": (33, "Yellow"),
+    "b": (34, "Blue"),
+    "p": (35, "Pink"),
+    "c": (36, "Cyan"),
+    "w": (37, "White"),
+}
+
+ESC = chr(27)
+
+class ColorizeError(Exception):
+    pass
+
+class Color(object):
+    def __init__(self, ident=None):
+        """
+        Initialize a color object, if no `ident` is given or it's invalid,
+        the Color object represents "no color".
+        """
+        if ident is not None:
+            spec = COLORS.get(ident.lower(), None)
+        else:
+            spec = None
+
+        if spec is None:
+            self.ident = None
+            self.bold = False
+            self.code = None
+            self.name = "None"
+        else:
+            self.ident = ident
+            self.code, self.name = spec
+
+            if ident.isupper():
+                self.bold = True
+            else:
+                self.bold = False
+
+    @property
+    def attrs(self):
+        """
+        A tuple consisting of the SGR attributes.
+        """
+        if self.ident is None:
+            return ()
+
+        if self.bold:
+            return (1, self.code)
+        else:
+            return (self.code,)
+
+    def sgr_attrs(self, *attrs):
+        """
+        Return the attributes specified by `attrs` formatted according
+        to the CSI specification.
+        """
+        return ';'.join(map(lambda c: str(c), attrs))
+
+    def sgr(self, *attrs):
+        """
+        Start Set Graphics Rendition
+        Return the CSI escape code for `attrs`.
+        """
+        return "%s[%sm" % (ESC, self.sgr_attrs(*attrs))
+
+    def sgr_start(self):
+        """
+        Start Set Graphics Rendition
+        Return the CSI start escape code for the current color.
+        """
+        return self.sgr(*self.attrs)
+
+    def sgr_stop(self):
+        """
+        Clear Set Graphics Rendition
+        """
+        return self.sgr()
+
+    def apply(self, value):
+        """
+        Apply the current color to the string in `value`.
+        """
+        return "%s%s%s" % (self.sgr_start(), value, self.sgr_stop())
+
+    def describe(self):
+        """
+        Return the description of the current color IN color :-)
+        """
+        fmt = "%c: <ESC>[%sm -> [%s]"
+        return fmt % (
+            self.ident,
+            self.sgr_attrs(*self.attrs),
+            self.apply(self.name)
+        )
+
+    def transform_to(self, new_color):
+        """
+        Return the CSI sequences needed to transform into `new_color`.
+        """
+        if self.ident is None and new_color.ident is not None:
+            return new_color.sgr_start()
+        elif self.ident is not None and new_color.ident is None:
+            return self.sgr_stop()
+        elif self.ident is None and new_color.ident is None:
+            return ''
+        elif self.code == new_color.code:
+            if not self.bold and new_color.bold:
+                return self.sgr(1)
+            elif self.bold and not new_color.bold:
+                return self.sgr(22)
+            elif self.bold == new_color.bold:
+                return ''
+        else:
+            if self.bold and new_color.bold:
+                return new_color.sgr(new_color.code)
+
+        return self.sgr_stop()+new_color.sgr_start()
+
+    def __repr__(self):
+        if self.bold:
+            return "<Bold color %s>" % self.name.lower()
+        else:
+            return "<Color %s>" % self.name.lower()
+
+def print_colortable():
+    for ident in COLORS.iterkeys():
+        normal = Color(ident).describe()
+        bold = Color(ident.upper()).describe()
+        sys.stdout.write("%-35s%s\n" % (normal, bold))
+
+def colorize_art(art, colmap):
+    if len(art) != len(colmap):
+        raise ColorizeError("Art and colormap differ in size!")
+
+    no_color = Color()
+
+    out = ""
+    last_color = no_color
+    for i, char in enumerate(colmap):
+        color = Color(char)
+        out += last_color.transform_to(color) + art[i]
+        last_color = color
+
+    last_color.transform_to(no_color)
+
+    return out
+
+def colorize_file(artfile, mapfile=None):
+    if mapfile is None:
+        mapfile = os.path.splitext(artfile)[0]+'.colmap'
+
+    asciiart = open(artfile, 'r').read()
+    colormap = open(mapfile, 'r').read()
+
+    return colorize_art(asciiart, colormap)
+
+if __name__ == "__main__":
+    parser = OptionParser(usage="%prog [options] artfile [mapfile]")
+    parser.add_option("-t", "--table", action="store_true", dest="table",
+                      help="Show color table and exit.")
+
+    (options, args) = parser.parse_args()
+
+    if options.table:
+        print_colortable()
+        parser.exit()
+
+    if not len(args) in (1, 2):
+        parser.print_help()
+        parser.exit()
+    else:
+        colorized = colorize_file(*args)
+        sys.stdout.write(colorized)
diff --git a/pkgs/aszlig/aacolorize/default.nix b/pkgs/aszlig/aacolorize/default.nix
new file mode 100644
index 00000000..ef36f4e0
--- /dev/null
+++ b/pkgs/aszlig/aacolorize/default.nix
@@ -0,0 +1,13 @@
+{ pythonPackages, runCommand }:
+
+pythonPackages.buildPythonPackage {
+  name = "aacolorize";
+  src = runCommand "aacolorize-src" {} ''
+    mkdir -p "$out"
+    cp "${./aacolorize.py}" "$out/aacolorize"
+    cat > "$out/setup.py" <<SETUP
+    from distutils.core import setup
+    setup(name='aacolorize', scripts=['aacolorize'])
+    SETUP
+  '';
+}
diff --git a/pkgs/aszlig/axbo/default.nix b/pkgs/aszlig/axbo/default.nix
new file mode 100644
index 00000000..fe503863
--- /dev/null
+++ b/pkgs/aszlig/axbo/default.nix
@@ -0,0 +1,53 @@
+{ stdenv, fetchurl, fetchFromGitHub, jdk, jre, ant, makeWrapper
+, commonsLogging, librxtx_java
+}:
+
+stdenv.mkDerivation rec {
+  name = "axbo-research-${version}";
+  version = "3.0.12";
+
+  src = fetchFromGitHub {
+    owner = "jansolo";
+    repo = "aXbo-research";
+    #rev = "aXbo-research_${version}";
+    # Includes MIT license:
+    rev = "6e6888917b5f200a44509650d6f46ec42c133cdc";
+    sha256 = "0nbyxajl75q80cnyl9c0sjlyk3rmhm7k8w8mksg4lfyh78ynayyc";
+  };
+
+  sourceRoot = "${src.name}/aXbo-research";
+
+  buildInputs = [ jdk ant makeWrapper ];
+
+  buildPhase = ''
+    ant -Dplatforms.JDK_1.7.home="$JAVA_HOME" jar
+  '';
+
+  extraJars = [
+    "commons-beanutils-1.8.3"
+    "commons-digester3-3.2"
+    "commons-io-2.4"
+    "jcommon-1.0.20"
+    "jfreechart-1.0.16"
+    "streamflyer-core-1.0.1"
+    "swingx-all-1.6.4"
+  ];
+
+  installPhase = with stdenv.lib; let
+    classpath = makeSearchPath "share/java/\\*" [
+      "$out"
+      commonsLogging
+      librxtx_java
+    ];
+  in ''
+    for dep in $extraJars; do
+      install -vD -m 644 "lib/$dep.jar" "$out/share/java/$dep.jar"
+    done
+    install -vD -m 644 dist/axbo.jar "$out/share/java/axbo.jar"
+
+    mkdir -p "$out/bin"
+    makeWrapper "${jre}/bin/java" "$out/bin/axbo-research" \
+      --add-flags "-Djava.library.path='${librxtx_java}/lib'" \
+      --add-flags "-cp ${classpath} com.dreikraft.axbo.Axbo"
+  '';
+}
diff --git a/pkgs/aszlig/default.nix b/pkgs/aszlig/default.nix
new file mode 100644
index 00000000..1d2a3e0b
--- /dev/null
+++ b/pkgs/aszlig/default.nix
@@ -0,0 +1,14 @@
+{ callPackage, callPackage_i686, boost155 }:
+
+{
+  aacolorize = callPackage ./aacolorize { };
+  axbo = callPackage ./axbo { };
+  git-detach = callPackage ./git-detach { };
+  grandpa = callPackage ./grandpa { };
+  nixops = callPackage ./nixops { };
+  librxtx_java = callPackage ./librxtx-java { };
+  lockdev = callPackage ./lockdev { };
+  pvolctrl = callPackage ./pvolctrl { };
+  santander = callPackage_i686 ./santander { };
+  tomahawk = callPackage ./tomahawk { boost = boost155; };
+}
diff --git a/pkgs/aszlig/git-detach/default.nix b/pkgs/aszlig/git-detach/default.nix
new file mode 100644
index 00000000..fb20843e
--- /dev/null
+++ b/pkgs/aszlig/git-detach/default.nix
@@ -0,0 +1,33 @@
+{ writeScriptBin, stdenv, git, coreutils, patch }:
+
+writeScriptBin "git-detach" ''
+  #!${stdenv.shell}
+
+  if [ $# -le 0 -o "$1" = "--help" -o "$1" = "-h" ]; then
+      echo "Usage: $0 COMMAND [ARGS...]" >&2
+      echo >&2
+      echo "Run COMMAND in a clean Git working directory" >&2
+      echo "without untracked files and .git directory." >&2
+      exit 1
+  fi
+
+  diffToHead="$("${git}/bin/git" diff HEAD)"
+
+  if tmpdir="$("${coreutils}/bin/mktemp" -d git-detach.XXXXXXXXXX)"; then
+    trap "rm -rf '${"\${tmpdir//\\'/\\'\\\\\\'\\'}"}'" EXIT
+    "${git}/bin/git" archive --format=tar HEAD | (
+      set -e
+      basedir="$tmpdir/$("${coreutils}/bin/basename" "$(pwd)")"
+      mkdir "$basedir"
+      cd "$basedir"
+      tar x
+      if [ -n "$diffToHead" ]; then
+        echo "$diffToHead" | "${patch}/bin/patch" -s -p1
+      fi
+      exec "$@"
+    )
+    exit $?
+  else
+    echo "Unable to create temporary directory!" >&2
+  fi
+''
diff --git a/pkgs/aszlig/grandpa/default.nix b/pkgs/aszlig/grandpa/default.nix
new file mode 100644
index 00000000..f37f6b2f
--- /dev/null
+++ b/pkgs/aszlig/grandpa/default.nix
@@ -0,0 +1,18 @@
+{ fetchFromGitHub, pythonPackages, gpm }:
+
+pythonPackages.buildPythonPackage {
+  name = "grandpa-0.5";
+  namePrefix = "";
+
+  src = fetchFromGitHub {
+    owner = "aszlig";
+    repo = "GrandPA";
+    rev = "d8d2571f732a68ed18be7533244db2cfb822b4c1";
+    sha256 = "19zf3pnr1adngncvinvn8yyvc0sj66lp7lwiql6379rf78xxlmhn";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ pythonPackages.cython gpm ];
+  propagatedBuildInputs = [ pythonPackages.pyserial ];
+}
diff --git a/pkgs/aszlig/librxtx-java/default.nix b/pkgs/aszlig/librxtx-java/default.nix
new file mode 100644
index 00000000..1553a146
--- /dev/null
+++ b/pkgs/aszlig/librxtx-java/default.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl, fetchpatch, unzip, jdk, lockdev }:
+
+stdenv.mkDerivation rec {
+  name = "rxtx-${version}";
+  version = "2.2pre2";
+
+  src = fetchurl {
+    urls = [
+      "http://rxtx.qbang.org/pub/rxtx/${name}.zip"
+      "ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${name}.zip"
+    ];
+    sha256 = "00sv9604hkq81mshih0fhqfzn4mf01d6rish6vplsi0gfqz3fc1w";
+  };
+
+  patches = let
+    baseurl = "https://sources.debian.net/data/main/"
+            + "r/rxtx/2.2pre2-13/debian/patches";
+  in [
+    (fetchpatch {
+      url = "${baseurl}/fhs_lock_buffer_overflow_fix.patch";
+      sha256 = "1v31q6ciy5v6bm5z8a1wssqn4nwvbcg4nnplgsvv1h8mzdq2832i";
+    })
+    (fetchpatch {
+      url = "${baseurl}/fix_snprintf.patch";
+      sha256 = "09r9jca0hb13bx85l348jkxnh1p0g5i0d6dnpm142vlwsj0d7afy";
+    })
+    (fetchpatch {
+      url = "${baseurl}/format_security.patch";
+      sha256 = "0adg7y9ak4xvgyswdhx6fsxq8jlb8y55xl3s6l0p8w0mfrhw7ysk";
+    })
+  ];
+
+  buildInputs = [ unzip jdk lockdev ];
+
+  NIX_CFLAGS_COMPILE = "-DUTS_RELEASE=\"3.8.0\"";
+
+  configureFlags = [ "--enable-liblock" ];
+
+  makeFlags = [
+    "JHOME=$(out)/share/java"
+    "RXTX_PATH=$(out)/lib"
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/lib" "$out/share/java"
+  '';
+}
diff --git a/pkgs/aszlig/lockdev/default.nix b/pkgs/aszlig/lockdev/default.nix
new file mode 100644
index 00000000..52e78eb5
--- /dev/null
+++ b/pkgs/aszlig/lockdev/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, fetchurl, perl }:
+
+let
+  baseurl = "ftp://ftp.debian.org/debian/pool/main/l/lockdev/";
+in stdenv.mkDerivation rec {
+  name = "lockdev-${version}";
+  version = "1.0.3";
+
+  buildInputs = [ perl ];
+
+  patches = stdenv.lib.singleton (fetchurl {
+    url = baseurl + "lockdev_1.0.3-1.5.diff.gz";
+    sha256 = "1l3pq1nfb5qx3i91cjaiz3c53368gw6m28a5mv9391n5gmsdmi3r";
+  });
+
+  NIX_CFLAGS_COMPILE = "-fPIC -D_PATH_LOCK=\"/tmp\"";
+  installFlags = [ "basedir=$(out)" ];
+
+  src = fetchurl {
+    url = baseurl + "lockdev_${version}.orig.tar.gz";
+    sha256 = "10lzhq6r2dn8y3ki7wlqsa8s3ndkf842bszcjw4dbzf3g9fn7bnc";
+  };
+}
diff --git a/pkgs/aszlig/nixops/default.nix b/pkgs/aszlig/nixops/default.nix
new file mode 100644
index 00000000..f97e3716
--- /dev/null
+++ b/pkgs/aszlig/nixops/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, fetchFromGitHub, fetchpatch, git }:
+
+let
+  rev = "bbf9a792d06c9a60c74dabe2937a9dfda9bff8f7";
+  sha256 = "0a1mx0ngp0zg65r1rx99rina4wbfjyzrziw2z9788v629j58p4jd";
+
+  master = stdenv.mkDerivation rec {
+    name = "nixops-upstream-patched";
+
+    src = fetchFromGitHub {
+      owner = "NixOS";
+      repo = "nixops";
+      inherit rev sha256;
+    };
+
+    phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+
+    postPatch = ''
+      sed -i -re 's!<nixpkgs([^>]*)>!${import ../../../nixpkgs-path.nix}\1!g' \
+        release.nix doc/manual/default.nix doc/manual/resource.nix
+    '';
+
+    installPhase = ''
+      cp -a . "$out"
+    '';
+  };
+
+  release = import "${master}/release.nix" {
+    nixopsSrc = {
+      outPath = master;
+      inherit rev;
+      revCount = 0;
+      shortRev = builtins.substring 0 7 rev;
+    };
+    officialRelease = false;
+  };
+in stdenv.lib.getAttr stdenv.system release.build
diff --git a/pkgs/aszlig/pvolctrl/default.nix b/pkgs/aszlig/pvolctrl/default.nix
new file mode 100644
index 00000000..5701c19e
--- /dev/null
+++ b/pkgs/aszlig/pvolctrl/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, fetchurl, pkgconfig, libpulseaudio }:
+
+stdenv.mkDerivation rec {
+  name = "pvolctrl-0.23";
+
+  unpackPhase = let
+    baseurl = "https://sites.google.com/site/guenterbartsch/blog/"
+            + "volumecontrolutilityforpulseaudio/";
+    makefile = fetchurl {
+      url = baseurl + "Makefile";
+      sha256 = "0l2ffvb617csk6h29y64v6ywhpcp7la6vvcip1w4nq0yry6jhrqz";
+    };
+    source = fetchurl {
+      url = baseurl + "pvolctrl.c";
+      sha256 = "0vcd5dlw9l47jpabwmmzdvlkn67fz55dr3sryyh56sl263mibjda";
+    };
+  in ''
+    mkdir -p "${name}"
+    sed -e 's|/usr/bin/||' "${makefile}" > "${name}/Makefile"
+    sed -e 's/PA_VOLUME_MAX/PA_VOLUME_NORM/
+    /avg_vol += (avg_vol \* vol_mod) \/ 100;/ {
+      s/(avg_vol/((int)PA_VOLUME_NORM/
+    }
+    /if (vol_mod)/i \
+      if (info->name == NULL || strncmp(info->name, "combined", 8) != 0) \
+        return;' "${source}" > "${name}/pvolctrl.c"
+    sourceRoot="${name}"
+  '';
+
+  installPhase = ''
+    install -D -T pvolctrl "$out/bin/pvolctrl"
+  '';
+
+  buildInputs = [ pkgconfig libpulseaudio ];
+}
diff --git a/pkgs/aszlig/santander/default.nix b/pkgs/aszlig/santander/default.nix
new file mode 100644
index 00000000..9f6690b0
--- /dev/null
+++ b/pkgs/aszlig/santander/default.nix
@@ -0,0 +1,155 @@
+{ stdenv, fetchurl, fetchgit, fetchFromBitbucket
+, runCommand, writeScript, writeScriptBin, writeText
+, xvfb_run, xdotool, coreutils, wineMinimal, pipelight, dwb-unwrapped, pcsclite
+}:
+
+let
+  name = "SecurityPluginHBCIChipcard";
+  version = "2.9.8.0";
+  dllName = "NP_${name}.dll";
+
+  pluginInstaller = fetchurl {
+    url = "https://service.santanderbank.de/special/banking/files/"
+        + "SecurityPluginHBCIChipcard-${version}-Installer.exe";
+    sha256 = "0xnfb730mwxdx83dnqyplp4bxwx6g01wc87xa4dl1spxia9kjmmh";
+  };
+
+  patchedWine = let
+    libpcsclite = "${pcsclite}/lib/libpcsclite.so";
+  in (wineMinimal.override {
+    wineBuild = "wine32";
+    wineRelease = "staging";
+  }).overrideDerivation (drv: {
+    scard4wine = fetchgit {
+      url = "git://git.code.sf.net/p/scard4wine/code";
+      rev = "c14c02c80bf1f2bb4cedd1f53a3a2ab9c48bed76";
+      sha256 = "0ffmbl9mdnaih4h3ggpnzqbih3kgbwl3wv6j1ag5s4czn8gcpdq3";
+    };
+
+    prePatch = (drv.prePatch or "") + ''
+      cp -t dlls/winscard "$scard4wine/src/"*
+      sed -i -re 's,"libpcsclite\.so(\.[0-9]+)*","${libpcsclite}",' \
+        dlls/winscard/winscard.c
+    '';
+
+    patches = (drv.patches or []) ++ [ ./winscard.patch ];
+
+    postPatch = (drv.postPatch or "") + ''
+      sed -i -e '/not owned by you/d' libs/wine/config.c
+      # Modified patch from https://bugs.winehq.org/show_bug.cgi?id=22450
+      patch -p1 < "${./wine-no-unixfs.patch}"
+    '';
+  });
+
+  installPath = [ "Program Files" "ppi" "SecurityPluginHBCIChipcard" ];
+
+  scard4wine = stdenv.mkDerivation rec {
+    name = "scard4wine-${version}";
+    version = "1.2.0-2016-06-05";
+
+    src = fetchgit {
+      url = "git://git.code.sf.net/p/scard4wine/code";
+      rev = "c14c02c80bf1f2bb4cedd1f53a3a2ab9c48bed76";
+      sha256 = "0ffmbl9mdnaih4h3ggpnzqbih3kgbwl3wv6j1ag5s4czn8gcpdq3";
+    };
+  };
+
+  winePrefix = runCommand "santander-wineprefix" {
+    installPath = stdenv.lib.concatStringsSep "/" (installPath ++ [ dllName ]);
+  } ''
+    export WINEPREFIX="$out"
+    export WINEDLLOVERRIDES="mscoree,mshtml="
+    mkdir -p "$out"
+    ${patchedWine}/bin/wine wineboot.exe
+    ${xvfb_run}/bin/xvfb-run "${writeScript "install-santander-wine" ''
+      ${patchedWine}/bin/wine "${pluginInstaller}" &
+      while [ "$(jobs -r | wc -l)" -gt 0 ]; do
+        ${xdotool}/bin/xdotool \
+          search --sync --onlyvisible \
+          --name 'Security-Plugin-HBCI-Chipcard ${version}' \
+          key Return &> /dev/null || :
+        sleep 1
+      done
+      wait
+    ''}"
+    if [ ! -e "$out/drive_c/$installPath" ]; then
+      echo "Unable to find plugin in $installPath." >&2
+      exit 1
+    fi
+    ln -sf -T "${builtins.storeDir}" "$WINEPREFIX/dosdevices/z:"
+    echo disable > "$WINEPREFIX/.update-timestamp"
+  '';
+
+  pluginConfig = {
+    winePath = "$share/wine";
+    inherit winePrefix dllName;
+    wineArch = "win32";
+    pluginLoaderPath = "$share/pluginloader.exe";
+    dllPath = "c:\\${stdenv.lib.concatStringsSep "\\" installPath}";
+  };
+
+  pipelightConfigFile = let
+    mkVal = val: if val == true then "true"
+            else if val == false then "false"
+            else toString val;
+    mkCfgLine = key: val: "# ${key} = ${mkVal val}";
+  in with stdenv.lib; writeText "pipelight-santander.config" ''
+    # ---BEGIN CONFIG---
+    ${concatStringsSep "\n" (mapAttrsToList mkCfgLine pluginConfig)}
+    # ---END CONFIG---
+  '';
+
+  finalPlugin = runCommand "santander-plugin" {
+    pipelight = (pipelight.override {
+      wineStaging = patchedWine;
+    }).overrideDerivation (drv: {
+      src = fetchFromBitbucket {
+        repo = "pipelight";
+        owner = "mmueller2012";
+        rev = "181bab804f80b99cb46f63f9ed36e4fdf12ca319";
+        sha256 = "0ydivpxayzs5aklf0x5vl5bl4issz10k7zl3cv76649kxxhxkh1z";
+      };
+
+      patches = [ ./pipelight.patch ];
+
+      postPatch = (drv.postPatch or "") + ''
+        sed -i -e '/static \+bool \+openConfig.*{$/,/}/ {
+          /getConfigNameFromLibrary/a \
+            configFile.open("${pipelightConfigFile}"); \
+            if (configFile.is_open()) return true;
+        }' src/linux/libpipelight/configloader.c
+      '';
+
+      # We don't want or have share/pipelight/install-dependency!
+      preFixup = null;
+    });
+  } ''
+    install -vD "$pipelight/lib/pipelight/libpipelight.so" \
+      "$out/lib/pipelight/libpipelight-santander.so"
+  '';
+
+  # Allow to use dwb for now until we have a better solution.
+  dwb = dwb-unwrapped.override {
+    inherit (import (import ../../../nixpkgs-path.nix) {
+      inherit (stdenv) system;
+      config = {
+        permittedInsecurePackages = [ "webkitgtk-2.4.11" ];
+      };
+    }) webkitgtk2;
+  };
+
+  inherit (stdenv.lib) escapeShellArg;
+
+in writeScriptBin "santander" ''
+  #!${stdenv.shell}
+  if tmpdir="$("${coreutils}/bin/mktemp" -d)"; then
+    trap "rm -rf '$tmpdir'" EXIT
+    export HOME="$tmpdir"
+    export MOZ_PLUGIN_PATH=${escapeShellArg "${finalPlugin}/lib/pipelight"}
+    "${dwb}/bin/dwb" -t https://karte.santanderbank.de/
+    exit $?
+  else
+    echo "Unable to create temporary profile directory." >&2
+    exit 1
+  fi
+''
diff --git a/pkgs/aszlig/santander/pipelight.patch b/pkgs/aszlig/santander/pipelight.patch
new file mode 100644
index 00000000..3a07da72
--- /dev/null
+++ b/pkgs/aszlig/santander/pipelight.patch
@@ -0,0 +1,13 @@
+diff --git a/src/windows/pluginloader/pluginloader.c b/src/windows/pluginloader/pluginloader.c
+index 9e8556f..c50be2a 100644
+--- a/src/windows/pluginloader/pluginloader.c
++++ b/src/windows/pluginloader/pluginloader.c
+@@ -1510,7 +1510,7 @@ void dispatcher(int functionid, Stack &stack){
+ 				NPObject *objectValue;
+ 				NPError result;
+ 
+-				if (variable == NPPVpluginScriptableNPObject)
++				if (variable == NPPVpluginScriptableNPObject && pluginFuncs.getvalue)
+ 					result = pluginFuncs.getvalue(instance, variable, &objectValue);
+ 				else{
+ 					DBG_WARN("FUNCTION_NPP_GETVALUE_OBJECT - variable %d not allowed", variable);
diff --git a/pkgs/aszlig/santander/wine-no-unixfs.patch b/pkgs/aszlig/santander/wine-no-unixfs.patch
new file mode 100644
index 00000000..b0e6a9e9
--- /dev/null
+++ b/pkgs/aszlig/santander/wine-no-unixfs.patch
@@ -0,0 +1,292 @@
+diff -urN wine-1.9.7-orig/dlls/krnl386.exe16/int21.c wine-1.9.7/dlls/krnl386.exe16/int21.c
+--- wine-1.9.7-orig/dlls/krnl386.exe16/int21.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/krnl386.exe16/int21.c	2016-04-10 02:33:20 +0900
+@@ -35,6 +35,7 @@
+ # include <unistd.h>
+ #endif
+ 
++#include "ntstatus.h"
+ #include "windef.h"
+ #include "winbase.h"
+ #include "winreg.h"
+@@ -842,11 +843,13 @@
+  */
+ static HANDLE INT21_CreateMagicDeviceHandle( LPCWSTR name )
+ {
++    HANDLE ret;
++    NTSTATUS status;
++
++#if 0
+     static const WCHAR prefixW[] = {'\\','?','?','\\','u','n','i','x'};
+     const char *dir = wine_get_server_dir();
+     int len;
+-    HANDLE ret;
+-    NTSTATUS status;
+     OBJECT_ATTRIBUTES attr;
+     UNICODE_STRING nameW;
+     IO_STATUS_BLOCK io;
+@@ -875,12 +878,16 @@
+     status = NtCreateFile( &ret, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &attr, &io, NULL, 0,
+                            FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF,
+                            FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 );
++    RtlFreeUnicodeString( &nameW );
++#else
++    status = STATUS_NOT_IMPLEMENTED;
++#endif
++
+     if (status)
+     {
+         ret = 0;
+         SetLastError( RtlNtStatusToDosError(status) );
+     }
+-    RtlFreeUnicodeString( &nameW );
+     return ret;
+ }
+ 
+diff -urN wine-1.9.7-orig/dlls/krnl386.exe16/vxd.c wine-1.9.7/dlls/krnl386.exe16/vxd.c
+--- wine-1.9.7-orig/dlls/krnl386.exe16/vxd.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/krnl386.exe16/vxd.c	2016-04-10 02:33:20 +0900
+@@ -113,11 +113,13 @@
+ /* create a file handle to represent a VxD, by opening a dummy file in the wineserver directory */
+ static HANDLE open_vxd_handle( LPCWSTR name )
+ {
++    HANDLE ret;
++    NTSTATUS status;
++
++#if 0
+     static const WCHAR prefixW[] = {'\\','?','?','\\','u','n','i','x'};
+     const char *dir = wine_get_server_dir();
+     int len;
+-    HANDLE ret;
+-    NTSTATUS status;
+     OBJECT_ATTRIBUTES attr;
+     UNICODE_STRING nameW;
+     IO_STATUS_BLOCK io;
+@@ -146,12 +148,16 @@
+     status = NtCreateFile( &ret, SYNCHRONIZE, &attr, &io, NULL, 0,
+                            FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN_IF,
+                            FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 );
++    RtlFreeUnicodeString( &nameW );
++#else
++    status = STATUS_NOT_IMPLEMENTED;
++#endif
++
+     if (status)
+     {
+         ret = 0;
+         SetLastError( RtlNtStatusToDosError(status) );
+     }
+-    RtlFreeUnicodeString( &nameW );
+     return ret;
+ }
+ 
+diff -urN wine-1.9.7-orig/dlls/ntdll/directory.c wine-1.9.7/dlls/ntdll/directory.c
+--- wine-1.9.7-orig/dlls/ntdll/directory.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/ntdll/directory.c	2016-04-10 02:33:20 +0900
+@@ -3098,8 +3098,10 @@
+ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret,
+                                           UINT disposition, BOOLEAN check_case )
+ {
++#if 0
+     static const WCHAR unixW[] = {'u','n','i','x'};
+     static const WCHAR pipeW[] = {'p','i','p','e'};
++#endif
+     static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 };
+ 
+     NTSTATUS status = STATUS_SUCCESS;
+@@ -3143,11 +3145,13 @@
+     name_len -= prefix_len;
+ 
+     /* check for invalid characters (all chars except 0 are valid for unix and pipes) */
++#if 0
+     if (prefix_len == 4)
+     {
+         is_unix = !memcmp( prefix, unixW, sizeof(unixW) );
+         is_pipe = !memcmp( prefix, pipeW, sizeof(pipeW) );
+     }
++#endif
+     if (is_unix || is_pipe)
+     {
+         for (p = name; p < name + name_len; p++)
+diff -urN wine-1.9.7-orig/dlls/ntdll/path.c wine-1.9.7/dlls/ntdll/path.c
+--- wine-1.9.7-orig/dlls/ntdll/path.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/ntdll/path.c	2016-04-10 02:33:20 +0900
+@@ -1025,7 +1025,9 @@
+ NTSTATUS CDECL wine_unix_to_nt_file_name( const ANSI_STRING *name, UNICODE_STRING *nt )
+ {
+     static const WCHAR prefixW[] = {'\\','?','?','\\','A',':','\\'};
++#if 0
+     static const WCHAR unix_prefixW[] = {'\\','?','?','\\','u','n','i','x'};
++#endif
+     unsigned int lenW, lenA = name->Length;
+     const char *path = name->Buffer;
+     char *cwd;
+@@ -1065,6 +1067,7 @@
+ 
+     if (status != STATUS_SUCCESS)
+     {
++#if 0
+         if (status == STATUS_OBJECT_PATH_NOT_FOUND)
+         {
+             lenW = ntdll_umbstowcs( 0, path, lenA, NULL, 0 );
+@@ -1084,6 +1087,7 @@
+             for (p = nt->Buffer + sizeof(unix_prefixW)/sizeof(WCHAR); *p; p++) if (*p == '/') *p = '\\';
+             status = STATUS_SUCCESS;
+         }
++#endif
+         goto done;
+     }
+     while (lenA && path[0] == '/') { lenA--; path++; }
+diff -urN wine-1.9.7-orig/dlls/shell32/folders.c wine-1.9.7/dlls/shell32/folders.c
+--- wine-1.9.7-orig/dlls/shell32/folders.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/folders.c	2016-04-10 02:33:20 +0900
+@@ -236,9 +236,11 @@
+                 *piIndex = -IDI_SHELL_MY_DOCUMENTS;
+             else if(IsEqualGUID(riid, &CLSID_NetworkPlaces))
+                 *piIndex = -IDI_SHELL_MY_NETWORK_PLACES;
++#if 0
+             else if(IsEqualGUID(riid, &CLSID_UnixFolder) ||
+                     IsEqualGUID(riid, &CLSID_UnixDosFolder))
+                 *piIndex = -IDI_SHELL_DRIVE;
++#endif
+             else
+                 *piIndex = -IDI_SHELL_FOLDER;
+ 	  }
+diff -urN wine-1.9.7-orig/dlls/shell32/shellole.c wine-1.9.7/dlls/shell32/shellole.c
+--- wine-1.9.7-orig/dlls/shell32/shellole.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shellole.c	2016-04-10 02:33:20 +0900
+@@ -78,8 +78,10 @@
+ 	{&CLSID_ShellFSFolder,	IFSFolder_Constructor},
+ 	{&CLSID_ShellItem,	IShellItem_Constructor},
+ 	{&CLSID_ShellLink,	IShellLink_Constructor},
++#if 0
+ 	{&CLSID_UnixDosFolder,  UnixDosFolder_Constructor},
+ 	{&CLSID_UnixFolder,     UnixFolder_Constructor},
++#endif
+ 	{&CLSID_ExplorerBrowser,ExplorerBrowser_Constructor},
+ 	{&CLSID_KnownFolderManager, KnownFolderManager_Constructor},
+ 	{&CLSID_Shell,          IShellDispatch_Constructor},
+diff -urN wine-1.9.7-orig/dlls/shell32/shellpath.c wine-1.9.7/dlls/shell32/shellpath.c
+--- wine-1.9.7-orig/dlls/shell32/shellpath.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shellpath.c	2016-04-10 02:33:20 +0900
+@@ -4481,9 +4481,11 @@
+         DWORD call_for_attr;
+     } folders[] =
+     {
++#if 0
+         { &CLSID_UnixFolder, TRUE, FALSE, FALSE },
+         { &CLSID_UnixDosFolder, TRUE, FALSE, FALSE,
+           SFGAO_FILESYSANCESTOR|SFGAO_FOLDER|SFGAO_HASSUBFOLDER, SFGAO_FILESYSTEM },
++#endif
+         { &CLSID_FolderShortcut, FALSE, FALSE, FALSE,
+           SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_LINK,
+           SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR },
+@@ -4613,9 +4615,11 @@
+             *ppidl = _ILCreateDesktop();
+             break;
+ 
++#if 0
+         case CSIDL_PERSONAL:
+             *ppidl = _ILCreateMyDocuments();
+             break;
++#endif
+ 
+         case CSIDL_INTERNET:
+             *ppidl = _ILCreateIExplore();
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr.h wine-1.9.7/dlls/shell32/shfldr.h
+--- wine-1.9.7-orig/dlls/shell32/shfldr.h	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr.h	2016-04-10 02:33:20 +0900
+@@ -75,5 +75,7 @@
+ void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags) DECLSPEC_HIDDEN;
+ BOOL SHELL_FS_HideExtension(LPCWSTR pwszPath) DECLSPEC_HIDDEN;
+ 
++#if 0
+ DEFINE_GUID( CLSID_UnixFolder, 0xcc702eb2, 0x7dc5, 0x11d9, 0xc6, 0x87, 0x00, 0x04, 0x23, 0x8a, 0x01, 0xcd );
+ DEFINE_GUID( CLSID_UnixDosFolder, 0x9d20aae8, 0x0625, 0x44b0, 0x9c, 0xa7, 0x71, 0x88, 0x9c, 0x22, 0x54, 0xd9 );
++#endif
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr_desktop.c wine-1.9.7/dlls/shell32/shfldr_desktop.c
+--- wine-1.9.7-orig/dlls/shell32/shfldr_desktop.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr_desktop.c	2016-04-10 02:33:20 +0900
+@@ -186,26 +186,30 @@
+     }
+     else if (PathGetDriveNumberW (lpszDisplayName) >= 0)
+     {
++#if 0
+         /*
+          * UNIXFS can't handle drives without a mount point yet. We fall back
+          * to use the MyComputer interface if we can't get the file attributes
+          * on the device.
+          */
+         char drivePath[] = "A:\\";
+         drivePath[0] = 'A' + PathGetDriveNumberW(lpszDisplayName);
+ 
+         /* it's a filesystem path with a drive. Let MyComputer/UnixDosFolder parse it */
+         if (UNIXFS_is_rooted_at_desktop() &&
+             GetFileAttributesA(drivePath) != INVALID_FILE_ATTRIBUTES)
+         {
+             pidlTemp = _ILCreateGuid(PT_GUID, &CLSID_UnixDosFolder);
+             TRACE("Using unixfs for %s\n", debugstr_w(lpszDisplayName));
+         }
+         else
+         {
++#endif
+             pidlTemp = _ILCreateMyComputer ();
+             TRACE("Using MyComputer for %s\n", debugstr_w(lpszDisplayName));
++#if 0
+         }
++#endif
+         szNext = lpszDisplayName;
+     }
+     else if (PathIsUNCW(lpszDisplayName))
+diff -urN wine-1.9.7-orig/dlls/shell32/shfldr_unixfs.c wine-1.9.7/dlls/shell32/shfldr_unixfs.c
+--- wine-1.9.7-orig/dlls/shell32/shfldr_unixfs.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/dlls/shell32/shfldr_unixfs.c	2016-04-10 02:33:20 +0900
+@@ -167,7 +167,7 @@
+ 
+ WINE_DEFAULT_DEBUG_CHANNEL(shell);
+ 
+-#if !defined(__MINGW32__) && !defined(_MSC_VER)
++#if 0
+ 
+ #define LEN_SHITEMID_FIXED_PART ((USHORT) \
+     ( sizeof(USHORT)      /* SHITEMID's cb field. */ \
+@@ -2569,6 +2569,7 @@
+  *  FALSE, if not.
+  */
+ BOOL UNIXFS_is_rooted_at_desktop(void) {
++#if 0
+     HKEY hKey;
+     WCHAR wszRootedAtDesktop[69 + CHARS_IN_GUID] = {
+         'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
+@@ -2582,5 +2583,6 @@
+         RegCloseKey(hKey);
+         return TRUE;
+     }
++#endif
+     return FALSE;
+ }
+diff -urN wine-1.9.7-orig/include/config.h.in wine-1.9.7/include/config.h.in
+--- wine-1.9.7-orig/include/config.h.in	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/include/config.h.in	2016-04-10 02:33:20 +0900
+@@ -7,6 +7,9 @@
+ /* Define to a function attribute for Microsoft hotpatch assembly prefix. */
+ #undef DECLSPEC_HOTPATCH
+ 
++/* Define to enable unixfs */
++#undef ENABLE_UNIXFS
++
+ /* Define to the file extension for executables. */
+ #undef EXEEXT
+ 
+diff -urN wine-1.9.7-orig/programs/wineboot/wineboot.c wine-1.9.7/programs/wineboot/wineboot.c
+--- wine-1.9.7-orig/programs/wineboot/wineboot.c	2016-04-02 00:02:39 +0900
++++ wine-1.9.7/programs/wineboot/wineboot.c	2016-04-10 02:33:20 +0900
+@@ -946,7 +946,7 @@
+                                      'I','n','s','t','a','l','l','H','i','n','f','S','e','c','t','i','o','n',0};
+     static const WCHAR definstall[] = {' ','D','e','f','a','u','l','t','I','n','s','t','a','l','l',0};
+     static const WCHAR wowinstall[] = {' ','W','o','w','6','4','I','n','s','t','a','l','l',0};
+-    static const WCHAR inf[] = {' ','1','2','8',' ','\\','\\','?','\\','u','n','i','x',0 };
++    static const WCHAR inf[] = {' ','1','2','8',' ','z',':',0 };
+ 
+     WCHAR app[MAX_PATH + sizeof(rundll)/sizeof(WCHAR)];
+     STARTUPINFOW si;
diff --git a/pkgs/aszlig/santander/winscard.patch b/pkgs/aszlig/santander/winscard.patch
new file mode 100644
index 00000000..7dfa04ac
--- /dev/null
+++ b/pkgs/aszlig/santander/winscard.patch
@@ -0,0 +1,11 @@
+--- a/dlls/winscard/winscard.c	1970-01-01 01:00:01.000000000 +0100
++++ b/dlls/winscard/winscard.c	2016-06-06 01:52:53.631444433 +0200
+@@ -1527,7 +1527,7 @@
+ {

+     LONG lRet;

+     TRACE(" 0x%08X %p %p %p %p %p %p\n",(unsigned int) hCard,mszReaderNames,pcchReaderLen,pdwState,pdwProtocol,pbAtr,pcbAtrLen);

+-    if(!pcchReaderLen || !pdwState || !pdwProtocol || !pcbAtrLen)

++    if(!pcchReaderLen || !pcbAtrLen)

+         lRet = SCARD_E_INVALID_PARAMETER;

+     else if(!liteSCardStatus)

+         lRet = SCARD_F_INTERNAL_ERROR;

diff --git a/pkgs/aszlig/tomahawk/default.nix b/pkgs/aszlig/tomahawk/default.nix
new file mode 100644
index 00000000..ee006d46
--- /dev/null
+++ b/pkgs/aszlig/tomahawk/default.nix
@@ -0,0 +1,90 @@
+{ stdenv, fetchFromGitHub, fetchurl, cmake, pkgconfig, boost, gnutls
+, libechonest, liblastfm, lucenepp, kdeFrameworks, qt5, libsForQt5, sparsehash
+, taglib, websocketpp, ffmpeg_2, v4l_utils, libtasn1, libidn, p11_kit
+
+, enableXMPP      ? true,  libjreen     ? null
+, enableKDE       ? false, kdelibs      ? null
+, enableTelepathy ? false, telepathy_qt ? null
+}:
+
+assert enableXMPP      -> libjreen     != null;
+assert enableKDE       -> kdelibs      != null;
+assert enableTelepathy -> telepathy_qt != null;
+
+with stdenv.lib;
+
+let
+  useQT5 = pkg: let
+    qt5variant = pkg.override (attrs: {
+      ${if attrs ? qt4 then "qt4" else "qt"} = qt5.qtbase;
+    });
+  in qt5variant.overrideDerivation (drv: {
+    postInstall = (drv.postInstall or "") + ''
+      for i in "$out"/include/*; do
+        [ -d "$i" ] || continue
+        ! expr "$i" : '.*5$$' > /dev/null || continue
+        ln -sv "$i" "''${i}5"
+      done
+      for l in "$out"/lib*/*.so*; do
+        bn="$(basename "$l")"
+        ! expr "''${bn%.so*}" : '.*5$$' > /dev/null || continue
+        ln -sv "$l" "$(dirname "$l")/''${bn%.so*}5.''${bn#*.}"
+      done
+    '';
+  });
+
+  libechonestQT5 = overrideDerivation ((useQT5 libechonest).override {
+    qjson = null;
+  }) (drv: {
+    cmakeFlags = (drv.cmakeFlags or []) ++ [ "-DBUILD_WITH_QT4=OFF" ];
+  });
+
+  jreenPatched = overrideDerivation (useQT5 libjreen) (drv: {
+    postPatch = (drv.postPatch or "") + ''
+      sed -i -e 's/QMetaTypeId/QMap/g' src/stanzaextension.h
+    '';
+  });
+
+in stdenv.mkDerivation rec {
+  name = "tomahawk-${version}";
+  version = "0.9.0-git";
+
+  src = fetchFromGitHub {
+    owner = "tomahawk-player";
+    repo = "tomahawk";
+    rev = "97a407f83701ee2343e4826043c311c03fe5675b";
+    sha256 = "1palfsn8kz8q0xb19xhiwy3n993q2kifz9dy1ry5cnys7706l9b8";
+  };
+
+  postPatch = ''
+    sed -i -e '/set(QUAZIP_LIB_VERSION_SUFFIX/d' CMakeModules/FindQuaZip.cmake
+    sed -i -e 's,quazip5/,quazip/,' src/libtomahawk/utils/TomahawkUtils.cpp
+  '';
+
+  cmakeFlags = [
+    "-DLUCENEPP_INCLUDE_DIR=${lucenepp}/include"
+    "-DLUCENEPP_LIBRARY_DIR=${lucenepp}/lib"
+  ];
+
+  nativeBuildInputs = [ cmake pkgconfig kdeFrameworks.extra-cmake-modules ];
+
+  buildInputs = [
+    libtasn1 libidn p11_kit
+    libsForQt5.attica libsForQt5.qca-qt5 libsForQt5.qtkeychain libsForQt5.quazip
+    libsForQt5.vlc qt5.qtbase qt5.qtsvg qt5.qttools qt5.qtwebkit qt5.qtx11extras
+  ] ++ map useQT5 [ liblastfm ] ++ [
+    boost gnutls lucenepp sparsehash taglib websocketpp libechonestQT5
+  ] ++ stdenv.lib.optional enableXMPP      jreenPatched
+    ++ stdenv.lib.optional enableKDE       (useQT5 kdelibs)
+    ++ stdenv.lib.optional enableTelepathy (useQT5 telepathy_qt);
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "A multi-source music player";
+    homepage = "http://tomahawk-player.org/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.aszlig ];
+  };
+}