diff --git a/appview/issues/issues.go b/appview/issues/issues.go index c138128c..72781017 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -239,6 +239,11 @@ func (rp *Issues) SubscribeIssue(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.GetMultiAccountUser(r) + if user == nil { + l.Error("nil user") + rp.pages.Notice(w, "issues", "You must be logged in to edit this issue.") + return + } issue, ok := r.Context().Value("issue").(*models.Issue) if !ok { @@ -247,6 +252,12 @@ func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) { return } + if user.Did != issue.Did { + l.Error("unauthorized issue edit", "expectedDid", issue.Did, "gotDid", user.Did) + rp.pages.Notice(w, "issues", "You are not authorized to edit this issue.") + return + } + switch r.Method { case http.MethodGet: rp.pages.EditIssueFragment(w, pages.EditIssueParams{ @@ -277,7 +288,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, issue.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.") @@ -295,7 +306,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: issue.Did, Rkey: newIssue.Rkey, SwapRecord: ex.Cid, Record: &lexutil.LexiconTypeDecoder{ @@ -338,6 +349,13 @@ func (rp *Issues) DeleteIssue(w http.ResponseWriter, r *http.Request) { l := rp.logger.With("handler", "DeleteIssue") noticeId := "issue-actions-error" + user := rp.oauth.GetMultiAccountUser(r) + if user == nil { + l.Error("nil user") + rp.pages.Notice(w, noticeId, "You must be logged in to delete this issue.") + return + } + f, err := rp.repoResolver.Resolve(r) if err != nil { l.Error("failed to get repo and knot", "err", err) @@ -352,6 +370,11 @@ func (rp *Issues) DeleteIssue(w http.ResponseWriter, r *http.Request) { } l = l.With("did", issue.Did, "rkey", issue.Rkey) + if user.Did != issue.Did { + l.Error("unauthorized issue delete", "expectedDid", issue.Did, "gotDid", user.Did) + rp.pages.Notice(w, noticeId, "You are not authorized to delete this issue.") + return + } tx, err := rp.db.Begin() if err != nil { l.Error("failed to start transaction", "err", err) diff --git a/appview/pulls/edit.go b/appview/pulls/edit.go index 0a46efad..3b5cce0b 100644 --- a/appview/pulls/edit.go +++ b/appview/pulls/edit.go @@ -15,6 +15,11 @@ import ( func (s *Pulls) EditPull(w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "EditPull") user := s.oauth.GetMultiAccountUser(r) + if user == nil { + l.Error("nil user") + s.pages.Notice(w, "pulls", "You must be logged in to edit this pull request.") + return + } ctx := r.Context() pull, ok := r.Context().Value("pull").(*models.Pull) @@ -24,6 +29,12 @@ func (s *Pulls) EditPull(w http.ResponseWriter, r *http.Request) { return } + if user.Did != pull.OwnerDid { + l.Error("unauthorized pull edit", "expectedDid", pull.OwnerDid, "gotDid", user.Did) + s.pages.Notice(w, "pulls", "You are not authorized to edit this pull request.") + return + } + switch r.Method { case http.MethodGet: s.pages.EditPullFragment(w, pages.EditPullParams{ @@ -46,7 +57,7 @@ func (s *Pulls) EditPull(w http.ResponseWriter, r *http.Request) { return } - ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, newPull.Rkey) + ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, pull.OwnerDid, newPull.Rkey) if err != nil { l.Error("failed to get record", "err", err) s.pages.Notice(w, noticeId, "Failed to edit pull, no record found on PDS.") @@ -65,7 +76,7 @@ func (s *Pulls) EditPull(w http.ResponseWriter, r *http.Request) { newRecord := newPull.AsRecord() _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.RepoPullNSID, - Repo: user.Did, + Repo: pull.OwnerDid, Rkey: newPull.Rkey, SwapRecord: ex.Cid, Record: &lexutil.LexiconTypeDecoder{ diff --git a/appview/pulls/resubmit.go b/appview/pulls/resubmit.go index 7c704fec..623e6571 100644 --- a/appview/pulls/resubmit.go +++ b/appview/pulls/resubmit.go @@ -42,6 +42,11 @@ func (s *Pulls) ResubmitPull(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: + if user == nil || user.Did != pull.OwnerDid { + l.Warn("unauthorized user", "actual_user", user, "expected_owner", pull.OwnerDid) + w.WriteHeader(http.StatusUnauthorized) + return + } s.pages.PullResubmitFragment(w, pages.PullResubmitParams{ RepoInfo: s.repoResolver.GetRepoInfo(r, user), Pull: pull,