bool Zone::CanAccessObject(const ConfigObject::Ptr& object) { Zone::Ptr object_zone; if (object->GetReflectionType() == Zone::TypeInstance) object_zone = static_pointer_cast<Zone>(object); else object_zone = static_pointer_cast<Zone>(object->GetZone()); if (!object_zone) object_zone = Zone::GetLocalZone(); return object_zone->IsChildOf(this); }
void ApiListener::SyncRelayMessage(const MessageOrigin::Ptr& origin, const ConfigObject::Ptr& secobj, const Dictionary::Ptr& message, bool log) { double ts = Utility::GetTime(); message->Set("ts", ts); Log(LogNotice, "ApiListener") << "Relaying '" << message->Get("method") << "' message"; if (origin && origin->FromZone) message->Set("originZone", origin->FromZone->GetName()); Zone::Ptr target_zone; if (secobj) { if (secobj->GetReflectionType() == Zone::TypeInstance) target_zone = static_pointer_cast<Zone>(secobj); else target_zone = static_pointer_cast<Zone>(secobj->GetZone()); } if (!target_zone) target_zone = Zone::GetLocalZone(); Endpoint::Ptr master = GetMaster(); bool need_log = !RelayMessageOne(target_zone, origin, message, master); for (const Zone::Ptr& zone : target_zone->GetAllParents()) { if (!RelayMessageOne(zone, origin, message, master)) need_log = true; } if (log && need_log) PersistMessage(message, secobj); }