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,
     )
Exemple #3
0
 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),
     )
Exemple #4
0
 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,
     )
Exemple #5
0
 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,
     )
Exemple #6
0
 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,
     )
Exemple #7
0
 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),
     )