forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

fix resolver caching

Changed files
+66 -50
appview
cmd
repoguard
knotserver
-11
appview/auth/auth.go
···
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"
···
func Make() (*Auth, error) {
store := sessions.NewCookieStore([]byte(appview.SessionCookieSecret))
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) {
···
comatproto "github.com/bluesky-social/indigo/api/atproto"
"github.com/bluesky-social/indigo/atproto/identity"
"github.com/bluesky-social/indigo/xrpc"
"github.com/gorilla/sessions"
"github.com/sotangled/tangled/appview"
···
func Make() (*Auth, error) {
store := sessions.NewCookieStore([]byte(appview.SessionCookieSecret))
return &Auth{store}, nil
}
func (a *Auth) CreateInitialSession(ctx context.Context, resolved *identity.Identity, appPassword string) (*comatproto.ServerCreateSession_Output, error) {
+27
appview/resolver.go
···
···
+
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)
+
}
+20 -14
appview/state/middleware.go
···
})
}
-
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
-
}
-
ctx := context.WithValue(req.Context(), "resolvedId", *id)
-
next.ServeHTTP(w, req.WithContext(ctx))
-
})
}
func ResolveRepoKnot(s *State) Middleware {
···
})
}
+
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")
+
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 {
+14 -6
appview/state/state.go
···
enforcer *rbac.Enforcer
tidClock *syntax.TIDClock
pages *pages.Pages
}
func Make() (*State, error) {
···
pgs := pages.NewPages()
-
return &State{db, auth, enforcer, clock, pgs}, nil
}
func (s *State) TID() string {
···
fmt.Println("handle", handle)
fmt.Println("app_password", appPassword)
-
resolved, err := auth.ResolveIdent(ctx, handle)
if err != nil {
log.Printf("resolving identity: %s", err)
http.Redirect(w, r, "/login", http.StatusSeeOther)
···
return
}
-
id, err := auth.ResolveIdent(r.Context(), user)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
···
return
}
-
memberIdent, err := auth.ResolveIdent(r.Context(), memberDid)
if err != nil {
w.Write([]byte("failed to resolve member did to a handle"))
return
···
return
}
-
ident, err := auth.ResolveIdent(r.Context(), didOrHandle)
if err != nil {
log.Printf("resolving identity: %s", err)
w.WriteHeader(http.StatusNotFound)
···
// strip @ from user
r.Use(StripLeadingAt)
-
r.With(ResolveIdent).Route("/{user}", func(r chi.Router) {
r.Get("/", s.ProfilePage)
r.With(ResolveRepoKnot(s)).Route("/{repo}", func(r chi.Router) {
r.Get("/", s.RepoIndex)
···
enforcer *rbac.Enforcer
tidClock *syntax.TIDClock
pages *pages.Pages
+
resolver *appview.Resolver
}
func Make() (*State, error) {
···
pgs := pages.NewPages()
+
resolver := appview.NewResolver()
+
+
state := &State{
+
db,
+
auth, enforcer, clock, pgs, resolver,
+
}
+
+
return state, nil
}
func (s *State) TID() string {
···
fmt.Println("handle", handle)
fmt.Println("app_password", appPassword)
+
resolved, err := s.resolver.ResolveIdent(ctx, handle)
if err != nil {
log.Printf("resolving identity: %s", err)
http.Redirect(w, r, "/login", http.StatusSeeOther)
···
return
}
+
id, err := s.resolver.ResolveIdent(r.Context(), user)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
···
return
}
+
memberIdent, err := s.resolver.ResolveIdent(r.Context(), memberDid)
if err != nil {
w.Write([]byte("failed to resolve member did to a handle"))
return
···
return
}
+
ident, err := s.resolver.ResolveIdent(r.Context(), didOrHandle)
if err != nil {
log.Printf("resolving identity: %s", err)
w.WriteHeader(http.StatusNotFound)
···
// strip @ from user
r.Use(StripLeadingAt)
+
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)
+3 -17
cmd/repoguard/main.go
···
"net/url"
"os"
"os/exec"
-
"path"
"path/filepath"
"strings"
"time"
-
"github.com/sotangled/tangled/appview/auth"
)
var (
···
}
func resolveToDid(didOrHandle string) string {
-
ident, err := auth.ResolveIdent(context.Background(), didOrHandle)
if err != nil {
exitWithLog(fmt.Sprintf("error resolving handle: %v", err))
}
// did:plc:foobarbaz/repo
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() {
···
"net/url"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
+
"github.com/sotangled/tangled/appview"
)
var (
···
}
func resolveToDid(didOrHandle string) string {
+
resolver := appview.NewResolver()
+
ident, err := resolver.ResolveIdent(context.Background(), didOrHandle)
if err != nil {
exitWithLog(fmt.Sprintf("error resolving handle: %v", err))
}
// did:plc:foobarbaz/repo
return ident.DID.String()
}
func initLogger() {
+2 -2
knotserver/file.go
···
"net/http"
"strings"
-
"github.com/sotangled/tangled/knotserver/git"
)
-
func (h *Handle) listFiles(files []git.NiceTree, data map[string]any, w http.ResponseWriter) {
data["files"] = files
writeJSON(w, data)
···
"net/http"
"strings"
+
"github.com/sotangled/tangled/types"
)
+
func (h *Handle) listFiles(files []types.NiceTree, data map[string]any, w http.ResponseWriter) {
data["files"] = files
writeJSON(w, data)