def init(cls, request, context): time_created = datetime.datetime.now() metadata = None if context is not None: metadata = request.bucket else: metadata = json_format.ParseDict( cls.__preprocess_rest(simdjson.loads(request.data)), resources_pb2.Bucket(), ) cls.__validate_bucket_name(metadata.name, context) default_projection = 1 if len(metadata.acl) != 0 or len(metadata.default_object_acl) != 0: default_projection = 2 is_uniform = metadata.iam_configuration.uniform_bucket_level_access.enabled metadata.iam_configuration.uniform_bucket_level_access.enabled = False if len(metadata.acl) == 0: predefined_acl = utils.acl.extract_predefined_acl( request, False, context) if predefined_acl == 0: predefined_acl = 3 elif predefined_acl == "": predefined_acl = "projectPrivate" elif is_uniform: utils.error.invalid( "Predefined ACL with uniform bucket level access enabled", context) cls.__insert_predefined_acl(metadata, predefined_acl, context) if len(metadata.default_object_acl) == 0: predefined_default_object_acl = utils.acl.extract_predefined_default_object_acl( request, context) if predefined_default_object_acl == 0: predefined_default_object_acl = 5 elif predefined_default_object_acl == "": predefined_default_object_acl = "projectPrivate" elif is_uniform: utils.error.invalid( "Predefined Default Object ACL with uniform bucket level access enabled", context, ) cls.__insert_predefined_default_object_acl( metadata, predefined_default_object_acl, context) metadata.iam_configuration.uniform_bucket_level_access.enabled = is_uniform metadata.id = metadata.name metadata.project_number = int(utils.acl.PROJECT_NUMBER) metadata.metageneration = 0 metadata.etag = hashlib.md5(metadata.name.encode("utf-8")).hexdigest() metadata.time_created.FromDatetime(time_created) metadata.updated.FromDatetime(time_created) metadata.owner.entity = utils.acl.get_project_entity("owners", context) metadata.owner.entity_id = hashlib.md5( metadata.owner.entity.encode("utf-8")).hexdigest() return ( cls(metadata, {}, cls.__init_iam_policy(metadata, context)), utils.common.extract_projection(request, default_projection, context), )
def update(self, request, context): metadata = None if context is not None: metadata = request.metadata else: metadata = json_format.ParseDict( self.__preprocess_rest(simdjson.loads(request.data)), resources_pb2.Bucket(), ) self.__update_metadata(metadata, None) self.__insert_predefined_acl( metadata, self.bucket, utils.acl.extract_predefined_acl(request, False, context), context, )
def init(cls, request, context): time_created = datetime.datetime.now() metadata = None if context is not None: metadata = request.bucket else: metadata = json_format.ParseDict( cls.__preprocess_rest(simdjson.loads(request.data)), resources_pb2.Bucket(), ) cls.__validate_bucket_name(metadata.name, context) default_projection = 1 if len(metadata.acl) != 0 or len(metadata.default_object_acl) != 0: default_projection = 2 if len(metadata.acl) == 0: predefined_acl = utils.acl.extract_predefined_acl(request, False, context) if predefined_acl == 0: predefined_acl = 3 elif predefined_acl == "": predefined_acl = "projectPrivate" cls.__insert_predefined_acl(metadata, predefined_acl, context) if len(metadata.default_object_acl) == 0: predefined_default_object_acl = utils.acl.extract_predefined_default_object_acl( request, context ) if predefined_default_object_acl == 0: predefined_default_object_acl = 5 elif predefined_default_object_acl == "": predefined_default_object_acl = "projectPrivate" cls.__insert_predefined_default_object_acl( metadata, predefined_default_object_acl, context ) metadata.id = metadata.name metadata.project_number = int(utils.acl.PROJECT_NUMBER) metadata.metageneration = 0 metadata.etag = hashlib.md5(metadata.name.encode("utf-8")).hexdigest() metadata.time_created.FromDatetime(time_created) metadata.updated.FromDatetime(time_created) metadata.owner.entity = utils.acl.get_project_entity("owners", context) metadata.owner.entity_id = hashlib.md5( metadata.owner.entity.encode("utf-8") ).hexdigest() return ( cls(metadata, [], None), utils.common.extract_projection(request, default_projection, context), )
def update(self, request, context): metadata = None if context is not None: metadata = request.metadata else: metadata, rest_only = self.__preprocess_rest( json.loads(request.data)) self.rest_only.update(rest_only) metadata = json_format.ParseDict(metadata, resources_pb2.Bucket()) self.__update_metadata(metadata, None) self.__insert_predefined_acl( metadata, utils.acl.extract_predefined_acl(request, False, context), context) self.__insert_predefined_default_object_acl( metadata, utils.acl.extract_predefined_default_object_acl(request, context), context, )
def patch(self, request, context): update_mask = field_mask_pb2.FieldMask() metadata = None if context is not None: metadata = request.metadata update_mask = request.update_mask else: data = json.loads(request.data) if "labels" in data: if data["labels"] is None: self.metadata.labels.clear() else: for key, value in data["labels"].items(): if value is None: self.metadata.labels.pop(key, None) else: self.metadata.labels[key] = value data.pop("labels", None) data, rest_only = self.__preprocess_rest(data) self.rest_only.update(rest_only) metadata = json_format.ParseDict(data, resources_pb2.Bucket()) paths = set() for key in utils.common.nested_key(data): key = utils.common.to_snake_case(key) head = key for i, c in enumerate(key): if c == "." or c == "[": head = key[0:i] break if head in Bucket.modifiable_fields: if "[" in key: paths.add(head) else: paths.add(key) update_mask = field_mask_pb2.FieldMask(paths=list(paths)) self.__update_metadata(metadata, update_mask) self.__insert_predefined_acl( metadata, utils.acl.extract_predefined_acl(request, False, context), context) self.__insert_predefined_default_object_acl( metadata, utils.acl.extract_predefined_default_object_acl(request, context), context, )
def patch(self, request, context): update_mask = field_mask_pb2.FieldMask() metadata = None if context is not None: metadata = request.metadata update_mask = request.update_mask else: data = simdjson.loads(request.data) if "labels" in data: if data["labels"] is None: self.metadata.labels.clear() else: for key, value in data["labels"].items(): if value is None: self.metadata.labels.pop(key, None) else: self.metadata.labels[key] = value data.pop("labels", None) data = Bucket.__preprocess_rest(data) metadata = json_format.ParseDict(data, resources_pb2.Bucket()) paths = set() for key in utils.common.nested_key(data): head = key[0:key.find(".")] if head in Bucket.modifiable_fields: if "[" in key: paths.add(head) else: paths.add(key) update_mask.FromJsonString(",".join(paths)) self.__update_metadata(metadata, update_mask) self.__insert_predefined_acl( metadata, utils.acl.extract_predefined_acl(request, False, context), context) self.__insert_predefined_default_object_acl( metadata, utils.acl.extract_predefined_default_object_acl(request, context), context, )
def init(cls, request, context, rest_only=None): time_created = datetime.datetime.now() metadata = None if context is not None: metadata = request.bucket else: metadata, rest_only = cls.__preprocess_rest( json.loads(request.data)) metadata = json_format.ParseDict(metadata, resources_pb2.Bucket()) cls.__validate_bucket_name(metadata.name, context) default_projection = CommonEnums.Projection.NO_ACL if len(metadata.acl) != 0 or len(metadata.default_object_acl) != 0: default_projection = CommonEnums.Projection.FULL is_uniform = metadata.iam_configuration.uniform_bucket_level_access.enabled metadata.iam_configuration.uniform_bucket_level_access.enabled = False if len(metadata.acl) == 0: predefined_acl = utils.acl.extract_predefined_acl( request, False, context) if (predefined_acl == CommonEnums.PredefinedBucketAcl. PREDEFINED_BUCKET_ACL_UNSPECIFIED): predefined_acl = ( CommonEnums.PredefinedBucketAcl.BUCKET_ACL_PROJECT_PRIVATE) elif predefined_acl == "": predefined_acl = "projectPrivate" elif is_uniform: utils.error.invalid( "Predefined ACL with uniform bucket level access enabled", context) cls.__insert_predefined_acl(metadata, predefined_acl, context) if len(metadata.default_object_acl) == 0: predefined_default_object_acl = utils.acl.extract_predefined_default_object_acl( request, context) if (predefined_default_object_acl == CommonEnums. PredefinedObjectAcl.PREDEFINED_OBJECT_ACL_UNSPECIFIED): predefined_default_object_acl = ( CommonEnums.PredefinedObjectAcl.OBJECT_ACL_PROJECT_PRIVATE) elif predefined_default_object_acl == "": predefined_default_object_acl = "projectPrivate" elif is_uniform: utils.error.invalid( "Predefined Default Object ACL with uniform bucket level access enabled", context, ) cls.__insert_predefined_default_object_acl( metadata, predefined_default_object_acl, context) cls.__enrich_acl(metadata) metadata.iam_configuration.uniform_bucket_level_access.enabled = is_uniform metadata.id = metadata.name metadata.project_number = int(utils.acl.PROJECT_NUMBER) metadata.metageneration = 0 metadata.etag = hashlib.md5(metadata.name.encode("utf-8")).hexdigest() metadata.time_created.FromDatetime(time_created) metadata.updated.FromDatetime(time_created) metadata.owner.entity = utils.acl.get_project_entity("owners", context) metadata.owner.entity_id = hashlib.md5( metadata.owner.entity.encode("utf-8")).hexdigest() if rest_only is None: rest_only = {} return ( cls(metadata, {}, cls.__init_iam_policy(metadata, context), rest_only), utils.common.extract_projection(request, default_projection, context), )