pyFF 2.1.7__tar.gz → 3.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. {pyff-2.1.7 → pyff-3.0.0}/PKG-INFO +15 -14
  2. {pyff-2.1.7 → pyff-3.0.0}/README.rst +5 -3
  3. {pyff-2.1.7 → pyff-3.0.0}/pyproject.toml +10 -11
  4. {pyff-2.1.7 → pyff-3.0.0}/pyproject.toml.orig +10 -11
  5. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/api.py +4 -4
  6. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/builtins.py +458 -119
  7. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/constants.py +12 -0
  8. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/parse.py +4 -3
  9. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/pipes.py +1 -1
  10. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/resource.py +182 -11
  11. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/samlmd.py +92 -50
  12. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/store.py +19 -4
  13. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/__init__.py +2 -4
  14. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/eidas/countries/FR.xml +4 -4
  15. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/eidas/countries/GR.xml +2 -2
  16. pyff-3.0.0/src/pyff/test/data/eidas/countries/fr-connector.xml +55 -0
  17. pyff-3.0.0/src/pyff/test/data/eidas/countries/fr-proxy.xml +60 -0
  18. pyff-3.0.0/src/pyff/test/data/eidas/countries/gr-connector.xml +66 -0
  19. pyff-3.0.0/src/pyff/test/data/eidas/countries/gr-proxy.xml +67 -0
  20. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/edugain-trustinfo-2.0.xml +1 -1
  21. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_md_api.py +50 -2
  22. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_mdsl.py +2 -1
  23. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_pipeline.py +413 -6
  24. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_repo.py +42 -0
  25. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_utils.py +56 -1
  26. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/utils.py +281 -63
  27. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/eidas-cleanup.xsl +9 -0
  28. {pyff-2.1.7 → pyff-3.0.0}/LICENSE +0 -0
  29. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/__init__.py +0 -0
  30. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/decorators.py +0 -0
  31. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/exceptions.py +0 -0
  32. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/fetch.py +0 -0
  33. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/locks.py +0 -0
  34. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/logs.py +0 -0
  35. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/md.py +0 -0
  36. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/mdq.py +0 -0
  37. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/merge_strategies.py +0 -0
  38. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/repo.py +0 -0
  39. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/MetadataExchange.xsd +0 -0
  40. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/XMLSchema.xsd +0 -0
  41. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/atom.xsd +0 -0
  42. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/cs-sstc-schema-assertion-1.1.xsd +0 -0
  43. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/oasis-200401-wss-wssecurity-secext-1.0.xsd +0 -0
  44. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/oasis-200401-wss-wssecurity-utility-1.0.xsd +0 -0
  45. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/privacy.xsd +0 -0
  46. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/saml-metadata-rpi-v1.0.xsd +0 -0
  47. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/saml-metadata-trustinfo-v1.0.xsd +0 -0
  48. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/saml-schema-assertion-2.0.xsd +0 -0
  49. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/saml-schema-metadata-2.0.xsd +0 -0
  50. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/saml-schema-protocol-2.0.xsd +0 -0
  51. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/schema.xsd +0 -0
  52. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/shibboleth-metadata-1.0.xsd +0 -0
  53. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/shibboleth-trust-1.0.xsd +0 -0
  54. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/shibboleth.xsd +0 -0
  55. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-metadata-attr.xsd +0 -0
  56. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-saml-idp-discovery.xsd +0 -0
  57. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-saml-metadata-algsupport.xsd +0 -0
  58. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-saml-metadata-ui-v1.0.xsd +0 -0
  59. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-saml-schema-assertion-2.0.xsd +0 -0
  60. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/sstc-saml-schema-metadata-2.0.xsd +0 -0
  61. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/ws-addr.xsd +0 -0
  62. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/ws-authorization.xsd +0 -0
  63. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/ws-federation.xsd +0 -0
  64. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/ws-securitypolicy-1.2.xsd +0 -0
  65. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/xenc-schema.xsd +0 -0
  66. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/xml.xsd +0 -0
  67. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/xmldsig-core-schema.xsd +0 -0
  68. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/schema/xrd-1.0-os.xsd +0 -0
  69. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/bad_metadata/stockholmstad-c1107b3ceb78c5e9.xml +0 -0
  70. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/eidas/eidas.xml +0 -0
  71. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/empty/placeholder +0 -0
  72. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/empty.txt +0 -0
  73. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/images/BFC-Logo-80x60.gif +0 -0
  74. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/images/FHP_logo.svg +0 -0
  75. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/images/New_GEANT_logo.jpg +0 -0
  76. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/images/favicon.ico +0 -0
  77. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/images/sunet256.png +0 -0
  78. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/mdx/mdx.fd +0 -0
  79. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/not-metadata.xml +0 -0
  80. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/sharav.abes.fr.xml +0 -0
  81. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/swamid-2.0-test.xml +0 -0
  82. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test-sp-trustinfo-in-attr-broken-base64.xml +0 -0
  83. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test-sp-trustinfo-in-attr.xml +0 -0
  84. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test-sp.xml +0 -0
  85. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test01.xml +0 -0
  86. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test02-invalid.xml +0 -0
  87. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test02-sp.xml +0 -0
  88. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test03-invalid.xml +0 -0
  89. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test04-trailing-slash-sp.xml +0 -0
  90. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test05-xsd-prefix-idp.xml +0 -0
  91. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/test06-xs-and-xsd-declared.xml +0 -0
  92. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/metadata/wayf-edugain-metadata.xml +0 -0
  93. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/bad.fd +0 -0
  94. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/certreport-swamid.fd +0 -0
  95. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/certreport.fd +0 -0
  96. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/idp.aco.net.xml +0 -0
  97. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/signer.fd +0 -0
  98. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/skriptenforum.net.xml +0 -0
  99. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/data/simple-pipeline/validator.fd +0 -0
  100. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_decorators.py +0 -0
  101. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_log.py +0 -0
  102. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_rwlock.py +0 -0
  103. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_simple_pipeline.py +0 -0
  104. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_store.py +0 -0
  105. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/test/test_time.py +0 -0
  106. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/tools.py +0 -0
  107. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/wsgi.py +0 -0
  108. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/atom.xsl +0 -0
  109. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/atom2html.xsl +0 -0
  110. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/discojson.xsl +0 -0
  111. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/entity2html.xsl +0 -0
  112. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/kalmar2.xsl +0 -0
  113. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/pp.xsl +0 -0
  114. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/pubinfo.xsl +0 -0
  115. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/regauth.xsl +0 -0
  116. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/tidy.xsl +0 -0
  117. {pyff-2.1.7 → pyff-3.0.0}/src/pyff/xslt/unsign.xsl +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyFF
3
- Version: 2.1.7
3
+ Version: 3.0.0
4
4
  Summary: Federation Feeder
5
5
  Author: Leif Johansson, Fredrik Thulin, Enrique Pérez Arnaud, Mikael Frykholm
6
6
  Author-email: Leif Johansson <leifj@sunet.se>, Fredrik Thulin <redrik@thulin.net>, Mikael Frykholm <mifr@sunet.se>
@@ -31,32 +31,31 @@ License: Copyright 2016 SUNET. All rights reserved.
31
31
  authors and should not be interpreted as representing official policies, either expressed
32
32
  or implied, of SUNET.
33
33
  Requires-Dist: accept-types>=0.4.1
34
- Requires-Dist: apscheduler==3.6.3
34
+ Requires-Dist: apscheduler>=3.11.3
35
35
  Requires-Dist: cachetools>=5.5.2
36
- Requires-Dist: eval-type-backport>=0.2.2 ; python_full_version == '3.9.*'
37
- Requires-Dist: gunicorn==25.0.3 ; python_full_version >= '3.10'
38
- Requires-Dist: gunicorn>=23.0.0
39
- Requires-Dist: lxml>=4.1.1
36
+ Requires-Dist: cryptography>=42
37
+ Requires-Dist: gunicorn>=25.2.0
40
38
  Requires-Dist: mako>=1.3.10
41
- Requires-Dist: pyconfig>=3.2.3,<3.3.0
39
+ Requires-Dist: pyconfig>=3.3.0
42
40
  Requires-Dist: pydantic>=2.8
43
- Requires-Dist: pyramid>=2.0.2
41
+ Requires-Dist: pyramid>=2.1
44
42
  Requires-Dist: pytz>=2025.2
45
- Requires-Dist: pyxmlsecurity>=1.0.0
43
+ Requires-Dist: pyuppsala>=0.13.0
44
+ Requires-Dist: pybergshamra>=0.11.0
46
45
  Requires-Dist: pyyaml>=3.10
47
46
  Requires-Dist: redis>=5.3.0
48
47
  Requires-Dist: redis-collections>=0.13.0
49
48
  Requires-Dist: requests>=2.32.3
50
49
  Requires-Dist: requests-cache==1.2.1
51
50
  Requires-Dist: requests-file==2.1.0
52
- Requires-Dist: setuptools>=78.1.1,<81
53
51
  Requires-Dist: str2bool>=1.1
54
52
  Requires-Dist: whoosh>=2.7.4
55
53
  Requires-Dist: wsgi-intercept>=1.13.1
56
54
  Requires-Dist: xmldiff>=2.7.0
55
+ Requires-Dist: sphinx-rtd-theme>=3.1.0
57
56
  Maintainer: Mikael Frykholm
58
57
  Maintainer-email: Mikael Frykholm <mifr@sunet.se>
59
- Requires-Python: >=3.10
58
+ Requires-Python: >=3.11
60
59
  Description-Content-Type: text/x-rst
61
60
 
62
61
  python SAML metadata aggregator
@@ -102,11 +101,13 @@ Features
102
101
  Dependencies
103
102
  ============
104
103
 
105
- * pyXMLSecurity
106
- * PyKCS11 (optional)
104
+ * pybergshamra >= 0.11.0 (XML signatures and PKCS#11 support)
105
+ * pyuppsala >= 0.11.0 (XML processing)
107
106
  * pygments
108
107
  * gunicorn (for the standalone pyffd server)
109
- * ... cf requirements.txt
108
+ * ... cf pyproject.toml
109
+
110
+ ``uv sync`` installs pybergshamra from PyPI; no sibling checkout is required.
110
111
 
111
112
  More information
112
113
  ================
@@ -41,11 +41,13 @@ Features
41
41
  Dependencies
42
42
  ============
43
43
 
44
- * pyXMLSecurity
45
- * PyKCS11 (optional)
44
+ * pybergshamra >= 0.11.0 (XML signatures and PKCS#11 support)
45
+ * pyuppsala >= 0.11.0 (XML processing)
46
46
  * pygments
47
47
  * gunicorn (for the standalone pyffd server)
48
- * ... cf requirements.txt
48
+ * ... cf pyproject.toml
49
+
50
+ ``uv sync`` installs pybergshamra from PyPI; no sibling checkout is required.
49
51
 
50
52
  More information
51
53
  ================
@@ -1,34 +1,33 @@
1
1
  [project]
2
2
  name = "pyFF"
3
- version = "2.1.7"
3
+ version = "3.0.0"
4
4
  readme = "README.rst"
5
5
  description = "Federation Feeder"
6
- requires-python = ">=3.10"
6
+ requires-python = ">=3.11"
7
7
  dependencies = [
8
8
  "accept-types>=0.4.1",
9
- "apscheduler==3.6.3",
9
+ "apscheduler>=3.11.3",
10
10
  "cachetools>=5.5.2",
11
- "eval-type-backport>=0.2.2 ; python_full_version == '3.9.*'",
12
- "gunicorn==25.0.3 ; python_full_version >= '3.10'",
13
- "gunicorn>=23.0.0",
14
- "lxml>=4.1.1",
11
+ "cryptography>=42",
12
+ "gunicorn>=25.2.0",
15
13
  "mako>=1.3.10",
16
- "pyconfig>=3.2.3,<3.3.0",
14
+ "pyconfig>=3.3.0",
17
15
  "pydantic>=2.8",
18
- "pyramid>=2.0.2",
16
+ "pyramid>=2.1",
19
17
  "pytz>=2025.2",
20
- "pyxmlsecurity>=1.0.0",
18
+ "pyuppsala>=0.13.0",
19
+ "pybergshamra>=0.11.0",
21
20
  "pyyaml>=3.10",
22
21
  "redis>=5.3.0",
23
22
  "redis-collections>=0.13.0",
24
23
  "requests>=2.32.3",
25
24
  "requests-cache==1.2.1",
26
25
  "requests-file==2.1.0",
27
- "setuptools>=78.1.1,<81",
28
26
  "str2bool>=1.1",
29
27
  "whoosh>=2.7.4",
30
28
  "wsgi-intercept>=1.13.1",
31
29
  "xmldiff>=2.7.0",
30
+ "sphinx-rtd-theme>=3.1.0",
32
31
  ]
33
32
 
34
33
  [project.license]
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "pyFF"
3
- version = "2.1.7"
3
+ version = "3.0.0"
4
4
  readme = "README.rst"
5
5
  description = "Federation Feeder"
6
- requires-python = ">=3.10"
6
+ requires-python = ">=3.11"
7
7
  license = {file = "LICENSE"}
8
8
 
9
9
  authors = [
@@ -17,29 +17,28 @@ maintainers = [
17
17
  ]
18
18
  dependencies = [
19
19
  "accept-types>=0.4.1",
20
- "apscheduler==3.6.3",
20
+ "apscheduler>=3.11.3",
21
21
  "cachetools>=5.5.2",
22
- "eval-type-backport>=0.2.2 ; python_full_version == '3.9.*'",
23
- "gunicorn==25.0.3 ; python_full_version >= '3.10'",
24
- "gunicorn>=23.0.0",
25
- "lxml>=4.1.1",
22
+ "cryptography>=42",
23
+ "gunicorn>=25.2.0",
26
24
  "mako>=1.3.10",
27
- "pyconfig>=3.2.3,<3.3.0",
25
+ "pyconfig>=3.3.0",
28
26
  "pydantic>=2.8",
29
- "pyramid>=2.0.2",
27
+ "pyramid>=2.1",
30
28
  "pytz>=2025.2",
31
- "pyxmlsecurity>=1.0.0",
29
+ "pyuppsala>=0.13.0",
30
+ "pybergshamra>=0.11.0",
32
31
  "pyyaml>=3.10",
33
32
  "redis>=5.3.0",
34
33
  "redis-collections>=0.13.0",
35
34
  "requests>=2.32.3",
36
35
  "requests-cache==1.2.1",
37
36
  "requests-file==2.1.0",
38
- "setuptools>=78.1.1,<81",
39
37
  "str2bool>=1.1",
40
38
  "whoosh>=2.7.4",
41
39
  "wsgi-intercept>=1.13.1",
42
40
  "xmldiff>=2.7.0",
41
+ "sphinx-rtd-theme>=3.1.0",
43
42
  ]
44
43
 
45
44
  [dependency-groups]
@@ -4,18 +4,18 @@ from collections.abc import Generator, Iterable, Mapping
4
4
  from datetime import datetime, timedelta
5
5
  from json import dumps
6
6
  from typing import Any, Optional
7
- from urllib.parse import quote_plus
7
+ from urllib.parse import quote
8
8
 
9
9
  import pyramid.httpexceptions as exc
10
10
  import pytz
11
11
  import requests
12
12
  from accept_types import AcceptableType
13
13
  from cachetools import TTLCache
14
- from lxml import etree
15
14
  from pyramid.config import Configurator
16
15
  from pyramid.events import NewRequest
17
16
  from pyramid.request import Request
18
17
  from pyramid.response import Response
18
+ from pyuppsala import etree
19
19
 
20
20
  from pyff import __version__
21
21
  from pyff.constants import config
@@ -395,7 +395,7 @@ def webfinger_handler(request: Request) -> Response:
395
395
  aliases = request.registry.aliases
396
396
  for a in aliases.keys():
397
397
  for v in request.registry.md.store.attribute(aliases[a]):
398
- _links(f'{a}/{quote_plus(v)}')
398
+ _links(f"{a}/{quote(v, safe='')}")
399
399
 
400
400
  response = Response(dumps(jrd, default=json_serializer))
401
401
  response.headers['Content-Type'] = 'application/json'
@@ -467,7 +467,7 @@ def search_handler(request: Request) -> Response:
467
467
  for e in entities:
468
468
  if in_loop:
469
469
  yield b','
470
- yield dumps(e)
470
+ yield dumps(e).encode('utf-8')
471
471
  in_loop = True
472
472
  yield b']'
473
473