+6
-6
appview/issues/issues.go
+6
-6
appview/issues/issues.go
···
16
16
"github.com/go-chi/chi/v5"
17
17
18
18
"tangled.sh/tangled.sh/core/api/tangled"
19
-
"tangled.sh/tangled.sh/core/appview"
20
19
"tangled.sh/tangled.sh/core/appview/config"
21
20
"tangled.sh/tangled.sh/core/appview/db"
22
21
"tangled.sh/tangled.sh/core/appview/idresolver"
···
25
24
"tangled.sh/tangled.sh/core/appview/pages"
26
25
"tangled.sh/tangled.sh/core/appview/pagination"
27
26
"tangled.sh/tangled.sh/core/appview/reporesolver"
27
+
"tangled.sh/tangled.sh/core/tid"
28
28
)
29
29
30
30
type Issues struct {
···
120
120
DidHandleMap: didHandleMap,
121
121
122
122
OrderedReactionKinds: db.OrderedReactionKinds,
123
-
Reactions: reactionCountMap,
124
-
UserReacted: userReactions,
123
+
Reactions: reactionCountMap,
124
+
UserReacted: userReactions,
125
125
})
126
126
127
127
}
···
171
171
_, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
172
172
Collection: tangled.RepoIssueStateNSID,
173
173
Repo: user.Did,
174
-
Rkey: appview.TID(),
174
+
Rkey: tid.TID(),
175
175
Record: &lexutil.LexiconTypeDecoder{
176
176
Val: &tangled.RepoIssueState{
177
177
Issue: issue.IssueAt,
···
275
275
}
276
276
277
277
commentId := mathrand.IntN(1000000)
278
-
rkey := appview.TID()
278
+
rkey := tid.TID()
279
279
280
280
err := db.NewIssueComment(rp.db, &db.Comment{
281
281
OwnerDid: user.Did,
···
726
726
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
727
727
Collection: tangled.RepoIssueNSID,
728
728
Repo: user.Did,
729
-
Rkey: appview.TID(),
729
+
Rkey: tid.TID(),
730
730
Record: &lexutil.LexiconTypeDecoder{
731
731
Val: &tangled.RepoIssue{
732
732
Repo: atUri,
+2
-2
appview/knots/knots.go
+2
-2
appview/knots/knots.go
···
13
13
14
14
"github.com/go-chi/chi/v5"
15
15
"tangled.sh/tangled.sh/core/api/tangled"
16
-
"tangled.sh/tangled.sh/core/appview"
17
16
"tangled.sh/tangled.sh/core/appview/config"
18
17
"tangled.sh/tangled.sh/core/appview/db"
19
18
"tangled.sh/tangled.sh/core/appview/idresolver"
···
23
22
"tangled.sh/tangled.sh/core/eventconsumer"
24
23
"tangled.sh/tangled.sh/core/knotclient"
25
24
"tangled.sh/tangled.sh/core/rbac"
25
+
"tangled.sh/tangled.sh/core/tid"
26
26
27
27
comatproto "github.com/bluesky-social/indigo/api/atproto"
28
28
lexutil "github.com/bluesky-social/indigo/lex/util"
···
436
436
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
437
437
Collection: tangled.KnotMemberNSID,
438
438
Repo: currentUser.Did,
439
-
Rkey: appview.TID(),
439
+
Rkey: tid.TID(),
440
440
Record: &lexutil.LexiconTypeDecoder{
441
441
Val: &tangled.KnotMember{
442
442
Subject: subjectIdentity.DID.String(),
+4
-4
appview/pulls/pulls.go
+4
-4
appview/pulls/pulls.go
···
14
14
"time"
15
15
16
16
"tangled.sh/tangled.sh/core/api/tangled"
17
-
"tangled.sh/tangled.sh/core/appview"
18
17
"tangled.sh/tangled.sh/core/appview/config"
19
18
"tangled.sh/tangled.sh/core/appview/db"
20
19
"tangled.sh/tangled.sh/core/appview/idresolver"
···
24
23
"tangled.sh/tangled.sh/core/appview/reporesolver"
25
24
"tangled.sh/tangled.sh/core/knotclient"
26
25
"tangled.sh/tangled.sh/core/patchutil"
26
+
"tangled.sh/tangled.sh/core/tid"
27
27
"tangled.sh/tangled.sh/core/types"
28
28
29
29
"github.com/bluekeyes/go-gitdiff/gitdiff"
···
668
668
atResp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
669
669
Collection: tangled.RepoPullCommentNSID,
670
670
Repo: user.Did,
671
-
Rkey: appview.TID(),
671
+
Rkey: tid.TID(),
672
672
Record: &lexutil.LexiconTypeDecoder{
673
673
Val: &tangled.RepoPullComment{
674
674
Repo: &atUri,
···
1038
1038
body = formatPatches[0].Body
1039
1039
}
1040
1040
1041
-
rkey := appview.TID()
1041
+
rkey := tid.TID()
1042
1042
initialSubmission := db.PullSubmission{
1043
1043
Patch: patch,
1044
1044
SourceRev: sourceRev,
···
2168
2168
2169
2169
title := fp.Title
2170
2170
body := fp.Body
2171
-
rkey := appview.TID()
2171
+
rkey := tid.TID()
2172
2172
2173
2173
initialSubmission := db.PullSubmission{
2174
2174
Patch: fp.Raw,
+2
-2
appview/repo/artifact.go
+2
-2
appview/repo/artifact.go
···
14
14
"github.com/go-git/go-git/v5/plumbing"
15
15
"github.com/ipfs/go-cid"
16
16
"tangled.sh/tangled.sh/core/api/tangled"
17
-
"tangled.sh/tangled.sh/core/appview"
18
17
"tangled.sh/tangled.sh/core/appview/db"
19
18
"tangled.sh/tangled.sh/core/appview/pages"
20
19
"tangled.sh/tangled.sh/core/appview/reporesolver"
21
20
"tangled.sh/tangled.sh/core/knotclient"
21
+
"tangled.sh/tangled.sh/core/tid"
22
22
"tangled.sh/tangled.sh/core/types"
23
23
)
24
24
···
64
64
65
65
log.Println("uploaded blob", humanize.Bytes(uint64(uploadBlobResp.Blob.Size)), uploadBlobResp.Blob.Ref.String())
66
66
67
-
rkey := appview.TID()
67
+
rkey := tid.TID()
68
68
createdAt := time.Now()
69
69
70
70
putRecordResp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
+2
-2
appview/repo/repo.go
+2
-2
appview/repo/repo.go
···
16
16
"time"
17
17
18
18
"tangled.sh/tangled.sh/core/api/tangled"
19
-
"tangled.sh/tangled.sh/core/appview"
20
19
"tangled.sh/tangled.sh/core/appview/commitverify"
21
20
"tangled.sh/tangled.sh/core/appview/config"
22
21
"tangled.sh/tangled.sh/core/appview/db"
···
30
29
"tangled.sh/tangled.sh/core/knotclient"
31
30
"tangled.sh/tangled.sh/core/patchutil"
32
31
"tangled.sh/tangled.sh/core/rbac"
32
+
"tangled.sh/tangled.sh/core/tid"
33
33
"tangled.sh/tangled.sh/core/types"
34
34
35
35
securejoin "github.com/cyphar/filepath-securejoin"
···
1088
1088
forkSourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName)
1089
1089
sourceAt := f.RepoAt.String()
1090
1090
1091
-
rkey := appview.TID()
1091
+
rkey := tid.TID()
1092
1092
repo := &db.Repo{
1093
1093
Did: user.Did,
1094
1094
Name: forkName,
+2
-2
appview/settings/settings.go
+2
-2
appview/settings/settings.go
···
12
12
13
13
"github.com/go-chi/chi/v5"
14
14
"tangled.sh/tangled.sh/core/api/tangled"
15
-
"tangled.sh/tangled.sh/core/appview"
16
15
"tangled.sh/tangled.sh/core/appview/config"
17
16
"tangled.sh/tangled.sh/core/appview/db"
18
17
"tangled.sh/tangled.sh/core/appview/email"
19
18
"tangled.sh/tangled.sh/core/appview/middleware"
20
19
"tangled.sh/tangled.sh/core/appview/oauth"
21
20
"tangled.sh/tangled.sh/core/appview/pages"
21
+
"tangled.sh/tangled.sh/core/tid"
22
22
23
23
comatproto "github.com/bluesky-social/indigo/api/atproto"
24
24
lexutil "github.com/bluesky-social/indigo/lex/util"
···
366
366
return
367
367
}
368
368
369
-
rkey := appview.TID()
369
+
rkey := tid.TID()
370
370
371
371
tx, err := s.Db.Begin()
372
372
if err != nil {
+2
-2
appview/spindles/spindles.go
+2
-2
appview/spindles/spindles.go
···
10
10
11
11
"github.com/go-chi/chi/v5"
12
12
"tangled.sh/tangled.sh/core/api/tangled"
13
-
"tangled.sh/tangled.sh/core/appview"
14
13
"tangled.sh/tangled.sh/core/appview/config"
15
14
"tangled.sh/tangled.sh/core/appview/db"
16
15
"tangled.sh/tangled.sh/core/appview/idresolver"
···
19
18
"tangled.sh/tangled.sh/core/appview/pages"
20
19
verify "tangled.sh/tangled.sh/core/appview/spindleverify"
21
20
"tangled.sh/tangled.sh/core/rbac"
21
+
"tangled.sh/tangled.sh/core/tid"
22
22
23
23
comatproto "github.com/bluesky-social/indigo/api/atproto"
24
24
"github.com/bluesky-social/indigo/atproto/syntax"
···
524
524
s.Enforcer.E.LoadPolicy()
525
525
}()
526
526
527
-
rkey := appview.TID()
527
+
rkey := tid.TID()
528
528
529
529
// add member to db
530
530
if err = db.AddSpindleMember(tx, db.SpindleMember{
+4
-4
appview/state/follow.go
+4
-4
appview/state/follow.go
···
8
8
comatproto "github.com/bluesky-social/indigo/api/atproto"
9
9
lexutil "github.com/bluesky-social/indigo/lex/util"
10
10
"tangled.sh/tangled.sh/core/api/tangled"
11
-
"tangled.sh/tangled.sh/core/appview"
12
11
"tangled.sh/tangled.sh/core/appview/db"
13
12
"tangled.sh/tangled.sh/core/appview/pages"
13
+
"tangled.sh/tangled.sh/core/tid"
14
14
)
15
15
16
16
func (s *State) Follow(w http.ResponseWriter, r *http.Request) {
···
41
41
switch r.Method {
42
42
case http.MethodPost:
43
43
createdAt := time.Now().Format(time.RFC3339)
44
-
rkey := appview.TID()
44
+
rkey := tid.TID()
45
45
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
46
46
Collection: tangled.GraphFollowNSID,
47
47
Repo: currentUser.Did,
···
60
60
log.Println("created atproto record: ", resp.Uri)
61
61
62
62
follow := &db.Follow{
63
-
UserDid: currentUser.Did,
63
+
UserDid: currentUser.Did,
64
64
SubjectDid: subjectIdent.DID.String(),
65
-
Rkey: rkey,
65
+
Rkey: rkey,
66
66
}
67
67
68
68
err = db.AddFollow(s.db, follow)
+8
-8
appview/state/reaction.go
+8
-8
appview/state/reaction.go
···
10
10
11
11
lexutil "github.com/bluesky-social/indigo/lex/util"
12
12
"tangled.sh/tangled.sh/core/api/tangled"
13
-
"tangled.sh/tangled.sh/core/appview"
14
13
"tangled.sh/tangled.sh/core/appview/db"
15
14
"tangled.sh/tangled.sh/core/appview/pages"
15
+
"tangled.sh/tangled.sh/core/tid"
16
16
)
17
17
18
18
func (s *State) React(w http.ResponseWriter, r *http.Request) {
···
45
45
switch r.Method {
46
46
case http.MethodPost:
47
47
createdAt := time.Now().Format(time.RFC3339)
48
-
rkey := appview.TID()
48
+
rkey := tid.TID()
49
49
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
50
50
Collection: tangled.FeedReactionNSID,
51
51
Repo: currentUser.Did,
···
77
77
log.Println("created atproto record: ", resp.Uri)
78
78
79
79
s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{
80
-
ThreadAt: subjectUri,
81
-
Kind: reactionKind,
82
-
Count: count,
80
+
ThreadAt: subjectUri,
81
+
Kind: reactionKind,
82
+
Count: count,
83
83
IsReacted: true,
84
84
})
85
85
···
115
115
}
116
116
117
117
s.pages.ThreadReactionFragment(w, pages.ThreadReactionFragmentParams{
118
-
ThreadAt: subjectUri,
119
-
Kind: reactionKind,
120
-
Count: count,
118
+
ThreadAt: subjectUri,
119
+
Kind: reactionKind,
120
+
Count: count,
121
121
IsReacted: false,
122
122
})
123
123
+4
-4
appview/state/star.go
+4
-4
appview/state/star.go
···
9
9
"github.com/bluesky-social/indigo/atproto/syntax"
10
10
lexutil "github.com/bluesky-social/indigo/lex/util"
11
11
"tangled.sh/tangled.sh/core/api/tangled"
12
-
"tangled.sh/tangled.sh/core/appview"
13
12
"tangled.sh/tangled.sh/core/appview/db"
14
13
"tangled.sh/tangled.sh/core/appview/pages"
14
+
"tangled.sh/tangled.sh/core/tid"
15
15
)
16
16
17
17
func (s *State) Star(w http.ResponseWriter, r *http.Request) {
···
38
38
switch r.Method {
39
39
case http.MethodPost:
40
40
createdAt := time.Now().Format(time.RFC3339)
41
-
rkey := appview.TID()
41
+
rkey := tid.TID()
42
42
resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
43
43
Collection: tangled.FeedStarNSID,
44
44
Repo: currentUser.Did,
···
57
57
58
58
star := &db.Star{
59
59
StarredByDid: currentUser.Did,
60
-
RepoAt: subjectUri,
61
-
Rkey: rkey,
60
+
RepoAt: subjectUri,
61
+
Rkey: rkey,
62
62
}
63
63
64
64
err = db.AddStar(s.db, star)
+2
-346
appview/state/state.go
+2
-346
appview/state/state.go
···
10
10
"time"
11
11
12
12
comatproto "github.com/bluesky-social/indigo/api/atproto"
13
-
"github.com/bluesky-social/indigo/atproto/syntax"
14
13
lexutil "github.com/bluesky-social/indigo/lex/util"
15
14
securejoin "github.com/cyphar/filepath-securejoin"
16
15
"github.com/go-chi/chi/v5"
···
32
31
"tangled.sh/tangled.sh/core/knotclient"
33
32
tlog "tangled.sh/tangled.sh/core/log"
34
33
"tangled.sh/tangled.sh/core/rbac"
34
+
"tangled.sh/tangled.sh/core/tid"
35
35
)
36
36
37
37
type State struct {
···
39
39
notifier notify.Notifier
40
40
oauth *oauth.OAuth
41
41
enforcer *rbac.Enforcer
42
-
tidClock syntax.TIDClock
43
42
pages *pages.Pages
44
43
sess *session.SessionStore
45
44
idResolver *idresolver.Resolver
···
61
60
if err != nil {
62
61
return nil, fmt.Errorf("failed to create enforcer: %w", err)
63
62
}
64
-
65
-
clock := syntax.NewTIDClock(0)
66
63
67
64
pgs := pages.NewPages(config)
68
65
···
145
142
notifier,
146
143
oauth,
147
144
enforcer,
148
-
clock,
149
145
pgs,
150
146
sess,
151
147
res,
···
160
156
return state, nil
161
157
}
162
158
163
-
func TID(c *syntax.TIDClock) string {
164
-
return c.Next().String()
165
-
}
166
-
167
159
func (s *State) Timeline(w http.ResponseWriter, r *http.Request) {
168
160
user := s.oauth.GetUser(r)
169
161
···
208
200
return
209
201
}
210
202
211
-
// requires auth
212
-
// func (s *State) RegistrationKey(w http.ResponseWriter, r *http.Request) {
213
-
// switch r.Method {
214
-
// case http.MethodGet:
215
-
// // list open registrations under this did
216
-
//
217
-
// return
218
-
// case http.MethodPost:
219
-
// session, err := s.oauth.Stores().Get(r, oauth.SessionName)
220
-
// if err != nil || session.IsNew {
221
-
// log.Println("unauthorized attempt to generate registration key")
222
-
// http.Error(w, "Forbidden", http.StatusUnauthorized)
223
-
// return
224
-
// }
225
-
//
226
-
// did := session.Values[oauth.SessionDid].(string)
227
-
//
228
-
// // check if domain is valid url, and strip extra bits down to just host
229
-
// domain := r.FormValue("domain")
230
-
// if domain == "" {
231
-
// http.Error(w, "Invalid form", http.StatusBadRequest)
232
-
// return
233
-
// }
234
-
//
235
-
// key, err := db.GenerateRegistrationKey(s.db, domain, did)
236
-
//
237
-
// if err != nil {
238
-
// log.Println(err)
239
-
// http.Error(w, "unable to register this domain", http.StatusNotAcceptable)
240
-
// return
241
-
// }
242
-
//
243
-
// w.Write([]byte(key))
244
-
// }
245
-
// }
246
-
247
203
func (s *State) Keys(w http.ResponseWriter, r *http.Request) {
248
204
user := chi.URLParam(r, "user")
249
205
user = strings.TrimPrefix(user, "@")
···
276
232
}
277
233
}
278
234
279
-
// create a signed request and check if a node responds to that
280
-
// func (s *State) InitKnotServer(w http.ResponseWriter, r *http.Request) {
281
-
// user := s.oauth.GetUser(r)
282
-
//
283
-
// noticeId := "operation-error"
284
-
// defaultErr := "Failed to register spindle. Try again later."
285
-
// fail := func() {
286
-
// s.pages.Notice(w, noticeId, defaultErr)
287
-
// }
288
-
//
289
-
// domain := chi.URLParam(r, "domain")
290
-
// if domain == "" {
291
-
// http.Error(w, "malformed url", http.StatusBadRequest)
292
-
// return
293
-
// }
294
-
// log.Println("checking ", domain)
295
-
//
296
-
// secret, err := db.GetRegistrationKey(s.db, domain)
297
-
// if err != nil {
298
-
// log.Printf("no key found for domain %s: %s\n", domain, err)
299
-
// return
300
-
// }
301
-
//
302
-
// client, err := knotclient.NewSignedClient(domain, secret, s.config.Core.Dev)
303
-
// if err != nil {
304
-
// log.Println("failed to create client to ", domain)
305
-
// }
306
-
//
307
-
// resp, err := client.Init(user.Did)
308
-
// if err != nil {
309
-
// w.Write([]byte("no dice"))
310
-
// log.Println("domain was unreachable after 5 seconds")
311
-
// return
312
-
// }
313
-
//
314
-
// if resp.StatusCode == http.StatusConflict {
315
-
// log.Println("status conflict", resp.StatusCode)
316
-
// w.Write([]byte("already registered, sorry!"))
317
-
// return
318
-
// }
319
-
//
320
-
// if resp.StatusCode != http.StatusNoContent {
321
-
// log.Println("status nok", resp.StatusCode)
322
-
// w.Write([]byte("no dice"))
323
-
// return
324
-
// }
325
-
//
326
-
// // verify response mac
327
-
// signature := resp.Header.Get("X-Signature")
328
-
// signatureBytes, err := hex.DecodeString(signature)
329
-
// if err != nil {
330
-
// return
331
-
// }
332
-
//
333
-
// expectedMac := hmac.New(sha256.New, []byte(secret))
334
-
// expectedMac.Write([]byte("ok"))
335
-
//
336
-
// if !hmac.Equal(expectedMac.Sum(nil), signatureBytes) {
337
-
// log.Printf("response body signature mismatch: %x\n", signatureBytes)
338
-
// return
339
-
// }
340
-
//
341
-
// tx, err := s.db.BeginTx(r.Context(), nil)
342
-
// if err != nil {
343
-
// log.Println("failed to start tx", err)
344
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
345
-
// return
346
-
// }
347
-
// defer func() {
348
-
// tx.Rollback()
349
-
// err = s.enforcer.E.LoadPolicy()
350
-
// if err != nil {
351
-
// log.Println("failed to rollback policies")
352
-
// }
353
-
// }()
354
-
//
355
-
// // mark as registered
356
-
// err = db.Register(tx, domain)
357
-
// if err != nil {
358
-
// log.Println("failed to register domain", err)
359
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
360
-
// return
361
-
// }
362
-
//
363
-
// // set permissions for this did as owner
364
-
// reg, err := db.RegistrationByDomain(tx, domain)
365
-
// if err != nil {
366
-
// log.Println("failed to register domain", err)
367
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
368
-
// return
369
-
// }
370
-
//
371
-
// // add basic acls for this domain
372
-
// err = s.enforcer.AddKnot(domain)
373
-
// if err != nil {
374
-
// log.Println("failed to setup owner of domain", err)
375
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
376
-
// return
377
-
// }
378
-
//
379
-
// // add this did as owner of this domain
380
-
// err = s.enforcer.AddKnotOwner(domain, reg.ByDid)
381
-
// if err != nil {
382
-
// log.Println("failed to setup owner of domain", err)
383
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
384
-
// return
385
-
// }
386
-
//
387
-
// err = tx.Commit()
388
-
// if err != nil {
389
-
// log.Println("failed to commit changes", err)
390
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
391
-
// return
392
-
// }
393
-
//
394
-
// err = s.enforcer.E.SavePolicy()
395
-
// if err != nil {
396
-
// log.Println("failed to update ACLs", err)
397
-
// http.Error(w, err.Error(), http.StatusInternalServerError)
398
-
// return
399
-
// }
400
-
//
401
-
// // add this knot to knotstream
402
-
// go s.knotstream.AddSource(
403
-
// context.Background(),
404
-
// eventconsumer.NewKnotSource(domain),
405
-
// )
406
-
//
407
-
// w.Write([]byte("check success"))
408
-
// }
409
-
410
-
// func (s *State) KnotServerInfo(w http.ResponseWriter, r *http.Request) {
411
-
// domain := chi.URLParam(r, "domain")
412
-
// if domain == "" {
413
-
// http.Error(w, "malformed url", http.StatusBadRequest)
414
-
// return
415
-
// }
416
-
//
417
-
// user := s.oauth.GetUser(r)
418
-
// reg, err := db.RegistrationByDomain(s.db, domain)
419
-
// if err != nil {
420
-
// w.Write([]byte("failed to pull up registration info"))
421
-
// return
422
-
// }
423
-
//
424
-
// var members []string
425
-
// if reg.Registered != nil {
426
-
// members, err = s.enforcer.GetUserByRole("server:member", domain)
427
-
// if err != nil {
428
-
// w.Write([]byte("failed to fetch member list"))
429
-
// return
430
-
// }
431
-
// }
432
-
//
433
-
// var didsToResolve []string
434
-
// for _, m := range members {
435
-
// didsToResolve = append(didsToResolve, m)
436
-
// }
437
-
// didsToResolve = append(didsToResolve, reg.ByDid)
438
-
// resolvedIds := s.idResolver.ResolveIdents(r.Context(), didsToResolve)
439
-
// didHandleMap := make(map[string]string)
440
-
// for _, identity := range resolvedIds {
441
-
// if !identity.Handle.IsInvalidHandle() {
442
-
// didHandleMap[identity.DID.String()] = fmt.Sprintf("@%s", identity.Handle.String())
443
-
// } else {
444
-
// didHandleMap[identity.DID.String()] = identity.DID.String()
445
-
// }
446
-
// }
447
-
//
448
-
// ok, err := s.enforcer.IsKnotOwner(user.Did, domain)
449
-
// isOwner := err == nil && ok
450
-
//
451
-
// p := pages.KnotParams{
452
-
// LoggedInUser: user,
453
-
// DidHandleMap: didHandleMap,
454
-
// Registration: reg,
455
-
// Members: members,
456
-
// IsOwner: isOwner,
457
-
// }
458
-
//
459
-
// s.pages.Knot(w, p)
460
-
// }
461
-
462
-
// get knots registered by this user
463
-
// func (s *State) Knots(w http.ResponseWriter, r *http.Request) {
464
-
// // for now, this is just pubkeys
465
-
// user := s.oauth.GetUser(r)
466
-
// registrations, err := db.RegistrationsByDid(s.db, user.Did)
467
-
// if err != nil {
468
-
// log.Println(err)
469
-
// }
470
-
//
471
-
// s.pages.Knots(w, pages.KnotsParams{
472
-
// LoggedInUser: user,
473
-
// Registrations: registrations,
474
-
// })
475
-
// }
476
-
477
-
// list members of domain, requires auth and requires owner status
478
-
// func (s *State) ListMembers(w http.ResponseWriter, r *http.Request) {
479
-
// domain := chi.URLParam(r, "domain")
480
-
// if domain == "" {
481
-
// http.Error(w, "malformed url", http.StatusBadRequest)
482
-
// return
483
-
// }
484
-
//
485
-
// // list all members for this domain
486
-
// memberDids, err := s.enforcer.GetUserByRole("server:member", domain)
487
-
// if err != nil {
488
-
// w.Write([]byte("failed to fetch member list"))
489
-
// return
490
-
// }
491
-
//
492
-
// w.Write([]byte(strings.Join(memberDids, "\n")))
493
-
// return
494
-
// }
495
-
496
-
// add member to domain, requires auth and requires invite access
497
-
// func (s *State) AddMember(w http.ResponseWriter, r *http.Request) {
498
-
// domain := chi.URLParam(r, "domain")
499
-
// if domain == "" {
500
-
// http.Error(w, "malformed url", http.StatusBadRequest)
501
-
// return
502
-
// }
503
-
//
504
-
// subjectIdentifier := r.FormValue("subject")
505
-
// if subjectIdentifier == "" {
506
-
// http.Error(w, "malformed form", http.StatusBadRequest)
507
-
// return
508
-
// }
509
-
//
510
-
// subjectIdentity, err := s.idResolver.ResolveIdent(r.Context(), subjectIdentifier)
511
-
// if err != nil {
512
-
// w.Write([]byte("failed to resolve member did to a handle"))
513
-
// return
514
-
// }
515
-
// log.Printf("adding %s to %s\n", subjectIdentity.Handle.String(), domain)
516
-
//
517
-
// // announce this relation into the firehose, store into owners' pds
518
-
// client, err := s.oauth.AuthorizedClient(r)
519
-
// if err != nil {
520
-
// http.Error(w, "failed to authorize client", http.StatusInternalServerError)
521
-
// return
522
-
// }
523
-
// currentUser := s.oauth.GetUser(r)
524
-
// createdAt := time.Now().Format(time.RFC3339)
525
-
// resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
526
-
// Collection: tangled.KnotMemberNSID,
527
-
// Repo: currentUser.Did,
528
-
// Rkey: appview.TID(),
529
-
// Record: &lexutil.LexiconTypeDecoder{
530
-
// Val: &tangled.KnotMember{
531
-
// Subject: subjectIdentity.DID.String(),
532
-
// Domain: domain,
533
-
// CreatedAt: createdAt,
534
-
// }},
535
-
// })
536
-
//
537
-
// // invalid record
538
-
// if err != nil {
539
-
// log.Printf("failed to create record: %s", err)
540
-
// return
541
-
// }
542
-
// log.Println("created atproto record: ", resp.Uri)
543
-
//
544
-
// secret, err := db.GetRegistrationKey(s.db, domain)
545
-
// if err != nil {
546
-
// log.Printf("no key found for domain %s: %s\n", domain, err)
547
-
// return
548
-
// }
549
-
//
550
-
// ksClient, err := knotclient.NewSignedClient(domain, secret, s.config.Core.Dev)
551
-
// if err != nil {
552
-
// log.Println("failed to create client to ", domain)
553
-
// return
554
-
// }
555
-
//
556
-
// ksResp, err := ksClient.AddMember(subjectIdentity.DID.String())
557
-
// if err != nil {
558
-
// log.Printf("failed to make request to %s: %s", domain, err)
559
-
// return
560
-
// }
561
-
//
562
-
// if ksResp.StatusCode != http.StatusNoContent {
563
-
// w.Write([]byte(fmt.Sprint("knotserver failed to add member: ", err)))
564
-
// return
565
-
// }
566
-
//
567
-
// err = s.enforcer.AddKnotMember(domain, subjectIdentity.DID.String())
568
-
// if err != nil {
569
-
// w.Write([]byte(fmt.Sprint("failed to add member: ", err)))
570
-
// return
571
-
// }
572
-
//
573
-
// w.Write([]byte(fmt.Sprint("added member: ", subjectIdentity.Handle.String())))
574
-
// }
575
-
576
-
// func (s *State) RemoveMember(w http.ResponseWriter, r *http.Request) {
577
-
// }
578
-
579
235
func validateRepoName(name string) error {
580
236
// check for path traversal attempts
581
237
if name == "." || name == ".." ||
···
674
330
return
675
331
}
676
332
677
-
rkey := appview.TID()
333
+
rkey := tid.TID()
678
334
repo := &db.Repo{
679
335
Did: user.Did,
680
336
Name: repoName,
-11
appview/tid.go
-11
appview/tid.go
+1
-1
go.mod
+1
-1
go.mod
···
7
7
require (
8
8
github.com/Blank-Xu/sql-adapter v1.1.1
9
9
github.com/alecthomas/chroma/v2 v2.15.0
10
+
github.com/avast/retry-go/v4 v4.6.1
10
11
github.com/bluekeyes/go-gitdiff v0.8.1
11
12
github.com/bluesky-social/indigo v0.0.0-20250520232546-236dd575c91e
12
13
github.com/bluesky-social/jetstream v0.0.0-20241210005130-ea96859b93d1
···
49
50
github.com/Microsoft/go-winio v0.6.2 // indirect
50
51
github.com/ProtonMail/go-crypto v1.2.0 // indirect
51
52
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
52
-
github.com/avast/retry-go/v4 v4.6.1 // indirect
53
53
github.com/aymerick/douceur v0.2.0 // indirect
54
54
github.com/beorn7/perks v1.0.1 // indirect
55
55
github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect