def test_ua_item(pattern): parsed = ua_parse(pattern[0]) if pattern[1]: eq_(parsed['browser'], pattern[1]) eq_(parsed['version'], pattern[2]) eq_(parsed['platform'], pattern[3]) else: assert parsed is None
def wrapped(request, *args, **kwargs): # Validate User-Agent request header. ua = request.META.get('HTTP_USER_AGENT', None) parsed = ua_parse(ua) if not parsed: # Unknown UA. if request.method == 'GET': return http.HttpResponseRedirect(reverse( 'feedback.download', channel='beta' if beta else 'release')) else: return http.HttpResponseBadRequest( _('User-Agent request header must be set.')) if not settings.ENFORCE_USER_AGENT: return f(request, ua=ua, *args, **kwargs) this_ver = Version(parsed['version']) # Enforce beta releases. if beta: if this_ver.is_release: # Forward release to release feedback. return http.HttpResponseRedirect( reverse('feedback', channel='release')) elif not this_ver.is_beta: # Not a beta? Upgrade to beta. return http.HttpResponseRedirect( reverse('feedback.download', channel='beta')) # Check for outdated beta. ref_ver = Version(input.LATEST_BETAS[parsed['browser']]) if this_ver < ref_ver: return http.HttpResponseRedirect( reverse('feedback.download', channel='beta')) # Enforce release versions. else: if this_ver.is_beta: # Forward betas to beta feedback. return http.HttpResponseRedirect( reverse('feedback', channel='beta')) elif not this_ver.is_release: # Not a release? Upgrade. return http.HttpResponseRedirect( reverse('feedback.download', channel='beta')) ref_ver = Version(input.LATEST_RELEASE[parsed['browser']]) # Bug 634324: Until Firefox 4 is released, show "download beta" # message to 3.6 and lower release users. ver4 = Version('4.0') if (parsed['browser'] == input.FIREFOX and this_ver < ver4): return http.HttpResponseRedirect( reverse('feedback.download', channel='beta')) # Check for outdated release. if this_ver < ref_ver: return http.HttpResponseRedirect( reverse('feedback.download', channel='release')) # If we made it here, it's a valid version. return f(request, ua=ua, *args, **kwargs)
def test_ua_parse(): """Test user agent parser for Firefox.""" patterns = ( # valid Fx ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.3) ' 'Gecko/20100401 Firefox/3.6.3', FIREFOX, '3.6.3', 'mac'), ('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.4) ' 'Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729)', FIREFOX, '3.6.4', 'winxp'), # additional parentheses (bug 578339) ('Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:2.0b1) ' 'Gecko/20100628 Firefox/4.0b1', FIREFOX, '4.0b1', 'linux'), # locale fallback (bug 578339) ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; fr-FR; rv:2.0b1) ' 'Gecko/20100628 Firefox/4.0b1', FIREFOX, '4.0b1', 'mac'), ('Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:2.0b2pre) Gecko/20100630 ' 'Minefield/4.0b2pre', FIREFOX, '4.0b2pre', 'linux'), # valid Fennec ('Mozilla/5.0 (X11; U; Linux armv6l; fr; rv:1.9.1b1pre) Gecko/' '20081005220218 Gecko/2008052201 Fennec/0.9pre', MOBILE, '0.9pre', 'linux'), ('Mozilla/5.0 (X11; U; FreeBSD; en-US; rv:1.9.2a1pre) ' 'Gecko/20090626 Fennec/1.0b2', MOBILE, '1.0b2', 'other'), ('Mozilla/5.0 (Maemo; Linux armv71; rv:2.0b6pre) Gecko/' '20100924 Namoroka/4.0b7pre Fennec/2.0b1pre', MOBILE, '2.0b1pre', 'maemo'), ('Mozilla/5.0 (Android; Linux armv71; rv:2.0b6pre) Gecko/' '20100924 Namoroka/4.0b7pre Fennec/2.0b1pre', MOBILE, '2.0b1pre', 'android'), # invalid ('A completely bogus Firefox user agent string.', None), ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) ' 'AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 ' 'Safari/531.22.7', None), ('Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.6) ' 'Gecko/20100625 Firefox/ Anonymisiert durch AlMiSoft ' 'Browser-Anonymisierer 48771657', None), # bug 629687 ) for pattern in patterns: parsed = ua_parse(pattern[0]) if pattern[1]: eq_(parsed['browser'], pattern[1]) eq_(parsed['version'], pattern[2]) eq_(parsed['platform'], pattern[3]) else: assert parsed is None
def save(self, terms=True, *args, **kwargs): # parse UA and stick it into separate fields parsed = ua_parse(self.user_agent) if parsed: self.product = parsed['browser'].id self.version = parsed['version'] self.platform = parsed['platform'] new = not self.pk super(Opinion, self).save(*args, **kwargs) # Extract terms from description text and save them if this is new. if new and terms: terms = (t for t in extract_terms(self.description) if len(t) >= settings.MIN_TERM_LENGTH) for term in terms: this_term, created = Term.objects.get_or_create(term=term) this_term.save() self.terms.add(this_term)
def wrapped(request, *args, **kwargs): # Validate User-Agent request header. ua = request.META.get("HTTP_USER_AGENT", None) parsed = ua_parse(ua) if not parsed: # Unknown UA. if request.method == "GET": return http.HttpResponseRedirect(reverse("feedback.download")) else: return http.HttpResponseBadRequest(_("User-Agent request header must be set.")) if not settings.ENFORCE_USER_AGENT: return f(request, ua=ua, *args, **kwargs) this_ver = Version(parsed["version"]) ref_ver = Version(input.LATEST_RELEASE[parsed["browser"]]) # Check for outdated release. if this_ver < ref_ver: return http.HttpResponseRedirect(reverse("feedback.download")) # If we made it here, it's a valid version. return f(request, ua=ua, *args, **kwargs)
def wrapped(request, *args, **kwargs): # Validate User-Agent request header. ua = request.META.get('HTTP_USER_AGENT', None) parsed = ua_parse(ua) if not parsed: # Unknown UA. if request.method == 'GET': return http.HttpResponseRedirect(reverse('feedback.download')) else: return http.HttpResponseBadRequest( _('User-Agent request header must be set.')) if not settings.ENFORCE_USER_AGENT: return f(request, ua=ua, *args, **kwargs) this_ver = Version(parsed['version']) ref_ver = Version(input.LATEST_RELEASE[parsed['browser']]) # Check for outdated release. if this_ver < ref_ver: return http.HttpResponseRedirect(reverse('feedback.download')) # If we made it here, it's a valid version. return f(request, ua=ua, *args, **kwargs)
def wrapped(request, *args, **kwargs): # Validate User-Agent request header. ua = request.META.get('HTTP_USER_AGENT', None) parsed = ua_parse(ua) if not parsed: # Unknown UA. if request.method == 'GET': return http.HttpResponseRedirect( reverse('feedback.download')) else: return http.HttpResponseBadRequest( _('User-Agent request header must be set.')) if not settings.ENFORCE_USER_AGENT: return f(request, ua=ua, *args, **kwargs) this_ver = Version(parsed['version']) ref_ver = Version(parsed['browser'].min_version) # Check for outdated release. if this_ver < ref_ver: return http.HttpResponseRedirect(reverse('feedback.download')) # If we made it here, it's a valid version. return f(request, ua=ua, *args, **kwargs)
def wrapped(request, *args, **kwargs): # Validate User-Agent request header. ua = request.META.get('HTTP_USER_AGENT', None) parsed = ua_parse(ua) if not parsed: # Unknown UA. if request.method == 'GET': return http.HttpResponseRedirect( reverse('feedback.download')) else: return http.HttpResponseBadRequest( _('User-Agent request header must be set.')) if not settings.ENFORCE_USER_AGENT: return f(request, ua=ua, *args, **kwargs) this_ver = Version(parsed['version']) ref_ver = Version(input.LATEST_RELEASE[parsed['browser']]) this_date = datetime.now() try: # Try to get the release date ref_date = datetime.strptime(input.RELEASE_DATES[parsed['browser']][input.LATEST_RELEASE[parsed['browser']]], '%Y-%m-%d') except KeyError: # Default to released today if issues are found ref_date = this_date delta = this_date - ref_date # Check for outdated release, allow old versions for 3 days after a release if this_ver < ref_ver and delta.days > 3: return http.HttpResponseRedirect(reverse('feedback.download')) # If we made it here, it's a valid version. return f(request, ua=ua, *args, **kwargs)
def parse_user_agent(sender, instance, **kw): parsed = ua_parse(instance.user_agent) if parsed: instance.product = parsed['browser'].id instance.version = parsed['version'] instance.platform = parsed['platform']
def parse_user_agent(sender, instance, **kw): parsed = ua_parse(instance.user_agent) if parsed: instance.product = parsed["browser"].id instance.version = parsed["version"] instance.platform = parsed["platform"]