Example #1
0
def deserialize_remote_exception(conf, data):
    failure = jsonutils.loads(str(data))

    trace = failure.get('tb', [])
    message = failure.get('message', "") + "\n" + "\n".join(trace)
    name = failure.get('class')
    module = failure.get('module')

    # NOTE(ameade): We DO NOT want to allow just any module to be imported, in
    # order to prevent arbitrary code execution.
    if not module in conf.allowed_rpc_exception_modules:
        return RemoteError(name, failure.get('message'), trace)

    try:
        mod = importutils.import_module(module)
        klass = getattr(mod, name)
        if not issubclass(klass, Exception):
            raise TypeError("Can only deserialize Exceptions")

        failure = klass(**failure.get('kwargs', {}))
    except (AttributeError, TypeError, ImportError):
        return RemoteError(name, failure.get('message'), trace)

    ex_type = type(failure)
    str_override = lambda self: message
    new_ex_type = type(ex_type.__name__ + "_Remote", (ex_type,),
                       {'__str__': str_override, '__unicode__': str_override})
    try:
        # NOTE(ameade): Dynamically create a new exception type and swap it in
        # as the new type for the exception. This only works on user defined
        # Exceptions and not core python exceptions. This is important because
        # we cannot necessarily change an exception message so we must override
        # the __str__ method.
        failure.__class__ = new_ex_type
    except TypeError as e:
        # NOTE(ameade): If a core exception then just add the traceback to the
        # first exception argument.
        failure.args = (message,) + failure.args[1:]
    return failure
Example #2
0
def _deserialize(data):
    """
    Deserialization wrapper
    """
    LOG.debug(_("Deserializing: %s"), data)
    return jsonutils.loads(data)
Example #3
0
def _load_setting_list(data):
    global _SETTING_LIST_DICT
    try:
        _SETTING_LIST_DICT = jsonutils.loads(data)
    except ValueError:
        raise exception.Invalid()
Example #4
0
 def load_json(cls, data, default_rule=None):
     """Init a brain using json instead of a rules dictionary."""
     rules_dict = jsonutils.loads(data)
     return cls(rules=rules_dict, default_rule=default_rule)
Example #5
0
 def load_json(cls, data, default_rule=None):
     """Init a brain using json instead of a rules dictionary."""
     rules_dict = jsonutils.loads(data)
     return cls(rules=rules_dict, default_rule=default_rule)
Example #6
0
def _load_alarm_content(data):
    global _ALARM_CONTENT_DICT
    try:
        _ALARM_CONTENT_DICT = jsonutils.loads(data)
    except ValueError:
        raise exception.Invalid()
Example #7
0
def _load_setting_list(data):
    global _SETTING_LIST_DICT
    try:
        _SETTING_LIST_DICT = jsonutils.loads(data)
    except ValueError:
        raise exception.Invalid()
Example #8
0
def _deserialize(data):
    """
    Deserialization wrapper
    """
    LOG.debug(_("Deserializing: %s"), data)
    return jsonutils.loads(data)