示例#1
0
 def test_method_does_not_filter_android_4(self):
     data = self.get_mock_data(USER_AGENTS['android_4'])
     ua_data = self.filter_cls(self.project).get_user_agent(data)
     ua = Parse(ua_data)
     browser = ua['user_agent']
     assert self.filter_cls(
         self.project).filter_android_pre_4(browser) is False
示例#2
0
    def test(self, data):
        if data.get('platform') != 'javascript':
            return False

        value = self.get_user_agent(data)
        if not value:
            return False

        ua = Parse(value)
        if not ua:
            return False

        browser = ua['user_agent']
        if not browser['family']:
            return False

        try:
            minimum_version = MIN_VERSIONS[browser['family']]
        except KeyError:
            return False

        try:
            major_browser_version = int(browser['major'])
        except (TypeError, ValueError):
            return False

        if minimum_version > major_browser_version:
            return True

        return False
示例#3
0
 def test_dont_filter_opera_mini_8(self):
     data = self.get_mock_data(USER_AGENTS['opera_mini_8'])
     ua_data = self.filter_cls(self.project).get_user_agent(data)
     ua = Parse(ua_data)
     browser = ua['user_agent']
     assert self.filter_cls(
         self.project).filter_opera_mini_pre_8(browser) is False
示例#4
0
 def test_filters_safari_method(self):
     data = self.get_mock_data(USER_AGENTS['safari_5'])
     ua_data = self.filter_cls(self.project).get_user_agent(data)
     ua = Parse(ua_data)
     browser = ua['user_agent']
     assert self.filter_cls(
         self.project).filter_safari_pre_6(browser) is True
示例#5
0
 def test_filter_opera_method(self):
     data = self.get_mock_data(USER_AGENTS['opera_12'])
     ua_data = self.filter_cls(self.project).get_user_agent(data)
     ua = Parse(ua_data)
     browser = ua['user_agent']
     assert self.filter_cls(
         self.project).filter_opera_pre_15(browser) is True
示例#6
0
    def get_tag_values(self, event):
        contexts = event.interfaces.get('contexts')
        # disable tagging if contexts are present
        if contexts:
            return []

        http = event.interfaces.get('request')
        if not http:
            return []
        if not http.headers:
            return []

        headers = http.headers
        # XXX: transitional support for workers
        if isinstance(headers, dict):
            headers = headers.items()

        output = []
        for key, value in headers:
            if key != 'User-Agent':
                continue
            ua = Parse(value)
            if not ua:
                continue
            result = self.get_tag_from_ua(ua)
            if result:
                output.append(result)
        return output
示例#7
0
 def test_plugins(self):
     for row in self.data:
         ua = Parse(row["user_agent"])
         assert BrowserPlugin().get_tag_from_ua(
             ua) == row["browser_plugin_output"]
         assert DevicePlugin().get_tag_from_ua(
             ua) == row["device_plugin_output"]
         assert OsPlugin().get_tag_from_ua(ua) == row["os_plugin_output"]
示例#8
0
def _parse_user_agent(data):
    try:
        for key, value in get_path(data, 'request', 'headers', filter=True) or ():
            if key != 'User-Agent':
                continue
            if not value:
                continue
            ua = Parse(value)
            if not ua:
                continue
            return ua
    except ValueError:
        pass
    return None
示例#9
0
 def get_tag_values(self, event):
     http = event.interfaces.get('sentry.interfaces.Http')
     if not http:
         return []
     if not http.headers:
         return []
     if 'User-Agent' not in http.headers:
         return []
     ua = Parse(http.headers['User-Agent'])
     if not ua:
         return []
     result = self.get_tag_from_ua(ua)
     if not result:
         return []
     return [result]
示例#10
0
def parse_user_agent(data):
    http = data.get('sentry.interfaces.Http')
    if not http:
        return None

    headers = http.get('headers')
    if not headers:
        return None

    for key, value in headers:
        if key != 'User-Agent':
            continue
        ua = Parse(value)
        if not ua:
            continue
        return ua
    return None
示例#11
0
def _legacy_browsers_filter(project_config, data):
    def get_user_agent(data):
        try:
            for key, value in get_path(data, "request", "headers",
                                       filter=True) or ():
                if key.lower() == "user-agent":
                    return value
        except LookupError:
            return ""

    if data.get("platform") != "javascript":
        return False

    value = get_user_agent(data)
    if not value:
        return False

    ua = Parse(value)
    if not ua:
        return False

    browser = ua["user_agent"]

    if not browser["family"]:
        return False

    # IE Desktop and IE Mobile use the same engines, therefore we can treat them as one
    if browser["family"] == "IE Mobile":
        browser["family"] = "IE"

    filter_settings = _get_filter_settings(project_config,
                                           _legacy_browsers_filter)

    # handle old style config
    if filter_settings is None:
        return _filter_default(browser)

    enabled_sub_filters = filter_settings.get("options")
    if isinstance(enabled_sub_filters, collections.Sequence):
        for sub_filter_name in enabled_sub_filters:
            sub_filter = _legacy_browsers_sub_filters.get(sub_filter_name)
            if sub_filter is not None and sub_filter(browser):
                return True

    return False
示例#12
0
    def test(self, data):
        if data.get('platform') != 'javascript':
            return False

        opts = ProjectOption.objects.get_value(
            project=self.project,
            key=u'filters:{}'.format(self.id),
        )

        value = self.get_user_agent(data)
        if not value:
            return False

        ua = Parse(value)
        if not ua:
            return False

        browser = ua['user_agent']

        if not browser['family']:
            return False

        # IE Desktop and IE Mobile use the same engines, therefore we can treat them as one
        if browser['family'] == "IE Mobile":
            browser['family'] = "IE"

        # handle old style config
        if opts == '1':
            return self.filter_default(browser)

        # New style is not a simple boolean, but a list of
        # specific filters to apply
        if opts:
            for key in opts:
                try:
                    fn = getattr(self, 'filter_' + key)
                except AttributeError:
                    pass
                else:
                    if fn(browser):
                        return True

        return False
示例#13
0
def _legacy_browsers_filter(relay_config, data):
    def get_user_agent(data):
        try:
            for key, value in get_path(data, 'request', 'headers', filter=True) or ():
                if key.lower() == 'user-agent':
                    return value
        except LookupError:
            return ''

    if data.get('platform') != 'javascript':
        return False

    value = get_user_agent(data)
    if not value:
        return False

    ua = Parse(value)
    if not ua:
        return False

    browser = ua['user_agent']

    if not browser['family']:
        return False

    # IE Desktop and IE Mobile use the same engines, therefore we can treat them as one
    if browser['family'] == "IE Mobile":
        browser['family'] = "IE"

    filter_settings = _get_filter_settings(relay_config, _legacy_browsers_filter)

    # handle old style config
    if filter_settings is None or filter_settings.get('default_filter', False):
        return _filter_default(browser)

    enabled_sub_filters = filter_settings.get('options')
    if isinstance(enabled_sub_filters, collections.Sequence):
        for sub_filter_name in enabled_sub_filters:
            sub_filter = _legacy_browsers_sub_filters.get(sub_filter_name)
            if sub_filter is not None and sub_filter(browser):
                return True

    return False
def _parse_user_agent(data):
    http = data.get('request')
    if not http:
        return None

    headers = http.get('headers')
    if not headers:
        return None

    try:
        for key, value in headers:
            if key != 'User-Agent':
                continue
            ua = Parse(value)
            if not ua:
                continue
            return ua
    except ValueError:
        pass
    return None
示例#15
0
 def test_does_not_filter_ie10(self):
     data = self.get_mock_data(USER_AGENTS['ie_10'])
     ua_data = self.filter_cls(self.project).get_user_agent(data)
     ua = Parse(ua_data)
     browser = ua['user_agent']
     assert self.filter_cls(self.project).filter_ie_pre_9(browser) is False