package command import ( "bytes" "context" "io" "strings" "github.com/superseriousbusiness/exifremove/pkg/exifremove" "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/static" ) type AssetUpload struct { ResourceOwner string ObjectName string ContentType string ObjectType static.ObjectType File io.Reader Size int64 } func (c *Commands) uploadAsset(ctx context.Context, upload *AssetUpload) (*static.Asset, error) { //TODO: handle location as soon as possible file, size, err := removeExif(upload.File, upload.Size, upload.ContentType) if err != nil { return nil, err } return c.static.PutObject(ctx, authz.GetInstance(ctx).InstanceID(), "", upload.ResourceOwner, upload.ObjectName, upload.ContentType, upload.ObjectType, file, size, ) } func (c *Commands) removeAsset(ctx context.Context, resourceOwner, storeKey string) error { return c.static.RemoveObject(ctx, authz.GetInstance(ctx).InstanceID(), resourceOwner, storeKey) } func (c *Commands) removeAssetsFolder(ctx context.Context, resourceOwner string, objectType static.ObjectType) error { return c.static.RemoveObjects(ctx, authz.GetInstance(ctx).InstanceID(), resourceOwner, objectType) } func removeExif(file io.Reader, size int64, contentType string) (io.Reader, int64, error) { if !isAllowedContentType(contentType) { return file, size, nil } buf := new(bytes.Buffer) _, err := buf.ReadFrom(file) if err != nil { return file, 0, err } data, err := exifremove.Remove(buf.Bytes()) if err != nil { return nil, 0, err } return bytes.NewReader(data), int64(len(data)), nil } func isAllowedContentType(contentType string) bool { return strings.HasSuffix(contentType, "png") || strings.HasSuffix(contentType, "jpg") || strings.HasSuffix(contentType, "jpeg") }