From 830845b89e9b437aeac11938015f7b8f3b69b50e Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Sun, 19 Oct 2025 20:47:52 +0900 Subject: [PATCH] Revert "Revert "*/config: add PLC URL config option"" Change-Id: llxkporrpswnqyqlqyyqzwvqlqnrrnnw This reverts commit 55b06460d331a29b940dd06c7518d9fd0a911cd2. --- appview/config/config.go | 5 +++++ appview/state/state.go | 4 ++-- guard/guard.go | 12 +++++++++--- idresolver/resolver.go | 25 +++++++++++++++++-------- knotserver/config/config.go | 1 + knotserver/ingester.go | 10 +++------- knotserver/internal.go | 2 +- knotserver/router.go | 2 +- spindle/config/config.go | 1 + spindle/ingester.go | 10 +++------- spindle/server.go | 2 +- 11 files changed, 44 insertions(+), 30 deletions(-) diff --git a/appview/config/config.go b/appview/config/config.go index 2e030b11..31205fec 100644 --- a/appview/config/config.go +++ b/appview/config/config.go @@ -28,6 +28,10 @@ type OAuthConfig struct { Jwks string `env:"JWKS"` } +type PlcConfig struct { + PLCURL string `env:"URL, default=https://plc.directory"` +} + type JetstreamConfig struct { Endpoint string `env:"ENDPOINT, default=wss://jetstream1.us-east.bsky.network/subscribe"` } @@ -108,6 +112,7 @@ type Config struct { Avatar AvatarConfig `env:",prefix=TANGLED_AVATAR_"` OAuth OAuthConfig `env:",prefix=TANGLED_OAUTH_"` Redis RedisConfig `env:",prefix=TANGLED_REDIS_"` + Plc PlcConfig `env:",prefix=TANGLED_PLC_"` Pds PdsConfig `env:",prefix=TANGLED_PDS_"` Cloudflare Cloudflare `env:",prefix=TANGLED_CLOUDFLARE_"` Label LabelConfig `env:",prefix=TANGLED_LABEL_"` diff --git a/appview/state/state.go b/appview/state/state.go index d0c2834c..af2de114 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -70,10 +70,10 @@ func Make(ctx context.Context, config *config.Config) (*State, error) { return nil, fmt.Errorf("failed to create enforcer: %w", err) } - res, err := idresolver.RedisResolver(config.Redis.ToURL()) + res, err := idresolver.RedisResolver(config.Redis.ToURL(), config.Plc.PLCURL) if err != nil { logger.Error("failed to create redis resolver", "err", err) - res = idresolver.DefaultResolver() + res = idresolver.DefaultResolver(config.Plc.PLCURL) } posthog, err := posthog.NewWithConfig(config.Posthog.ApiKey, posthog.Config{Endpoint: config.Posthog.Endpoint}) diff --git a/guard/guard.go b/guard/guard.go index cb8c86fe..fda0578d 100644 --- a/guard/guard.go +++ b/guard/guard.go @@ -16,6 +16,7 @@ import ( securejoin "github.com/cyphar/filepath-securejoin" "github.com/urfave/cli/v3" "tangled.org/core/idresolver" + "tangled.org/core/knotserver/config" "tangled.org/core/log" ) @@ -57,6 +58,11 @@ func Command() *cli.Command { func Run(ctx context.Context, cmd *cli.Command) error { l := log.FromContext(ctx) + c, err := config.Load(ctx) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + incomingUser := cmd.String("user") gitDir := cmd.String("git-dir") logPath := cmd.String("log-path") @@ -122,7 +128,7 @@ func Run(ctx context.Context, cmd *cli.Command) error { } didOrHandle := components[0] - identity := resolveIdentity(ctx, l, didOrHandle) + identity := resolveIdentity(ctx, c, l, didOrHandle) did := identity.DID.String() repoName := components[1] qualifiedRepoName, _ := securejoin.SecureJoin(did, repoName) @@ -195,8 +201,8 @@ func Run(ctx context.Context, cmd *cli.Command) error { return nil } -func resolveIdentity(ctx context.Context, l *slog.Logger, didOrHandle string) *identity.Identity { - resolver := idresolver.DefaultResolver() +func resolveIdentity(ctx context.Context, c *config.Config, l *slog.Logger, didOrHandle string) *identity.Identity { + resolver := idresolver.DefaultResolver(c.Server.PlcUrl) ident, err := resolver.ResolveIdent(ctx, didOrHandle) if err != nil { l.Error("Error resolving handle", "error", err, "handle", didOrHandle) diff --git a/idresolver/resolver.go b/idresolver/resolver.go index cf67df55..6ec77097 100644 --- a/idresolver/resolver.go +++ b/idresolver/resolver.go @@ -17,9 +17,9 @@ type Resolver struct { directory identity.Directory } -func BaseDirectory() identity.Directory { +func BaseDirectory(plcUrl string) identity.Directory { base := identity.BaseDirectory{ - PLCURL: identity.DefaultPLCURL, + PLCURL: plcUrl, HTTPClient: http.Client{ Timeout: time.Second * 10, Transport: &http.Transport{ @@ -42,21 +42,30 @@ func BaseDirectory() identity.Directory { return &base } -func RedisDirectory(url string) (identity.Directory, error) { +func RedisDirectory(url, plcUrl string) (identity.Directory, error) { hitTTL := time.Hour * 24 errTTL := time.Second * 30 invalidHandleTTL := time.Minute * 5 - return redisdir.NewRedisDirectory(BaseDirectory(), url, hitTTL, errTTL, invalidHandleTTL, 10000) + return redisdir.NewRedisDirectory( + BaseDirectory(plcUrl), + url, + hitTTL, + errTTL, + invalidHandleTTL, + 10000, + ) } -func DefaultResolver() *Resolver { +func DefaultResolver(plcUrl string) *Resolver { + base := BaseDirectory(plcUrl) + cached := identity.NewCacheDirectory(base, 250_000, time.Hour*24, time.Minute*2, time.Minute*5) return &Resolver{ - directory: identity.DefaultDirectory(), + directory: &cached, } } -func RedisResolver(redisUrl string) (*Resolver, error) { - directory, err := RedisDirectory(redisUrl) +func RedisResolver(redisUrl, plcUrl string) (*Resolver, error) { + directory, err := RedisDirectory(redisUrl, plcUrl) if err != nil { return nil, err } diff --git a/knotserver/config/config.go b/knotserver/config/config.go index edaa95cb..ad1b80eb 100644 --- a/knotserver/config/config.go +++ b/knotserver/config/config.go @@ -19,6 +19,7 @@ type Server struct { InternalListenAddr string `env:"INTERNAL_LISTEN_ADDR, default=127.0.0.1:5444"` DBPath string `env:"DB_PATH, default=knotserver.db"` Hostname string `env:"HOSTNAME, required"` + PlcUrl string `env:"PLC_URL, default=plc.directory"` JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"` Owner string `env:"OWNER, required"` LogDids bool `env:"LOG_DIDS, default=true"` diff --git a/knotserver/ingester.go b/knotserver/ingester.go index 1a3413ec..fefcef6d 100644 --- a/knotserver/ingester.go +++ b/knotserver/ingester.go @@ -16,7 +16,6 @@ import ( "github.com/bluesky-social/jetstream/pkg/models" securejoin "github.com/cyphar/filepath-securejoin" "tangled.org/core/api/tangled" - "tangled.org/core/idresolver" "tangled.org/core/knotserver/db" "tangled.org/core/knotserver/git" "tangled.org/core/log" @@ -120,8 +119,7 @@ func (h *Knot) processPull(ctx context.Context, event *models.Event) error { } // resolve this aturi to extract the repo record - resolver := idresolver.DefaultResolver() - ident, err := resolver.ResolveIdent(ctx, repoAt.Authority().String()) + ident, err := h.resolver.ResolveIdent(ctx, repoAt.Authority().String()) if err != nil || ident.Handle.IsInvalidHandle() { return fmt.Errorf("failed to resolve handle: %w", err) } @@ -233,16 +231,14 @@ func (h *Knot) processCollaborator(ctx context.Context, event *models.Event) err return err } - resolver := idresolver.DefaultResolver() - - subjectId, err := resolver.ResolveIdent(ctx, record.Subject) + subjectId, err := h.resolver.ResolveIdent(ctx, record.Subject) if err != nil || subjectId.Handle.IsInvalidHandle() { return err } // TODO: fix this for good, we need to fetch the record here unfortunately // resolve this aturi to extract the repo record - owner, err := resolver.ResolveIdent(ctx, repoAt.Authority().String()) + owner, err := h.resolver.ResolveIdent(ctx, repoAt.Authority().String()) if err != nil || owner.Handle.IsInvalidHandle() { return fmt.Errorf("failed to resolve handle: %w", err) } diff --git a/knotserver/internal.go b/knotserver/internal.go index 3f5cc877..0408514e 100644 --- a/knotserver/internal.go +++ b/knotserver/internal.go @@ -145,7 +145,7 @@ func (h *InternalHandle) PostReceiveHook(w http.ResponseWriter, r *http.Request) func (h *InternalHandle) replyCompare(line git.PostReceiveLine, repoOwner string, gitRelativeDir string, repoName string, ctx context.Context) ([]string, error) { l := h.l.With("handler", "replyCompare") - userIdent, err := idresolver.DefaultResolver().ResolveIdent(ctx, repoOwner) + userIdent, err := idresolver.DefaultResolver(h.c.Server.PlcUrl).ResolveIdent(ctx, repoOwner) user := repoOwner if err != nil { l.Error("Failed to fetch user identity", "err", err) diff --git a/knotserver/router.go b/knotserver/router.go index 56fd9eac..6644a81f 100644 --- a/knotserver/router.go +++ b/knotserver/router.go @@ -36,7 +36,7 @@ func Setup(ctx context.Context, c *config.Config, db *db.DB, e *rbac.Enforcer, j l: log.FromContext(ctx), jc: jc, n: n, - resolver: idresolver.DefaultResolver(), + resolver: idresolver.DefaultResolver(c.Server.PlcUrl), } err := e.AddKnot(rbac.ThisServer) diff --git a/spindle/config/config.go b/spindle/config/config.go index 1fa6846a..65b9c2eb 100644 --- a/spindle/config/config.go +++ b/spindle/config/config.go @@ -13,6 +13,7 @@ type Server struct { DBPath string `env:"DB_PATH, default=spindle.db"` Hostname string `env:"HOSTNAME, required"` JetstreamEndpoint string `env:"JETSTREAM_ENDPOINT, default=wss://jetstream1.us-west.bsky.network/subscribe"` + PlcUrl string `env:"PLC_URL, default=plc.directory"` Dev bool `env:"DEV, default=false"` Owner string `env:"OWNER, required"` Secrets Secrets `env:",prefix=SECRETS_"` diff --git a/spindle/ingester.go b/spindle/ingester.go index 829ffde9..55a5cb81 100644 --- a/spindle/ingester.go +++ b/spindle/ingester.go @@ -9,7 +9,6 @@ import ( "tangled.org/core/api/tangled" "tangled.org/core/eventconsumer" - "tangled.org/core/idresolver" "tangled.org/core/rbac" "tangled.org/core/spindle/db" @@ -142,7 +141,6 @@ func (s *Spindle) ingestMember(_ context.Context, e *models.Event) error { func (s *Spindle) ingestRepo(ctx context.Context, e *models.Event) error { var err error did := e.Did - resolver := idresolver.DefaultResolver() l := s.l.With("component", "ingester", "record", tangled.RepoNSID) @@ -190,7 +188,7 @@ func (s *Spindle) ingestRepo(ctx context.Context, e *models.Event) error { } // add collaborators to rbac - owner, err := resolver.ResolveIdent(ctx, did) + owner, err := s.res.ResolveIdent(ctx, did) if err != nil || owner.Handle.IsInvalidHandle() { return err } @@ -225,9 +223,7 @@ func (s *Spindle) ingestCollaborator(ctx context.Context, e *models.Event) error return err } - resolver := idresolver.DefaultResolver() - - subjectId, err := resolver.ResolveIdent(ctx, record.Subject) + subjectId, err := s.res.ResolveIdent(ctx, record.Subject) if err != nil || subjectId.Handle.IsInvalidHandle() { return err } @@ -240,7 +236,7 @@ func (s *Spindle) ingestCollaborator(ctx context.Context, e *models.Event) error // TODO: get rid of this entirely // resolve this aturi to extract the repo record - owner, err := resolver.ResolveIdent(ctx, repoAt.Authority().String()) + owner, err := s.res.ResolveIdent(ctx, repoAt.Authority().String()) if err != nil || owner.Handle.IsInvalidHandle() { return fmt.Errorf("failed to resolve handle: %w", err) } diff --git a/spindle/server.go b/spindle/server.go index 1b989967..f329d17b 100644 --- a/spindle/server.go +++ b/spindle/server.go @@ -123,7 +123,7 @@ func Run(ctx context.Context) error { jc.AddDid(d) } - resolver := idresolver.DefaultResolver() + resolver := idresolver.DefaultResolver(cfg.Server.PlcUrl) spindle := Spindle{ jc: jc, -- 2.43.0