diff options
author | John Dennis <jdennis@redhat.com> | 2012-12-19 12:47:46 -0500 |
---|---|---|
committer | Martin Kosek <mkosek@redhat.com> | 2012-12-20 16:39:25 +0100 |
commit | 159b681c16366261edd1597524d4697ef507dc4e (patch) | |
tree | 0f9d0e6a8de2b6e91b8456c01aada73929d7d161 /ipapython | |
parent | 86e56b91257efa8d7c8a388f2a8a14d0adf367e5 (diff) | |
download | freeipa-159b681c16366261edd1597524d4697ef507dc4e.tar.gz freeipa-159b681c16366261edd1597524d4697ef507dc4e.tar.xz freeipa-159b681c16366261edd1597524d4697ef507dc4e.zip |
Cookie Expires date should be locale insensitive
The Expires attribute in a cookie is supposed to follow the RFC 822
(superseded by RFC 1123) date format. That format includes a weekday
abbreviation (e.g. Tue) which must be in English according to the
RFC's.
ipapython/cookie.py has methods to parse and format the Expires
attribute but they were based on strptime() and strftime() which
respects the locale. If a non-English locale is in effect the wrong
date string will be produced and/or it won't be able to parse the date
string.
The fix is to use the date parsing and formatting functions from
email.utils which specifically follow the RFC's and are not locale
sensitive.
This patch also updates the unit test to use email.utils as well.
The patch should be applied to the following branches:
Ticket: https://fedorahosted.org/freeipa/ticket/3313
Diffstat (limited to 'ipapython')
-rw-r--r-- | ipapython/cookie.py | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/ipapython/cookie.py b/ipapython/cookie.py index b45cb2b1..bf551b51 100644 --- a/ipapython/cookie.py +++ b/ipapython/cookie.py @@ -20,6 +20,7 @@ import re import time import datetime +import email.utils from urllib2 import urlparse from calendar import timegm from ipapython.ipa_log_manager import log_mgr @@ -172,47 +173,26 @@ class Cookie(object): if utcoffset is not None and utcoffset.total_seconds() != 0.0: raise ValueError("timezone is not UTC") - # At this point we've validated as much as possible the - # timezone is UTC or GMT but we can't use the %Z timezone - # format specifier because the timezone in the string must be - # 'GMT', not something equivalent to GMT, so hardcode the GMT - # timezone string into the format. + # Do not use strftime because it respects the locale, instead + # use the RFC 1123 formatting function which uses only English - return datetime.datetime.strftime(dt, '%a, %d %b %Y %H:%M:%S GMT') + return email.utils.formatdate(cls.datetime_to_time(dt), usegmt=True) @classmethod def parse_datetime(cls, s): ''' - Parse a RFC 822, RFC 1123 date string, return a datetime aware object in UTC. - Accommodates some non-standard formats found in the wild. + Parse a RFC 822, RFC 1123 date string, return a datetime naive object in UTC. ''' - formats = ['%a, %d %b %Y %H:%M:%S', - '%a, %d-%b-%Y %H:%M:%S', - '%a, %d-%b-%y %H:%M:%S', - '%a, %d %b %y %H:%M:%S', - ] s = s.strip() - # strptime does not read the time zone and generate a tzinfo - # object to insert in the datetime object so there is little point - # in specifying a %Z format, instead verify GMT is specified and - # generate the datetime object as if it were UTC. + # Do not use strptime because it respects the locale, instead + # use the RFC 1123 parsing function which uses only English - if not s.endswith(' GMT'): - raise ValueError("http date string '%s' does not end with GMT time zone" % s) - s = s[:-4] - - dt = None - for format in formats: - try: - dt = datetime.datetime(*(time.strptime(s, format)[0:6])) - break - except Exception: - continue - - if dt is None: - raise ValueError("unable to parse expires datetime '%s'" % s) + try: + dt = datetime.datetime(*email.utils.parsedate(s)[0:6]) + except Exception, e: + raise ValueError("unable to parse expires datetime '%s': %s" % (s, e)) return dt |