Your message dated Thu, 27 Nov 2025 01:34:00 +0000
with message-id <[email protected]>
and subject line Bug#1120223: fixed in python-proton-core 0.7.0-1
has caused the Debian Bug report #1120223,
regarding python-proton-core: FTBFS: dh_auto_test: error: pybuild --test 
--test-pytest -i python{version} -p 3.13 returned exit code 13
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1120223: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1120223
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
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
--------------------------------------------------------------------------------

--- End Message ---
--- Begin Message ---
Source: python-proton-core
Source-Version: 0.7.0-1
Done: Josenilson Ferreira da Silva <[email protected]>

We believe that the bug you reported is fixed in the latest version of
python-proton-core, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Josenilson Ferreira da Silva <[email protected]> (supplier of updated 
python-proton-core package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Mon, 24 Nov 2025 22:29:04 -0300
Source: python-proton-core
Architecture: source
Version: 0.7.0-1
Distribution: unstable
Urgency: medium
Maintainer: Debian Python Team <[email protected]>
Changed-By: Josenilson Ferreira da Silva <[email protected]>
Closes: 1120223
Changes:
 python-proton-core (0.7.0-1) unstable; urgency=medium
 .
   * New upstream version 0.7.0
   * debian/control: Remove redundant "Rules-Requires-Root"
   * debian/patches: Truncate password to bcrypt's 72-byte limit
   * debian/rules: Skip D-Bus dependent tests (Closes: #1120223)
Checksums-Sha1:
 73e01c56c9a1ec4f174ddcabb06ed91983df2fd5 2472 python-proton-core_0.7.0-1.dsc
 dd2f382ffae3b6b8f8651ef90efcc8812cb2ba43 78329 
python-proton-core_0.7.0.orig.tar.gz
 d113ad0f46a3e3d15f1304d616ce7a14c1e960bc 4316 
python-proton-core_0.7.0-1.debian.tar.xz
 b0b79e2ff17e544a12caf2f0fc77669b83c3871a 14643 
python-proton-core_0.7.0-1_source.buildinfo
Checksums-Sha256:
 d4128cb2467d091461853faffe1791ac816a304c2855fd73383525bfc4f29948 2472 
python-proton-core_0.7.0-1.dsc
 7b917102785e85ed3960afc1813fb7e87de6742db3eb77153cc6b3dafa68cca7 78329 
python-proton-core_0.7.0.orig.tar.gz
 30892616297a75046263ec0a16ae0cd1f43cfa50ba168d76ed8343be77132638 4316 
python-proton-core_0.7.0-1.debian.tar.xz
 6e82ed1035be30d8535b8a10f3bdc05cd599dd98cedc539cd9834268a2701f3b 14643 
python-proton-core_0.7.0-1_source.buildinfo
Files:
 6daafbcc91f66f3e87d0e0968e43f8dc 2472 python optional 
python-proton-core_0.7.0-1.dsc
 f41a284b9652e3bfcbe82c82698478da 78329 python optional 
python-proton-core_0.7.0.orig.tar.gz
 51d61d3f5ad52a7cce0f7dafbd61e195 4316 python optional 
python-proton-core_0.7.0-1.debian.tar.xz
 238efe8b8f3b3226e4c521f9de00ac27 14643 python optional 
python-proton-core_0.7.0-1_source.buildinfo

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEqBlNXRF+LQLfMNMNB6n1YjE0Rs0FAmknob0ACgkQB6n1YjE0
Rs3Qgw//UuIOosf+3ZBz9JsGCacSJfYzgINhyqrzJm3uCSwF0aU5uBoqkGoLUbHv
B7DjNwPMjnVOg1o2dHcKXYF+efY3Ql1VcwKP9/uiVh71iqTv9z4aNxyfg9hYurAu
n1Xf1ijnuv4pp0Z6P+ttqXWtqwwPVwv/DbibkAzfqTJ2XKrOCekbySSBTwWlIf8u
P60PtU/Cm6oSeeyEH0/hRdXV+slw0fl6bxIKikC3WCW49Di4JINCi/yV1Z7PPvN+
YU6PGkDmt2HpybdzSf55moH4m8R8uS+XMcjvWR5V2JSW/YtHh9jTpuV6Dj8glas4
JmdCS7k9MugBxVHRI5d/qLgs8nJGIgZA4k7aIMyI6QqSXpH2Ln4eNE2PFnhSuG7s
R4yUByJi3JWEE2i8Q+dBEickKm/M1rb6vYrTw0qLzI+2zeEky1727fllNE8Z47Lo
zZZjOpBWe+Y1RSMHea6/gZjG4jwzZxGFmaDbprVrKfvtUk9NMBKZbUTsne3XR/rp
zFiBw+lwZ16gdw/GhXYQpuMW3SbXtzuTh82DQFfw5cux/oKNEUBMrFNj2CtG2Eor
DDBOeTBgE8GlM7xyrYee3kqTBrSQw/U5v2JJTlJtiTgFarB0fFYHtPCwqsrEZJV4
BLCKuYqzDNOTYIEUKaA3/wV876Ly5hDhYjR8IISsv1dXi9c0ZQg=
=u0Nf
-----END PGP SIGNATURE-----

Attachment: pgpA0O3r3ozKH.pgp
Description: PGP signature


--- End Message ---

Reply via email to