diff options
| author | 2022-10-13 15:16:24 +0200 | |
|---|---|---|
| committer | 2022-10-13 15:16:24 +0200 | |
| commit | 70d65b683fa963d2a8761182a2ddd2f4f9a86bb4 (patch) | |
| tree | 9cbd8f6870569b2514683c0e8ff6ea32e6e81780 /internal/processing | |
| parent | [frontend] Use new GET custom_emoji admin api (#908) (diff) | |
| download | gotosocial-70d65b683fa963d2a8761182a2ddd2f4f9a86bb4.tar.xz | |
[feature] Refetch emojis when they change on remote instances (#905)
* select emoji using image_static_url
* use updated on AP emojis
* allow refetch of updated emojis
* cheeky workaround for test
* clean up old files for refreshed emoji
* check error for originalPostData
* shorten GetEmojiByStaticImageURL
* delete kirby (sorry nintendo)
Diffstat (limited to 'internal/processing')
| -rw-r--r-- | internal/processing/admin/createemoji.go | 2 | ||||
| -rw-r--r-- | internal/processing/media/getfile.go | 45 | 
2 files changed, 27 insertions, 20 deletions
diff --git a/internal/processing/admin/createemoji.go b/internal/processing/admin/createemoji.go index 50399279c..93ae17496 100644 --- a/internal/processing/admin/createemoji.go +++ b/internal/processing/admin/createemoji.go @@ -57,7 +57,7 @@ func (p *processor) EmojiCreate(ctx context.Context, account *gtsmodel.Account,  		return f, form.Image.Size, err  	} -	processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, nil, form.Shortcode, emojiID, emojiURI, nil) +	processingEmoji, err := p.mediaManager.ProcessEmoji(ctx, data, nil, form.Shortcode, emojiID, emojiURI, nil, false)  	if err != nil {  		return nil, gtserror.NewErrorInternalError(fmt.Errorf("error processing emoji: %s", err), "error processing emoji")  	} diff --git a/internal/processing/media/getfile.go b/internal/processing/media/getfile.go index 104bca770..693b8685b 100644 --- a/internal/processing/media/getfile.go +++ b/internal/processing/media/getfile.go @@ -30,9 +30,10 @@ import (  	"github.com/superseriousbusiness/gotosocial/internal/gtserror"  	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel"  	"github.com/superseriousbusiness/gotosocial/internal/media" +	"github.com/superseriousbusiness/gotosocial/internal/uris"  ) -func (p *processor) GetFile(ctx context.Context, account *gtsmodel.Account, form *apimodel.GetContentRequestForm) (*apimodel.Content, gtserror.WithCode) { +func (p *processor) GetFile(ctx context.Context, requestingAccount *gtsmodel.Account, form *apimodel.GetContentRequestForm) (*apimodel.Content, gtserror.WithCode) {  	// parse the form fields  	mediaSize, err := media.ParseMediaSize(form.MediaSize)  	if err != nil { @@ -49,25 +50,25 @@ func (p *processor) GetFile(ctx context.Context, account *gtsmodel.Account, form  		return nil, gtserror.NewErrorNotFound(fmt.Errorf("file name %s not parseable", form.FileName))  	}  	wantedMediaID := spl[0] -	expectedAccountID := form.AccountID +	owningAccountID := form.AccountID  	// get the account that owns the media and make sure it's not suspended -	acct, err := p.db.GetAccountByID(ctx, expectedAccountID) +	owningAccount, err := p.db.GetAccountByID(ctx, owningAccountID)  	if err != nil { -		return nil, gtserror.NewErrorNotFound(fmt.Errorf("account with id %s could not be selected from the db: %s", expectedAccountID, err)) +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("account with id %s could not be selected from the db: %s", owningAccountID, err))  	} -	if !acct.SuspendedAt.IsZero() { -		return nil, gtserror.NewErrorNotFound(fmt.Errorf("account with id %s is suspended", expectedAccountID)) +	if !owningAccount.SuspendedAt.IsZero() { +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("account with id %s is suspended", owningAccountID))  	}  	// make sure the requesting account and the media account don't block each other -	if account != nil { -		blocked, err := p.db.IsBlocked(ctx, account.ID, expectedAccountID, true) +	if requestingAccount != nil { +		blocked, err := p.db.IsBlocked(ctx, requestingAccount.ID, owningAccountID, true)  		if err != nil { -			return nil, gtserror.NewErrorNotFound(fmt.Errorf("block status could not be established between accounts %s and %s: %s", expectedAccountID, account.ID, err)) +			return nil, gtserror.NewErrorNotFound(fmt.Errorf("block status could not be established between accounts %s and %s: %s", owningAccountID, requestingAccount.ID, err))  		}  		if blocked { -			return nil, gtserror.NewErrorNotFound(fmt.Errorf("block exists between accounts %s and %s", expectedAccountID, account.ID)) +			return nil, gtserror.NewErrorNotFound(fmt.Errorf("block exists between accounts %s and %s", owningAccountID, requestingAccount.ID))  		}  	} @@ -75,15 +76,15 @@ func (p *processor) GetFile(ctx context.Context, account *gtsmodel.Account, form  	// so we need to take different steps depending on the media type being requested  	switch mediaType {  	case media.TypeEmoji: -		return p.getEmojiContent(ctx, wantedMediaID, mediaSize) +		return p.getEmojiContent(ctx, wantedMediaID, owningAccountID, mediaSize)  	case media.TypeAttachment, media.TypeHeader, media.TypeAvatar: -		return p.getAttachmentContent(ctx, account, wantedMediaID, expectedAccountID, mediaSize) +		return p.getAttachmentContent(ctx, requestingAccount, wantedMediaID, owningAccountID, mediaSize)  	default:  		return nil, gtserror.NewErrorNotFound(fmt.Errorf("media type %s not recognized", mediaType))  	}  } -func (p *processor) getAttachmentContent(ctx context.Context, requestingAccount *gtsmodel.Account, wantedMediaID string, expectedAccountID string, mediaSize media.Size) (*apimodel.Content, gtserror.WithCode) { +func (p *processor) getAttachmentContent(ctx context.Context, requestingAccount *gtsmodel.Account, wantedMediaID string, owningAccountID string, mediaSize media.Size) (*apimodel.Content, gtserror.WithCode) {  	attachmentContent := &apimodel.Content{}  	var storagePath string @@ -93,8 +94,8 @@ func (p *processor) getAttachmentContent(ctx context.Context, requestingAccount  		return nil, gtserror.NewErrorNotFound(fmt.Errorf("attachment %s could not be taken from the db: %s", wantedMediaID, err))  	} -	if a.AccountID != expectedAccountID { -		return nil, gtserror.NewErrorNotFound(fmt.Errorf("attachment %s is not owned by %s", wantedMediaID, expectedAccountID)) +	if a.AccountID != owningAccountID { +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("attachment %s is not owned by %s", wantedMediaID, owningAccountID))  	}  	// get file information from the attachment depending on the requested media size @@ -227,17 +228,23 @@ func (p *processor) getAttachmentContent(ctx context.Context, requestingAccount  	return attachmentContent, nil  } -func (p *processor) getEmojiContent(ctx context.Context, wantedEmojiID string, emojiSize media.Size) (*apimodel.Content, gtserror.WithCode) { +func (p *processor) getEmojiContent(ctx context.Context, fileName string, owningAccountID string, emojiSize media.Size) (*apimodel.Content, gtserror.WithCode) {  	emojiContent := &apimodel.Content{}  	var storagePath string -	e, err := p.db.GetEmojiByID(ctx, wantedEmojiID) +	// reconstruct the static emoji image url -- reason +	// for using the static URL rather than full size url +	// is that static emojis are always encoded as png, +	// so this is more reliable than using full size url +	imageStaticURL := uris.GenerateURIForAttachment(owningAccountID, string(media.TypeEmoji), string(media.SizeStatic), fileName, "png") + +	e, err := p.db.GetEmojiByStaticURL(ctx, imageStaticURL)  	if err != nil { -		return nil, gtserror.NewErrorNotFound(fmt.Errorf("emoji %s could not be taken from the db: %s", wantedEmojiID, err)) +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("emoji %s could not be taken from the db: %s", fileName, err))  	}  	if *e.Disabled { -		return nil, gtserror.NewErrorNotFound(fmt.Errorf("emoji %s has been disabled", wantedEmojiID)) +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("emoji %s has been disabled", fileName))  	}  	switch emojiSize {  | 
