···288288 foreign key (at_uri) references repos(at_uri) on delete cascade
289289 );
290290291291+ create table if not exists oauth_requests (
292292+ id integer primary key autoincrement,
293293+ auth_server_iss text not null,
294294+ state text not null,
295295+ did text not null,
296296+ handle text not null,
297297+ pds_url text not null,
298298+ pkce_verifier text not null,
299299+ dpop_auth_server_nonce text not null,
300300+ dpop_private_jwk text not null
301301+ );
302302+303303+ create table if not exists oauth_sessions (
304304+ id integer primary key autoincrement,
305305+ did text not null,
306306+ handle text not null,
307307+ pds_url text not null,
308308+ auth_server_iss text not null,
309309+ access_jwt text not null,
310310+ refresh_jwt text not null,
311311+ dpop_pds_nonce text,
312312+ dpop_auth_server_nonce text not null,
313313+ dpop_private_jwk text not null,
314314+ expiry text not null
315315+ );
316316+291317 create table if not exists migrations (
292318 id integer primary key autoincrement,
293319 name text unique
···2020 return func(next http.Handler) http.Handler {
2121 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
2222 // requires auth also
2323- actor := s.auth.GetUser(r)
2323+ actor := s.oauth.GetUser(r)
2424 if actor == nil {
2525 // we need a logged in user
2626 log.Printf("not logged in, redirecting")
···5454 return func(next http.Handler) http.Handler {
5555 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
5656 // requires auth also
5757- actor := s.auth.GetUser(r)
5757+ actor := s.oauth.GetUser(r)
5858 if actor == nil {
5959 // we need a logged in user
6060 log.Printf("not logged in, redirecting")
+17-12
appview/state/profile.go
···119119 log.Printf("getting follow stats repos for %s: %s", ident.DID.String(), err)
120120 }
121121122122- loggedInUser := s.auth.GetUser(r)
122122+ loggedInUser := s.oauth.GetUser(r)
123123 followStatus := db.IsNotFollowing
124124 if loggedInUser != nil {
125125 followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
···161161 log.Printf("getting repos for %s: %s", ident.DID.String(), err)
162162 }
163163164164- loggedInUser := s.auth.GetUser(r)
164164+ loggedInUser := s.oauth.GetUser(r)
165165 followStatus := db.IsNotFollowing
166166 if loggedInUser != nil {
167167 followStatus = db.GetFollowStatus(s.db, loggedInUser.Did, ident.DID.String())
···190190}
191191192192func (s *State) GetAvatarUri(handle string) string {
193193- secret := s.config.AvatarSharedSecret
193193+ secret := s.config.Avatar.SharedSecret
194194 h := hmac.New(sha256.New, []byte(secret))
195195 h.Write([]byte(handle))
196196 signature := hex.EncodeToString(h.Sum(nil))
197197- return fmt.Sprintf("%s/%s/%s", s.config.AvatarHost, signature, handle)
197197+ return fmt.Sprintf("%s/%s/%s", s.config.Avatar.Host, signature, handle)
198198}
199199200200func (s *State) UpdateProfileBio(w http.ResponseWriter, r *http.Request) {
201201- user := s.auth.GetUser(r)
201201+ user := s.oauth.GetUser(r)
202202203203 err := r.ParseForm()
204204 if err != nil {
···246246}
247247248248func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) {
249249- user := s.auth.GetUser(r)
249249+ user := s.oauth.GetUser(r)
250250251251 err := r.ParseForm()
252252 if err != nil {
···286286}
287287288288func (s *State) updateProfile(profile *db.Profile, w http.ResponseWriter, r *http.Request) {
289289- user := s.auth.GetUser(r)
289289+ user := s.oauth.GetUser(r)
290290 tx, err := s.db.BeginTx(r.Context(), nil)
291291 if err != nil {
292292 log.Println("failed to start transaction", err)
···294294 return
295295 }
296296297297- client, _ := s.auth.AuthorizedClient(r)
297297+ client, err := s.oauth.AuthorizedClient(r)
298298+ if err != nil {
299299+ log.Println("failed to get authorized client", err)
300300+ s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.")
301301+ return
302302+ }
298303299304 // yeah... lexgen dose not support syntax.ATURI in the record for some reason,
300305 // nor does it support exact size arrays
···308313 vanityStats = append(vanityStats, string(v.Kind))
309314 }
310315311311- ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.ActorProfileNSID, user.Did, "self")
316316+ ex, _ := client.RepoGetRecord(r.Context(), "", tangled.ActorProfileNSID, user.Did, "self")
312317 var cid *string
313318 if ex != nil {
314319 cid = ex.Cid
315320 }
316321317317- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
322322+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
318323 Collection: tangled.ActorProfileNSID,
319324 Repo: user.Did,
320325 Rkey: "self",
···347352}
348353349354func (s *State) EditBioFragment(w http.ResponseWriter, r *http.Request) {
350350- user := s.auth.GetUser(r)
355355+ user := s.oauth.GetUser(r)
351356352357 profile, err := db.GetProfile(s.db, user.Did)
353358 if err != nil {
···361366}
362367363368func (s *State) EditPinsFragment(w http.ResponseWriter, r *http.Request) {
364364- user := s.auth.GetUser(r)
369369+ user := s.oauth.GetUser(r)
365370366371 profile, err := db.GetProfile(s.db, user.Did)
367372 if err != nil {
+76-51
appview/state/pull.go
···13131414 "tangled.sh/tangled.sh/core/api/tangled"
1515 "tangled.sh/tangled.sh/core/appview"
1616- "tangled.sh/tangled.sh/core/appview/auth"
1716 "tangled.sh/tangled.sh/core/appview/db"
1717+ "tangled.sh/tangled.sh/core/appview/oauth"
1818 "tangled.sh/tangled.sh/core/appview/pages"
1919 "tangled.sh/tangled.sh/core/patchutil"
2020 "tangled.sh/tangled.sh/core/types"
···2929func (s *State) PullActions(w http.ResponseWriter, r *http.Request) {
3030 switch r.Method {
3131 case http.MethodGet:
3232- user := s.auth.GetUser(r)
3232+ user := s.oauth.GetUser(r)
3333 f, err := s.fullyResolvedRepo(r)
3434 if err != nil {
3535 log.Println("failed to get repo and knot", err)
···7373}
74747575func (s *State) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
7676- user := s.auth.GetUser(r)
7676+ user := s.oauth.GetUser(r)
7777 f, err := s.fullyResolvedRepo(r)
7878 if err != nil {
7979 log.Println("failed to get repo and knot", err)
···143143 }
144144 }
145145146146- ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
146146+ ksClient, err := NewSignedClient(f.Knot, secret, s.config.Core.Dev)
147147 if err != nil {
148148 log.Printf("failed to setup signed client for %s; ignoring: %v", f.Knot, err)
149149 return types.MergeCheckResponse{
···215215 repoName = f.RepoName
216216 }
217217218218- us, err := NewUnsignedClient(knot, s.config.Dev)
218218+ us, err := NewUnsignedClient(knot, s.config.Core.Dev)
219219 if err != nil {
220220 log.Printf("failed to setup client for %s; ignoring: %v", knot, err)
221221 return pages.Unknown
···250250}
251251252252func (s *State) RepoPullPatch(w http.ResponseWriter, r *http.Request) {
253253- user := s.auth.GetUser(r)
253253+ user := s.oauth.GetUser(r)
254254 f, err := s.fullyResolvedRepo(r)
255255 if err != nil {
256256 log.Println("failed to get repo and knot", err)
···298298}
299299300300func (s *State) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) {
301301- user := s.auth.GetUser(r)
301301+ user := s.oauth.GetUser(r)
302302303303 f, err := s.fullyResolvedRepo(r)
304304 if err != nil {
···355355 interdiff := patchutil.Interdiff(previousPatch, currentPatch)
356356357357 s.pages.RepoPullInterdiffPage(w, pages.RepoPullInterdiffParams{
358358- LoggedInUser: s.auth.GetUser(r),
358358+ LoggedInUser: s.oauth.GetUser(r),
359359 RepoInfo: f.RepoInfo(s, user),
360360 Pull: pull,
361361 Round: roundIdInt,
···397397}
398398399399func (s *State) RepoPulls(w http.ResponseWriter, r *http.Request) {
400400- user := s.auth.GetUser(r)
400400+ user := s.oauth.GetUser(r)
401401 params := r.URL.Query()
402402403403 state := db.PullOpen
···451451 }
452452453453 s.pages.RepoPulls(w, pages.RepoPullsParams{
454454- LoggedInUser: s.auth.GetUser(r),
454454+ LoggedInUser: s.oauth.GetUser(r),
455455 RepoInfo: f.RepoInfo(s, user),
456456 Pulls: pulls,
457457 DidHandleMap: didHandleMap,
···461461}
462462463463func (s *State) PullComment(w http.ResponseWriter, r *http.Request) {
464464- user := s.auth.GetUser(r)
464464+ user := s.oauth.GetUser(r)
465465 f, err := s.fullyResolvedRepo(r)
466466 if err != nil {
467467 log.Println("failed to get repo and knot", err)
···519519 }
520520521521 atUri := f.RepoAt.String()
522522- client, _ := s.auth.AuthorizedClient(r)
523523- atResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
522522+ client, err := s.oauth.AuthorizedClient(r)
523523+ if err != nil {
524524+ log.Println("failed to get authorized client", err)
525525+ s.pages.Notice(w, "pull-comment", "Failed to create comment.")
526526+ return
527527+ }
528528+ atResp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
524529 Collection: tangled.RepoPullCommentNSID,
525530 Repo: user.Did,
526531 Rkey: appview.TID(),
···568573}
569574570575func (s *State) NewPull(w http.ResponseWriter, r *http.Request) {
571571- user := s.auth.GetUser(r)
576576+ user := s.oauth.GetUser(r)
572577 f, err := s.fullyResolvedRepo(r)
573578 if err != nil {
574579 log.Println("failed to get repo and knot", err)
···577582578583 switch r.Method {
579584 case http.MethodGet:
580580- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
585585+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
581586 if err != nil {
582587 log.Printf("failed to create unsigned client for %s", f.Knot)
583588 s.pages.Error503(w)
···646651 return
647652 }
648653649649- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
654654+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
650655 if err != nil {
651656 log.Printf("failed to create unsigned client to %s: %v", f.Knot, err)
652657 s.pages.Notice(w, "pull", "Failed to create a pull request. Try again later.")
···689694 }
690695}
691696692692-func (s *State) handleBranchBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *auth.User, title, body, targetBranch, sourceBranch string) {
697697+func (s *State) handleBranchBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *oauth.User, title, body, targetBranch, sourceBranch string) {
693698 pullSource := &db.PullSource{
694699 Branch: sourceBranch,
695700 }
···698703 }
699704700705 // Generate a patch using /compare
701701- ksClient, err := NewUnsignedClient(f.Knot, s.config.Dev)
706706+ ksClient, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
702707 if err != nil {
703708 log.Printf("failed to create signed client for %s: %s", f.Knot, err)
704709 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···723728 s.createPullRequest(w, r, f, user, title, body, targetBranch, patch, sourceRev, pullSource, recordPullSource)
724729}
725730726726-func (s *State) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *auth.User, title, body, targetBranch, patch string) {
731731+func (s *State) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *oauth.User, title, body, targetBranch, patch string) {
727732 if !patchutil.IsPatchValid(patch) {
728733 s.pages.Notice(w, "pull", "Invalid patch format. Please provide a valid diff.")
729734 return
···732737 s.createPullRequest(w, r, f, user, title, body, targetBranch, patch, "", nil, nil)
733738}
734739735735-func (s *State) handleForkBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *auth.User, forkRepo string, title, body, targetBranch, sourceBranch string) {
740740+func (s *State) handleForkBasedPull(w http.ResponseWriter, r *http.Request, f *FullyResolvedRepo, user *oauth.User, forkRepo string, title, body, targetBranch, sourceBranch string) {
736741 fork, err := db.GetForkByDid(s.db, user.Did, forkRepo)
737742 if errors.Is(err, sql.ErrNoRows) {
738743 s.pages.Notice(w, "pull", "No such fork.")
···750755 return
751756 }
752757753753- sc, err := NewSignedClient(fork.Knot, secret, s.config.Dev)
758758+ sc, err := NewSignedClient(fork.Knot, secret, s.config.Core.Dev)
754759 if err != nil {
755760 log.Println("failed to create signed client:", err)
756761 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
757762 return
758763 }
759764760760- us, err := NewUnsignedClient(fork.Knot, s.config.Dev)
765765+ us, err := NewUnsignedClient(fork.Knot, s.config.Core.Dev)
761766 if err != nil {
762767 log.Println("failed to create unsigned client:", err)
763768 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
···816821 w http.ResponseWriter,
817822 r *http.Request,
818823 f *FullyResolvedRepo,
819819- user *auth.User,
824824+ user *oauth.User,
820825 title, body, targetBranch string,
821826 patch string,
822827 sourceRev string,
···870875 s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
871876 return
872877 }
873873- client, _ := s.auth.AuthorizedClient(r)
878878+ client, err := s.oauth.AuthorizedClient(r)
879879+ if err != nil {
880880+ log.Println("failed to get authorized client", err)
881881+ s.pages.Notice(w, "pull", "Failed to create pull request. Try again later.")
882882+ return
883883+ }
874884 pullId, err := db.NextPullId(s.db, f.RepoAt)
875885 if err != nil {
876886 log.Println("failed to get pull id", err)
···878888 return
879889 }
880890881881- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
891891+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
882892 Collection: tangled.RepoPullNSID,
883893 Repo: user.Did,
884894 Rkey: rkey,
···929939}
930940931941func (s *State) PatchUploadFragment(w http.ResponseWriter, r *http.Request) {
932932- user := s.auth.GetUser(r)
942942+ user := s.oauth.GetUser(r)
933943 f, err := s.fullyResolvedRepo(r)
934944 if err != nil {
935945 log.Println("failed to get repo and knot", err)
···942952}
943953944954func (s *State) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) {
945945- user := s.auth.GetUser(r)
955955+ user := s.oauth.GetUser(r)
946956 f, err := s.fullyResolvedRepo(r)
947957 if err != nil {
948958 log.Println("failed to get repo and knot", err)
949959 return
950960 }
951961952952- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
962962+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
953963 if err != nil {
954964 log.Printf("failed to create unsigned client for %s", f.Knot)
955965 s.pages.Error503(w)
···982992}
983993984994func (s *State) CompareForksFragment(w http.ResponseWriter, r *http.Request) {
985985- user := s.auth.GetUser(r)
995995+ user := s.oauth.GetUser(r)
986996 f, err := s.fullyResolvedRepo(r)
987997 if err != nil {
988998 log.Println("failed to get repo and knot", err)
···10021012}
1003101310041014func (s *State) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) {
10051005- user := s.auth.GetUser(r)
10151015+ user := s.oauth.GetUser(r)
1006101610071017 f, err := s.fullyResolvedRepo(r)
10081018 if err != nil {
···10191029 return
10201030 }
1021103110221022- sourceBranchesClient, err := NewUnsignedClient(repo.Knot, s.config.Dev)
10321032+ sourceBranchesClient, err := NewUnsignedClient(repo.Knot, s.config.Core.Dev)
10231033 if err != nil {
10241034 log.Printf("failed to create unsigned client for %s", repo.Knot)
10251035 s.pages.Error503(w)
···10461056 return
10471057 }
1048105810491049- targetBranchesClient, err := NewUnsignedClient(f.Knot, s.config.Dev)
10591059+ targetBranchesClient, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
10501060 if err != nil {
10511061 log.Printf("failed to create unsigned client for target knot %s", f.Knot)
10521062 s.pages.Error503(w)
···10811091}
1082109210831093func (s *State) ResubmitPull(w http.ResponseWriter, r *http.Request) {
10841084- user := s.auth.GetUser(r)
10941094+ user := s.oauth.GetUser(r)
10851095 f, err := s.fullyResolvedRepo(r)
10861096 if err != nil {
10871097 log.Println("failed to get repo and knot", err)
···11171127}
1118112811191129func (s *State) resubmitPatch(w http.ResponseWriter, r *http.Request) {
11201120- user := s.auth.GetUser(r)
11301130+ user := s.oauth.GetUser(r)
1121113111221132 pull, ok := r.Context().Value("pull").(*db.Pull)
11231133 if !ok {
···11591169 s.pages.Notice(w, "resubmit-error", "Failed to resubmit pull request. Try again later.")
11601170 return
11611171 }
11621162- client, _ := s.auth.AuthorizedClient(r)
11721172+ client, err := s.oauth.AuthorizedClient(r)
11731173+ if err != nil {
11741174+ log.Println("failed to get authorized client", err)
11751175+ s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
11761176+ return
11771177+ }
1163117811641164- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey)
11791179+ ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoPullNSID, user.Did, pull.Rkey)
11651180 if err != nil {
11661181 // failed to get record
11671182 s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.")
11681183 return
11691184 }
1170118511711171- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
11861186+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
11721187 Collection: tangled.RepoPullNSID,
11731188 Repo: user.Did,
11741189 Rkey: pull.Rkey,
···12001215}
1201121612021217func (s *State) resubmitBranch(w http.ResponseWriter, r *http.Request) {
12031203- user := s.auth.GetUser(r)
12181218+ user := s.oauth.GetUser(r)
1204121912051220 pull, ok := r.Context().Value("pull").(*db.Pull)
12061221 if !ok {
···12271242 return
12281243 }
1229124412301230- ksClient, err := NewUnsignedClient(f.Knot, s.config.Dev)
12451245+ ksClient, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
12311246 if err != nil {
12321247 log.Printf("failed to create client for %s: %s", f.Knot, err)
12331248 s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
···12681283 s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
12691284 return
12701285 }
12711271- client, _ := s.auth.AuthorizedClient(r)
12861286+ client, err := s.oauth.AuthorizedClient(r)
12871287+ if err != nil {
12881288+ log.Println("failed to authorize client")
12891289+ s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
12901290+ return
12911291+ }
1272129212731273- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey)
12931293+ ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoPullNSID, user.Did, pull.Rkey)
12741294 if err != nil {
12751295 // failed to get record
12761296 s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.")
···12801300 recordPullSource := &tangled.RepoPull_Source{
12811301 Branch: pull.PullSource.Branch,
12821302 }
12831283- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
13031303+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
12841304 Collection: tangled.RepoPullNSID,
12851305 Repo: user.Did,
12861306 Rkey: pull.Rkey,
···13131333}
1314133413151335func (s *State) resubmitFork(w http.ResponseWriter, r *http.Request) {
13161316- user := s.auth.GetUser(r)
13361336+ user := s.oauth.GetUser(r)
1317133713181338 pull, ok := r.Context().Value("pull").(*db.Pull)
13191339 if !ok {
···13421362 }
1343136313441364 // extract patch by performing compare
13451345- ksClient, err := NewUnsignedClient(forkRepo.Knot, s.config.Dev)
13651365+ ksClient, err := NewUnsignedClient(forkRepo.Knot, s.config.Core.Dev)
13461366 if err != nil {
13471367 log.Printf("failed to create client for %s: %s", forkRepo.Knot, err)
13481368 s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
···13571377 }
1358137813591379 // update the hidden tracking branch to latest
13601360- signedClient, err := NewSignedClient(forkRepo.Knot, secret, s.config.Dev)
13801380+ signedClient, err := NewSignedClient(forkRepo.Knot, secret, s.config.Core.Dev)
13611381 if err != nil {
13621382 log.Printf("failed to create signed client for %s: %s", forkRepo.Knot, err)
13631383 s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
···14061426 s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
14071427 return
14081428 }
14091409- client, _ := s.auth.AuthorizedClient(r)
14291429+ client, err := s.oauth.AuthorizedClient(r)
14301430+ if err != nil {
14311431+ log.Println("failed to get client")
14321432+ s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.")
14331433+ return
14341434+ }
1410143514111411- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey)
14361436+ ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoPullNSID, user.Did, pull.Rkey)
14121437 if err != nil {
14131438 // failed to get record
14141439 s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.")
···14201445 Branch: pull.PullSource.Branch,
14211446 Repo: &repoAt,
14221447 }
14231423- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
14481448+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
14241449 Collection: tangled.RepoPullNSID,
14251450 Repo: user.Did,
14261451 Rkey: pull.Rkey,
···15031528 log.Printf("failed to get primary email: %s", err)
15041529 }
1505153015061506- ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
15311531+ ksClient, err := NewSignedClient(f.Knot, secret, s.config.Core.Dev)
15071532 if err != nil {
15081533 log.Printf("failed to create signed client for %s: %s", f.Knot, err)
15091534 s.pages.Notice(w, "pull-merge-error", "Failed to merge pull request. Try again later.")
···15331558}
1534155915351560func (s *State) ClosePull(w http.ResponseWriter, r *http.Request) {
15361536- user := s.auth.GetUser(r)
15611561+ user := s.oauth.GetUser(r)
1537156215381563 f, err := s.fullyResolvedRepo(r)
15391564 if err != nil {
···15871612}
1588161315891614func (s *State) ReopenPull(w http.ResponseWriter, r *http.Request) {
15901590- user := s.auth.GetUser(r)
16151615+ user := s.oauth.GetUser(r)
1591161615921617 f, err := s.fullyResolvedRepo(r)
15931618 if err != nil {
+98-60
appview/state/repo.go
···18181919 "tangled.sh/tangled.sh/core/api/tangled"
2020 "tangled.sh/tangled.sh/core/appview"
2121- "tangled.sh/tangled.sh/core/appview/auth"
2221 "tangled.sh/tangled.sh/core/appview/db"
2222+ "tangled.sh/tangled.sh/core/appview/oauth"
2323 "tangled.sh/tangled.sh/core/appview/pages"
2424 "tangled.sh/tangled.sh/core/appview/pages/markup"
2525 "tangled.sh/tangled.sh/core/appview/pages/repoinfo"
···4545 return
4646 }
47474848- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
4848+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
4949 if err != nil {
5050 log.Printf("failed to create unsigned client for %s", f.Knot)
5151 s.pages.Error503(w)
···119119120120 emails := uniqueEmails(commitsTrunc)
121121122122- user := s.auth.GetUser(r)
122122+ user := s.oauth.GetUser(r)
123123 s.pages.RepoIndexPage(w, pages.RepoIndexParams{
124124 LoggedInUser: user,
125125 RepoInfo: f.RepoInfo(s, user),
···150150151151 ref := chi.URLParam(r, "ref")
152152153153- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
153153+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
154154 if err != nil {
155155 log.Println("failed to create unsigned client", err)
156156 return
···190190 tagMap[hash] = append(tagMap[hash], tag.Name)
191191 }
192192193193- user := s.auth.GetUser(r)
193193+ user := s.oauth.GetUser(r)
194194 s.pages.RepoLog(w, pages.RepoLogParams{
195195 LoggedInUser: user,
196196 TagMap: tagMap,
···209209 return
210210 }
211211212212- user := s.auth.GetUser(r)
212212+ user := s.oauth.GetUser(r)
213213 s.pages.EditRepoDescriptionFragment(w, pages.RepoDescriptionParams{
214214 RepoInfo: f.RepoInfo(s, user),
215215 })
···232232 return
233233 }
234234235235- user := s.auth.GetUser(r)
235235+ user := s.oauth.GetUser(r)
236236237237 switch r.Method {
238238 case http.MethodGet:
···241241 })
242242 return
243243 case http.MethodPut:
244244- user := s.auth.GetUser(r)
244244+ user := s.oauth.GetUser(r)
245245 newDescription := r.FormValue("description")
246246- client, _ := s.auth.AuthorizedClient(r)
246246+ client, err := s.oauth.AuthorizedClient(r)
247247+ if err != nil {
248248+ log.Println("failed to get client")
249249+ s.pages.Notice(w, "repo-notice", "Failed to update description, try again later.")
250250+ return
251251+ }
247252248253 // optimistic update
249254 err = db.UpdateDescription(s.db, string(repoAt), newDescription)
···256261 // this is a bit of a pain because the golang atproto impl does not allow nil SwapRecord field
257262 //
258263 // SwapRecord is optional and should happen automagically, but given that it does not, we have to perform two requests
259259- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoNSID, user.Did, rkey)
264264+ ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, user.Did, rkey)
260265 if err != nil {
261266 // failed to get record
262267 s.pages.Notice(w, "repo-notice", "Failed to update description, no record found on PDS.")
263268 return
264269 }
265265- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
270270+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
266271 Collection: tangled.RepoNSID,
267272 Repo: user.Did,
268273 Rkey: rkey,
···303308 }
304309 ref := chi.URLParam(r, "ref")
305310 protocol := "http"
306306- if !s.config.Dev {
311311+ if !s.config.Core.Dev {
307312 protocol = "https"
308313 }
309314···331336 return
332337 }
333338334334- user := s.auth.GetUser(r)
339339+ user := s.oauth.GetUser(r)
335340 s.pages.RepoCommit(w, pages.RepoCommitParams{
336341 LoggedInUser: user,
337342 RepoInfo: f.RepoInfo(s, user),
···351356 ref := chi.URLParam(r, "ref")
352357 treePath := chi.URLParam(r, "*")
353358 protocol := "http"
354354- if !s.config.Dev {
359359+ if !s.config.Core.Dev {
355360 protocol = "https"
356361 }
357362 resp, err := http.Get(fmt.Sprintf("%s://%s/%s/%s/tree/%s/%s", protocol, f.Knot, f.OwnerDid(), f.RepoName, ref, treePath))
···380385 return
381386 }
382387383383- user := s.auth.GetUser(r)
388388+ user := s.oauth.GetUser(r)
384389385390 var breadcrumbs [][]string
386391 breadcrumbs = append(breadcrumbs, []string{f.RepoName, fmt.Sprintf("/%s/tree/%s", f.OwnerSlashRepo(), ref)})
···411416 return
412417 }
413418414414- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
419419+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
415420 if err != nil {
416421 log.Println("failed to create unsigned client", err)
417422 return
···451456 }
452457 }
453458454454- user := s.auth.GetUser(r)
459459+ user := s.oauth.GetUser(r)
455460 s.pages.RepoTags(w, pages.RepoTagsParams{
456461 LoggedInUser: user,
457462 RepoInfo: f.RepoInfo(s, user),
···469474 return
470475 }
471476472472- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
477477+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
473478 if err != nil {
474479 log.Println("failed to create unsigned client", err)
475480 return
···511516 return strings.Compare(a.Name, b.Name) * -1
512517 })
513518514514- user := s.auth.GetUser(r)
519519+ user := s.oauth.GetUser(r)
515520 s.pages.RepoBranches(w, pages.RepoBranchesParams{
516521 LoggedInUser: user,
517522 RepoInfo: f.RepoInfo(s, user),
···530535 ref := chi.URLParam(r, "ref")
531536 filePath := chi.URLParam(r, "*")
532537 protocol := "http"
533533- if !s.config.Dev {
538538+ if !s.config.Core.Dev {
534539 protocol = "https"
535540 }
536541 resp, err := http.Get(fmt.Sprintf("%s://%s/%s/%s/blob/%s/%s", protocol, f.Knot, f.OwnerDid(), f.RepoName, ref, filePath))
···568573 showRendered = r.URL.Query().Get("code") != "true"
569574 }
570575571571- user := s.auth.GetUser(r)
576576+ user := s.oauth.GetUser(r)
572577 s.pages.RepoBlob(w, pages.RepoBlobParams{
573578 LoggedInUser: user,
574579 RepoInfo: f.RepoInfo(s, user),
···591596 filePath := chi.URLParam(r, "*")
592597593598 protocol := "http"
594594- if !s.config.Dev {
599599+ if !s.config.Core.Dev {
595600 protocol = "https"
596601 }
597602 resp, err := http.Get(fmt.Sprintf("%s://%s/%s/%s/blob/%s/%s", protocol, f.Knot, f.OwnerDid(), f.RepoName, ref, filePath))
···652657 return
653658 }
654659655655- ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
660660+ ksClient, err := NewSignedClient(f.Knot, secret, s.config.Core.Dev)
656661 if err != nil {
657662 log.Println("failed to create client to ", f.Knot)
658663 return
···714719}
715720716721func (s *State) DeleteRepo(w http.ResponseWriter, r *http.Request) {
717717- user := s.auth.GetUser(r)
722722+ user := s.oauth.GetUser(r)
718723719724 f, err := s.fullyResolvedRepo(r)
720725 if err != nil {
···723728 }
724729725730 // remove record from pds
726726- xrpcClient, _ := s.auth.AuthorizedClient(r)
731731+ xrpcClient, err := s.oauth.AuthorizedClient(r)
732732+ if err != nil {
733733+ log.Println("failed to get authorized client", err)
734734+ return
735735+ }
727736 repoRkey := f.RepoAt.RecordKey().String()
728728- _, err = comatproto.RepoDeleteRecord(r.Context(), xrpcClient, &comatproto.RepoDeleteRecord_Input{
737737+ _, err = xrpcClient.RepoDeleteRecord(r.Context(), &comatproto.RepoDeleteRecord_Input{
729738 Collection: tangled.RepoNSID,
730739 Repo: user.Did,
731740 Rkey: repoRkey,
···743752 return
744753 }
745754746746- ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
755755+ ksClient, err := NewSignedClient(f.Knot, secret, s.config.Core.Dev)
747756 if err != nil {
748757 log.Println("failed to create client to ", f.Knot)
749758 return
···838847 return
839848 }
840849841841- ksClient, err := NewSignedClient(f.Knot, secret, s.config.Dev)
850850+ ksClient, err := NewSignedClient(f.Knot, secret, s.config.Core.Dev)
842851 if err != nil {
843852 log.Println("failed to create client to ", f.Knot)
844853 return
···868877 switch r.Method {
869878 case http.MethodGet:
870879 // for now, this is just pubkeys
871871- user := s.auth.GetUser(r)
880880+ user := s.oauth.GetUser(r)
872881 repoCollaborators, err := f.Collaborators(r.Context(), s)
873882 if err != nil {
874883 log.Println("failed to get collaborators", err)
···884893885894 var branchNames []string
886895 var defaultBranch string
887887- us, err := NewUnsignedClient(f.Knot, s.config.Dev)
896896+ us, err := NewUnsignedClient(f.Knot, s.config.Core.Dev)
888897 if err != nil {
889898 log.Println("failed to create unsigned client", err)
890899 } else {
···10081017 return collaborators, nil
10091018}
1010101910111011-func (f *FullyResolvedRepo) RepoInfo(s *State, u *auth.User) repoinfo.RepoInfo {
10201020+func (f *FullyResolvedRepo) RepoInfo(s *State, u *oauth.User) repoinfo.RepoInfo {
10121021 isStarred := false
10131022 if u != nil {
10141023 isStarred = db.GetStarStatus(s.db, u.Did, syntax.ATURI(f.RepoAt))
···1051106010521061 knot := f.Knot
10531062 var disableFork bool
10541054- us, err := NewUnsignedClient(knot, s.config.Dev)
10631063+ us, err := NewUnsignedClient(knot, s.config.Core.Dev)
10551064 if err != nil {
10561065 log.Printf("failed to create unsigned client for %s: %v", knot, err)
10571066 } else {
···11051114}
1106111511071116func (s *State) RepoSingleIssue(w http.ResponseWriter, r *http.Request) {
11081108- user := s.auth.GetUser(r)
11171117+ user := s.oauth.GetUser(r)
11091118 f, err := s.fullyResolvedRepo(r)
11101119 if err != nil {
11111120 log.Println("failed to get repo and knot", err)
···11591168}
1160116911611170func (s *State) CloseIssue(w http.ResponseWriter, r *http.Request) {
11621162- user := s.auth.GetUser(r)
11711171+ user := s.oauth.GetUser(r)
11631172 f, err := s.fullyResolvedRepo(r)
11641173 if err != nil {
11651174 log.Println("failed to get repo and knot", err)
···1195120411961205 closed := tangled.RepoIssueStateClosed
1197120611981198- client, _ := s.auth.AuthorizedClient(r)
11991199- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
12071207+ client, err := s.oauth.AuthorizedClient(r)
12081208+ if err != nil {
12091209+ log.Println("failed to get authorized client", err)
12101210+ return
12111211+ }
12121212+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
12001213 Collection: tangled.RepoIssueStateNSID,
12011214 Repo: user.Did,
12021215 Rkey: appview.TID(),
···12141227 return
12151228 }
1216122912171217- err := db.CloseIssue(s.db, f.RepoAt, issueIdInt)
12301230+ err = db.CloseIssue(s.db, f.RepoAt, issueIdInt)
12181231 if err != nil {
12191232 log.Println("failed to close issue", err)
12201233 s.pages.Notice(w, "issue-action", "Failed to close issue. Try again later.")
···12311244}
1232124512331246func (s *State) ReopenIssue(w http.ResponseWriter, r *http.Request) {
12341234- user := s.auth.GetUser(r)
12471247+ user := s.oauth.GetUser(r)
12351248 f, err := s.fullyResolvedRepo(r)
12361249 if err != nil {
12371250 log.Println("failed to get repo and knot", err)
···12791292}
1280129312811294func (s *State) NewIssueComment(w http.ResponseWriter, r *http.Request) {
12821282- user := s.auth.GetUser(r)
12951295+ user := s.oauth.GetUser(r)
12831296 f, err := s.fullyResolvedRepo(r)
12841297 if err != nil {
12851298 log.Println("failed to get repo and knot", err)
···13301343 }
1331134413321345 atUri := f.RepoAt.String()
13331333- client, _ := s.auth.AuthorizedClient(r)
13341334- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
13461346+ client, err := s.oauth.AuthorizedClient(r)
13471347+ if err != nil {
13481348+ log.Println("failed to get authorized client", err)
13491349+ s.pages.Notice(w, "issue-comment", "Failed to create comment.")
13501350+ return
13511351+ }
13521352+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
13351353 Collection: tangled.RepoIssueCommentNSID,
13361354 Repo: user.Did,
13371355 Rkey: rkey,
···13581376}
1359137713601378func (s *State) IssueComment(w http.ResponseWriter, r *http.Request) {
13611361- user := s.auth.GetUser(r)
13791379+ user := s.oauth.GetUser(r)
13621380 f, err := s.fullyResolvedRepo(r)
13631381 if err != nil {
13641382 log.Println("failed to get repo and knot", err)
···14171435}
1418143614191437func (s *State) EditIssueComment(w http.ResponseWriter, r *http.Request) {
14201420- user := s.auth.GetUser(r)
14381438+ user := s.oauth.GetUser(r)
14211439 f, err := s.fullyResolvedRepo(r)
14221440 if err != nil {
14231441 log.Println("failed to get repo and knot", err)
···14691487 case http.MethodPost:
14701488 // extract form value
14711489 newBody := r.FormValue("body")
14721472- client, _ := s.auth.AuthorizedClient(r)
14901490+ client, err := s.oauth.AuthorizedClient(r)
14911491+ if err != nil {
14921492+ log.Println("failed to get authorized client", err)
14931493+ s.pages.Notice(w, "issue-comment", "Failed to create comment.")
14941494+ return
14951495+ }
14731496 rkey := comment.Rkey
1474149714751498 // optimistic update
···14841507 // rkey is optional, it was introduced later
14851508 if comment.Rkey != "" {
14861509 // update the record on pds
14871487- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Did, rkey)
15101510+ ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoIssueCommentNSID, user.Did, rkey)
14881511 if err != nil {
14891512 // failed to get record
14901513 log.Println(err, rkey)
···14991522 createdAt := record["createdAt"].(string)
15001523 commentIdInt64 := int64(commentIdInt)
1501152415021502- _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
15251525+ _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
15031526 Collection: tangled.RepoIssueCommentNSID,
15041527 Repo: user.Did,
15051528 Rkey: rkey,
···15421565}
1543156615441567func (s *State) DeleteIssueComment(w http.ResponseWriter, r *http.Request) {
15451545- user := s.auth.GetUser(r)
15681568+ user := s.oauth.GetUser(r)
15461569 f, err := s.fullyResolvedRepo(r)
15471570 if err != nil {
15481571 log.Println("failed to get repo and knot", err)
···1599162216001623 // delete from pds
16011624 if comment.Rkey != "" {
16021602- client, _ := s.auth.AuthorizedClient(r)
16031603- _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
16251625+ client, err := s.oauth.AuthorizedClient(r)
16261626+ if err != nil {
16271627+ log.Println("failed to get authorized client", err)
16281628+ s.pages.Notice(w, "issue-comment", "Failed to delete comment.")
16291629+ return
16301630+ }
16311631+ _, err = client.RepoDeleteRecord(r.Context(), &comatproto.RepoDeleteRecord_Input{
16041632 Collection: tangled.GraphFollowNSID,
16051633 Repo: user.Did,
16061634 Rkey: comment.Rkey,
···16471675 page = pagination.FirstPage()
16481676 }
1649167716501650- user := s.auth.GetUser(r)
16781678+ user := s.oauth.GetUser(r)
16511679 f, err := s.fullyResolvedRepo(r)
16521680 if err != nil {
16531681 log.Println("failed to get repo and knot", err)
···16761704 }
1677170516781706 s.pages.RepoIssues(w, pages.RepoIssuesParams{
16791679- LoggedInUser: s.auth.GetUser(r),
17071707+ LoggedInUser: s.oauth.GetUser(r),
16801708 RepoInfo: f.RepoInfo(s, user),
16811709 Issues: issues,
16821710 DidHandleMap: didHandleMap,
···16871715}
1688171616891717func (s *State) NewIssue(w http.ResponseWriter, r *http.Request) {
16901690- user := s.auth.GetUser(r)
17181718+ user := s.oauth.GetUser(r)
1691171916921720 f, err := s.fullyResolvedRepo(r)
16931721 if err != nil {
···17351763 return
17361764 }
1737176517381738- client, _ := s.auth.AuthorizedClient(r)
17661766+ client, err := s.oauth.AuthorizedClient(r)
17671767+ if err != nil {
17681768+ log.Println("failed to get authorized client", err)
17691769+ s.pages.Notice(w, "issues", "Failed to create issue.")
17701770+ return
17711771+ }
17391772 atUri := f.RepoAt.String()
17401740- resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
17731773+ resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
17411774 Collection: tangled.RepoIssueNSID,
17421775 Repo: user.Did,
17431776 Rkey: appview.TID(),
···17701803}
1771180417721805func (s *State) ForkRepo(w http.ResponseWriter, r *http.Request) {
17731773- user := s.auth.GetUser(r)
18061806+ user := s.oauth.GetUser(r)
17741807 f, err := s.fullyResolvedRepo(r)
17751808 if err != nil {
17761809 log.Printf("failed to resolve source repo: %v", err)
···1779181217801813 switch r.Method {
17811814 case http.MethodGet:
17821782- user := s.auth.GetUser(r)
18151815+ user := s.oauth.GetUser(r)
17831816 knots, err := s.enforcer.GetDomainsForUser(user.Did)
17841817 if err != nil {
17851818 s.pages.Notice(w, "repo", "Invalid user account.")
···18291862 return
18301863 }
1831186418321832- client, err := NewSignedClient(knot, secret, s.config.Dev)
18651865+ client, err := NewSignedClient(knot, secret, s.config.Core.Dev)
18331866 if err != nil {
18341867 s.pages.Notice(w, "repo", "Failed to reach knot server.")
18351868 return
18361869 }
1837187018381871 var uri string
18391839- if s.config.Dev {
18721872+ if s.config.Core.Dev {
18401873 uri = "http"
18411874 } else {
18421875 uri = "https"
···18831916 // continue
18841917 }
1885191818861886- xrpcClient, _ := s.auth.AuthorizedClient(r)
19191919+ xrpcClient, err := s.oauth.AuthorizedClient(r)
19201920+ if err != nil {
19211921+ log.Println("failed to get authorized client", err)
19221922+ s.pages.Notice(w, "repo", "Failed to create repository.")
19231923+ return
19241924+ }
1887192518881926 createdAt := time.Now().Format(time.RFC3339)
18891889- atresp, err := comatproto.RepoPutRecord(r.Context(), xrpcClient, &comatproto.RepoPutRecord_Input{
19271927+ atresp, err := xrpcClient.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
18901928 Collection: tangled.RepoNSID,
18911929 Repo: user.Did,
18921930 Rkey: rkey,
+3-3
appview/state/repo_util.go
···1212 "github.com/bluesky-social/indigo/atproto/syntax"
1313 "github.com/go-chi/chi/v5"
1414 "github.com/go-git/go-git/v5/plumbing/object"
1515- "tangled.sh/tangled.sh/core/appview/auth"
1615 "tangled.sh/tangled.sh/core/appview/db"
1616+ "tangled.sh/tangled.sh/core/appview/oauth"
1717 "tangled.sh/tangled.sh/core/appview/pages/repoinfo"
1818)
1919···4545 ref := chi.URLParam(r, "ref")
46464747 if ref == "" {
4848- us, err := NewUnsignedClient(knot, s.config.Dev)
4848+ us, err := NewUnsignedClient(knot, s.config.Core.Dev)
4949 if err != nil {
5050 return nil, err
5151 }
···7373 }, nil
7474}
75757676-func RolesInRepo(s *State, u *auth.User, f *FullyResolvedRepo) repoinfo.RolesInRepo {
7676+func RolesInRepo(s *State, u *oauth.User, f *FullyResolvedRepo) repoinfo.RolesInRepo {
7777 if u != nil {
7878 r := s.enforcer.GetPermissionsInRepo(u.Did, f.Knot, f.DidSlashRepo())
7979 return repoinfo.RolesInRepo{r}