From 25cab0e1f4fdd89512088d0d02c4abd7b4d11773 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 21 Mar 2022 19:46:51 +0100 Subject: [PATCH] [bugfix] Fix images not being processed correctly sometimes (#437) * bump exif-terminator to latest version * add and test giant turnip from turnip.farm * don't error if content property is nil --- go.mod | 4 +- go.sum | 8 +- .../dereferencing/dereferencer_test.go | 10 +- .../federation/dereferencing/status_test.go | 47 ++++++ internal/media/image.go | 6 +- internal/media/processingmedia.go | 2 + testrig/media/giant-turnip-world-record.jpg | Bin 0 -> 77139 bytes testrig/testmodels.go | 148 +++++++++++++++--- .../exif-terminator/jpeg.go | 2 +- .../exif-terminator/logger.go | 47 ++++++ .../exif-terminator/terminator.go | 7 +- .../go-jpeg-image-structure/v2/.MODULE_ROOT | 0 .../go-jpeg-image-structure/v2/LICENSE | 0 .../go-jpeg-image-structure/v2/README.md | 0 .../go-jpeg-image-structure/v2/markers.go | 0 .../v2/media_parser.go | 0 .../go-jpeg-image-structure/v2/segment.go | 0 .../v2/segment_list.go | 0 .../go-jpeg-image-structure/v2/splitter.go | 4 +- .../v2/testing_common.go | 0 .../go-jpeg-image-structure/v2/utility.go | 0 vendor/modules.txt | 6 +- 22 files changed, 245 insertions(+), 46 deletions(-) create mode 100644 testrig/media/giant-turnip-world-record.jpg create mode 100644 vendor/github.com/superseriousbusiness/exif-terminator/logger.go rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/.MODULE_ROOT (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/LICENSE (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/README.md (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/markers.go (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/media_parser.go (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/segment.go (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/segment_list.go (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/splitter.go (99%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/testing_common.go (100%) rename vendor/github.com/{dsoprea => superseriousbusiness}/go-jpeg-image-structure/v2/utility.go (100%) diff --git a/go.mod b/go.mod index e83d3966c..428a1f3a5 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/spf13/viper v1.10.0 github.com/stretchr/testify v1.7.0 github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8 - github.com/superseriousbusiness/exif-terminator v0.1.0 + github.com/superseriousbusiness/exif-terminator v0.2.0 github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB github.com/tdewolff/minify/v2 v2.9.22 github.com/uptrace/bun v1.0.20 @@ -59,7 +59,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b // indirect github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 // indirect - github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 // indirect github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/dsoprea/go-photoshop-info-format v0.0.0-20200610045659-121dd752914d // indirect github.com/dsoprea/go-png-image-structure/v2 v2.0.0-20210512210324-29b889a6093d // indirect @@ -103,6 +102,7 @@ require ( github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect + github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe // indirect github.com/tdewolff/parse/v2 v2.5.23 // indirect github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect github.com/ugorji/go/codec v1.2.6 // indirect diff --git a/go.sum b/go.sum index 700c18a9d..22b170482 100644 --- a/go.sum +++ b/go.sum @@ -155,8 +155,6 @@ github.com/dsoprea/go-exif/v3 v3.0.0-20210625224831-a6301f85c82b/go.mod h1:cg5SN github.com/dsoprea/go-iptc v0.0.0-20200609062250-162ae6b44feb/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413 h1:YDRiMEm32T60Kpm35YzOK9ZHgjsS1Qrid+XskNcsdp8= github.com/dsoprea/go-iptc v0.0.0-20200610044640-bc9ca208b413/go.mod h1:kYIdx9N9NaOyD7U6D+YtExN7QhRm+5kq7//yOsRXQtM= -github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 h1:KGCiMMWxODEMmI3+9Ms04l73efoqFVNKKKPbVyOvKrU= -github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836/go.mod h1:WaARaUjQuSuDCDFAiU/GwzfxMTJBulfEhqEA2Tx6B4Y= github.com/dsoprea/go-logging v0.0.0-20190624164917-c4f10aab7696/go.mod h1:Nm/x2ZUNRW6Fe5C3LxdY1PyZY5wmDv/s5dkPJ/VB3iA= github.com/dsoprea/go-logging v0.0.0-20200517223158-a10564966e9d/go.mod h1:7I+3Pe2o/YSU88W0hWlm9S22W7XI1JFNJ86U0zPKMf8= github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd h1:l+vLbuxptsC6VQyQsfD7NnEC8BZuFpz45PgY+pH8YTg= @@ -655,8 +653,10 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8 h1:8Bwy6CSsT33/sF5FhjND4vr7jiJCaq4elNTAW4rUzVc= github.com/superseriousbusiness/activity v1.0.1-0.20211113133524-56560b73ace8/go.mod h1:ZY9xwFDucvp6zTvM6FQZGl8PSOofPBFIAy6gSc85XkY= -github.com/superseriousbusiness/exif-terminator v0.1.0 h1:ePzfV0vcw+tm/haSOGzKbBTKkHAvyQLbCzfsdVkb3hM= -github.com/superseriousbusiness/exif-terminator v0.1.0/go.mod h1:pmlOKzkFZWmqaucLAtrRbZG0R5F3dbrcLWOcd7gAOLI= +github.com/superseriousbusiness/exif-terminator v0.2.0 h1:C21KOUr54E37qTqYS7WJX0J83sNzzCwBEy0KXyDprqU= +github.com/superseriousbusiness/exif-terminator v0.2.0/go.mod h1:DHJuKguXqyOVqB/oyOylutEDIZCbkYsn2GZFNSUDT9E= +github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe h1:ksl2oCx/Qo8sNDc3Grb8WGKBM9nkvhCm25uvlT86azE= +github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe/go.mod h1:gH4P6gN1V+wmIw5o97KGaa1RgXB/tVpC2UNzijhg3E4= github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB h1:PtW2w6budTvRV2J5QAoSvThTHBuvh8t/+BXIZFAaBSc= github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo= github.com/tdewolff/minify/v2 v2.9.22 h1:PlmaAakaJHdMMdTTwjjsuSwIxKqWPTlvjTj6a/g/ILU= diff --git a/internal/federation/dereferencing/dereferencer_test.go b/internal/federation/dereferencing/dereferencer_test.go index fe66abce4..cabb3d6a8 100644 --- a/internal/federation/dereferencing/dereferencer_test.go +++ b/internal/federation/dereferencing/dereferencer_test.go @@ -50,17 +50,15 @@ type DereferencerStandardTestSuite struct { dereferencer dereferencing.Dereferencer } -func (suite *DereferencerStandardTestSuite) SetupSuite() { +func (suite *DereferencerStandardTestSuite) SetupTest() { + testrig.InitTestConfig() + testrig.InitTestLog() + suite.testAccounts = testrig.NewTestAccounts() suite.testRemoteStatuses = testrig.NewTestFediStatuses() suite.testRemotePeople = testrig.NewTestFediPeople() suite.testRemoteGroups = testrig.NewTestFediGroups() suite.testRemoteAttachments = testrig.NewTestFediAttachments("../../../testrig/media") -} - -func (suite *DereferencerStandardTestSuite) SetupTest() { - testrig.InitTestLog() - testrig.InitTestConfig() suite.db = testrig.NewTestDB() suite.storage = testrig.NewTestStorage() diff --git a/internal/federation/dereferencing/status_test.go b/internal/federation/dereferencing/status_test.go index 89bcedd70..08363f580 100644 --- a/internal/federation/dereferencing/status_test.go +++ b/internal/federation/dereferencing/status_test.go @@ -131,6 +131,53 @@ func (suite *StatusTestSuite) TestDereferenceStatusWithMention() { suite.False(m.Silent) } +func (suite *StatusTestSuite) TestDereferenceStatusWithImageAndNoContent() { + fetchingAccount := suite.testAccounts["local_account_1"] + + statusURL := testrig.URLMustParse("https://turnip.farm/users/turniplover6969/statuses/70c53e54-3146-42d5-a630-83c8b6c7c042") + status, statusable, new, err := suite.dereferencer.GetRemoteStatus(context.Background(), fetchingAccount.Username, statusURL, false, false) + suite.NoError(err) + suite.NotNil(status) + suite.NotNil(statusable) + suite.True(new) + + // status values should be set + suite.Equal("https://turnip.farm/users/turniplover6969/statuses/70c53e54-3146-42d5-a630-83c8b6c7c042", status.URI) + suite.Equal("https://turnip.farm/@turniplover6969/70c53e54-3146-42d5-a630-83c8b6c7c042", status.URL) + suite.Equal("", status.Content) + suite.Equal("https://turnip.farm/users/turniplover6969", status.AccountURI) + suite.False(status.Local) + suite.Empty(status.ContentWarning) + suite.Equal(gtsmodel.VisibilityPublic, status.Visibility) + suite.Equal(ap.ObjectNote, status.ActivityStreamsType) + + // status should be in the database + dbStatus, err := suite.db.GetStatusByURI(context.Background(), status.URI) + suite.NoError(err) + suite.Equal(status.ID, dbStatus.ID) + suite.True(dbStatus.Federated) + suite.True(dbStatus.Boostable) + suite.True(dbStatus.Replyable) + suite.True(dbStatus.Likeable) + + // account should be in the database now too + account, err := suite.db.GetAccountByURI(context.Background(), status.AccountURI) + suite.NoError(err) + suite.NotNil(account) + suite.True(account.Discoverable) + suite.Equal("https://turnip.farm/users/turniplover6969", account.URI) + suite.Equal("I just think they're neat", account.Note) + suite.Equal("Turnip Lover 6969", account.DisplayName) + suite.Equal("turniplover6969", account.Username) + suite.NotNil(account.PublicKey) + suite.Nil(account.PrivateKey) + + // we should have an attachment in the database + a := >smodel.MediaAttachment{} + err = suite.db.GetWhere(context.Background(), []db.Where{{Key: "status_id", Value: status.ID}}, a) + suite.NoError(err) +} + func TestStatusTestSuite(t *testing.T) { suite.Run(t, new(StatusTestSuite)) } diff --git a/internal/media/image.go b/internal/media/image.go index e5390cee5..4f2db0e95 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -125,7 +125,7 @@ func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*ima } if err != nil { - return nil, err + return nil, fmt.Errorf("error decoding image as %s: %s", contentType, err) } if i == nil { @@ -151,7 +151,7 @@ func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*ima tiny := resize.Thumbnail(32, 32, thumb, resize.NearestNeighbor) bh, err := blurhash.Encode(4, 3, tiny) if err != nil { - return nil, err + return nil, fmt.Errorf("error creating blurhash: %s", err) } im.blurhash = bh } @@ -161,7 +161,7 @@ func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*ima // Quality isn't extremely important for thumbnails, so 75 is "good enough" Quality: 75, }); err != nil { - return nil, err + return nil, fmt.Errorf("error encoding thumbnail: %s", err) } im.small = out.Bytes() diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 3cf4805f7..63e03a409 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -260,6 +260,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error { if err != nil { return fmt.Errorf("store: error executing data function: %s", err) } + logrus.Tracef("store: reading %d bytes from data function for media %s", fileSize, p.attachment.URL) // defer closing the reader when we're done with it defer func() { @@ -342,6 +343,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error { return p.postData(ctx) } + logrus.Tracef("store: finished storing initial data for attachment %s", p.attachment.URL) return nil } diff --git a/testrig/media/giant-turnip-world-record.jpg b/testrig/media/giant-turnip-world-record.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d255c5a66f6e02ac2f3d775026dde00cfaedf1b5 GIT binary patch literal 77139 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 AOKHF~}y>GkCk2fNhP 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 literal 0 HcmV?d00001 diff --git a/testrig/testmodels.go b/testrig/testmodels.go index c9591b029..5ccd3fb90 100644 --- a/testrig/testmodels.go +++ b/testrig/testmodels.go @@ -1460,7 +1460,7 @@ type ActivityWithSignature struct { // A struct of accounts needs to be passed in because the activities will also be bundled along with // their requesting signatures. func NewTestActivities(accounts map[string]*gtsmodel.Account) map[string]ActivityWithSignature { - dmForZork := newNote( + dmForZork := newAPNote( URLMustParse("http://fossbros-anonymous.io/users/foss_satan/statuses/5424b153-4553-4f30-9358-7b92f7cd42f6"), URLMustParse("http://fossbros-anonymous.io/@foss_satan/5424b153-4553-4f30-9358-7b92f7cd42f6"), time.Now(), @@ -1470,15 +1470,17 @@ func NewTestActivities(accounts map[string]*gtsmodel.Account) map[string]Activit []*url.URL{URLMustParse("http://localhost:8080/users/the_mighty_zork")}, nil, true, - []vocab.ActivityStreamsMention{}) - createDmForZork := wrapNoteInCreate( + []vocab.ActivityStreamsMention{}, + nil, + ) + createDmForZork := wrapAPNoteInCreate( URLMustParse("http://fossbros-anonymous.io/users/foss_satan/statuses/5424b153-4553-4f30-9358-7b92f7cd42f6/activity"), URLMustParse("http://fossbros-anonymous.io/users/foss_satan"), time.Now(), dmForZork) createDmForZorkSig, createDmForZorkDigest, creatDmForZorkDate := GetSignatureForActivity(createDmForZork, accounts["remote_account_1"].PublicKeyURI, accounts["remote_account_1"].PrivateKey, URLMustParse(accounts["local_account_1"].InboxURI)) - forwardedMessage := newNote( + forwardedMessage := newAPNote( URLMustParse("http://example.org/users/some_user/statuses/afaba698-5740-4e32-a702-af61aa543bc1"), URLMustParse("http://example.org/@some_user/afaba698-5740-4e32-a702-af61aa543bc1"), time.Now(), @@ -1488,8 +1490,10 @@ func NewTestActivities(accounts map[string]*gtsmodel.Account) map[string]Activit []*url.URL{URLMustParse(pub.PublicActivityPubIRI)}, nil, false, - []vocab.ActivityStreamsMention{}) - createForwardedMessage := wrapNoteInCreate( + []vocab.ActivityStreamsMention{}, + nil, + ) + createForwardedMessage := wrapAPNoteInCreate( URLMustParse("http://example.org/users/some_user/statuses/afaba698-5740-4e32-a702-af61aa543bc1/activity"), URLMustParse("http://example.org/users/some_user"), time.Now(), @@ -1520,8 +1524,14 @@ func NewTestFediPeople() map[string]vocab.ActivityStreamsPerson { } newPerson1Pub := &newPerson1Priv.PublicKey + turnipLover6969Priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + panic(err) + } + turnipLover6969Pub := &turnipLover6969Priv.PublicKey + return map[string]vocab.ActivityStreamsPerson{ - "https://unknown-instance.com/users/brand_new_person": newPerson( + "https://unknown-instance.com/users/brand_new_person": newAPPerson( URLMustParse("https://unknown-instance.com/users/brand_new_person"), URLMustParse("https://unknown-instance.com/users/brand_new_person/following"), URLMustParse("https://unknown-instance.com/users/brand_new_person/followers"), @@ -1541,6 +1551,26 @@ func NewTestFediPeople() map[string]vocab.ActivityStreamsPerson { "image/png", false, ), + "https://turnip.farm/users/turniplover6969": newAPPerson( + URLMustParse("https://turnip.farm/users/turniplover6969"), + URLMustParse("https://turnip.farm/users/turniplover6969/following"), + URLMustParse("https://turnip.farm/users/turniplover6969/followers"), + URLMustParse("https://turnip.farm/users/turniplover6969/inbox"), + URLMustParse("https://turnip.farm/users/turniplover6969/outbox"), + URLMustParse("https://turnip.farm/users/turniplover6969/collections/featured"), + "turniplover6969", + "Turnip Lover 6969", + "I just think they're neat", + URLMustParse("https://turnip.farm/@turniplover6969"), + true, + URLMustParse("https://turnip.farm/users/turniplover6969#main-key"), + turnipLover6969Pub, + nil, + "image/jpeg", + nil, + "image/png", + false, + ), } } @@ -1552,7 +1582,7 @@ func NewTestFediGroups() map[string]vocab.ActivityStreamsGroup { newGroup1Pub := &newGroup1Priv.PublicKey return map[string]vocab.ActivityStreamsGroup{ - "https://unknown-instance.com/groups/some_group": newGroup( + "https://unknown-instance.com/groups/some_group": newAPGroup( URLMustParse("https://unknown-instance.com/groups/some_group"), URLMustParse("https://unknown-instance.com/groups/some_group/following"), URLMustParse("https://unknown-instance.com/groups/some_group/followers"), @@ -1592,6 +1622,11 @@ func NewTestFediAttachments(relativePath string) map[string]RemoteAttachmentFile panic(err) } + massiveFuckingTurnipBytes, err := os.ReadFile(fmt.Sprintf("%s/giant-turnip-world-record.jpg", relativePath)) + if err != nil { + panic(err) + } + return map[string]RemoteAttachmentFile{ "https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg": { Data: beeBytes, @@ -1601,12 +1636,16 @@ func NewTestFediAttachments(relativePath string) map[string]RemoteAttachmentFile Data: thoughtsOfDogBytes, ContentType: "image/jpeg", }, + "https://turnip.farm/attachments/f17843c7-015e-4251-9b5a-91389c49ee57.jpg": { + Data: massiveFuckingTurnipBytes, + ContentType: "image/jpeg", + }, } } func NewTestFediStatuses() map[string]vocab.ActivityStreamsNote { return map[string]vocab.ActivityStreamsNote{ - "https://unknown-instance.com/users/brand_new_person/statuses/01FE4NTHKWW7THT67EF10EB839": newNote( + "https://unknown-instance.com/users/brand_new_person/statuses/01FE4NTHKWW7THT67EF10EB839": newAPNote( URLMustParse("https://unknown-instance.com/users/brand_new_person/statuses/01FE4NTHKWW7THT67EF10EB839"), URLMustParse("https://unknown-instance.com/users/@brand_new_person/01FE4NTHKWW7THT67EF10EB839"), time.Now(), @@ -1618,9 +1657,10 @@ func NewTestFediStatuses() map[string]vocab.ActivityStreamsNote { }, []*url.URL{}, false, - []vocab.ActivityStreamsMention{}, + nil, + nil, ), - "https://unknown-instance.com/users/brand_new_person/statuses/01FE5Y30E3W4P7TRE0R98KAYQV": newNote( + "https://unknown-instance.com/users/brand_new_person/statuses/01FE5Y30E3W4P7TRE0R98KAYQV": newAPNote( URLMustParse("https://unknown-instance.com/users/brand_new_person/statuses/01FE5Y30E3W4P7TRE0R98KAYQV"), URLMustParse("https://unknown-instance.com/users/@brand_new_person/01FE5Y30E3W4P7TRE0R98KAYQV"), time.Now(), @@ -1633,11 +1673,34 @@ func NewTestFediStatuses() map[string]vocab.ActivityStreamsNote { []*url.URL{}, false, []vocab.ActivityStreamsMention{ - newMention( + newAPMention( URLMustParse("http://localhost:8080/users/the_mighty_zork"), "@the_mighty_zork@localhost:8080", ), }, + nil, + ), + "https://turnip.farm/users/turniplover6969/statuses/70c53e54-3146-42d5-a630-83c8b6c7c042": newAPNote( + URLMustParse("https://turnip.farm/users/turniplover6969/statuses/70c53e54-3146-42d5-a630-83c8b6c7c042"), + URLMustParse("https://turnip.farm/@turniplover6969/70c53e54-3146-42d5-a630-83c8b6c7c042"), + time.Now(), + "", + "", + URLMustParse("https://turnip.farm/users/turniplover6969"), + []*url.URL{ + URLMustParse(pub.PublicActivityPubIRI), + }, + []*url.URL{}, + false, + nil, + []vocab.ActivityStreamsImage{ + newAPImage( + URLMustParse("https://turnip.farm/attachments/f17843c7-015e-4251-9b5a-91389c49ee57.jpg"), + "image/jpeg", + "", + "", + ), + }, ), } } @@ -1799,7 +1862,7 @@ func GetSignatureForDereference(pubKeyID string, privkey crypto.PrivateKey, dest return } -func newPerson( +func newAPPerson( profileIDURI *url.URL, followingURI *url.URL, followersURI *url.URL, @@ -1982,7 +2045,7 @@ func newPerson( return person } -func newGroup( +func newAPGroup( profileIDURI *url.URL, followingURI *url.URL, followersURI *url.URL, @@ -2165,7 +2228,7 @@ func newGroup( return group } -func newMention(uri *url.URL, namestring string) vocab.ActivityStreamsMention { +func newAPMention(uri *url.URL, namestring string) vocab.ActivityStreamsMention { mention := streams.NewActivityStreamsMention() hrefProp := streams.NewActivityStreamsHrefProperty() @@ -2179,8 +2242,38 @@ func newMention(uri *url.URL, namestring string) vocab.ActivityStreamsMention { return mention } -// newNote returns a new activity streams note for the given parameters -func newNote( +func newAPImage(url *url.URL, mediaType string, imageDescription string, blurhash string) vocab.ActivityStreamsImage { + image := streams.NewActivityStreamsImage() + + if url != nil { + urlProp := streams.NewActivityStreamsUrlProperty() + urlProp.AppendIRI(url) + image.SetActivityStreamsUrl(urlProp) + } + + if mediaType != "" { + mediaTypeProp := streams.NewActivityStreamsMediaTypeProperty() + mediaTypeProp.Set(mediaType) + image.SetActivityStreamsMediaType(mediaTypeProp) + } + + if imageDescription != "" { + nameProp := streams.NewActivityStreamsNameProperty() + nameProp.AppendXMLSchemaString(imageDescription) + image.SetActivityStreamsName(nameProp) + } + + if blurhash != "" { + blurhashProp := streams.NewTootBlurhashProperty() + blurhashProp.Set(blurhash) + image.SetTootBlurhash(blurhashProp) + } + + return image +} + +// newAPNote returns a new activity streams note for the given parameters +func newAPNote( noteID *url.URL, noteURL *url.URL, noteCreatedAt time.Time, @@ -2190,7 +2283,8 @@ func newNote( noteTo []*url.URL, noteCC []*url.URL, noteSensitive bool, - noteMentions []vocab.ActivityStreamsMention) vocab.ActivityStreamsNote { + noteMentions []vocab.ActivityStreamsMention, + noteAttachments []vocab.ActivityStreamsImage) vocab.ActivityStreamsNote { // create the note itself note := streams.NewActivityStreamsNote() @@ -2255,21 +2349,27 @@ func newNote( note.SetActivityStreamsCc(cc) } - // set note tags - tag := streams.NewActivityStreamsTagProperty() - // mentions + tag := streams.NewActivityStreamsTagProperty() for _, m := range noteMentions { tag.AppendActivityStreamsMention(m) } - note.SetActivityStreamsTag(tag) + // append any attachments as ActivityStreamsImage + if noteAttachments != nil { + attachmentProperty := streams.NewActivityStreamsAttachmentProperty() + for _, a := range noteAttachments { + attachmentProperty.AppendActivityStreamsImage(a) + } + note.SetActivityStreamsAttachment(attachmentProperty) + } + return note } -// wrapNoteInCreate wraps the given activity streams note in a Create activity streams action -func wrapNoteInCreate(createID *url.URL, createActor *url.URL, createPublished time.Time, createNote vocab.ActivityStreamsNote) vocab.ActivityStreamsCreate { +// wrapAPNoteInCreate wraps the given activity streams note in a Create activity streams action +func wrapAPNoteInCreate(createID *url.URL, createActor *url.URL, createPublished time.Time, createNote vocab.ActivityStreamsNote) vocab.ActivityStreamsCreate { // create the.... create create := streams.NewActivityStreamsCreate() diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go b/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go index 224a9b646..e3da53d54 100644 --- a/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go +++ b/vendor/github.com/superseriousbusiness/exif-terminator/jpeg.go @@ -23,7 +23,7 @@ import ( "fmt" "io" - jpegstructure "github.com/dsoprea/go-jpeg-image-structure/v2" + jpegstructure "github.com/superseriousbusiness/go-jpeg-image-structure/v2" ) var markerLen = map[byte]int{ diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/logger.go b/vendor/github.com/superseriousbusiness/exif-terminator/logger.go new file mode 100644 index 000000000..e607c55dd --- /dev/null +++ b/vendor/github.com/superseriousbusiness/exif-terminator/logger.go @@ -0,0 +1,47 @@ +/* + exif-terminator + Copyright (C) 2022 SuperSeriousBusiness admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +package terminator + +import "fmt" + +var logger ErrorLogger + +func init() { + logger = &defaultErrorLogger{} +} + +// ErrorLogger denotes a generic error logging function. +type ErrorLogger interface { + Error(args ...interface{}) +} + +type defaultErrorLogger struct{} + +func (d *defaultErrorLogger) Error(args ...interface{}) { + fmt.Println(args...) +} + +// SetErrorLogger allows a user of the exif-terminator library +// to set the logger that will be used for error logging. +// +// If it is not set, the default error logger will be used, which +// just prints errors to stdout. +func SetErrorLogger(errorLogger ErrorLogger) { + logger = errorLogger +} diff --git a/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go b/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go index b6225f6dc..36f2d8b3a 100644 --- a/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go +++ b/vendor/github.com/superseriousbusiness/exif-terminator/terminator.go @@ -25,7 +25,7 @@ import ( "fmt" "io" - jpegstructure "github.com/dsoprea/go-jpeg-image-structure/v2" + jpegstructure "github.com/superseriousbusiness/go-jpeg-image-structure/v2" pngstructure "github.com/dsoprea/go-png-image-structure/v2" ) @@ -109,8 +109,11 @@ func scanAndClose(scanner *bufio.Scanner, writer io.WriteCloser) { // until the pipeReader starts being read by the caller, which // is why we do this asynchronously go func() { + defer writer.Close() for scanner.Scan() { } - writer.Close() + if scanner.Err() != nil { + logger.Error(scanner.Err()) + } }() } diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/.MODULE_ROOT b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/.MODULE_ROOT similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/.MODULE_ROOT rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/.MODULE_ROOT diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/LICENSE b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/LICENSE similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/LICENSE rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/LICENSE diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/README.md b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/README.md similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/README.md rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/README.md diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/markers.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/markers.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/markers.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/markers.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/media_parser.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/media_parser.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/media_parser.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/media_parser.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/segment.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/segment.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment_list.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/segment_list.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/segment_list.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/segment_list.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/splitter.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/splitter.go similarity index 99% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/splitter.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/splitter.go index 8e9c7c020..1856beddf 100644 --- a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/splitter.go +++ b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/splitter.go @@ -232,8 +232,8 @@ func (js *JpegSplitter) readSegment(data []byte) (count int, err error) { err = binary.Read(b, binary.BigEndian, &l) log.PanicIf(err) - if l <= 2 { - log.Panicf("length of size read for non-special marker (%02x) is unexpectedly not more than two.", markerId) + if l < 2 { + log.Panicf("length of size read for non-special marker (%02x) is unexpectedly less than two.", markerId) } // (l includes the bytes of the length itself.) diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/testing_common.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/testing_common.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/testing_common.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/testing_common.go diff --git a/vendor/github.com/dsoprea/go-jpeg-image-structure/v2/utility.go b/vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/utility.go similarity index 100% rename from vendor/github.com/dsoprea/go-jpeg-image-structure/v2/utility.go rename to vendor/github.com/superseriousbusiness/go-jpeg-image-structure/v2/utility.go diff --git a/vendor/modules.txt b/vendor/modules.txt index c28759538..c3e5c9d79 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -57,7 +57,6 @@ github.com/dsoprea/go-exif/v3/undefined github.com/dsoprea/go-iptc # github.com/dsoprea/go-jpeg-image-structure/v2 v2.0.0-20210512043942-b434301c6836 ## explicit; go 1.12 -github.com/dsoprea/go-jpeg-image-structure/v2 # github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd ## explicit; go 1.13 github.com/dsoprea/go-logging @@ -471,9 +470,12 @@ github.com/superseriousbusiness/activity/streams/values/rfc2045 github.com/superseriousbusiness/activity/streams/values/rfc5988 github.com/superseriousbusiness/activity/streams/values/string github.com/superseriousbusiness/activity/streams/vocab -# github.com/superseriousbusiness/exif-terminator v0.1.0 +# github.com/superseriousbusiness/exif-terminator v0.2.0 ## explicit; go 1.17 github.com/superseriousbusiness/exif-terminator +# github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe +## explicit; go 1.17 +github.com/superseriousbusiness/go-jpeg-image-structure/v2 # github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB ## explicit; go 1.13 github.com/superseriousbusiness/oauth2/v4