github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/web/settings/capabilities.go (about) 1 package settings 2 3 import ( 4 "net/http" 5 6 "github.com/cozy/cozy-stack/model/instance" 7 "github.com/cozy/cozy-stack/pkg/config/config" 8 "github.com/cozy/cozy-stack/pkg/consts" 9 "github.com/cozy/cozy-stack/pkg/couchdb" 10 "github.com/cozy/cozy-stack/pkg/jsonapi" 11 "github.com/cozy/cozy-stack/web/middlewares" 12 "github.com/labstack/echo/v4" 13 ) 14 15 type apiCapabilities struct { 16 DocID string `json:"_id,omitempty"` 17 FileVersioning bool `json:"file_versioning"` 18 FlatSubdomains bool `json:"flat_subdomains"` 19 PasswordAuth bool `json:"can_auth_with_password"` 20 MagicLinkAuth bool `json:"can_auth_with_magic_links"` 21 OIDCAuth bool `json:"can_auth_with_oidc"` 22 } 23 24 func (c *apiCapabilities) ID() string { return c.DocID } 25 func (c *apiCapabilities) Rev() string { return "" } 26 func (c *apiCapabilities) DocType() string { return consts.Settings } 27 func (c *apiCapabilities) Clone() couchdb.Doc { cloned := *c; return &cloned } 28 func (c *apiCapabilities) SetID(id string) { c.DocID = id } 29 func (c *apiCapabilities) SetRev(rev string) {} 30 func (c *apiCapabilities) Relationships() jsonapi.RelationshipMap { return nil } 31 func (c *apiCapabilities) Included() []jsonapi.Object { return nil } 32 func (c *apiCapabilities) Links() *jsonapi.LinksList { 33 return &jsonapi.LinksList{Self: "/settings/capabilities"} 34 } 35 func (c *apiCapabilities) Fetch(field string) []string { return nil } 36 37 // NewCapabilities return a document with capabilities that can be marshaled to 38 // JSON or JSON-API. 39 func NewCapabilities(inst *instance.Instance) jsonapi.Object { 40 // File versioning is enabled for all instances, except for the Swift 41 // layout v1 and v2 42 versioning := true 43 switch config.FsURL().Scheme { 44 case config.SchemeSwift, config.SchemeSwiftSecure: 45 versioning = inst.SwiftLayout >= 2 46 } 47 flat := config.GetConfig().Subdomains == config.FlatSubdomains 48 49 magicLink := inst.MagicLink 50 password := !inst.HasForcedOIDC() && !magicLink 51 _, oidc := config.GetOIDC(inst.ContextName) 52 if inst.FranceConnectID != "" { 53 oidc = true 54 } 55 56 return &apiCapabilities{ 57 DocID: consts.CapabilitiesSettingsID, 58 FileVersioning: versioning, 59 FlatSubdomains: flat, 60 PasswordAuth: password, 61 MagicLinkAuth: magicLink, 62 OIDCAuth: oidc, 63 } 64 } 65 66 func (h *HTTPHandler) getCapabilities(c echo.Context) error { 67 // Any request with a token can ask for the capabilities (no permissions 68 // are required) 69 if _, err := middlewares.GetPermission(c); err != nil { 70 return err 71 } 72 inst := middlewares.GetInstance(c) 73 doc := NewCapabilities(inst) 74 return jsonapi.Data(c, http.StatusOK, doc, nil) 75 }