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  }