forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

Compare changes

Choose any two refs to compare.

Changed files
+179 -281
appview
spindle
engines
nixery
+8 -5
appview/db/issues.go
··· 101 101 pLower := FilterGte("row_num", page.Offset+1) 102 102 pUpper := FilterLte("row_num", page.Offset+page.Limit) 103 103 104 - args = append(args, pLower.Arg()...) 105 - args = append(args, pUpper.Arg()...) 106 - pagination := " where " + pLower.Condition() + " and " + pUpper.Condition() 104 + pageClause := "" 105 + if page.Limit > 0 { 106 + args = append(args, pLower.Arg()...) 107 + args = append(args, pUpper.Arg()...) 108 + pageClause = " where " + pLower.Condition() + " and " + pUpper.Condition() 109 + } 107 110 108 111 query := fmt.Sprintf( 109 112 ` ··· 128 131 %s 129 132 `, 130 133 whereClause, 131 - pagination, 134 + pageClause, 132 135 ) 133 136 134 137 rows, err := e.Query(query, args...) ··· 244 247 } 245 248 246 249 func GetIssues(e Execer, filters ...filter) ([]models.Issue, error) { 247 - return GetIssuesPaginated(e, pagination.FirstPage(), filters...) 250 + return GetIssuesPaginated(e, pagination.Page{}, filters...) 248 251 } 249 252 250 253 func AddIssueComment(e Execer, c models.IssueComment) (int64, error) {
+7 -4
appview/db/notifications.go
··· 60 60 whereClause += " AND " + condition 61 61 } 62 62 } 63 + pageClause := "" 64 + if page.Limit > 0 { 65 + pageClause = " limit ? offset ? " 66 + args = append(args, page.Limit, page.Offset) 67 + } 63 68 64 69 query := fmt.Sprintf(` 65 70 select id, recipient_did, actor_did, type, entity_type, entity_id, read, created, repo_id, issue_id, pull_id 66 71 from notifications 67 72 %s 68 73 order by created desc 69 - limit ? offset ? 70 - `, whereClause) 71 - 72 - args = append(args, page.Limit, page.Offset) 74 + %s 75 + `, whereClause, pageClause) 73 76 74 77 rows, err := e.QueryContext(context.Background(), query, args...) 75 78 if err != nil {
+13 -41
appview/issues/issues.go
··· 78 78 issue, ok := r.Context().Value("issue").(*models.Issue) 79 79 if !ok { 80 80 l.Error("failed to get issue") 81 - rp.pages.Error404(w, pages.ErrorPageParams{ 82 - LoggedInUser: user, 83 - }) 81 + rp.pages.Error404(w) 84 82 return 85 83 } 86 84 ··· 101 99 ) 102 100 if err != nil { 103 101 l.Error("failed to fetch labels", "err", err) 104 - rp.pages.Error503(w, pages.ErrorPageParams{ 105 - LoggedInUser: user, 106 - }) 102 + rp.pages.Error503(w) 107 103 return 108 104 } 109 105 ··· 136 132 issue, ok := r.Context().Value("issue").(*models.Issue) 137 133 if !ok { 138 134 l.Error("failed to get issue") 139 - rp.pages.Error404(w, pages.ErrorPageParams{ 140 - LoggedInUser: user, 141 - }) 135 + rp.pages.Error404(w) 142 136 return 143 137 } 144 138 ··· 281 275 issue, ok := r.Context().Value("issue").(*models.Issue) 282 276 if !ok { 283 277 l.Error("failed to get issue") 284 - rp.pages.Error404(w, pages.ErrorPageParams{ 285 - LoggedInUser: user, 286 - }) 278 + rp.pages.Error404(w) 287 279 return 288 280 } 289 281 ··· 332 324 issue, ok := r.Context().Value("issue").(*models.Issue) 333 325 if !ok { 334 326 l.Error("failed to get issue") 335 - rp.pages.Error404(w, pages.ErrorPageParams{ 336 - LoggedInUser: user, 337 - }) 327 + rp.pages.Error404(w) 338 328 return 339 329 } 340 330 ··· 378 368 issue, ok := r.Context().Value("issue").(*models.Issue) 379 369 if !ok { 380 370 l.Error("failed to get issue") 381 - rp.pages.Error404(w, pages.ErrorPageParams{ 382 - LoggedInUser: user, 383 - }) 371 + rp.pages.Error404(w) 384 372 return 385 373 } 386 374 ··· 468 456 issue, ok := r.Context().Value("issue").(*models.Issue) 469 457 if !ok { 470 458 l.Error("failed to get issue") 471 - rp.pages.Error404(w, pages.ErrorPageParams{ 472 - LoggedInUser: user, 473 - }) 459 + rp.pages.Error404(w) 474 460 return 475 461 } 476 462 ··· 511 497 issue, ok := r.Context().Value("issue").(*models.Issue) 512 498 if !ok { 513 499 l.Error("failed to get issue") 514 - rp.pages.Error404(w, pages.ErrorPageParams{ 515 - LoggedInUser: user, 516 - }) 500 + rp.pages.Error404(w) 517 501 return 518 502 } 519 503 ··· 617 601 issue, ok := r.Context().Value("issue").(*models.Issue) 618 602 if !ok { 619 603 l.Error("failed to get issue") 620 - rp.pages.Error404(w, pages.ErrorPageParams{ 621 - LoggedInUser: user, 622 - }) 604 + rp.pages.Error404(w) 623 605 return 624 606 } 625 607 ··· 660 642 issue, ok := r.Context().Value("issue").(*models.Issue) 661 643 if !ok { 662 644 l.Error("failed to get issue") 663 - rp.pages.Error404(w, pages.ErrorPageParams{ 664 - LoggedInUser: user, 665 - }) 645 + rp.pages.Error404(w) 666 646 return 667 647 } 668 648 ··· 703 683 issue, ok := r.Context().Value("issue").(*models.Issue) 704 684 if !ok { 705 685 l.Error("failed to get issue") 706 - rp.pages.Error404(w, pages.ErrorPageParams{ 707 - LoggedInUser: user, 708 - }) 686 + rp.pages.Error404(w) 709 687 return 710 688 } 711 689 ··· 792 770 isOpen = true 793 771 } 794 772 795 - page, ok := r.Context().Value("page").(pagination.Page) 796 - if !ok { 797 - l.Error("failed to get page") 798 - page = pagination.FirstPage() 799 - } 773 + page := pagination.FromContext(r.Context()) 800 774 801 775 user := rp.oauth.GetUser(r) 802 776 f, err := rp.repoResolver.Resolve(r) ··· 828 802 ) 829 803 if err != nil { 830 804 l.Error("failed to fetch labels", "err", err) 831 - rp.pages.Error503(w, pages.ErrorPageParams{ 832 - LoggedInUser: user, 833 - }) 805 + rp.pages.Error503(w) 834 806 return 835 807 } 836 808
+7 -21
appview/middleware/middleware.go
··· 105 105 } 106 106 } 107 107 108 - ctx := context.WithValue(r.Context(), "page", page) 108 + ctx := pagination.IntoContext(r.Context(), page) 109 109 next.ServeHTTP(w, r.WithContext(ctx)) 110 110 }) 111 111 } ··· 191 191 if err != nil { 192 192 // invalid did or handle 193 193 log.Printf("failed to resolve did/handle '%s': %s\n", didOrHandle, err) 194 - mw.pages.Error404(w, pages.ErrorPageParams{}) 194 + mw.pages.Error404(w) 195 195 return 196 196 } 197 197 ··· 206 206 return func(next http.Handler) http.Handler { 207 207 return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { 208 208 repoName := chi.URLParam(req, "repo") 209 - user := mw.oauth.GetUser(req) 210 209 id, ok := req.Context().Value("resolvedId").(identity.Identity) 211 210 if !ok { 212 211 log.Println("malformed middleware") ··· 221 220 ) 222 221 if err != nil { 223 222 log.Println("failed to resolve repo", "err", err) 224 - mw.pages.ErrorKnot404(w, pages.ErrorPageParams{ 225 - LoggedInUser: user, 226 - }) 223 + mw.pages.ErrorKnot404(w) 227 224 return 228 225 } 229 226 ··· 238 235 return func(next http.Handler) http.Handler { 239 236 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 240 237 f, err := mw.repoResolver.Resolve(r) 241 - user := mw.oauth.GetUser(r) 242 238 if err != nil { 243 239 log.Println("failed to fully resolve repo", err) 244 - mw.pages.ErrorKnot404(w, pages.ErrorPageParams{ 245 - LoggedInUser: user, 246 - }) 240 + mw.pages.ErrorKnot404(w) 247 241 return 248 242 } 249 243 ··· 288 282 func (mw Middleware) ResolveIssue(next http.Handler) http.Handler { 289 283 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 290 284 f, err := mw.repoResolver.Resolve(r) 291 - user := mw.oauth.GetUser(r) 292 285 if err != nil { 293 286 log.Println("failed to fully resolve repo", err) 294 - mw.pages.ErrorKnot404(w, pages.ErrorPageParams{ 295 - LoggedInUser: user, 296 - }) 287 + mw.pages.ErrorKnot404(w) 297 288 return 298 289 } 299 290 ··· 301 292 issueId, err := strconv.Atoi(issueIdStr) 302 293 if err != nil { 303 294 log.Println("failed to fully resolve issue ID", err) 304 - mw.pages.ErrorKnot404(w, pages.ErrorPageParams{ 305 - LoggedInUser: user, 306 - }) 295 + mw.pages.ErrorKnot404(w) 307 296 return 308 297 } 309 298 ··· 337 326 return func(next http.Handler) http.Handler { 338 327 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 339 328 f, err := mw.repoResolver.Resolve(r) 340 - user := mw.oauth.GetUser(r) 341 329 if err != nil { 342 330 log.Println("failed to fully resolve repo", err) 343 - mw.pages.ErrorKnot404(w, pages.ErrorPageParams{ 344 - LoggedInUser: user, 345 - }) 331 + mw.pages.ErrorKnot404(w) 346 332 return 347 333 } 348 334
+3 -11
appview/notifications/notifications.go
··· 49 49 l := n.logger.With("handler", "notificationsPage") 50 50 user := n.oauth.GetUser(r) 51 51 52 - page, ok := r.Context().Value("page").(pagination.Page) 53 - if !ok { 54 - l.Error("failed to get page") 55 - page = pagination.FirstPage() 56 - } 52 + page := pagination.FromContext(r.Context()) 57 53 58 54 total, err := db.CountNotifications( 59 55 n.db, ··· 61 57 ) 62 58 if err != nil { 63 59 l.Error("failed to get total notifications", "err", err) 64 - n.pages.Error500(w, pages.ErrorPageParams{ 65 - LoggedInUser: user, 66 - }) 60 + n.pages.Error500(w) 67 61 return 68 62 } 69 63 ··· 74 68 ) 75 69 if err != nil { 76 70 l.Error("failed to get notifications", "err", err) 77 - n.pages.Error500(w, pages.ErrorPageParams{ 78 - LoggedInUser: user, 79 - }) 71 + n.pages.Error500(w) 80 72 return 81 73 } 82 74
+13 -2
appview/oauth/handler.go
··· 4 4 "bytes" 5 5 "context" 6 6 "encoding/json" 7 + "errors" 7 8 "fmt" 8 9 "net/http" 9 10 "slices" 10 11 "time" 11 12 13 + "github.com/bluesky-social/indigo/atproto/auth/oauth" 12 14 "github.com/go-chi/chi/v5" 13 15 "github.com/lestrrat-go/jwx/v2/jwk" 14 16 "github.com/posthog/posthog-go" ··· 58 60 59 61 func (o *OAuth) callback(w http.ResponseWriter, r *http.Request) { 60 62 ctx := r.Context() 63 + l := o.Logger.With("query", r.URL.Query()) 61 64 62 65 sessData, err := o.ClientApp.ProcessCallback(ctx, r.URL.Query()) 63 66 if err != nil { 64 - http.Error(w, err.Error(), http.StatusInternalServerError) 67 + var callbackErr *oauth.AuthRequestCallbackError 68 + if errors.As(err, &callbackErr) { 69 + l.Debug("callback error", "err", callbackErr) 70 + http.Redirect(w, r, fmt.Sprintf("/login?error=%s", callbackErr.ErrorCode), http.StatusFound) 71 + return 72 + } 73 + l.Error("failed to process callback", "err", err) 74 + http.Redirect(w, r, "/login?error=oauth", http.StatusFound) 65 75 return 66 76 } 67 77 68 78 if err := o.SaveSession(w, r, sessData); err != nil { 69 - http.Error(w, err.Error(), http.StatusInternalServerError) 79 + l.Error("failed to save session", "data", sessData, "err", err) 80 + http.Redirect(w, r, "/login?error=session", http.StatusFound) 70 81 return 71 82 } 72 83
+4 -1
appview/oauth/oauth.go
··· 58 58 59 59 sessStore := sessions.NewCookieStore([]byte(config.Core.CookieSecret)) 60 60 61 + clientApp := oauth.NewClientApp(&oauthConfig, authStore) 62 + clientApp.Dir = res.Directory() 63 + 61 64 return &OAuth{ 62 - ClientApp: oauth.NewClientApp(&oauthConfig, authStore), 65 + ClientApp: clientApp, 63 66 Config: config, 64 67 SessStore: sessStore, 65 68 JwksUri: jwksUri,
+3 -2
appview/pages/funcmap.go
··· 297 297 }, 298 298 299 299 "normalizeForHtmlId": func(s string) string { 300 - // TODO: extend this to handle other cases? 301 - return strings.ReplaceAll(s, ":", "_") 300 + normalized := strings.ReplaceAll(s, ":", "_") 301 + normalized = strings.ReplaceAll(normalized, ".", "_") 302 + return normalized 302 303 }, 303 304 "sshFingerprint": func(pubKey string) string { 304 305 fp, err := crypto.SSHFingerprint(pubKey)
+9 -12
appview/pages/pages.go
··· 221 221 222 222 type LoginParams struct { 223 223 ReturnUrl string 224 + ErrorCode string 224 225 } 225 226 226 227 func (p *Pages) Login(w io.Writer, params LoginParams) error { ··· 1381 1382 Active string 1382 1383 } 1383 1384 1384 - type ErrorPageParams struct { 1385 - LoggedInUser *oauth.User 1386 - } 1387 - 1388 1385 func (p *Pages) Workflow(w io.Writer, params WorkflowParams) error { 1389 1386 params.Active = "pipelines" 1390 1387 return p.executeRepo("repo/pipelines/workflow", w, params) ··· 1522 1519 return hex.EncodeToString(hasher.Sum(nil))[:8] // Use first 8 chars of hash 1523 1520 } 1524 1521 1525 - func (p *Pages) Error500(w io.Writer, params ErrorPageParams) error { 1526 - return p.execute("errors/500", w, params) 1522 + func (p *Pages) Error500(w io.Writer) error { 1523 + return p.execute("errors/500", w, nil) 1527 1524 } 1528 1525 1529 - func (p *Pages) Error404(w io.Writer, params ErrorPageParams) error { 1530 - return p.execute("errors/404", w, params) 1526 + func (p *Pages) Error404(w io.Writer) error { 1527 + return p.execute("errors/404", w, nil) 1531 1528 } 1532 1529 1533 - func (p *Pages) ErrorKnot404(w io.Writer, params ErrorPageParams) error { 1534 - return p.execute("errors/knot404", w, params) 1530 + func (p *Pages) ErrorKnot404(w io.Writer) error { 1531 + return p.execute("errors/knot404", w, nil) 1535 1532 } 1536 1533 1537 - func (p *Pages) Error503(w io.Writer, params ErrorPageParams) error { 1538 - return p.execute("errors/503", w, params) 1534 + func (p *Pages) Error503(w io.Writer) error { 1535 + return p.execute("errors/503", w, nil) 1539 1536 }
+1 -1
appview/pages/templates/strings/string.html
··· 47 47 </span> 48 48 </section> 49 49 <section class="bg-white dark:bg-gray-800 px-6 py-4 rounded relative w-full dark:text-white"> 50 - <div class="flex justify-between items-center text-gray-500 dark:text-gray-400 text-sm md:text-base pb-2 mb-3 text-base border-b border-gray-200 dark:border-gray-700"> 50 + <div class="flex flex-col md:flex-row md:justify-between md:items-center text-gray-500 dark:text-gray-400 text-sm md:text-base pb-2 mb-3 text-base border-b border-gray-200 dark:border-gray-700"> 51 51 <span> 52 52 {{ .String.Filename }} 53 53 <span class="select-none px-1 md:px-2 [&:before]:content-['·']"></span>
+1 -1
appview/pages/templates/user/fragments/followCard.html
··· 3 3 <div class="flex flex-col divide-y divide-gray-200 dark:divide-gray-700 rounded-sm"> 4 4 <div class="py-4 px-6 drop-shadow-sm rounded bg-white dark:bg-gray-800 flex items-center gap-4"> 5 5 <div class="flex-shrink-0 max-h-full w-24 h-24"> 6 - <img class="object-cover rounded-full p-2" src="{{ fullAvatar $userIdent }}" /> 6 + <img class="object-cover rounded-full p-2" src="{{ fullAvatar $userIdent }}" alt="{{ $userIdent }}" /> 7 7 </div> 8 8 9 9 <div class="flex flex-col md:flex-row md:items-center md:justify-between gap-2 w-full">
+20 -2
appview/pages/templates/user/login.html
··· 13 13 <title>login &middot; tangled</title> 14 14 </head> 15 15 <body class="flex items-center justify-center min-h-screen"> 16 - <main class="max-w-md px-6 -mt-4"> 16 + <main class="max-w-md px-7 mt-4"> 17 17 <h1 class="flex place-content-center text-3xl font-semibold italic dark:text-white" > 18 18 {{ template "fragments/logotype" }} 19 19 </h1> ··· 21 21 tightly-knit social coding. 22 22 </h2> 23 23 <form 24 - class="mt-4 max-w-sm mx-auto" 24 + class="mt-4" 25 25 hx-post="/login" 26 26 hx-swap="none" 27 27 hx-disabled-elt="#login-button" ··· 56 56 <span>login</span> 57 57 </button> 58 58 </form> 59 + {{ if .ErrorCode }} 60 + <div class="flex gap-2 my-2 bg-red-50 dark:bg-red-900 border border-red-500 rounded drop-shadow-sm px-3 py-2 text-red-500 dark:text-red-300"> 61 + <span class="py-1">{{ i "circle-alert" "w-4 h-4" }}</span> 62 + <div> 63 + <h5 class="font-medium">Login error</h5> 64 + <p class="text-sm"> 65 + {{ if eq .ErrorCode "access_denied" }} 66 + You have not authorized the app. 67 + {{ else if eq .ErrorCode "session" }} 68 + Server failed to create user session. 69 + {{ else }} 70 + Internal Server error. 71 + {{ end }} 72 + Please try again. 73 + </p> 74 + </div> 75 + </div> 76 + {{ end }} 59 77 <p class="text-sm text-gray-500"> 60 78 Don't have an account? <a href="/signup" class="underline">Create an account</a> on Tangled now! 61 79 </p>
+23
appview/pagination/page.go
··· 1 1 package pagination 2 2 3 + import "context" 4 + 3 5 type Page struct { 4 6 Offset int // where to start from 5 7 Limit int // number of items in a page ··· 10 12 Offset: 0, 11 13 Limit: 30, 12 14 } 15 + } 16 + 17 + type ctxKey struct{} 18 + 19 + func IntoContext(ctx context.Context, page Page) context.Context { 20 + return context.WithValue(ctx, ctxKey{}, page) 21 + } 22 + 23 + func FromContext(ctx context.Context) Page { 24 + if ctx == nil { 25 + return FirstPage() 26 + } 27 + v := ctx.Value(ctxKey{}) 28 + if v == nil { 29 + return FirstPage() 30 + } 31 + page, ok := v.(Page) 32 + if !ok { 33 + return FirstPage() 34 + } 35 + return page 13 36 } 14 37 15 38 func (p Page) Previous() Page {
+10 -30
appview/pulls/pulls.go
··· 205 205 ) 206 206 if err != nil { 207 207 log.Println("failed to fetch labels", err) 208 - s.pages.Error503(w, pages.ErrorPageParams{ 209 - LoggedInUser: user, 210 - }) 208 + s.pages.Error503(w) 211 209 return 212 210 } 213 211 ··· 638 636 ) 639 637 if err != nil { 640 638 log.Println("failed to fetch labels", err) 641 - s.pages.Error503(w, pages.ErrorPageParams{ 642 - LoggedInUser: user, 643 - }) 639 + s.pages.Error503(w) 644 640 return 645 641 } 646 642 ··· 789 785 if err != nil { 790 786 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 791 787 log.Println("failed to call XRPC repo.branches", xrpcerr) 792 - s.pages.Error503(w, pages.ErrorPageParams{ 793 - LoggedInUser: user, 794 - }) 788 + s.pages.Error503(w) 795 789 return 796 790 } 797 791 log.Println("failed to fetch branches", err) ··· 801 795 var result types.RepoBranchesResponse 802 796 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 803 797 log.Println("failed to decode XRPC response", err) 804 - s.pages.Error503(w, pages.ErrorPageParams{ 805 - LoggedInUser: user, 806 - }) 798 + s.pages.Error503(w) 807 799 return 808 800 } 809 801 ··· 1400 1392 if err != nil { 1401 1393 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 1402 1394 log.Println("failed to call XRPC repo.branches", xrpcerr) 1403 - s.pages.Error503(w, pages.ErrorPageParams{ 1404 - LoggedInUser: user, 1405 - }) 1395 + s.pages.Error503(w) 1406 1396 return 1407 1397 } 1408 1398 log.Println("failed to fetch branches", err) ··· 1412 1402 var result types.RepoBranchesResponse 1413 1403 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 1414 1404 log.Println("failed to decode XRPC response", err) 1415 - s.pages.Error503(w, pages.ErrorPageParams{ 1416 - LoggedInUser: user, 1417 - }) 1405 + s.pages.Error503(w) 1418 1406 return 1419 1407 } 1420 1408 ··· 1496 1484 if err != nil { 1497 1485 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 1498 1486 log.Println("failed to call XRPC repo.branches for source", xrpcerr) 1499 - s.pages.Error503(w, pages.ErrorPageParams{ 1500 - LoggedInUser: user, 1501 - }) 1487 + s.pages.Error503(w) 1502 1488 return 1503 1489 } 1504 1490 log.Println("failed to fetch source branches", err) ··· 1509 1495 var sourceBranches types.RepoBranchesResponse 1510 1496 if err := json.Unmarshal(sourceXrpcBytes, &sourceBranches); err != nil { 1511 1497 log.Println("failed to decode source branches XRPC response", err) 1512 - s.pages.Error503(w, pages.ErrorPageParams{ 1513 - LoggedInUser: user, 1514 - }) 1498 + s.pages.Error503(w) 1515 1499 return 1516 1500 } 1517 1501 ··· 1529 1513 if err != nil { 1530 1514 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 1531 1515 log.Println("failed to call XRPC repo.branches for target", xrpcerr) 1532 - s.pages.Error503(w, pages.ErrorPageParams{ 1533 - LoggedInUser: user, 1534 - }) 1516 + s.pages.Error503(w) 1535 1517 return 1536 1518 } 1537 1519 log.Println("failed to fetch target branches", err) ··· 1542 1524 var targetBranches types.RepoBranchesResponse 1543 1525 if err := json.Unmarshal(targetXrpcBytes, &targetBranches); err != nil { 1544 1526 log.Println("failed to decode target branches XRPC response", err) 1545 - s.pages.Error503(w, pages.ErrorPageParams{ 1546 - LoggedInUser: user, 1547 - }) 1527 + s.pages.Error503(w) 1548 1528 return 1549 1529 } 1550 1530
+2 -8
appview/repo/feed.go
··· 10 10 11 11 "tangled.org/core/appview/db" 12 12 "tangled.org/core/appview/models" 13 - "tangled.org/core/appview/pages" 14 13 "tangled.org/core/appview/pagination" 15 14 "tangled.org/core/appview/reporesolver" 16 15 ··· 153 152 log.Println("failed to fully resolve repo:", err) 154 153 return 155 154 } 156 - user := rp.oauth.GetUser(r) 157 155 158 156 feed, err := rp.getRepoFeed(r.Context(), f) 159 157 if err != nil { 160 158 log.Println("failed to get repo feed:", err) 161 - rp.pages.Error500(w, pages.ErrorPageParams{ 162 - LoggedInUser: user, 163 - }) 159 + rp.pages.Error500(w) 164 160 return 165 161 } 166 162 167 163 atom, err := feed.ToAtom() 168 164 if err != nil { 169 - rp.pages.Error500(w, pages.ErrorPageParams{ 170 - LoggedInUser: user, 171 - }) 165 + rp.pages.Error500(w) 172 166 return 173 167 } 174 168
+1 -3
appview/repo/index.go
··· 67 67 return 68 68 } 69 69 70 - rp.pages.Error503(w, pages.ErrorPageParams{ 71 - LoggedInUser: user, 72 - }) 70 + rp.pages.Error503(w) 73 71 l.Error("failed to build index response", "err", err) 74 72 return 75 73 }
+34 -83
appview/repo/repo.go
··· 90 90 91 91 func (rp *Repo) DownloadArchive(w http.ResponseWriter, r *http.Request) { 92 92 l := rp.logger.With("handler", "DownloadArchive") 93 - user := rp.oauth.GetUser(r) 94 93 95 94 ref := chi.URLParam(r, "ref") 96 95 ref, _ = url.PathUnescape(ref) ··· 114 113 archiveBytes, err := tangled.RepoArchive(r.Context(), xrpcc, "tar.gz", "", ref, repo) 115 114 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 116 115 l.Error("failed to call XRPC repo.archive", "err", xrpcerr) 117 - rp.pages.Error503(w, pages.ErrorPageParams{ 118 - LoggedInUser: user, 119 - }) 116 + rp.pages.Error503(w) 120 117 return 121 118 } 122 119 ··· 133 130 134 131 func (rp *Repo) RepoLog(w http.ResponseWriter, r *http.Request) { 135 132 l := rp.logger.With("handler", "RepoLog") 136 - user := rp.oauth.GetUser(r) 137 133 138 134 f, err := rp.repoResolver.Resolve(r) 139 135 if err != nil { ··· 173 169 xrpcBytes, err := tangled.RepoLog(r.Context(), xrpcc, cursor, limit, "", ref, repo) 174 170 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 175 171 l.Error("failed to call XRPC repo.log", "err", xrpcerr) 176 - rp.pages.Error503(w, pages.ErrorPageParams{ 177 - LoggedInUser: user, 178 - }) 172 + rp.pages.Error503(w) 179 173 return 180 174 } 181 175 182 176 var xrpcResp types.RepoLogResponse 183 177 if err := json.Unmarshal(xrpcBytes, &xrpcResp); err != nil { 184 178 l.Error("failed to decode XRPC response", "err", err) 185 - rp.pages.Error503(w, pages.ErrorPageParams{ 186 - LoggedInUser: user, 187 - }) 179 + rp.pages.Error503(w) 188 180 return 189 181 } 190 182 191 183 tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) 192 184 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 193 185 l.Error("failed to call XRPC repo.tags", "err", xrpcerr) 194 - rp.pages.Error503(w, pages.ErrorPageParams{ 195 - LoggedInUser: user, 196 - }) 186 + rp.pages.Error503(w) 197 187 return 198 188 } 199 189 ··· 214 204 branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 215 205 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 216 206 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 217 - rp.pages.Error503(w, pages.ErrorPageParams{ 218 - LoggedInUser: user, 219 - }) 207 + rp.pages.Error503(w) 220 208 return 221 209 } 222 210 ··· 228 216 } 229 217 } 230 218 } 219 + 220 + user := rp.oauth.GetUser(r) 231 221 232 222 emailToDidMap, err := db.GetEmailToDid(rp.db, uniqueEmails(xrpcResp.Commits), true) 233 223 if err != nil { ··· 363 353 364 354 func (rp *Repo) RepoCommit(w http.ResponseWriter, r *http.Request) { 365 355 l := rp.logger.With("handler", "RepoCommit") 366 - user := rp.oauth.GetUser(r) 367 356 368 357 f, err := rp.repoResolver.Resolve(r) 369 358 if err != nil { ··· 379 368 } 380 369 381 370 if !plumbing.IsHash(ref) { 382 - rp.pages.Error404(w, pages.ErrorPageParams{ 383 - LoggedInUser: user, 384 - }) 371 + rp.pages.Error404(w) 385 372 return 386 373 } 387 374 ··· 398 385 xrpcBytes, err := tangled.RepoDiff(r.Context(), xrpcc, ref, repo) 399 386 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 400 387 l.Error("failed to call XRPC repo.diff", "err", xrpcerr) 401 - rp.pages.Error503(w, pages.ErrorPageParams{ 402 - LoggedInUser: user, 403 - }) 388 + rp.pages.Error503(w) 404 389 return 405 390 } 406 391 407 392 var result types.RepoCommitResponse 408 393 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 409 394 l.Error("failed to decode XRPC response", "err", err) 410 - rp.pages.Error503(w, pages.ErrorPageParams{ 411 - LoggedInUser: user, 412 - }) 395 + rp.pages.Error503(w) 413 396 return 414 397 } 415 398 ··· 423 406 l.Error("failed to GetVerifiedCommits", "err", err) 424 407 } 425 408 409 + user := rp.oauth.GetUser(r) 426 410 repoInfo := f.RepoInfo(user) 427 411 pipelines, err := getPipelineStatuses(rp.db, repoInfo, []string{result.Diff.Commit.This}) 428 412 if err != nil { ··· 447 431 448 432 func (rp *Repo) RepoTree(w http.ResponseWriter, r *http.Request) { 449 433 l := rp.logger.With("handler", "RepoTree") 450 - user := rp.oauth.GetUser(r) 451 434 452 435 f, err := rp.repoResolver.Resolve(r) 453 436 if err != nil { ··· 477 460 xrpcResp, err := tangled.RepoTree(r.Context(), xrpcc, treePath, ref, repo) 478 461 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 479 462 l.Error("failed to call XRPC repo.tree", "err", xrpcerr) 480 - rp.pages.Error503(w, pages.ErrorPageParams{ 481 - LoggedInUser: user, 482 - }) 463 + rp.pages.Error503(w) 483 464 return 484 465 } 485 466 ··· 530 511 http.Redirect(w, r, redirectTo, http.StatusFound) 531 512 return 532 513 } 514 + 515 + user := rp.oauth.GetUser(r) 533 516 534 517 var breadcrumbs [][]string 535 518 breadcrumbs = append(breadcrumbs, []string{f.Name, fmt.Sprintf("/%s/tree/%s", f.OwnerSlashRepo(), url.PathEscape(ref))}) ··· 552 535 553 536 func (rp *Repo) RepoTags(w http.ResponseWriter, r *http.Request) { 554 537 l := rp.logger.With("handler", "RepoTags") 555 - user := rp.oauth.GetUser(r) 556 538 557 539 f, err := rp.repoResolver.Resolve(r) 558 540 if err != nil { ··· 573 555 xrpcBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) 574 556 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 575 557 l.Error("failed to call XRPC repo.tags", "err", xrpcerr) 576 - rp.pages.Error503(w, pages.ErrorPageParams{ 577 - LoggedInUser: user, 578 - }) 558 + rp.pages.Error503(w) 579 559 return 580 560 } 581 561 582 562 var result types.RepoTagsResponse 583 563 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 584 564 l.Error("failed to decode XRPC response", "err", err) 585 - rp.pages.Error503(w, pages.ErrorPageParams{ 586 - LoggedInUser: user, 587 - }) 565 + rp.pages.Error503(w) 588 566 return 589 567 } 590 568 ··· 616 594 } 617 595 } 618 596 597 + user := rp.oauth.GetUser(r) 619 598 rp.pages.RepoTags(w, pages.RepoTagsParams{ 620 599 LoggedInUser: user, 621 600 RepoInfo: f.RepoInfo(user), ··· 627 606 628 607 func (rp *Repo) RepoBranches(w http.ResponseWriter, r *http.Request) { 629 608 l := rp.logger.With("handler", "RepoBranches") 630 - user := rp.oauth.GetUser(r) 631 609 632 610 f, err := rp.repoResolver.Resolve(r) 633 611 if err != nil { ··· 648 626 xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 649 627 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 650 628 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 651 - rp.pages.Error503(w, pages.ErrorPageParams{ 652 - LoggedInUser: user, 653 - }) 629 + rp.pages.Error503(w) 654 630 return 655 631 } 656 632 657 633 var result types.RepoBranchesResponse 658 634 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 659 635 l.Error("failed to decode XRPC response", "err", err) 660 - rp.pages.Error503(w, pages.ErrorPageParams{ 661 - LoggedInUser: user, 662 - }) 636 + rp.pages.Error503(w) 663 637 return 664 638 } 665 639 666 640 sortBranches(result.Branches) 667 641 642 + user := rp.oauth.GetUser(r) 668 643 rp.pages.RepoBranches(w, pages.RepoBranchesParams{ 669 644 LoggedInUser: user, 670 645 RepoInfo: f.RepoInfo(user), ··· 723 698 724 699 func (rp *Repo) RepoBlob(w http.ResponseWriter, r *http.Request) { 725 700 l := rp.logger.With("handler", "RepoBlob") 726 - user := rp.oauth.GetUser(r) 727 701 728 702 f, err := rp.repoResolver.Resolve(r) 729 703 if err != nil { ··· 750 724 resp, err := tangled.RepoBlob(r.Context(), xrpcc, filePath, false, ref, repo) 751 725 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 752 726 l.Error("failed to call XRPC repo.blob", "err", xrpcerr) 753 - rp.pages.Error503(w, pages.ErrorPageParams{ 754 - LoggedInUser: user, 755 - }) 727 + rp.pages.Error503(w) 756 728 return 757 729 } 758 730 ··· 824 796 sizeHint = uint64(len(resp.Content)) 825 797 } 826 798 799 + user := rp.oauth.GetUser(r) 800 + 827 801 // Determine if content is binary (dereference pointer) 828 802 isBinary := false 829 803 if resp.IsBinary != nil { ··· 850 824 851 825 func (rp *Repo) RepoBlobRaw(w http.ResponseWriter, r *http.Request) { 852 826 l := rp.logger.With("handler", "RepoBlobRaw") 853 - user := rp.oauth.GetUser(r) 854 827 855 828 f, err := rp.repoResolver.Resolve(r) 856 829 if err != nil { ··· 899 872 resp, err := client.Do(req) 900 873 if err != nil { 901 874 l.Error("failed to reach knotserver", "err", err) 902 - rp.pages.Error503(w, pages.ErrorPageParams{ 903 - LoggedInUser: user, 904 - }) 875 + rp.pages.Error503(w) 905 876 return 906 877 } 907 878 defer resp.Body.Close() ··· 1992 1963 xrpcBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 1993 1964 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 1994 1965 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 1995 - rp.pages.Error503(w, pages.ErrorPageParams{ 1996 - LoggedInUser: user, 1997 - }) 1966 + rp.pages.Error503(w) 1998 1967 return 1999 1968 } 2000 1969 2001 1970 var result types.RepoBranchesResponse 2002 1971 if err := json.Unmarshal(xrpcBytes, &result); err != nil { 2003 1972 l.Error("failed to decode XRPC response", "err", err) 2004 - rp.pages.Error503(w, pages.ErrorPageParams{ 2005 - LoggedInUser: user, 2006 - }) 1973 + rp.pages.Error503(w) 2007 1974 return 2008 1975 } 2009 1976 2010 1977 defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", models.DefaultLabelDefs())) 2011 1978 if err != nil { 2012 1979 l.Error("failed to fetch labels", "err", err) 2013 - rp.pages.Error503(w, pages.ErrorPageParams{ 2014 - LoggedInUser: user, 2015 - }) 1980 + rp.pages.Error503(w) 2016 1981 return 2017 1982 } 2018 1983 2019 1984 labels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", f.Repo.Labels)) 2020 1985 if err != nil { 2021 1986 l.Error("failed to fetch labels", "err", err) 2022 - rp.pages.Error503(w, pages.ErrorPageParams{ 2023 - LoggedInUser: user, 2024 - }) 1987 + rp.pages.Error503(w) 2025 1988 return 2026 1989 } 2027 1990 // remove default labels from the labels list, if present ··· 2455 2418 branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 2456 2419 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 2457 2420 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 2458 - rp.pages.Error503(w, pages.ErrorPageParams{ 2459 - LoggedInUser: user, 2460 - }) 2421 + rp.pages.Error503(w) 2461 2422 return 2462 2423 } 2463 2424 ··· 2494 2455 tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) 2495 2456 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 2496 2457 l.Error("failed to call XRPC repo.tags", "err", xrpcerr) 2497 - rp.pages.Error503(w, pages.ErrorPageParams{ 2498 - LoggedInUser: user, 2499 - }) 2458 + rp.pages.Error503(w) 2500 2459 return 2501 2460 } 2502 2461 ··· 2553 2512 2554 2513 if base == "" || head == "" { 2555 2514 l.Error("invalid comparison") 2556 - rp.pages.Error404(w, pages.ErrorPageParams{ 2557 - LoggedInUser: user, 2558 - }) 2515 + rp.pages.Error404(w) 2559 2516 return 2560 2517 } 2561 2518 ··· 2573 2530 branchBytes, err := tangled.RepoBranches(r.Context(), xrpcc, "", 0, repo) 2574 2531 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 2575 2532 l.Error("failed to call XRPC repo.branches", "err", xrpcerr) 2576 - rp.pages.Error503(w, pages.ErrorPageParams{ 2577 - LoggedInUser: user, 2578 - }) 2533 + rp.pages.Error503(w) 2579 2534 return 2580 2535 } 2581 2536 ··· 2589 2544 tagBytes, err := tangled.RepoTags(r.Context(), xrpcc, "", 0, repo) 2590 2545 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 2591 2546 l.Error("failed to call XRPC repo.tags", "err", xrpcerr) 2592 - rp.pages.Error503(w, pages.ErrorPageParams{ 2593 - LoggedInUser: user, 2594 - }) 2547 + rp.pages.Error503(w) 2595 2548 return 2596 2549 } 2597 2550 ··· 2605 2558 compareBytes, err := tangled.RepoCompare(r.Context(), xrpcc, repo, base, head) 2606 2559 if xrpcerr := xrpcclient.HandleXrpcErr(err); xrpcerr != nil { 2607 2560 l.Error("failed to call XRPC repo.compare", "err", xrpcerr) 2608 - rp.pages.Error503(w, pages.ErrorPageParams{ 2609 - LoggedInUser: user, 2610 - }) 2561 + rp.pages.Error503(w) 2611 2562 return 2612 2563 } 2613 2564
+1
appview/state/follow.go
··· 26 26 subjectIdent, err := s.idResolver.ResolveIdent(r.Context(), subject) 27 27 if err != nil { 28 28 log.Println("failed to follow, invalid did") 29 + return 29 30 } 30 31 31 32 if currentUser.Did == subjectIdent.DID.String() {
+3 -10
appview/state/gfi.go
··· 18 18 func (s *State) GoodFirstIssues(w http.ResponseWriter, r *http.Request) { 19 19 user := s.oauth.GetUser(r) 20 20 21 - page, ok := r.Context().Value("page").(pagination.Page) 22 - if !ok { 23 - page = pagination.FirstPage() 24 - } 21 + page := pagination.FromContext(r.Context()) 25 22 26 23 goodFirstIssueLabel := fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "good-first-issue") 27 24 28 25 repoLabels, err := db.GetRepoLabels(s.db, db.FilterEq("label_at", goodFirstIssueLabel)) 29 26 if err != nil { 30 27 log.Println("failed to get repo labels", err) 31 - s.pages.Error503(w, pages.ErrorPageParams{ 32 - LoggedInUser: user, 33 - }) 28 + s.pages.Error503(w) 34 29 return 35 30 } 36 31 ··· 59 54 ) 60 55 if err != nil { 61 56 log.Println("failed to get issues", err) 62 - s.pages.Error503(w, pages.ErrorPageParams{ 63 - LoggedInUser: user, 64 - }) 57 + s.pages.Error503(w) 65 58 return 66 59 } 67 60
+2
appview/state/login.go
··· 14 14 switch r.Method { 15 15 case http.MethodGet: 16 16 returnURL := r.URL.Query().Get("return_url") 17 + errorCode := r.URL.Query().Get("error") 17 18 s.pages.Login(w, pages.LoginParams{ 18 19 ReturnUrl: returnURL, 20 + ErrorCode: errorCode, 19 21 }) 20 22 case http.MethodPost: 21 23 handle := r.FormValue("handle")
+10 -36
appview/state/profile.go
··· 112 112 113 113 func (s *State) profileOverview(w http.ResponseWriter, r *http.Request) { 114 114 l := s.logger.With("handler", "profileHomePage") 115 - user := s.oauth.GetUser(r) 116 115 117 116 profile, err := s.profile(r) 118 117 if err != nil { 119 118 l.Error("failed to build profile card", "err", err) 120 - s.pages.Error500(w, pages.ErrorPageParams{ 121 - LoggedInUser: user, 122 - }) 119 + s.pages.Error500(w) 123 120 return 124 121 } 125 122 l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) ··· 176 173 177 174 func (s *State) reposPage(w http.ResponseWriter, r *http.Request) { 178 175 l := s.logger.With("handler", "reposPage") 179 - user := s.oauth.GetUser(r) 180 176 181 177 profile, err := s.profile(r) 182 178 if err != nil { 183 179 l.Error("failed to build profile card", "err", err) 184 - s.pages.Error500(w, pages.ErrorPageParams{ 185 - LoggedInUser: user, 186 - }) 180 + s.pages.Error500(w) 187 181 return 188 182 } 189 183 l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) ··· 195 189 ) 196 190 if err != nil { 197 191 l.Error("failed to get repos", "err", err) 198 - s.pages.Error500(w, pages.ErrorPageParams{ 199 - LoggedInUser: user, 200 - }) 192 + s.pages.Error500(w) 201 193 return 202 194 } 203 195 ··· 210 202 211 203 func (s *State) starredPage(w http.ResponseWriter, r *http.Request) { 212 204 l := s.logger.With("handler", "starredPage") 213 - user := s.oauth.GetUser(r) 214 205 215 206 profile, err := s.profile(r) 216 207 if err != nil { 217 208 l.Error("failed to build profile card", "err", err) 218 - s.pages.Error500(w, pages.ErrorPageParams{ 219 - LoggedInUser: user, 220 - }) 209 + s.pages.Error500(w) 221 210 return 222 211 } 223 212 l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) ··· 225 214 stars, err := db.GetStars(s.db, 0, db.FilterEq("starred_by_did", profile.UserDid)) 226 215 if err != nil { 227 216 l.Error("failed to get stars", "err", err) 228 - s.pages.Error500(w, pages.ErrorPageParams{ 229 - LoggedInUser: user, 230 - }) 217 + s.pages.Error500(w) 231 218 return 232 219 } 233 220 var repos []models.Repo ··· 246 233 247 234 func (s *State) stringsPage(w http.ResponseWriter, r *http.Request) { 248 235 l := s.logger.With("handler", "stringsPage") 249 - user := s.oauth.GetUser(r) 250 236 251 237 profile, err := s.profile(r) 252 238 if err != nil { 253 239 l.Error("failed to build profile card", "err", err) 254 - s.pages.Error500(w, pages.ErrorPageParams{ 255 - LoggedInUser: user, 256 - }) 240 + s.pages.Error500(w) 257 241 return 258 242 } 259 243 l = l.With("profileDid", profile.UserDid, "profileHandle", profile.UserHandle) ··· 261 245 strings, err := db.GetStrings(s.db, 0, db.FilterEq("did", profile.UserDid)) 262 246 if err != nil { 263 247 l.Error("failed to get strings", "err", err) 264 - s.pages.Error500(w, pages.ErrorPageParams{ 265 - LoggedInUser: user, 266 - }) 248 + s.pages.Error500(w) 267 249 return 268 250 } 269 251 ··· 398 380 399 381 func (s *State) AtomFeedPage(w http.ResponseWriter, r *http.Request) { 400 382 ident, ok := r.Context().Value("resolvedId").(identity.Identity) 401 - user := s.oauth.GetUser(r) 402 - 403 383 if !ok { 404 - s.pages.Error404(w, pages.ErrorPageParams{ 405 - LoggedInUser: user, 406 - }) 384 + s.pages.Error404(w) 407 385 return 408 386 } 409 387 410 388 feed, err := s.getProfileFeed(r.Context(), &ident) 411 389 if err != nil { 412 - s.pages.Error500(w, pages.ErrorPageParams{ 413 - LoggedInUser: user, 414 - }) 390 + s.pages.Error500(w) 415 391 return 416 392 } 417 393 ··· 421 397 422 398 atom, err := feed.ToAtom() 423 399 if err != nil { 424 - s.pages.Error500(w, pages.ErrorPageParams{ 425 - LoggedInUser: user, 426 - }) 400 + s.pages.Error500(w) 427 401 return 428 402 } 429 403
+2 -3
appview/state/router.go
··· 10 10 "tangled.org/core/appview/labels" 11 11 "tangled.org/core/appview/middleware" 12 12 "tangled.org/core/appview/notifications" 13 - "tangled.org/core/appview/pages" 14 13 "tangled.org/core/appview/pipelines" 15 14 "tangled.org/core/appview/pulls" 16 15 "tangled.org/core/appview/repo" ··· 104 103 }) 105 104 106 105 r.NotFound(func(w http.ResponseWriter, r *http.Request) { 107 - s.pages.Error404(w, pages.ErrorPageParams{}) 106 + s.pages.Error404(w) 108 107 }) 109 108 110 109 return r ··· 175 174 r.Get("/brand", s.Brand) 176 175 177 176 r.NotFound(func(w http.ResponseWriter, r *http.Request) { 178 - s.pages.Error404(w, pages.ErrorPageParams{}) 177 + s.pages.Error404(w) 179 178 }) 180 179 return r 181 180 }
+1 -4
appview/strings/strings.go
··· 88 88 89 89 func (s *Strings) contents(w http.ResponseWriter, r *http.Request) { 90 90 l := s.Logger.With("handler", "contents") 91 - user := s.OAuth.GetUser(r) 92 91 93 92 id, ok := r.Context().Value("resolvedId").(identity.Identity) 94 93 if !ok { ··· 119 118 } 120 119 if len(strings) < 1 { 121 120 l.Error("string not found") 122 - s.Pages.Error404(w, pages.ErrorPageParams{ 123 - LoggedInUser: user, 124 - }) 121 + s.Pages.Error404(w) 125 122 return 126 123 } 127 124 if len(strings) != 1 {
+1 -1
spindle/engines/nixery/engine.go
··· 222 222 }, 223 223 ReadonlyRootfs: false, 224 224 CapDrop: []string{"ALL"}, 225 - CapAdd: []string{"CAP_DAC_OVERRIDE"}, 225 + CapAdd: []string{"CAP_DAC_OVERRIDE", "CAP_CHOWN", "CAP_FOWNER", "CAP_SETUID", "CAP_SETGID"}, 226 226 SecurityOpt: []string{"no-new-privileges"}, 227 227 ExtraHosts: []string{"host.docker.internal:host-gateway"}, 228 228 }, nil, nil, "")