Subject: [bug#39028] [PATCH] gnu: Add python-asyncssh

From: Lars-Dominik Braun <[email-masked]>
Date: Tue, 28 Apr 2020 11:44:58 +0200

Hi,

here’s an updated patch that adds python-asyncssh with a patch that restores
python-cryptography-2.7 compatibility until 2.8 hits master.

Lars

From 49f0634e2e409e4c38a47aafc5113787dd14ea06 Mon Sep 17 00:00:00 2001
From: Lars-Dominik Braun <[email-masked]>
Date: Tue, 28 Apr 2020 11:41:08 +0200
Subject: [PATCH] gnu: Add python-asyncssh

* gnu/packages/python-xyz.scm (python-asyncssh): New variable
* gnu/local.mk (dist_patch_DATA): Add new patch
* gnu/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch: New file
---
 gnu/local.mk                                  |  1 +
 .../python-asyncssh-2.2.1-no-crypto2.8.patch  | 37 ++++++++++++++++
 gnu/packages/python-xyz.scm                   | 43 +++++++++++++++++++
 3 files changed, 81 insertions(+)
 create mode 100644 gnu/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 9f212434a9..f3cc5fd116 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1360,6 +1360,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-CVE-2018-14647.patch		\
   %D%/packages/patches/python-aiohttp-3.6.2-no-warning-fail.patch	\
   %D%/packages/patches/python-alembic-exceptions-cause.patch	\
+  %D%/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch			\
   %D%/packages/patches/python-axolotl-AES-fix.patch		\
   %D%/packages/patches/python-cairocffi-dlopen-path.patch	\
   %D%/packages/patches/python-cffi-x87-stack-clean.patch	\
diff --git a/gnu/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch b/gnu/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch
new file mode 100644
index 0000000000..bf41ec865c
--- /dev/null
+++ b/gnu/packages/patches/python-asyncssh-2.2.1-no-crypto2.8.patch
@@ -0,0 +1,37 @@
+Reverted commit
+https://github.com/ronf/asyncssh/commit/386432c9b698beb23ccb88b69f4023560b76750f
+
+--- b/asyncssh/crypto/chacha.py
++++ a/asyncssh/crypto/chacha.py
+@@ -51,13 +51,18 @@
+     def poly1305(key, data, nonce):
+         """Compute a Poly1305 tag for a block of data"""
+ 
++        poly = Poly1305(poly1305_key(key, nonce))
++        poly.update(data)
++        return poly.finalize()
+-        return Poly1305.generate_tag(poly1305_key(key, nonce), data)
+ 
+     def poly1305_verify(key, data, nonce, tag):
+         """Verify a Poly1305 tag for a block of data"""
+ 
++        poly = Poly1305(poly1305_key(key, nonce))
++
+         try:
++            poly.update(data)
++            poly.verify(tag)
+-            Poly1305.verify_tag(poly1305_key(key, nonce), data, tag)
+             return True
+         except InvalidSignature:
+             return False
+--- b/setup.py
++++ a/setup.py
+@@ -52,7 +52,7 @@
+       long_description = long_description,
+       platforms = 'Any',
+       python_requires = '>= 3.6',
++      install_requires = ['cryptography >= 2.7'],
+-      install_requires = ['cryptography >= 2.8'],
+       extras_require = {
+           'bcrypt':     ['bcrypt >= 3.1.3'],
+           'gssapi':     ['gssapi >= 1.2.0'],
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 31cafd47d1..6f17f4113e 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -19588,3 +19588,46 @@ workspace...")
 dependencies.  It implements the @uref{http://opensoundcontrol.org/spec-1_0,
 Open Sound Control 1.0} specification.")
     (license license:unlicense)))
+
+(define-public python-asyncssh
+  (package
+    (name "python-asyncssh")
+    (version "2.2.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "asyncssh" version))
+        (sha256
+          (base32
+            "13ik6gc8qh8v2dkhfcv2rrip19bcg4kykfi37464l43s76mg3yds"))
+        ;; revert changes that require python-cryptography 2.8, no functional
+        ;; differences
+        (patches (search-patches "python-asyncssh-2.2.1-no-crypto2.8.patch"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-cryptography" ,python-cryptography)
+       ("python-pyopenssl" ,python-pyopenssl)
+       ("python-gssapi" ,python-gssapi)
+       ("python-bcrypt" ,python-bcrypt)))
+    ;; required for test suite
+    (native-inputs
+     `(("openssh" ,openssh)
+       ("openssl" ,openssl)))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-tests
+           (lambda* _
+            (substitute* "tests/test_agent.py"
+              ;; Test fails for unknown reason
+              (("async def test_confirm")
+                "@unittest.skip('disabled by guix')\n    async def test_confirm")))))))
+    (home-page "https://asyncssh.readthedocs.io/")
+    (synopsis
+      "Asynchronous SSHv2 client and server library")
+    (description
+      "AsyncSSH is a Python package which provides an asynchronous client and
+server implementation of the SSHv2 protocol on top of the Python 3.6+ asyncio
+framework")
+    (license license:epl2.0)))
+
-- 
2.20.1