Ejemplo n.º 1
0
 def to_json(self):
     return prune_empty_keys({
         'type': self.type,
         'description': self.description,
         'help_link': self.help_link,
         'handled': self.handled,
         'data': self.data or None,
         'meta': prune_empty_keys(self.meta) or None,
     })
Ejemplo n.º 2
0
 def to_json(self):
     return prune_empty_keys({
         'values': [
             prune_empty_keys({
                 'type': crumb['type'],
                 'level': crumb['level'],
                 'timestamp': crumb['timestamp'],
                 'message': crumb['message'],
                 'category': crumb['category'],
                 'event_id': crumb['event_id'],
                 'data': crumb['data'] or None
             }) for crumb in self.values
         ] or None
     })
Ejemplo n.º 3
0
    def to_python(cls, data):
        data = upgrade_legacy_mechanism(data)
        is_valid, errors = validate_and_default_interface(data, cls.path)
        if not is_valid:
            raise InterfaceValidationError("Invalid mechanism")

        if not data.get('type'):
            raise InterfaceValidationError("No 'type' present")

        mechanism_meta = data.get('meta') or {}
        mach_exception = mechanism_meta.get('mach_exception')
        if mach_exception is not None:
            mach_exception = prune_empty_keys({
                'exception': mach_exception['exception'],
                'code': mach_exception['code'],
                'subcode': mach_exception['subcode'],
                'name': mach_exception.get('name'),
            })

        signal = mechanism_meta.get('signal')
        if signal is not None:
            signal = prune_empty_keys({
                'number': signal['number'],
                'code': signal.get('code'),
                'name': signal.get('name'),
                'code_name': signal.get('code_name'),
            })

        errno = mechanism_meta.get('errno')
        if errno is not None:
            errno = prune_empty_keys({
                'number': errno['number'],
                'name': errno.get('name'),
            })

        kwargs = {
            'type': trim(data['type'], 128),
            'description': trim(data.get('description'), 1024),
            'help_link': trim(data.get('help_link'), 1024),
            'handled': data.get('handled'),
            'data': trim(data.get('data'), 4096),
            'meta': {
                'errno': errno,
                'mach_exception': mach_exception,
                'signal': signal,
            },
        }

        return cls(**kwargs)
Ejemplo n.º 4
0
 def to_json(self):
     return prune_empty_keys({
         'name': self.name,
         'version': self.version,
         'integrations': self.integrations or None,
         'packages': self.packages or None
     })
Ejemplo n.º 5
0
 def to_json(self):
     return prune_empty_keys({
         'id': self.id,
         'email': self.email,
         'username': self.username,
         'ip_address': self.ip_address,
         'name': self.name,
         'geo': self.geo.to_json() if self.geo is not None else None,
         'data': self.data or None
     })
Ejemplo n.º 6
0
 def to_json(self):
     return prune_empty_keys({
         'method': self.method,
         'url': self.url,
         'query_string': self.query_string or None,
         'fragment': self.fragment or None,
         'cookies': self.cookies or None,
         'headers': self.headers or None,
         'data': self.data,
         'env': self.env or None,
         'inferred_content_type': self.inferred_content_type,
     })
Ejemplo n.º 7
0
    def to_json(self):
        def export_thread(data):
            if data is None:
                return None

            rv = {
                "id": data["id"],
                "current": data["current"],
                "crashed": data["crashed"],
                "name": data["name"],
                "stacktrace": None,
            }
            if data["stacktrace"]:
                rv["stacktrace"] = data["stacktrace"].to_json()
            if data["raw_stacktrace"]:
                rv["raw_stacktrace"] = data["raw_stacktrace"].to_json()
            return prune_empty_keys(rv)

        return prune_empty_keys({"values": [export_thread(x) for x in self.values]})
Ejemplo n.º 8
0
    def to_json(self):
        def export_thread(data):
            if data is None:
                return None

            rv = {
                'id': data['id'],
                'current': data['current'],
                'crashed': data['crashed'],
                'name': data['name'],
                'stacktrace': None
            }
            if data['stacktrace']:
                rv['stacktrace'] = data['stacktrace'].to_json()
            if data['raw_stacktrace']:
                rv['raw_stacktrace'] = data['raw_stacktrace'].to_json()
            return prune_empty_keys(rv)

        return prune_empty_keys({
            'values': [export_thread(x) for x in self.values],
        })
Ejemplo n.º 9
0
 def to_json(self):
     return prune_empty_keys({
         'method':
         self.method,
         'url':
         self.url,
         'query_string':
         self.query_string or None,
         'fragment':
         self.fragment or None,
         'cookies':
         self.cookies or None,
         'headers':
         self.headers or None,
         'data':
         self.data,
         'env':
         self.env or None,
         'inferred_content_type':
         self.inferred_content_type,
     })
Ejemplo n.º 10
0
    def to_json(self):
        mechanism = isinstance(self.mechanism, Mechanism) and \
            self.mechanism.to_json() or self.mechanism or None

        if self.stacktrace:
            stacktrace = self.stacktrace.to_json()
        else:
            stacktrace = None

        if self.raw_stacktrace:
            raw_stacktrace = self.raw_stacktrace.to_json()
        else:
            raw_stacktrace = None

        return prune_empty_keys({
            'type': self.type,
            'value': self.value,
            'mechanism': mechanism,
            'module': self.module,
            'stacktrace': stacktrace,
            'thread_id': self.thread_id,
            'raw_stacktrace': raw_stacktrace,
        })
Ejemplo n.º 11
0
 def to_json(self):
     return prune_empty_keys({
         'abs_path': self.abs_path or None,
         'filename': self.filename or None,
         'platform': self.platform or None,
         'module': self.module or None,
         'function': self.function or None,
         'package': self.package or None,
         'image_addr': self.image_addr,
         'symbol': self.symbol,
         'symbol_addr': self.symbol_addr,
         'instruction_addr': self.instruction_addr,
         'trust': self.trust,
         'in_app': self.in_app,
         'context_line': self.context_line,
         'pre_context': self.pre_context or None,
         'post_context': self.post_context or None,
         'vars': self.vars or None,
         'data': self.data or None,
         'errors': self.errors or None,
         'lineno': self.lineno,
         'colno': self.colno
     })
Ejemplo n.º 12
0
    def to_json(self):
        mechanism = (isinstance(self.mechanism, Mechanism)
                     and self.mechanism.to_json() or self.mechanism or None)

        if self.stacktrace:
            stacktrace = self.stacktrace.to_json()
        else:
            stacktrace = None

        if self.raw_stacktrace:
            raw_stacktrace = self.raw_stacktrace.to_json()
        else:
            raw_stacktrace = None

        return prune_empty_keys({
            "type": self.type,
            "value": self.value,
            "mechanism": mechanism,
            "module": self.module,
            "stacktrace": stacktrace,
            "thread_id": self.thread_id,
            "raw_stacktrace": raw_stacktrace,
        })
Ejemplo n.º 13
0
    def to_json(self):
        mechanism = isinstance(self.mechanism, Mechanism) and \
            self.mechanism.to_json() or self.mechanism or None

        if self.stacktrace:
            stacktrace = self.stacktrace.to_json()
        else:
            stacktrace = None

        if self.raw_stacktrace:
            raw_stacktrace = self.raw_stacktrace.to_json()
        else:
            raw_stacktrace = None

        return prune_empty_keys({
            'type': self.type,
            'value': self.value,
            'mechanism': mechanism,
            'module': self.module,
            'stacktrace': stacktrace,
            'thread_id': self.thread_id,
            'raw_stacktrace': raw_stacktrace,
        })
Ejemplo n.º 14
0
 def to_json(self):
     return prune_empty_keys({
         'abs_path': self.abs_path or None,
         'filename': self.filename or None,
         'platform': self.platform or None,
         'module': self.module or None,
         'function': self.function or None,
         'package': self.package or None,
         'image_addr': self.image_addr,
         'symbol': self.symbol,
         'symbol_addr': self.symbol_addr,
         'instruction_addr': self.instruction_addr,
         'trust': self.trust,
         'in_app': self.in_app,
         'context_line': self.context_line or None,
         'pre_context': self.pre_context or None,
         'post_context': self.post_context or None,
         'vars': self.vars or None,
         'data': self.data or None,
         'errors': self.errors or None,
         'lineno': self.lineno,
         'colno': self.colno
     })
Ejemplo n.º 15
0
def upgrade_legacy_mechanism(data):
    """
    Conversion from mechanism objects sent by old sentry-cocoa SDKs. It assumes
    "type": "generic" and moves "posix_signal", "mach_exception" into "meta".
    All other keys are moved into "data".

    Example old payload:
    >>> {
    >>>     "posix_signal": {
    >>>         "name": "SIGSEGV",
    >>>         "code_name": "SEGV_NOOP",
    >>>         "signal": 11,
    >>>         "code": 0
    >>>     },
    >>>     "relevant_address": "0x1",
    >>>     "mach_exception": {
    >>>         "exception": 1,
    >>>         "exception_name": "EXC_BAD_ACCESS",
    >>>         "subcode": 8,
    >>>         "code": 1
    >>>     }
    >>> }

    Example normalization:
    >>> {
    >>>     "type": "generic",
    >>>     "data": {
    >>>         "relevant_address": "0x1"
    >>>     },
    >>>     "meta": {
    >>>         "mach_exception": {
    >>>             "exception": 1,
    >>>             "subcode": 8,
    >>>             "code": 1,
    >>>             "name": "EXC_BAD_ACCESS"
    >>>         },
    >>>         "signal": {
    >>>             "number": 11,
    >>>             "code": 0,
    >>>             "name": "SIGSEGV",
    >>>             "code_name": "SEGV_NOOP"
    >>>         }
    >>>     }
    >>> }
    """

    # Early exit for current protocol. We assume that when someone sends a
    # "type", we do not need to preprocess and can immediately validate
    if data is None or data.get('type') is not None:
        return data

    result = {'type': 'generic'}

    # "posix_signal" and "mach_exception" were optional root-level objects,
    # which have now moved to special keys inside "meta". We only create "meta"
    # if there is actual data to add.

    posix_signal = data.pop('posix_signal', None)
    if posix_signal and posix_signal.get('signal'):
        result.setdefault('meta', {})['signal'] = prune_empty_keys({
            'number':
            posix_signal.get('signal'),
            'code':
            posix_signal.get('code'),
            'name':
            posix_signal.get('name'),
            'code_name':
            posix_signal.get('code_name'),
        })

    mach_exception = data.pop('mach_exception', None)
    if mach_exception:
        result.setdefault('meta', {})['mach_exception'] = prune_empty_keys({
            'exception':
            mach_exception.get('exception'),
            'code':
            mach_exception.get('code'),
            'subcode':
            mach_exception.get('subcode'),
            'name':
            mach_exception.get('exception_name'),
        })

    # All remaining data has to be moved to the "data" key. We assume that even
    # if someone accidentally sent a corret top-level key (such as "handled"),
    # it will not pass our interface validation and should be moved to "data"
    # instead.
    result.setdefault('data', {}).update(data)
    return result
Ejemplo n.º 16
0
 def to_json(self):
     return prune_empty_keys({
         'values': [v and v.to_json() for v in self.values] or None,
         'exc_omitted':
         self.exc_omitted,
     })
Ejemplo n.º 17
0
 def to_json(self):
     return prune_empty_keys({
         'frames': [f and f.to_json() for f in self.frames] or None,
         'frames_omitted': self.frames_omitted,
         'registers': self.registers,
     })
Ejemplo n.º 18
0
 def to_json(self):
     return prune_empty_keys({
         "message": self.message,
         "formatted": self.formatted,
         "params": self.params or None
     })
Ejemplo n.º 19
0
def upgrade_legacy_mechanism(data):
    """
    Conversion from mechanism objects sent by old sentry-cocoa SDKs. It assumes
    "type": "generic" and moves "posix_signal", "mach_exception" into "meta".
    All other keys are moved into "data".

    Example old payload:
    >>> {
    >>>     "posix_signal": {
    >>>         "name": "SIGSEGV",
    >>>         "code_name": "SEGV_NOOP",
    >>>         "signal": 11,
    >>>         "code": 0
    >>>     },
    >>>     "relevant_address": "0x1",
    >>>     "mach_exception": {
    >>>         "exception": 1,
    >>>         "exception_name": "EXC_BAD_ACCESS",
    >>>         "subcode": 8,
    >>>         "code": 1
    >>>     }
    >>> }

    Example normalization:
    >>> {
    >>>     "type": "generic",
    >>>     "data": {
    >>>         "relevant_address": "0x1"
    >>>     },
    >>>     "meta": {
    >>>         "mach_exception": {
    >>>             "exception": 1,
    >>>             "subcode": 8,
    >>>             "code": 1,
    >>>             "name": "EXC_BAD_ACCESS"
    >>>         },
    >>>         "signal": {
    >>>             "number": 11,
    >>>             "code": 0,
    >>>             "name": "SIGSEGV",
    >>>             "code_name": "SEGV_NOOP"
    >>>         }
    >>>     }
    >>> }
    """

    # Early exit for current protocol. We assume that when someone sends a
    # "type", we do not need to preprocess and can immediately validate
    if data is None or data.get('type') is not None:
        return data

    result = {'type': 'generic'}

    # "posix_signal" and "mach_exception" were optional root-level objects,
    # which have now moved to special keys inside "meta". We only create "meta"
    # if there is actual data to add.

    posix_signal = data.pop('posix_signal', None)
    if posix_signal and posix_signal.get('signal'):
        result.setdefault('meta', {})['signal'] = prune_empty_keys({
            'number': posix_signal.get('signal'),
            'code': posix_signal.get('code'),
            'name': posix_signal.get('name'),
            'code_name': posix_signal.get('code_name'),
        })

    mach_exception = data.pop('mach_exception', None)
    if mach_exception:
        result.setdefault('meta', {})['mach_exception'] = prune_empty_keys({
            'exception': mach_exception.get('exception'),
            'code': mach_exception.get('code'),
            'subcode': mach_exception.get('subcode'),
            'name': mach_exception.get('exception_name'),
        })

    # All remaining data has to be moved to the "data" key. We assume that even
    # if someone accidentally sent a corret top-level key (such as "handled"),
    # it will not pass our interface validation and should be moved to "data"
    # instead.
    result.setdefault('data', {}).update(data)
    return result
Ejemplo n.º 20
0
 def to_json(self):
     return prune_empty_keys({
         'frames': [f and f.to_json() for f in self.frames] or None,
         'frames_omitted': self.frames_omitted,
         'registers': self.registers,
     })
Ejemplo n.º 21
0
 def to_json(self):
     return prune_empty_keys({
         'message': self.message,
         'formatted': self.formatted,
         'params': self.params or None
     })
Ejemplo n.º 22
0
 def to_json(self):
     return prune_empty_keys({
         'images': self.images or None,
         'sdk_info': self.sdk_info or None,
         'is_debug_build': self.is_debug_build
     })
Ejemplo n.º 23
0
 def to_json(self):
     return prune_empty_keys({'values': self.values or None})
Ejemplo n.º 24
0
 def to_json(self):
     return prune_empty_keys({
         'values': [v and v.to_json() for v in self.values] or None,
         'exc_omitted': self.exc_omitted,
     })
Ejemplo n.º 25
0
    def to_python(cls, data, rust_renormalized=RUST_RENORMALIZED_DEFAULT):
        if rust_renormalized:
            for key in (
                'type',
                'synthetic',
                'description',
                'help_link',
                'handled',
                'data',
                'meta',
            ):
                data.setdefault(key, None)

            return cls(**data)

        data = upgrade_legacy_mechanism(data)
        is_valid, errors = validate_and_default_interface(data, cls.path)
        if not is_valid:
            raise InterfaceValidationError("Invalid mechanism")

        if not data.get('type'):
            raise InterfaceValidationError("No 'type' present")

        mechanism_meta = data.get('meta') or {}
        mach_exception = mechanism_meta.get('mach_exception')
        if mach_exception is not None:
            mach_exception = prune_empty_keys({
                'exception': mach_exception['exception'],
                'code': mach_exception['code'],
                'subcode': mach_exception['subcode'],
                'name': mach_exception.get('name'),
            })

        signal = mechanism_meta.get('signal')
        if signal is not None:
            signal = prune_empty_keys({
                'number': signal['number'],
                'code': signal.get('code'),
                'name': signal.get('name'),
                'code_name': signal.get('code_name'),
            })

        errno = mechanism_meta.get('errno')
        if errno is not None:
            errno = prune_empty_keys({
                'number': errno['number'],
                'name': errno.get('name'),
            })

        kwargs = {
            'type': trim(data['type'], 128),
            'synthetic': data.get('synthetic'),
            'description': trim(data.get('description'), 1024),
            'help_link': trim(data.get('help_link'), 1024),
            'handled': data.get('handled'),
            'data': trim(data.get('data'), 4096),
            'meta': {
                'errno': errno,
                'mach_exception': mach_exception,
                'signal': signal,
            },
        }

        return cls(**kwargs)
Ejemplo n.º 26
0
 def to_json(self):
     return prune_empty_keys({
         'images': self.images or None,
         'sdk_info': self.sdk_info or None,
         'is_debug_build': self.is_debug_build
     })
Ejemplo n.º 27
0
 def to_json(self):
     return prune_empty_keys({
         "values": [v and v.to_json() for v in self.values] or None,
         "exc_omitted":
         self.exc_omitted,
     })
Ejemplo n.º 28
0
 def to_json(self):
     return prune_empty_keys({
         'message': self.message,
         'formatted': self.formatted,
         'params': self.params or None
     })
Ejemplo n.º 29
0
 def to_json(self):
     rv = dict(self.data)
     rv['type'] = self.type
     return prune_empty_keys(rv)
Ejemplo n.º 30
0
 def to_json(self):
     rv = dict(self.data)
     rv['type'] = self.type
     return prune_empty_keys(rv)