mirror of https://github.com/Icinga/icinga2.git
Fix problems with the serializer when using 'type' as an attribute
fixes #7372
This commit is contained in:
parent
4dc13d965e
commit
315c84eb4a
|
@ -131,7 +131,7 @@ DynamicObject::Ptr DynamicType::CreateObject(const Dictionary::Ptr& serializedUp
|
|||
|
||||
Object::Ptr object = type->Instantiate();
|
||||
|
||||
Deserialize(object, serializedUpdate, false, FAConfig);
|
||||
Deserialize(object, serializedUpdate, true, FAConfig);
|
||||
|
||||
return static_pointer_cast<DynamicObject>(object);
|
||||
}
|
||||
|
|
|
@ -149,6 +149,9 @@ static Object::Ptr DeserializeObject(const Object::Ptr& object, const Dictionary
|
|||
{
|
||||
const Type *type;
|
||||
|
||||
if (!object && safe_mode)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Tried to instantiate object while safe mode is enabled."));
|
||||
|
||||
if (object)
|
||||
type = object->GetReflectionType();
|
||||
else
|
||||
|
@ -157,14 +160,12 @@ static Object::Ptr DeserializeObject(const Object::Ptr& object, const Dictionary
|
|||
if (!type)
|
||||
return object;
|
||||
|
||||
Object::Ptr instance = object;
|
||||
|
||||
if (!instance) {
|
||||
if (safe_mode && !type->IsSafe())
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Tried to instantiate type '" + type->GetName() + "' which is not marked as safe."));
|
||||
|
||||
Object::Ptr instance;
|
||||
|
||||
if (object)
|
||||
instance = object;
|
||||
else
|
||||
instance = type->Instantiate();
|
||||
}
|
||||
|
||||
ObjectLock olock(input);
|
||||
BOOST_FOREACH(const Dictionary::Pair& kv, input) {
|
||||
|
@ -232,8 +233,8 @@ Value icinga::Deserialize(const Object::Ptr& object, const Value& value, bool sa
|
|||
|
||||
ASSERT(dict != NULL);
|
||||
|
||||
if (!dict->Contains("type"))
|
||||
if ((safe_mode && !object) || !dict->Contains("type"))
|
||||
return DeserializeDictionary(dict, safe_mode, attributeTypes);
|
||||
|
||||
return DeserializeObject(object, dict, safe_mode, attributeTypes);
|
||||
else
|
||||
return DeserializeObject(object, dict, safe_mode, attributeTypes);
|
||||
}
|
||||
|
|
|
@ -57,11 +57,6 @@ bool Type::IsAbstract(void) const
|
|||
return ((GetAttributes() & TAAbstract) != 0);
|
||||
}
|
||||
|
||||
bool Type::IsSafe(void) const
|
||||
{
|
||||
return ((GetAttributes() & TASafe) != 0);
|
||||
}
|
||||
|
||||
bool Type::IsAssignableFrom(const Type *other) const
|
||||
{
|
||||
for (const Type *t = other; t; t = t->GetBaseType()) {
|
||||
|
|
|
@ -43,8 +43,7 @@ struct Field
|
|||
|
||||
enum TypeAttribute
|
||||
{
|
||||
TAAbstract = 1,
|
||||
TASafe = 2
|
||||
TAAbstract = 1
|
||||
};
|
||||
|
||||
class I2_BASE_API Type
|
||||
|
@ -64,7 +63,6 @@ public:
|
|||
bool IsAssignableFrom(const Type *other) const;
|
||||
|
||||
bool IsAbstract(void) const;
|
||||
bool IsSafe(void) const;
|
||||
|
||||
static void Register(const Type *type);
|
||||
static const Type *GetByName(const String& name);
|
||||
|
|
|
@ -131,9 +131,8 @@ Value ApiEvents::CheckResultAPIHandler(const MessageOrigin& origin, const Dictio
|
|||
if (!params)
|
||||
return Empty;
|
||||
|
||||
Value crv = params->Get("cr");
|
||||
|
||||
CheckResult::Ptr cr = Deserialize(crv, true);
|
||||
CheckResult::Ptr cr = make_shared<CheckResult>();
|
||||
Deserialize(cr, params->Get("cr"), true);
|
||||
|
||||
Host::Ptr host = FindHostByVirtualName(params->Get("host"), origin);
|
||||
|
||||
|
@ -1105,7 +1104,7 @@ Value ApiEvents::VarsChangedAPIHandler(const MessageOrigin& origin, const Dictio
|
|||
if (origin.FromZone && !origin.FromZone->CanAccessObject(object))
|
||||
return Empty;
|
||||
|
||||
Dictionary::Ptr vars = Deserialize(params->Get("vars"), true);
|
||||
Dictionary::Ptr vars = params->Get("vars");
|
||||
|
||||
if (!vars)
|
||||
return Empty;
|
||||
|
@ -1166,7 +1165,8 @@ Value ApiEvents::CommentAddedAPIHandler(const MessageOrigin& origin, const Dicti
|
|||
if (origin.FromZone && !origin.FromZone->CanAccessObject(checkable))
|
||||
return Empty;
|
||||
|
||||
Comment::Ptr comment = Deserialize(params->Get("comment"), true);
|
||||
Comment::Ptr comment = make_shared<Comment>();
|
||||
Deserialize(comment, params->Get("comment"), true);
|
||||
|
||||
checkable->AddComment(comment->GetEntryType(), comment->GetAuthor(),
|
||||
comment->GetText(), comment->GetExpireTime(), comment->GetId(), origin);
|
||||
|
@ -1281,7 +1281,8 @@ Value ApiEvents::DowntimeAddedAPIHandler(const MessageOrigin& origin, const Dict
|
|||
if (origin.FromZone && !origin.FromZone->CanAccessObject(checkable))
|
||||
return Empty;
|
||||
|
||||
Downtime::Ptr downtime = Deserialize(params->Get("downtime"), true);
|
||||
Downtime::Ptr downtime = make_shared<Downtime>();
|
||||
Deserialize(downtime, params->Get("downtime"), true);
|
||||
|
||||
checkable->AddDowntime(downtime->GetAuthor(), downtime->GetComment(),
|
||||
downtime->GetStartTime(), downtime->GetEndTime(),
|
||||
|
|
|
@ -57,7 +57,7 @@ enum StateType
|
|||
};
|
||||
}}}
|
||||
|
||||
safe class CheckResult
|
||||
class CheckResult
|
||||
{
|
||||
[state] double schedule_start;
|
||||
[state] double schedule_end;
|
||||
|
|
|
@ -35,7 +35,7 @@ enum CommentType
|
|||
};
|
||||
}}}
|
||||
|
||||
safe class Comment
|
||||
class Comment
|
||||
{
|
||||
[state] String id;
|
||||
[state] double entry_time;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
namespace icinga
|
||||
{
|
||||
|
||||
safe class Downtime
|
||||
class Downtime
|
||||
{
|
||||
[state] String id;
|
||||
[state] double entry_time;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
namespace icinga
|
||||
{
|
||||
|
||||
safe class PerfdataValue
|
||||
class PerfdataValue
|
||||
{
|
||||
[state] String label;
|
||||
[state] double value;
|
||||
|
|
|
@ -133,7 +133,6 @@ class { return T_CLASS; }
|
|||
namespace { return T_NAMESPACE; }
|
||||
code { return T_CODE; }
|
||||
abstract { yylval->num = TAAbstract; return T_CLASS_ATTRIBUTE; }
|
||||
safe { yylval->num = TASafe; return T_CLASS_ATTRIBUTE; }
|
||||
config { yylval->num = FAConfig; return T_FIELD_ATTRIBUTE; }
|
||||
state { yylval->num = FAState; return T_FIELD_ATTRIBUTE; }
|
||||
enum { yylval->num = FAEnum; return T_FIELD_ATTRIBUTE; }
|
||||
|
|
|
@ -105,8 +105,7 @@ struct Field
|
|||
|
||||
enum TypeAttribute
|
||||
{
|
||||
TAAbstract = 1,
|
||||
TASafe = 2
|
||||
TAAbstract = 1
|
||||
};
|
||||
|
||||
struct Klass
|
||||
|
|
Loading…
Reference in New Issue