Merge pull request #102764 from jluttine/init-pass-secret-service
This commit is contained in:
commit
4c84556d6b
61
pkgs/applications/misc/pass-secret-service/default.nix
Normal file
61
pkgs/applications/misc/pass-secret-service/default.nix
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{ stdenv, fetchFromGitHub, python3, dbus, gnupg }:
|
||||||
|
|
||||||
|
python3.pkgs.buildPythonApplication rec {
|
||||||
|
pname = "pass-secret-service";
|
||||||
|
# PyPI has old alpha version. Since then the project has switched from using a
|
||||||
|
# seemingly abandoned D-Bus package pydbus and started using maintained
|
||||||
|
# dbus-next. So let's use latest from GitHub.
|
||||||
|
version = "unstable-2020-04-12";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "mdellweg";
|
||||||
|
repo = "pass_secret_service";
|
||||||
|
rev = "f6fbca6ac3ccd16bfec407d845ed9257adf74dfa";
|
||||||
|
sha256 = "0rm4pbx1fiwds1v7f99khhh7x3inv9yniclwd95mrbgljk3cc6a4";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Need to specify session.conf file for tests because it won't be found under
|
||||||
|
# /etc/ in check phase.
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace Makefile \
|
||||||
|
--replace \
|
||||||
|
"dbus-run-session" \
|
||||||
|
"dbus-run-session --config-file=${dbus}/share/dbus-1/session.conf"
|
||||||
|
'';
|
||||||
|
|
||||||
|
propagatedBuildInputs = with python3.pkgs; [
|
||||||
|
click
|
||||||
|
cryptography
|
||||||
|
dbus-next
|
||||||
|
decorator
|
||||||
|
pypass
|
||||||
|
secretstorage
|
||||||
|
];
|
||||||
|
|
||||||
|
checkInputs =
|
||||||
|
let
|
||||||
|
ps = python3.pkgs;
|
||||||
|
in
|
||||||
|
[
|
||||||
|
dbus
|
||||||
|
gnupg
|
||||||
|
ps.pytest
|
||||||
|
ps.pytest-asyncio
|
||||||
|
ps.pypass
|
||||||
|
];
|
||||||
|
|
||||||
|
checkPhase = ''
|
||||||
|
runHook preCheck
|
||||||
|
make test
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Libsecret D-Bus API with pass as the backend";
|
||||||
|
homepage = "https://github.com/mdellweg/pass_secret_service/";
|
||||||
|
license = stdenv.lib.licenses.gpl3Only;
|
||||||
|
platforms = stdenv.lib.platforms.all;
|
||||||
|
maintainers = with stdenv.lib.maintainers; [ jluttine ];
|
||||||
|
};
|
||||||
|
}
|
84
pkgs/development/python-modules/pypass/default.nix
Normal file
84
pkgs/development/python-modules/pypass/default.nix
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
{ buildPythonPackage
|
||||||
|
, click
|
||||||
|
, colorama
|
||||||
|
, enum34
|
||||||
|
, fetchPypi
|
||||||
|
, git
|
||||||
|
, gnugrep
|
||||||
|
, gnupg
|
||||||
|
, nose
|
||||||
|
, pbr
|
||||||
|
, pexpect
|
||||||
|
, pythonAtLeast
|
||||||
|
, pythonOlder
|
||||||
|
, stdenv
|
||||||
|
, substituteAll
|
||||||
|
, tree
|
||||||
|
, xclip
|
||||||
|
}:
|
||||||
|
|
||||||
|
# NOTE: pypass can also be used as an application, but probably the most
|
||||||
|
# important usecase is as a library. So, let's use buildPythonPackage and
|
||||||
|
# support any Python version instead of defining it as an application with
|
||||||
|
# buildPythonApplication.
|
||||||
|
buildPythonPackage rec {
|
||||||
|
pname = "pypass";
|
||||||
|
version = "0.2.1";
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
sha256 = "1nm4mj7pd7gz4ghic6b3wrnd1b59hd1f0axavdabfl79wy511l7r";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Set absolute nix store paths to the executables that pypass uses
|
||||||
|
patches = [
|
||||||
|
(substituteAll {
|
||||||
|
src = ./mark-executables.patch;
|
||||||
|
git_exec = "${git}/bin/git";
|
||||||
|
grep_exec = "${gnugrep}/bin/grep";
|
||||||
|
gpg_exec = "${gnupg}/bin/gpg2";
|
||||||
|
tree_exec = "${tree}/bin/tree";
|
||||||
|
xclip_exec = "${xclip}/bin/xclip";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
# Remove enum34 requirement if Python >= 3.4
|
||||||
|
postPatch = stdenv.lib.optionalString (pythonAtLeast "3.4") ''
|
||||||
|
substituteInPlace requirements.txt --replace "enum34" ""
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [ pbr ];
|
||||||
|
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
click
|
||||||
|
colorama
|
||||||
|
pexpect
|
||||||
|
] ++ stdenv.lib.optional (pythonOlder "3.4") enum34;
|
||||||
|
|
||||||
|
checkInputs = [ nose ];
|
||||||
|
|
||||||
|
# Configuration so that the tests work
|
||||||
|
preCheck = ''
|
||||||
|
HOME=$TEMP ${git}/bin/git config --global user.email "nix-builder@nixos.org"
|
||||||
|
HOME=$TEMP ${git}/bin/git config --global user.name "Nix Builder"
|
||||||
|
HOME=$TEMP ${git}/bin/git config --global pull.ff only
|
||||||
|
HOME=$TEMP make setup_gpg
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Run tests but exclude the test that uses clipboard as I wasn't able to make
|
||||||
|
# it work - probably the X clipboard just doesn't work in the build
|
||||||
|
# environment..
|
||||||
|
checkPhase = ''
|
||||||
|
runHook preCheck
|
||||||
|
HOME=$TEMP GNUPGHOME=pypass/tests/gnupg nosetests -v --exclude=test_show_clip .
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Password manager pass in Python";
|
||||||
|
homepage = "https://github.com/aviau/python-pass";
|
||||||
|
license = stdenv.lib.licenses.gpl3Plus;
|
||||||
|
platforms = stdenv.lib.platforms.all;
|
||||||
|
maintainers = with stdenv.lib.maintainers; [ jluttine ];
|
||||||
|
};
|
||||||
|
}
|
255
pkgs/development/python-modules/pypass/mark-executables.patch
Normal file
255
pkgs/development/python-modules/pypass/mark-executables.patch
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 1ef67c8..d49031a 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -16,5 +16,5 @@ test: kill build
|
||||||
|
setup_gpg: pypass/tests/gnupg
|
||||||
|
pypass/tests/gnupg: pypass/tests/test_key_sec.asc pypass/tests/test_ownertrust.txt
|
||||||
|
mkdir -m 700 -p pypass/tests/gnupg
|
||||||
|
- GNUPGHOME=pypass/tests/gnupg gpg --allow-secret-key-import --import pypass/tests/test_key_sec.asc
|
||||||
|
- GNUPGHOME=pypass/tests/gnupg gpg --import-ownertrust pypass/tests/test_ownertrust.txt
|
||||||
|
+ GNUPGHOME=pypass/tests/gnupg @gpg_exec@ --allow-secret-key-import --import pypass/tests/test_key_sec.asc
|
||||||
|
+ GNUPGHOME=pypass/tests/gnupg @gpg_exec@ --import-ownertrust pypass/tests/test_ownertrust.txt
|
||||||
|
diff --git a/pypass/command.py b/pypass/command.py
|
||||||
|
index 4616a5f..a72cf5d 100644
|
||||||
|
--- a/pypass/command.py
|
||||||
|
+++ b/pypass/command.py
|
||||||
|
@@ -173,7 +173,7 @@ def show(config, path, clip):
|
||||||
|
if clip:
|
||||||
|
xclip = subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'xclip',
|
||||||
|
+ '@xclip_exec@',
|
||||||
|
'-selection', 'clipboard'
|
||||||
|
],
|
||||||
|
stdin=subprocess.PIPE
|
||||||
|
@@ -206,7 +206,7 @@ def connect(config, path):
|
||||||
|
def ls(config, subfolder):
|
||||||
|
tree = subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'tree',
|
||||||
|
+ '@tree_exec@',
|
||||||
|
'-C',
|
||||||
|
'-l',
|
||||||
|
'--noreport',
|
||||||
|
@@ -239,7 +239,7 @@ def find(config, search_terms):
|
||||||
|
|
||||||
|
tree = subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'tree',
|
||||||
|
+ '@tree_exec@',
|
||||||
|
'-C',
|
||||||
|
'-l',
|
||||||
|
'--noreport',
|
||||||
|
@@ -273,7 +273,7 @@ def grep(config, search_string):
|
||||||
|
config['password_store'].get_decrypted_password(password)
|
||||||
|
|
||||||
|
grep = subprocess.Popen(
|
||||||
|
- ['grep', '-e', search_string],
|
||||||
|
+ ['@grep_exec@', '-e', search_string],
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stdin=subprocess.PIPE
|
||||||
|
)
|
||||||
|
@@ -397,7 +397,7 @@ def git(config, commands):
|
||||||
|
else:
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % config['password_store'].git_dir,
|
||||||
|
'--work-tree=%s' % config['password_store'].path,
|
||||||
|
] + command_list,
|
||||||
|
diff --git a/pypass/passwordstore.py b/pypass/passwordstore.py
|
||||||
|
index 9de0376..8cf20a4 100644
|
||||||
|
--- a/pypass/passwordstore.py
|
||||||
|
+++ b/pypass/passwordstore.py
|
||||||
|
@@ -26,18 +26,7 @@ import re
|
||||||
|
from .entry_type import EntryType
|
||||||
|
|
||||||
|
# Find the right gpg binary
|
||||||
|
-if subprocess.call(
|
||||||
|
- ['which', 'gpg2'],
|
||||||
|
- stdout=subprocess.PIPE,
|
||||||
|
- stderr=subprocess.PIPE) == 0:
|
||||||
|
- GPG_BIN = 'gpg2'
|
||||||
|
-elif subprocess.call(
|
||||||
|
- ['which', 'gpg'],
|
||||||
|
- stdout=subprocess.PIPE,
|
||||||
|
- stderr=subprocess.PIPE) == 0:
|
||||||
|
- GPG_BIN = 'gpg'
|
||||||
|
-else:
|
||||||
|
- raise Exception("Could not find GPG")
|
||||||
|
+GPG_BIN = '@gpg_exec@'
|
||||||
|
|
||||||
|
|
||||||
|
class PasswordStore(object):
|
||||||
|
@@ -215,7 +204,7 @@ class PasswordStore(object):
|
||||||
|
# Init git repo
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- "git",
|
||||||
|
+ "@git_exec@",
|
||||||
|
"--git-dir=%s" % git_dir,
|
||||||
|
"--work-tree=%s" % git_work_tree,
|
||||||
|
"init", path
|
||||||
|
@@ -226,7 +215,7 @@ class PasswordStore(object):
|
||||||
|
# Add remote repo
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- "git",
|
||||||
|
+ "@git_exec@",
|
||||||
|
"--git-dir=%s" % git_dir,
|
||||||
|
"--work-tree=%s" % git_work_tree,
|
||||||
|
"remote",
|
||||||
|
@@ -241,7 +230,7 @@ class PasswordStore(object):
|
||||||
|
# TODO: add parameters for remote and branch ?
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- "git",
|
||||||
|
+ "@git_exec@",
|
||||||
|
"--git-dir=%s" % git_dir,
|
||||||
|
"--work-tree=%s" % git_work_tree,
|
||||||
|
"pull",
|
||||||
|
@@ -272,7 +261,7 @@ class PasswordStore(object):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'init',
|
||||||
|
@@ -298,7 +287,7 @@ class PasswordStore(object):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'config',
|
||||||
|
@@ -311,7 +300,7 @@ class PasswordStore(object):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'config',
|
||||||
|
@@ -326,7 +315,7 @@ class PasswordStore(object):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'add',
|
||||||
|
@@ -338,7 +327,7 @@ class PasswordStore(object):
|
||||||
|
if message:
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'commit',
|
||||||
|
@@ -350,7 +339,7 @@ class PasswordStore(object):
|
||||||
|
else:
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
"--git-dir=%s" % self.git_dir,
|
||||||
|
"--work-tree=%s" % self.path,
|
||||||
|
'commit'
|
||||||
|
diff --git a/pypass/tests/test_command.py b/pypass/tests/test_command.py
|
||||||
|
index 4966b34..960a8ed 100644
|
||||||
|
--- a/pypass/tests/test_command.py
|
||||||
|
+++ b/pypass/tests/test_command.py
|
||||||
|
@@ -127,7 +127,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
|
||||||
|
# Check if the password is in the clipoard
|
||||||
|
xclip = subprocess.Popen(
|
||||||
|
- ['xclip', '-o', '-selection', 'clipboard'],
|
||||||
|
+ ['@xclip_exec@', '-o', '-selection', 'clipboard'],
|
||||||
|
stdout=subprocess.PIPE)
|
||||||
|
xclip.wait()
|
||||||
|
self.assertEqual(xclip.stdout.read().decode('utf8'), 'clipme999')
|
||||||
|
@@ -301,7 +301,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
# git init should set diff.gpg.binary to True
|
||||||
|
diff_gpg_binary = subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % os.path.join(self.dir, '.git'),
|
||||||
|
'--work-tree=%s' % self.dir,
|
||||||
|
'config',
|
||||||
|
@@ -317,7 +317,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
# git init should set diff.gpg.textconv to 'gpg -d'
|
||||||
|
gpg = subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % os.path.join(self.dir, '.git'),
|
||||||
|
'--work-tree=%s' % self.dir,
|
||||||
|
'config',
|
||||||
|
@@ -337,7 +337,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % origin_git_dir,
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'init',
|
||||||
|
@@ -350,7 +350,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % origin_git_dir,
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'add', 'test_git_init_clone.gpg',
|
||||||
|
@@ -359,7 +359,7 @@ class TestCommand(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.call(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % origin_git_dir,
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'commit',
|
||||||
|
diff --git a/pypass/tests/test_passwordstore.py b/pypass/tests/test_passwordstore.py
|
||||||
|
index 6decc5f..ceb5181 100644
|
||||||
|
--- a/pypass/tests/test_passwordstore.py
|
||||||
|
+++ b/pypass/tests/test_passwordstore.py
|
||||||
|
@@ -171,7 +171,7 @@ class TestPasswordStore(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % os.path.join(origin_dir, '.git'),
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'init',
|
||||||
|
@@ -184,7 +184,7 @@ class TestPasswordStore(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % os.path.join(origin_dir, '.git'),
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'add', 'test_git_init_clone.gpg',
|
||||||
|
@@ -193,7 +193,7 @@ class TestPasswordStore(unittest.TestCase):
|
||||||
|
|
||||||
|
subprocess.Popen(
|
||||||
|
[
|
||||||
|
- 'git',
|
||||||
|
+ '@git_exec@',
|
||||||
|
'--git-dir=%s' % os.path.join(origin_dir, '.git'),
|
||||||
|
'--work-tree=%s' % origin_dir,
|
||||||
|
'commit',
|
@ -21466,6 +21466,8 @@ in
|
|||||||
|
|
||||||
musikcube = callPackage ../applications/audio/musikcube {};
|
musikcube = callPackage ../applications/audio/musikcube {};
|
||||||
|
|
||||||
|
pass-secret-service = callPackage ../applications/misc/pass-secret-service { };
|
||||||
|
|
||||||
pinboard = with python3Packages; toPythonApplication pinboard;
|
pinboard = with python3Packages; toPythonApplication pinboard;
|
||||||
|
|
||||||
pinboard-notes-backup = haskell.lib.overrideCabal
|
pinboard-notes-backup = haskell.lib.overrideCabal
|
||||||
|
@ -5291,6 +5291,8 @@ in {
|
|||||||
|
|
||||||
pyparted = callPackage ../development/python-modules/pyparted { };
|
pyparted = callPackage ../development/python-modules/pyparted { };
|
||||||
|
|
||||||
|
pypass = callPackage ../development/python-modules/pypass { };
|
||||||
|
|
||||||
pypblib = callPackage ../development/python-modules/pypblib { };
|
pypblib = callPackage ../development/python-modules/pypblib { };
|
||||||
|
|
||||||
pypcap = callPackage ../development/python-modules/pypcap { };
|
pypcap = callPackage ../development/python-modules/pypcap { };
|
||||||
|
Loading…
x
Reference in New Issue
Block a user