openbadgeslib 4.4.0__tar.gz → 4.4.2__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 (167) hide show
  1. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/Changelog.txt +30 -0
  2. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/PKG-INFO +1 -1
  3. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_keygenerator.py +8 -1
  4. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/util.py +1 -1
  5. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/PKG-INFO +1 -1
  6. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_key_operation.py +14 -0
  7. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/CONTRIBUTING.md +0 -0
  8. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/GOVERNANCE.md +0 -0
  9. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/LICENSE.txt +0 -0
  10. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/MANIFEST.in +0 -0
  11. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/README.md +0 -0
  12. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/SECURITY.md +0 -0
  13. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/docs/README.md +0 -0
  14. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/__init__.py +0 -0
  15. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/_jsonmodel.py +0 -0
  16. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/_jws/__init__.py +0 -0
  17. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/_jws/exceptions.py +0 -0
  18. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/_jws/utils.py +0 -0
  19. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/_ob1_api.py +0 -0
  20. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/badge_model.py +0 -0
  21. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/baking.py +0 -0
  22. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/cli_common.py +0 -0
  23. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/config.ini.example +0 -0
  24. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/confparser.py +0 -0
  25. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/errors.py +0 -0
  26. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/issue.py +0 -0
  27. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/keys.py +0 -0
  28. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/logs.py +0 -0
  29. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/mail.py +0 -0
  30. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob1/__init__.py +0 -0
  31. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob1/badge.py +0 -0
  32. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob1/signer.py +0 -0
  33. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob1/verifier.py +0 -0
  34. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob2/__init__.py +0 -0
  35. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob2/models.py +0 -0
  36. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob2/signer.py +0 -0
  37. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob2/verifier.py +0 -0
  38. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/__init__.py +0 -0
  39. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/__init__.py +0 -0
  40. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/credentials-v2.json +0 -0
  41. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/ob-v3p0-context-3.0.1.json +0 -0
  42. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/ob-v3p0-context-3.0.2.json +0 -0
  43. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/ob-v3p0-context-3.0.3.json +0 -0
  44. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/ob-v3p0-extensions.json +0 -0
  45. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/security-data-integrity-v2.json +0 -0
  46. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/contexts/security-multikey-v1.json +0 -0
  47. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/credential.py +0 -0
  48. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/did.py +0 -0
  49. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/eudi.py +0 -0
  50. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/ldp.py +0 -0
  51. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/publish.py +0 -0
  52. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/signer.py +0 -0
  53. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/status.py +0 -0
  54. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/status_list.py +0 -0
  55. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/status_registry.py +0 -0
  56. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/ob3/verifier.py +0 -0
  57. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/__init__.py +0 -0
  58. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/codes.py +0 -0
  59. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/errors.py +0 -0
  60. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/formats.py +0 -0
  61. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/handler.py +0 -0
  62. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/memory_store.py +0 -0
  63. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/metadata.py +0 -0
  64. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/nonce.py +0 -0
  65. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/offer.py +0 -0
  66. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/reconcile.py +0 -0
  67. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/sqlite_store.py +0 -0
  68. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/oid4vci/store.py +0 -0
  69. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_cli.py +0 -0
  70. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_init.py +0 -0
  71. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_publish.py +0 -0
  72. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_signer.py +0 -0
  73. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_status.py +0 -0
  74. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/openbadges_verifier.py +0 -0
  75. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/py.typed +0 -0
  76. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib/verify.py +0 -0
  77. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/SOURCES.txt +0 -0
  78. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/dependency_links.txt +0 -0
  79. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/entry_points.txt +0 -0
  80. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/requires.txt +0 -0
  81. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/openbadgeslib.egg-info/top_level.txt +0 -0
  82. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/pyproject.toml +0 -0
  83. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/setup.cfg +0 -0
  84. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/config1.ini +0 -0
  85. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conformance/Dockerfile.ob3 +0 -0
  86. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conformance/README.md +0 -0
  87. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conformance/conftest.py +0 -0
  88. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conformance/docker-compose.yml +0 -0
  89. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conformance/test_official_validators.py +0 -0
  90. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/conftest.py +0 -0
  91. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/ob_schemas/README.md +0 -0
  92. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/ob_schemas/ob_v3p0_achievementcredential_schema.json +0 -0
  93. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/ob_schemas/ob_v3p0_profile_schema.json +0 -0
  94. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/ob_schemas/refresh.sh +0 -0
  95. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/README.md +0 -0
  96. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/credentials-examples-v2.json +0 -0
  97. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/doc-hash.txt +0 -0
  98. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/key-pair.json +0 -0
  99. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/proof-config-hash.txt +0 -0
  100. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/fixtures/vc_di_eddsa/signed-credential.json +0 -0
  101. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/images/sample1.png +0 -0
  102. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/images/sample1.svg +0 -0
  103. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/images/userimage01.svg +0 -0
  104. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/ldp_helpers.py +0 -0
  105. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/logo Python Espan/314/203a.svg" +0 -0
  106. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/logo Python Espa/303/261a.svg" +0 -0
  107. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_baking.py +0 -0
  108. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_cli_json.py +0 -0
  109. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_cli_smoke.py +0 -0
  110. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_confparser.py +0 -0
  111. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_docs.py +0 -0
  112. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_eddsa.py +0 -0
  113. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_errors.py +0 -0
  114. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_examples.py +0 -0
  115. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_issue.py +0 -0
  116. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_issue_credential.py +0 -0
  117. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_jsonmodel.py +0 -0
  118. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_jws.py +0 -0
  119. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_keys.py +0 -0
  120. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_mail.py +0 -0
  121. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob1_badge_io.py +0 -0
  122. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob1_deprecation.py +0 -0
  123. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob1_signer.py +0 -0
  124. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob1_verifier.py +0 -0
  125. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob2_cli.py +0 -0
  126. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob2_error_branches.py +0 -0
  127. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob2_models.py +0 -0
  128. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob2_signer.py +0 -0
  129. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob2_verifier.py +0 -0
  130. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_conformance_schema.py +0 -0
  131. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_contexts.py +0 -0
  132. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_credential.py +0 -0
  133. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_did.py +0 -0
  134. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_did_doc.py +0 -0
  135. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_endorsement.py +0 -0
  136. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_eudi_oid4vci.py +0 -0
  137. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_eudi_sd_jwt.py +0 -0
  138. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_eudi_type_metadata.py +0 -0
  139. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_eudi_x5c.py +0 -0
  140. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_ldp.py +0 -0
  141. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_ldp_cli.py +0 -0
  142. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_ldp_ecdsa_sd.py +0 -0
  143. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_ldp_errors.py +0 -0
  144. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_ldp_sign.py +0 -0
  145. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_publish_cli.py +0 -0
  146. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_signer.py +0 -0
  147. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_signer_cli_ldp.py +0 -0
  148. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_status.py +0 -0
  149. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_status_list.py +0 -0
  150. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_status_registry.py +0 -0
  151. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_ob3_verifier.py +0 -0
  152. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_oid4vci_config.py +0 -0
  153. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_oid4vci_protocol.py +0 -0
  154. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_oid4vci_reservations.py +0 -0
  155. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_oid4vci_store.py +0 -0
  156. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_openbadges_cli.py +0 -0
  157. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_public_api.py +0 -0
  158. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_sign_ecc.pem +0 -0
  159. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_sign_rsa.pem +0 -0
  160. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_signer_batch.py +0 -0
  161. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_util.py +0 -0
  162. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_verifier_cli_coverage.py +0 -0
  163. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_verify.py +0 -0
  164. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_verify_ecc.pem +0 -0
  165. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/test_verify_rsa.pem +0 -0
  166. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/withoutxmlheader.svg +0 -0
  167. {openbadgeslib-4.4.0 → openbadgeslib-4.4.2}/tests/withxmlheader.svg +0 -0
@@ -4,6 +4,36 @@ OpenBadgesLib - Changelog
4
4
  Newest first. Dates are ISO 8601 (YYYY-MM-DD).
5
5
 
6
6
 
7
+ * v4.4.2 - 2026-08-13
8
+
9
+ - fix(cli): key generation no longer crashes on Windows, where
10
+ `os.fchmod` does not exist. `_write_pem_file` now guards the fchmod
11
+ call with `hasattr` and skips the permission dance on platforms
12
+ without it — there the POSIX mode bits are not the access control
13
+ (NTFS ACLs are), so skipping is the honest behaviour rather than a
14
+ best-effort `os.chmod` that would only toggle the read-only bit.
15
+ Regression introduced in v4.3.1 by #289; caught by the Windows CI leg.
16
+ - fix(tests): the v4.4.1 regression test for the above itself raised on
17
+ Windows (`monkeypatch.delattr` on an attribute the platform does not
18
+ have); it now skips where `os.fchmod` is already absent.
19
+
20
+
21
+ * v4.4.1 - 2026-08-13
22
+
23
+ Superseded the same day: its own regression test failed on Windows
24
+ (`monkeypatch.delattr` on an attribute the platform does not have), so
25
+ the release went out with the Windows CI leg still red. The library fix
26
+ below is correct and is carried forward unchanged; use v4.4.2.
27
+
28
+ - fix(cli): key generation no longer crashes on Windows, where
29
+ `os.fchmod` does not exist. `_write_pem_file` now guards the fchmod
30
+ call with `hasattr` and skips the permission dance on platforms
31
+ without it — there the POSIX mode bits are not the access control
32
+ (NTFS ACLs are), so skipping is the honest behaviour rather than a
33
+ best-effort `os.chmod` that would only toggle the read-only bit.
34
+ Regression introduced in v4.3.1 by #289; caught by the Windows CI leg.
35
+
36
+
7
37
  * v4.4.0 - 2026-08-13
8
38
 
9
39
  Track openvc-core 1.25: the OID4VCI discovery documents this library
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openbadgeslib
3
- Version: 4.4.0
3
+ Version: 4.4.2
4
4
  Summary: Production-ready Python library & CLI for Open Badges 3.0 (W3C Verifiable Credentials): issue, verify, and revoke JWT-VC credentials with Bitstring Status Lists and did:web — plus strict OB 2.0 and legacy OB 1.0.
5
5
  Author-email: Luis González Fernández <luisgf@luisgf.es>, Jesús Cea Avión <jcea@jcea.es>
6
6
  License: LGPLv3
@@ -58,6 +58,12 @@ def _write_pem_file(path: str, data: bytes, mode: int) -> None:
58
58
  with a symlink and redirect the permission change onto another file the
59
59
  invoking user owns (#289). ``O_CREAT|O_EXCL`` already prevents following a
60
60
  pre-planted symlink at create time; ``fchmod`` closes the post-close gap.
61
+
62
+ Windows has no ``os.fchmod`` and its ``os.chmod`` only toggles the
63
+ read-only bit, so there the mode argument is left to the platform and the
64
+ permission dance is skipped outright: NTFS ACLs, not POSIX bits, are the
65
+ access control, and the calling user's own profile directory is the
66
+ boundary that matters there.
61
67
  """
62
68
  flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
63
69
  fd = os.open(path, flags, mode)
@@ -65,7 +71,8 @@ def _write_pem_file(path: str, data: bytes, mode: int) -> None:
65
71
  with os.fdopen(fd, 'wb') as f:
66
72
  fd = -1 # ownership transferred to the file object
67
73
  f.write(data)
68
- os.fchmod(f.fileno(), mode)
74
+ if hasattr(os, 'fchmod'):
75
+ os.fchmod(f.fileno(), mode)
69
76
  except Exception:
70
77
  if fd >= 0:
71
78
  os.close(fd)
@@ -21,7 +21,7 @@
21
21
  License along with this library.
22
22
  """
23
23
 
24
- __version__ = '4.4.0'
24
+ __version__ = '4.4.2'
25
25
 
26
26
  import contextlib
27
27
  import hashlib
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openbadgeslib
3
- Version: 4.4.0
3
+ Version: 4.4.2
4
4
  Summary: Production-ready Python library & CLI for Open Badges 3.0 (W3C Verifiable Credentials): issue, verify, and revoke JWT-VC credentials with Bitstring Status Lists and did:web — plus strict OB 2.0 and legacy OB 1.0.
5
5
  Author-email: Luis González Fernández <luisgf@luisgf.es>, Jesús Cea Avión <jcea@jcea.es>
6
6
  License: LGPLv3
@@ -256,3 +256,17 @@ class TestKeyGeneratorFileWrites:
256
256
  path = tmp_path / 'no' / 'such' / 'dir' / 'key.pem'
257
257
  with pytest.raises(OSError):
258
258
  _write_pem_file(str(path), b'private-key', 0o600)
259
+
260
+ @pytest.mark.skipif(not hasattr(os, 'fchmod'),
261
+ reason='already the platform under simulation')
262
+ def test_write_pem_file_survives_a_platform_without_fchmod(
263
+ self, tmp_path, monkeypatch):
264
+ # Windows has no os.fchmod (its chmod toggles only the read-only bit),
265
+ # so the permission dance is skipped there and the write must still
266
+ # succeed — v4.3.1 crashed key generation on Windows with
267
+ # AttributeError on exactly this path.
268
+ import openbadgeslib.openbadges_keygenerator as module
269
+ monkeypatch.delattr(module.os, 'fchmod')
270
+ path = tmp_path / 'sign.pem'
271
+ _write_pem_file(str(path), b'private-key', 0o600)
272
+ assert path.read_bytes() == b'private-key'
File without changes
File without changes
File without changes
File without changes
File without changes