+3
-3
api/extra.go
+3
-3
api/extra.go
···
6
6
"net/url"
7
7
8
8
comatproto "github.com/bluesky-social/indigo/api/atproto"
9
+
"github.com/bluesky-social/indigo/did"
9
10
"github.com/bluesky-social/indigo/xrpc"
10
-
did "github.com/whyrusleeping/go-did"
11
11
otel "go.opentelemetry.io/otel"
12
12
)
13
13
14
-
func ResolveDidToHandle(ctx context.Context, xrpcc *xrpc.Client, pls *PLCServer, udid string) (string, string, error) {
14
+
func ResolveDidToHandle(ctx context.Context, xrpcc *xrpc.Client, res did.Resolver, udid string) (string, string, error) {
15
15
ctx, span := otel.Tracer("gosky").Start(ctx, "resolveDidToHandle")
16
16
defer span.End()
17
17
18
-
doc, err := pls.GetDocument(ctx, udid)
18
+
doc, err := res.GetDocument(ctx, udid)
19
19
if err != nil {
20
20
return "", "", err
21
21
}
+3
-3
bgs/bgs.go
+3
-3
bgs/bgs.go
···
18
18
comatproto "github.com/bluesky-social/indigo/api/atproto"
19
19
"github.com/bluesky-social/indigo/blobs"
20
20
"github.com/bluesky-social/indigo/carstore"
21
+
"github.com/bluesky-social/indigo/did"
21
22
"github.com/bluesky-social/indigo/events"
22
23
"github.com/bluesky-social/indigo/indexer"
23
24
lexutil "github.com/bluesky-social/indigo/lex/util"
24
25
"github.com/bluesky-social/indigo/models"
25
-
"github.com/bluesky-social/indigo/plc"
26
26
"github.com/bluesky-social/indigo/repomgr"
27
27
"github.com/bluesky-social/indigo/util"
28
28
bsutil "github.com/bluesky-social/indigo/util"
···
45
45
db *gorm.DB
46
46
slurper *Slurper
47
47
events *events.EventManager
48
-
didr plc.DidResolver
48
+
didr did.Resolver
49
49
50
50
blobs blobs.BlobStore
51
51
···
58
58
repoman *repomgr.RepoManager
59
59
}
60
60
61
-
func NewBGS(db *gorm.DB, ix *indexer.Indexer, repoman *repomgr.RepoManager, evtman *events.EventManager, didr plc.DidResolver, blobs blobs.BlobStore, ssl bool) (*BGS, error) {
61
+
func NewBGS(db *gorm.DB, ix *indexer.Indexer, repoman *repomgr.RepoManager, evtman *events.EventManager, didr did.Resolver, blobs blobs.BlobStore, ssl bool) (*BGS, error) {
62
62
db.AutoMigrate(User{})
63
63
db.AutoMigrate(AuthToken{})
64
64
db.AutoMigrate(models.PDS{})
+1
-1
cmd/gosky/admin.go
+1
-1
cmd/gosky/admin.go
+1
-1
cmd/gosky/main.go
+1
-1
cmd/gosky/main.go
+11
cmd/gosky/util/util.go
+11
cmd/gosky/util/util.go
···
10
10
"time"
11
11
12
12
"github.com/bluesky-social/indigo/api"
13
+
"github.com/bluesky-social/indigo/did"
13
14
"github.com/bluesky-social/indigo/xrpc"
14
15
homedir "github.com/mitchellh/go-homedir"
15
16
"github.com/urfave/cli/v2"
···
17
18
"gorm.io/driver/sqlite"
18
19
"gorm.io/gorm"
19
20
)
21
+
22
+
func GetDidResolver(cctx *cli.Context) did.Resolver {
23
+
mr := did.NewMultiResolver()
24
+
mr.AddHandler("plc", &api.PLCServer{
25
+
Host: cctx.String("plc"),
26
+
})
27
+
mr.AddHandler("web", &did.WebResolver{})
28
+
29
+
return mr
30
+
}
20
31
21
32
func GetPLCClient(cctx *cli.Context) *api.PLCServer {
22
33
return &api.PLCServer{
+7
did/alias.go
+7
did/alias.go
+42
did/multi.go
+42
did/multi.go
···
1
+
package did
2
+
3
+
import (
4
+
"context"
5
+
"fmt"
6
+
7
+
"github.com/whyrusleeping/go-did"
8
+
)
9
+
10
+
type Resolver interface {
11
+
GetDocument(ctx context.Context, didstr string) (*did.Document, error)
12
+
}
13
+
14
+
type MultiResolver struct {
15
+
handlers map[string]Resolver
16
+
}
17
+
18
+
func NewMultiResolver() *MultiResolver {
19
+
return &MultiResolver{
20
+
handlers: make(map[string]Resolver),
21
+
}
22
+
}
23
+
24
+
func (mr *MultiResolver) AddHandler(method string, res Resolver) {
25
+
mr.handlers[method] = res
26
+
}
27
+
28
+
func (mr *MultiResolver) GetDocument(ctx context.Context, didstr string) (*did.Document, error) {
29
+
pdid, err := did.ParseDID(didstr)
30
+
if err != nil {
31
+
return nil, err
32
+
}
33
+
34
+
method := pdid.Protocol()
35
+
36
+
res, ok := mr.handlers[method]
37
+
if !ok {
38
+
return nil, fmt.Errorf("unknown did method: %q", method)
39
+
}
40
+
41
+
return res.GetDocument(ctx, didstr)
42
+
}
+44
did/web.go
+44
did/web.go
···
1
+
package did
2
+
3
+
import (
4
+
"context"
5
+
"encoding/json"
6
+
"fmt"
7
+
"net/http"
8
+
"strings"
9
+
10
+
"github.com/whyrusleeping/go-did"
11
+
)
12
+
13
+
type WebResolver struct {
14
+
// TODO: cache? maybe at a different layer
15
+
}
16
+
17
+
func (wr *WebResolver) GetDocument(ctx context.Context, didstr string) (*Document, error) {
18
+
pdid, err := did.ParseDID(didstr)
19
+
if err != nil {
20
+
return nil, err
21
+
}
22
+
23
+
val := pdid.Value()
24
+
if strings.Contains(val, ":") {
25
+
return nil, fmt.Errorf("did:web resolver does not handle ports or documents at sub-paths")
26
+
}
27
+
28
+
resp, err := http.Get("https://" + val + "/.well-known/did.json")
29
+
if err != nil {
30
+
return nil, err
31
+
}
32
+
defer resp.Body.Close()
33
+
34
+
if resp.StatusCode != 200 {
35
+
return nil, fmt.Errorf("fetch did request failed (status %d): %s", resp.StatusCode, resp.Status)
36
+
}
37
+
38
+
var out did.Document
39
+
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
40
+
return nil, err
41
+
}
42
+
43
+
return &out, nil
44
+
}
+3
-1
go.mod
+3
-1
go.mod
···
34
34
github.com/stretchr/testify v1.8.2
35
35
github.com/urfave/cli/v2 v2.25.1
36
36
github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70
37
-
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220
37
+
github.com/whyrusleeping/go-did v0.0.0-20230526170049-82aaa4048458
38
38
go.opentelemetry.io/otel v1.14.0
39
39
go.opentelemetry.io/otel/exporters/jaeger v1.14.0
40
40
go.opentelemetry.io/otel/sdk v1.14.0
···
128
128
gopkg.in/yaml.v3 v3.0.1 // indirect
129
129
lukechampine.com/blake3 v1.1.7 // indirect
130
130
)
131
+
132
+
replace github.com/whyrusleeping/go-did => ../go-did
-2
go.sum
-2
go.sum
···
519
519
github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70 h1:iNBzUKTsJc9RqStEVX2VYgVHATTU39IuB7g0e8OPWXU=
520
520
github.com/whyrusleeping/cbor-gen v0.0.0-20230331140348-1f892b517e70/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
521
521
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
522
-
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220 h1:EO/9z3yDvx1van1/0esdcqhalZZQGRj3I1BPTWr5k3A=
523
-
github.com/whyrusleeping/go-did v0.0.0-20230301193428-2146016fc220/go.mod h1:qPtRyexGM5XMHFIfjH+EiA/A/1n2JakWEdMPC53pJAE=
524
522
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
525
523
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
526
524
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+3
-3
indexer/indexer.go
+3
-3
indexer/indexer.go
···
10
10
comatproto "github.com/bluesky-social/indigo/api/atproto"
11
11
bsky "github.com/bluesky-social/indigo/api/bsky"
12
12
"github.com/bluesky-social/indigo/carstore"
13
+
"github.com/bluesky-social/indigo/did"
13
14
"github.com/bluesky-social/indigo/events"
14
15
lexutil "github.com/bluesky-social/indigo/lex/util"
15
16
"github.com/bluesky-social/indigo/models"
16
17
"github.com/bluesky-social/indigo/notifs"
17
-
"github.com/bluesky-social/indigo/plc"
18
18
"github.com/bluesky-social/indigo/repomgr"
19
19
"github.com/bluesky-social/indigo/util"
20
20
"github.com/bluesky-social/indigo/xrpc"
···
34
34
35
35
notifman notifs.NotificationManager
36
36
events *events.EventManager
37
-
didr plc.DidResolver
37
+
didr did.Resolver
38
38
39
39
// TODO: i feel like the repomgr doesnt belong here
40
40
repomgr *repomgr.RepoManager
···
47
47
CreateExternalUser func(context.Context, string) (*models.ActorInfo, error)
48
48
}
49
49
50
-
func NewIndexer(db *gorm.DB, notifman notifs.NotificationManager, evtman *events.EventManager, didr plc.DidResolver, repoman *repomgr.RepoManager, crawl, aggregate bool) (*Indexer, error) {
50
+
func NewIndexer(db *gorm.DB, notifman notifs.NotificationManager, evtman *events.EventManager, didr did.Resolver, repoman *repomgr.RepoManager, crawl, aggregate bool) (*Indexer, error) {
51
51
db.AutoMigrate(&models.FeedPost{})
52
52
db.AutoMigrate(&models.ActorInfo{})
53
53
db.AutoMigrate(&models.FollowRecord{})
+3
-3
plc/caching.go
+3
-3
plc/caching.go
···
4
4
"context"
5
5
"time"
6
6
7
+
did "github.com/bluesky-social/indigo/did"
7
8
lru "github.com/hashicorp/golang-lru"
8
-
"github.com/whyrusleeping/go-did"
9
9
"go.opentelemetry.io/otel"
10
10
"go.opentelemetry.io/otel/attribute"
11
11
)
12
12
13
13
type CachingDidResolver struct {
14
-
res DidResolver
14
+
res did.Resolver
15
15
maxAge time.Duration
16
16
cache *lru.ARCCache
17
17
}
···
21
21
doc *did.Document
22
22
}
23
23
24
-
func NewCachingDidResolver(res DidResolver, maxAge time.Duration, size int) *CachingDidResolver {
24
+
func NewCachingDidResolver(res did.Resolver, maxAge time.Duration, size int) *CachingDidResolver {
25
25
c, err := lru.NewARC(size)
26
26
if err != nil {
27
27
panic(err)
+2
-5
plc/plc.go
+2
-5
plc/plc.go
···
3
3
import (
4
4
"context"
5
5
6
+
didres "github.com/bluesky-social/indigo/did"
6
7
"github.com/whyrusleeping/go-did"
7
8
)
8
9
9
10
type PLCClient interface {
10
-
DidResolver
11
+
didres.Resolver
11
12
CreateDID(ctx context.Context, sigkey *did.PrivKey, recovery string, handle string, service string) (string, error)
12
13
UpdateUserHandle(ctx context.Context, didstr string, nhandle string) error
13
14
}
14
-
15
-
type DidResolver interface {
16
-
GetDocument(ctx context.Context, didstr string) (*did.Document, error)
17
-
}