package cabana import ( "fmt" "regexp" "strings" "git.golem15.com/golem15/summercms/modules/backpack" ) // DefaultAdminPrefix is the admin mount path when backend.uri is unset. // It matches WinterCMS's backendUri default. const DefaultAdminPrefix = "/backend" // AdminCookieName carries the admin JWT for the embedded SPA (D-19). const AdminCookieName = "summer_admin" // adminAPIVersion is appended to the prefix for every admin API route. const adminAPIVersion = "/api/v1" var adminPrefixPattern = regexp.MustCompile(`^(/[a-z0-9][a-z0-9_-]*)+$`) // AdminPrefix reads backend.uri and returns the normalized admin mount path. // Spaces are trimmed, a leading slash is added and trailing slashes are // removed; an empty value falls back to DefaultAdminPrefix. Every segment // must be lowercase letters, digits, '-' or '_' and start with a letter or // digit, so "/" alone, uppercase, spaces and dot segments are rejected. func AdminPrefix(app *backpack.App) (string, error) { raw := "" if app != nil && app.Config != nil { raw = app.Config.String("backend.uri") } return normalizeAdminPrefix(raw) } func normalizeAdminPrefix(raw string) (string, error) { value := strings.TrimSpace(raw) if value == "" { return DefaultAdminPrefix, nil } if !strings.HasPrefix(value, "/") { value = "/" + value } value = strings.TrimRight(value, "/") if value == "" || !adminPrefixPattern.MatchString(value) { return "", fmt.Errorf("cabana: backend.uri %q is invalid: use one or more lowercase path segments such as /backend (set SUMMER_BACKEND__URI)", raw) } return value, nil }