Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview,xrpc: rewrite RepoUploadBlob to accept content types

uploading a blob without the content type results in a 403
ScopeMissingError, but indigo does not let us specify one! rewriting the
API to allow specifying the blob mime type is a temporary fix until
upstream allows this.

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by tangled.org c2049613 c983de83

+38 -14
+8 -5
appview/pulls/pulls.go
··· 39 39 "tangled.org/core/rbac" 40 40 "tangled.org/core/tid" 41 41 "tangled.org/core/types" 42 + "tangled.org/core/xrpc" 42 43 43 44 comatproto "github.com/bluesky-social/indigo/api/atproto" 44 45 "github.com/bluesky-social/indigo/atproto/syntax" ··· 48 47 "github.com/go-chi/chi/v5" 49 48 "github.com/google/uuid" 50 49 ) 50 + 51 + const ApplicationGzip = "application/gzip" 51 52 52 53 type Pulls struct { 53 54 oauth *oauth.OAuth ··· 1230 1227 return 1231 1228 } 1232 1229 1233 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 1230 + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) 1234 1231 if err != nil { 1235 1232 log.Println("failed to upload patch", err) 1236 1233 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") ··· 1324 1321 // apply all record creations at once 1325 1322 var writes []*comatproto.RepoApplyWrites_Input_Writes_Elem 1326 1323 for _, p := range stack { 1327 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(p.LatestPatch())) 1324 + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(p.LatestPatch()), ApplicationGzip) 1328 1325 if err != nil { 1329 1326 log.Println("failed to upload patch blob", err) 1330 1327 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.") ··· 1874 1871 return 1875 1872 } 1876 1873 1877 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 1874 + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) 1878 1875 if err != nil { 1879 1876 log.Println("failed to upload patch blob", err) 1880 1877 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") ··· 2017 2014 return 2018 2015 } 2019 2016 2020 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 2017 + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) 2021 2018 if err != nil { 2022 2019 log.Println("failed to upload patch blob", err) 2023 2020 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.") ··· 2059 2056 return 2060 2057 } 2061 2058 2062 - blob, err := comatproto.RepoUploadBlob(r.Context(), client, gz(patch)) 2059 + blob, err := xrpc.RepoUploadBlob(r.Context(), client, gz(patch), ApplicationGzip) 2063 2060 if err != nil { 2064 2061 log.Println("failed to upload patch blob", err) 2065 2062 s.pages.Notice(w, "resubmit-error", "Failed to update pull request on the PDS. Try again later.")
+5 -4
appview/repo/artifact.go
··· 18 18 "tangled.org/core/orm" 19 19 "tangled.org/core/tid" 20 20 "tangled.org/core/types" 21 + "tangled.org/core/xrpc" 21 22 22 23 comatproto "github.com/bluesky-social/indigo/api/atproto" 23 24 lexutil "github.com/bluesky-social/indigo/lex/util" ··· 47 46 return 48 47 } 49 48 50 - file, handler, err := r.FormFile("artifact") 49 + file, header, err := r.FormFile("artifact") 51 50 if err != nil { 52 51 log.Println("failed to upload artifact", err) 53 52 rp.pages.Notice(w, "upload", "failed to upload artifact") ··· 62 61 return 63 62 } 64 63 65 - uploadBlobResp, err := comatproto.RepoUploadBlob(r.Context(), client, file) 64 + uploadBlobResp, err := xrpc.RepoUploadBlob(r.Context(), client, file, header.Header.Get("Content-Type")) 66 65 if err != nil { 67 66 log.Println("failed to upload blob", err) 68 67 rp.pages.Notice(w, "upload", "Failed to upload blob to your PDS. Try again later.") ··· 82 81 Val: &tangled.RepoArtifact{ 83 82 Artifact: uploadBlobResp.Blob, 84 83 CreatedAt: createdAt.Format(time.RFC3339), 85 - Name: handler.Filename, 84 + Name: header.Filename, 86 85 Repo: f.RepoAt().String(), 87 86 Tag: tag.Tag.Hash[:], 88 87 }, ··· 111 110 Tag: tag.Tag.Hash, 112 111 CreatedAt: createdAt, 113 112 BlobCid: cid.Cid(uploadBlobResp.Blob.Ref), 114 - Name: handler.Filename, 113 + Name: header.Filename, 115 114 Size: uint64(uploadBlobResp.Blob.Size), 116 115 MimeType: uploadBlobResp.Blob.MimeType, 117 116 }
+6 -5
appview/state/profile.go
··· 20 20 "tangled.org/core/appview/models" 21 21 "tangled.org/core/appview/pages" 22 22 "tangled.org/core/orm" 23 + "tangled.org/core/xrpc" 23 24 ) 24 25 25 26 func (s *State) Profile(w http.ResponseWriter, r *http.Request) { ··· 742 741 return 743 742 } 744 743 745 - file, handler, err := r.FormFile("avatar") 744 + file, header, err := r.FormFile("avatar") 746 745 if err != nil { 747 746 l.Error("failed to read avatar file", "err", err) 748 747 s.pages.Notice(w, "avatar-error", "Failed to read avatar file") ··· 750 749 } 751 750 defer file.Close() 752 751 753 - if handler.Size > 1000000 { 754 - l.Warn("avatar file too large", "size", handler.Size) 752 + if header.Size > 1000000 { 753 + l.Warn("avatar file too large", "size", header.Size) 755 754 s.pages.Notice(w, "avatar-error", "Avatar file too large (max 1MB)") 756 755 return 757 756 } 758 757 759 - contentType := handler.Header.Get("Content-Type") 758 + contentType := header.Header.Get("Content-Type") 760 759 if contentType != "image/png" && contentType != "image/jpeg" { 761 760 l.Warn("invalid image type", "contentType", contentType) 762 761 s.pages.Notice(w, "avatar-error", "Invalid image type (only PNG and JPEG allowed)") ··· 770 769 return 771 770 } 772 771 773 - uploadBlobResp, err := comatproto.RepoUploadBlob(r.Context(), client, file) 772 + uploadBlobResp, err := xrpc.RepoUploadBlob(r.Context(), client, file, header.Header.Get("Content-Type")) 774 773 if err != nil { 775 774 l.Error("failed to upload avatar blob", "err", err) 776 775 s.pages.Notice(w, "avatar-error", "Failed to upload avatar to your PDS")
+19
xrpc/blob.go
··· 1 + package xrpc 2 + 3 + import ( 4 + "context" 5 + "io" 6 + 7 + comatproto "github.com/bluesky-social/indigo/api/atproto" 8 + "github.com/bluesky-social/indigo/lex/util" 9 + ) 10 + 11 + // RepoUploadBlob calls the XRPC method "com.atproto.repo.uploadBlob". 12 + func RepoUploadBlob(ctx context.Context, c util.LexClient, input io.Reader, contentType string) (*comatproto.RepoUploadBlob_Output, error) { 13 + var out comatproto.RepoUploadBlob_Output 14 + if err := c.LexDo(ctx, util.Procedure, contentType, "com.atproto.repo.uploadBlob", nil, input, &out); err != nil { 15 + return nil, err 16 + } 17 + 18 + return &out, nil 19 + }