Package: src:python-proton-core Version: 0.4.0-3 Severity: serious Tags: ftbfs forky sid
Dear maintainer: During a rebuild of all packages in unstable, this package failed to build. Below you will find the last part of the build log (probably the most relevant part, but not necessarily). If required, the full build log is available here: https://people.debian.org/~sanvila/build-logs/202511/ About the archive rebuild: The build was made on virtual machines from AWS, using sbuild and a reduced chroot with only build-essential packages. If you cannot reproduce the bug please contact me privately, as I am willing to provide ssh access to a virtual machine where the bug is fully reproducible. If this is really a bug in one of the build-depends, please use reassign and add an affects on src:python-proton-core, so that this is still visible in the BTS web page for this package. Thanks. -------------------------------------------------------------------------------- [...] debian/rules clean dh clean --with sphinxdoc --buildsystem=pybuild dh_auto_clean -O--buildsystem=pybuild I: pybuild base:311: python3.13 setup.py clean /usr/lib/python3/dist-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v3 (GPLv3) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running clean removing '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build' (and everything under it) 'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.13' does not exist -- can't clean it dh_autoreconf_clean -O--buildsystem=pybuild dh_clean -O--buildsystem=pybuild debian/rules binary dh binary --with sphinxdoc --buildsystem=pybuild dh_update_autotools_config -O--buildsystem=pybuild dh_autoreconf -O--buildsystem=pybuild dh_auto_configure -O--buildsystem=pybuild I: pybuild base:311: python3.13 setup.py config /usr/lib/python3/dist-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v3 (GPLv3) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running config dh_auto_build -O--buildsystem=pybuild I: pybuild base:311: /usr/bin/python3 setup.py build /usr/lib/python3/dist-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated. !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: GNU General Public License v3 (GPLv3) See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running build running build_py creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/views copying proton/views/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/views copying proton/views/_base.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/views copying proton/views/basiccli.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/views creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/utils copying proton/utils/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/utils copying proton/utils/metaclasses.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/utils copying proton/utils/environment.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/utils creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/sso copying proton/sso/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/sso copying proton/sso/sso.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/sso copying proton/sso/__main__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/sso creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/loader copying proton/loader/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/loader copying proton/loader/__main__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/loader copying proton/loader/loader.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/loader creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session copying proton/session/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session copying proton/session/api.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session copying proton/session/formdata.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session copying proton/session/exceptions.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session copying proton/session/environments.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/keyring copying proton/keyring/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/keyring copying proton/keyring/textfile.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/keyring copying proton/keyring/_base.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/keyring copying proton/keyring/exceptions.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/keyring creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/base.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/auto.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/alternativerouting.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/aiohttp.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports copying proton/session/transports/requests.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp copying proton/session/srp/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp copying proton/session/srp/_ctsrp.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp copying proton/session/srp/util.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp copying proton/session/srp/pmhash.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp copying proton/session/srp/_pysrp.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/srp creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports/utils copying proton/session/transports/utils/dns.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build/proton/session/transports/utils running egg_info creating proton_core.egg-info writing proton_core.egg-info/PKG-INFO writing dependency_links to proton_core.egg-info/dependency_links.txt writing entry points to proton_core.egg-info/entry_points.txt writing requirements to proton_core.egg-info/requires.txt writing top-level names to proton_core.egg-info/top_level.txt writing manifest file 'proton_core.egg-info/SOURCES.txt' reading manifest file 'proton_core.egg-info/SOURCES.txt' adding license file 'LICENSE' writing manifest file 'proton_core.egg-info/SOURCES.txt' dh_auto_test -O--buildsystem=pybuild I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build; python3.13 -m pytest -v -k 'not test_bad_pinning_fingerprint_changed and not test_alternative_routing_works_on_prod and not test_bad_pinning_url_changed and not test_without_pinning and not test_auto_works_on_prod and not test_ping and not test_successful' ============================= test session starts ============================== platform linux -- Python 3.13.9, pytest-8.4.2, pluggy-1.6.0 -- /usr/bin/python3.13 cachedir: .pytest_cache rootdir: /<<PKGBUILDDIR>> configfile: setup.cfg plugins: typeguard-4.4.4, cov-5.0.0 collecting ... collected 125 items / 8 deselected / 117 selected tests/test_aiohttp_transport.py::TestAiohttpTransport::test_async_api_request_posts_form_data_with_data_param PASSED [ 0%] tests/test_aiohttp_transport.py::TestFormDataTransformer::test_to_aiohttp_form_data PASSED [ 1%] tests/test_aiohttp_transport.py::TestAiohttpTransportRawResult::test_async_api_request_get_raw PASSED [ 2%] tests/test_aiohttp_transport.py::TestAiohttpTransportRawResult::test_async_api_request_last_modified PASSED [ 3%] tests/test_api.py::TestCTSRPClass::test_compute_v SKIPPED (Couldn't ...) [ 4%] tests/test_api.py::TestCTSRPClass::test_generate_v SKIPPED (Couldn't...) [ 5%] tests/test_api.py::TestCTSRPClass::test_invalid_version SKIPPED (Cou...) [ 5%] tests/test_api.py::TestCTSRPClass::test_srp SKIPPED (Couldn't load C...) [ 6%] tests/test_api.py::TestPYSRPClass::test_compute_v FAILED [ 7%] tests/test_api.py::TestPYSRPClass::test_generate_v FAILED [ 8%] tests/test_api.py::TestPYSRPClass::test_invalid_version PASSED [ 9%] tests/test_api.py::TestPYSRPClass::test_srp FAILED [ 10%] tests/test_api.py::TestModulus::test_modulus_verification PASSED [ 11%] tests/test_autotransport.py::TestAuto::test_auto_transport_is_not_available_when_all_transport_choices_receive_an_unexpected_ping_response PASSED [ 11%] tests/test_autotransport.py::TestAuto::test_auto_transport_is_not_available_when_all_transports_choices_time_out_pinging_rest_api PASSED [ 12%] tests/test_basekeyring.py::test_get_item_from_keyring PASSED [ 13%] tests/test_basekeyring.py::test_set_item PASSED [ 14%] tests/test_basekeyring.py::test_del_item PASSED [ 15%] tests/test_basekeyring.py::test_raise_exception_not_implemented_methods PASSED [ 16%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_type[1] PASSED [ 17%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_type[key1] PASSED [ 17%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_type[key2] PASSED [ 18%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_type[None] PASSED [ 19%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_type[key4] PASSED [ 20%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[!] PASSED [ 21%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[A] PASSED [ 22%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[\xe7] PASSED [ 23%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[+] PASSED [ 23%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[*] PASSED [ 24%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[\xe3] PASSED [ 25%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[\\] PASSED [ 26%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[?] PASSED [ 27%] tests/test_basekeyring.py::test_get_item_raises_exception_invalid_key_value[=] PASSED [ 28%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_type[1] PASSED [ 29%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_type[key1] PASSED [ 29%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_type[key2] PASSED [ 30%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_type[None] PASSED [ 31%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_type[key4] PASSED [ 32%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[!] PASSED [ 33%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[A] PASSED [ 34%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[\xe7] PASSED [ 35%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[+] PASSED [ 35%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[*] PASSED [ 36%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[\xe3] PASSED [ 37%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[\\] PASSED [ 38%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[?] PASSED [ 39%] tests/test_basekeyring.py::test_del_item_raises_exception_invalid_key_value[=] PASSED [ 40%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_type[1] PASSED [ 41%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_type[key1] PASSED [ 41%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_type[key2] PASSED [ 42%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_type[None] PASSED [ 43%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_type[key4] PASSED [ 44%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[!] PASSED [ 45%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[A] PASSED [ 46%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[\xe7] PASSED [ 47%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[+] PASSED [ 47%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[*] PASSED [ 48%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[\xe3] PASSED [ 49%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[\\] PASSED [ 50%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[?] PASSED [ 51%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_key_value[=] PASSED [ 52%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_value_type[1] PASSED [ 52%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_value_type[test] PASSED [ 53%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_value_type[None] PASSED [ 54%] tests/test_basekeyring.py::test_set_item_raises_exception_invalid_value_type[value3] PASSED [ 55%] tests/test_basekeyring.py::test_get_from_factory_raises_exception_due_to_non_existent_backend PASSED [ 56%] tests/test_dns_requests.py::TestDNSParser::test_ar_legacy_domain PASSED [ 57%] tests/test_dns_requests.py::TestDNSParser::test_ar_current_domain1 PASSED [ 58%] tests/test_dns_requests.py::TestDNSParser::test_ar_current_domain2 PASSED [ 58%] tests/test_dns_requests.py::TestDNSParser::test_normal_query_legacy_domain PASSED [ 59%] tests/test_dns_requests.py::TestDNSParser::test_normal_query_current_domain PASSED [ 60%] tests/test_dns_requests.py::TestDNSParser::test_generic_parsing PASSED [ 61%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Empty reply-] PASSED [ 62%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Super small reply (1)-x] PASSED [ 63%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Super small reply (7)-\xfa\x83\x81\x80\x00\x01\x00] PASSED [ 64%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Unicode Decode error-\xfa\x83\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x1bdMFYGSLTQOJXXI33OOZYG4LTDNA\tprotonpro\x03xyz\x00\x00\x10\x00\x01\xc0\x0c\x00\x10\x00\x01\x00\x00\x00x\x0032ec2\xcc3-127-37-78.eu-central-1.compute.amazonaws.com\xc0\x0c\x00\x10\x00\x01\x00\x00\x00x\x0054ec2-54-93-234-150.eu-central-1.compute.amazonaws.com] PASSED [ 64%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Wrong query reply-\xfa\x83\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x1bdMFYGSLTQOJXXI33OOZYG4LTDNA\nprotonpro\x03xyz] PASSED [ 65%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Truncated query reply-\xfa\x83\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x1bdMFYGSLTQOJXXI33OOZYG4LTDNA\tproto] PASSED [ 66%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Truncated TXT record value-\x00\x00\x81\x80\x00\x01\x00\x03\x00\x00\x00\x00\x1ddOZYG4LLBOBUS44DSN52G63RONVSQ\tprotonpro\x03xyz\x00\x00\x10\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x00x\x00\x06\x03vpn\xc0*\xc0I\x00\x10\x00\x01\x00\x00\x00x\x00\x0e\r35.15] PASSED [ 67%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Truncated A record value-jW\x81\x80\x00\x01\x00\x01\x00\x03\x00\x03\x07vpn-api\x06proton\x02me\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x04\xb0\x00\x04\xb9\x9f\x9f] PASSED [ 68%] tests/test_dns_requests.py::TestDNSParser::test_incorrect_records[Truncated A record headers-jW\x81\x80\x00\x01\x00\x01\x00\x03\x00\x03\x07vpn-api\x06proton\x02me\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00] PASSED [ 69%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[ec2-3-127-37-78.eu-central-1.compute.amazonaws.com-True] PASSED [ 70%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[hostnames.can.end.with.one.period.-True] PASSED [ 70%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-False] PASSED [ 71%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[-hostname-False] PASSED [ 72%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[hostname--False] PASSED [ 73%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.blah.com-False] PASSED [ 74%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[blah..com-False] PASSED [ 75%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[special-chars!.com-False] PASSED [ 76%] tests/test_dns_requests.py::TestDNSParser::test_valid_hostname_in_A_record[vpn-api.proton.me/malicious/-False] PASSED [ 76%] tests/test_environment.py::test_raises_exception_when_creating_new_product_class_and_not_setting_product_class_property PASSED [ 77%] tests/test_loader.py::LoaderTest::test_default PASSED [ 78%] tests/test_loader.py::LoaderTest::test_environments PASSED [ 79%] tests/test_loader.py::LoaderTest::test_environments_explicit PASSED [ 80%] tests/test_protonsso.py::TestProtonSSO::test_additional_data SKIPPED [ 81%] tests/test_protonsso.py::TestProtonSSO::test_broken_data PASSED [ 82%] tests/test_protonsso.py::TestProtonSSO::test_broken_index PASSED [ 82%] tests/test_protonsso.py::TestProtonSSO::test_default_session SKIPPED [ 83%] tests/test_protonsso.py::TestProtonSSO::test_sessions PASSED [ 84%] tests/test_protonsso.py::TestProtonSSO::test_with_real_session SKIPPED [ 85%] tests/test_requests_transport.py::TestRequestsTransport::test_async_api_request_posts_form_data_with_data_param PASSED [ 86%] tests/test_requests_transport.py::TestRequestsTransportRawResult::test_async_api_request_get_raw PASSED [ 87%] tests/test_requests_transport.py::TestRequestsTransportRawResult::test_async_api_request_last_modified PASSED [ 88%] tests/test_session.py::TestSession::test_session_refresh PASSED [ 88%] tests/test_session.py::TestSessionUsingApi::test_session_fork_not_ok SKIPPED [ 89%] tests/test_session.py::TestSessionUsingApi::test_session_fork_ok SKIPPED [ 90%] tests/test_session_pickle.py::TestSessionPickle::test_pickle PASSED [ 91%] tests/test_textfilekeyring.py::test_get_item PASSED [ 92%] tests/test_textfilekeyring.py::test_del_item PASSED [ 93%] tests/test_textfilekeyring.py::test_set_item PASSED [ 94%] tests/test_textfilekeyring.py::test_get_item_raises_exception_filepath_does_not_exist PASSED [ 94%] tests/test_textfilekeyring.py::test_get_item_raises_exception_corrupted_json_data PASSED [ 95%] tests/test_textfilekeyring.py::test_del_item_raises_exception_filepath_does_not_exist PASSED [ 96%] tests/test_textfilekeyring.py::test_set_item_raises_exception_unable_to_write_in_path PASSED [ 97%] tests/test_textfilekeyring.py::test_set_item_serialize_invalid_json_object_raises_exception PASSED [ 98%] tests/test_tlsverification.py::TestTLSValidation::test_bad_ssl PASSED [ 99%] tests/test_tlsverification.py::TestTLSValidation::test_pinning_disabled PASSED [100%] =================================== FAILURES =================================== ________________________ TestPYSRPClass.test_compute_v _________________________ self = <test_api.TestPYSRPClass testMethod=test_compute_v> def test_compute_v(self): for instance in srp_instances: if instance["Exception"] is not None: with self.assertRaises(instance['Exception']): usr = self.user( instance["Password"], bytes.fromhex(instance["Modulus"]) ) usr.compute_v( base64.b64decode(instance["Salt"]), PM_VERSION ) else: usr = self.user( instance["Password"], bytes.fromhex(instance["Modulus"]) ) > salt, v = usr.compute_v( base64.b64decode(instance["Salt"]), PM_VERSION ) tests/test_api.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ proton/session/srp/_pysrp.py:158: in compute_v self.x = calculate_x(self.hash_class, self.bytes_s, self.p, self.N, version) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ proton/session/srp/_pysrp.py:50: in calculate_x exp = hash_password( proton/session/srp/util.py:48: in hash_password return hash_password_3(hash_class, password, salt, modulus) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hash_class = <function pmhash at 0x7fd8f491c360> password = b'PasswordThatIsLongerThan72CharsAndContainsSomeRandomStuffThatNoOneCaresAbout' salt = b'jQGE9ZrERiIQ2V/wZ1PtZe' modulus = b'\xc3v7z\xc6\xc6&\x97\xe2\x11\xc0\xbe\x80\xda<_{s\x81\xab\x92\xd9E6\xb4\x06YJ\xd0\xc1\xbf\xe9\nBN6\x08\\\xd2\xf5S\xf3...xf7!\xeb\xf1\xd9\x10[\xe3<\xdc\x19\xa0\x10\x80\xa9B\x7fOv\xb2}?\xcf\x89&\xa5\xc4\x88LB\xd1\xb6\xd0R\xc2\xf7DE"\x83\xdb' def hash_password_3(hash_class, password, salt, modulus): salt = (salt + b"proton")[:16] salt = bcrypt_b64_encode(salt)[:22] > hashed = bcrypt.hashpw(password, b"$2y$10$" + salt) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ValueError: password cannot be longer than 72 bytes, truncate manually if necessary (e.g. my_password[:72]) proton/session/srp/util.py:42: ValueError ________________________ TestPYSRPClass.test_generate_v ________________________ self = <test_api.TestPYSRPClass testMethod=test_generate_v> def test_generate_v(self): for instance in srp_instances: if instance["Exception"] is not None: continue usr = self.user( instance["Password"], bytes.fromhex(instance["Modulus"]) ) > generated_salt, generated_v = usr.compute_v() ^^^^^^^^^^^^^^^ tests/test_api.py:86: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ proton/session/srp/_pysrp.py:158: in compute_v self.x = calculate_x(self.hash_class, self.bytes_s, self.p, self.N, version) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ proton/session/srp/_pysrp.py:50: in calculate_x exp = hash_password( proton/session/srp/util.py:48: in hash_password return hash_password_3(hash_class, password, salt, modulus) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hash_class = <function pmhash at 0x7fd8f491c360> password = b'PasswordThatIsLongerThan72CharsAndContainsSomeRandomStuffThatNoOneCaresAbout' salt = b'FkiTC7Rj00ma61/wZ1PtZe' modulus = b'\xc3v7z\xc6\xc6&\x97\xe2\x11\xc0\xbe\x80\xda<_{s\x81\xab\x92\xd9E6\xb4\x06YJ\xd0\xc1\xbf\xe9\nBN6\x08\\\xd2\xf5S\xf3...xf7!\xeb\xf1\xd9\x10[\xe3<\xdc\x19\xa0\x10\x80\xa9B\x7fOv\xb2}?\xcf\x89&\xa5\xc4\x88LB\xd1\xb6\xd0R\xc2\xf7DE"\x83\xdb' def hash_password_3(hash_class, password, salt, modulus): salt = (salt + b"proton")[:16] salt = bcrypt_b64_encode(salt)[:22] > hashed = bcrypt.hashpw(password, b"$2y$10$" + salt) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ValueError: password cannot be longer than 72 bytes, truncate manually if necessary (e.g. my_password[:72]) proton/session/srp/util.py:42: ValueError ___________________________ TestPYSRPClass.test_srp ____________________________ self = <test_api.TestPYSRPClass testMethod=test_srp> def test_srp(self): for instance in srp_instances: if instance["Exception"]: continue server = TestServer() server.setup( instance["Username"], bytes.fromhex(instance["Modulus"]), base64.b64decode(instance["Verifier"]) ) server_challenge = server.get_challenge() usr = self.user( instance["Password"], bytes.fromhex(instance["Modulus"]) ) client_challenge = usr.get_challenge() > client_proof = usr.process_challenge( base64.b64decode(instance["Salt"]), server_challenge, PM_VERSION ) tests/test_api.py:123: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ proton/session/srp/_pysrp.py:136: in process_challenge self.x = calculate_x(self.hash_class, self.bytes_s, self.p, self.N, version) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ proton/session/srp/_pysrp.py:50: in calculate_x exp = hash_password( proton/session/srp/util.py:48: in hash_password return hash_password_3(hash_class, password, salt, modulus) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hash_class = <function pmhash at 0x7fd8f491c360> password = b'PasswordThatIsLongerThan72CharsAndContainsSomeRandomStuffThatNoOneCaresAbout' salt = b'jQGE9ZrERiIQ2V/wZ1PtZe' modulus = b'\xc3v7z\xc6\xc6&\x97\xe2\x11\xc0\xbe\x80\xda<_{s\x81\xab\x92\xd9E6\xb4\x06YJ\xd0\xc1\xbf\xe9\nBN6\x08\\\xd2\xf5S\xf3...xf7!\xeb\xf1\xd9\x10[\xe3<\xdc\x19\xa0\x10\x80\xa9B\x7fOv\xb2}?\xcf\x89&\xa5\xc4\x88LB\xd1\xb6\xd0R\xc2\xf7DE"\x83\xdb' def hash_password_3(hash_class, password, salt, modulus): salt = (salt + b"proton")[:16] salt = bcrypt_b64_encode(salt)[:22] > hashed = bcrypt.hashpw(password, b"$2y$10$" + salt) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E ValueError: password cannot be longer than 72 bytes, truncate manually if necessary (e.g. my_password[:72]) proton/session/srp/util.py:42: ValueError ---------- coverage: platform linux, python 3.13.9-final-0 ----------- Name Stmts Miss Cover --------------------------------------------------------------------- proton/keyring/__init__.py 2 0 100% proton/keyring/_base.py 40 2 95% proton/keyring/exceptions.py 6 0 100% proton/keyring/textfile.py 45 2 96% proton/loader/__init__.py 3 0 100% proton/loader/__main__.py 7 7 0% proton/loader/loader.py 92 14 85% proton/session/__init__.py 3 0 100% proton/session/api.py 363 165 55% proton/session/environments.py 40 5 88% proton/session/exceptions.py 46 5 89% proton/session/formdata.py 12 0 100% proton/session/srp/__init__.py 10 1 90% proton/session/srp/_ctsrp.py 206 190 8% proton/session/srp/_pysrp.py 80 6 92% proton/session/srp/pmhash.py 16 2 88% proton/session/srp/util.py 37 0 100% proton/session/transports/__init__.py 4 0 100% proton/session/transports/aiohttp.py 99 31 69% proton/session/transports/alternativerouting.py 108 25 77% proton/session/transports/auto.py 79 19 76% proton/session/transports/base.py 40 6 85% proton/session/transports/requests.py 58 14 76% proton/session/transports/utils/dns.py 110 9 92% proton/sso/__init__.py 2 0 100% proton/sso/__main__.py 137 137 0% proton/sso/sso.py 134 29 78% proton/utils/__init__.py 3 0 100% proton/utils/environment.py 89 29 67% proton/utils/metaclasses.py 6 0 100% proton/views/__init__.py 2 2 0% proton/views/_base.py 18 18 0% proton/views/basiccli.py 66 66 0% --------------------------------------------------------------------- TOTAL 1963 784 60% Coverage HTML written to dir htmlcov =========================== short test summary info ============================ FAILED tests/test_api.py::TestPYSRPClass::test_compute_v - ValueError: passwo... FAILED tests/test_api.py::TestPYSRPClass::test_generate_v - ValueError: passw... FAILED tests/test_api.py::TestPYSRPClass::test_srp - ValueError: password can... =========== 3 failed, 105 passed, 9 skipped, 8 deselected in 14.29s ============ E: pybuild pybuild:389: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_proton-core/build; python3.13 -m pytest -v -k 'not test_bad_pinning_fingerprint_changed and not test_alternative_routing_works_on_prod and not test_bad_pinning_url_changed and not test_without_pinning and not test_auto_works_on_prod and not test_ping and not test_successful' dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.13 returned exit code 13 make: *** [debian/rules:18: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 --------------------------------------------------------------------------------

