enhancement: introduce theme processing (#9133)

* enhancement: introduce theme processing

* enhancement: introduce theme processing

* enhancement: add theme processing tests and changelog

* Update services/web/pkg/config/config.go

Co-authored-by: Michael Barz <michael.barz@zeitgestalten.eu>

* fix: ci findings

* Apply suggestions from code review

Co-authored-by: Martin <github@diemattels.at>

* enhancement: use the theme assets from web instead of having them inside the oCis repo (license clash Apache vs. AGPLv3)

* fix: golangci tagalign order

* fix: rename UnifiedRoleUploader to UnifiedRoleEditorLite

* fix: some typos

Co-authored-by: Michael Barz <michael.barz@zeitgestalten.eu>

* enhancement: export supported theme logo upload filetypes

* chore: bump reva

* fix: allow init func

---------

Co-authored-by: Michael Barz <michael.barz@zeitgestalten.eu>
Co-authored-by: Martin <github@diemattels.at>
This commit is contained in:
Florian Schade
2024-05-29 15:48:49 +02:00
committed by GitHub
co-authored by Michael Barz Martin
parent 80480cb7fa
commit eb7c36443f
34 changed files with 2040 additions and 287 deletions
@@ -22,13 +22,13 @@ import (
"encoding/json"
"net/http"
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/data"
"github.com/cs3org/reva/v2/pkg/appctx"
"github.com/cs3org/reva/v2/pkg/owncloud/ocs"
)
func (s *svc) doStatus(w http.ResponseWriter, r *http.Request) {
log := appctx.GetLogger(r.Context())
status := &data.Status{
status := &ocs.Status{
Installed: true,
Maintenance: false,
NeedsDBUpgrade: false,
@@ -20,6 +20,7 @@ package config
import (
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/data"
"github.com/cs3org/reva/v2/pkg/owncloud/ocs"
"github.com/cs3org/reva/v2/pkg/sharedconf"
"github.com/cs3org/reva/v2/pkg/storage/cache"
)
@@ -28,7 +29,7 @@ import (
type Config struct {
Prefix string `mapstructure:"prefix"`
Config data.ConfigData `mapstructure:"config"`
Capabilities data.CapabilitiesData `mapstructure:"capabilities"`
Capabilities ocs.CapabilitiesData `mapstructure:"capabilities"`
GatewaySvc string `mapstructure:"gatewaysvc"`
StorageregistrySvc string `mapstructure:"storage_registry_svc"`
DefaultUploadProtocol string `mapstructure:"default_upload_protocol"`
@@ -22,13 +22,13 @@ import (
"net/http"
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/config"
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/data"
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/response"
"github.com/cs3org/reva/v2/pkg/owncloud/ocs"
)
// Handler renders the capability endpoint
type Handler struct {
c data.CapabilitiesData
c ocs.CapabilitiesData
defaultUploadProtocol string
userAgentChunkingMap map[string]string
}
@@ -41,13 +41,13 @@ func (h *Handler) Init(c *config.Config) {
// capabilities
if h.c.Capabilities == nil {
h.c.Capabilities = &data.Capabilities{}
h.c.Capabilities = &ocs.Capabilities{}
}
// core
if h.c.Capabilities.Core == nil {
h.c.Capabilities.Core = &data.CapabilitiesCore{}
h.c.Capabilities.Core = &ocs.CapabilitiesCore{}
}
if h.c.Capabilities.Core.PollInterval == 0 {
h.c.Capabilities.Core.PollInterval = 60
@@ -58,7 +58,7 @@ func (h *Handler) Init(c *config.Config) {
// h.c.Capabilities.Core.SupportURLSigning is boolean
if h.c.Capabilities.Core.Status == nil {
h.c.Capabilities.Core.Status = &data.Status{}
h.c.Capabilities.Core.Status = &ocs.Status{}
}
// h.c.Capabilities.Core.Status.Installed is boolean
// h.c.Capabilities.Core.Status.Maintenance is boolean
@@ -85,7 +85,7 @@ func (h *Handler) Init(c *config.Config) {
// checksums
if h.c.Capabilities.Checksums == nil {
h.c.Capabilities.Checksums = &data.CapabilitiesChecksums{}
h.c.Capabilities.Checksums = &ocs.CapabilitiesChecksums{}
}
if h.c.Capabilities.Checksums.SupportedTypes == nil {
h.c.Capabilities.Checksums.SupportedTypes = []string{"SHA256"}
@@ -97,7 +97,7 @@ func (h *Handler) Init(c *config.Config) {
// files
if h.c.Capabilities.Files == nil {
h.c.Capabilities.Files = &data.CapabilitiesFiles{}
h.c.Capabilities.Files = &ocs.CapabilitiesFiles{}
}
if h.c.Capabilities.Files.BlacklistedFiles == nil {
@@ -108,17 +108,17 @@ func (h *Handler) Init(c *config.Config) {
// h.c.Capabilities.Files.Favorites is boolean
if h.c.Capabilities.Files.Archivers == nil {
h.c.Capabilities.Files.Archivers = []*data.CapabilitiesArchiver{}
h.c.Capabilities.Files.Archivers = []*ocs.CapabilitiesArchiver{}
}
if h.c.Capabilities.Files.AppProviders == nil {
h.c.Capabilities.Files.AppProviders = []*data.CapabilitiesAppProvider{}
h.c.Capabilities.Files.AppProviders = []*ocs.CapabilitiesAppProvider{}
}
// dav
if h.c.Capabilities.Dav == nil {
h.c.Capabilities.Dav = &data.CapabilitiesDav{}
h.c.Capabilities.Dav = &ocs.CapabilitiesDav{}
}
if h.c.Capabilities.Dav.Trashbin == "" {
h.c.Capabilities.Dav.Trashbin = "1.0"
@@ -130,24 +130,24 @@ func (h *Handler) Init(c *config.Config) {
// sharing
if h.c.Capabilities.FilesSharing == nil {
h.c.Capabilities.FilesSharing = &data.CapabilitiesFilesSharing{}
h.c.Capabilities.FilesSharing = &ocs.CapabilitiesFilesSharing{}
}
// h.c.Capabilities.FilesSharing.APIEnabled is boolean
if h.c.Capabilities.FilesSharing.Public == nil {
h.c.Capabilities.FilesSharing.Public = &data.CapabilitiesFilesSharingPublic{}
h.c.Capabilities.FilesSharing.Public = &ocs.CapabilitiesFilesSharingPublic{}
}
// h.c.Capabilities.FilesSharing.IsPublic.Enabled is boolean
h.c.Capabilities.FilesSharing.Public.Enabled = true
if h.c.Capabilities.FilesSharing.Public.Password == nil {
h.c.Capabilities.FilesSharing.Public.Password = &data.CapabilitiesFilesSharingPublicPassword{}
h.c.Capabilities.FilesSharing.Public.Password = &ocs.CapabilitiesFilesSharingPublicPassword{}
}
if h.c.Capabilities.FilesSharing.Public.Password.EnforcedFor == nil {
h.c.Capabilities.FilesSharing.Public.Password.EnforcedFor = &data.CapabilitiesFilesSharingPublicPasswordEnforcedFor{}
h.c.Capabilities.FilesSharing.Public.Password.EnforcedFor = &ocs.CapabilitiesFilesSharingPublicPasswordEnforcedFor{}
}
// h.c.Capabilities.FilesSharing.IsPublic.Password.EnforcedFor.ReadOnly is boolean
@@ -158,7 +158,7 @@ func (h *Handler) Init(c *config.Config) {
// h.c.Capabilities.FilesSharing.IsPublic.Password.Enforced is boolean
if h.c.Capabilities.FilesSharing.Public.ExpireDate == nil {
h.c.Capabilities.FilesSharing.Public.ExpireDate = &data.CapabilitiesFilesSharingPublicExpireDate{}
h.c.Capabilities.FilesSharing.Public.ExpireDate = &ocs.CapabilitiesFilesSharingPublicExpireDate{}
}
// h.c.Capabilities.FilesSharing.IsPublic.ExpireDate.Enabled is boolean
@@ -169,7 +169,7 @@ func (h *Handler) Init(c *config.Config) {
// h.c.Capabilities.FilesSharing.IsPublic.SupportsUploadOnly is boolean
if h.c.Capabilities.FilesSharing.User == nil {
h.c.Capabilities.FilesSharing.User = &data.CapabilitiesFilesSharingUser{}
h.c.Capabilities.FilesSharing.User = &ocs.CapabilitiesFilesSharingUser{}
}
// h.c.Capabilities.FilesSharing.User.SendMail is boolean
@@ -182,7 +182,7 @@ func (h *Handler) Init(c *config.Config) {
// h.c.Capabilities.FilesSharing.ShareWithMembershipGroupsOnly is boolean
if h.c.Capabilities.FilesSharing.UserEnumeration == nil {
h.c.Capabilities.FilesSharing.UserEnumeration = &data.CapabilitiesFilesSharingUserEnumeration{}
h.c.Capabilities.FilesSharing.UserEnumeration = &ocs.CapabilitiesFilesSharingUserEnumeration{}
}
// h.c.Capabilities.FilesSharing.UserEnumeration.Enabled is boolean
@@ -192,7 +192,7 @@ func (h *Handler) Init(c *config.Config) {
h.c.Capabilities.FilesSharing.DefaultPermissions = 31
}
if h.c.Capabilities.FilesSharing.Federation == nil {
h.c.Capabilities.FilesSharing.Federation = &data.CapabilitiesFilesSharingFederation{}
h.c.Capabilities.FilesSharing.Federation = &ocs.CapabilitiesFilesSharingFederation{}
}
// h.c.Capabilities.FilesSharing.Federation.Outgoing is boolean
@@ -205,7 +205,7 @@ func (h *Handler) Init(c *config.Config) {
// notifications
// if h.c.Capabilities.Notifications == nil {
// h.c.Capabilities.Notifications = &data.CapabilitiesNotifications{}
// h.c.Capabilities.Notifications = &ocs.CapabilitiesNotifications{}
// }
// if h.c.Capabilities.Notifications.Endpoints == nil {
// h.c.Capabilities.Notifications.Endpoints = []string{"list", "get", "delete"}
@@ -214,7 +214,7 @@ func (h *Handler) Init(c *config.Config) {
// version
if h.c.Version == nil {
h.c.Version = &data.Version{
h.c.Version = &ocs.Version{
// TODO get from build env
Major: 10,
Minor: 0,
@@ -21,7 +21,7 @@ package capabilities
import (
"strings"
"github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/data"
"github.com/cs3org/reva/v2/pkg/owncloud/ocs"
)
type chunkProtocol string
@@ -32,7 +32,7 @@ var (
chunkTUS chunkProtocol = "tus"
)
func (h *Handler) getCapabilitiesForUserAgent(userAgent string) data.CapabilitiesData {
func (h *Handler) getCapabilitiesForUserAgent(userAgent string) ocs.CapabilitiesData {
if userAgent != "" {
for k, v := range h.userAgentChunkingMap {
// we could also use a regexp for pattern matching
@@ -47,7 +47,7 @@ func (h *Handler) getCapabilitiesForUserAgent(userAgent string) data.Capabilitie
return h.c
}
func setCapabilitiesForChunkProtocol(cp chunkProtocol, c *data.CapabilitiesData) {
func setCapabilitiesForChunkProtocol(cp chunkProtocol, c *ocs.CapabilitiesData) {
switch cp {
case chunkV1:
// 2.7+ will use Chunking V1 if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" is not there
@@ -16,7 +16,7 @@
// granted to it by virtue of its status as an Intergovernmental Organization
// or submit itself to any jurisdiction.
package data
package ocs
import (
"encoding/xml"
@@ -42,7 +42,7 @@ func (c ocsBool) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
return e.EncodeElement("0", start)
}
// CapabilitiesData TODO document
// CapabilitiesData holds the capabilities data
type CapabilitiesData struct {
Capabilities *Capabilities `json:"capabilities" xml:"capabilities"`
Version *Version `json:"version" xml:"version"`
@@ -59,6 +59,7 @@ type Capabilities struct {
Graph *CapabilitiesGraph `json:"graph,omitempty" xml:"graph,omitempty" mapstructure:"graph"`
PasswordPolicy *CapabilitiesPasswordPolicy `json:"password_policy,omitempty" xml:"password_policy,omitempty" mapstructure:"password_policy"`
Search *CapabilitiesSearch `json:"search,omitempty" xml:"search,omitempty" mapstructure:"search"`
Theme *CapabilitiesTheme `json:"theme,omitempty" xml:"theme,omitempty" mapstructure:"theme"`
Notifications *CapabilitiesNotifications `json:"notifications,omitempty" xml:"notifications,omitempty"`
}
@@ -290,6 +291,17 @@ type CapabilitiesNotifications struct {
Endpoints []string `json:"ocs-endpoints,omitempty" xml:"ocs-endpoints>element,omitempty" mapstructure:"endpoints"`
}
// CapabilitiesTheme holds theming capabilities
type CapabilitiesTheme struct {
Logo *CapabilitiesThemeLogo `json:"logo" xml:"logo" mapstructure:"logo"`
}
// CapabilitiesThemeLogo holds theming logo capabilities
type CapabilitiesThemeLogo struct {
// xml marshal, unmarshal does not support map[string]string, needs a custom type with MarshalXML and UnmarshalXML implementations
PermittedFileTypes map[string]string `json:"permitted_file_types" xml:"-" mapstructure:"permitted_file_types"`
}
// Version holds version information
type Version struct {
Major int `json:"major" xml:"major"`