From eeb78bd141ea69a59c4361fac2cfe6fc36df59b3 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 25 Apr 2022 14:45:44 +0200 Subject: [PATCH] [bugfix] Allow processing of .png files where checksum is not correct (#487) * add png stripping code from google/wuffs * experiment with stripping data from pngs * add test images * use StrippedPngDecode for pngs * add StrippedPngDecode func * update tests for (no)alphachannel pngs * nolint on copied function --- README.md | 1 + internal/media/image.go | 6 +- internal/media/manager_test.go | 144 +++++++++++++ internal/media/png-stripper.go | 204 ++++++++++++++++++ .../test/test-png-alphachannel-processed.png | Bin 0 -> 18904 bytes .../test/test-png-alphachannel-thumbnail.jpg | Bin 0 -> 6446 bytes .../test-png-noalphachannel-processed.png | Bin 0 -> 17471 bytes .../test-png-noalphachannel-thumbnail.jpg | Bin 0 -> 6446 bytes 8 files changed, 352 insertions(+), 3 deletions(-) create mode 100644 internal/media/png-stripper.go create mode 100644 internal/media/test/test-png-alphachannel-processed.png create mode 100644 internal/media/test/test-png-alphachannel-thumbnail.jpg create mode 100644 internal/media/test/test-png-noalphachannel-processed.png create mode 100644 internal/media/test/test-png-noalphachannel-thumbnail.jpg diff --git a/README.md b/README.md index 1a4740a2d..576af3b0c 100644 --- a/README.md +++ b/README.md @@ -196,6 +196,7 @@ The following libraries and frameworks are used by GoToSocial, with gratitude - [gin-contrib/static](https://github.com/gin-contrib/static); Gin static page middleware. [MIT License](https://spdx.org/licenses/MIT.html) - [go-fed/httpsig](https://github.com/go-fed/httpsig); secure HTTP signature library. [BSD-3-Clause License](https://spdx.org/licenses/BSD-3-Clause.html). - [google/uuid](https://github.com/google/uuid); UUID generation. [BSD-3-Clause License](https://spdx.org/licenses/BSD-3-Clause.html) +- [google/wuffs](https://github.com/google/wuffs); png-stripping code. [Apache-2.0 License](https://spdx.org/licenses/Apache-2.0.html). - [go-playground/validator](https://github.com/go-playground/validator); struct validation. [MIT License](https://spdx.org/licenses/MIT.html) - [gorilla/websocket](https://github.com/gorilla/websocket); Websocket connectivity. [BSD-2-Clause License](https://spdx.org/licenses/BSD-2-Clause.html). - [gruf/go-runners](https://codeberg.org/gruf/go-runners); worker pool library. [MIT License](https://spdx.org/licenses/MIT.html). diff --git a/internal/media/image.go b/internal/media/image.go index 4f2db0e95..cb26ad539 100644 --- a/internal/media/image.go +++ b/internal/media/image.go @@ -74,7 +74,7 @@ func decodeImage(r io.Reader, contentType string) (*imageMeta, error) { case mimeImageJpeg: i, err = jpeg.Decode(r) case mimeImagePng: - i, err = png.Decode(r) + i, err = StrippedPngDecode(r) default: err = fmt.Errorf("content type %s not recognised", contentType) } @@ -117,7 +117,7 @@ func deriveThumbnail(r io.Reader, contentType string, createBlurhash bool) (*ima case mimeImageJpeg: i, err = jpeg.Decode(r) case mimeImagePng: - i, err = png.Decode(r) + i, err = StrippedPngDecode(r) case mimeImageGif: i, err = gif.Decode(r) default: @@ -175,7 +175,7 @@ func deriveStaticEmoji(r io.Reader, contentType string) (*imageMeta, error) { switch contentType { case mimeImagePng: - i, err = png.Decode(r) + i, err = StrippedPngDecode(r) if err != nil { return nil, err } diff --git a/internal/media/manager_test.go b/internal/media/manager_test.go index 95cefe1db..75e706ba7 100644 --- a/internal/media/manager_test.go +++ b/internal/media/manager_test.go @@ -111,6 +111,150 @@ func (suite *ManagerTestSuite) TestSimpleJpegProcessBlocking() { suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) } +func (suite *ManagerTestSuite) TestPngNoAlphaChannelProcessBlocking() { + ctx := context.Background() + + data := func(_ context.Context) (io.Reader, int, error) { + // load bytes from a test image + b, err := os.ReadFile("./test/test-png-noalphachannel.png") + if err != nil { + panic(err) + } + return bytes.NewBuffer(b), len(b), nil + } + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + // process the media with no additional info provided + processingMedia, err := suite.manager.ProcessMedia(ctx, data, nil, accountID, nil) + suite.NoError(err) + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // do a blocking call to fetch the attachment + attachment, err := processingMedia.LoadAttachment(ctx) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 186, Height: 187, Size: 34782, Aspect: 0.9946524064171123, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 186, Height: 187, Size: 34782, Aspect: 0.9946524064171123, + }, attachment.FileMeta.Small) + suite.Equal("image/png", attachment.File.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) + suite.Equal(17471, attachment.File.FileSize) + suite.Equal("LFP?{^.A-?xd.9o#RVRQ~oj:_0xW", attachment.Blurhash) + + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := suite.storage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) + + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-png-noalphachannel-processed.png") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := suite.storage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-png-noalphachannel-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) +} + +func (suite *ManagerTestSuite) TestPngAlphaChannelProcessBlocking() { + ctx := context.Background() + + data := func(_ context.Context) (io.Reader, int, error) { + // load bytes from a test image + b, err := os.ReadFile("./test/test-png-alphachannel.png") + if err != nil { + panic(err) + } + return bytes.NewBuffer(b), len(b), nil + } + + accountID := "01FS1X72SK9ZPW0J1QQ68BD264" + + // process the media with no additional info provided + processingMedia, err := suite.manager.ProcessMedia(ctx, data, nil, accountID, nil) + suite.NoError(err) + // fetch the attachment id from the processing media + attachmentID := processingMedia.AttachmentID() + + // do a blocking call to fetch the attachment + attachment, err := processingMedia.LoadAttachment(ctx) + suite.NoError(err) + suite.NotNil(attachment) + + // make sure it's got the stuff set on it that we expect + // the attachment ID and accountID we expect + suite.Equal(attachmentID, attachment.ID) + suite.Equal(accountID, attachment.AccountID) + + // file meta should be correctly derived from the image + suite.EqualValues(gtsmodel.Original{ + Width: 186, Height: 187, Size: 34782, Aspect: 0.9946524064171123, + }, attachment.FileMeta.Original) + suite.EqualValues(gtsmodel.Small{ + Width: 186, Height: 187, Size: 34782, Aspect: 0.9946524064171123, + }, attachment.FileMeta.Small) + suite.Equal("image/png", attachment.File.ContentType) + suite.Equal("image/jpeg", attachment.Thumbnail.ContentType) + suite.Equal(18904, attachment.File.FileSize) + suite.Equal("LFP?{^.A-?xd.9o#RVRQ~oj:_0xW", attachment.Blurhash) + + // now make sure the attachment is in the database + dbAttachment, err := suite.db.GetAttachmentByID(ctx, attachmentID) + suite.NoError(err) + suite.NotNil(dbAttachment) + + // make sure the processed file is in storage + processedFullBytes, err := suite.storage.Get(attachment.File.Path) + suite.NoError(err) + suite.NotEmpty(processedFullBytes) + + // load the processed bytes from our test folder, to compare + processedFullBytesExpected, err := os.ReadFile("./test/test-png-alphachannel-processed.png") + suite.NoError(err) + suite.NotEmpty(processedFullBytesExpected) + + // the bytes in storage should be what we expected + suite.Equal(processedFullBytesExpected, processedFullBytes) + + // now do the same for the thumbnail and make sure it's what we expected + processedThumbnailBytes, err := suite.storage.Get(attachment.Thumbnail.Path) + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytes) + + processedThumbnailBytesExpected, err := os.ReadFile("./test/test-png-alphachannel-thumbnail.jpg") + suite.NoError(err) + suite.NotEmpty(processedThumbnailBytesExpected) + + suite.Equal(processedThumbnailBytesExpected, processedThumbnailBytes) +} + func (suite *ManagerTestSuite) TestSimpleJpegProcessBlockingWithCallback() { ctx := context.Background() diff --git a/internal/media/png-stripper.go b/internal/media/png-stripper.go new file mode 100644 index 000000000..62ae393fe --- /dev/null +++ b/internal/media/png-stripper.go @@ -0,0 +1,204 @@ +/* + GoToSocial + Copyright (C) 2021-2022 GoToSocial Authors 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 media + +/* + The code in this file is taken from the following source: + https://github.com/google/wuffs/blob/414a011491ff513b86d8694c5d71800f3cb5a715/script/strip-png-ancillary-chunks.go + + It presents a workaround for this issue: https://github.com/golang/go/issues/43382 + + The license for the copied code is reproduced below: + + Copyright 2021 The Wuffs Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// strip-png-ancillary-chunks.go copies PNG data from stdin to stdout, removing +// any ancillary chunks. +// +// Specification-compliant PNG decoders are required to honor critical chunks +// but may ignore ancillary (non-critical) chunks. Stripping out ancillary +// chunks before decoding should mean that different PNG decoders will agree on +// the decoded output regardless of which ancillary chunk types they choose to +// honor. Specifically, some PNG decoders may implement color and gamma +// correction but not all do. +// +// This program will strip out all ancillary chunks, but it should be +// straightforward to copy-paste-and-modify it to strip out only certain chunk +// types (e.g. only "tRNS" transparency chunks). +// +// -------- +// +// A PNG file consists of an 8-byte magic identifier and then a series of +// chunks. Each chunk is: +// +// - a 4-byte uint32 payload length N. +// - a 4-byte chunk type (e.g. "gAMA" for gamma correction metadata). +// - an N-byte payload. +// - a 4-byte CRC-32 checksum of the previous (N + 4) bytes, including the +// chunk type but excluding the payload length. +// +// Chunk types consist of 4 ASCII letters. The upper-case / lower-case bit of +// the first letter denote critical or ancillary chunks: "IDAT" and "PLTE" are +// critical, "gAMA" and "tEXt" are ancillary. See +// https://www.w3.org/TR/2003/REC-PNG-20031110/#5Chunk-naming-conventions +// +// -------- + +import ( + "encoding/binary" + "image" + "image/png" + "io" +) + +// chunkTypeAncillaryBit is whether the first byte of a big-endian uint32 chunk +// type (the first of four ASCII letters) is lower-case. +const chunkTypeAncillaryBit = 0x20000000 + +// PNGAncillaryChunkStripper wraps another io.Reader to strip ancillary chunks, +// if the data is in the PNG file format. If the data isn't PNG, it is passed +// through unmodified. +type PNGAncillaryChunkStripper struct { + // Reader is the wrapped io.Reader. + Reader io.Reader + + // stickyErr is the first error returned from the wrapped io.Reader. + stickyErr error + + // buffer[rIndex:wIndex] holds data read from the wrapped io.Reader that + // wasn't passed through yet. + buffer [8]byte + rIndex int + wIndex int + + // pending and discard is the number of remaining bytes for (and whether to + // discard or pass through) the current chunk-in-progress. + pending int64 + discard bool + + // notPNG is set true if the data stream doesn't start with the 8-byte PNG + // magic identifier. If true, the wrapped io.Reader's data (including the + // first up-to-8 bytes) is passed through without modification. + notPNG bool + + // seenMagic is whether we've seen the 8-byte PNG magic identifier. + seenMagic bool +} + +// Read implements io.Reader. +func (r *PNGAncillaryChunkStripper) Read(p []byte) (int, error) { + for { + // If the wrapped io.Reader returned a non-nil error, drain r.buffer + // (what data we have) and return that error (if fully drained). + if r.stickyErr != nil { + n := copy(p, r.buffer[r.rIndex:r.wIndex]) + r.rIndex += n + if r.rIndex < r.wIndex { + return n, nil + } + return n, r.stickyErr + } + + // Handle trivial requests, including draining our buffer. + if len(p) == 0 { + return 0, nil + } else if r.rIndex < r.wIndex { + n := copy(p, r.buffer[r.rIndex:r.wIndex]) + r.rIndex += n + return n, nil + } + + // From here onwards, our buffer is drained: r.rIndex == r.wIndex. + + // Handle non-PNG input. + if r.notPNG { + return r.Reader.Read(p) + } + + // Continue processing any PNG chunk that's in progress, whether + // discarding it or passing it through. + for r.pending > 0 { + if int64(len(p)) > r.pending { + p = p[:r.pending] + } + n, err := r.Reader.Read(p) + r.pending -= int64(n) + r.stickyErr = err + if r.discard { + continue + } + return n, err + } + + // We're either expecting the 8-byte PNG magic identifier or the 4-byte + // PNG chunk length + 4-byte PNG chunk type. Either way, read 8 bytes. + r.rIndex = 0 + r.wIndex, r.stickyErr = io.ReadFull(r.Reader, r.buffer[:8]) + if r.stickyErr != nil { + // Undo io.ReadFull converting io.EOF to io.ErrUnexpectedEOF. + if r.stickyErr == io.ErrUnexpectedEOF { + r.stickyErr = io.EOF + } + continue + } + + // Process those 8 bytes, either: + // - a PNG chunk (if we've already seen the PNG magic identifier), + // - the PNG magic identifier itself (if the input is a PNG) or + // - something else (if it's not a PNG). + //nolint:gocritic + if r.seenMagic { + // The number of pending bytes is equal to (N + 4) because of the 4 + // byte trailer, a checksum. + r.pending = int64(binary.BigEndian.Uint32(r.buffer[:4])) + 4 + chunkType := binary.BigEndian.Uint32(r.buffer[4:]) + r.discard = (chunkType & chunkTypeAncillaryBit) != 0 + if r.discard { + r.rIndex = r.wIndex + } + } else if string(r.buffer[:8]) == "\x89PNG\x0D\x0A\x1A\x0A" { + r.seenMagic = true + } else { + r.notPNG = true + } + } +} + +// StrippedPngDecode strips ancillary data from png to allow more lenient decoding of pngs +// see: https://github.com/golang/go/issues/43382 +// and: https://github.com/google/wuffs/blob/414a011491ff513b86d8694c5d71800f3cb5a715/script/strip-png-ancillary-chunks.go +func StrippedPngDecode(r io.Reader) (image.Image, error) { + strippedPngReader := io.Reader(&PNGAncillaryChunkStripper{ + Reader: r, + }) + return png.Decode(strippedPngReader) +} diff --git a/internal/media/test/test-png-alphachannel-processed.png b/internal/media/test/test-png-alphachannel-processed.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b67e66d1444150475226faa80238652a3ba918 GIT binary patch literal 18904 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 literal 0 HcmV?d00001 diff --git a/internal/media/test/test-png-noalphachannel-processed.png b/internal/media/test/test-png-noalphachannel-processed.png new file mode 100644 index 0000000000000000000000000000000000000000..46bec9097b14ca4cfadf9c574ca9a0b4e90211c7 GIT binary patch literal 17471 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 literal 0 HcmV?d00001 diff --git a/internal/media/test/test-png-noalphachannel-thumbnail.jpg b/internal/media/test/test-png-noalphachannel-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca62f4ea6f9c64b0ef5b6dcd855b0b34f032a87a GIT binary patch literal 6446 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 literal 0 HcmV?d00001