···81818282func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) {
8383 l := rp.logger.With("handler", "RepoSingleIssue")
8484- user := rp.oauth.GetUser(r)
8484+ user := rp.oauth.GetMultiAccountUser(r)
8585 f, err := rp.repoResolver.Resolve(r)
8686 if err != nil {
8787 l.Error("failed to get repo and knot", "err", err)
···102102103103 userReactions := map[models.ReactionKind]bool{}
104104 if user != nil {
105105- userReactions = db.GetReactionStatusMap(rp.db, user.Did, issue.AtUri())
105105+ userReactions = db.GetReactionStatusMap(rp.db, user.Active.Did, issue.AtUri())
106106 }
107107108108 backlinks, err := db.GetBacklinks(rp.db, issue.AtUri())
···143143144144func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) {
145145 l := rp.logger.With("handler", "EditIssue")
146146- user := rp.oauth.GetUser(r)
146146+ user := rp.oauth.GetMultiAccountUser(r)
147147148148 issue, ok := r.Context().Value("issue").(*models.Issue)
149149 if !ok {
···182182 return
183183 }
184184185185- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Did, newIssue.Rkey)
185185+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Active.Did, newIssue.Rkey)
186186 if err != nil {
187187 l.Error("failed to get record", "err", err)
188188 rp.pages.Notice(w, noticeId, "Failed to edit issue, no record found on PDS.")
···191191192192 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
193193 Collection: tangled.RepoIssueNSID,
194194- Repo: user.Did,
194194+ Repo: user.Active.Did,
195195 Rkey: newIssue.Rkey,
196196 SwapRecord: ex.Cid,
197197 Record: &lexutil.LexiconTypeDecoder{
···292292293293func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) {
294294 l := rp.logger.With("handler", "CloseIssue")
295295- user := rp.oauth.GetUser(r)
295295+ user := rp.oauth.GetMultiAccountUser(r)
296296 f, err := rp.repoResolver.Resolve(r)
297297 if err != nil {
298298 l.Error("failed to get repo and knot", "err", err)
···306306 return
307307 }
308308309309- roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
309309+ roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
310310 isRepoOwner := roles.IsOwner()
311311 isCollaborator := roles.IsCollaborator()
312312- isIssueOwner := user.Did == issue.Did
312312+ isIssueOwner := user.Active.Did == issue.Did
313313314314 // TODO: make this more granular
315315 if isIssueOwner || isRepoOwner || isCollaborator {
···326326 issue.Open = false
327327328328 // notify about the issue closure
329329- rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue)
329329+ rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue)
330330331331 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
332332 rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId))
···340340341341func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) {
342342 l := rp.logger.With("handler", "ReopenIssue")
343343- user := rp.oauth.GetUser(r)
343343+ user := rp.oauth.GetMultiAccountUser(r)
344344 f, err := rp.repoResolver.Resolve(r)
345345 if err != nil {
346346 l.Error("failed to get repo and knot", "err", err)
···354354 return
355355 }
356356357357- roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
357357+ roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
358358 isRepoOwner := roles.IsOwner()
359359 isCollaborator := roles.IsCollaborator()
360360- isIssueOwner := user.Did == issue.Did
360360+ isIssueOwner := user.Active.Did == issue.Did
361361362362 if isCollaborator || isRepoOwner || isIssueOwner {
363363 err := db.ReopenIssues(
···373373 issue.Open = true
374374375375 // notify about the issue reopen
376376- rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue)
376376+ rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue)
377377378378 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
379379 rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId))
···387387388388func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) {
389389 l := rp.logger.With("handler", "NewIssueComment")
390390- user := rp.oauth.GetUser(r)
390390+ user := rp.oauth.GetMultiAccountUser(r)
391391 f, err := rp.repoResolver.Resolve(r)
392392 if err != nil {
393393 l.Error("failed to get repo and knot", "err", err)
···416416 mentions, references := rp.mentionsResolver.Resolve(r.Context(), body)
417417418418 comment := models.IssueComment{
419419- Did: user.Did,
419419+ Did: user.Active.Did,
420420 Rkey: tid.TID(),
421421 IssueAt: issue.AtUri().String(),
422422 ReplyTo: replyTo,
···495495496496func (rp *Issues) IssueComment(w http.ResponseWriter, r *http.Request) {
497497 l := rp.logger.With("handler", "IssueComment")
498498- user := rp.oauth.GetUser(r)
498498+ user := rp.oauth.GetMultiAccountUser(r)
499499500500 issue, ok := r.Context().Value("issue").(*models.Issue)
501501 if !ok {
···531531532532func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) {
533533 l := rp.logger.With("handler", "EditIssueComment")
534534- user := rp.oauth.GetUser(r)
534534+ user := rp.oauth.GetMultiAccountUser(r)
535535536536 issue, ok := r.Context().Value("issue").(*models.Issue)
537537 if !ok {
···557557 }
558558 comment := comments[0]
559559560560- if comment.Did != user.Did {
561561- l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Did)
560560+ if comment.Did != user.Active.Did {
561561+ l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Active.Did)
562562 http.Error(w, "you are not the author of this comment", http.StatusUnauthorized)
563563 return
564564 }
···608608 // rkey is optional, it was introduced later
609609 if newComment.Rkey != "" {
610610 // update the record on pds
611611- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Did, comment.Rkey)
611611+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Active.Did, comment.Rkey)
612612 if err != nil {
613613 l.Error("failed to get record", "err", err, "did", newComment.Did, "rkey", newComment.Rkey)
614614 rp.pages.Notice(w, fmt.Sprintf("comment-%s-status", commentId), "Failed to update description, no record found on PDS.")
···617617618618 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
619619 Collection: tangled.RepoIssueCommentNSID,
620620- Repo: user.Did,
620620+ Repo: user.Active.Did,
621621 Rkey: newComment.Rkey,
622622 SwapRecord: ex.Cid,
623623 Record: &lexutil.LexiconTypeDecoder{
···641641642642func (rp *Issues) ReplyIssueCommentPlaceholder(w http.ResponseWriter, r *http.Request) {
643643 l := rp.logger.With("handler", "ReplyIssueCommentPlaceholder")
644644- user := rp.oauth.GetUser(r)
644644+ user := rp.oauth.GetMultiAccountUser(r)
645645646646 issue, ok := r.Context().Value("issue").(*models.Issue)
647647 if !ok {
···677677678678func (rp *Issues) ReplyIssueComment(w http.ResponseWriter, r *http.Request) {
679679 l := rp.logger.With("handler", "ReplyIssueComment")
680680- user := rp.oauth.GetUser(r)
680680+ user := rp.oauth.GetMultiAccountUser(r)
681681682682 issue, ok := r.Context().Value("issue").(*models.Issue)
683683 if !ok {
···713713714714func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) {
715715 l := rp.logger.With("handler", "DeleteIssueComment")
716716- user := rp.oauth.GetUser(r)
716716+ user := rp.oauth.GetMultiAccountUser(r)
717717718718 issue, ok := r.Context().Value("issue").(*models.Issue)
719719 if !ok {
···739739 }
740740 comment := comments[0]
741741742742- if comment.Did != user.Did {
743743- l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Did)
742742+ if comment.Did != user.Active.Did {
743743+ l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Active.Did)
744744 http.Error(w, "you are not the author of this comment", http.StatusUnauthorized)
745745 return
746746 }
···769769 }
770770 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
771771 Collection: tangled.RepoIssueCommentNSID,
772772- Repo: user.Did,
772772+ Repo: user.Active.Did,
773773 Rkey: comment.Rkey,
774774 })
775775 if err != nil {
···807807808808 page := pagination.FromContext(r.Context())
809809810810- user := rp.oauth.GetUser(r)
810810+ user := rp.oauth.GetMultiAccountUser(r)
811811 f, err := rp.repoResolver.Resolve(r)
812812 if err != nil {
813813 l.Error("failed to get repo and knot", "err", err)
···884884 }
885885886886 rp.pages.RepoIssues(w, pages.RepoIssuesParams{
887887- LoggedInUser: rp.oauth.GetUser(r),
887887+ LoggedInUser: rp.oauth.GetMultiAccountUser(r),
888888 RepoInfo: rp.repoResolver.GetRepoInfo(r, user),
889889 Issues: issues,
890890 IssueCount: totalIssues,
···897897898898func (rp *Issues) NewIssue(w http.ResponseWriter, r *http.Request) {
899899 l := rp.logger.With("handler", "NewIssue")
900900- user := rp.oauth.GetUser(r)
900900+ user := rp.oauth.GetMultiAccountUser(r)
901901902902 f, err := rp.repoResolver.Resolve(r)
903903 if err != nil {
···921921 Title: r.FormValue("title"),
922922 Body: body,
923923 Open: true,
924924- Did: user.Did,
924924+ Did: user.Active.Did,
925925 Created: time.Now(),
926926 Mentions: mentions,
927927 References: references,
···945945 }
946946 resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
947947 Collection: tangled.RepoIssueNSID,
948948- Repo: user.Did,
948948+ Repo: user.Active.Did,
949949 Rkey: issue.Rkey,
950950 Record: &lexutil.LexiconTypeDecoder{
951951 Val: &record,
+31-31
appview/knots/knots.go
···7070}
71717272func (k *Knots) knots(w http.ResponseWriter, r *http.Request) {
7373- user := k.OAuth.GetUser(r)
7373+ user := k.OAuth.GetMultiAccountUser(r)
7474 registrations, err := db.GetRegistrations(
7575 k.Db,
7676- orm.FilterEq("did", user.Did),
7676+ orm.FilterEq("did", user.Active.Did),
7777 )
7878 if err != nil {
7979 k.Logger.Error("failed to fetch knot registrations", "err", err)
···9292func (k *Knots) dashboard(w http.ResponseWriter, r *http.Request) {
9393 l := k.Logger.With("handler", "dashboard")
94949595- user := k.OAuth.GetUser(r)
9696- l = l.With("user", user.Did)
9595+ user := k.OAuth.GetMultiAccountUser(r)
9696+ l = l.With("user", user.Active.Did)
97979898 domain := chi.URLParam(r, "domain")
9999 if domain == "" {
···103103104104 registrations, err := db.GetRegistrations(
105105 k.Db,
106106- orm.FilterEq("did", user.Did),
106106+ orm.FilterEq("did", user.Active.Did),
107107 orm.FilterEq("domain", domain),
108108 )
109109 if err != nil {
···154154}
155155156156func (k *Knots) register(w http.ResponseWriter, r *http.Request) {
157157- user := k.OAuth.GetUser(r)
157157+ user := k.OAuth.GetMultiAccountUser(r)
158158 l := k.Logger.With("handler", "register")
159159160160 noticeId := "register-error"
···175175 return
176176 }
177177 l = l.With("domain", domain)
178178- l = l.With("user", user.Did)
178178+ l = l.With("user", user.Active.Did)
179179180180 tx, err := k.Db.Begin()
181181 if err != nil {
···188188 k.Enforcer.E.LoadPolicy()
189189 }()
190190191191- err = db.AddKnot(tx, domain, user.Did)
191191+ err = db.AddKnot(tx, domain, user.Active.Did)
192192 if err != nil {
193193 l.Error("failed to insert", "err", err)
194194 fail()
···210210 return
211211 }
212212213213- ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain)
213213+ ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain)
214214 var exCid *string
215215 if ex != nil {
216216 exCid = ex.Cid
···219219 // re-announce by registering under same rkey
220220 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
221221 Collection: tangled.KnotNSID,
222222- Repo: user.Did,
222222+ Repo: user.Active.Did,
223223 Rkey: domain,
224224 Record: &lexutil.LexiconTypeDecoder{
225225 Val: &tangled.Knot{
···250250 }
251251252252 // begin verification
253253- err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev)
253253+ err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev)
254254 if err != nil {
255255 l.Error("verification failed", "err", err)
256256 k.Pages.HxRefresh(w)
257257 return
258258 }
259259260260- err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did)
260260+ err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did)
261261 if err != nil {
262262 l.Error("failed to mark verified", "err", err)
263263 k.Pages.HxRefresh(w)
···275275}
276276277277func (k *Knots) delete(w http.ResponseWriter, r *http.Request) {
278278- user := k.OAuth.GetUser(r)
278278+ user := k.OAuth.GetMultiAccountUser(r)
279279 l := k.Logger.With("handler", "delete")
280280281281 noticeId := "operation-error"
···294294 // get record from db first
295295 registrations, err := db.GetRegistrations(
296296 k.Db,
297297- orm.FilterEq("did", user.Did),
297297+ orm.FilterEq("did", user.Active.Did),
298298 orm.FilterEq("domain", domain),
299299 )
300300 if err != nil {
···322322323323 err = db.DeleteKnot(
324324 tx,
325325- orm.FilterEq("did", user.Did),
325325+ orm.FilterEq("did", user.Active.Did),
326326 orm.FilterEq("domain", domain),
327327 )
328328 if err != nil {
···350350351351 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
352352 Collection: tangled.KnotNSID,
353353- Repo: user.Did,
353353+ Repo: user.Active.Did,
354354 Rkey: domain,
355355 })
356356 if err != nil {
···382382}
383383384384func (k *Knots) retry(w http.ResponseWriter, r *http.Request) {
385385- user := k.OAuth.GetUser(r)
385385+ user := k.OAuth.GetMultiAccountUser(r)
386386 l := k.Logger.With("handler", "retry")
387387388388 noticeId := "operation-error"
···398398 return
399399 }
400400 l = l.With("domain", domain)
401401- l = l.With("user", user.Did)
401401+ l = l.With("user", user.Active.Did)
402402403403 // get record from db first
404404 registrations, err := db.GetRegistrations(
405405 k.Db,
406406- orm.FilterEq("did", user.Did),
406406+ orm.FilterEq("did", user.Active.Did),
407407 orm.FilterEq("domain", domain),
408408 )
409409 if err != nil {
···419419 registration := registrations[0]
420420421421 // begin verification
422422- err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev)
422422+ err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev)
423423 if err != nil {
424424 l.Error("verification failed", "err", err)
425425···437437 return
438438 }
439439440440- err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did)
440440+ err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did)
441441 if err != nil {
442442 l.Error("failed to mark verified", "err", err)
443443 k.Pages.Notice(w, noticeId, err.Error())
···456456 return
457457 }
458458459459- ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain)
459459+ ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain)
460460 var exCid *string
461461 if ex != nil {
462462 exCid = ex.Cid
···465465 // ignore the error here
466466 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
467467 Collection: tangled.KnotNSID,
468468- Repo: user.Did,
468468+ Repo: user.Active.Did,
469469 Rkey: domain,
470470 Record: &lexutil.LexiconTypeDecoder{
471471 Val: &tangled.Knot{
···494494 // Get updated registration to show
495495 registrations, err = db.GetRegistrations(
496496 k.Db,
497497- orm.FilterEq("did", user.Did),
497497+ orm.FilterEq("did", user.Active.Did),
498498 orm.FilterEq("domain", domain),
499499 )
500500 if err != nil {
···516516}
517517518518func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) {
519519- user := k.OAuth.GetUser(r)
519519+ user := k.OAuth.GetMultiAccountUser(r)
520520 l := k.Logger.With("handler", "addMember")
521521522522 domain := chi.URLParam(r, "domain")
···526526 return
527527 }
528528 l = l.With("domain", domain)
529529- l = l.With("user", user.Did)
529529+ l = l.With("user", user.Active.Did)
530530531531 registrations, err := db.GetRegistrations(
532532 k.Db,
533533- orm.FilterEq("did", user.Did),
533533+ orm.FilterEq("did", user.Active.Did),
534534 orm.FilterEq("domain", domain),
535535 orm.FilterIsNot("registered", "null"),
536536 )
···583583584584 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
585585 Collection: tangled.KnotMemberNSID,
586586- Repo: user.Did,
586586+ Repo: user.Active.Did,
587587 Rkey: rkey,
588588 Record: &lexutil.LexiconTypeDecoder{
589589 Val: &tangled.KnotMember{
···618618}
619619620620func (k *Knots) removeMember(w http.ResponseWriter, r *http.Request) {
621621- user := k.OAuth.GetUser(r)
621621+ user := k.OAuth.GetMultiAccountUser(r)
622622 l := k.Logger.With("handler", "removeMember")
623623624624 noticeId := "operation-error"
···634634 return
635635 }
636636 l = l.With("domain", domain)
637637- l = l.With("user", user.Did)
637637+ l = l.With("user", user.Active.Did)
638638639639 registrations, err := db.GetRegistrations(
640640 k.Db,
641641- orm.FilterEq("did", user.Did),
641641+ orm.FilterEq("did", user.Active.Did),
642642 orm.FilterEq("domain", domain),
643643 orm.FilterIsNot("registered", "null"),
644644 )
+2-2
appview/labels/labels.go
···6868// - this handler should calculate the diff in order to create the labelop record
6969// - we need the diff in order to maintain a "history" of operations performed by users
7070func (l *Labels) PerformLabelOp(w http.ResponseWriter, r *http.Request) {
7171- user := l.oauth.GetUser(r)
7171+ user := l.oauth.GetMultiAccountUser(r)
72727373 noticeId := "add-label-error"
7474···8282 return
8383 }
84848585- did := user.Did
8585+ did := user.Active.Did
8686 rkey := tid.TID()
8787 performedAt := time.Now()
8888 indexedAt := time.Now()
+6-8
appview/middleware/middleware.go
···115115 return func(next http.Handler) http.Handler {
116116 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
117117 // requires auth also
118118- actor := mw.oauth.GetUser(r)
118118+ actor := mw.oauth.GetMultiAccountUser(r)
119119 if actor == nil {
120120 // we need a logged in user
121121 log.Printf("not logged in, redirecting")
···128128 return
129129 }
130130131131- ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Did, group, domain)
131131+ ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Active.Did, group, domain)
132132 if err != nil || !ok {
133133- // we need a logged in user
134134- log.Printf("%s does not have perms of a %s in domain %s", actor.Did, group, domain)
133133+ log.Printf("%s does not have perms of a %s in domain %s", actor.Active.Did, group, domain)
135134 http.Error(w, "Forbiden", http.StatusUnauthorized)
136135 return
137136 }
···149148 return func(next http.Handler) http.Handler {
150149 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
151150 // requires auth also
152152- actor := mw.oauth.GetUser(r)
151151+ actor := mw.oauth.GetMultiAccountUser(r)
153152 if actor == nil {
154153 // we need a logged in user
155154 log.Printf("not logged in, redirecting")
···162161 return
163162 }
164163165165- ok, err := mw.enforcer.E.Enforce(actor.Did, f.Knot, f.DidSlashRepo(), requiredPerm)
164164+ ok, err := mw.enforcer.E.Enforce(actor.Active.Did, f.Knot, f.DidSlashRepo(), requiredPerm)
166165 if err != nil || !ok {
167167- // we need a logged in user
168168- log.Printf("%s does not have perms of a %s in repo %s", actor.Did, requiredPerm, f.DidSlashRepo())
166166+ log.Printf("%s does not have perms of a %s in repo %s", actor.Active.Did, requiredPerm, f.DidSlashRepo())
169167 http.Error(w, "Forbiden", http.StatusUnauthorized)
170168 return
171169 }
+6-6
appview/notifications/notifications.go
···48484949func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request) {
5050 l := n.logger.With("handler", "notificationsPage")
5151- user := n.oauth.GetUser(r)
5151+ user := n.oauth.GetMultiAccountUser(r)
52525353 page := pagination.FromContext(r.Context())
54545555 total, err := db.CountNotifications(
5656 n.db,
5757- orm.FilterEq("recipient_did", user.Did),
5757+ orm.FilterEq("recipient_did", user.Active.Did),
5858 )
5959 if err != nil {
6060 l.Error("failed to get total notifications", "err", err)
···6565 notifications, err := db.GetNotificationsWithEntities(
6666 n.db,
6767 page,
6868- orm.FilterEq("recipient_did", user.Did),
6868+ orm.FilterEq("recipient_did", user.Active.Did),
6969 )
7070 if err != nil {
7171 l.Error("failed to get notifications", "err", err)
···7373 return
7474 }
75757676- err = db.MarkAllNotificationsRead(n.db, user.Did)
7676+ err = db.MarkAllNotificationsRead(n.db, user.Active.Did)
7777 if err != nil {
7878 l.Error("failed to mark notifications as read", "err", err)
7979 }
···9090}
91919292func (n *Notifications) getUnreadCount(w http.ResponseWriter, r *http.Request) {
9393- user := n.oauth.GetUser(r)
9393+ user := n.oauth.GetMultiAccountUser(r)
9494 if user == nil {
9595 return
9696 }
97979898 count, err := db.CountNotifications(
9999 n.db,
100100- orm.FilterEq("recipient_did", user.Did),
100100+ orm.FilterEq("recipient_did", user.Active.Did),
101101 orm.FilterEq("read", 0),
102102 )
103103 if err != nil {
+2-2
appview/pipelines/pipelines.go
···7070}
71717272func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) {
7373- user := p.oauth.GetUser(r)
7373+ user := p.oauth.GetMultiAccountUser(r)
7474 l := p.logger.With("handler", "Index")
75757676 f, err := p.repoResolver.Resolve(r)
···9999}
100100101101func (p *Pipelines) Workflow(w http.ResponseWriter, r *http.Request) {
102102- user := p.oauth.GetUser(r)
102102+ user := p.oauth.GetMultiAccountUser(r)
103103 l := p.logger.With("handler", "Workflow")
104104105105 f, err := p.repoResolver.Resolve(r)
+55-55
appview/pulls/pulls.go
···9393func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) {
9494 switch r.Method {
9595 case http.MethodGet:
9696- user := s.oauth.GetUser(r)
9696+ user := s.oauth.GetMultiAccountUser(r)
9797 f, err := s.repoResolver.Resolve(r)
9898 if err != nil {
9999 log.Println("failed to get repo and knot", err)
···124124 mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
125125 branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
126126 resubmitResult := pages.Unknown
127127- if user.Did == pull.OwnerDid {
127127+ if user.Active.Did == pull.OwnerDid {
128128 resubmitResult = s.resubmitCheck(r, f, pull, stack)
129129 }
130130···143143}
144144145145func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
146146- user := s.oauth.GetUser(r)
146146+ user := s.oauth.GetMultiAccountUser(r)
147147 f, err := s.repoResolver.Resolve(r)
148148 if err != nil {
149149 log.Println("failed to get repo and knot", err)
···171171 mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
172172 branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
173173 resubmitResult := pages.Unknown
174174- if user != nil && user.Did == pull.OwnerDid {
174174+ if user != nil && user.Active != nil && user.Active.Did == pull.OwnerDid {
175175 resubmitResult = s.resubmitCheck(r, f, pull, stack)
176176 }
177177···213213214214 userReactions := map[models.ReactionKind]bool{}
215215 if user != nil {
216216- userReactions = db.GetReactionStatusMap(s.db, user.Did, pull.AtUri())
216216+ userReactions = db.GetReactionStatusMap(s.db, user.Active.Did, pull.AtUri())
217217 }
218218219219 labelDefs, err := db.GetLabelDefinitions(
···324324 return nil
325325 }
326326327327- user := s.oauth.GetUser(r)
327327+ user := s.oauth.GetMultiAccountUser(r)
328328 if user == nil {
329329 return nil
330330 }
···347347 }
348348349349 // user can only delete branch if they are a collaborator in the repo that the branch belongs to
350350- perms := s.enforcer.GetPermissionsInRepo(user.Did, repo.Knot, repo.DidSlashRepo())
350350+ perms := s.enforcer.GetPermissionsInRepo(user.Active.Did, repo.Knot, repo.DidSlashRepo())
351351 if !slices.Contains(perms, "repo:push") {
352352 return nil
353353 }
···434434}
435435436436func (s *Pulls) RepoPullPatch(w http.ResponseWriter, r *http.Request) {
437437- user := s.oauth.GetUser(r)
437437+ user := s.oauth.GetMultiAccountUser(r)
438438439439 var diffOpts types.DiffOpts
440440 if d := r.URL.Query().Get("diff"); d == "split" {
···475475}
476476477477func (s *Pulls) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) {
478478- user := s.oauth.GetUser(r)
478478+ user := s.oauth.GetMultiAccountUser(r)
479479480480 var diffOpts types.DiffOpts
481481 if d := r.URL.Query().Get("diff"); d == "split" {
···520520 interdiff := patchutil.Interdiff(previousPatch, currentPatch)
521521522522 s.pages.RepoPullInterdiffPage(w, pages.RepoPullInterdiffParams{
523523- LoggedInUser: s.oauth.GetUser(r),
523523+ LoggedInUser: s.oauth.GetMultiAccountUser(r),
524524 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
525525 Pull: pull,
526526 Round: roundIdInt,
···552552func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) {
553553 l := s.logger.With("handler", "RepoPulls")
554554555555- user := s.oauth.GetUser(r)
555555+ user := s.oauth.GetMultiAccountUser(r)
556556 params := r.URL.Query()
557557558558 state := models.PullOpen
···680680 }
681681682682 s.pages.RepoPulls(w, pages.RepoPullsParams{
683683- LoggedInUser: s.oauth.GetUser(r),
683683+ LoggedInUser: s.oauth.GetMultiAccountUser(r),
684684 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
685685 Pulls: pulls,
686686 LabelDefs: defs,
···692692}
693693694694func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) {
695695- user := s.oauth.GetUser(r)
695695+ user := s.oauth.GetMultiAccountUser(r)
696696 f, err := s.repoResolver.Resolve(r)
697697 if err != nil {
698698 log.Println("failed to get repo and knot", err)
···751751 }
752752 atResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
753753 Collection: tangled.RepoPullCommentNSID,
754754- Repo: user.Did,
754754+ Repo: user.Active.Did,
755755 Rkey: tid.TID(),
756756 Record: &lexutil.LexiconTypeDecoder{
757757 Val: &tangled.RepoPullComment{
···768768 }
769769770770 comment := &models.PullComment{
771771- OwnerDid: user.Did,
771771+ OwnerDid: user.Active.Did,
772772 RepoAt: f.RepoAt().String(),
773773 PullId: pull.PullId,
774774 Body: body,
···802802}
803803804804func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) {
805805- user := s.oauth.GetUser(r)
805805+ user := s.oauth.GetMultiAccountUser(r)
806806 f, err := s.repoResolver.Resolve(r)
807807 if err != nil {
808808 log.Println("failed to get repo and knot", err)
···870870 }
871871872872 // Determine PR type based on input parameters
873873- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
873873+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
874874 isPushAllowed := roles.IsPushAllowed()
875875 isBranchBased := isPushAllowed && sourceBranch != "" && fromFork == ""
876876 isForkBased := fromFork != "" && sourceBranch != ""
···970970 w http.ResponseWriter,
971971 r *http.Request,
972972 repo *models.Repo,
973973- user *oauth.User,
973973+ user *oauth.MultiAccountUser,
974974 title,
975975 body,
976976 targetBranch,
···10271027 s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, combined, sourceRev, pullSource, recordPullSource, isStacked)
10281028}
1029102910301030-func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.User, title, body, targetBranch, patch string, isStacked bool) {
10301030+func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.MultiAccountUser, title, body, targetBranch, patch string, isStacked bool) {
10311031 if err := s.validator.ValidatePatch(&patch); err != nil {
10321032 s.logger.Error("patch validation failed", "err", err)
10331033 s.pages.Notice(w, "pull", "Invalid patch format. Please provide a valid diff.")
···10371037 s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, "", "", nil, nil, isStacked)
10381038}
1039103910401040-func (s *Pulls) handleForkBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.User, forkRepo string, title, body, targetBranch, sourceBranch string, isStacked bool) {
10401040+func (s *Pulls) handleForkBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.MultiAccountUser, forkRepo string, title, body, targetBranch, sourceBranch string, isStacked bool) {
10411041 repoString := strings.SplitN(forkRepo, "/", 2)
10421042 forkOwnerDid := repoString[0]
10431043 repoName := repoString[1]
···11461146 w http.ResponseWriter,
11471147 r *http.Request,
11481148 repo *models.Repo,
11491149- user *oauth.User,
11491149+ user *oauth.MultiAccountUser,
11501150 title, body, targetBranch string,
11511151 patch string,
11521152 combined string,
···12181218 Title: title,
12191219 Body: body,
12201220 TargetBranch: targetBranch,
12211221- OwnerDid: user.Did,
12211221+ OwnerDid: user.Active.Did,
12221222 RepoAt: repo.RepoAt(),
12231223 Rkey: rkey,
12241224 Mentions: mentions,
···1250125012511251 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
12521252 Collection: tangled.RepoPullNSID,
12531253- Repo: user.Did,
12531253+ Repo: user.Active.Did,
12541254 Rkey: rkey,
12551255 Record: &lexutil.LexiconTypeDecoder{
12561256 Val: &tangled.RepoPull{
···12871287 w http.ResponseWriter,
12881288 r *http.Request,
12891289 repo *models.Repo,
12901290- user *oauth.User,
12901290+ user *oauth.MultiAccountUser,
12911291 targetBranch string,
12921292 patch string,
12931293 sourceRev string,
···13551355 })
13561356 }
13571357 _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{
13581358- Repo: user.Did,
13581358+ Repo: user.Active.Did,
13591359 Writes: writes,
13601360 })
13611361 if err != nil {
···14271427}
1428142814291429func (s *Pulls) PatchUploadFragment(w http.ResponseWriter, r *http.Request) {
14301430- user := s.oauth.GetUser(r)
14301430+ user := s.oauth.GetMultiAccountUser(r)
1431143114321432 s.pages.PullPatchUploadFragment(w, pages.PullPatchUploadParams{
14331433 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
···14351435}
1436143614371437func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) {
14381438- user := s.oauth.GetUser(r)
14381438+ user := s.oauth.GetMultiAccountUser(r)
14391439 f, err := s.repoResolver.Resolve(r)
14401440 if err != nil {
14411441 log.Println("failed to get repo and knot", err)
···14901490}
1491149114921492func (s *Pulls) CompareForksFragment(w http.ResponseWriter, r *http.Request) {
14931493- user := s.oauth.GetUser(r)
14931493+ user := s.oauth.GetMultiAccountUser(r)
1494149414951495- forks, err := db.GetForksByDid(s.db, user.Did)
14951495+ forks, err := db.GetForksByDid(s.db, user.Active.Did)
14961496 if err != nil {
14971497 log.Println("failed to get forks", err)
14981498 return
···15061506}
1507150715081508func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) {
15091509- user := s.oauth.GetUser(r)
15091509+ user := s.oauth.GetMultiAccountUser(r)
1510151015111511 f, err := s.repoResolver.Resolve(r)
15121512 if err != nil {
···15991599}
1600160016011601func (s *Pulls) ResubmitPull(w http.ResponseWriter, r *http.Request) {
16021602- user := s.oauth.GetUser(r)
16021602+ user := s.oauth.GetMultiAccountUser(r)
1603160316041604 pull, ok := r.Context().Value("pull").(*models.Pull)
16051605 if !ok {
···16301630}
1631163116321632func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) {
16331633- user := s.oauth.GetUser(r)
16331633+ user := s.oauth.GetMultiAccountUser(r)
1634163416351635 pull, ok := r.Context().Value("pull").(*models.Pull)
16361636 if !ok {
···16451645 return
16461646 }
1647164716481648- if user.Did != pull.OwnerDid {
16481648+ if user.Active.Did != pull.OwnerDid {
16491649 log.Println("unauthorized user")
16501650 w.WriteHeader(http.StatusUnauthorized)
16511651 return
···16571657}
1658165816591659func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) {
16601660- user := s.oauth.GetUser(r)
16601660+ user := s.oauth.GetMultiAccountUser(r)
1661166116621662 pull, ok := r.Context().Value("pull").(*models.Pull)
16631663 if !ok {
···16721672 return
16731673 }
1674167416751675- if user.Did != pull.OwnerDid {
16751675+ if user.Active.Did != pull.OwnerDid {
16761676 log.Println("unauthorized user")
16771677 w.WriteHeader(http.StatusUnauthorized)
16781678 return
16791679 }
1680168016811681- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
16811681+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
16821682 if !roles.IsPushAllowed() {
16831683 log.Println("unauthorized user")
16841684 w.WriteHeader(http.StatusUnauthorized)
···17221722}
1723172317241724func (s *Pulls) resubmitFork(w http.ResponseWriter, r *http.Request) {
17251725- user := s.oauth.GetUser(r)
17251725+ user := s.oauth.GetMultiAccountUser(r)
1726172617271727 pull, ok := r.Context().Value("pull").(*models.Pull)
17281728 if !ok {
···17371737 return
17381738 }
1739173917401740- if user.Did != pull.OwnerDid {
17401740+ if user.Active.Did != pull.OwnerDid {
17411741 log.Println("unauthorized user")
17421742 w.WriteHeader(http.StatusUnauthorized)
17431743 return
···18221822 w http.ResponseWriter,
18231823 r *http.Request,
18241824 repo *models.Repo,
18251825- user *oauth.User,
18251825+ user *oauth.MultiAccountUser,
18261826 pull *models.Pull,
18271827 patch string,
18281828 combined string,
···18781878 return
18791879 }
1880188018811881- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey)
18811881+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Active.Did, pull.Rkey)
18821882 if err != nil {
18831883 // failed to get record
18841884 s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.")
···1897189718981898 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
18991899 Collection: tangled.RepoPullNSID,
19001900- Repo: user.Did,
19001900+ Repo: user.Active.Did,
19011901 Rkey: pull.Rkey,
19021902 SwapRecord: ex.Cid,
19031903 Record: &lexutil.LexiconTypeDecoder{
···19241924 w http.ResponseWriter,
19251925 r *http.Request,
19261926 repo *models.Repo,
19271927- user *oauth.User,
19271927+ user *oauth.MultiAccountUser,
19281928 pull *models.Pull,
19291929 patch string,
19301930 stackId string,
···21142114 }
2115211521162116 _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{
21172117- Repo: user.Did,
21172117+ Repo: user.Active.Did,
21182118 Writes: writes,
21192119 })
21202120 if err != nil {
···21282128}
2129212921302130func (s *Pulls) MergePull(w http.ResponseWriter, r *http.Request) {
21312131- user := s.oauth.GetUser(r)
21312131+ user := s.oauth.GetMultiAccountUser(r)
21322132 f, err := s.repoResolver.Resolve(r)
21332133 if err != nil {
21342134 log.Println("failed to resolve repo:", err)
···2239223922402240 // notify about the pull merge
22412241 for _, p := range pullsToMerge {
22422242- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
22422242+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
22432243 }
2244224422452245 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
···22472247}
2248224822492249func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) {
22502250- user := s.oauth.GetUser(r)
22502250+ user := s.oauth.GetMultiAccountUser(r)
2251225122522252 f, err := s.repoResolver.Resolve(r)
22532253 if err != nil {
···22632263 }
2264226422652265 // auth filter: only owner or collaborators can close
22662266- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
22662266+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
22672267 isOwner := roles.IsOwner()
22682268 isCollaborator := roles.IsCollaborator()
22692269- isPullAuthor := user.Did == pull.OwnerDid
22692269+ isPullAuthor := user.Active.Did == pull.OwnerDid
22702270 isCloseAllowed := isOwner || isCollaborator || isPullAuthor
22712271 if !isCloseAllowed {
22722272 log.Println("failed to close pull")
···23122312 }
2313231323142314 for _, p := range pullsToClose {
23152315- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
23152315+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
23162316 }
2317231723182318 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
···23202320}
2321232123222322func (s *Pulls) ReopenPull(w http.ResponseWriter, r *http.Request) {
23232323- user := s.oauth.GetUser(r)
23232323+ user := s.oauth.GetMultiAccountUser(r)
2324232423252325 f, err := s.repoResolver.Resolve(r)
23262326 if err != nil {
···23372337 }
2338233823392339 // auth filter: only owner or collaborators can close
23402340- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
23402340+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
23412341 isOwner := roles.IsOwner()
23422342 isCollaborator := roles.IsCollaborator()
23432343- isPullAuthor := user.Did == pull.OwnerDid
23432343+ isPullAuthor := user.Active.Did == pull.OwnerDid
23442344 isCloseAllowed := isOwner || isCollaborator || isPullAuthor
23452345 if !isCloseAllowed {
23462346 log.Println("failed to close pull")
···23862386 }
2387238723882388 for _, p := range pullsToReopen {
23892389- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
23892389+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
23902390 }
2391239123922392 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
23932393 s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", ownerSlashRepo, pull.PullId))
23942394}
2395239523962396-func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.User, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) {
23962396+func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.MultiAccountUser, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) {
23972397 formatPatches, err := patchutil.ExtractPatches(patch)
23982398 if err != nil {
23992399 return nil, fmt.Errorf("Failed to extract patches: %v", err)
···24292429 Title: title,
24302430 Body: body,
24312431 TargetBranch: targetBranch,
24322432- OwnerDid: user.Did,
24322432+ OwnerDid: user.Active.Did,
24332433 RepoAt: repo.RepoAt(),
24342434 Rkey: rkey,
24352435 Mentions: mentions,
+6-6
appview/repo/artifact.go
···30303131// TODO: proper statuses here on early exit
3232func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) {
3333- user := rp.oauth.GetUser(r)
3333+ user := rp.oauth.GetMultiAccountUser(r)
3434 tagParam := chi.URLParam(r, "tag")
3535 f, err := rp.repoResolver.Resolve(r)
3636 if err != nil {
···75757676 putRecordResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
7777 Collection: tangled.RepoArtifactNSID,
7878- Repo: user.Did,
7878+ Repo: user.Active.Did,
7979 Rkey: rkey,
8080 Record: &lexutil.LexiconTypeDecoder{
8181 Val: &tangled.RepoArtifact{
···104104 defer tx.Rollback()
105105106106 artifact := models.Artifact{
107107- Did: user.Did,
107107+ Did: user.Active.Did,
108108 Rkey: rkey,
109109 RepoAt: f.RepoAt(),
110110 Tag: tag.Tag.Hash,
···220220221221// TODO: proper statuses here on early exit
222222func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) {
223223- user := rp.oauth.GetUser(r)
223223+ user := rp.oauth.GetMultiAccountUser(r)
224224 tagParam := chi.URLParam(r, "tag")
225225 filename := chi.URLParam(r, "file")
226226 f, err := rp.repoResolver.Resolve(r)
···251251252252 artifact := artifacts[0]
253253254254- if user.Did != artifact.Did {
254254+ if user.Active.Did != artifact.Did {
255255 log.Println("user not authorized to delete artifact", err)
256256 rp.pages.Notice(w, "remove", "Unauthorized deletion of artifact.")
257257 return
···259259260260 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
261261 Collection: tangled.RepoArtifactNSID,
262262- Repo: user.Did,
262262+ Repo: user.Active.Did,
263263 Rkey: artifact.Rkey,
264264 })
265265 if err != nil {
+1-1
appview/repo/blob.go
···7676 // Create the blob view
7777 blobView := NewBlobView(resp, rp.config, f, ref, filePath, r.URL.Query())
78787979- user := rp.oauth.GetUser(r)
7979+ user := rp.oauth.GetMultiAccountUser(r)
80808181 rp.pages.RepoBlob(w, pages.RepoBlobParams{
8282 LoggedInUser: user,