github.com/cs3org/reva/v2@v2.27.7/pkg/owncloud/ocs/capabilities.go (about)

     1  // Copyright 2018-2021 CERN
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  // In applying this license, CERN does not waive the privileges and immunities
    16  // granted to it by virtue of its status as an Intergovernmental Organization
    17  // or submit itself to any jurisdiction.
    18  
    19  package ocs
    20  
    21  import (
    22  	"encoding/xml"
    23  )
    24  
    25  // ocsBool implements the xml/json Marshaler interface. The OCS API inconsistency require us to parse boolean values
    26  // as native booleans for json requests but "truthy" 0/1 values for xml requests.
    27  type ocsBool bool
    28  
    29  func (c *ocsBool) MarshalJSON() ([]byte, error) {
    30  	if *c {
    31  		return []byte("true"), nil
    32  	}
    33  
    34  	return []byte("false"), nil
    35  }
    36  
    37  func (c ocsBool) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    38  	if c {
    39  		return e.EncodeElement("1", start)
    40  	}
    41  
    42  	return e.EncodeElement("0", start)
    43  }
    44  
    45  // CapabilitiesData holds the capabilities data
    46  type CapabilitiesData struct {
    47  	Capabilities *Capabilities `json:"capabilities" xml:"capabilities"`
    48  	Version      *Version      `json:"version" xml:"version"`
    49  }
    50  
    51  // Capabilities groups several capability aspects
    52  type Capabilities struct {
    53  	Core           *CapabilitiesCore           `json:"core" xml:"core"`
    54  	Checksums      *CapabilitiesChecksums      `json:"checksums" xml:"checksums"`
    55  	Files          *CapabilitiesFiles          `json:"files" xml:"files" mapstructure:"files"`
    56  	Dav            *CapabilitiesDav            `json:"dav" xml:"dav"`
    57  	FilesSharing   *CapabilitiesFilesSharing   `json:"files_sharing" xml:"files_sharing" mapstructure:"files_sharing"`
    58  	Spaces         *Spaces                     `json:"spaces,omitempty" xml:"spaces,omitempty" mapstructure:"spaces"`
    59  	Graph          *CapabilitiesGraph          `json:"graph,omitempty" xml:"graph,omitempty" mapstructure:"graph"`
    60  	PasswordPolicy *CapabilitiesPasswordPolicy `json:"password_policy,omitempty" xml:"password_policy,omitempty" mapstructure:"password_policy"`
    61  	Search         *CapabilitiesSearch         `json:"search,omitempty" xml:"search,omitempty" mapstructure:"search"`
    62  	Theme          *CapabilitiesTheme          `json:"theme,omitempty" xml:"theme,omitempty" mapstructure:"theme"`
    63  	Notifications  *CapabilitiesNotifications  `json:"notifications,omitempty" xml:"notifications,omitempty"`
    64  }
    65  
    66  // CapabilitiesSearch holds the search capabilities
    67  type CapabilitiesSearch struct {
    68  	Property *CapabilitiesSearchProperties `json:"property" xml:"property" mapstructure:"property"`
    69  }
    70  
    71  // CapabilitiesSearchProperties holds the search property capabilities
    72  type CapabilitiesSearchProperties struct {
    73  	Name      *CapabilitiesSearchProperty         `json:"name" xml:"name" mapstructure:"name"`
    74  	Mtime     *CapabilitiesSearchPropertyExtended `json:"mtime" xml:"mtime" mapstructure:"mtime"`
    75  	Size      *CapabilitiesSearchProperty         `json:"size" xml:"size" mapstructure:"size"`
    76  	MediaType *CapabilitiesSearchPropertyExtended `json:"mediatype" xml:"mediatype" mapstructure:"mediatype"`
    77  	Type      *CapabilitiesSearchProperty         `json:"type" xml:"type" mapstructure:"type"`
    78  	Tag       *CapabilitiesSearchProperty         `json:"tag" xml:"tag" mapstructure:"tag"`
    79  	Tags      *CapabilitiesSearchProperty         `json:"tags" xml:"tags" mapstructure:"tags"`
    80  	Content   *CapabilitiesSearchProperty         `json:"content" xml:"content" mapstructure:"content"`
    81  	Scope     *CapabilitiesSearchProperty         `json:"scope" xml:"scope" mapstructure:"scope"`
    82  }
    83  
    84  // CapabilitiesSearchProperty represents the default search property
    85  type CapabilitiesSearchProperty struct {
    86  	Enabled ocsBool `json:"enabled" xml:"enabled" mapstructure:"enabled"`
    87  }
    88  
    89  // CapabilitiesSearchPropertyExtended represents the extended search property
    90  type CapabilitiesSearchPropertyExtended struct {
    91  	CapabilitiesSearchProperty `mapstructure:",squash"`
    92  	Keywords                   []string `json:"keywords,omitempty" xml:"keywords,omitempty" mapstructure:"keywords"`
    93  }
    94  
    95  // Spaces lets a service configure its advertised options related to Storage Spaces.
    96  type Spaces struct {
    97  	Version   string `json:"version" xml:"version" mapstructure:"version"`
    98  	Enabled   bool   `json:"enabled" xml:"enabled" mapstructure:"enabled"`
    99  	Projects  bool   `json:"projects" xml:"projects" mapstructure:"projects"`
   100  	ShareJail bool   `json:"share_jail" xml:"share_jail" mapstructure:"share_jail"`
   101  	MaxQuota  uint64 `json:"max_quota" xml:"max_quota" mapstructure:"max_quota"`
   102  }
   103  
   104  // CapabilitiesCore holds webdav config
   105  type CapabilitiesCore struct {
   106  	PollInterval      int     `json:"pollinterval" xml:"pollinterval" mapstructure:"poll_interval"`
   107  	WebdavRoot        string  `json:"webdav-root,omitempty" xml:"webdav-root,omitempty" mapstructure:"webdav_root"`
   108  	Status            *Status `json:"status" xml:"status"`
   109  	SupportURLSigning ocsBool `json:"support-url-signing" xml:"support-url-signing" mapstructure:"support_url_signing"`
   110  	SupportSSE        ocsBool `json:"support-sse" xml:"support-sse" mapstructure:"support_sse"`
   111  }
   112  
   113  // CapabilitiesGraph holds the graph capabilities
   114  type CapabilitiesGraph struct {
   115  	PersonalDataExport ocsBool                `json:"personal-data-export" xml:"personal-data-export" mapstructure:"personal_data_export"`
   116  	Users              CapabilitiesGraphUsers `json:"users" xml:"users" mapstructure:"users"`
   117  }
   118  
   119  // CapabilitiesPasswordPolicy hold the password policy capabilities
   120  type CapabilitiesPasswordPolicy struct {
   121  	MinCharacters          int                 `json:"min_characters" xml:"min_characters" mapstructure:"min_characters"`
   122  	MaxCharacters          int                 `json:"max_characters" xml:"max_characters" mapstructure:"max_characters"`
   123  	MinLowerCaseCharacters int                 `json:"min_lowercase_characters" xml:"min_lowercase_characters" mapstructure:"min_lowercase_characters"`
   124  	MinUpperCaseCharacters int                 `json:"min_uppercase_characters" xml:"min_uppercase_characters" mapstructure:"min_uppercase_characters"`
   125  	MinDigits              int                 `json:"min_digits" xml:"min_digits" mapstructure:"min_digits"`
   126  	MinSpecialCharacters   int                 `json:"min_special_characters" xml:"min_special_characters" mapstructure:"min_special_characters"`
   127  	BannedPasswordsList    map[string]struct{} `json:"-" xml:"-" mapstructure:"banned_passwords_list"`
   128  }
   129  
   130  // CapabilitiesGraphUsers holds the graph user capabilities
   131  type CapabilitiesGraphUsers struct {
   132  	ReadOnlyAttributes         []string `json:"read_only_attributes" xml:"read_only_attributes" mapstructure:"read_only_attributes"`
   133  	CreateDisabled             ocsBool  `json:"create_disabled" xml:"create_disabled" mapstructure:"create_disabled"`
   134  	DeleteDisabled             ocsBool  `json:"delete_disabled" xml:"delete_disabled" mapstructure:"delete_disabled"`
   135  	ChangePasswordSelfDisabled ocsBool  `json:"change_password_self_disabled" xml:"change_password_self_disabled" mapstructure:"change_password_self_disabled"`
   136  }
   137  
   138  // Status holds basic status information
   139  type Status struct {
   140  	Installed      ocsBool `json:"installed" xml:"installed"`
   141  	Maintenance    ocsBool `json:"maintenance" xml:"maintenance"`
   142  	NeedsDBUpgrade ocsBool `json:"needsDbUpgrade" xml:"needsDbUpgrade"`
   143  	Version        string  `json:"version" xml:"version"`
   144  	VersionString  string  `json:"versionstring" xml:"versionstring"`
   145  	Edition        string  `json:"edition" xml:"edition"`
   146  	ProductName    string  `json:"productname" xml:"productname"`
   147  	Product        string  `json:"product" xml:"product"`
   148  	ProductVersion string  `json:"productversion" xml:"productversion"`
   149  	Hostname       string  `json:"hostname,omitempty" xml:"hostname,omitempty"`
   150  }
   151  
   152  // CapabilitiesChecksums holds available hashes
   153  type CapabilitiesChecksums struct {
   154  	SupportedTypes      []string `json:"supportedTypes" xml:"supportedTypes>element" mapstructure:"supported_types"`
   155  	PreferredUploadType string   `json:"preferredUploadType" xml:"preferredUploadType" mapstructure:"preferred_upload_type"`
   156  }
   157  
   158  // CapabilitiesFilesTusSupport TODO this must be a summary of storages
   159  type CapabilitiesFilesTusSupport struct {
   160  	Version            string `json:"version" xml:"version"`
   161  	Resumable          string `json:"resumable" xml:"resumable"`
   162  	Extension          string `json:"extension" xml:"extension"`
   163  	MaxChunkSize       int    `json:"max_chunk_size" xml:"max_chunk_size" mapstructure:"max_chunk_size"`
   164  	HTTPMethodOverride string `json:"http_method_override" xml:"http_method_override" mapstructure:"http_method_override"`
   165  }
   166  
   167  // CapabilitiesArchiver holds available archivers information
   168  type CapabilitiesArchiver struct {
   169  	Enabled     bool     `json:"enabled" xml:"enabled" mapstructure:"enabled"`
   170  	Version     string   `json:"version" xml:"version" mapstructure:"version"`
   171  	Formats     []string `json:"formats" xml:"formats" mapstructure:"formats"`
   172  	ArchiverURL string   `json:"archiver_url" xml:"archiver_url" mapstructure:"archiver_url"`
   173  	MaxNumFiles string   `json:"max_num_files" xml:"max_num_files" mapstructure:"max_num_files"`
   174  	MaxSize     string   `json:"max_size" xml:"max_size" mapstructure:"max_size"`
   175  }
   176  
   177  // CapabilitiesAppProvider holds available app provider information
   178  type CapabilitiesAppProvider struct {
   179  	Enabled    bool   `json:"enabled" xml:"enabled" mapstructure:"enabled"`
   180  	Version    string `json:"version" xml:"version" mapstructure:"version"`
   181  	AppsURL    string `json:"apps_url" xml:"apps_url" mapstructure:"apps_url"`
   182  	OpenURL    string `json:"open_url" xml:"open_url" mapstructure:"open_url"`
   183  	OpenWebURL string `json:"open_web_url" xml:"open_web_url" mapstructure:"open_web_url"`
   184  	NewURL     string `json:"new_url" xml:"new_url" mapstructure:"new_url"`
   185  }
   186  
   187  // CapabilitiesFiles TODO this is storage specific, not global. What effect do these options have on the clients?
   188  type CapabilitiesFiles struct {
   189  	PrivateLinks     ocsBool                      `json:"privateLinks" xml:"privateLinks" mapstructure:"private_links"`
   190  	BigFileChunking  ocsBool                      `json:"bigfilechunking" xml:"bigfilechunking"`
   191  	Undelete         ocsBool                      `json:"undelete" xml:"undelete"`
   192  	Versioning       ocsBool                      `json:"versioning" xml:"versioning"`
   193  	Favorites        ocsBool                      `json:"favorites" xml:"favorites"`
   194  	FullTextSearch   ocsBool                      `json:"full_text_search" xml:"full_text_search" mapstructure:"full_text_search"`
   195  	Tags             ocsBool                      `json:"tags" xml:"tags"`
   196  	BlacklistedFiles []string                     `json:"blacklisted_files" xml:"blacklisted_files>element" mapstructure:"blacklisted_files"`
   197  	TusSupport       *CapabilitiesFilesTusSupport `json:"tus_support" xml:"tus_support" mapstructure:"tus_support"`
   198  	Archivers        []*CapabilitiesArchiver      `json:"archivers" xml:"archivers" mapstructure:"archivers"`
   199  	AppProviders     []*CapabilitiesAppProvider   `json:"app_providers" xml:"app_providers" mapstructure:"app_providers"`
   200  }
   201  
   202  // CapabilitiesDav holds dav endpoint config
   203  type CapabilitiesDav struct {
   204  	Chunking                       string   `json:"chunking" xml:"chunking"`
   205  	Trashbin                       string   `json:"trashbin" xml:"trashbin"`
   206  	Reports                        []string `json:"reports" xml:"reports>element" mapstructure:"reports"`
   207  	ChunkingParallelUploadDisabled bool     `json:"chunkingParallelUploadDisabled" xml:"chunkingParallelUploadDisabled"`
   208  }
   209  
   210  // CapabilitiesFilesSharing TODO document
   211  type CapabilitiesFilesSharing struct {
   212  	APIEnabled                    ocsBool                                  `json:"api_enabled" xml:"api_enabled" mapstructure:"api_enabled"`
   213  	GroupSharing                  ocsBool                                  `json:"group_sharing" xml:"group_sharing" mapstructure:"group_sharing"`
   214  	SharingRoles                  ocsBool                                  `json:"sharing_roles" xml:"sharing_roles" mapstructure:"sharing_roles"`
   215  	DenyAccess                    ocsBool                                  `json:"deny_access" xml:"deny_access" mapstructure:"deny_access"`
   216  	AutoAcceptShare               ocsBool                                  `json:"auto_accept_share" xml:"auto_accept_share" mapstructure:"auto_accept_share"`
   217  	ShareWithGroupMembersOnly     ocsBool                                  `json:"share_with_group_members_only" xml:"share_with_group_members_only" mapstructure:"share_with_group_members_only"`
   218  	ShareWithMembershipGroupsOnly ocsBool                                  `json:"share_with_membership_groups_only" xml:"share_with_membership_groups_only" mapstructure:"share_with_membership_groups_only"`
   219  	SearchMinLength               int                                      `json:"search_min_length" xml:"search_min_length" mapstructure:"search_min_length"`
   220  	DefaultPermissions            int                                      `json:"default_permissions" xml:"default_permissions" mapstructure:"default_permissions"`
   221  	UserEnumeration               *CapabilitiesFilesSharingUserEnumeration `json:"user_enumeration" xml:"user_enumeration" mapstructure:"user_enumeration"`
   222  	Federation                    *CapabilitiesFilesSharingFederation      `json:"federation" xml:"federation"`
   223  	Public                        *CapabilitiesFilesSharingPublic          `json:"public" xml:"public"`
   224  	User                          *CapabilitiesFilesSharingUser            `json:"user" xml:"user"`
   225  	// TODO: Remove next line once web defaults to resharing=false
   226  	Resharing ocsBool `json:"resharing" xml:"resharing"`
   227  }
   228  
   229  // CapabilitiesFilesSharingPublic TODO document
   230  type CapabilitiesFilesSharingPublic struct {
   231  	Enabled            ocsBool                                   `json:"enabled" xml:"enabled"`
   232  	SendMail           ocsBool                                   `json:"send_mail" xml:"send_mail" mapstructure:"send_mail"`
   233  	SocialShare        ocsBool                                   `json:"social_share" xml:"social_share" mapstructure:"social_share"`
   234  	Upload             ocsBool                                   `json:"upload" xml:"upload"`
   235  	Multiple           ocsBool                                   `json:"multiple" xml:"multiple"`
   236  	SupportsUploadOnly ocsBool                                   `json:"supports_upload_only" xml:"supports_upload_only" mapstructure:"supports_upload_only"`
   237  	Password           *CapabilitiesFilesSharingPublicPassword   `json:"password" xml:"password"`
   238  	ExpireDate         *CapabilitiesFilesSharingPublicExpireDate `json:"expire_date" xml:"expire_date" mapstructure:"expire_date"`
   239  	CanEdit            ocsBool                                   `json:"can_edit" xml:"can_edit" mapstructure:"can_edit"`
   240  	Alias              ocsBool                                   `json:"alias" xml:"alias"`
   241  	DefaultPermissions int                                       `json:"default_permissions" xml:"default_permissions" mapstructure:"default_permissions"`
   242  }
   243  
   244  // CapabilitiesFilesSharingPublicPassword TODO document
   245  type CapabilitiesFilesSharingPublicPassword struct {
   246  	EnforcedFor *CapabilitiesFilesSharingPublicPasswordEnforcedFor `json:"enforced_for" xml:"enforced_for" mapstructure:"enforced_for"`
   247  	Enforced    ocsBool                                            `json:"enforced" xml:"enforced"`
   248  }
   249  
   250  // CapabilitiesFilesSharingPublicPasswordEnforcedFor TODO document
   251  type CapabilitiesFilesSharingPublicPasswordEnforcedFor struct {
   252  	ReadOnly        ocsBool `json:"read_only" xml:"read_only,omitempty" mapstructure:"read_only"`
   253  	ReadWrite       ocsBool `json:"read_write" xml:"read_write,omitempty" mapstructure:"read_write"`
   254  	ReadWriteDelete ocsBool `json:"read_write_delete" xml:"read_write_delete,omitempty" mapstructure:"read_write_delete"`
   255  	UploadOnly      ocsBool `json:"upload_only" xml:"upload_only,omitempty" mapstructure:"upload_only"`
   256  }
   257  
   258  // CapabilitiesFilesSharingPublicExpireDate TODO document
   259  type CapabilitiesFilesSharingPublicExpireDate struct {
   260  	Enabled ocsBool `json:"enabled" xml:"enabled"`
   261  }
   262  
   263  // CapabilitiesFilesSharingUser TODO document
   264  type CapabilitiesFilesSharingUser struct {
   265  	SendMail       ocsBool                                   `json:"send_mail" xml:"send_mail" mapstructure:"send_mail"`
   266  	ProfilePicture ocsBool                                   `json:"profile_picture" xml:"profile_picture" mapstructure:"profile_picture"`
   267  	Settings       []*CapabilitiesUserSettings               `json:"settings" xml:"settings" mapstructure:"settings"`
   268  	ExpireDate     *CapabilitiesFilesSharingPublicExpireDate `json:"expire_date" xml:"expire_date" mapstructure:"expire_date"`
   269  }
   270  
   271  // CapabilitiesUserSettings holds available user settings service information
   272  type CapabilitiesUserSettings struct {
   273  	Enabled bool   `json:"enabled" xml:"enabled" mapstructure:"enabled"`
   274  	Version string `json:"version" xml:"version" mapstructure:"version"`
   275  }
   276  
   277  // CapabilitiesFilesSharingUserEnumeration TODO document
   278  type CapabilitiesFilesSharingUserEnumeration struct {
   279  	Enabled          ocsBool `json:"enabled" xml:"enabled"`
   280  	GroupMembersOnly ocsBool `json:"group_members_only" xml:"group_members_only" mapstructure:"group_members_only"`
   281  }
   282  
   283  // CapabilitiesFilesSharingFederation holds outgoing and incoming flags
   284  type CapabilitiesFilesSharingFederation struct {
   285  	Outgoing ocsBool `json:"outgoing" xml:"outgoing"`
   286  	Incoming ocsBool `json:"incoming" xml:"incoming"`
   287  }
   288  
   289  // CapabilitiesNotifications holds a list of notification endpoints
   290  type CapabilitiesNotifications struct {
   291  	Endpoints    []string `json:"ocs-endpoints,omitempty" xml:"ocs-endpoints>element,omitempty" mapstructure:"endpoints"`
   292  	Configurable bool     `json:"configurable" xml:"configurable,omitempty" mapstructure:"configurable"`
   293  }
   294  
   295  // CapabilitiesTheme holds theming capabilities
   296  type CapabilitiesTheme struct {
   297  	Logo *CapabilitiesThemeLogo `json:"logo" xml:"logo" mapstructure:"logo"`
   298  }
   299  
   300  // CapabilitiesThemeLogo holds theming logo capabilities
   301  type CapabilitiesThemeLogo struct {
   302  	// xml marshal, unmarshal does not support map[string]string, needs a custom type with MarshalXML and UnmarshalXML implementations
   303  	PermittedFileTypes map[string]string `json:"permitted_file_types" xml:"-" mapstructure:"permitted_file_types"`
   304  }
   305  
   306  // Version holds version information
   307  type Version struct {
   308  	Major          int    `json:"major" xml:"major"`
   309  	Minor          int    `json:"minor" xml:"minor"`
   310  	Micro          int    `json:"micro" xml:"micro"` // = patch level
   311  	String         string `json:"string" xml:"string"`
   312  	Edition        string `json:"edition" xml:"edition"`
   313  	Product        string `json:"product" xml:"product"`
   314  	ProductVersion string `json:"productversion" xml:"productversion"`
   315  }