From a506c9ff72a092b45033a8ed6efe9813191fdb6e Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Feb 2025 18:01:43 +0000 Subject: [PATCH] fix resolver caching --- appview/auth/auth.go | 11 ----------- appview/resolver.go | 27 +++++++++++++++++++++++++++ appview/state/middleware.go | 36 +++++++++++++++++++++--------------- appview/state/state.go | 20 ++++++++++++++------ cmd/repoguard/main.go | 20 +++----------------- knotserver/file.go | 4 ++-- 6 files changed, 67 insertions(+), 51 deletions(-) create mode 100644 appview/resolver.go diff --git a/appview/auth/auth.go b/appview/auth/auth.go index 05d0e4b3..3d713d96 100644 --- a/appview/auth/auth.go +++ b/appview/auth/auth.go @@ -8,7 +8,6 @@ import ( comatproto "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/atproto/identity" - "github.com/bluesky-social/indigo/atproto/syntax" "github.com/bluesky-social/indigo/xrpc" "github.com/gorilla/sessions" "github.com/sotangled/tangled/appview" @@ -33,16 +32,6 @@ func Make() (*Auth, error) { return &Auth{store}, nil } -func ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { - id, err := syntax.ParseAtIdentifier(arg) - if err != nil { - return nil, err - } - - dir := identity.DefaultDirectory() - return dir.Lookup(ctx, *id) -} - func (a *Auth) CreateInitialSession(ctx context.Context, resolved *identity.Identity, appPassword string) (*comatproto.ServerCreateSession_Output, error) { pdsUrl := resolved.PDSEndpoint() diff --git a/appview/resolver.go b/appview/resolver.go new file mode 100644 index 00000000..409d68bb --- /dev/null +++ b/appview/resolver.go @@ -0,0 +1,27 @@ +package appview + +import ( + "context" + + "github.com/bluesky-social/indigo/atproto/identity" + "github.com/bluesky-social/indigo/atproto/syntax" +) + +type Resolver struct { + directory identity.Directory +} + +func NewResolver() *Resolver { + return &Resolver{ + directory: identity.DefaultDirectory(), + } +} + +func (r *Resolver) ResolveIdent(ctx context.Context, arg string) (*identity.Identity, error) { + id, err := syntax.ParseAtIdentifier(arg) + if err != nil { + return nil, err + } + + return r.directory.Lookup(ctx, *id) +} diff --git a/appview/state/middleware.go b/appview/state/middleware.go index a9879d48..607662f5 100644 --- a/appview/state/middleware.go +++ b/appview/state/middleware.go @@ -113,22 +113,28 @@ func StripLeadingAt(next http.Handler) http.Handler { }) } -func ResolveIdent(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - didOrHandle := chi.URLParam(req, "user") - - log.Println(didOrHandle) - id, err := auth.ResolveIdent(req.Context(), didOrHandle) - if err != nil { - // invalid did or handle - log.Println("failed to resolve did/handle") - w.WriteHeader(http.StatusNotFound) - return - } +func ResolveIdent(s *State) Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + start := time.Now() + didOrHandle := chi.URLParam(req, "user") - ctx := context.WithValue(req.Context(), "resolvedId", *id) - next.ServeHTTP(w, req.WithContext(ctx)) - }) + log.Println(didOrHandle) + id, err := s.resolver.ResolveIdent(req.Context(), didOrHandle) + if err != nil { + // invalid did or handle + log.Println("failed to resolve did/handle") + w.WriteHeader(http.StatusNotFound) + return + } + + ctx := context.WithValue(req.Context(), "resolvedId", *id) + + elapsed := time.Since(start) + log.Println("Execution time:", elapsed) + next.ServeHTTP(w, req.WithContext(ctx)) + }) + } } func ResolveRepoKnot(s *State) Middleware { diff --git a/appview/state/state.go b/appview/state/state.go index e10d11b5..e3b57d94 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -30,6 +30,7 @@ type State struct { enforcer *rbac.Enforcer tidClock *syntax.TIDClock pages *pages.Pages + resolver *appview.Resolver } func Make() (*State, error) { @@ -52,7 +53,14 @@ func Make() (*State, error) { pgs := pages.NewPages() - return &State{db, auth, enforcer, clock, pgs}, nil + resolver := appview.NewResolver() + + state := &State{ + db, + auth, enforcer, clock, pgs, resolver, + } + + return state, nil } func (s *State) TID() string { @@ -76,7 +84,7 @@ func (s *State) Login(w http.ResponseWriter, r *http.Request) { fmt.Println("handle", handle) fmt.Println("app_password", appPassword) - resolved, err := auth.ResolveIdent(ctx, handle) + resolved, err := s.resolver.ResolveIdent(ctx, handle) if err != nil { log.Printf("resolving identity: %s", err) http.Redirect(w, r, "/login", http.StatusSeeOther) @@ -169,7 +177,7 @@ func (s *State) Keys(w http.ResponseWriter, r *http.Request) { return } - id, err := auth.ResolveIdent(r.Context(), user) + id, err := s.resolver.ResolveIdent(r.Context(), user) if err != nil { w.WriteHeader(http.StatusInternalServerError) return @@ -415,7 +423,7 @@ func (s *State) AddMember(w http.ResponseWriter, r *http.Request) { return } - memberIdent, err := auth.ResolveIdent(r.Context(), memberDid) + memberIdent, err := s.resolver.ResolveIdent(r.Context(), memberDid) if err != nil { w.Write([]byte("failed to resolve member did to a handle")) return @@ -556,7 +564,7 @@ func (s *State) ProfilePage(w http.ResponseWriter, r *http.Request) { return } - ident, err := auth.ResolveIdent(r.Context(), didOrHandle) + ident, err := s.resolver.ResolveIdent(r.Context(), didOrHandle) if err != nil { log.Printf("resolving identity: %s", err) w.WriteHeader(http.StatusNotFound) @@ -597,7 +605,7 @@ func (s *State) UserRouter() http.Handler { // strip @ from user r.Use(StripLeadingAt) - r.With(ResolveIdent).Route("/{user}", func(r chi.Router) { + r.With(ResolveIdent(s)).Route("/{user}", func(r chi.Router) { r.Get("/", s.ProfilePage) r.With(ResolveRepoKnot(s)).Route("/{repo}", func(r chi.Router) { r.Get("/", s.RepoIndex) diff --git a/cmd/repoguard/main.go b/cmd/repoguard/main.go index 53e195d3..0ebe8ffc 100644 --- a/cmd/repoguard/main.go +++ b/cmd/repoguard/main.go @@ -9,12 +9,11 @@ import ( "net/url" "os" "os/exec" - "path" "path/filepath" "strings" "time" - "github.com/sotangled/tangled/appview/auth" + "github.com/sotangled/tangled/appview" ) var ( @@ -136,7 +135,8 @@ func main() { } func resolveToDid(didOrHandle string) string { - ident, err := auth.ResolveIdent(context.Background(), didOrHandle) + resolver := appview.NewResolver() + ident, err := resolver.ResolveIdent(context.Background(), didOrHandle) if err != nil { exitWithLog(fmt.Sprintf("error resolving handle: %v", err)) } @@ -145,20 +145,6 @@ func resolveToDid(didOrHandle string) string { return ident.DID.String() } -func handleToDid(handlePath string) string { - handle := path.Dir(handlePath) - - ident, err := auth.ResolveIdent(context.Background(), handle) - if err != nil { - exitWithLog(fmt.Sprintf("error resolving handle: %v", err)) - } - - // did:plc:foobarbaz/repo - didPath := filepath.Join(ident.DID.String(), path.Base(handlePath)) - - return didPath -} - func initLogger() { var err error logFile, err = os.OpenFile(*logPathFlag, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) diff --git a/knotserver/file.go b/knotserver/file.go index 31064894..d10334a9 100644 --- a/knotserver/file.go +++ b/knotserver/file.go @@ -7,10 +7,10 @@ import ( "net/http" "strings" - "github.com/sotangled/tangled/knotserver/git" + "github.com/sotangled/tangled/types" ) -func (h *Handle) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) { +func (h *Handle) listFiles(files []types.NiceTree, data map[string]any, w http.ResponseWriter) { data["files"] = files writeJSON(w, data) -- 2.51.2