AccessToken.from_string() crashes on python3

Bug #1471927 reported by Zygmunt Krynicki
34
This bug affects 7 people
Affects Status Importance Assigned to Milestone
launchpadlib
Fix Released
Undecided
Unassigned
python-launchpadlib (Ubuntu)
Fix Released
Undecided
Unassigned
Xenial
Fix Released
Medium
Dimitri John Ledkov

Bug Description

[Impact]

 * Unable to renew/relogin with a new oauth token, using python3 scripts
 * python2 APIs work (because python2 does not care about str vs bytes)

[Test Case]

 * Attempt login_with() using python3 and an expired/invalid existing token
 * Relogin should be successful, without crashing scripts

[Regression Potential]

 * No change in behaviour on python2 (which is what used by reverse dependencies)
 * this is a backport to fix python3 behaviour, for all the newly ported maintainance scripts in python3 that prefer to run on "stable" systems

[Other Info]

 * Well tested in later releases, and with users running from trunk.
 * I believe this still is not published in the cheeseshop.

[Original bug report]

Trying to use Launchpad.login_with() on python3, after fixing the earlier bug yields this issue:

Traceback (most recent call last):
  File "./foo.py", line 31, in <module>
    lb = launchpad.projects[project]
  File "/usr/lib/python3/dist-packages/lazr/restfulclient/resource.py", line 1001, in __getitem__
    shim_resource._ensure_representation()
  File "/usr/lib/python3/dist-packages/lazr/restfulclient/resource.py", line 382, in _ensure_representation
    representation = self._root._browser.get(self._wadl_resource)
  File "/usr/lib/python3/dist-packages/lazr/restfulclient/_browser.py", line 436, in get
    response, content = self._request(url, extra_headers=headers)
  File "/usr/lib/python3/dist-packages/lazr/restfulclient/_browser.py", line 387, in _request
    str(url), method=method, body=data, headers=headers)
  File "/usr/lib/python3/dist-packages/lazr/restfulclient/_browser.py", line 357, in _request_and_retry
    url, method=method, body=body, headers=headers)
  File "/usr/lib/python3/dist-packages/httplib2/__init__.py", line 1291, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/usr/lib/python3/dist-packages/launchpadlib/launchpad.py", line 132, in _request
    return self.retry_on_bad_token(response, content, *args)
  File "/usr/lib/python3/dist-packages/launchpadlib/launchpad.py", line 144, in retry_on_bad_token
    self.launchpad.credentials, self.launchpad.credential_store)
  File "/usr/lib/python3/dist-packages/launchpadlib/credentials.py", line 545, in __call__
    self.make_end_user_authorize_token(credentials, request_token_string)
  File "/usr/lib/python3/dist-packages/launchpadlib/credentials.py", line 658, in make_end_user_authorize_token
    self.web_root)
  File "/usr/lib/python3/dist-packages/launchpadlib/credentials.py", line 233, in exchange_request_token_for_access_token
    self.access_token = AccessToken.from_string(content)
  File "/usr/lib/python3/dist-packages/launchpadlib/credentials.py", line 251, in from_string
    key = params['oauth_token']
KeyError: 'oauth_token'

The problem is that params has b'oauth_token', not 'oauth_token', which matters on python3

Related branches

Changed in python-launchpadlib (Ubuntu):
status: New → Fix Committed
Changed in launchpadlib:
status: New → Fix Committed
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package python-launchpadlib - 1.10.4-1

---------------
python-launchpadlib (1.10.4-1) unstable; urgency=medium

  [ Ondřej Nový ]
  * Fixed VCS URL (https)

  [ Dimitri John Ledkov ]
  * New upstream release
  * Drop deprecated warnings patch, applied upstream
  * Cherrypick upstream patch to fix LP: #1471927

 -- Dimitri John Ledkov <email address hidden> Sat, 13 Aug 2016 04:18:24 +0100

Changed in python-launchpadlib (Ubuntu):
status: Fix Committed → Fix Released
no longer affects: python-launchpadlib (Ubuntu Yakkety)
Changed in python-launchpadlib (Ubuntu Xenial):
milestone: none → ubuntu-16.04.2
assignee: nobody → Dimitri John Ledkov (xnox)
importance: Undecided → Medium
status: New → Triaged
Changed in python-launchpadlib (Ubuntu Xenial):
status: Triaged → In Progress
Revision history for this message
Brian Murray (brian-murray) wrote : Missing SRU information

Thanks for uploading the fix for this bug report to -proposed. However, when reviewing the package in -proposed and the details of this bug report I noticed that the bug description is missing information required for the SRU process. You can find full details at http://wiki.ubuntu.com/StableReleaseUpdates#Procedure but essentially this bug is missing some of the following: a statement of impact, a test case and details regarding the regression potential. Thanks in advance!

description: updated
Revision history for this message
Brian Murray (brian-murray) wrote : Please test proposed package

Hello Zygmunt, or anyone else affected,

Accepted python-launchpadlib into xenial-proposed. The package will build now and be available at https://launchpad.net/ubuntu/+source/python-launchpadlib/1.10.3-3ubuntu0.1 in a few hours, and then in the -proposed repository.

Please help us by testing this new package. See https://wiki.ubuntu.com/Testing/EnableProposed for documentation on how to enable and use -proposed.Your feedback will aid us getting this update out to other Ubuntu users.

If this package fixes the bug for you, please add a comment to this bug, mentioning the version of the package you tested, and change the tag from verification-needed to verification-done. If it does not fix the bug for you, please add a comment stating that, and change the tag to verification-failed. In either case, details of your testing will help us make a better decision.

Further information regarding the verification process can be found at https://wiki.ubuntu.com/QATeam/PerformingSRUVerification . Thank you in advance!

Changed in python-launchpadlib (Ubuntu Xenial):
status: In Progress → Fix Committed
tags: added: verification-needed
Revision history for this message
Colin Watson (cjwatson) wrote :

Fixed in launchpadlib 1.10.5.

Changed in launchpadlib:
status: Fix Committed → Fix Released
Revision history for this message
Dimitri John Ledkov (xnox) wrote :
Download full text (4.3 KiB)

Attempted to login using python3 on existing client and got the traceback:

/usr/lib/python3/dist-packages/launchpadlib/credentials.py in from_string(cls, query_string)
    249 """Create and return a new `AccessToken` from the given string."""
    250 params = cgi.parse_qs(query_string, keep_blank_values=False)
--> 251 key = params['oauth_token']
    252 assert len(key) == 1, (
    253 "Query string must have exactly one oauth_token.")

KeyError: 'oauth_token'

Upgraded to:
Get:1 http://archive.ubuntu.com/ubuntu xenial-proposed/main amd64 python3-launchpadlib all 1.10.3-3ubuntu0.1 [36.5 kB]

And that traceback is gone.

However, keyring integration is still broken:

In [1]: from launchpadlib.launchpad import Launchpad

In [2]: lp = Launchpad.login_with('just testing', 'production', version='devel')
The authorization page:
 (https://launchpad.net/+authorize-token?oauth_token=G81S4r3H7ppz29Zr4z6r&allow_permission=DESKTOP_INTEGRATION)
should be opening in your browser. Use your browser to authorize
this program to access Launchpad on your behalf.
Waiting to hear from Launchpad about your decision...
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-469be45530f4> in <module>()
----> 1 lp = Launchpad.login_with('just testing', 'production', version='devel')

/usr/lib/python3/dist-packages/launchpadlib/launchpad.py in login_with(cls, application_name, service_root, launchpadlib_dir, timeout, proxy_info, authorization_engine, allow_access_levels, max_failed_attempts, credentials_file, version, consumer_name, credential_save_failed, credential_store)
    542 cache_path, timeout, proxy_info, authorization_engine,
    543 allow_access_levels, credential_store,
--> 544 credential_save_failed, version)
    545
    546 @classmethod

/usr/lib/python3/dist-packages/launchpadlib/launchpad.py in _authorize_token_and_login(cls, consumer_name, service_root, cache, timeout, proxy_info, authorization_engine, allow_access_levels, credential_store, credential_save_failed, version)
    349 # They're not there. Acquire new credentials using the
    350 # authorization engine.
--> 351 credentials = authorization_engine(credentials, credential_store)
    352 else:
    353 # We acquired credentials. But, the application name

/usr/lib/python3/dist-packages/launchpadlib/credentials.py in __call__(self, credentials, credential_store)
    550 return None
    551 # save() invokes the callback on failure.
--> 552 credential_store.save(credentials, self.unique_consumer_id)
    553 return credentials
    554

/usr/lib/python3/dist-packages/launchpadlib/credentials.py in save(self, credentials, unique_consumer_id)
    305 except Exception as e:
    306 if self.credential_save_failed is None:
--> 307 raise e
    308 self.credential_save_failed()
    309 return credentials

/usr/lib/python3/dist-packages/launchpadlib/credentials.py i...

Read more...

tags: added: verification-done
removed: verification-needed
Revision history for this message
Adam Conrad (adconrad) wrote : Update Released

The verification of the Stable Release Update for python-launchpadlib has completed successfully and the package has now been released to -updates. Subsequently, the Ubuntu Stable Release Updates Team is being unsubscribed and will not receive messages about this bug report. In the event that you encounter a regression using the package from -updates please report a new bug using ubuntu-bug and tag the bug report regression-update so we can easily find any regressions.

Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package python-launchpadlib - 1.10.3-3ubuntu0.1

---------------
python-launchpadlib (1.10.3-3ubuntu0.1) xenial; urgency=medium

  * Cherrypick python3 crash fixes:
    - _bad_oauth_token (LP: #1471894)
    - AccessToken.from_string() (LP: #1471927)

 -- Dimitri John Ledkov <email address hidden> Thu, 22 Dec 2016 15:05:54 +0000

Changed in python-launchpadlib (Ubuntu Xenial):
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.