diff --git a/server/handle_proxy.go b/server/handle_proxy.go index 1a26b51..b166176 100644 --- a/server/handle_proxy.go +++ b/server/handle_proxy.go @@ -96,10 +96,23 @@ func (s *Server) handleProxy(e echo.Context) error { encheader := strings.TrimRight(base64.RawURLEncoding.EncodeToString(hj), "=") + // When proxying app.bsky.feed.getFeed the token is actually issued for the + // underlying feed generator and the app view passes it on. This allows the + // getFeed implementation to pass in the desired lxm and aud for the token + // and then just delegate to the general proxying logic + lxm, proxyTokenLxmExists := e.Get("proxyTokenLxm").(string) + if !proxyTokenLxmExists || lxm == "" { + lxm = pts[2] + } + aud, proxyTokenAudExists := e.Get("proxyTokenAud").(string) + if !proxyTokenAudExists || aud == "" { + aud = svcDid + } + payload := map[string]any{ "iss": repo.Repo.Did, "aud": svcDid, - "lxm": pts[2], + "lxm": lxm, "jti": uuid.NewString(), "exp": time.Now().Add(1 * time.Minute).UTC().Unix(), } diff --git a/server/handle_proxy_get_feed.go b/server/handle_proxy_get_feed.go new file mode 100644 index 0000000..2dbfb5f --- /dev/null +++ b/server/handle_proxy_get_feed.go @@ -0,0 +1,35 @@ +package server + +import ( + "github.com/Azure/go-autorest/autorest/to" + "github.com/bluesky-social/indigo/api/atproto" + "github.com/bluesky-social/indigo/api/bsky" + "github.com/bluesky-social/indigo/atproto/syntax" + "github.com/bluesky-social/indigo/xrpc" + "github.com/haileyok/cocoon/internal/helpers" + "github.com/labstack/echo/v4" +) + +func (s *Server) handleProxyBskyFeedGetFeed(e echo.Context) error { + feedUri, err := syntax.ParseATURI(e.QueryParam("feed")) + if err != nil { + return helpers.InputError(e, to.StringPtr("invalid feed uri")) + } + + appViewEndpoint, _, err := s.getAtprotoProxyEndpointFromRequest(e) + if err != nil { + e.Logger().Error("could not get atproto proxy", "error", err) + return helpers.ServerError(e, nil) + } + + appViewClient := xrpc.Client{ + Host: appViewEndpoint, + } + feedRecord, err := atproto.RepoGetRecord(e.Request().Context(), &appViewClient, "", feedUri.Collection().String(), feedUri.Authority().String(), feedUri.RecordKey().String()) + feedGeneratorDid := feedRecord.Value.Val.(*bsky.FeedGenerator).Did + + e.Set("proxyTokenLxm", "app.bsky.feed.getFeedSkeleton") + e.Set("proxyTokenAud", feedGeneratorDid) + + return s.handleProxy(e) +} diff --git a/server/server.go b/server/server.go index e0850f3..f0bdb27 100644 --- a/server/server.go +++ b/server/server.go @@ -486,6 +486,7 @@ func (s *Server) addRoutes() { // stupid silly endpoints s.echo.GET("/xrpc/app.bsky.actor.getPreferences", s.handleActorGetPreferences, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware) s.echo.POST("/xrpc/app.bsky.actor.putPreferences", s.handleActorPutPreferences, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware) + s.echo.GET("/xrpc/app.bsky.feed.getFeed", s.handleProxyBskyFeedGetFeed, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware) // admin routes s.echo.POST("/xrpc/com.atproto.server.createInviteCode", s.handleCreateInviteCode, s.handleAdminMiddleware)