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 }