From c77cb9ec40868348847e49021e5e3e25dcaf0a53 Mon Sep 17 00:00:00 2001 From: Lewis Date: Sat, 10 Jan 2026 10:29:48 +0200 Subject: [PATCH] appview: migrate handlers to GetMultiAccountUser Change-Id: rkxnvwomrpytwstqqtvvzxstmttuzxyk --- appview/issues/issues.go | 64 +++++++------- appview/knots/knots.go | 62 +++++++------- appview/labels/labels.go | 4 +- appview/middleware/middleware.go | 14 ++-- appview/notifications/notifications.go | 12 +-- appview/pipelines/pipelines.go | 4 +- appview/pulls/pulls.go | 110 ++++++++++++------------- appview/repo/artifact.go | 12 +-- appview/repo/blob.go | 2 +- appview/repo/branches.go | 2 +- appview/repo/compare.go | 4 +- appview/repo/index.go | 2 +- appview/repo/log.go | 4 +- appview/repo/repo.go | 68 +++++++-------- appview/repo/settings.go | 10 +-- appview/repo/tags.go | 2 +- appview/repo/tree.go | 2 +- appview/reporesolver/resolver.go | 8 +- appview/settings/settings.go | 12 +-- appview/spindles/spindles.go | 82 +++++++++--------- appview/state/follow.go | 14 ++-- appview/state/gfi.go | 2 +- appview/state/profile.go | 64 +++++++------- appview/state/reaction.go | 14 ++-- appview/state/star.go | 12 +-- appview/state/state.go | 44 +++++----- appview/strings/strings.go | 38 ++++----- 27 files changed, 333 insertions(+), 335 deletions(-) diff --git a/appview/issues/issues.go b/appview/issues/issues.go index bc761e32..2ffeb8ac 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -81,7 +81,7 @@ func New( func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoSingleIssue") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -102,7 +102,7 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { userReactions := map[models.ReactionKind]bool{} if user != nil { - userReactions = db.GetReactionStatusMap(rp.db, user.Did, issue.AtUri()) + userReactions = db.GetReactionStatusMap(rp.db, user.Active.Did, issue.AtUri()) } backlinks, err := db.GetBacklinks(rp.db, issue.AtUri()) @@ -143,7 +143,7 @@ func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) { func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "EditIssue") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -182,7 +182,7 @@ func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { return } - ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Did, newIssue.Rkey) + ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Active.Did, newIssue.Rkey) if err != nil { l.Error("failed to get record", "err", err) rp.pages.Notice(w, noticeId, "Failed to edit issue, no record found on PDS.") @@ -191,7 +191,7 @@ func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoIssueNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: newIssue.Rkey, SwapRecord: ex.Cid, Record: &lexutil.LexiconTypeDecoder{ @@ -292,7 +292,7 @@ func (rp *Issues) DeleteIssue(w http.ResponseWriter, r *http.Request) { func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "CloseIssue") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -306,10 +306,10 @@ func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) { return } - roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} isRepoOwner := roles.IsOwner() isCollaborator := roles.IsCollaborator() - isIssueOwner := user.Did == issue.Did + isIssueOwner := user.Active.Did == issue.Did // TODO: make this more granular if isIssueOwner || isRepoOwner || isCollaborator { @@ -326,7 +326,7 @@ func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) { issue.Open = false // notify about the issue closure - rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue) + rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue) ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId)) @@ -340,7 +340,7 @@ func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) { func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "ReopenIssue") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -354,10 +354,10 @@ func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) { return } - roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} isRepoOwner := roles.IsOwner() isCollaborator := roles.IsCollaborator() - isIssueOwner := user.Did == issue.Did + isIssueOwner := user.Active.Did == issue.Did if isCollaborator || isRepoOwner || isIssueOwner { err := db.ReopenIssues( @@ -373,7 +373,7 @@ func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) { issue.Open = true // notify about the issue reopen - rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue) + rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue) ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId)) @@ -387,7 +387,7 @@ func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) { func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "NewIssueComment") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -416,7 +416,7 @@ func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) { mentions, references := rp.mentionsResolver.Resolve(r.Context(), body) comment := models.IssueComment{ - Did: user.Did, + Did: user.Active.Did, Rkey: tid.TID(), IssueAt: issue.AtUri().String(), ReplyTo: replyTo, @@ -495,7 +495,7 @@ func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) { func (rp *Issues) IssueComment(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "IssueComment") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -531,7 +531,7 @@ func (rp *Issues) IssueComment(w http.ResponseWriter, r *http.Request) { func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "EditIssueComment") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -557,8 +557,8 @@ func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { } comment := comments[0] - if comment.Did != user.Did { - l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Did) + if comment.Did != user.Active.Did { + l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Active.Did) http.Error(w, "you are not the author of this comment", http.StatusUnauthorized) return } @@ -608,7 +608,7 @@ func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { // rkey is optional, it was introduced later if newComment.Rkey != "" { // update the record on pds - ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Did, comment.Rkey) + ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Active.Did, comment.Rkey) if err != nil { l.Error("failed to get record", "err", err, "did", newComment.Did, "rkey", newComment.Rkey) rp.pages.Notice(w, fmt.Sprintf("comment-%s-status", commentId), "Failed to update description, no record found on PDS.") @@ -617,7 +617,7 @@ func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoIssueCommentNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: newComment.Rkey, SwapRecord: ex.Cid, Record: &lexutil.LexiconTypeDecoder{ @@ -641,7 +641,7 @@ func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) { func (rp *Issues) ReplyIssueCommentPlaceholder(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "ReplyIssueCommentPlaceholder") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -677,7 +677,7 @@ func (rp *Issues) ReplyIssueCommentPlaceholder(w http.ResponseWriter, r *http.Re func (rp *Issues) ReplyIssueComment(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "ReplyIssueComment") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -713,7 +713,7 @@ func (rp *Issues) ReplyIssueComment(w http.ResponseWriter, r *http.Request) { func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "DeleteIssueComment") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -739,8 +739,8 @@ func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) { } comment := comments[0] - if comment.Did != user.Did { - l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Did) + if comment.Did != user.Active.Did { + l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Active.Did) http.Error(w, "you are not the author of this comment", http.StatusUnauthorized) return } @@ -769,7 +769,7 @@ func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) { } _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.RepoIssueCommentNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: comment.Rkey, }) if err != nil { @@ -807,7 +807,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { page := pagination.FromContext(r.Context()) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -884,7 +884,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { } rp.pages.RepoIssues(w, pages.RepoIssuesParams{ - LoggedInUser: rp.oauth.GetUser(r), + LoggedInUser: rp.oauth.GetMultiAccountUser(r), RepoInfo: rp.repoResolver.GetRepoInfo(r, user), Issues: issues, IssueCount: totalIssues, @@ -897,7 +897,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { func (rp *Issues) NewIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "NewIssue") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -921,7 +921,7 @@ func (rp *Issues) NewIssue(w http.ResponseWriter, r *http.Request) { Title: r.FormValue("title"), Body: body, Open: true, - Did: user.Did, + Did: user.Active.Did, Created: time.Now(), Mentions: mentions, References: references, @@ -945,7 +945,7 @@ func (rp *Issues) NewIssue(w http.ResponseWriter, r *http.Request) { } resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoIssueNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: issue.Rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, diff --git a/appview/knots/knots.go b/appview/knots/knots.go index ef702bb8..6c3ae0e4 100644 --- a/appview/knots/knots.go +++ b/appview/knots/knots.go @@ -70,10 +70,10 @@ func (k *Knots) Router() http.Handler { } func (k *Knots) knots(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), ) if err != nil { k.Logger.Error("failed to fetch knot registrations", "err", err) @@ -92,8 +92,8 @@ func (k *Knots) knots(w http.ResponseWriter, r *http.Request) { func (k *Knots) dashboard(w http.ResponseWriter, r *http.Request) { l := k.Logger.With("handler", "dashboard") - user := k.OAuth.GetUser(r) - l = l.With("user", user.Did) + user := k.OAuth.GetMultiAccountUser(r) + l = l.With("user", user.Active.Did) domain := chi.URLParam(r, "domain") if domain == "" { @@ -103,7 +103,7 @@ func (k *Knots) dashboard(w http.ResponseWriter, r *http.Request) { registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), ) if err != nil { @@ -154,7 +154,7 @@ func (k *Knots) dashboard(w http.ResponseWriter, r *http.Request) { } func (k *Knots) register(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) l := k.Logger.With("handler", "register") noticeId := "register-error" @@ -175,7 +175,7 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { return } l = l.With("domain", domain) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) tx, err := k.Db.Begin() if err != nil { @@ -188,7 +188,7 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { k.Enforcer.E.LoadPolicy() }() - err = db.AddKnot(tx, domain, user.Did) + err = db.AddKnot(tx, domain, user.Active.Did) if err != nil { l.Error("failed to insert", "err", err) fail() @@ -210,7 +210,7 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { return } - ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain) + ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain) var exCid *string if ex != nil { exCid = ex.Cid @@ -219,7 +219,7 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { // re-announce by registering under same rkey _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.KnotNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: domain, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.Knot{ @@ -250,14 +250,14 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { } // begin verification - err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev) + err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev) if err != nil { l.Error("verification failed", "err", err) k.Pages.HxRefresh(w) return } - err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did) + err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did) if err != nil { l.Error("failed to mark verified", "err", err) k.Pages.HxRefresh(w) @@ -275,7 +275,7 @@ func (k *Knots) register(w http.ResponseWriter, r *http.Request) { } func (k *Knots) delete(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) l := k.Logger.With("handler", "delete") noticeId := "operation-error" @@ -294,7 +294,7 @@ func (k *Knots) delete(w http.ResponseWriter, r *http.Request) { // get record from db first registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), ) if err != nil { @@ -322,7 +322,7 @@ func (k *Knots) delete(w http.ResponseWriter, r *http.Request) { err = db.DeleteKnot( tx, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), ) if err != nil { @@ -350,7 +350,7 @@ func (k *Knots) delete(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.KnotNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: domain, }) if err != nil { @@ -382,7 +382,7 @@ func (k *Knots) delete(w http.ResponseWriter, r *http.Request) { } func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) l := k.Logger.With("handler", "retry") noticeId := "operation-error" @@ -398,12 +398,12 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { return } l = l.With("domain", domain) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) // get record from db first registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), ) if err != nil { @@ -419,7 +419,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { registration := registrations[0] // begin verification - err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev) + err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev) if err != nil { l.Error("verification failed", "err", err) @@ -437,7 +437,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { return } - err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did) + err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did) if err != nil { l.Error("failed to mark verified", "err", err) k.Pages.Notice(w, noticeId, err.Error()) @@ -456,7 +456,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { return } - ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain) + ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain) var exCid *string if ex != nil { exCid = ex.Cid @@ -465,7 +465,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { // ignore the error here _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.KnotNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: domain, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.Knot{ @@ -494,7 +494,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { // Get updated registration to show registrations, err = db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), ) if err != nil { @@ -516,7 +516,7 @@ func (k *Knots) retry(w http.ResponseWriter, r *http.Request) { } func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) l := k.Logger.With("handler", "addMember") domain := chi.URLParam(r, "domain") @@ -526,11 +526,11 @@ func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) { return } l = l.With("domain", domain) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), orm.FilterIsNot("registered", "null"), ) @@ -583,7 +583,7 @@ func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.KnotMemberNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.KnotMember{ @@ -618,7 +618,7 @@ func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) { } func (k *Knots) removeMember(w http.ResponseWriter, r *http.Request) { - user := k.OAuth.GetUser(r) + user := k.OAuth.GetMultiAccountUser(r) l := k.Logger.With("handler", "removeMember") noticeId := "operation-error" @@ -634,11 +634,11 @@ func (k *Knots) removeMember(w http.ResponseWriter, r *http.Request) { return } l = l.With("domain", domain) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) registrations, err := db.GetRegistrations( k.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("domain", domain), orm.FilterIsNot("registered", "null"), ) diff --git a/appview/labels/labels.go b/appview/labels/labels.go index ce5432b7..7aea6e6a 100644 --- a/appview/labels/labels.go +++ b/appview/labels/labels.go @@ -68,7 +68,7 @@ func (l *Labels) Router() http.Handler { // - this handler should calculate the diff in order to create the labelop record // - we need the diff in order to maintain a "history" of operations performed by users func (l *Labels) PerformLabelOp(w http.ResponseWriter, r *http.Request) { - user := l.oauth.GetUser(r) + user := l.oauth.GetMultiAccountUser(r) noticeId := "add-label-error" @@ -82,7 +82,7 @@ func (l *Labels) PerformLabelOp(w http.ResponseWriter, r *http.Request) { return } - did := user.Did + did := user.Active.Did rkey := tid.TID() performedAt := time.Now() indexedAt := time.Now() diff --git a/appview/middleware/middleware.go b/appview/middleware/middleware.go index a1e16f3d..46e0f307 100644 --- a/appview/middleware/middleware.go +++ b/appview/middleware/middleware.go @@ -115,7 +115,7 @@ func (mw Middleware) knotRoleMiddleware(group string) middlewareFunc { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // requires auth also - actor := mw.oauth.GetUser(r) + actor := mw.oauth.GetMultiAccountUser(r) if actor == nil { // we need a logged in user log.Printf("not logged in, redirecting") @@ -128,10 +128,9 @@ func (mw Middleware) knotRoleMiddleware(group string) middlewareFunc { return } - ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Did, group, domain) + ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Active.Did, group, domain) if err != nil || !ok { - // we need a logged in user - log.Printf("%s does not have perms of a %s in domain %s", actor.Did, group, domain) + log.Printf("%s does not have perms of a %s in domain %s", actor.Active.Did, group, domain) http.Error(w, "Forbiden", http.StatusUnauthorized) return } @@ -149,7 +148,7 @@ func (mw Middleware) RepoPermissionMiddleware(requiredPerm string) middlewareFun return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // requires auth also - actor := mw.oauth.GetUser(r) + actor := mw.oauth.GetMultiAccountUser(r) if actor == nil { // we need a logged in user log.Printf("not logged in, redirecting") @@ -162,10 +161,9 @@ func (mw Middleware) RepoPermissionMiddleware(requiredPerm string) middlewareFun return } - ok, err := mw.enforcer.E.Enforce(actor.Did, f.Knot, f.DidSlashRepo(), requiredPerm) + ok, err := mw.enforcer.E.Enforce(actor.Active.Did, f.Knot, f.DidSlashRepo(), requiredPerm) if err != nil || !ok { - // we need a logged in user - log.Printf("%s does not have perms of a %s in repo %s", actor.Did, requiredPerm, f.DidSlashRepo()) + log.Printf("%s does not have perms of a %s in repo %s", actor.Active.Did, requiredPerm, f.DidSlashRepo()) http.Error(w, "Forbiden", http.StatusUnauthorized) return } diff --git a/appview/notifications/notifications.go b/appview/notifications/notifications.go index b4b643ab..def2571f 100644 --- a/appview/notifications/notifications.go +++ b/appview/notifications/notifications.go @@ -48,13 +48,13 @@ func (n *Notifications) Router(mw *middleware.Middleware) http.Handler { func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request) { l := n.logger.With("handler", "notificationsPage") - user := n.oauth.GetUser(r) + user := n.oauth.GetMultiAccountUser(r) page := pagination.FromContext(r.Context()) total, err := db.CountNotifications( n.db, - orm.FilterEq("recipient_did", user.Did), + orm.FilterEq("recipient_did", user.Active.Did), ) if err != nil { l.Error("failed to get total notifications", "err", err) @@ -65,7 +65,7 @@ func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request notifications, err := db.GetNotificationsWithEntities( n.db, page, - orm.FilterEq("recipient_did", user.Did), + orm.FilterEq("recipient_did", user.Active.Did), ) if err != nil { l.Error("failed to get notifications", "err", err) @@ -73,7 +73,7 @@ func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request return } - err = db.MarkAllNotificationsRead(n.db, user.Did) + err = db.MarkAllNotificationsRead(n.db, user.Active.Did) if err != nil { l.Error("failed to mark notifications as read", "err", err) } @@ -90,14 +90,14 @@ func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request } func (n *Notifications) getUnreadCount(w http.ResponseWriter, r *http.Request) { - user := n.oauth.GetUser(r) + user := n.oauth.GetMultiAccountUser(r) if user == nil { return } count, err := db.CountNotifications( n.db, - orm.FilterEq("recipient_did", user.Did), + orm.FilterEq("recipient_did", user.Active.Did), orm.FilterEq("read", 0), ) if err != nil { diff --git a/appview/pipelines/pipelines.go b/appview/pipelines/pipelines.go index d28ca623..ca483943 100644 --- a/appview/pipelines/pipelines.go +++ b/appview/pipelines/pipelines.go @@ -70,7 +70,7 @@ func New( } func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) { - user := p.oauth.GetUser(r) + user := p.oauth.GetMultiAccountUser(r) l := p.logger.With("handler", "Index") f, err := p.repoResolver.Resolve(r) @@ -99,7 +99,7 @@ func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) { } func (p *Pipelines) Workflow(w http.ResponseWriter, r *http.Request) { - user := p.oauth.GetUser(r) + user := p.oauth.GetMultiAccountUser(r) l := p.logger.With("handler", "Workflow") f, err := p.repoResolver.Resolve(r) diff --git a/appview/pulls/pulls.go b/appview/pulls/pulls.go index 25b3abd7..9881ad12 100644 --- a/appview/pulls/pulls.go +++ b/appview/pulls/pulls.go @@ -93,7 +93,7 @@ func New( func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to get repo and knot", err) @@ -124,7 +124,7 @@ func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) { mergeCheckResponse := s.mergeCheck(r, f, pull, stack) branchDeleteStatus := s.branchDeleteStatus(r, f, pull) resubmitResult := pages.Unknown - if user.Did == pull.OwnerDid { + if user.Active.Did == pull.OwnerDid { resubmitResult = s.resubmitCheck(r, f, pull, stack) } @@ -143,7 +143,7 @@ func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to get repo and knot", err) @@ -171,7 +171,7 @@ func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) { mergeCheckResponse := s.mergeCheck(r, f, pull, stack) branchDeleteStatus := s.branchDeleteStatus(r, f, pull) resubmitResult := pages.Unknown - if user != nil && user.Did == pull.OwnerDid { + if user != nil && user.Active != nil && user.Active.Did == pull.OwnerDid { resubmitResult = s.resubmitCheck(r, f, pull, stack) } @@ -213,7 +213,7 @@ func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) { userReactions := map[models.ReactionKind]bool{} if user != nil { - userReactions = db.GetReactionStatusMap(s.db, user.Did, pull.AtUri()) + userReactions = db.GetReactionStatusMap(s.db, user.Active.Did, pull.AtUri()) } labelDefs, err := db.GetLabelDefinitions( @@ -324,7 +324,7 @@ func (s *Pulls) branchDeleteStatus(r *http.Request, repo *models.Repo, pull *mod return nil } - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) if user == nil { return nil } @@ -347,7 +347,7 @@ func (s *Pulls) branchDeleteStatus(r *http.Request, repo *models.Repo, pull *mod } // user can only delete branch if they are a collaborator in the repo that the branch belongs to - perms := s.enforcer.GetPermissionsInRepo(user.Did, repo.Knot, repo.DidSlashRepo()) + perms := s.enforcer.GetPermissionsInRepo(user.Active.Did, repo.Knot, repo.DidSlashRepo()) if !slices.Contains(perms, "repo:push") { return nil } @@ -434,7 +434,7 @@ func (s *Pulls) resubmitCheck(r *http.Request, repo *models.Repo, pull *models.P } func (s *Pulls) RepoPullPatch(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) var diffOpts types.DiffOpts if d := r.URL.Query().Get("diff"); d == "split" { @@ -475,7 +475,7 @@ func (s *Pulls) RepoPullPatch(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) var diffOpts types.DiffOpts if d := r.URL.Query().Get("diff"); d == "split" { @@ -520,7 +520,7 @@ func (s *Pulls) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) { interdiff := patchutil.Interdiff(previousPatch, currentPatch) s.pages.RepoPullInterdiffPage(w, pages.RepoPullInterdiffParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), RepoInfo: s.repoResolver.GetRepoInfo(r, user), Pull: pull, Round: roundIdInt, @@ -552,7 +552,7 @@ func (s *Pulls) RepoPullPatchRaw(w http.ResponseWriter, r *http.Request) { func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "RepoPulls") - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) params := r.URL.Query() state := models.PullOpen @@ -680,7 +680,7 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { } s.pages.RepoPulls(w, pages.RepoPullsParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), RepoInfo: s.repoResolver.GetRepoInfo(r, user), Pulls: pulls, LabelDefs: defs, @@ -692,7 +692,7 @@ func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to get repo and knot", err) @@ -751,7 +751,7 @@ func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) { } atResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoPullCommentNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: tid.TID(), Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.RepoPullComment{ @@ -768,7 +768,7 @@ func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) { } comment := &models.PullComment{ - OwnerDid: user.Did, + OwnerDid: user.Active.Did, RepoAt: f.RepoAt().String(), PullId: pull.PullId, Body: body, @@ -802,7 +802,7 @@ func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to get repo and knot", err) @@ -870,7 +870,7 @@ func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) { } // Determine PR type based on input parameters - roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} isPushAllowed := roles.IsPushAllowed() isBranchBased := isPushAllowed && sourceBranch != "" && fromFork == "" isForkBased := fromFork != "" && sourceBranch != "" @@ -970,7 +970,7 @@ func (s *Pulls) handleBranchBasedPull( w http.ResponseWriter, r *http.Request, repo *models.Repo, - user *oauth.User, + user *oauth.MultiAccountUser, title, body, targetBranch, @@ -1027,7 +1027,7 @@ func (s *Pulls) handleBranchBasedPull( s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, combined, sourceRev, pullSource, recordPullSource, isStacked) } -func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.User, title, body, targetBranch, patch string, isStacked bool) { +func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.MultiAccountUser, title, body, targetBranch, patch string, isStacked bool) { if err := s.validator.ValidatePatch(&patch); err != nil { s.logger.Error("patch validation failed", "err", err) s.pages.Notice(w, "pull", "Invalid patch format. Please provide a valid diff.") @@ -1037,7 +1037,7 @@ func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, rep s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, "", "", nil, nil, isStacked) } -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) { +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) { repoString := strings.SplitN(forkRepo, "/", 2) forkOwnerDid := repoString[0] repoName := repoString[1] @@ -1146,7 +1146,7 @@ func (s *Pulls) createPullRequest( w http.ResponseWriter, r *http.Request, repo *models.Repo, - user *oauth.User, + user *oauth.MultiAccountUser, title, body, targetBranch string, patch string, combined string, @@ -1218,7 +1218,7 @@ func (s *Pulls) createPullRequest( Title: title, Body: body, TargetBranch: targetBranch, - OwnerDid: user.Did, + OwnerDid: user.Active.Did, RepoAt: repo.RepoAt(), Rkey: rkey, Mentions: mentions, @@ -1250,7 +1250,7 @@ func (s *Pulls) createPullRequest( _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoPullNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.RepoPull{ @@ -1287,7 +1287,7 @@ func (s *Pulls) createStackedPullRequest( w http.ResponseWriter, r *http.Request, repo *models.Repo, - user *oauth.User, + user *oauth.MultiAccountUser, targetBranch string, patch string, sourceRev string, @@ -1355,7 +1355,7 @@ func (s *Pulls) createStackedPullRequest( }) } _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{ - Repo: user.Did, + Repo: user.Active.Did, Writes: writes, }) if err != nil { @@ -1427,7 +1427,7 @@ func (s *Pulls) ValidatePatch(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) PatchUploadFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) s.pages.PullPatchUploadFragment(w, pages.PullPatchUploadParams{ RepoInfo: s.repoResolver.GetRepoInfo(r, user), @@ -1435,7 +1435,7 @@ func (s *Pulls) PatchUploadFragment(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to get repo and knot", err) @@ -1490,9 +1490,9 @@ func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) } func (s *Pulls) CompareForksFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) - forks, err := db.GetForksByDid(s.db, user.Did) + forks, err := db.GetForksByDid(s.db, user.Active.Did) if err != nil { log.Println("failed to get forks", err) return @@ -1506,7 +1506,7 @@ func (s *Pulls) CompareForksFragment(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { @@ -1599,7 +1599,7 @@ func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Requ } func (s *Pulls) ResubmitPull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) pull, ok := r.Context().Value("pull").(*models.Pull) if !ok { @@ -1630,7 +1630,7 @@ func (s *Pulls) ResubmitPull(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) pull, ok := r.Context().Value("pull").(*models.Pull) if !ok { @@ -1645,7 +1645,7 @@ func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) { return } - if user.Did != pull.OwnerDid { + if user.Active.Did != pull.OwnerDid { log.Println("unauthorized user") w.WriteHeader(http.StatusUnauthorized) return @@ -1657,7 +1657,7 @@ func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) pull, ok := r.Context().Value("pull").(*models.Pull) if !ok { @@ -1672,13 +1672,13 @@ func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) { return } - if user.Did != pull.OwnerDid { + if user.Active.Did != pull.OwnerDid { log.Println("unauthorized user") w.WriteHeader(http.StatusUnauthorized) return } - roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} if !roles.IsPushAllowed() { log.Println("unauthorized user") w.WriteHeader(http.StatusUnauthorized) @@ -1722,7 +1722,7 @@ func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) resubmitFork(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) pull, ok := r.Context().Value("pull").(*models.Pull) if !ok { @@ -1737,7 +1737,7 @@ func (s *Pulls) resubmitFork(w http.ResponseWriter, r *http.Request) { return } - if user.Did != pull.OwnerDid { + if user.Active.Did != pull.OwnerDid { log.Println("unauthorized user") w.WriteHeader(http.StatusUnauthorized) return @@ -1822,7 +1822,7 @@ func (s *Pulls) resubmitPullHelper( w http.ResponseWriter, r *http.Request, repo *models.Repo, - user *oauth.User, + user *oauth.MultiAccountUser, pull *models.Pull, patch string, combined string, @@ -1878,7 +1878,7 @@ func (s *Pulls) resubmitPullHelper( return } - ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey) + ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Active.Did, pull.Rkey) if err != nil { // failed to get record s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.") @@ -1897,7 +1897,7 @@ func (s *Pulls) resubmitPullHelper( _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoPullNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: pull.Rkey, SwapRecord: ex.Cid, Record: &lexutil.LexiconTypeDecoder{ @@ -1924,7 +1924,7 @@ func (s *Pulls) resubmitStackedPullHelper( w http.ResponseWriter, r *http.Request, repo *models.Repo, - user *oauth.User, + user *oauth.MultiAccountUser, pull *models.Pull, patch string, stackId string, @@ -2114,7 +2114,7 @@ func (s *Pulls) resubmitStackedPullHelper( } _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{ - Repo: user.Did, + Repo: user.Active.Did, Writes: writes, }) if err != nil { @@ -2128,7 +2128,7 @@ func (s *Pulls) resubmitStackedPullHelper( } func (s *Pulls) MergePull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { log.Println("failed to resolve repo:", err) @@ -2239,7 +2239,7 @@ func (s *Pulls) MergePull(w http.ResponseWriter, r *http.Request) { // notify about the pull merge for _, p := range pullsToMerge { - s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p) + s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p) } ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) @@ -2247,7 +2247,7 @@ func (s *Pulls) MergePull(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { @@ -2263,10 +2263,10 @@ func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) { } // auth filter: only owner or collaborators can close - roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} isOwner := roles.IsOwner() isCollaborator := roles.IsCollaborator() - isPullAuthor := user.Did == pull.OwnerDid + isPullAuthor := user.Active.Did == pull.OwnerDid isCloseAllowed := isOwner || isCollaborator || isPullAuthor if !isCloseAllowed { log.Println("failed to close pull") @@ -2312,7 +2312,7 @@ func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) { } for _, p := range pullsToClose { - s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p) + s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p) } ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) @@ -2320,7 +2320,7 @@ func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) { } func (s *Pulls) ReopenPull(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) f, err := s.repoResolver.Resolve(r) if err != nil { @@ -2337,10 +2337,10 @@ func (s *Pulls) ReopenPull(w http.ResponseWriter, r *http.Request) { } // auth filter: only owner or collaborators can close - roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())} + roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())} isOwner := roles.IsOwner() isCollaborator := roles.IsCollaborator() - isPullAuthor := user.Did == pull.OwnerDid + isPullAuthor := user.Active.Did == pull.OwnerDid isCloseAllowed := isOwner || isCollaborator || isPullAuthor if !isCloseAllowed { log.Println("failed to close pull") @@ -2386,14 +2386,14 @@ func (s *Pulls) ReopenPull(w http.ResponseWriter, r *http.Request) { } for _, p := range pullsToReopen { - s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p) + s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p) } ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f) s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", ownerSlashRepo, pull.PullId)) } -func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.User, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) { +func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.MultiAccountUser, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) { formatPatches, err := patchutil.ExtractPatches(patch) if err != nil { return nil, fmt.Errorf("Failed to extract patches: %v", err) @@ -2429,7 +2429,7 @@ func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.Use Title: title, Body: body, TargetBranch: targetBranch, - OwnerDid: user.Did, + OwnerDid: user.Active.Did, RepoAt: repo.RepoAt(), Rkey: rkey, Mentions: mentions, diff --git a/appview/repo/artifact.go b/appview/repo/artifact.go index 195976f4..365f01f3 100644 --- a/appview/repo/artifact.go +++ b/appview/repo/artifact.go @@ -30,7 +30,7 @@ import ( // TODO: proper statuses here on early exit func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) tagParam := chi.URLParam(r, "tag") f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -75,7 +75,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { putRecordResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoArtifactNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.RepoArtifact{ @@ -104,7 +104,7 @@ func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) { defer tx.Rollback() artifact := models.Artifact{ - Did: user.Did, + Did: user.Active.Did, Rkey: rkey, RepoAt: f.RepoAt(), Tag: tag.Tag.Hash, @@ -220,7 +220,7 @@ func (rp *Repo) DownloadArtifact(w http.ResponseWriter, r *http.Request) { // TODO: proper statuses here on early exit func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) tagParam := chi.URLParam(r, "tag") filename := chi.URLParam(r, "file") f, err := rp.repoResolver.Resolve(r) @@ -251,7 +251,7 @@ func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) { artifact := artifacts[0] - if user.Did != artifact.Did { + if user.Active.Did != artifact.Did { log.Println("user not authorized to delete artifact", err) rp.pages.Notice(w, "remove", "Unauthorized deletion of artifact.") return @@ -259,7 +259,7 @@ func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.RepoArtifactNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: artifact.Rkey, }) if err != nil { diff --git a/appview/repo/blob.go b/appview/repo/blob.go index c4b15806..7bc3209c 100644 --- a/appview/repo/blob.go +++ b/appview/repo/blob.go @@ -76,7 +76,7 @@ func (rp *Repo) Blob(w http.ResponseWriter, r *http.Request) { // Create the blob view blobView := NewBlobView(resp, rp.config, f, ref, filePath, r.URL.Query()) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) rp.pages.RepoBlob(w, pages.RepoBlobParams{ LoggedInUser: user, diff --git a/appview/repo/branches.go b/appview/repo/branches.go index be74c0de..ce38b862 100644 --- a/appview/repo/branches.go +++ b/appview/repo/branches.go @@ -43,7 +43,7 @@ func (rp *Repo) Branches(w http.ResponseWriter, r *http.Request) { return } sortBranches(result.Branches) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) rp.pages.RepoBranches(w, pages.RepoBranchesParams{ LoggedInUser: user, RepoInfo: rp.repoResolver.GetRepoInfo(r, user), diff --git a/appview/repo/compare.go b/appview/repo/compare.go index 3d00a6cd..92a7fdba 100644 --- a/appview/repo/compare.go +++ b/appview/repo/compare.go @@ -20,7 +20,7 @@ import ( func (rp *Repo) CompareNew(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoCompareNew") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -101,7 +101,7 @@ func (rp *Repo) CompareNew(w http.ResponseWriter, r *http.Request) { func (rp *Repo) Compare(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "RepoCompare") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) diff --git a/appview/repo/index.go b/appview/repo/index.go index 3c56f586..62f000b4 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -51,7 +51,7 @@ func (rp *Repo) Index(w http.ResponseWriter, r *http.Request) { Host: host, } - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) // Build index response from multiple XRPC calls result, err := rp.buildIndexResponse(r.Context(), xrpcc, f, ref) diff --git a/appview/repo/log.go b/appview/repo/log.go index ef4d9e62..d9b9c713 100644 --- a/appview/repo/log.go +++ b/appview/repo/log.go @@ -109,7 +109,7 @@ func (rp *Repo) Log(w http.ResponseWriter, r *http.Request) { } } - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) emailToDidMap, err := db.GetEmailToDid(rp.db, uniqueEmails(xrpcResp.Commits), true) if err != nil { @@ -197,7 +197,7 @@ func (rp *Repo) Commit(w http.ResponseWriter, r *http.Request) { l.Error("failed to GetVerifiedCommits", "err", err) } - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) pipelines, err := getPipelineStatuses(rp.db, f, []string{result.Diff.Commit.This}) if err != nil { l.Error("failed to getPipelineStatuses", "err", err) diff --git a/appview/repo/repo.go b/appview/repo/repo.go index 4f1fba6b..f04f9061 100644 --- a/appview/repo/repo.go +++ b/appview/repo/repo.go @@ -81,9 +81,9 @@ func New( // modify the spindle configured for this repo func (rp *Repo) EditSpindle(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "EditSpindle") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) errorId := "operation-error" fail := func(msg string, err error) { @@ -107,7 +107,7 @@ func (rp *Repo) EditSpindle(w http.ResponseWriter, r *http.Request) { if !removingSpindle { // ensure that this is a valid spindle for this user - validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Did) + validSpindles, err := rp.enforcer.GetSpindlesForUser(user.Active.Did) if err != nil { fail("Failed to find spindles. Try again later.", err) return @@ -168,9 +168,9 @@ func (rp *Repo) EditSpindle(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) AddLabelDef(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "AddLabel") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -216,7 +216,7 @@ func (rp *Repo) AddLabelDef(w http.ResponseWriter, r *http.Request) { } label := models.LabelDefinition{ - Did: user.Did, + Did: user.Active.Did, Rkey: tid.TID(), Name: name, ValueType: valueType, @@ -327,9 +327,9 @@ func (rp *Repo) AddLabelDef(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) DeleteLabelDef(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "DeleteLabel") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -435,9 +435,9 @@ func (rp *Repo) DeleteLabelDef(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) SubscribeLabel(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "SubscribeLabel") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -521,9 +521,9 @@ func (rp *Repo) SubscribeLabel(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) UnsubscribeLabel(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "UnsubscribeLabel") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -633,7 +633,7 @@ func (rp *Repo) LabelPanel(w http.ResponseWriter, r *http.Request) { } state := states[subject] - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) rp.pages.LabelPanel(w, pages.LabelPanelParams{ LoggedInUser: user, RepoInfo: rp.repoResolver.GetRepoInfo(r, user), @@ -681,7 +681,7 @@ func (rp *Repo) EditLabelPanel(w http.ResponseWriter, r *http.Request) { } state := states[subject] - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) rp.pages.EditLabelPanel(w, pages.EditLabelPanelParams{ LoggedInUser: user, RepoInfo: rp.repoResolver.GetRepoInfo(r, user), @@ -692,9 +692,9 @@ func (rp *Repo) EditLabelPanel(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "AddCollaborator") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -723,7 +723,7 @@ func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { return } - if collaboratorIdent.DID.String() == user.Did { + if collaboratorIdent.DID.String() == user.Active.Did { fail("You seem to be adding yourself as a collaborator.", nil) return } @@ -738,12 +738,12 @@ func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { } // emit a record - currentUser := rp.oauth.GetUser(r) + currentUser := rp.oauth.GetMultiAccountUser(r) rkey := tid.TID() createdAt := time.Now() resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoCollaboratorNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.RepoCollaborator{ @@ -792,7 +792,7 @@ func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { } err = db.AddCollaborator(tx, models.Collaborator{ - Did: syntax.DID(currentUser.Did), + Did: syntax.DID(currentUser.Active.Did), Rkey: rkey, SubjectDid: collaboratorIdent.DID, RepoAt: f.RepoAt(), @@ -822,7 +822,7 @@ func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "DeleteRepo") noticeId := "operation-error" @@ -840,7 +840,7 @@ func (rp *Repo) DeleteRepo(w http.ResponseWriter, r *http.Request) { } _, err = comatproto.RepoDeleteRecord(r.Context(), atpClient, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.RepoNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: f.Rkey, }) if err != nil { @@ -940,7 +940,7 @@ func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) { ref := chi.URLParam(r, "ref") ref, _ = url.PathUnescape(ref) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to resolve source repo", "err", err) @@ -969,7 +969,7 @@ func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) { r.Context(), client, &tangled.RepoForkSync_Input{ - Did: user.Did, + Did: user.Active.Did, Name: f.Name, Source: f.Source, Branch: ref, @@ -988,7 +988,7 @@ func (rp *Repo) SyncRepoFork(w http.ResponseWriter, r *http.Request) { func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "ForkRepo") - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to resolve source repo", "err", err) @@ -997,8 +997,8 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - user := rp.oauth.GetUser(r) - knots, err := rp.enforcer.GetKnotsForUser(user.Did) + user := rp.oauth.GetMultiAccountUser(r) + knots, err := rp.enforcer.GetKnotsForUser(user.Active.Did) if err != nil { rp.pages.Notice(w, "repo", "Invalid user account.") return @@ -1020,7 +1020,7 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { } l = l.With("targetKnot", targetKnot) - ok, err := rp.enforcer.E.Enforce(user.Did, targetKnot, targetKnot, "repo:create") + ok, err := rp.enforcer.E.Enforce(user.Active.Did, targetKnot, targetKnot, "repo:create") if err != nil || !ok { rp.pages.Notice(w, "repo", "You do not have permission to create a repo in this knot.") return @@ -1037,7 +1037,7 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { // in the user's account. existingRepo, err := db.GetRepo( rp.db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("name", forkName), ) if err != nil { @@ -1066,7 +1066,7 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { // create an atproto record for this fork rkey := tid.TID() repo := &models.Repo{ - Did: user.Did, + Did: user.Active.Did, Name: forkName, Knot: targetKnot, Rkey: rkey, @@ -1086,7 +1086,7 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { atresp, err := comatproto.RepoPutRecord(r.Context(), atpClient, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, @@ -1165,8 +1165,8 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { } // acls - p, _ := securejoin.SecureJoin(user.Did, forkName) - err = rp.enforcer.AddRepo(user.Did, targetKnot, p) + p, _ := securejoin.SecureJoin(user.Active.Did, forkName) + err = rp.enforcer.AddRepo(user.Active.Did, targetKnot, p) if err != nil { l.Error("failed to add ACLs", "err", err) rp.pages.Notice(w, "repo", "Failed to set up repository permissions.") @@ -1191,7 +1191,7 @@ func (rp *Repo) ForkRepo(w http.ResponseWriter, r *http.Request) { aturi = "" rp.notifier.NewRepo(r.Context(), repo) - rp.pages.HxLocation(w, fmt.Sprintf("/%s/%s", user.Did, forkName)) + rp.pages.HxLocation(w, fmt.Sprintf("/%s/%s", user.Active.Did, forkName)) } } diff --git a/appview/repo/settings.go b/appview/repo/settings.go index b1dd0a89..863cd76e 100644 --- a/appview/repo/settings.go +++ b/appview/repo/settings.go @@ -79,9 +79,9 @@ func (rp *Repo) SetDefaultBranch(w http.ResponseWriter, r *http.Request) { } func (rp *Repo) Secrets(w http.ResponseWriter, r *http.Request) { - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) l := rp.logger.With("handler", "Secrets") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) f, err := rp.repoResolver.Resolve(r) if err != nil { @@ -185,7 +185,7 @@ func (rp *Repo) generalSettings(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "generalSettings") f, err := rp.repoResolver.Resolve(r) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) scheme := "http" if !rp.config.Core.Dev { @@ -271,7 +271,7 @@ func (rp *Repo) accessSettings(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "accessSettings") f, err := rp.repoResolver.Resolve(r) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) collaborators, err := func(repo *models.Repo) ([]pages.Collaborator, error) { repoCollaborators, err := rp.enforcer.E.GetImplicitUsersForResourceByDomain(repo.DidSlashRepo(), repo.Knot) @@ -318,7 +318,7 @@ func (rp *Repo) pipelineSettings(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "pipelineSettings") f, err := rp.repoResolver.Resolve(r) - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) // all spindles that the repo owner is a member of spindles, err := rp.enforcer.GetSpindlesForUser(f.Did) diff --git a/appview/repo/tags.go b/appview/repo/tags.go index 783e02d2..e81aed53 100644 --- a/appview/repo/tags.go +++ b/appview/repo/tags.go @@ -69,7 +69,7 @@ func (rp *Repo) Tags(w http.ResponseWriter, r *http.Request) { danglingArtifacts = append(danglingArtifacts, a) } } - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) rp.pages.RepoTags(w, pages.RepoTagsParams{ LoggedInUser: user, RepoInfo: rp.repoResolver.GetRepoInfo(r, user), diff --git a/appview/repo/tree.go b/appview/repo/tree.go index b9fc910a..9161041b 100644 --- a/appview/repo/tree.go +++ b/appview/repo/tree.go @@ -88,7 +88,7 @@ func (rp *Repo) Tree(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, redirectTo, http.StatusFound) return } - user := rp.oauth.GetUser(r) + user := rp.oauth.GetMultiAccountUser(r) var breadcrumbs [][]string breadcrumbs = append(breadcrumbs, []string{f.Name, fmt.Sprintf("/%s/tree/%s", ownerSlashRepo, url.PathEscape(ref))}) if treePath != "" { diff --git a/appview/reporesolver/resolver.go b/appview/reporesolver/resolver.go index c7fe61ed..18e493b2 100644 --- a/appview/reporesolver/resolver.go +++ b/appview/reporesolver/resolver.go @@ -55,7 +55,7 @@ func (rr *RepoResolver) Resolve(r *http.Request) (*models.Repo, error) { // 2. [x] remove `rr`, `CurrentDir`, `Ref` fields from `ResolvedRepo` // 3. [x] remove `ResolvedRepo` // 4. [ ] replace reporesolver to reposervice -func (rr *RepoResolver) GetRepoInfo(r *http.Request, user *oauth.User) repoinfo.RepoInfo { +func (rr *RepoResolver) GetRepoInfo(r *http.Request, user *oauth.MultiAccountUser) repoinfo.RepoInfo { ownerId, ook := r.Context().Value("resolvedId").(identity.Identity) repo, rok := r.Context().Value("repo").(*models.Repo) if !ook || !rok { @@ -69,9 +69,9 @@ func (rr *RepoResolver) GetRepoInfo(r *http.Request, user *oauth.User) repoinfo. repoAt := repo.RepoAt() isStarred := false roles := repoinfo.RolesInRepo{} - if user != nil { - isStarred = db.GetStarStatus(rr.execer, user.Did, repoAt) - roles.Roles = rr.enforcer.GetPermissionsInRepo(user.Did, repo.Knot, repo.DidSlashRepo()) + if user != nil && user.Active != nil { + isStarred = db.GetStarStatus(rr.execer, user.Active.Did, repoAt) + roles.Roles = rr.enforcer.GetPermissionsInRepo(user.Active.Did, repo.Knot, repo.DidSlashRepo()) } stats := repo.RepoStats diff --git a/appview/settings/settings.go b/appview/settings/settings.go index b91e3c20..2a337e8b 100644 --- a/appview/settings/settings.go +++ b/appview/settings/settings.go @@ -81,7 +81,7 @@ func (s *Settings) Router() http.Handler { } func (s *Settings) profileSettings(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) s.Pages.UserProfileSettings(w, pages.UserProfileSettingsParams{ LoggedInUser: user, @@ -91,7 +91,7 @@ func (s *Settings) profileSettings(w http.ResponseWriter, r *http.Request) { } func (s *Settings) notificationsSettings(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) did := s.OAuth.GetDid(r) prefs, err := db.GetNotificationPreference(s.Db, did) @@ -137,8 +137,8 @@ func (s *Settings) updateNotificationPreferences(w http.ResponseWriter, r *http. } func (s *Settings) keysSettings(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) - pubKeys, err := db.GetPublicKeysForDid(s.Db, user.Did) + user := s.OAuth.GetMultiAccountUser(r) + pubKeys, err := db.GetPublicKeysForDid(s.Db, user.Active.Did) if err != nil { log.Println(err) } @@ -152,8 +152,8 @@ func (s *Settings) keysSettings(w http.ResponseWriter, r *http.Request) { } func (s *Settings) emailsSettings(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) - emails, err := db.GetAllEmails(s.Db, user.Did) + user := s.OAuth.GetMultiAccountUser(r) + emails, err := db.GetAllEmails(s.Db, user.Active.Did) if err != nil { log.Println(err) } diff --git a/appview/spindles/spindles.go b/appview/spindles/spindles.go index 52bbd9a1..729e58d1 100644 --- a/appview/spindles/spindles.go +++ b/appview/spindles/spindles.go @@ -69,10 +69,10 @@ func (s *Spindles) Router() http.Handler { } func (s *Spindles) spindles(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) all, err := db.GetSpindles( s.Db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), ) if err != nil { s.Logger.Error("failed to fetch spindles", "err", err) @@ -91,8 +91,8 @@ func (s *Spindles) spindles(w http.ResponseWriter, r *http.Request) { func (s *Spindles) dashboard(w http.ResponseWriter, r *http.Request) { l := s.Logger.With("handler", "dashboard") - user := s.OAuth.GetUser(r) - l = l.With("user", user.Did) + user := s.OAuth.GetMultiAccountUser(r) + l = l.With("user", user.Active.Did) instance := chi.URLParam(r, "instance") if instance == "" { @@ -103,7 +103,7 @@ func (s *Spindles) dashboard(w http.ResponseWriter, r *http.Request) { spindles, err := db.GetSpindles( s.Db, orm.FilterEq("instance", instance), - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterIsNot("verified", "null"), ) if err != nil || len(spindles) != 1 { @@ -155,7 +155,7 @@ func (s *Spindles) dashboard(w http.ResponseWriter, r *http.Request) { // // if the spindle is not up yet, the user is free to retry verification at a later point func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) l := s.Logger.With("handler", "register") noticeId := "register-error" @@ -176,7 +176,7 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { return } l = l.With("instance", instance) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) tx, err := s.Db.Begin() if err != nil { @@ -190,7 +190,7 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { }() err = db.AddSpindle(tx, models.Spindle{ - Owner: syntax.DID(user.Did), + Owner: syntax.DID(user.Active.Did), Instance: instance, }) if err != nil { @@ -214,7 +214,7 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { return } - ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.SpindleNSID, user.Did, instance) + ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.SpindleNSID, user.Active.Did, instance) var exCid *string if ex != nil { exCid = ex.Cid @@ -223,7 +223,7 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { // re-announce by registering under same rkey _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.SpindleNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: instance, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.Spindle{ @@ -254,14 +254,14 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { } // begin verification - err = serververify.RunVerification(r.Context(), instance, user.Did, s.Config.Core.Dev) + err = serververify.RunVerification(r.Context(), instance, user.Active.Did, s.Config.Core.Dev) if err != nil { l.Error("verification failed", "err", err) s.Pages.HxRefresh(w) return } - _, err = serververify.MarkSpindleVerified(s.Db, s.Enforcer, instance, user.Did) + _, err = serververify.MarkSpindleVerified(s.Db, s.Enforcer, instance, user.Active.Did) if err != nil { l.Error("failed to mark verified", "err", err) s.Pages.HxRefresh(w) @@ -273,7 +273,7 @@ func (s *Spindles) register(w http.ResponseWriter, r *http.Request) { } func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) l := s.Logger.With("handler", "delete") noticeId := "operation-error" @@ -291,7 +291,7 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { spindles, err := db.GetSpindles( s.Db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil || len(spindles) != 1 { @@ -300,8 +300,8 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { return } - if string(spindles[0].Owner) != user.Did { - l.Error("unauthorized", "user", user.Did, "owner", spindles[0].Owner) + if string(spindles[0].Owner) != user.Active.Did { + l.Error("unauthorized", "user", user.Active.Did, "owner", spindles[0].Owner) s.Pages.Notice(w, noticeId, "Failed to delete spindle, unauthorized deletion attempt.") return } @@ -320,7 +320,7 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { // remove spindle members first err = db.RemoveSpindleMember( tx, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil { @@ -331,7 +331,7 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { err = db.DeleteSpindle( tx, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil { @@ -359,7 +359,7 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.SpindleNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: instance, }) if err != nil { @@ -391,7 +391,7 @@ func (s *Spindles) delete(w http.ResponseWriter, r *http.Request) { } func (s *Spindles) retry(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) l := s.Logger.With("handler", "retry") noticeId := "operation-error" @@ -407,11 +407,11 @@ func (s *Spindles) retry(w http.ResponseWriter, r *http.Request) { return } l = l.With("instance", instance) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) spindles, err := db.GetSpindles( s.Db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil || len(spindles) != 1 { @@ -420,14 +420,14 @@ func (s *Spindles) retry(w http.ResponseWriter, r *http.Request) { return } - if string(spindles[0].Owner) != user.Did { - l.Error("unauthorized", "user", user.Did, "owner", spindles[0].Owner) + if string(spindles[0].Owner) != user.Active.Did { + l.Error("unauthorized", "user", user.Active.Did, "owner", spindles[0].Owner) s.Pages.Notice(w, noticeId, "Failed to verify spindle, unauthorized verification attempt.") return } // begin verification - err = serververify.RunVerification(r.Context(), instance, user.Did, s.Config.Core.Dev) + err = serververify.RunVerification(r.Context(), instance, user.Active.Did, s.Config.Core.Dev) if err != nil { l.Error("verification failed", "err", err) @@ -445,7 +445,7 @@ func (s *Spindles) retry(w http.ResponseWriter, r *http.Request) { return } - rowId, err := serververify.MarkSpindleVerified(s.Db, s.Enforcer, instance, user.Did) + rowId, err := serververify.MarkSpindleVerified(s.Db, s.Enforcer, instance, user.Active.Did) if err != nil { l.Error("failed to mark verified", "err", err) s.Pages.Notice(w, noticeId, err.Error()) @@ -473,7 +473,7 @@ func (s *Spindles) retry(w http.ResponseWriter, r *http.Request) { } func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) l := s.Logger.With("handler", "addMember") instance := chi.URLParam(r, "instance") @@ -483,11 +483,11 @@ func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { return } l = l.With("instance", instance) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) spindles, err := db.GetSpindles( s.Db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil || len(spindles) != 1 { @@ -502,8 +502,8 @@ func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { s.Pages.Notice(w, noticeId, defaultErr) } - if string(spindles[0].Owner) != user.Did { - l.Error("unauthorized", "user", user.Did, "owner", spindles[0].Owner) + if string(spindles[0].Owner) != user.Active.Did { + l.Error("unauthorized", "user", user.Active.Did, "owner", spindles[0].Owner) s.Pages.Notice(w, noticeId, "Failed to add member, unauthorized attempt.") return } @@ -552,7 +552,7 @@ func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { // add member to db if err = db.AddSpindleMember(tx, models.SpindleMember{ - Did: syntax.DID(user.Did), + Did: syntax.DID(user.Active.Did), Rkey: rkey, Instance: instance, Subject: memberId.DID, @@ -570,7 +570,7 @@ func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.SpindleMemberNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.SpindleMember{ @@ -603,7 +603,7 @@ func (s *Spindles) addMember(w http.ResponseWriter, r *http.Request) { } func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) l := s.Logger.With("handler", "removeMember") noticeId := "operation-error" @@ -619,11 +619,11 @@ func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { return } l = l.With("instance", instance) - l = l.With("user", user.Did) + l = l.With("user", user.Active.Did) spindles, err := db.GetSpindles( s.Db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("instance", instance), ) if err != nil || len(spindles) != 1 { @@ -632,8 +632,8 @@ func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { return } - if string(spindles[0].Owner) != user.Did { - l.Error("unauthorized", "user", user.Did, "owner", spindles[0].Owner) + if string(spindles[0].Owner) != user.Active.Did { + l.Error("unauthorized", "user", user.Active.Did, "owner", spindles[0].Owner) s.Pages.Notice(w, noticeId, "Failed to remove member, unauthorized attempt.") return } @@ -668,7 +668,7 @@ func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { // get the record from the DB first: members, err := db.GetSpindleMembers( s.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("instance", instance), orm.FilterEq("subject", memberId.DID), ) @@ -681,7 +681,7 @@ func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { // remove from db if err = db.RemoveSpindleMember( tx, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("instance", instance), orm.FilterEq("subject", memberId.DID), ); err != nil { @@ -707,7 +707,7 @@ func (s *Spindles) removeMember(w http.ResponseWriter, r *http.Request) { // remove from pds _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.SpindleMemberNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: members[0].Rkey, }) if err != nil { diff --git a/appview/state/follow.go b/appview/state/follow.go index 9e218cac..1e8344f9 100644 --- a/appview/state/follow.go +++ b/appview/state/follow.go @@ -15,7 +15,7 @@ import ( ) func (s *State) Follow(w http.ResponseWriter, r *http.Request) { - currentUser := s.oauth.GetUser(r) + currentUser := s.oauth.GetMultiAccountUser(r) subject := r.URL.Query().Get("subject") if subject == "" { @@ -29,7 +29,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { return } - if currentUser.Did == subjectIdent.DID.String() { + if currentUser.Active.Did == subjectIdent.DID.String() { log.Println("cant follow or unfollow yourself") return } @@ -46,7 +46,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { rkey := tid.TID() resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.GraphFollowNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.GraphFollow{ @@ -62,7 +62,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { log.Println("created atproto record: ", resp.Uri) follow := &models.Follow{ - UserDid: currentUser.Did, + UserDid: currentUser.Active.Did, SubjectDid: subjectIdent.DID.String(), Rkey: rkey, } @@ -83,7 +83,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { return case http.MethodDelete: // find the record in the db - follow, err := db.GetFollow(s.db, currentUser.Did, subjectIdent.DID.String()) + follow, err := db.GetFollow(s.db, currentUser.Active.Did, subjectIdent.DID.String()) if err != nil { log.Println("failed to get follow relationship") return @@ -91,7 +91,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.GraphFollowNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: follow.Rkey, }) @@ -100,7 +100,7 @@ func (s *State) Follow(w http.ResponseWriter, r *http.Request) { return } - err = db.DeleteFollowByRkey(s.db, currentUser.Did, follow.Rkey) + err = db.DeleteFollowByRkey(s.db, currentUser.Active.Did, follow.Rkey) if err != nil { log.Println("failed to delete follow from DB") // this is not an issue, the firehose event might have already done this diff --git a/appview/state/gfi.go b/appview/state/gfi.go index 63fa3bba..2c1d8cf7 100644 --- a/appview/state/gfi.go +++ b/appview/state/gfi.go @@ -15,7 +15,7 @@ import ( ) func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) page := pagination.FromContext(r.Context()) diff --git a/appview/state/profile.go b/appview/state/profile.go index 576a934e..1f678a54 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -77,10 +77,10 @@ func (s *State) profile(r *http.Request) (*pages.ProfileCard, error) { return nil, fmt.Errorf("failed to get follower stats: %w", err) } - loggedInUser := s.oauth.GetUser(r) + loggedInUser := s.oauth.GetMultiAccountUser(r) followStatus := models.IsNotFollowing if loggedInUser != nil { - followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, did) + followStatus = db.GetFollowStatus(s.db, loggedInUser.Active.Did, did) } now := time.Now() @@ -174,7 +174,7 @@ func (s *State) profileOverview(w http.ResponseWriter, r *http.Request) { } s.pages.ProfileOverview(w, pages.ProfileOverviewParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Card: profile, Repos: pinnedRepos, CollaboratingRepos: pinnedCollaboratingRepos, @@ -205,7 +205,7 @@ func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { } err = s.pages.ProfileRepos(w, pages.ProfileReposParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Repos: repos, Card: profile, }) @@ -234,7 +234,7 @@ func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { } err = s.pages.ProfileStarred(w, pages.ProfileStarredParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Repos: repos, Card: profile, }) @@ -259,7 +259,7 @@ func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) { } err = s.pages.ProfileStrings(w, pages.ProfileStringsParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Strings: strings, Card: profile, }) @@ -283,7 +283,7 @@ func (s *State) followPage( } l = l.With("profileDid", profile.UserDid) - loggedInUser := s.oauth.GetUser(r) + loggedInUser := s.oauth.GetMultiAccountUser(r) params := FollowsPageParams{ Card: profile, } @@ -316,9 +316,9 @@ func (s *State) followPage( loggedInUserFollowing := make(map[string]struct{}) if loggedInUser != nil { - following, err := db.GetFollowing(s.db, loggedInUser.Did) + following, err := db.GetFollowing(s.db, loggedInUser.Active.Did) if err != nil { - l.Error("failed to get follow list", "err", err, "loggedInUser", loggedInUser.Did) + l.Error("failed to get follow list", "err", err, "loggedInUser", loggedInUser.Active.Did) return ¶ms, err } loggedInUserFollowing = make(map[string]struct{}, len(following)) @@ -333,7 +333,7 @@ func (s *State) followPage( followStatus := models.IsNotFollowing if _, exists := loggedInUserFollowing[did]; exists { followStatus = models.IsFollowing - } else if loggedInUser != nil && loggedInUser.Did == did { + } else if loggedInUser != nil && loggedInUser.Active.Did == did { followStatus = models.IsSelf } @@ -367,7 +367,7 @@ func (s *State) followersPage(w http.ResponseWriter, r *http.Request) { } s.pages.ProfileFollowers(w, pages.ProfileFollowersParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Followers: followPage.Follows, Card: followPage.Card, }) @@ -381,7 +381,7 @@ func (s *State) followingPage(w http.ResponseWriter, r *http.Request) { } s.pages.ProfileFollowing(w, pages.ProfileFollowingParams{ - LoggedInUser: s.oauth.GetUser(r), + LoggedInUser: s.oauth.GetMultiAccountUser(r), Following: followPage.Follows, Card: followPage.Card, }) @@ -530,7 +530,7 @@ func (s *State) createRepoItem(ctx context.Context, repo models.RepoEvent, autho } func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) err := r.ParseForm() if err != nil { @@ -539,9 +539,9 @@ func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) { return } - profile, err := db.GetProfile(s.db, user.Did) + profile, err := db.GetProfile(s.db, user.Active.Did) if err != nil { - log.Printf("getting profile data for %s: %s", user.Did, err) + log.Printf("getting profile data for %s: %s", user.Active.Did, err) } profile.Description = r.FormValue("description") @@ -578,7 +578,7 @@ func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) { } func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) err := r.ParseForm() if err != nil { @@ -587,9 +587,9 @@ func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) { return } - profile, err := db.GetProfile(s.db, user.Did) + profile, err := db.GetProfile(s.db, user.Active.Did) if err != nil { - log.Printf("getting profile data for %s: %s", user.Did, err) + log.Printf("getting profile data for %s: %s", user.Active.Did, err) } i := 0 @@ -617,7 +617,7 @@ func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) { } func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) tx, err := s.db.BeginTx(r.Context(), nil) if err != nil { log.Println("failed to start transaction", err) @@ -644,7 +644,7 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r vanityStats = append(vanityStats, string(v.Kind)) } - ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.ActorProfileNSID, user.Did, "self") + ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.ActorProfileNSID, user.Active.Did, "self") var cid *string if ex != nil { cid = ex.Cid @@ -652,7 +652,7 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.ActorProfileNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: "self", Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.ActorProfile{ @@ -681,15 +681,15 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r s.notifier.UpdateProfile(r.Context(), profile) - s.pages.HxRedirect(w, "/"+user.Did) + s.pages.HxRedirect(w, "/"+user.Active.Did) } func (s *State) EditBioFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) - profile, err := db.GetProfile(s.db, user.Did) + profile, err := db.GetProfile(s.db, user.Active.Did) if err != nil { - log.Printf("getting profile data for %s: %s", user.Did, err) + log.Printf("getting profile data for %s: %s", user.Active.Did, err) } s.pages.EditBioFragment(w, pages.EditBioParams{ @@ -699,21 +699,21 @@ func (s *State) EditBioFragment(w http.ResponseWriter, r *http.Request) { } func (s *State) EditPinsFragment(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) - profile, err := db.GetProfile(s.db, user.Did) + profile, err := db.GetProfile(s.db, user.Active.Did) if err != nil { - log.Printf("getting profile data for %s: %s", user.Did, err) + log.Printf("getting profile data for %s: %s", user.Active.Did, err) } - repos, err := db.GetRepos(s.db, 0, orm.FilterEq("did", user.Did)) + repos, err := db.GetRepos(s.db, 0, orm.FilterEq("did", user.Active.Did)) if err != nil { - log.Printf("getting repos for %s: %s", user.Did, err) + log.Printf("getting repos for %s: %s", user.Active.Did, err) } - collaboratingRepos, err := db.CollaboratingIn(s.db, user.Did) + collaboratingRepos, err := db.CollaboratingIn(s.db, user.Active.Did) if err != nil { - log.Printf("getting collaborating repos for %s: %s", user.Did, err) + log.Printf("getting collaborating repos for %s: %s", user.Active.Did, err) } allRepos := []pages.PinnedRepo{} diff --git a/appview/state/reaction.go b/appview/state/reaction.go index d4385b11..4dfceede 100644 --- a/appview/state/reaction.go +++ b/appview/state/reaction.go @@ -17,7 +17,7 @@ import ( ) func (s *State) React(w http.ResponseWriter, r *http.Request) { - currentUser := s.oauth.GetUser(r) + currentUser := s.oauth.GetMultiAccountUser(r) subject := r.URL.Query().Get("subject") if subject == "" { @@ -49,7 +49,7 @@ func (s *State) React(w http.ResponseWriter, r *http.Request) { rkey := tid.TID() resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.FeedReactionNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.FeedReaction{ @@ -64,7 +64,7 @@ func (s *State) React(w http.ResponseWriter, r *http.Request) { return } - err = db.AddReaction(s.db, currentUser.Did, subjectUri, reactionKind, rkey) + err = db.AddReaction(s.db, currentUser.Active.Did, subjectUri, reactionKind, rkey) if err != nil { log.Println("failed to react", err) return @@ -87,15 +87,15 @@ func (s *State) React(w http.ResponseWriter, r *http.Request) { return case http.MethodDelete: - reaction, err := db.GetReaction(s.db, currentUser.Did, subjectUri, reactionKind) + reaction, err := db.GetReaction(s.db, currentUser.Active.Did, subjectUri, reactionKind) if err != nil { - log.Println("failed to get reaction relationship for", currentUser.Did, subjectUri) + log.Println("failed to get reaction relationship for", currentUser.Active.Did, subjectUri) return } _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.FeedReactionNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: reaction.Rkey, }) @@ -104,7 +104,7 @@ func (s *State) React(w http.ResponseWriter, r *http.Request) { return } - err = db.DeleteReactionByRkey(s.db, currentUser.Did, reaction.Rkey) + err = db.DeleteReactionByRkey(s.db, currentUser.Active.Did, reaction.Rkey) if err != nil { log.Println("failed to delete reaction from DB") // this is not an issue, the firehose event might have already done this diff --git a/appview/state/star.go b/appview/state/star.go index 8677a759..64ceb55a 100644 --- a/appview/state/star.go +++ b/appview/state/star.go @@ -16,7 +16,7 @@ import ( ) func (s *State) Star(w http.ResponseWriter, r *http.Request) { - currentUser := s.oauth.GetUser(r) + currentUser := s.oauth.GetMultiAccountUser(r) subject := r.URL.Query().Get("subject") if subject == "" { @@ -42,7 +42,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { rkey := tid.TID() resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.FeedStarNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &tangled.FeedStar{ @@ -57,7 +57,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { log.Println("created atproto record: ", resp.Uri) star := &models.Star{ - Did: currentUser.Did, + Did: currentUser.Active.Did, RepoAt: subjectUri, Rkey: rkey, } @@ -84,7 +84,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { return case http.MethodDelete: // find the record in the db - star, err := db.GetStar(s.db, currentUser.Did, subjectUri) + star, err := db.GetStar(s.db, currentUser.Active.Did, subjectUri) if err != nil { log.Println("failed to get star relationship") return @@ -92,7 +92,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{ Collection: tangled.FeedStarNSID, - Repo: currentUser.Did, + Repo: currentUser.Active.Did, Rkey: star.Rkey, }) @@ -101,7 +101,7 @@ func (s *State) Star(w http.ResponseWriter, r *http.Request) { return } - err = db.DeleteStarByRkey(s.db, currentUser.Did, star.Rkey) + err = db.DeleteStarByRkey(s.db, currentUser.Active.Did, star.Rkey) if err != nil { log.Println("failed to delete star from DB") // this is not an issue, the firehose event might have already done this diff --git a/appview/state/state.go b/appview/state/state.go index 11d94a5d..c23e7da3 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -249,28 +249,28 @@ func (p *State) PWAManifest(w http.ResponseWriter, r *http.Request) { } func (s *State) TermsOfService(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) s.pages.TermsOfService(w, pages.TermsOfServiceParams{ LoggedInUser: user, }) } func (s *State) PrivacyPolicy(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) s.pages.PrivacyPolicy(w, pages.PrivacyPolicyParams{ LoggedInUser: user, }) } func (s *State) Brand(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) s.pages.Brand(w, pages.BrandParams{ LoggedInUser: user, }) } func (s *State) HomeOrTimeline(w http.ResponseWriter, r *http.Request) { - if s.oauth.GetUser(r) != nil { + if s.oauth.GetMultiAccountUser(r) != nil { s.Timeline(w, r) return } @@ -278,14 +278,14 @@ func (s *State) HomeOrTimeline(w http.ResponseWriter, r *http.Request) { } func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) // TODO: set this flag based on the UI filtered := false var userDid string - if user != nil { - userDid = user.Did + if user != nil && user.Active != nil { + userDid = user.Active.Did } timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) if err != nil { @@ -314,17 +314,17 @@ func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { } func (s *State) UpgradeBanner(w http.ResponseWriter, r *http.Request) { - user := s.oauth.GetUser(r) + user := s.oauth.GetMultiAccountUser(r) if user == nil { return } l := s.logger.With("handler", "UpgradeBanner") - l = l.With("did", user.Did) + l = l.With("did", user.Active.Did) regs, err := db.GetRegistrations( s.db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("needs_upgrade", 1), ) if err != nil { @@ -333,7 +333,7 @@ func (s *State) UpgradeBanner(w http.ResponseWriter, r *http.Request) { spindles, err := db.GetSpindles( s.db, - orm.FilterEq("owner", user.Did), + orm.FilterEq("owner", user.Active.Did), orm.FilterEq("needs_upgrade", 1), ) if err != nil { @@ -447,8 +447,8 @@ func stripGitExt(name string) string { func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - user := s.oauth.GetUser(r) - knots, err := s.enforcer.GetKnotsForUser(user.Did) + user := s.oauth.GetMultiAccountUser(r) + knots, err := s.enforcer.GetKnotsForUser(user.Active.Did) if err != nil { s.pages.Notice(w, "repo", "Invalid user account.") return @@ -462,8 +462,8 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { case http.MethodPost: l := s.logger.With("handler", "NewRepo") - user := s.oauth.GetUser(r) - l = l.With("did", user.Did) + user := s.oauth.GetMultiAccountUser(r) + l = l.With("did", user.Active.Did) // form validation domain := r.FormValue("domain") @@ -495,7 +495,7 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { description := r.FormValue("description") // ACL validation - ok, err := s.enforcer.E.Enforce(user.Did, domain, domain, "repo:create") + ok, err := s.enforcer.E.Enforce(user.Active.Did, domain, domain, "repo:create") if err != nil || !ok { l.Info("unauthorized") s.pages.Notice(w, "repo", "You do not have permission to create a repo in this knot.") @@ -505,7 +505,7 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { // Check for existing repos existingRepo, err := db.GetRepo( s.db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("name", repoName), ) if err == nil && existingRepo != nil { @@ -517,7 +517,7 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { // create atproto record for this repo rkey := tid.TID() repo := &models.Repo{ - Did: user.Did, + Did: user.Active.Did, Name: repoName, Knot: domain, Rkey: rkey, @@ -536,7 +536,7 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { atresp, err := comatproto.RepoPutRecord(r.Context(), atpClient, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, @@ -613,8 +613,8 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { } // acls - p, _ := securejoin.SecureJoin(user.Did, repoName) - err = s.enforcer.AddRepo(user.Did, domain, p) + p, _ := securejoin.SecureJoin(user.Active.Did, repoName) + err = s.enforcer.AddRepo(user.Active.Did, domain, p) if err != nil { l.Error("acl setup failed", "err", err) s.pages.Notice(w, "repo", "Failed to set up repository permissions.") @@ -639,7 +639,7 @@ func (s *State) NewRepo(w http.ResponseWriter, r *http.Request) { aturi = "" s.notifier.NewRepo(r.Context(), repo) - s.pages.HxLocation(w, fmt.Sprintf("/%s/%s", user.Did, repoName)) + s.pages.HxLocation(w, fmt.Sprintf("/%s/%s", user.Active.Did, repoName)) } } diff --git a/appview/strings/strings.go b/appview/strings/strings.go index f12beb8c..0a9c2692 100644 --- a/appview/strings/strings.go +++ b/appview/strings/strings.go @@ -82,7 +82,7 @@ func (s *Strings) timeline(w http.ResponseWriter, r *http.Request) { } s.Pages.StringsTimeline(w, pages.StringTimelineParams{ - LoggedInUser: s.OAuth.GetUser(r), + LoggedInUser: s.OAuth.GetMultiAccountUser(r), Strings: strings, }) } @@ -153,10 +153,10 @@ func (s *Strings) contents(w http.ResponseWriter, r *http.Request) { if err != nil { l.Error("failed to get star count", "err", err) } - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) isStarred := false if user != nil { - isStarred = db.GetStarStatus(s.Db, user.Did, string.AtUri()) + isStarred = db.GetStarStatus(s.Db, user.Active.Did, string.AtUri()) } s.Pages.SingleString(w, pages.SingleStringParams{ @@ -178,7 +178,7 @@ func (s *Strings) dashboard(w http.ResponseWriter, r *http.Request) { func (s *Strings) edit(w http.ResponseWriter, r *http.Request) { l := s.Logger.With("handler", "edit") - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) id, ok := r.Context().Value("resolvedId").(identity.Identity) if !ok { @@ -216,8 +216,8 @@ func (s *Strings) edit(w http.ResponseWriter, r *http.Request) { first := all[0] // verify that the logged in user owns this string - if user.Did != id.DID.String() { - l.Error("unauthorized request", "expected", id.DID, "got", user.Did) + if user.Active.Did != id.DID.String() { + l.Error("unauthorized request", "expected", id.DID, "got", user.Active.Did) w.WriteHeader(http.StatusUnauthorized) return } @@ -226,7 +226,7 @@ func (s *Strings) edit(w http.ResponseWriter, r *http.Request) { case http.MethodGet: // return the form with prefilled fields s.Pages.PutString(w, pages.PutStringParams{ - LoggedInUser: s.OAuth.GetUser(r), + LoggedInUser: s.OAuth.GetMultiAccountUser(r), Action: "edit", String: first, }) @@ -299,19 +299,19 @@ func (s *Strings) edit(w http.ResponseWriter, r *http.Request) { s.Notifier.EditString(r.Context(), &entry) // if that went okay, redir to the string - s.Pages.HxRedirect(w, "/strings/"+user.Did+"/"+entry.Rkey) + s.Pages.HxRedirect(w, "/strings/"+user.Active.Did+"/"+entry.Rkey) } } func (s *Strings) create(w http.ResponseWriter, r *http.Request) { l := s.Logger.With("handler", "create") - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) switch r.Method { case http.MethodGet: s.Pages.PutString(w, pages.PutStringParams{ - LoggedInUser: s.OAuth.GetUser(r), + LoggedInUser: s.OAuth.GetMultiAccountUser(r), Action: "new", }) case http.MethodPost: @@ -335,7 +335,7 @@ func (s *Strings) create(w http.ResponseWriter, r *http.Request) { description := r.FormValue("description") string := models.String{ - Did: syntax.DID(user.Did), + Did: syntax.DID(user.Active.Did), Rkey: tid.TID(), Filename: filename, Description: description, @@ -353,7 +353,7 @@ func (s *Strings) create(w http.ResponseWriter, r *http.Request) { resp, err := comatproto.RepoPutRecord(r.Context(), client, &atproto.RepoPutRecord_Input{ Collection: tangled.StringNSID, - Repo: user.Did, + Repo: user.Active.Did, Rkey: string.Rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, @@ -375,13 +375,13 @@ func (s *Strings) create(w http.ResponseWriter, r *http.Request) { s.Notifier.NewString(r.Context(), &string) // successful - s.Pages.HxRedirect(w, "/strings/"+user.Did+"/"+string.Rkey) + s.Pages.HxRedirect(w, "/strings/"+user.Active.Did+"/"+string.Rkey) } } func (s *Strings) delete(w http.ResponseWriter, r *http.Request) { l := s.Logger.With("handler", "create") - user := s.OAuth.GetUser(r) + user := s.OAuth.GetMultiAccountUser(r) fail := func(msg string, err error) { l.Error(msg, "err", err) s.Pages.Notice(w, "error", msg) @@ -402,23 +402,23 @@ func (s *Strings) delete(w http.ResponseWriter, r *http.Request) { return } - if user.Did != id.DID.String() { - fail("You cannot delete this string", fmt.Errorf("unauthorized deletion, %s != %s", user.Did, id.DID.String())) + if user.Active.Did != id.DID.String() { + fail("You cannot delete this string", fmt.Errorf("unauthorized deletion, %s != %s", user.Active.Did, id.DID.String())) return } if err := db.DeleteString( s.Db, - orm.FilterEq("did", user.Did), + orm.FilterEq("did", user.Active.Did), orm.FilterEq("rkey", rkey), ); err != nil { fail("Failed to delete string.", err) return } - s.Notifier.DeleteString(r.Context(), user.Did, rkey) + s.Notifier.DeleteString(r.Context(), user.Active.Did, rkey) - s.Pages.HxRedirect(w, "/strings/"+user.Did) + s.Pages.HxRedirect(w, "/strings/"+user.Active.Did) } func (s *Strings) comment(w http.ResponseWriter, r *http.Request) { -- 2.43.0