from apiserver.apierrors import errors from ..identity import Identity from ..dictable import Dictable class Payload(Dictable): def __init__(self, auth_type, identity=None, entities=None): self._auth_type = auth_type self.identity = identity self.entities = entities or {} @property def auth_type(self): return self._auth_type @property def identity(self): return self._identity @identity.setter def identity(self, value): if isinstance(value, dict): value = Identity(**value) else: assert isinstance(value, Identity) self._identity = value @property def entities(self): return self._entities @entities.setter def entities(self, value): self._entities = value def get_log_entry(self): return { "type": self.auth_type, "identity": self.identity.to_dict(), "entities": self.entities, } def validate_entities(self, **entities): """ Validate entities. key/value represents entity_name/entity_id(s) """ if not self.entities: return for entity_name, entity_id in entities.items(): constraints = self.entities.get(entity_name) ids = set(entity_id if isinstance(entity_id, (tuple, list)) else (entity_id,)) if constraints and not ids.issubset(constraints): raise errors.unauthorized.EntityNotAllowed(entity=entity_name)