Merge lp:~jelmer/brz/unicode-urls into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/unicode-urls
Merge into: lp:brz
Diff against target: 113 lines (+37/-11)
4 files modified
breezy/bzr/remote.py (+3/-0)
breezy/bzr/smart/request.py (+2/-0)
breezy/urlutils.py (+13/-7)
python3.passing (+19/-4)
To merge this branch: bzr merge lp:~jelmer/brz/unicode-urls
Reviewer Review Type Date Requested Status
Martin Packman Approve
Review via email: mp+353372@code.launchpad.net

Commit message

Properly guard against non-ascii bytes in URLs during unescaping on Python 3.

Description of the change

Properly guard against non-ascii bytes in URLs during unescaping on Python 3.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Makes sense to me.

review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Running landing tests failed
https://ci.breezy-vcs.org/job/land-brz/397/

Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Running landing tests failed
https://ci.breezy-vcs.org/job/land-brz/399/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/bzr/remote.py'
--- breezy/bzr/remote.py 2018-08-14 22:16:01 +0000
+++ breezy/bzr/remote.py 2018-08-20 21:35:27 +0000
@@ -4392,6 +4392,9 @@
4392no_context_error_translators.register(b'UnknownFormat',4392no_context_error_translators.register(b'UnknownFormat',
4393 lambda err: errors.UnknownFormatError(4393 lambda err: errors.UnknownFormatError(
4394 err.error_args[0].decode('ascii'), err.error_args[0].decode('ascii')))4394 err.error_args[0].decode('ascii'), err.error_args[0].decode('ascii')))
4395no_context_error_translators.register(b'InvalidURL',
4396 lambda err: urlutils.InvalidURL(
4397 err.error_args[0].decode('utf-8'), err.error_args[1].decode('ascii')))
43954398
4396def _translate_short_readv_error(err):4399def _translate_short_readv_error(err):
4397 args = err.error_args4400 args = err.error_args
43984401
=== modified file 'breezy/bzr/smart/request.py'
--- breezy/bzr/smart/request.py 2018-06-30 23:08:49 +0000
+++ breezy/bzr/smart/request.py 2018-08-20 21:35:27 +0000
@@ -473,6 +473,8 @@
473 return (b'LockContention',)473 return (b'LockContention',)
474 elif isinstance(err, errors.GhostRevisionsHaveNoRevno):474 elif isinstance(err, errors.GhostRevisionsHaveNoRevno):
475 return (b'GhostRevisionsHaveNoRevno', err.revision_id, err.ghost_revision_id)475 return (b'GhostRevisionsHaveNoRevno', err.revision_id, err.ghost_revision_id)
476 elif isinstance(err, urlutils.InvalidURL):
477 return (b'InvalidURL', err.path.encode('utf-8'), err.extra.encode('ascii'))
476 elif isinstance(err, MemoryError):478 elif isinstance(err, MemoryError):
477 # GZ 2011-02-24: Copy breezy.trace -Dmem_dump functionality here?479 # GZ 2011-02-24: Copy breezy.trace -Dmem_dump functionality here?
478 return (b'MemoryError',)480 return (b'MemoryError',)
479481
=== modified file 'breezy/urlutils.py'
--- breezy/urlutils.py 2018-08-02 01:10:26 +0000
+++ breezy/urlutils.py 2018-08-20 21:35:27 +0000
@@ -666,16 +666,22 @@
666666
667 This returns a Unicode path from a URL667 This returns a Unicode path from a URL
668 """668 """
669 # jam 20060427 URLs are supposed to be ASCII only strings
670 # If they are passed in as unicode, unquote
671 # will return a UNICODE string, which actually contains
672 # utf-8 bytes. So we have to ensure that they are
673 # plain ASCII strings, or the final .decode will
674 # try to encode the UNICODE => ASCII, and then decode
675 # it into utf-8.
676
669 if PY3:677 if PY3:
678 if isinstance(url, text_type):
679 try:
680 url.encode("ascii")
681 except UnicodeError as e:
682 raise InvalidURL(url, 'URL was not a plain ASCII url: %s' % (e,))
670 return urlparse.unquote(url)683 return urlparse.unquote(url)
671 else:684 else:
672 # jam 20060427 URLs are supposed to be ASCII only strings
673 # If they are passed in as unicode, unquote
674 # will return a UNICODE string, which actually contains
675 # utf-8 bytes. So we have to ensure that they are
676 # plain ASCII strings, or the final .decode will
677 # try to encode the UNICODE => ASCII, and then decode
678 # it into utf-8.
679 if isinstance(url, text_type):685 if isinstance(url, text_type):
680 try:686 try:
681 url = url.encode("ascii")687 url = url.encode("ascii")
682688
=== modified file 'python3.passing'
--- python3.passing 2018-08-14 22:16:01 +0000
+++ python3.passing 2018-08-20 21:35:27 +0000
@@ -1,5 +1,6 @@
1# This is the list of tests that are known to pass with Python3.1# This is the list of tests that are known to pass with Python3.
2# "make check-nodocs3" verifies that these pass.2# "make check-nodocs3" verifies that these pass.
3breezy.git.tests.test_builder.TestGitBranchBuilder.test_set_file_unicode
3breezy.plugins.bash_completion.tests.test_bashcomp.BlackboxTests.test_bash_completion4breezy.plugins.bash_completion.tests.test_bashcomp.BlackboxTests.test_bash_completion
4breezy.plugins.bash_completion.tests.test_bashcomp.TestBashCodeGen.test_brz_version5breezy.plugins.bash_completion.tests.test_bashcomp.TestBashCodeGen.test_brz_version
5breezy.plugins.bash_completion.tests.test_bashcomp.TestBashCodeGen.test_command_case6breezy.plugins.bash_completion.tests.test_bashcomp.TestBashCodeGen.test_command_case
@@ -9144,16 +9145,16 @@
9144breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RemoteRepositoryFormat-v2)9145breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RemoteRepositoryFormat-v2)
9145breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormat2a)9146breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormat2a)
9146breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormat2aSubtree)9147breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormat2aSubtree)
9147breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RemoteRepositoryFormat-default)
9148breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RemoteRepositoryFormat-v2)
9149breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormat2a)
9150breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormat2aSubtree)
9151breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5)9148breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5)
9152breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5RichRoot)9149breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5RichRoot)
9153breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5RichRootBroken)9150breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack5RichRootBroken)
9154breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack6)9151breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack6)
9155breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack6RichRoot)9152breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatKnitPack6RichRoot)
9156breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatPackDevelopment2Subtree)9153breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_ordered_no_closure(RepositoryFormatPackDevelopment2Subtree)
9154breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RemoteRepositoryFormat-default)
9155breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RemoteRepositoryFormat-v2)
9156breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormat2a)
9157breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormat2aSubtree)
9157breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5)9158breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5)
9158breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5RichRoot)9159breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5RichRoot)
9159breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5RichRootBroken)9160breezy.tests.per_repository_reference.test_get_record_stream.TestGetRecordStream.test_unordered_fetch_complex_split(RepositoryFormatKnitPack5RichRootBroken)
@@ -17048,6 +17049,20 @@
17048breezy.tests.per_transport.TransportTests.test_symlink(TransportLogDecorator,LogDecoratorServer)17049breezy.tests.per_transport.TransportTests.test_symlink(TransportLogDecorator,LogDecoratorServer)
17049breezy.tests.per_transport.TransportTests.test_symlink(TransportTraceDecorator,TraceServer)17050breezy.tests.per_transport.TransportTests.test_symlink(TransportTraceDecorator,TraceServer)
17050breezy.tests.per_transport.TransportTests.test_symlink(UnlistableTransportDecorator,UnlistableServer)17051breezy.tests.per_transport.TransportTests.test_symlink(UnlistableTransportDecorator,UnlistableServer)
17052breezy.tests.per_transport.TransportTests.test_unicode_paths(ChrootTransport,TestingChrootServer)
17053breezy.tests.per_transport.TransportTests.test_unicode_paths(FakeNFSTransportDecorator,FakeNFSServer)
17054breezy.tests.per_transport.TransportTests.test_unicode_paths(FakeVFATTransportDecorator,FakeVFATServer)
17055breezy.tests.per_transport.TransportTests.test_unicode_paths(HTTPS_transport,HTTPSServer)
17056breezy.tests.per_transport.TransportTests.test_unicode_paths(HttpTransport,HttpServer)
17057breezy.tests.per_transport.TransportTests.test_unicode_paths(LocalTransport,LocalURLServer)
17058breezy.tests.per_transport.TransportTests.test_unicode_paths(MemoryTransport,MemoryServer)
17059breezy.tests.per_transport.TransportTests.test_unicode_paths(NoSmartTransportDecorator,NoSmartTransportServer)
17060breezy.tests.per_transport.TransportTests.test_unicode_paths(PathFilteringTransport,TestingPathFilteringServer)
17061breezy.tests.per_transport.TransportTests.test_unicode_paths(ReadonlyTransportDecorator,ReadonlyServer)
17062breezy.tests.per_transport.TransportTests.test_unicode_paths(RemoteTCPTransport,SmartTCPServer_for_testing)
17063breezy.tests.per_transport.TransportTests.test_unicode_paths(TransportLogDecorator,LogDecoratorServer)
17064breezy.tests.per_transport.TransportTests.test_unicode_paths(TransportTraceDecorator,TraceServer)
17065breezy.tests.per_transport.TransportTests.test_unicode_paths(UnlistableTransportDecorator,UnlistableServer)
17051breezy.tests.per_transport.TransportTests.test_win32_abspath(ChrootTransport,TestingChrootServer)17066breezy.tests.per_transport.TransportTests.test_win32_abspath(ChrootTransport,TestingChrootServer)
17052breezy.tests.per_transport.TransportTests.test_win32_abspath(FakeNFSTransportDecorator,FakeNFSServer)17067breezy.tests.per_transport.TransportTests.test_win32_abspath(FakeNFSTransportDecorator,FakeNFSServer)
17053breezy.tests.per_transport.TransportTests.test_win32_abspath(FakeVFATTransportDecorator,FakeVFATServer)17068breezy.tests.per_transport.TransportTests.test_win32_abspath(FakeVFATTransportDecorator,FakeVFATServer)

Subscribers

People subscribed via source and target branches