{stdenv, fetchurl, makeWrapper, useSetUID, dbus, libxml2, pam, hal, pkgconfig, pmount, python, pythonDBus}:

let
  pmountBin = useSetUID pmount "/bin/pmount";
  pumountBin = useSetUID pmount "/bin/pumount";
in

stdenv.mkDerivation {
  name = "pam_usb-0.4.2";

  src = fetchurl {
    url = mirror://sourceforge/pamusb/pam_usb/pam_usb-0.4.2/pam_usb-0.4.2.tar.gz;
    sha256 = "736afced7482c7c5d47127285f7defe0a304a6136a0090588fa8698d385ba202";
  };

  buildInputs = [
    makeWrapper
    # pam_usb dependencies
    dbus libxml2 pam hal pmount pkgconfig
    # pam_usb's tools dependencies
    python
    # cElementTree is included with python 2.5 and later.
  ];

  preBuild = ''
    makeFlagsArray=(DESTDIR=$out)
    substituteInPlace ./src/volume.c \
      --replace 'pmount' '${pmountBin}' \
      --replace 'pumount' '${pumountBin}'
  '';

  # pmount is append to the PATH because pmounts binaries should have a set uid bit.
  postInstall = ''
    mv $out/usr/* $out/. # fix color */
    rm -rf $out/usr
    for prog in $out/bin/pamusb-conf $out/bin/pamusb-agent; do
      substituteInPlace $prog --replace '/usr/bin/env python' '/bin/python'
      wrapProgram $prog \
        --prefix PYTHONPATH : "$(toPythonPath ${pythonDBus})"
    done
  '';

  meta = {
    homepage = http://pamusb.org/;
    description = "Authentication using USB Flash Drives";
    license = "GPLv2";
  };
}
