Detect OpenID discovery errors and return proper error message

Bug #902896 reported by François Marier
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Libravatar (obsolete)
Fix Released
High
François Marier

Bug Description

When OpenID fails to parse the HTML page it was given, we don't get any useful debugging information:

Traceback (most recent call last):

  File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py", line 100, in get_response
    response = callback(request, *callback_args, **callback_kwargs)

  File "/usr/lib/pymodules/python2.6/django/contrib/auth/decorators.py", line 25, in _wrapped_view
    return view_func(request, *args, **kwargs)

  File "/usr/share/libravatar/libravatar/account/views.py", line 276, in redirect_openid
    auth_request = openid_consumer.begin(user_url)

  File "/usr/lib/pymodules/python2.6/openid/consumer/consumer.py", line 345, in begin
    service = disco.getNextService(self._discover)

  File "/usr/lib/pymodules/python2.6/openid/yadis/manager.py", line 105, in getNextService
    yadis_url, services = discover(self.url)

  File "/usr/lib/pymodules/python2.6/openid/consumer/discover.py", line 470, in discover
    return discoverURI(identifier)

  File "/usr/lib/pymodules/python2.6/openid/consumer/discover.py", line 462, in discoverURI
    claimed_id, openid_services = discoverYadis(uri)

  File "/usr/lib/pymodules/python2.6/openid/consumer/discover.py", line 389, in discoverYadis
    response = yadisDiscover(uri)

  File "/usr/lib/pymodules/python2.6/openid/yadis/discover.py", line 83, in discover
    result.xrds_uri = whereIsYadis(resp)

  File "/usr/lib/pymodules/python2.6/openid/yadis/discover.py", line 130, in whereIsYadis
    yadis_loc = findHTMLMeta(StringIO(resp.body))

  File "/usr/lib/pymodules/python2.6/openid/yadis/parsehtml.py", line 182, in findHTMLMeta
    parser.feed(chunk)

  File "/usr/lib/pymodules/python2.6/openid/yadis/parsehtml.py", line 156, in feed
    return HTMLParser.feed(self, chars)

  File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed
    self.goahead(0)

  File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead
    k = self.parse_starttag(i)

  File "/usr/lib/python2.6/HTMLParser.py", line 252, in parse_starttag
    attrvalue = self.unescape(attrvalue)

  File "/usr/lib/python2.6/HTMLParser.py", line 390, in unescape
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)

  File "/usr/lib/python2.6/re.py", line 151, in sub
    return _compile(pattern, 0).sub(repl, string, count)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 15: ordinal not in range(128)

We need to catch that error (UnicodeDecodeError?) so that we can display a better error to the user than a 500.

Also, we need to find a way to add these to the error message:

- user ID
- Open ID URL

Tags: openid
Changed in libravatar:
status: Confirmed → Fix Committed
Changed in libravatar:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

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