Subject: bug#39841: closed (Re: [bug#39841] [WIP PATCH] synapse)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 02 Apr 2020 18:51:02 +0000

Your bug report

#39841: [WIP PATCH] synapse

which was filed against the guix-patches package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
39841: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=39841
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: [bug#39841] [WIP PATCH] synapse
From: Marius Bakke <[email-masked]>
To: Alex ter Weele <[email-masked]>
Cc: [email-masked]
Date: Thu, 02 Apr 2020 20:49:40 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Phew...  It took a while, but I've merged the whole series.  \o/

PS: Some of the later packages did not pass 'guix lint'.  There were
periods in synopses, lack of period or capitalizations in descriptions
and other minor issues.

I've also modified some of the descriptions to be more ... descriptive,
and use full sentences, instead of just a copy-paste of the synopsis.

I added a 'Co-authored-by:' line for the packages that were heavily
modified to save you some of the blame.  ;-)

A brief feedback on the patches:

Alex ter Weele <[email-masked]> writes:

> +(define-public python-signedjson
> +  (package
> +    (name "python-signedjson")
> +    (version "1.1")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "signedjson" version))
> +       (sha256
> +        (base32 "13wfi50wzz38j6xsz7hmx26vf0zvk0fj7516wavzpsyfk9xy3g5v"))))
> +    (build-system python-build-system)
> +    (arguments
> +     ;; TODO "AttributeError: type object 'Callable' has no attribute
> +     ;; '_abc_registry'"
> +     `(#:tests? #f))

This was because of the inclusion of 'python-typing', which is part of
the Python standard library and apparently caused some conflict.
Removing it from propagated-inputs made all tests pass.

> +(define-public python-prometheus-client
> +  (package
> +    (name "python-prometheus-client")
> +    (version "0.7.1")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "prometheus_client" version))
> +       (sha256
> +        (base32 "1ni2yv4ixwz32nz39ckia76lvggi7m19y5f702w5qczbnfi29kbi"))))
> +    (build-system python-build-system)
> +    (arguments
> +     ;; TODO "ModuleNotFoundError: No module named 'tests'"
> +     `(#:tests? #f))

This is because the PyPI tarball contains no tests.  I adjusted the
comment to reflect that.

> +    (propagated-inputs
> +     `(("python-twisted" ,python-twisted)))
> +    (native-inputs
> +     `(("python-tox" ,python-tox)))

...and also removed Tox, as it is pretty useless in Guix.  Whenever you
come across a package that uses Tox, you should read what tox.ini does
and do that directly in the check phase instead.

(Running Tox does not work because it wants to go on the internet and
create a virtualenv and does not play well with native Guix packages)

> +(define-public python-ldap3
> +  (package
> +    (name "python-ldap3")
> +    (version "2.6.1")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "ldap3" version))
> +       (sha256
> +        (base32 "0ag5xqlki6pjk3f50b8ar8vynx2fmkna7rfampv3kdgwg8z6gjr7"))))
> +    (build-system python-build-system)
> +    (arguments
> +     ;; TODO "ImportError: Failed to import test module: ordDict"
> +     `(#:tests? #f))

There were two problems here: the pyasn1 version was too old, and
ultimately running the full suite requires an LDAP server, so I adjusted
the comment to reflect that (and also updated pyasn1 to prevent runtime
errors).

> +(define-public python-eliot
> +  (package
> +    (name "python-eliot")
> +    (version "1.12.0")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "eliot" version))
> +       (sha256
> +        (base32 "0wabv7hk63l12881f4zw02mmj06583qsx2im0yywdjlj8f56vqdn"))))
> +    (build-system python-build-system)
> +    (arguments
> +     `(#:phases
> +       (modify-phases %standard-phases
> +         (add-after 'unpack 'remove-journald-support
> +           (lambda _
> +             (invoke "rm"
> +                     "eliot/tests/test_journald.py"
> +                     "eliot/journald.py")
> +             #t))
> +         (add-after 'remove-journald-support 'remove-eliot-prettyprint-tests
> +           ;; remove command-line tool's tests. TODO eliot-prettyprint should
> +           ;; be installed and these tests should pass.
> +           (lambda _
> +             (invoke "rm" "eliot/tests/test_prettyprint.py")
> +             #t)))))

I changed the (invoke "rm" ...) stanzas to (delete-file ...) to avoid
the fork. 

> +(define-public python-pem
> +  (package
> +    (name "python-pem")
> +    (version "20.1.0")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "pem" version))
> +       (sha256
> +        (base32
> +         "1xh88ss279fprxnzd10dczmqwjhppbyvljm33zrg2mgybwd66qr7"))))
> +    (build-system python-build-system)
> +    (native-inputs
> +     `(("python-certifi" ,python-certifi)
> +       ("python-coverage" ,python-coverage)
> +       ("python-pretend" ,python-pretend)
> +       ("python-pyopenssl" ,python-pyopenssl)
> +       ("python-pytest" ,python-pytest)
> +       ("python-sphinx" ,python-sphinx)
> +       ("python-twisted" ,python-twisted)))
> +    (home-page "https://pem.readthedocs.io/")
> +    (synopsis "Easy PEM file parsing in Python.")
> +    (description "Easy PEM file parsing in Python.")

I'm curious why all those inputs are just native, but did not
investigate.  I did fix the trailing dot in the synopsis, as well as
expanded a bit on the description.

> +(define-public python-txsni
> +  (package
> +    (name "python-txsni")
> +    (version "0.1.9")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "TxSNI" version))
> +       (sha256
> +        (base32
> +         "1c72nbhx4z0v5djb89yzrcqlmjdlyryj7qgwl9ivnn816126z5kj"))))
> +    (build-system python-build-system)
> +    (arguments
> +     ;; TODO confusing test failure
> +     `(#:tests? #f))

So this turned out the be because the latest TxSNI release is
incompatible with newer OpenSSL.  I ended up pulling the package
straight from git, and made myself the package author.

> +    (propagated-inputs
> +     `(("python-pyopenssl" ,python-pyopenssl)
> +       ("python-service-identity" ,python-service-identity)
> +       ("python-twisted" ,python-twisted)))
> +    (home-page "https://github.com/glyph/txsni")
> +    (synopsis "easy-to-use SNI endpoint for twisted")
> +    (description
> +     "easy-to-use SNI endpoint for twisted")

...I also rewrote synopsis and description to be more Guix-y.

> +(define-public python-pysaml2
> +  (package
> +    (name "python-pysaml2")
> +    (version "5.0.0")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (pypi-uri "pysaml2" version))
> +       (sha256
> +        (base32
> +         "1h8cmxh9cvxhrdfmkh92wg6zpxmhi2fixq1cy4hxismmaar7bsny"))))
> +    (build-system python-build-system)
> +    (propagated-inputs
> +     `(("python-cryptography" ,python-cryptography)
> +       ("python-dateutil" ,python-dateutil)
> +       ("python-defusedxml" ,python-defusedxml)
> +       ("python-pyopenssl" ,python-pyopenssl)
> +       ("python-pytz" ,python-pytz)
> +       ("python-requests" ,python-requests)
> +       ("python-six" ,python-six)))
> +    (home-page "https://idpy.org")
> +    (synopsis
> +     "Python implementation of SAML Version 2 Standard")
> +    (description
> +     "Python implementation of SAML Version 2 Standard")

Here I took the description from the README which was very informative.

> * gnu/packages/matrix.scm: New file. (python-matrix-synapse-ldap3) New
>   variable.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add matrix.scm.
> ---
>  gnu/local.mk            |  1 +
>  gnu/packages/matrix.scm | 33 +++++++++++++++++++++++++++++++++
>  2 files changed, 34 insertions(+)
>  create mode 100644 gnu/packages/matrix.scm
>
> diff --git a/gnu/local.mk b/gnu/local.mk
> index 7d8145b10d..8c50da9c10 100644
> --- a/gnu/local.mk
> +++ b/gnu/local.mk
> @@ -343,6 +343,7 @@ GNU_SYSTEM_MODULES =				\
>    %D%/packages/marst.scm			\
>    %D%/packages/mate.scm             \
>    %D%/packages/maths.scm			\
> +  %D%/packages/matrix.scm			\
>    %D%/packages/maven.scm			\
>    %D%/packages/mc.scm				\
>    %D%/packages/mcrypt.scm			\
> diff --git a/gnu/packages/matrix.scm b/gnu/packages/matrix.scm
> new file mode 100644
> index 0000000000..f399d2aabc
> --- /dev/null
> +++ b/gnu/packages/matrix.scm
> @@ -0,0 +1,33 @@
> +(define-module (gnu packages matrix)
> +  #:use-module ((guix licenses) #:prefix license:)
> +  #:use-module (gnu packages python-crypto)
> +  #:use-module (gnu packages python-xyz)
> +  #:use-module (guix build-system python)
> +  #:use-module (guix download)
> +  #:use-module (guix packages))

You forgot to add the license notice at the top of this file.  Fixed!

Subject: [WIP PATCH] synapse
From: Alex ter Weele <[email-masked]>
To: "guix-patches" <[email-masked]>
Date: Sat, 29 Feb 2020 11:53:03 -0600
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello,

These are some patches to add Synapse
<https://github.com/matrix-org/synapse>.

I would appreciate some help getting the tests to run for some of the
Python dependencies, they're marked with TODOs.

Synapse appears to have some optional dependencies. I haven't packaged
all of them. The remaining ones are also marked with TODOs.

But, it seems to run! Here's what I had to do to start it:

guix environment guix -- make -j4 && ./pre-inst-env guix environment synapse

cd ~/src/synapse/

python -m synapse.app.homeserver --server-name test.local --config-path /tmp/homeserver.yaml --generate-config --report-stats=no

exit

guix environment guix -- make -j4 && ./pre-inst-env guix environment --ad-hoc synapse -- synctl --no-daemonize start /tmp/homeserver.yaml

>From 713a8bf6905ccd49ff53a5a06526816ca0a98535 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:03:02 -0600
Subject: [PATCH 01/12] gnu: python-typing-extensions: Update to 3.7.4.1.

* gnu/packages/python-xyz (python-typing-extensions): Update to 3.7.4.1.
---
 gnu/packages/python-xyz.scm | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 4ea09b756e..abd3ff775a 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -14907,14 +14907,14 @@ and other tools.")
 (define-public python-typing-extensions
   (package
     (name "python-typing-extensions")
-    (version "3.7.2")
+    (version "3.7.4.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "typing_extensions" version))
        (sha256
         (base32
-         "0wfsv71pvkyf2na938l579jh0v3kzl6g744ijgnahcwd4d9x0b7v"))))
+         "1wj1vcgbnm20aiinmphyxfrbv3qi9xdhvw89ab3qm42y9n4wq7h9"))))
     (build-system python-build-system)
     (home-page
      "https://github.com/python/typing/blob/master/typing_extensions/README.rst")
-- 
2.25.1

>From 7a9128fe9a1199349557f6a442ed410b099fe049 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:06:27 -0600
Subject: [PATCH 02/12] gnu: Add python-frozendict.

* gnu/packages/python-xyz.scm (python-frozendict): New variable.
---
 gnu/packages/python-xyz.scm | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index abd3ff775a..9007c4f3fa 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17576,3 +17576,22 @@ sequences.")
 
 (define-public python2-fuzzywuzzy
   (package-with-python2 python-fuzzywuzzy))
+
+(define-public python-frozendict
+  (package
+    (name "python-frozendict")
+    (version "1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "frozendict" version))
+       (sha256
+        (base32 "0ibf1wipidz57giy53dh7mh68f2hz38x8f4wdq88mvxj5pr7jhbp"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/slezica/python-frozendict")
+    (synopsis "A simple immutable mapping for python")
+    (description
+     "frozendict is an immutable wrapper around dictionaries that implements
+the complete mapping interface. It can be used as a drop-in replacement for
+dictionaries where immutability is desired.")
+    (license license:expat)))
-- 
2.25.1

>From 6efc1c329f39fc9290601b368dde4e5283397563 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:07:34 -0600
Subject: [PATCH 03/12] gnu: Add python-unpaddedbase64.

* gnu/packages/python-xyz.scm (python-unpaddedbase64): New variable.
---
 gnu/packages/python-xyz.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 9007c4f3fa..847a4fe7e0 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17595,3 +17595,26 @@ sequences.")
 the complete mapping interface. It can be used as a drop-in replacement for
 dictionaries where immutability is desired.")
     (license license:expat)))
+
+(define-public python-unpaddedbase64
+  (package
+    (name "python-unpaddedbase64")
+    (version "1.1.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/matrix-org/python-unpaddedbase64.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0if3fjfxga0bwdq47v77fs9hrcqpmwdxry2i2a7pdqsp95258nxd"))))
+    (build-system python-build-system)
+    (home-page "https://pypi.org/project/unpaddedbase64/")
+    (synopsis "Encode and decode Base64 without “=” padding.")
+    (description
+     "RFC 4648 specifies that Base64 should be padded to a multiple of 4 bytes
+using “=” characters. However this conveys no benefit so many protocols choose
+to use Base64 without the “=” padding.")
+    (license license:asl2.0)))
-- 
2.25.1

>From 85cfe8b9df96aa7b500ee88baa274310a8ab0e20 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:08:29 -0600
Subject: [PATCH 04/12] gnu: Add python-canonicaljson.

* gnu/packages/python-xyz.scm (python-canonicaljson): New variable.
---
 gnu/packages/python-xyz.scm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 847a4fe7e0..5b401a0ad3 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17618,3 +17618,33 @@ dictionaries where immutability is desired.")
 using “=” characters. However this conveys no benefit so many protocols choose
 to use Base64 without the “=” padding.")
     (license license:asl2.0)))
+
+(define-public python-canonicaljson
+  (package
+    (name "python-canonicaljson")
+    (version "1.1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "canonicaljson" version))
+       (sha256
+        (base32 "09cpacc8yvcc74i63pdmlfaahh77dnvbyw9zf29wml2zzwqfbg25"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-six" ,python-six)
+       ("python-frozendict" ,python-frozendict)
+       ("python-simplejson" ,python-simplejson)))
+    (home-page "https://github.com/matrix-org/python-canonicaljson")
+    (synopsis "Canonical JSON")
+    (description
+     "@enumerate
+@item Encodes objects and arrays as RFC 7159 JSON.
+@item Sorts object keys so that you get the same result each time.
+@item Has no insignificant whitespace to make the output as small as possible.
+@item Escapes only the characters that must be escaped, U+0000 to
+ U+0019 / U+0022 / U+0056, to keep the output as small as possible.
+@item Uses the shortest escape sequence for each escaped character.
+@item Encodes the JSON as UTF-8.
+@item Can encode frozendict immutable dictionaries.
+@end enumerate ")
+    (license license:asl2.0)))
-- 
2.25.1

>From f071df94857709c1bb586463ad28e58cc940bfaf Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:09:58 -0600
Subject: [PATCH 05/12] gnu: Add python-signedjson.

* gnu/packages/python-xyz.scm (python-signedjson): New variable.
---
 gnu/packages/python-xyz.scm | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 5b401a0ad3..7200b3218e 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17648,3 +17648,40 @@ to use Base64 without the “=” padding.")
 @item Can encode frozendict immutable dictionaries.
 @end enumerate ")
     (license license:asl2.0)))
+
+(define-public python-signedjson
+  (package
+    (name "python-signedjson")
+    (version "1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "signedjson" version))
+       (sha256
+        (base32 "13wfi50wzz38j6xsz7hmx26vf0zvk0fj7516wavzpsyfk9xy3g5v"))))
+    (build-system python-build-system)
+    (arguments
+     ;; TODO "AttributeError: type object 'Callable' has no attribute
+     ;; '_abc_registry'"
+     `(#:tests? #f))
+    (inputs
+     `(("python-canonicaljson" ,python-canonicaljson)
+       ("python-unpaddedbase64" ,python-unpaddedbase64)
+       ("python-pynacl" ,python-pynacl)
+       ("python-typing-extensions" ,python-typing-extensions)
+       ("python-typing" ,python-typing)))
+    (native-inputs
+     `(("python-simplejson" ,python-simplejson)
+       ("python-frozendict" ,python-frozendict)))
+    (home-page "https://github.com/matrix-org/python-signedjson")
+    (synopsis "Sign JSON objects with ED25519 signatures")
+    (description
+     "@enumerate
+@item More than one entity can sign the same object.
+@item Each entity can sign the object with more than one key making it easier to
+rotate keys
+@item ED25519 can be replaced with a different algorithm.
+@item Unprotected data can be added to the object under the @dfn{\"unsigned\"}
+key.
+@end enumerate")
+    (license license:asl2.0)))
-- 
2.25.1

>From 420e1f58df9d5f8d39d39fff97cea0f592607afa Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:10:35 -0600
Subject: [PATCH 06/12] gnu: Add python-daemonize.

* gnu/packages/python-xyz.scm (python-daemonize): New variable.
---
 gnu/packages/python-xyz.scm | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 7200b3218e..58cc7c197d 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17685,3 +17685,19 @@ rotate keys
 key.
 @end enumerate")
     (license license:asl2.0)))
+
+(define-public python-daemonize
+  (package
+    (name "python-daemonize")
+    (version "2.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "daemonize" version))
+       (sha256
+        (base32 "1hwbl3gf9fdds9sc14zgjyjisjvxidrvqc11xlbb0b6jz17nw0nx"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/thesharp/daemonize")
+    (synopsis "A library for writing system daemons in Python")
+    (description "daemonize is a library for writing system daemons in Python.")
+    (license license:expat)))
-- 
2.25.1

>From 290caa3269f9cfc121af8350d223089925c9b801 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:11:11 -0600
Subject: [PATCH 07/12] gnu: Add python-pymacaroons.

* gnu/packages/python-xyz.scm (python-pymacaroons): New variable.
---
 gnu/packages/python-xyz.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 58cc7c197d..7d8653a99d 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17701,3 +17701,30 @@ key.
     (synopsis "A library for writing system daemons in Python")
     (description "daemonize is a library for writing system daemons in Python.")
     (license license:expat)))
+
+(define-public python-pymacaroons
+  (package
+    (name "python-pymacaroons")
+    (version "0.13.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pymacaroons" version))
+       (sha256
+        (base32 "1f0357a6g1h96sk6wy030xmc1p4rd80a999qvxd28v7nlm1blsqy"))))
+    (build-system python-build-system)
+    (inputs
+     `(("python-six" ,python-six)
+       ("python-pynacl" ,python-pynacl)))
+    (home-page "https://github.com/ecordell/pymacaroons")
+    (synopsis "A Python Macaroon Library")
+    (description
+     "Macaroons, like cookies, are a form of bearer credential. Unlike opaque
+tokens, macaroons embed caveats that define specific authorization
+requirements for the target service, the service that issued the root macaroon
+and which is capable of verifying the integrity of macaroons it receives.
+
+Macaroons allow for delegation and attenuation of authorization. They are
+simple and fast to verify, and decouple authorization policy from the
+enforcement of that policy.")
+    (license license:expat)))
-- 
2.25.1

>From 87db6e10a67ad872ad9de6dcf4c9e6cc5a57ab15 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:11:35 -0600
Subject: [PATCH 08/12] gnu: Add python-prometheus-client.

* gnu/packages/python-xyz.scm (python-prometheus-client): New variable.
---
 gnu/packages/python-xyz.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 7d8653a99d..ee7f4cd239 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17728,3 +17728,26 @@ Macaroons allow for delegation and attenuation of authorization. They are
 simple and fast to verify, and decouple authorization policy from the
 enforcement of that policy.")
     (license license:expat)))
+
+(define-public python-prometheus-client
+  (package
+    (name "python-prometheus-client")
+    (version "0.7.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "prometheus_client" version))
+       (sha256
+        (base32 "1ni2yv4ixwz32nz39ckia76lvggi7m19y5f702w5qczbnfi29kbi"))))
+    (build-system python-build-system)
+    (arguments
+     ;; TODO "ModuleNotFoundError: No module named 'tests'"
+     `(#:tests? #f))
+    (inputs
+     `(("python-twisted" ,python-twisted)))
+    (native-inputs
+     `(("python-tox" ,python-tox)))
+    (home-page "https://github.com/prometheus/client_python")
+    (synopsis "Prometheus instrumentation library for Python applications")
+    (description "The official Python 2 and 3 client for Prometheus.")
+    (license license:asl2.0)))
-- 
2.25.1

>From 8bb5a61b0e865a4bb31ccba7777a964e51d51fc7 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:12:08 -0600
Subject: [PATCH 09/12] gnu: Add python-ldap3.

* gnu/packages/python-xyz.scm (python-ldap3): New variable.
---
 gnu/packages/python-xyz.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index ee7f4cd239..8313d620de 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17751,3 +17751,27 @@ enforcement of that policy.")
     (synopsis "Prometheus instrumentation library for Python applications")
     (description "The official Python 2 and 3 client for Prometheus.")
     (license license:asl2.0)))
+
+(define-public python-ldap3
+  (package
+    (name "python-ldap3")
+    (version "2.6.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "ldap3" version))
+       (sha256
+        (base32 "0ag5xqlki6pjk3f50b8ar8vynx2fmkna7rfampv3kdgwg8z6gjr7"))))
+    (build-system python-build-system)
+    (arguments
+     ;; TODO "ImportError: Failed to import test module: ordDict"
+     `(#:tests? #f))
+    (inputs
+     `(("python-pyasn1" ,python-pyasn1)
+       ("python-gssapi" ,python-gssapi)))
+    (home-page "https://github.com/ecordell/ldap3")
+    (synopsis "A strictly RFC 4510 conforming LDAP V3 pure Python client.")
+    (description
+     "ldap3 is a strictly RFC 4510 conforming LDAP V3 pure Python client
+library. The same codebase runs in Python 2, Python 3, PyPy and PyPy3.")
+    (license license:lgpl3+)))
-- 
2.25.1

>From 6385d8d65cf0022b6f893b8fc3e8216d942a629a Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:13:26 -0600
Subject: [PATCH 10/12] gnu: Add python-txacme.

* gnu/packages/python-xyz.scm (python-txacme): New variable.
---
 gnu/packages/python-xyz.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 8313d620de..8735a6c220 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -17775,3 +17775,31 @@ enforcement of that policy.")
      "ldap3 is a strictly RFC 4510 conforming LDAP V3 pure Python client
 library. The same codebase runs in Python 2, Python 3, PyPy and PyPy3.")
     (license license:lgpl3+)))
+
+(define-public python-txacme
+  (package
+    (name "python-txacme")
+    (version "0.9.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "txacme" version))
+       (sha256
+        (base32 "1cplx4llq7i508w6fgwjdv9di7rsz9k9irfmzdfbiz6q6a0ykf1d"))))
+    (build-system python-build-system)
+    (inputs
+     ;; TODO many unpackaged inputs needed
+     `())
+    (home-page "https://github.com/twisted/txacme")
+    (synopsis
+     "Twisted implementation of the Automatic Certificate Management
+Environment (ACME) protocol")
+    (description
+     "ACME is Automatic Certificate Management Environment, a protocol that
+allows clients and certificate authorities to automate verification and
+certificate issuance. The ACME protocol is used by the free Let's Encrypt
+Certificate Authority.
+
+txacme is an implementation of the protocol for Twisted, the event-driven
+networking engine for Python.")
+    (license license:expat)))
-- 
2.25.1

>From 0b37dabdf6691b314a89c099cbf0e97c7d2c202e Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:19:28 -0600
Subject: [PATCH 11/12] gnu: Add python-matrix-synapse-ldap3.

* gnu/packages/matrix.scm: New file. (python-matrix-synapse-ldap3) New
  variable.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add matrix.scm.
---
 gnu/local.mk            |  1 +
 gnu/packages/matrix.scm | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 gnu/packages/matrix.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 857345cfad..5c87561eaf 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -340,6 +340,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/marst.scm			\
   %D%/packages/mate.scm             \
   %D%/packages/maths.scm			\
+  %D%/packages/matrix.scm			\
   %D%/packages/maven.scm			\
   %D%/packages/mc.scm				\
   %D%/packages/mcrypt.scm			\
diff --git a/gnu/packages/matrix.scm b/gnu/packages/matrix.scm
new file mode 100644
index 0000000000..83c314ffe4
--- /dev/null
+++ b/gnu/packages/matrix.scm
@@ -0,0 +1,33 @@
+(define-module (gnu packages matrix)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages python-crypto)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (guix build-system python)
+  #:use-module (guix download)
+  #:use-module (guix packages))
+
+(define-public python-matrix-synapse-ldap3
+  (package
+    (name "python-matrix-synapse-ldap3")
+    (version "0.1.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "matrix-synapse-ldap3" version))
+       (sha256
+        (base32
+         "01bms89sl16nyh9f141idsz4mnhxvjrc3gj721wxh1fhikps0djx"))))
+    (build-system python-build-system)
+    (arguments
+     ;; tests require synapse, creating a circular dependency.
+     '(#:tests? #f))
+    (inputs
+     `(("python-twisted" ,python-twisted)
+       ("python-ldap3" ,python-ldap3)
+       ("python-service-identity" ,python-service-identity)))
+    (home-page "https://github.com/matrix-org/matrix-synapse-ldap3")
+    (synopsis "An LDAP3 auth provider for Synapse")
+    (description
+     "Allows synapse to use LDAP as a password provider. This allows users to
+log in to synapse with their username and password from an LDAP server.")
+    (license license:asl2.0)))
-- 
2.25.1

>From 60769229bc80fcd800e5a4a325c4dcdf7591ae21 Mon Sep 17 00:00:00 2001
From: Alex ter Weele <[email-masked]>
Date: Sat, 29 Feb 2020 11:22:06 -0600
Subject: [PATCH 12/12] gnu: Add synapse.

* gnu/packages/matrix.scm (synapse): New variable.
---
 gnu/packages/matrix.scm | 70 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/gnu/packages/matrix.scm b/gnu/packages/matrix.scm
index 83c314ffe4..93ec726465 100644
--- a/gnu/packages/matrix.scm
+++ b/gnu/packages/matrix.scm
@@ -1,7 +1,11 @@
 (define-module (gnu packages matrix)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages databases)
   #:use-module (gnu packages python-crypto)
+  #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages xml)
   #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module (guix packages))
@@ -31,3 +35,69 @@
      "Allows synapse to use LDAP as a password provider. This allows users to
 log in to synapse with their username and password from an LDAP server.")
     (license license:asl2.0)))
+
+(define-public synapse
+  (package
+    (name "synapse")
+    (version "1.11.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "matrix-synapse" version))
+              (sha256
+               (base32
+                "0cqbwcz0fi4w413s1kcxvf696qi4n46n1k4ggnygqri5yq26qlfy"))))
+    (build-system python-build-system)
+    ;; TODO I think there are custom tests
+    (inputs
+     `(("python-simplejson" ,python-simplejson) ; not attested but required
+       ;; requirements (synapse/python_dependencies.py)
+       ("python-jsonschema" ,python-jsonschema)
+       ("python-frozendict" ,python-frozendict)
+       ("python-unpaddedbase64" ,python-unpaddedbase64)
+       ("python-canonicaljson" ,python-canonicaljson)
+       ("python-signedjson" ,python-signedjson)
+       ("python-pynacl" ,python-pynacl)
+       ("python-idna" ,python-idna)
+       ("python-service-identity" ,python-service-identity)
+       ("python-twisted" ,python-twisted)
+       ("python-treq" ,python-treq)
+       ("python-pyopenssl" ,python-pyopenssl)
+       ("python-pyyaml" ,python-pyyaml)
+       ("python-pyasn1" ,python-pyasn1)
+       ("python-pyasn1-modules" ,python-pyasn1-modules)
+       ("python-daemonize" ,python-daemonize)
+       ("python-bcrypt" ,python-bcrypt)
+       ("python-pillow" ,python-pillow)
+       ("python-sortedcontainers" ,python-sortedcontainers)
+       ("python-pymacaroons" ,python-pymacaroons)
+       ("python-msgpack" ,python-msgpack)
+       ("python-phonenumbers" ,python-phonenumbers)
+       ("python-six" ,python-six)
+       ("python-prometheus-client" ,python-prometheus-client)
+       ("python-attrs" ,python-attrs)
+       ("python-netaddr" ,python-netaddr)
+       ("python-jinja2" ,python-jinja2)
+       ("python-bleach" ,python-bleach)
+       ("python-typing-extensions" ,python-typing-extensions)
+       ;; conditional requirements (synapse/python_dependencies.py)
+       ("python-matrix-synapse-ldap3" ,python-matrix-synapse-ldap3)
+       ("python-psycopg2" ,python-psycopg2)
+       ("python-jinja2" ,python-jinja2)
+       ;; TODO txacme, eliot, pysaml2
+       ("python-lxml" ,python-lxml)
+       ;; TODO sentry-sdk, jaeger-client, opentracing
+       ("python-pyjwt" ,python-pyjwt)
+       ))
+    (native-inputs
+     `(("python-mock" ,python-mock)
+       ("python-parameterized" ,python-parameterized)))
+    (home-page "https://github.com/matrix-org/synapse")
+    (synopsis "Matrix reference homeserver")
+    (description "Synapse is a reference \"homeserver\" implementation of
+Matrix from the core development team at matrix.org, written in
+Python/Twisted. It is intended to showcase the concept of Matrix and let folks
+see the spec in the context of a codebase and let you run your own homeserver
+and generally help bootstrap the ecosystem.")
+    (license license:asl2.0)))
+
+
-- 
2.25.1