diff --git a/.drone.yml b/.drone.yml index 1a5239a13..f3e5f11fc 100644 --- a/.drone.yml +++ b/.drone.yml @@ -12,7 +12,7 @@ steps: # We use golangci-lint for linting. # See: https://golangci-lint.run/ - name: lint - image: golangci/golangci-lint:v1.57.2 + image: golangci/golangci-lint:v1.60.3 volumes: - name: go-build-cache path: /root/.cache/go-build @@ -28,7 +28,7 @@ steps: - pull_request - name: test - image: golang:1.22-alpine + image: golang:1.23.0-alpine volumes: - name: go-build-cache path: /root/.cache/go-build @@ -94,7 +94,7 @@ steps: - pull_request - name: snapshot - image: superseriousbusiness/gotosocial-drone-build:0.6.0 # https://github.com/superseriousbusiness/gotosocial-drone-build + image: superseriousbusiness/gotosocial-drone-build:0.7.0 # https://github.com/superseriousbusiness/gotosocial-drone-build volumes: - name: go-build-cache path: /root/.cache/go-build @@ -135,7 +135,7 @@ steps: - main - name: release - image: superseriousbusiness/gotosocial-drone-build:0.6.0 # https://github.com/superseriousbusiness/gotosocial-drone-build + image: superseriousbusiness/gotosocial-drone-build:0.7.0 # https://github.com/superseriousbusiness/gotosocial-drone-build volumes: - name: go-build-cache path: /root/.cache/go-build @@ -194,7 +194,7 @@ clone: steps: - name: mirror - image: superseriousbusiness/gotosocial-drone-build:0.6.0 + image: superseriousbusiness/gotosocial-drone-build:0.7.0 environment: ORIGIN_REPO: https://github.com/superseriousbusiness/gotosocial TARGET_REPO: https://codeberg.org/superseriousbusiness/gotosocial @@ -207,6 +207,6 @@ steps: --- kind: signature -hmac: f4008d87e4e5b67251eb89f255c1224e6ab5818828cab24fc319b8f829176058 +hmac: 9810bf692fb1029c13b0a1e2f556e2306d16f7d3eec9ca6163a0499c147280c1 ... diff --git a/.goreleaser.yml b/.goreleaser.yml index 6a7fccfd0..6fec680dc 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,4 +1,5 @@ -# https://goreleaser.com +# Version 2 of GoReleaser: https://goreleaser.com/errors/version/ +version: 2 project_name: gotosocial before: # https://goreleaser.com/customization/hooks/ @@ -185,7 +186,7 @@ checksum: name_template: 'checksums.txt' snapshot: # https://goreleaser.com/customization/snapshots/ - name_template: "{{ incpatch .Version }}-SNAPSHOT" + version_template: "{{ incpatch .Version }}-SNAPSHOT" source: # https://goreleaser.com/customization/source/ enabled: true diff --git a/Dockerfile b/Dockerfile index 9ca0b2a28..c59fc1662 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Dockerfile reference: https://docs.docker.com/engine/reference/builder/ # stage 1: generate up-to-date swagger.yaml to put in the final container -FROM --platform=${BUILDPLATFORM} golang:1.22-alpine AS swagger +FROM --platform=${BUILDPLATFORM} golang:1.23.0-alpine AS swagger RUN \ ### Installs goswagger for building swagger definitions inside this container @@ -28,7 +28,7 @@ RUN yarn --cwd ./web/source install && \ rm -rf ./web/source # stage 3: build the executor container -FROM --platform=${TARGETPLATFORM} alpine:3.19.1 as executor +FROM --platform=${TARGETPLATFORM} alpine:3.20.2 as executor # switch to non-root user:group for GtS USER 1000:1000 diff --git a/go.mod b/go.mod index d404415a0..0e8c807e8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/superseriousbusiness/gotosocial -go 1.22.2 +go 1.23 replace modernc.org/sqlite => gitlab.com/NyaaaWhatsUpDoc/sqlite v1.29.9-concurrency-workaround diff --git a/internal/api/client/admin/emojicreate.go b/internal/api/client/admin/emojicreate.go index 75661f1c3..9696200de 100644 --- a/internal/api/client/admin/emojicreate.go +++ b/internal/api/client/admin/emojicreate.go @@ -145,8 +145,8 @@ func validateCreateEmoji(form *apimodel.EmojiCreateRequest) error { return errors.New("no emoji given") } - maxSize := config.GetMediaEmojiLocalMaxSize() - if form.Image.Size > int64(maxSize) { + maxSize := int64(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. + if form.Image.Size > maxSize { return fmt.Errorf("emoji image too large: image is %dKB but size limit for custom emojis is %dKB", form.Image.Size/1024, maxSize/1024) } diff --git a/internal/api/client/admin/emojiupdate.go b/internal/api/client/admin/emojiupdate.go index 37f67cabd..ec6987024 100644 --- a/internal/api/client/admin/emojiupdate.go +++ b/internal/api/client/admin/emojiupdate.go @@ -208,8 +208,8 @@ func validateUpdateEmoji(form *apimodel.EmojiUpdateRequest) error { } if hasImage { - maxSize := config.GetMediaEmojiLocalMaxSize() - if form.Image.Size > int64(maxSize) { + maxSize := int64(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. + if form.Image.Size > maxSize { return fmt.Errorf("emoji image too large: image is %dKB but size limit for custom emojis is %dKB", form.Image.Size/1024, maxSize/1024) } } diff --git a/internal/api/model/attachment.go b/internal/api/model/attachment.go index 21523a58e..f037a09aa 100644 --- a/internal/api/model/attachment.go +++ b/internal/api/model/attachment.go @@ -160,7 +160,7 @@ type MediaDimensions struct { Duration float32 `json:"duration,omitempty"` // Bitrate of the media in bits per second. // example: 1000000 - Bitrate int `json:"bitrate,omitempty"` + Bitrate uint64 `json:"bitrate,omitempty"` // Size of the media, in the format `[width]x[height]`. // Not set for audio. // example: 1920x1080 diff --git a/internal/cache/domain/domain.go b/internal/cache/domain/domain.go index 274a244f7..c9a43b1e5 100644 --- a/internal/cache/domain/domain.go +++ b/internal/cache/domain/domain.go @@ -220,7 +220,7 @@ func (n *node) getChild(part string) *node { for i < j { // avoid overflow when computing h - h := int(uint(i+j) >> 1) + h := int(uint(i+j) >> 1) // #nosec G115 // i ≤ h < j if n.child[h].part < part { diff --git a/internal/db/bundb/bundb.go b/internal/db/bundb/bundb.go index 45607ea15..5ec51aa9c 100644 --- a/internal/db/bundb/bundb.go +++ b/internal/db/bundb/bundb.go @@ -25,6 +25,7 @@ "encoding/pem" "errors" "fmt" + "math" "net/url" "os" "runtime" @@ -407,13 +408,12 @@ func maxOpenConns() int { // deriveBunDBPGOptions takes an application config and returns either a ready-to-use set of options // with sensible defaults, or an error if it's not satisfied by the provided config. func deriveBunDBPGOptions() (*pgx.ConnConfig, error) { - url := config.GetDbPostgresConnectionString() - - // if database URL is defined, ignore other DB related configuration fields - if url != "" { - cfg, err := pgx.ParseConfig(url) - return cfg, err + // If database URL is defined, ignore + // other DB-related configuration fields. + if url := config.GetDbPostgresConnectionString(); url != "" { + return pgx.ParseConfig(url) } + // these are all optional, the db adapter figures out defaults address := config.GetDbAddress() @@ -477,7 +477,10 @@ func deriveBunDBPGOptions() (*pgx.ConnConfig, error) { cfg.Host = address } if port := config.GetDbPort(); port > 0 { - cfg.Port = uint16(port) + if port > math.MaxUint16 { + return nil, errors.New("invalid port, must be in range 1-65535") + } + cfg.Port = uint16(port) // #nosec G115 -- Just validated above. } if u := config.GetDbUser(); u != "" { cfg.User = u diff --git a/internal/federation/dereferencing/emoji.go b/internal/federation/dereferencing/emoji.go index 12c648556..1ac27f2b2 100644 --- a/internal/federation/dereferencing/emoji.go +++ b/internal/federation/dereferencing/emoji.go @@ -97,11 +97,11 @@ func() (*media.ProcessingEmoji, error) { } // Get maximum supported remote emoji size. - maxsz := config.GetMediaEmojiRemoteMaxSize() + maxsz := int64(config.GetMediaEmojiRemoteMaxSize()) // #nosec G115 -- Already validated. // Prepare data function to dereference remote emoji media. data := func(context.Context) (io.ReadCloser, error) { - return tsport.DereferenceMedia(ctx, url, int64(maxsz)) + return tsport.DereferenceMedia(ctx, url, maxsz) } // Create new emoji with prepared info. @@ -189,11 +189,11 @@ func() (*media.ProcessingEmoji, error) { } // Get maximum supported remote emoji size. - maxsz := config.GetMediaEmojiRemoteMaxSize() + maxsz := int64(config.GetMediaEmojiRemoteMaxSize()) // #nosec G115 -- Already validated. // Prepare data function to dereference remote emoji media. data := func(context.Context) (io.ReadCloser, error) { - return tsport.DereferenceMedia(ctx, url, int64(maxsz)) + return tsport.DereferenceMedia(ctx, url, maxsz) } // Update emoji with prepared info. @@ -255,11 +255,11 @@ func() (*media.ProcessingEmoji, error) { } // Get maximum supported remote emoji size. - maxsz := config.GetMediaEmojiRemoteMaxSize() + maxsz := int64(config.GetMediaEmojiRemoteMaxSize()) // #nosec G115 -- Already validated. // Prepare data function to dereference remote emoji media. data := func(context.Context) (io.ReadCloser, error) { - return tsport.DereferenceMedia(ctx, url, int64(maxsz)) + return tsport.DereferenceMedia(ctx, url, maxsz) } // Recache emoji with prepared info. diff --git a/internal/federation/dereferencing/media.go b/internal/federation/dereferencing/media.go index 859e5603f..3bed4b198 100644 --- a/internal/federation/dereferencing/media.go +++ b/internal/federation/dereferencing/media.go @@ -77,14 +77,14 @@ func() (*media.ProcessingMedia, error) { } // Get maximum supported remote media size. - maxsz := config.GetMediaRemoteMaxSize() + maxsz := int64(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. // Create media with prepared info. return d.mediaManager.CreateMedia( ctx, accountID, func(ctx context.Context) (io.ReadCloser, error) { - return tsport.DereferenceMedia(ctx, url, int64(maxsz)) + return tsport.DereferenceMedia(ctx, url, maxsz) }, info, ) @@ -168,14 +168,14 @@ func() (*media.ProcessingMedia, error) { } // Get maximum supported remote media size. - maxsz := config.GetMediaRemoteMaxSize() + maxsz := int64(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. // Recache media with prepared info, // this will also update media in db. return d.mediaManager.CacheMedia( attach, func(ctx context.Context) (io.ReadCloser, error) { - return tsport.DereferenceMedia(ctx, url, int64(maxsz)) + return tsport.DereferenceMedia(ctx, url, maxsz) }, ), nil }, diff --git a/internal/httpclient/client.go b/internal/httpclient/client.go index 8a5f51c21..10fba5d42 100644 --- a/internal/httpclient/client.go +++ b/internal/httpclient/client.go @@ -340,14 +340,14 @@ func (c *Client) do(r *Request) (rsp *http.Response, retry bool, err error) { if u, _ := strconv.ParseUint(after, 10, 32); u != 0 { // An integer no. of backoff seconds was provided. - r.backoff = time.Duration(u) * time.Second + r.backoff = time.Duration(u) * time.Second // #nosec G115 -- We clamp backoff below. } else if at, _ := http.ParseTime(after); !at.Before(now) { // An HTTP formatted future date-time was provided. r.backoff = at.Sub(now) } // Don't let their provided backoff exceed our max. - if max := baseBackoff * time.Duration(c.retries); // + if max := baseBackoff * time.Duration(c.retries); // #nosec G115 -- We control c.retries. r.backoff > max { r.backoff = max } diff --git a/internal/media/ffmpeg.go b/internal/media/ffmpeg.go index 693b6f490..b5dfdee70 100644 --- a/internal/media/ffmpeg.go +++ b/internal/media/ffmpeg.go @@ -21,6 +21,7 @@ "context" "encoding/json" "errors" + "math" "os" "path" "strconv" @@ -548,10 +549,18 @@ func (res *ffprobeResult) Process() (*result, error) { if p := strings.SplitN(str, "/", 2); len(p) == 2 { n, _ := strconv.ParseUint(p[0], 10, 32) d, _ := strconv.ParseUint(p[1], 10, 32) - num, den = uint32(n), uint32(d) + + if n > math.MaxUint32 || d > math.MaxUint32 { + return nil, gtserror.Newf("overflowed numerator or denominator") + } + num, den = uint32(n), uint32(d) // #nosec G115 -- Just checked. } else { n, _ := strconv.ParseUint(p[0], 10, 32) - num = uint32(n) + + if n > math.MaxUint32 { + return nil, gtserror.Newf("overflowed numerator") + } + num = uint32(n) // #nosec G115 -- Just checked. } // Set final divised framerate. diff --git a/internal/media/imaging.go b/internal/media/imaging.go index a9f73a066..23fd2f838 100644 --- a/internal/media/imaging.go +++ b/internal/media/imaging.go @@ -399,9 +399,9 @@ func (s *scanner) scan(x1, y1, x2, y2 int, dst []uint8) { g16 := uint16(s[1]) b16 := uint16(s[2]) a16 := uint16(a) - d[0] = uint8(r16 * 0xff / a16) - d[1] = uint8(g16 * 0xff / a16) - d[2] = uint8(b16 * 0xff / a16) + d[0] = uint8(r16 * 0xff / a16) // #nosec G115 -- Overflow desired. + d[1] = uint8(g16 * 0xff / a16) // #nosec G115 -- Overflow desired. + d[2] = uint8(b16 * 0xff / a16) // #nosec G115 -- Overflow desired. d[3] = a } j += 4 @@ -431,9 +431,9 @@ func (s *scanner) scan(x1, y1, x2, y2 int, dst []uint8) { g32 := uint32(s[2])<<8 | uint32(s[3]) b32 := uint32(s[4])<<8 | uint32(s[5]) a32 := uint32(s[6])<<8 | uint32(s[7]) - d[0] = uint8((r32 * 0xffff / a32) >> 8) - d[1] = uint8((g32 * 0xffff / a32) >> 8) - d[2] = uint8((b32 * 0xffff / a32) >> 8) + d[0] = uint8((r32 * 0xffff / a32) >> 8) // #nosec G115 -- Overflow desired. + d[1] = uint8((g32 * 0xffff / a32) >> 8) // #nosec G115 -- Overflow desired. + d[2] = uint8((b32 * 0xffff / a32) >> 8) // #nosec G115 -- Overflow desired. } d[3] = a j += 4 @@ -530,9 +530,9 @@ func (s *scanner) scan(x1, y1, x2, y2 int, dst []uint8) { } d := dst[j : j+4 : j+4] - d[0] = uint8(r) - d[1] = uint8(g) - d[2] = uint8(b) + d[0] = uint8(r) // #nosec G115 -- Overflow desired. + d[1] = uint8(g) // #nosec G115 -- Overflow desired. + d[2] = uint8(b) // #nosec G115 -- Overflow desired. d[3] = 0xff iy++ @@ -569,9 +569,9 @@ func (s *scanner) scan(x1, y1, x2, y2 int, dst []uint8) { d := dst[j : j+4 : j+4] switch a16 { case 0xffff: - d[0] = uint8(r16 >> 8) - d[1] = uint8(g16 >> 8) - d[2] = uint8(b16 >> 8) + d[0] = uint8(r16 >> 8) // #nosec G115 -- Overflow desired. + d[1] = uint8(g16 >> 8) // #nosec G115 -- Overflow desired. + d[2] = uint8(b16 >> 8) // #nosec G115 -- Overflow desired. d[3] = 0xff case 0: d[0] = 0 @@ -579,10 +579,10 @@ func (s *scanner) scan(x1, y1, x2, y2 int, dst []uint8) { d[2] = 0 d[3] = 0 default: - d[0] = uint8(((r16 * 0xffff) / a16) >> 8) - d[1] = uint8(((g16 * 0xffff) / a16) >> 8) - d[2] = uint8(((b16 * 0xffff) / a16) >> 8) - d[3] = uint8(a16 >> 8) + d[0] = uint8(((r16 * 0xffff) / a16) >> 8) // #nosec G115 -- Overflow desired. + d[1] = uint8(((g16 * 0xffff) / a16) >> 8) // #nosec G115 -- Overflow desired. + d[2] = uint8(((b16 * 0xffff) / a16) >> 8) // #nosec G115 -- Overflow desired. + d[3] = uint8(a16 >> 8) // #nosec G115 -- Overflow desired. } j += 4 } @@ -617,7 +617,7 @@ func clampFloat(x float64) uint8 { return 255 } if v > 0 { - return uint8(v) + return uint8(v) // #nosec G115 -- Just checked. } return 0 } diff --git a/internal/media/refetch.go b/internal/media/refetch.go index 5531f6d97..c467333c9 100644 --- a/internal/media/refetch.go +++ b/internal/media/refetch.go @@ -49,9 +49,6 @@ func (m *Manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM refetchIDs []string ) - // Get max supported remote emoji media size. - maxsz := config.GetMediaEmojiRemoteMaxSize() - // page through emojis 20 at a time, looking for those with missing images for { // Fetch next block of emojis from database @@ -111,8 +108,10 @@ func (m *Manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM continue } + // Get max supported remote emoji media size. + maxsz := int64(config.GetMediaEmojiRemoteMaxSize()) // #nosec G115 -- Already validated. dataFunc := func(ctx context.Context) (reader io.ReadCloser, err error) { - return dereferenceMedia(ctx, emojiImageIRI, int64(maxsz)) + return dereferenceMedia(ctx, emojiImageIRI, maxsz) } processingEmoji, err := m.UpdateEmoji(ctx, emoji, dataFunc, AdditionalEmojiInfo{ diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 58e52a992..a21b0c9d2 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -462,11 +462,11 @@ func (p *Processor) UpdateAvatar( gtserror.WithCode, ) { // Get maximum supported local media size. - maxsz := config.GetMediaLocalMaxSize() + maxsz := int64(config.GetMediaLocalMaxSize()) // #nosec G115 -- Already validated. // Ensure media within size bounds. - if avatar.Size > int64(maxsz) { - text := fmt.Sprintf("media exceeds configured max size: %s", maxsz) + if avatar.Size > maxsz { + text := fmt.Sprintf("media exceeds configured max size: %d", maxsz) return nil, gtserror.NewErrorBadRequest(errors.New(text), text) } @@ -478,7 +478,7 @@ func (p *Processor) UpdateAvatar( } // Wrap the multipart file reader to ensure is limited to max. - rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, int64(maxsz)) + rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, maxsz) // Write to instance storage. return p.c.StoreLocalMedia(ctx, @@ -507,11 +507,11 @@ func (p *Processor) UpdateHeader( gtserror.WithCode, ) { // Get maximum supported local media size. - maxsz := config.GetMediaLocalMaxSize() + maxsz := int64(config.GetMediaLocalMaxSize()) // #nosec G115 -- Already validated. // Ensure media within size bounds. - if header.Size > int64(maxsz) { - text := fmt.Sprintf("media exceeds configured max size: %s", maxsz) + if header.Size > maxsz { + text := fmt.Sprintf("media exceeds configured max size: %d", maxsz) return nil, gtserror.NewErrorBadRequest(errors.New(text), text) } @@ -523,7 +523,7 @@ func (p *Processor) UpdateHeader( } // Wrap the multipart file reader to ensure is limited to max. - rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, int64(maxsz)) + rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, maxsz) // Write to instance storage. return p.c.StoreLocalMedia(ctx, diff --git a/internal/processing/admin/emoji.go b/internal/processing/admin/emoji.go index 70e196b95..95744c4e5 100644 --- a/internal/processing/admin/emoji.go +++ b/internal/processing/admin/emoji.go @@ -45,11 +45,11 @@ func (p *Processor) EmojiCreate( ) (*apimodel.Emoji, gtserror.WithCode) { // Get maximum supported local emoji size. - maxsz := config.GetMediaEmojiLocalMaxSize() + maxsz := int64(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. // Ensure media within size bounds. - if form.Image.Size > int64(maxsz) { - text := fmt.Sprintf("emoji exceeds configured max size: %s", maxsz) + if form.Image.Size > maxsz { + text := fmt.Sprintf("emoji exceeds configured max size: %d", maxsz) return nil, gtserror.NewErrorBadRequest(errors.New(text), text) } @@ -61,7 +61,7 @@ func (p *Processor) EmojiCreate( } // Wrap the multipart file reader to ensure is limited to max. - rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, int64(maxsz)) + rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, maxsz) data := func(context.Context) (io.ReadCloser, error) { return rc, nil } @@ -441,11 +441,11 @@ func (p *Processor) emojiUpdateModify( // We can do both at the same time :) // Get maximum supported local emoji size. - maxsz := config.GetMediaEmojiLocalMaxSize() + maxsz := int64(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. // Ensure media within size bounds. - if image.Size > int64(maxsz) { - text := fmt.Sprintf("emoji exceeds configured max size: %s", maxsz) + if image.Size > maxsz { + text := fmt.Sprintf("emoji exceeds configured max size: %d", maxsz) return nil, gtserror.NewErrorBadRequest(errors.New(text), text) } @@ -457,7 +457,7 @@ func (p *Processor) emojiUpdateModify( } // Wrap the multipart file reader to ensure is limited to max. - rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, int64(maxsz)) + rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, maxsz) data := func(context.Context) (io.ReadCloser, error) { return rc, nil } diff --git a/internal/processing/media/create.go b/internal/processing/media/create.go index b3a7d6052..64e44d999 100644 --- a/internal/processing/media/create.go +++ b/internal/processing/media/create.go @@ -35,11 +35,11 @@ func (p *Processor) Create(ctx context.Context, account *gtsmodel.Account, form *apimodel.AttachmentRequest) (*apimodel.Attachment, gtserror.WithCode) { // Get maximum supported local media size. - maxsz := config.GetMediaLocalMaxSize() + maxsz := int64(config.GetMediaLocalMaxSize()) // #nosec G115 -- Already validated. // Ensure media within size bounds. - if form.File.Size > int64(maxsz) { - text := fmt.Sprintf("media exceeds configured max size: %s", maxsz) + if form.File.Size > maxsz { + text := fmt.Sprintf("media exceeds configured max size: %d", maxsz) return nil, gtserror.NewErrorBadRequest(errors.New(text), text) } @@ -58,7 +58,7 @@ func (p *Processor) Create(ctx context.Context, account *gtsmodel.Account, form } // Wrap the multipart file reader to ensure is limited to max. - rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, int64(maxsz)) + rc, _, _ := iotools.UpdateReadCloserLimit(mpfile, maxsz) // Create local media and write to instance storage. attachment, errWithCode := p.c.StoreLocalMedia(ctx, diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 4e76837cd..0cdf46fe4 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -647,7 +647,7 @@ func (c *Converter) AttachmentToAPIAttachment(ctx context.Context, media *gtsmod Size: toAPISize(media.FileMeta.Original.Width, media.FileMeta.Original.Height), FrameRate: toAPIFrameRate(media.FileMeta.Original.Framerate), Duration: util.PtrOrZero(media.FileMeta.Original.Duration), - Bitrate: int(util.PtrOrZero(media.FileMeta.Original.Bitrate)), + Bitrate: util.PtrOrZero(media.FileMeta.Original.Bitrate), } // Copy over local file URL. @@ -1551,9 +1551,9 @@ func (c *Converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Statuses.CharactersReservedPerURL = instanceStatusesCharactersReservedPerURL instance.Configuration.Statuses.SupportedMimeTypes = instanceStatusesSupportedMimeTypes instance.Configuration.MediaAttachments.SupportedMimeTypes = media.SupportedMIMETypes - instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) + instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.MediaAttachments.ImageMatrixLimit = instanceMediaAttachmentsImageMatrixLimit - instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) + instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.MediaAttachments.VideoFrameRateLimit = instanceMediaAttachmentsVideoFrameRateLimit instance.Configuration.MediaAttachments.VideoMatrixLimit = instanceMediaAttachmentsVideoMatrixLimit instance.Configuration.Polls.MaxOptions = config.GetStatusesPollMaxOptions() @@ -1563,7 +1563,7 @@ func (c *Converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS() instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags instance.Configuration.Accounts.MaxProfileFields = instanceAccountsMaxProfileFields - instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) + instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.OIDCEnabled = config.GetOIDCEnabled() // URLs @@ -1695,9 +1695,9 @@ func (c *Converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Statuses.CharactersReservedPerURL = instanceStatusesCharactersReservedPerURL instance.Configuration.Statuses.SupportedMimeTypes = instanceStatusesSupportedMimeTypes instance.Configuration.MediaAttachments.SupportedMimeTypes = media.SupportedMIMETypes - instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) + instance.Configuration.MediaAttachments.ImageSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.MediaAttachments.ImageMatrixLimit = instanceMediaAttachmentsImageMatrixLimit - instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) + instance.Configuration.MediaAttachments.VideoSizeLimit = int(config.GetMediaRemoteMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.MediaAttachments.VideoFrameRateLimit = instanceMediaAttachmentsVideoFrameRateLimit instance.Configuration.MediaAttachments.VideoMatrixLimit = instanceMediaAttachmentsVideoMatrixLimit instance.Configuration.Polls.MaxOptions = config.GetStatusesPollMaxOptions() @@ -1707,7 +1707,7 @@ func (c *Converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS() instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags instance.Configuration.Accounts.MaxProfileFields = instanceAccountsMaxProfileFields - instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) + instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated. instance.Configuration.OIDCEnabled = config.GetOIDCEnabled() // registrations