summaryrefslogtreecommitdiff
path: root/internal/media/processingemoji.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-09-24 11:11:47 +0200
committerLibravatar GitHub <noreply@github.com>2022-09-24 11:11:47 +0200
commit78409f198566e2102c2aa97c022a5068a96f329b (patch)
tree3b0b38c5919cfbd3b7458af37acb5a9fd922f8ed /internal/media/processingemoji.go
parent[feature] Allow delivery to sharedInboxes where possible (#847) (diff)
downloadgotosocial-78409f198566e2102c2aa97c022a5068a96f329b.tar.xz
[bugfix] Wrap media reader in length reader to determine length if no `content-length` given (#848)
* use lengthReader 2 determine fileSize if not given * update tests * small fixes * go fmt
Diffstat (limited to 'internal/media/processingemoji.go')
-rw-r--r--internal/media/processingemoji.go37
1 files changed, 29 insertions, 8 deletions
diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go
index 7ffb6d7fa..7dfe51cb3 100644
--- a/internal/media/processingemoji.go
+++ b/internal/media/processingemoji.go
@@ -171,11 +171,6 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
return fmt.Errorf("store: error executing data function: %s", err)
}
- maxSize := config.GetMediaEmojiRemoteMaxSize()
- if fileSize > maxSize {
- return fmt.Errorf("store: emoji size (%db) is larger than allowed emojiRemoteMaxSize (%db)", fileSize, maxSize)
- }
-
// defer closing the reader when we're done with it
defer func() {
if rc, ok := reader.(io.ReadCloser); ok {
@@ -211,16 +206,42 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
p.emoji.ImageURL = uris.GenerateURIForAttachment(p.instanceAccountID, string(TypeEmoji), string(SizeOriginal), p.emoji.ID, extension)
p.emoji.ImagePath = fmt.Sprintf("%s/%s/%s/%s.%s", p.instanceAccountID, TypeEmoji, SizeOriginal, p.emoji.ID, extension)
p.emoji.ImageContentType = contentType
- p.emoji.ImageFileSize = fileSize
// concatenate the first bytes with the existing bytes still in the reader (thanks Mara)
- multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader)
+ readerToStore := io.MultiReader(bytes.NewBuffer(firstBytes), reader)
+
+ var maxEmojiSize int
+ if p.emoji.Domain == "" {
+ maxEmojiSize = config.GetMediaEmojiLocalMaxSize()
+ } else {
+ maxEmojiSize = config.GetMediaEmojiRemoteMaxSize()
+ }
+
+ // if we know the fileSize already, make sure it's not bigger than our limit
+ var checkedSize bool
+ if fileSize > 0 {
+ checkedSize = true
+ if fileSize > maxEmojiSize {
+ return fmt.Errorf("store: given emoji fileSize (%db) is larger than allowed size (%db)", fileSize, maxEmojiSize)
+ }
+ }
// store this for now -- other processes can pull it out of storage as they please
- if err := p.storage.PutStream(ctx, p.emoji.ImagePath, multiReader); err != nil && err != storage.ErrAlreadyExists {
+ if fileSize, err = putStream(ctx, p.storage, p.emoji.ImagePath, readerToStore, fileSize); err != nil && err != storage.ErrAlreadyExists {
return fmt.Errorf("store: error storing stream: %s", err)
}
+ // if we didn't know the fileSize yet, we do now, so check if we need to
+ if !checkedSize && fileSize > maxEmojiSize {
+ defer func() {
+ if err := p.storage.Delete(ctx, p.emoji.ImagePath); err != nil {
+ log.Errorf("store: error removing too-large emoji from the store: %s", err)
+ }
+ }()
+ return fmt.Errorf("store: discovered emoji fileSize (%db) is larger than allowed emojiRemoteMaxSize (%db)", fileSize, maxEmojiSize)
+ }
+
+ p.emoji.ImageFileSize = fileSize
p.read = true
if p.postData != nil {