···66 "fmt"
77 "log/slog"
88 "net/http"
99+ "os"
910 "path/filepath"
1011 "strings"
11121313+ securejoin "github.com/cyphar/filepath-securejoin"
1214 "github.com/go-chi/chi/v5"
1315 "github.com/go-chi/chi/v5/middleware"
1416 "github.com/go-git/go-git/v5/plumbing"
···124126 ownerDid := repoOwnerIdent.DID.String()
125127 repoName := components[1]
126128 repoDid, didErr := h.db.GetRepoDid(ownerDid, repoName)
127127- if didErr != nil {
128128- w.WriteHeader(http.StatusNotFound)
129129- l.Error("repo DID not found", "owner", ownerDid, "name", repoName, "err", didErr)
130130- fmt.Fprintln(w, "repo not found")
131131- return
129129+ var repoPath string
130130+ if didErr == nil {
131131+ var lookupErr error
132132+ repoPath, _, _, lookupErr = h.db.ResolveRepoDIDOnDisk(h.c.Repo.ScanPath, repoDid)
133133+ if lookupErr != nil {
134134+ w.WriteHeader(http.StatusNotFound)
135135+ l.Error("repo not found on disk", "repoDid", repoDid, "err", lookupErr)
136136+ fmt.Fprintln(w, "repo not found")
137137+ return
138138+ }
139139+ rbacResource = repoDid
140140+ } else {
141141+ legacyPath, joinErr := securejoin.SecureJoin(h.c.Repo.ScanPath, filepath.Join(ownerDid, repoName))
142142+ if joinErr != nil {
143143+ w.WriteHeader(http.StatusNotFound)
144144+ fmt.Fprintln(w, "repo not found")
145145+ return
146146+ }
147147+ if _, statErr := os.Stat(legacyPath); statErr != nil {
148148+ w.WriteHeader(http.StatusNotFound)
149149+ l.Error("repo not found on disk (legacy)", "owner", ownerDid, "name", repoName)
150150+ fmt.Fprintln(w, "repo not found")
151151+ return
152152+ }
153153+ repoPath = legacyPath
154154+ rbacResource = ownerDid + "/" + repoName
132155 }
133133- repoPath, _, _, lookupErr := h.db.ResolveRepoDIDOnDisk(h.c.Repo.ScanPath, repoDid)
134134- if lookupErr != nil {
135135- w.WriteHeader(http.StatusNotFound)
136136- l.Error("repo not found on disk", "repoDid", repoDid, "err", lookupErr)
137137- fmt.Fprintln(w, "repo not found")
138138- return
139139- }
140140- rbacResource = repoDid
141156 rel, relErr := filepath.Rel(h.c.Repo.ScanPath, repoPath)
142157 if relErr != nil {
143158 w.WriteHeader(http.StatusInternalServerError)
+2-2
rbac/rbac.go
···3434)
35353636type Enforcer struct {
3737- E *casbin.Enforcer
3737+ E *casbin.SyncedEnforcer
3838}
39394040func NewEnforcer(path string) (*Enforcer, error) {
···5353 return nil, err
5454 }
55555656- e, err := casbin.NewEnforcer(m, a)
5656+ e, err := casbin.NewSyncedEnforcer(m, a)
5757 if err != nil {
5858 return nil, err
5959 }
+1-1
rbac/rbac_test.go
···2323 m, err := model.NewModelFromString(rbac.Model)
2424 assert.NoError(t, err)
25252626- e, err := casbin.NewEnforcer(m, a)
2626+ e, err := casbin.NewSyncedEnforcer(m, a)
2727 assert.NoError(t, err)
28282929 e.EnableAutoSave(false)