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 000000000..d255c5a66 Binary files /dev/null and b/testrig/media/giant-turnip-world-record.jpg differ 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