diff --git a/go.mod b/go.mod index 6702712b71..6ce77d0fa7 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/coreos/go-oidc v2.2.1+incompatible github.com/coreos/go-oidc/v3 v3.6.0 github.com/cs3org/go-cs3apis v0.0.0-20230516150832-730ac860c71d - github.com/cs3org/reva/v2 v2.15.1-0.20230731132956-0fb5212d0551 + github.com/cs3org/reva/v2 v2.15.1-0.20230809113840-3ceaf17cf7fb github.com/disintegration/imaging v1.6.2 github.com/dutchcoders/go-clamd v0.0.0-20170520113014-b970184f4d9e github.com/egirna/icap-client v0.1.1 @@ -160,7 +160,6 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/crewjam/saml v0.4.13 // indirect - github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect diff --git a/go.sum b/go.sum index b42855254b..12343ffaad 100644 --- a/go.sum +++ b/go.sum @@ -864,10 +864,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.13 h1:TYHggH/hwP7eArqiXSJUvtOPNzQDyQ7vwmwEqlFWhMc= github.com/crewjam/saml v0.4.13/go.mod h1:igEejV+fihTIlHXYP8zOec3V5A8y3lws5bQBFsTm4gA= -github.com/cs3org/reva/v2 v2.15.1-0.20230731132956-0fb5212d0551 h1:8/cX/Fjo0SWzuHH+7SUK2w9t/9yR449woDR2wTzNW7k= -github.com/cs3org/reva/v2 v2.15.1-0.20230731132956-0fb5212d0551/go.mod h1:4UKDbqt/GHQDdNr2fv4XQVlnz6KC9DQdpV2P2fY2Mkg= -github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI= -github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY= +github.com/cs3org/reva/v2 v2.15.1-0.20230809113840-3ceaf17cf7fb h1:ObjTDMACxkuV7pxK8zGwhqqka2ze4KI8zcNF4H6k4Yk= +github.com/cs3org/reva/v2 v2.15.1-0.20230809113840-3ceaf17cf7fb/go.mod h1:F5wAUTPMvq+ze77PU/xl7qhc21YsEIfcl2RuI4H7yJo= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/tests/acceptance/expected-failures-API-on-OCIS-storage.md b/tests/acceptance/expected-failures-API-on-OCIS-storage.md index abce6ba4c0..4f55926c5e 100644 --- a/tests/acceptance/expected-failures-API-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-API-on-OCIS-storage.md @@ -387,8 +387,6 @@ _ocdav: api compatibility, return correct status code_ - [coreApiAuthWebDav/webDavSpecialURLs.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L16) - [coreApiAuthWebDav/webDavSpecialURLs.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L27) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L58) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L69) - [coreApiAuthWebDav/webDavSpecialURLs.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L79) - [coreApiAuthWebDav/webDavSpecialURLs.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L91) - [coreApiAuthWebDav/webDavSpecialURLs.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L103) diff --git a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/appprovider/appprovider.go b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/appprovider/appprovider.go index ce1cc6e775..14a69fcf6a 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/grpc/services/appprovider/appprovider.go +++ b/vendor/github.com/cs3org/reva/v2/internal/grpc/services/appprovider/appprovider.go @@ -39,7 +39,6 @@ import ( "github.com/cs3org/reva/v2/pkg/utils" "github.com/juliangruber/go-intersect" "github.com/mitchellh/mapstructure" - "github.com/rs/zerolog/log" "google.golang.org/grpc" ) @@ -111,10 +110,8 @@ func New(m map[string]interface{}, ss *grpc.Server) (rgrpc.Service, error) { for { select { case <-t.C: - log.Debug().Msg("app provider tick, registering Provider") service.registerProvider() case <-service.context.Done(): - log.Debug().Msg("app provider stopped") t.Stop() } } diff --git a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/propfind/propfind.go b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/propfind/propfind.go index 28801a0666..0600f1b14a 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/propfind/propfind.go +++ b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocdav/propfind/propfind.go @@ -840,7 +840,7 @@ func requiresExplicitFetching(n *xml.Name) bool { switch n.Space { case net.NsDav: switch n.Local { - case "quota-available-bytes", "quota-used-bytes": + case "quota-available-bytes", "quota-used-bytes", "lockdiscovery": // A PROPFIND request SHOULD NOT return DAV:quota-available-bytes and DAV:quota-used-bytes // from https://www.rfc-editor.org/rfc/rfc4331.html#section-2 return true @@ -1663,21 +1663,14 @@ func (c *countingReader) Read(p []byte) (int, error) { } func metadataKeyOf(n *xml.Name) string { - switch n.Space { - case net.NsDav: - if n.Local == "quota-available-bytes" { - return "quota" - } - case net.NsOwncloud: - if n.Local == "share-types" { - return "share-types" - } - - if n.Local == "tags" { - return "tags" - } + switch n.Local { + case "quota-available-bytes": + return "quota" + case "share-types", "tags", "lockdiscovery": + return n.Local + default: + return fmt.Sprintf("%s/%s", n.Space, n.Local) } - return fmt.Sprintf("%s/%s", n.Space, n.Local) } // UnmarshalXML appends the property names enclosed within start to pn. diff --git a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go index 3e398ff50a..907c233ead 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go +++ b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/public.go @@ -414,9 +414,17 @@ func (h *Handler) updatePublicShare(w http.ResponseWriter, r *http.Request, shar response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "missing resource information", fmt.Errorf("error getting resource information")) return } + if statRes.GetStatus().GetCode() != rpc.Code_CODE_OK { + if statRes.GetStatus().GetCode() == rpc.Code_CODE_NOT_FOUND { + response.WriteOCSError(w, r, response.MetaNotFound.StatusCode, "update public share: resource not found", err) + return + } + response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "grpc stat request failed for stat when updating a public share", err) + return + } // empty permissions mean internal link here - NOT denial. Hence we need an extra check - if !sufficientPermissions(statRes.Info.PermissionSet, newPermissions, true) { + if !sufficientPermissions(statRes.GetInfo().GetPermissionSet(), newPermissions, true) { response.WriteOCSError(w, r, http.StatusForbidden, "no share permission", nil) return } diff --git a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go index 722f53a820..06975ce5cc 100644 --- a/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go +++ b/vendor/github.com/cs3org/reva/v2/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/user.go @@ -245,6 +245,11 @@ func (h *Handler) listUserShares(r *http.Request, filters []*collaboration.Filte h.addFileInfo(ctx, data, info) h.mapUserIds(ctx, client, data) + // Filter out a share if ShareWith is not found because the user or group already deleted + if data.ShareWith == "" { + continue + } + log.Debug().Interface("share", s).Interface("info", info).Interface("shareData", data).Msg("mapped") ocsDataPayload = append(ocsDataPayload, data) } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/micro/ocdav/service.go b/vendor/github.com/cs3org/reva/v2/pkg/micro/ocdav/service.go index d7a8591cfc..29d8b135cf 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/micro/ocdav/service.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/micro/ocdav/service.go @@ -44,6 +44,18 @@ import ( "go.opentelemetry.io/otel/trace" ) +func init() { + // register method with chi before any routing is set up + chi.RegisterMethod(ocdav.MethodPropfind) + chi.RegisterMethod(ocdav.MethodProppatch) + chi.RegisterMethod(ocdav.MethodLock) + chi.RegisterMethod(ocdav.MethodUnlock) + chi.RegisterMethod(ocdav.MethodCopy) + chi.RegisterMethod(ocdav.MethodMove) + chi.RegisterMethod(ocdav.MethodMkcol) + chi.RegisterMethod(ocdav.MethodReport) +} + const ( // ServerName to use when announcing the service to the registry ServerName = "ocdav" @@ -73,17 +85,6 @@ func Service(opts ...Option) (micro.Service, error) { return nil, err } - // Comment back in after resolving the issue in go-chi. - // See comment in line 87. - // register additional webdav verbs - // chi.RegisterMethod(ocdav.MethodPropfind) - // chi.RegisterMethod(ocdav.MethodProppatch) - // chi.RegisterMethod(ocdav.MethodLock) - // chi.RegisterMethod(ocdav.MethodUnlock) - // chi.RegisterMethod(ocdav.MethodCopy) - // chi.RegisterMethod(ocdav.MethodMove) - // chi.RegisterMethod(ocdav.MethodMkcol) - // chi.RegisterMethod(ocdav.MethodReport) r := chi.NewRouter() tp := sopts.TraceProvider @@ -107,10 +108,6 @@ func Service(opts ...Option) (micro.Service, error) { } r.Handle("/*", revaService.Handler()) - // This is a workaround for the go-chi concurrent map read write issue. - // After the issue has been solved upstream in go-chi we should switch - // back to using `chi.RegisterMethod`. - r.MethodNotAllowed(http.HandlerFunc(revaService.Handler().ServeHTTP)) _ = chi.Walk(r, func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error { sopts.Logger.Debug().Str("service", "ocdav").Str("method", method).Str("route", route).Int("middlewares", len(middlewares)).Msg("serving endpoint") diff --git a/vendor/github.com/cs3org/reva/v2/pkg/mime/mime.go b/vendor/github.com/cs3org/reva/v2/pkg/mime/mime.go index 6908450308..c1a02a9ccd 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/mime/mime.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/mime/mime.go @@ -20,13 +20,1127 @@ package mime import ( "path" + "strings" "sync" - - gomime "github.com/cubewise-code/go-mime" ) const defaultMimeDir = "httpd/unix-directory" +var mimeTypes = map[string]string{ + "123": "application/vnd.lotus-1-2-3", + "3dml": "text/vnd.in3d.3dml", + "3ds": "image/x-3ds", + "3g2": "video/3gpp2", + "3gp": "video/3gpp", + "3gpp": "video/3gpp", + "7z": "application/x-7z-compressed", + "aab": "application/x-authorware-bin", + "aac": "audio/x-aac", + "aam": "application/x-authorware-map", + "aas": "application/x-authorware-seg", + "abw": "application/x-abiword", + "ac": "application/pkix-attr-cert", + "acc": "application/vnd.americandynamics.acc", + "ace": "application/x-ace-compressed", + "acu": "application/vnd.acucobol", + "acutc": "application/vnd.acucorp", + "adp": "audio/adpcm", + "aep": "application/vnd.audiograph", + "afm": "application/x-font-type1", + "afp": "application/vnd.ibm.modcap", + "ahead": "application/vnd.ahead.space", + "ai": "application/postscript", + "aif": "audio/x-aiff", + "aifc": "audio/x-aiff", + "aiff": "audio/x-aiff", + "air": "application/vnd.adobe.air-application-installer-package+zip", + "ait": "application/vnd.dvb.ait", + "ami": "application/vnd.amiga.ami", + "apk": "application/vnd.android.package-archive", + "apng": "image/apng", + "appcache": "text/cache-manifest", + "application": "application/x-ms-application", + "apr": "application/vnd.lotus-approach", + "arc": "application/x-freearc", + "arj": "application/x-arj", + "arw": "image/x-sony-arw", + "asc": "application/pgp-signature", + "asf": "video/x-ms-asf", + "asm": "text/x-asm", + "aso": "application/vnd.accpac.simply.aso", + "asx": "video/x-ms-asf", + "atc": "application/vnd.acucorp", + "atom": "application/atom+xml", + "atomcat": "application/atomcat+xml", + "atomsvc": "application/atomsvc+xml", + "atx": "application/vnd.antix.game-component", + "au": "audio/basic", + "avi": "video/x-msvideo", + "aw": "application/applixware", + "azf": "application/vnd.airzip.filesecure.azf", + "azs": "application/vnd.airzip.filesecure.azs", + "azv": "image/vnd.airzip.accelerator.azv", + "azw": "application/vnd.amazon.ebook", + "bat": "application/x-msdownload", + "bcpio": "application/x-bcpio", + "bdf": "application/x-font-bdf", + "bdm": "application/vnd.syncml.dm+wbxml", + "bdoc": "application/x-bdoc", + "bed": "application/vnd.realvnc.bed", + "bh2": "application/vnd.fujitsu.oasysprs", + "bin": "application/octet-stream", + "blb": "application/x-blorb", + "blorb": "application/x-blorb", + "bmi": "application/vnd.bmi", + "bmp": "image/x-ms-bmp", + "book": "application/vnd.framemaker", + "box": "application/vnd.previewsystems.box", + "boz": "application/x-bzip2", + "bpk": "application/octet-stream", + "btif": "image/prs.btif", + "buffer": "application/octet-stream", + "bz": "application/x-bzip", + "bz2": "application/x-bzip2", + "c": "text/x-c", + "c11amc": "application/vnd.cluetrust.cartomobile-config", + "c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", + "c4d": "application/vnd.clonk.c4group", + "c4f": "application/vnd.clonk.c4group", + "c4g": "application/vnd.clonk.c4group", + "c4p": "application/vnd.clonk.c4group", + "c4u": "application/vnd.clonk.c4group", + "cab": "application/vnd.ms-cab-compressed", + "caf": "audio/x-caf", + "cap": "application/vnd.tcpdump.pcap", + "car": "application/vnd.curl.car", + "cat": "application/vnd.ms-pki.seccat", + "cb7": "application/x-cbr", + "cba": "application/x-cbr", + "cbr": "application/x-cbr", + "cbt": "application/x-cbr", + "cbz": "application/x-cbr", + "cc": "text/x-c", + "cco": "application/x-cocoa", + "cct": "application/x-director", + "ccxml": "application/ccxml+xml", + "cdbcmsg": "application/vnd.contact.cmsg", + "cdf": "application/x-netcdf", + "cdkey": "application/vnd.mediastation.cdkey", + "cdmia": "application/cdmi-capability", + "cdmic": "application/cdmi-container", + "cdmid": "application/cdmi-domain", + "cdmio": "application/cdmi-object", + "cdmiq": "application/cdmi-queue", + "cdx": "chemical/x-cdx", + "cdxml": "application/vnd.chemdraw+xml", + "cdy": "application/vnd.cinderella", + "cer": "application/pkix-cert", + "cfs": "application/x-cfs-compressed", + "cgm": "image/cgm", + "chat": "application/x-chat", + "chm": "application/vnd.ms-htmlhelp", + "chrt": "application/vnd.kde.kchart", + "cif": "chemical/x-cif", + "cii": "application/vnd.anser-web-certificate-issue-initiation", + "cil": "application/vnd.ms-artgalry", + "cla": "application/vnd.claymore", + "class": "application/java-vm", + "clkk": "application/vnd.crick.clicker.keyboard", + "clkp": "application/vnd.crick.clicker.palette", + "clkt": "application/vnd.crick.clicker.template", + "clkw": "application/vnd.crick.clicker.wordbank", + "clkx": "application/vnd.crick.clicker", + "clp": "application/x-msclip", + "cmc": "application/vnd.cosmocaller", + "cmdf": "chemical/x-cmdf", + "cml": "chemical/x-cml", + "cmp": "application/vnd.yellowriver-custom-menu", + "cmx": "image/x-cmx", + "cod": "application/vnd.rim.cod", + "coffee": "text/coffeescript", + "com": "application/x-msdownload", + "conf": "text/plain", + "cpio": "application/x-cpio", + "cpp": "text/x-c", + "cpt": "application/mac-compactpro", + "cr2": "image/x-canon-cr2", + "crd": "application/x-mscardfile", + "crl": "application/pkix-crl", + "crt": "application/x-x509-ca-cert", + "crw": "image/x-canon-crw", + "crx": "application/x-chrome-extension", + "cryptonote": "application/vnd.rig.cryptonote", + "csh": "application/x-csh", + "csl": "application/vnd.citationstyles.style+xml", + "csml": "chemical/x-csml", + "csp": "application/vnd.commonspace", + "css": "text/css", + "cst": "application/x-director", + "csv": "text/csv", + "cu": "application/cu-seeme", + "curl": "text/vnd.curl", + "cww": "application/prs.cww", + "cxt": "application/x-director", + "cxx": "text/x-c", + "dae": "model/vnd.collada+xml", + "daf": "application/vnd.mobius.daf", + "dart": "application/vnd.dart", + "dataless": "application/vnd.fdsn.seed", + "davmount": "application/davmount+xml", + "dbk": "application/docbook+xml", + "dcr": "application/x-director", + "dcurl": "text/vnd.curl.dcurl", + "dd2": "application/vnd.oma.dd2+xml", + "ddd": "application/vnd.fujixerox.ddd", + "deb": "application/x-debian-package", + "def": "text/plain", + "deploy": "application/octet-stream", + "der": "application/x-x509-ca-cert", + "dfac": "application/vnd.dreamfactory", + "dgc": "application/x-dgc-compressed", + "dic": "text/x-c", + "dir": "application/x-director", + "dis": "application/vnd.mobius.dis", + "disposition-notification": "message/disposition-notification", + "dist": "application/octet-stream", + "distz": "application/octet-stream", + "djv": "image/vnd.djvu", + "djvu": "image/vnd.djvu", + "dll": "application/x-msdownload", + "dmg": "application/x-apple-diskimage", + "dmp": "application/vnd.tcpdump.pcap", + "dms": "application/octet-stream", + "dna": "application/vnd.dna", + "dng": "image/x-adobe-dng", + "doc": "application/msword", + "docm": "application/vnd.ms-word.document.macroenabled.12", + "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "dot": "application/msword", + "dotm": "application/vnd.ms-word.template.macroenabled.12", + "dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + "dp": "application/vnd.osgi.dp", + "dpg": "application/vnd.dpgraph", + "dra": "audio/vnd.dra", + "drle": "image/dicom-rle", + "dsc": "text/prs.lines.tag", + "dssc": "application/dssc+der", + "dtb": "application/x-dtbook+xml", + "dtd": "application/xml-dtd", + "dts": "audio/vnd.dts", + "dtshd": "audio/vnd.dts.hd", + "dump": "application/octet-stream", + "dvb": "video/vnd.dvb.file", + "dvi": "application/x-dvi", + "dwf": "model/vnd.dwf", + "dwg": "image/vnd.dwg", + "dxf": "image/vnd.dxf", + "dxp": "application/vnd.spotfire.dxp", + "dxr": "application/x-director", + "ear": "application/java-archive", + "ecelp4800": "audio/vnd.nuera.ecelp4800", + "ecelp7470": "audio/vnd.nuera.ecelp7470", + "ecelp9600": "audio/vnd.nuera.ecelp9600", + "ecma": "application/ecmascript", + "edm": "application/vnd.novadigm.edm", + "edx": "application/vnd.novadigm.edx", + "efif": "application/vnd.picsel", + "ei6": "application/vnd.pg.osasli", + "elc": "application/octet-stream", + "emf": "image/emf", + "eml": "message/rfc822", + "emma": "application/emma+xml", + "emz": "application/x-msmetafile", + "eol": "audio/vnd.digital-winds", + "eot": "application/vnd.ms-fontobject", + "eps": "application/postscript", + "epub": "application/epub+zip", + "erf": "image/x-epson-erf", + "es": "application/ecmascript", + "es3": "application/vnd.eszigno3+xml", + "esa": "application/vnd.osgi.subsystem", + "esf": "application/vnd.epson.esf", + "et3": "application/vnd.eszigno3+xml", + "etx": "text/x-setext", + "eva": "application/x-eva", + "evy": "application/x-envoy", + "exe": "application/x-msdownload", + "exi": "application/exi", + "exr": "image/aces", + "ext": "application/vnd.novadigm.ext", + "ez": "application/andrew-inset", + "ez2": "application/vnd.ezpix-album", + "ez3": "application/vnd.ezpix-package", + "f": "text/x-fortran", + "f4v": "video/x-f4v", + "f77": "text/x-fortran", + "f90": "text/x-fortran", + "fbs": "image/vnd.fastbidsheet", + "fcdt": "application/vnd.adobe.formscentral.fcdt", + "fcs": "application/vnd.isac.fcs", + "fdf": "application/vnd.fdf", + "fe_launch": "application/vnd.denovo.fcselayout-link", + "fg5": "application/vnd.fujitsu.oasysgp", + "fgd": "application/x-director", + "fh": "image/x-freehand", + "fh4": "image/x-freehand", + "fh5": "image/x-freehand", + "fh7": "image/x-freehand", + "fhc": "image/x-freehand", + "fig": "application/x-xfig", + "fits": "image/fits", + "flac": "audio/x-flac", + "fli": "video/x-fli", + "flo": "application/vnd.micrografx.flo", + "flv": "video/x-flv", + "flw": "application/vnd.kde.kivio", + "flx": "text/vnd.fmi.flexstor", + "fly": "text/vnd.fly", + "fm": "application/vnd.framemaker", + "fnc": "application/vnd.frogans.fnc", + "for": "text/x-fortran", + "fpx": "image/vnd.fpx", + "frame": "application/vnd.framemaker", + "fsc": "application/vnd.fsc.weblaunch", + "fst": "image/vnd.fst", + "ftc": "application/vnd.fluxtime.clip", + "fti": "application/vnd.anser-web-funds-transfer-initiation", + "fvt": "video/vnd.fvt", + "fxp": "application/vnd.adobe.fxp", + "fxpl": "application/vnd.adobe.fxp", + "fzs": "application/vnd.fuzzysheet", + "g2w": "application/vnd.geoplan", + "g3": "image/g3fax", + "g3w": "application/vnd.geospace", + "gac": "application/vnd.groove-account", + "gam": "application/x-tads", + "gbr": "application/rpki-ghostbusters", + "gca": "application/x-gca-compressed", + "gdl": "model/vnd.gdl", + "gdoc": "application/vnd.google-apps.document", + "geo": "application/vnd.dynageo", + "geojson": "application/geo+json", + "gex": "application/vnd.geometry-explorer", + "ggb": "application/vnd.geogebra.file", + "ggt": "application/vnd.geogebra.tool", + "ghf": "application/vnd.groove-help", + "gif": "image/gif", + "gim": "application/vnd.groove-identity-message", + "glb": "model/gltf-binary", + "gltf": "model/gltf+json", + "gml": "application/gml+xml", + "gmx": "application/vnd.gmx", + "gnumeric": "application/x-gnumeric", + "gph": "application/vnd.flographit", + "gpx": "application/gpx+xml", + "gqf": "application/vnd.grafeq", + "gqs": "application/vnd.grafeq", + "gram": "application/srgs", + "gramps": "application/x-gramps-xml", + "gre": "application/vnd.geometry-explorer", + "grv": "application/vnd.groove-injector", + "grxml": "application/srgs+xml", + "gsf": "application/x-font-ghostscript", + "gsheet": "application/vnd.google-apps.spreadsheet", + "gslides": "application/vnd.google-apps.presentation", + "gtar": "application/x-gtar", + "gtm": "application/vnd.groove-tool-message", + "gtw": "model/vnd.gtw", + "gv": "text/vnd.graphviz", + "gxf": "application/gxf", + "gxt": "application/vnd.geonext", + "gz": "application/gzip", + "h": "text/x-c", + "h261": "video/h261", + "h263": "video/h263", + "h264": "video/h264", + "hal": "application/vnd.hal+xml", + "hbci": "application/vnd.hbci", + "hbs": "text/x-handlebars-template", + "hdd": "application/x-virtualbox-hdd", + "hdf": "application/x-hdf", + "heic": "image/heic", + "heics": "image/heic-sequence", + "heif": "image/heif", + "heifs": "image/heif-sequence", + "hh": "text/x-c", + "hjson": "application/hjson", + "hlp": "application/winhlp", + "hpgl": "application/vnd.hp-hpgl", + "hpid": "application/vnd.hp-hpid", + "hps": "application/vnd.hp-hps", + "hqx": "application/mac-binhex40", + "htc": "text/x-component", + "htke": "application/vnd.kenameaapp", + "htm": "text/html", + "html": "text/html", + "hvd": "application/vnd.yamaha.hv-dic", + "hvp": "application/vnd.yamaha.hv-voice", + "hvs": "application/vnd.yamaha.hv-script", + "i2g": "application/vnd.intergeo", + "icc": "application/vnd.iccprofile", + "ice": "x-conference/x-cooltalk", + "icm": "application/vnd.iccprofile", + "ico": "image/x-icon", + "ics": "text/calendar", + "ief": "image/ief", + "ifb": "text/calendar", + "ifm": "application/vnd.shana.informed.formdata", + "iges": "model/iges", + "igl": "application/vnd.igloader", + "igm": "application/vnd.insors.igm", + "igs": "model/iges", + "igx": "application/vnd.micrografx.igx", + "iif": "application/vnd.shana.informed.interchange", + "img": "application/octet-stream", + "imp": "application/vnd.accpac.simply.imp", + "ims": "application/vnd.ms-ims", + "in": "text/plain", + "ini": "text/plain", + "ink": "application/inkml+xml", + "inkml": "application/inkml+xml", + "install": "application/x-install-instructions", + "iota": "application/vnd.astraea-software.iota", + "ipfix": "application/ipfix", + "ipk": "application/vnd.shana.informed.package", + "irm": "application/vnd.ibm.rights-management", + "irp": "application/vnd.irepository.package+xml", + "iso": "application/x-iso9660-image", + "itp": "application/vnd.shana.informed.formtemplate", + "ivp": "application/vnd.immervision-ivp", + "ivu": "application/vnd.immervision-ivu", + "jad": "text/vnd.sun.j2me.app-descriptor", + "jade": "text/jade", + "jam": "application/vnd.jam", + "jar": "application/java-archive", + "jardiff": "application/x-java-archive-diff", + "java": "text/x-java-source", + "jisp": "application/vnd.jisp", + "jls": "image/jls", + "jlt": "application/vnd.hp-jlyt", + "jng": "image/x-jng", + "jnlp": "application/x-java-jnlp-file", + "joda": "application/vnd.joost.joda-archive", + "jp2": "image/jp2", + "jpe": "image/jpeg", + "jpeg": "image/jpeg", + "jpf": "image/jpx", + "jpg": "image/jpeg", + "jpg2": "image/jp2", + "jpgm": "video/jpm", + "jpgv": "video/jpeg", + "jpm": "video/jpm", + "jpx": "image/jpx", + "js": "application/javascript", + "json": "application/json", + "json5": "application/json5", + "jsonld": "application/ld+json", + "jsonml": "application/jsonml+json", + "jsx": "text/jsx", + "k25": "image/x-kodak-k25", + "kar": "audio/midi", + "karbon": "application/vnd.kde.karbon", + "kdc": "image/x-kodak-kdc", + "keynote": "application/vnd.apple.keynote", + "kfo": "application/vnd.kde.kformula", + "kia": "application/vnd.kidspiration", + "kml": "application/vnd.google-earth.kml+xml", + "kmz": "application/vnd.google-earth.kmz", + "kne": "application/vnd.kinar", + "knp": "application/vnd.kinar", + "kon": "application/vnd.kde.kontour", + "kpr": "application/vnd.kde.kpresenter", + "kpt": "application/vnd.kde.kpresenter", + "kpxx": "application/vnd.ds-keypoint", + "ksp": "application/vnd.kde.kspread", + "ktr": "application/vnd.kahootz", + "ktx": "image/ktx", + "ktz": "application/vnd.kahootz", + "kwd": "application/vnd.kde.kword", + "kwt": "application/vnd.kde.kword", + "lasxml": "application/vnd.las.las+xml", + "latex": "application/x-latex", + "lbd": "application/vnd.llamagraphics.life-balance.desktop", + "lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", + "les": "application/vnd.hhe.lesson-player", + "less": "text/less", + "lha": "application/x-lzh-compressed", + "link66": "application/vnd.route66.link66+xml", + "list": "text/plain", + "list3820": "application/vnd.ibm.modcap", + "listafp": "application/vnd.ibm.modcap", + "litcoffee": "text/coffeescript", + "lnk": "application/x-ms-shortcut", + "log": "text/plain", + "lostxml": "application/lost+xml", + "lrf": "application/octet-stream", + "lrm": "application/vnd.ms-lrm", + "ltf": "application/vnd.frogans.ltf", + "lua": "text/x-lua", + "luac": "application/x-lua-bytecode", + "lvp": "audio/vnd.lucent.voice", + "lwp": "application/vnd.lotus-wordpro", + "lzh": "application/x-lzh-compressed", + "m13": "application/x-msmediaview", + "m14": "application/x-msmediaview", + "m1v": "video/mpeg", + "m21": "application/mp21", + "m2a": "audio/mpeg", + "m2v": "video/mpeg", + "m3a": "audio/mpeg", + "m3u": "audio/x-mpegurl", + "m3u8": "application/vnd.apple.mpegurl", + "m4a": "audio/x-m4a", + "m4p": "application/mp4", + "m4u": "video/vnd.mpegurl", + "m4v": "video/x-m4v", + "ma": "application/mathematica", + "mads": "application/mads+xml", + "mag": "application/vnd.ecowin.chart", + "maker": "application/vnd.framemaker", + "man": "text/troff", + "manifest": "text/cache-manifest", + "map": "application/json", + "mar": "application/octet-stream", + "markdown": "text/markdown", + "mathml": "application/mathml+xml", + "mb": "application/mathematica", + "mbk": "application/vnd.mobius.mbk", + "mbox": "application/mbox", + "mc1": "application/vnd.medcalcdata", + "mcd": "application/vnd.mcd", + "mcurl": "text/vnd.curl.mcurl", + "md": "text/markdown", + "mdb": "application/x-msaccess", + "mdi": "image/vnd.ms-modi", + "me": "text/troff", + "mesh": "model/mesh", + "meta4": "application/metalink4+xml", + "metalink": "application/metalink+xml", + "mets": "application/mets+xml", + "mfm": "application/vnd.mfmp", + "mft": "application/rpki-manifest", + "mgp": "application/vnd.osgeo.mapguide.package", + "mgz": "application/vnd.proteus.magazine", + "mid": "audio/midi", + "midi": "audio/midi", + "mie": "application/x-mie", + "mif": "application/vnd.mif", + "mime": "message/rfc822", + "mj2": "video/mj2", + "mjp2": "video/mj2", + "mjs": "application/javascript", + "mk3d": "video/x-matroska", + "mka": "audio/x-matroska", + "mkd": "text/x-markdown", + "mks": "video/x-matroska", + "mkv": "video/x-matroska", + "mlp": "application/vnd.dolby.mlp", + "mmd": "application/vnd.chipnuts.karaoke-mmd", + "mmf": "application/vnd.smaf", + "mml": "text/mathml", + "mmr": "image/vnd.fujixerox.edmics-mmr", + "mng": "video/x-mng", + "mny": "application/x-msmoney", + "mobi": "application/x-mobipocket-ebook", + "mods": "application/mods+xml", + "mov": "video/quicktime", + "movie": "video/x-sgi-movie", + "mp2": "audio/mpeg", + "mp21": "application/mp21", + "mp2a": "audio/mpeg", + "mp3": "audio/mpeg", + "mp4": "video/mp4", + "mp4a": "audio/mp4", + "mp4s": "application/mp4", + "mp4v": "video/mp4", + "mpc": "application/vnd.mophun.certificate", + "mpd": "application/dash+xml", + "mpe": "video/mpeg", + "mpeg": "video/mpeg", + "mpg": "video/mpeg", + "mpg4": "video/mp4", + "mpga": "audio/mpeg", + "mpkg": "application/vnd.apple.installer+xml", + "mpm": "application/vnd.blueice.multipass", + "mpn": "application/vnd.mophun.application", + "mpp": "application/vnd.ms-project", + "mpt": "application/vnd.ms-project", + "mpy": "application/vnd.ibm.minipay", + "mqy": "application/vnd.mobius.mqy", + "mrc": "application/marc", + "mrcx": "application/marcxml+xml", + "mrw": "image/x-minolta-mrw", + "ms": "text/troff", + "mscml": "application/mediaservercontrol+xml", + "mseed": "application/vnd.fdsn.mseed", + "mseq": "application/vnd.mseq", + "msf": "application/vnd.epson.msf", + "msg": "application/vnd.ms-outlook", + "msh": "model/mesh", + "msi": "application/x-msdownload", + "msl": "application/vnd.mobius.msl", + "msm": "application/octet-stream", + "msp": "application/octet-stream", + "msty": "application/vnd.muvee.style", + "mts": "model/vnd.mts", + "mus": "application/vnd.musician", + "musicxml": "application/vnd.recordare.musicxml+xml", + "mvb": "application/x-msmediaview", + "mwf": "application/vnd.mfer", + "mxf": "application/mxf", + "mxl": "application/vnd.recordare.musicxml", + "mxml": "application/xv+xml", + "mxs": "application/vnd.triscape.mxs", + "mxu": "video/vnd.mpegurl", + "n-gage": "application/vnd.nokia.n-gage.symbian.install", + "n3": "text/n3", + "nb": "application/mathematica", + "nbp": "application/vnd.wolfram.player", + "nc": "application/x-netcdf", + "ncx": "application/x-dtbncx+xml", + "nef": "image/x-nikon-nef", + "nfo": "text/x-nfo", + "ngdat": "application/vnd.nokia.n-gage.data", + "nitf": "application/vnd.nitf", + "nlu": "application/vnd.neurolanguage.nlu", + "nml": "application/vnd.enliven", + "nnd": "application/vnd.noblenet-directory", + "nns": "application/vnd.noblenet-sealer", + "nnw": "application/vnd.noblenet-web", + "npx": "image/vnd.net-fpx", + "nsc": "application/x-conference", + "nsf": "application/vnd.lotus-notes", + "ntf": "application/vnd.nitf", + "numbers": "application/vnd.apple.numbers", + "nzb": "application/x-nzb", + "oa2": "application/vnd.fujitsu.oasys2", + "oa3": "application/vnd.fujitsu.oasys3", + "oas": "application/vnd.fujitsu.oasys", + "obd": "application/x-msbinder", + "obj": "application/x-tgif", + "oda": "application/oda", + "odb": "application/vnd.oasis.opendocument.database", + "odc": "application/vnd.oasis.opendocument.chart", + "odf": "application/vnd.oasis.opendocument.formula", + "odft": "application/vnd.oasis.opendocument.formula-template", + "odg": "application/vnd.oasis.opendocument.graphics", + "odi": "application/vnd.oasis.opendocument.image", + "odm": "application/vnd.oasis.opendocument.text-master", + "odp": "application/vnd.oasis.opendocument.presentation", + "ods": "application/vnd.oasis.opendocument.spreadsheet", + "odt": "application/vnd.oasis.opendocument.text", + "oform": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "oga": "audio/ogg", + "ogg": "audio/ogg", + "ogv": "video/ogg", + "ogx": "application/ogg", + "omdoc": "application/omdoc+xml", + "onepkg": "application/onenote", + "onetmp": "application/onenote", + "onetoc": "application/onenote", + "onetoc2": "application/onenote", + "opf": "application/oebps-package+xml", + "opml": "text/x-opml", + "oprc": "application/vnd.palm", + "orf": "image/x-olympus-orf", + "org": "text/x-org", + "osf": "application/vnd.yamaha.openscoreformat", + "osfpvg": "application/vnd.yamaha.openscoreformat.osfpvg+xml", + "otc": "application/vnd.oasis.opendocument.chart-template", + "otf": "font/otf", + "otg": "application/vnd.oasis.opendocument.graphics-template", + "oth": "application/vnd.oasis.opendocument.text-web", + "oti": "application/vnd.oasis.opendocument.image-template", + "otp": "application/vnd.oasis.opendocument.presentation-template", + "ots": "application/vnd.oasis.opendocument.spreadsheet-template", + "ott": "application/vnd.oasis.opendocument.text-template", + "ova": "application/x-virtualbox-ova", + "ovf": "application/x-virtualbox-ovf", + "owl": "application/rdf+xml", + "oxps": "application/oxps", + "oxt": "application/vnd.openofficeorg.extension", + "p": "text/x-pascal", + "p10": "application/pkcs10", + "p12": "application/x-pkcs12", + "p7b": "application/x-pkcs7-certificates", + "p7c": "application/pkcs7-mime", + "p7m": "application/pkcs7-mime", + "p7r": "application/x-pkcs7-certreqresp", + "p7s": "application/pkcs7-signature", + "p8": "application/pkcs8", + "pac": "application/x-ns-proxy-autoconfig", + "pages": "application/vnd.apple.pages", + "pas": "text/x-pascal", + "paw": "application/vnd.pawaafile", + "pbd": "application/vnd.powerbuilder6", + "pbm": "image/x-portable-bitmap", + "pcap": "application/vnd.tcpdump.pcap", + "pcf": "application/x-font-pcf", + "pcl": "application/vnd.hp-pcl", + "pclxl": "application/vnd.hp-pclxl", + "pct": "image/x-pict", + "pcurl": "application/vnd.curl.pcurl", + "pcx": "image/x-pcx", + "pdb": "application/x-pilot", + "pde": "text/x-processing", + "pdf": "application/pdf", + "pef": "image/x-pentax-pef", + "pem": "application/x-x509-ca-cert", + "pfa": "application/x-font-type1", + "pfb": "application/x-font-type1", + "pfm": "application/x-font-type1", + "pfr": "application/font-tdpfr", + "pfx": "application/x-pkcs12", + "pgm": "image/x-portable-graymap", + "pgn": "application/x-chess-pgn", + "pgp": "application/pgp-encrypted", + "php": "application/x-httpd-php", + "pic": "image/x-pict", + "pkg": "application/octet-stream", + "pki": "application/pkixcmp", + "pkipath": "application/pkix-pkipath", + "pkpass": "application/vnd.apple.pkpass", + "pl": "application/x-perl", + "plb": "application/vnd.3gpp.pic-bw-large", + "plc": "application/vnd.mobius.plc", + "plf": "application/vnd.pocketlearn", + "pls": "application/pls+xml", + "pm": "application/x-perl", + "pml": "application/vnd.ctc-posml", + "png": "image/png", + "pnm": "image/x-portable-anymap", + "portpkg": "application/vnd.macports.portpkg", + "pot": "application/vnd.ms-powerpoint", + "potm": "application/vnd.ms-powerpoint.template.macroenabled.12", + "potx": "application/vnd.openxmlformats-officedocument.presentationml.template", + "ppam": "application/vnd.ms-powerpoint.addin.macroenabled.12", + "ppd": "application/vnd.cups-ppd", + "ppm": "image/x-portable-pixmap", + "pps": "application/vnd.ms-powerpoint", + "ppsm": "application/vnd.ms-powerpoint.slideshow.macroenabled.12", + "ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + "ppt": "application/vnd.ms-powerpoint", + "pptm": "application/vnd.ms-powerpoint.presentation.macroenabled.12", + "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "pqa": "application/vnd.palm", + "prc": "application/x-pilot", + "pre": "application/vnd.lotus-freelance", + "prf": "application/pics-rules", + "ps": "application/postscript", + "psb": "application/vnd.3gpp.pic-bw-small", + "psd": "image/vnd.adobe.photoshop", + "psf": "application/x-font-linux-psf", + "pskcxml": "application/pskc+xml", + "pti": "image/prs.pti", + "ptid": "application/vnd.pvi.ptid1", + "pub": "application/x-mspublisher", + "pvb": "application/vnd.3gpp.pic-bw-var", + "pwn": "application/vnd.3m.post-it-notes", + "pya": "audio/vnd.ms-playready.media.pya", + "pyv": "video/vnd.ms-playready.media.pyv", + "qam": "application/vnd.epson.quickanime", + "qbo": "application/vnd.intu.qbo", + "qfx": "application/vnd.intu.qfx", + "qps": "application/vnd.publishare-delta-tree", + "qt": "video/quicktime", + "qwd": "application/vnd.quark.quarkxpress", + "qwt": "application/vnd.quark.quarkxpress", + "qxb": "application/vnd.quark.quarkxpress", + "qxd": "application/vnd.quark.quarkxpress", + "qxl": "application/vnd.quark.quarkxpress", + "qxt": "application/vnd.quark.quarkxpress", + "ra": "audio/x-realaudio", + "raf": "image/x-fuji-raf", + "ram": "audio/x-pn-realaudio", + "raml": "application/raml+yaml", + "rar": "application/x-rar-compressed", + "ras": "image/x-cmu-raster", + "raw": "image/x-panasonic-raw", + "rcprofile": "application/vnd.ipunplugged.rcprofile", + "rdf": "application/rdf+xml", + "rdz": "application/vnd.data-vision.rdz", + "rep": "application/vnd.businessobjects", + "res": "application/x-dtbresource+xml", + "rgb": "image/x-rgb", + "rif": "application/reginfo+xml", + "rip": "audio/vnd.rip", + "ris": "application/x-research-info-systems", + "rl": "application/resource-lists+xml", + "rlc": "image/vnd.fujixerox.edmics-rlc", + "rld": "application/resource-lists-diff+xml", + "rm": "application/vnd.rn-realmedia", + "rmi": "audio/midi", + "rmp": "audio/x-pn-realaudio-plugin", + "rms": "application/vnd.jcp.javame.midlet-rms", + "rmvb": "application/vnd.rn-realmedia-vbr", + "rnc": "application/relax-ng-compact-syntax", + "rng": "application/xml", + "roa": "application/rpki-roa", + "roff": "text/troff", + "rp9": "application/vnd.cloanto.rp9", + "rpm": "application/x-redhat-package-manager", + "rpss": "application/vnd.nokia.radio-presets", + "rpst": "application/vnd.nokia.radio-preset", + "rq": "application/sparql-query", + "rs": "application/rls-services+xml", + "rsd": "application/rsd+xml", + "rss": "application/rss+xml", + "rtf": "text/rtf", + "rtx": "text/richtext", + "run": "application/x-makeself", + "s": "text/x-asm", + "s3m": "audio/s3m", + "saf": "application/vnd.yamaha.smaf-audio", + "sass": "text/x-sass", + "sbml": "application/sbml+xml", + "sc": "application/vnd.ibm.secure-container", + "scd": "application/x-msschedule", + "scm": "application/vnd.lotus-screencam", + "scq": "application/scvp-cv-request", + "scs": "application/scvp-cv-response", + "scss": "text/x-scss", + "scurl": "text/vnd.curl.scurl", + "sda": "application/vnd.stardivision.draw", + "sdc": "application/vnd.stardivision.calc", + "sdd": "application/vnd.stardivision.impress", + "sdkd": "application/vnd.solent.sdkm+xml", + "sdkm": "application/vnd.solent.sdkm+xml", + "sdp": "application/sdp", + "sdw": "application/vnd.stardivision.writer", + "sea": "application/x-sea", + "see": "application/vnd.seemail", + "seed": "application/vnd.fdsn.seed", + "sema": "application/vnd.sema", + "semd": "application/vnd.semd", + "semf": "application/vnd.semf", + "ser": "application/java-serialized-object", + "setpay": "application/set-payment-initiation", + "setreg": "application/set-registration-initiation", + "sfd-hdstx": "application/vnd.hydrostatix.sof-data", + "sfs": "application/vnd.spotfire.sfs", + "sfv": "text/x-sfv", + "sgi": "image/sgi", + "sgl": "application/vnd.stardivision.writer-global", + "sgm": "text/sgml", + "sgml": "text/sgml", + "sh": "application/x-sh", + "shar": "application/x-shar", + "shex": "text/shex", + "shf": "application/shf+xml", + "shtml": "text/html", + "sid": "image/x-mrsid-image", + "sig": "application/pgp-signature", + "sil": "audio/silk", + "silo": "model/mesh", + "sis": "application/vnd.symbian.install", + "sisx": "application/vnd.symbian.install", + "sit": "application/x-stuffit", + "sitx": "application/x-stuffitx", + "skd": "application/vnd.koan", + "skm": "application/vnd.koan", + "skp": "application/vnd.koan", + "skt": "application/vnd.koan", + "sldm": "application/vnd.ms-powerpoint.slide.macroenabled.12", + "sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", + "slim": "text/slim", + "slm": "text/slim", + "slt": "application/vnd.epson.salt", + "sm": "application/vnd.stepmania.stepchart", + "smf": "application/vnd.stardivision.math", + "smi": "application/smil+xml", + "smil": "application/smil+xml", + "smv": "video/x-smv", + "smzip": "application/vnd.stepmania.package", + "snd": "audio/basic", + "snf": "application/x-font-snf", + "so": "application/octet-stream", + "spc": "application/x-pkcs7-certificates", + "spf": "application/vnd.yamaha.smaf-phrase", + "spl": "application/x-futuresplash", + "spot": "text/vnd.in3d.spot", + "spp": "application/scvp-vp-response", + "spq": "application/scvp-vp-request", + "spx": "audio/ogg", + "sql": "application/x-sql", + "sr2": "image/x-sony-sr2", + "src": "application/x-wais-source", + "srf": "image/x-sony-srf", + "srt": "application/x-subrip", + "sru": "application/sru+xml", + "srx": "application/sparql-results+xml", + "ssdl": "application/ssdl+xml", + "sse": "application/vnd.kodak-descriptor", + "ssf": "application/vnd.epson.ssf", + "ssml": "application/ssml+xml", + "st": "application/vnd.sailingtracker.track", + "stc": "application/vnd.sun.xml.calc.template", + "std": "application/vnd.sun.xml.draw.template", + "stf": "application/vnd.wt.stf", + "sti": "application/vnd.sun.xml.impress.template", + "stk": "application/hyperstudio", + "stl": "application/vnd.ms-pki.stl", + "str": "application/vnd.pg.format", + "stw": "application/vnd.sun.xml.writer.template", + "styl": "text/stylus", + "stylus": "text/stylus", + "sub": "text/vnd.dvb.subtitle", + "sus": "application/vnd.sus-calendar", + "susp": "application/vnd.sus-calendar", + "sv4cpio": "application/x-sv4cpio", + "sv4crc": "application/x-sv4crc", + "svc": "application/vnd.dvb.service", + "svd": "application/vnd.svd", + "svg": "image/svg+xml", + "svgz": "image/svg+xml", + "swa": "application/x-director", + "swf": "application/x-shockwave-flash", + "swi": "application/vnd.aristanetworks.swi", + "sxc": "application/vnd.sun.xml.calc", + "sxd": "application/vnd.sun.xml.draw", + "sxg": "application/vnd.sun.xml.writer.global", + "sxi": "application/vnd.sun.xml.impress", + "sxm": "application/vnd.sun.xml.math", + "sxw": "application/vnd.sun.xml.writer", + "t": "text/troff", + "t3": "application/x-t3vm-image", + "t38": "image/t38", + "taglet": "application/vnd.mynfc", + "tao": "application/vnd.tao.intent-module-archive", + "tap": "image/vnd.tencent.tap", + "tar": "application/x-tar", + "tcap": "application/vnd.3gpp2.tcap", + "tcl": "application/x-tcl", + "teacher": "application/vnd.smart.teacher", + "tei": "application/tei+xml", + "teicorpus": "application/tei+xml", + "tex": "application/x-tex", + "texi": "application/x-texinfo", + "texinfo": "application/x-texinfo", + "text": "text/plain", + "tfi": "application/thraud+xml", + "tfm": "application/x-tex-tfm", + "tfx": "image/tiff-fx", + "tga": "image/x-tga", + "thmx": "application/vnd.ms-officetheme", + "tif": "image/tiff", + "tiff": "image/tiff", + "tk": "application/x-tcl", + "tmo": "application/vnd.tmobile-livetv", + "torrent": "application/x-bittorrent", + "tpl": "application/vnd.groove-tool-template", + "tpt": "application/vnd.trid.tpt", + "tr": "text/troff", + "tra": "application/vnd.trueapp", + "trm": "application/x-msterminal", + "ts": "video/mp2t", + "tsd": "application/timestamped-data", + "tsv": "text/tab-separated-values", + "ttc": "font/collection", + "ttf": "font/ttf", + "ttl": "text/turtle", + "twd": "application/vnd.simtech-mindmapper", + "twds": "application/vnd.simtech-mindmapper", + "txd": "application/vnd.genomatix.tuxedo", + "txf": "application/vnd.mobius.txf", + "txt": "text/plain", + "u32": "application/x-authorware-bin", + "u8dsn": "message/global-delivery-status", + "u8hdr": "message/global-headers", + "u8mdn": "message/global-disposition-notification", + "u8msg": "message/global", + "udeb": "application/x-debian-package", + "ufd": "application/vnd.ufdl", + "ufdl": "application/vnd.ufdl", + "ulx": "application/x-glulx", + "umj": "application/vnd.umajin", + "unityweb": "application/vnd.unity", + "uoml": "application/vnd.uoml+xml", + "uri": "text/uri-list", + "uris": "text/uri-list", + "urls": "text/uri-list", + "ustar": "application/x-ustar", + "utz": "application/vnd.uiq.theme", + "uu": "text/x-uuencode", + "uva": "audio/vnd.dece.audio", + "uvd": "application/vnd.dece.data", + "uvf": "application/vnd.dece.data", + "uvg": "image/vnd.dece.graphic", + "uvh": "video/vnd.dece.hd", + "uvi": "image/vnd.dece.graphic", + "uvm": "video/vnd.dece.mobile", + "uvp": "video/vnd.dece.pd", + "uvs": "video/vnd.dece.sd", + "uvt": "application/vnd.dece.ttml+xml", + "uvu": "video/vnd.uvvu.mp4", + "uvv": "video/vnd.dece.video", + "uvva": "audio/vnd.dece.audio", + "uvvd": "application/vnd.dece.data", + "uvvf": "application/vnd.dece.data", + "uvvg": "image/vnd.dece.graphic", + "uvvh": "video/vnd.dece.hd", + "uvvi": "image/vnd.dece.graphic", + "uvvm": "video/vnd.dece.mobile", + "uvvp": "video/vnd.dece.pd", + "uvvs": "video/vnd.dece.sd", + "uvvt": "application/vnd.dece.ttml+xml", + "uvvu": "video/vnd.uvvu.mp4", + "uvvv": "video/vnd.dece.video", + "uvvx": "application/vnd.dece.unspecified", + "uvvz": "application/vnd.dece.zip", + "uvx": "application/vnd.dece.unspecified", + "uvz": "application/vnd.dece.zip", + "vbox": "application/x-virtualbox-vbox", + "vbox-extpack": "application/x-virtualbox-vbox-extpack", + "vcard": "text/vcard", + "vcd": "application/x-cdlink", + "vcf": "text/x-vcard", + "vcg": "application/vnd.groove-vcard", + "vcs": "text/x-vcalendar", + "vcx": "application/vnd.vcx", + "vdi": "application/x-virtualbox-vdi", + "vhd": "application/x-virtualbox-vhd", + "vis": "application/vnd.visionary", + "viv": "video/vnd.vivo", + "vmdk": "application/x-virtualbox-vmdk", + "vob": "video/x-ms-vob", + "vor": "application/vnd.stardivision.writer", + "vox": "application/x-authorware-bin", + "vrml": "model/vrml", + "vsd": "application/vnd.visio", + "vsf": "application/vnd.vsf", + "vss": "application/vnd.visio", + "vst": "application/vnd.visio", + "vsw": "application/vnd.visio", + "vtf": "image/vnd.valve.source.texture", + "vtt": "text/vtt", + "vtu": "model/vnd.vtu", + "vxml": "application/voicexml+xml", + "w3d": "application/x-director", + "wad": "application/x-doom", + "wadl": "application/vnd.sun.wadl+xml", + "war": "application/java-archive", + "wasm": "application/wasm", + "wav": "audio/x-wav", + "wax": "audio/x-ms-wax", + "wbmp": "image/vnd.wap.wbmp", + "wbs": "application/vnd.criticaltools.wbs+xml", + "wbxml": "application/vnd.wap.wbxml", + "wcm": "application/vnd.ms-works", + "wdb": "application/vnd.ms-works", + "wdp": "image/vnd.ms-photo", + "weba": "audio/webm", + "webapp": "application/x-web-app-manifest+json", + "webm": "video/webm", + "webmanifest": "application/manifest+json", + "webp": "image/webp", + "wg": "application/vnd.pmi.widget", + "wgt": "application/widget", + "wks": "application/vnd.ms-works", + "wm": "video/x-ms-wm", + "wma": "audio/x-ms-wma", + "wmd": "application/x-ms-wmd", + "wmf": "image/wmf", + "wml": "text/vnd.wap.wml", + "wmlc": "application/vnd.wap.wmlc", + "wmls": "text/vnd.wap.wmlscript", + "wmlsc": "application/vnd.wap.wmlscriptc", + "wmv": "video/x-ms-wmv", + "wmx": "video/x-ms-wmx", + "wmz": "application/x-msmetafile", + "woff": "font/woff", + "woff2": "font/woff2", + "wpd": "application/vnd.wordperfect", + "wpl": "application/vnd.ms-wpl", + "wps": "application/vnd.ms-works", + "wqd": "application/vnd.wqd", + "wri": "application/x-mswrite", + "wrl": "model/vrml", + "wsc": "message/vnd.wfa.wsc", + "wsdl": "application/wsdl+xml", + "wspolicy": "application/wspolicy+xml", + "wtb": "application/vnd.webturbo", + "wvx": "video/x-ms-wvx", + "x32": "application/x-authorware-bin", + "x3d": "model/x3d+xml", + "x3db": "model/x3d+binary", + "x3dbz": "model/x3d+binary", + "x3dv": "model/x3d+vrml", + "x3dvz": "model/x3d+vrml", + "x3dz": "model/x3d+xml", + "x3f": "image/x-sigma-x3f", + "xaml": "application/xaml+xml", + "xap": "application/x-silverlight-app", + "xar": "application/vnd.xara", + "xbap": "application/x-ms-xbap", + "xbd": "application/vnd.fujixerox.docuworks.binder", + "xbm": "image/x-xbitmap", + "xdf": "application/xcap-diff+xml", + "xdm": "application/vnd.syncml.dm+xml", + "xdp": "application/vnd.adobe.xdp+xml", + "xdssc": "application/dssc+xml", + "xdw": "application/vnd.fujixerox.docuworks", + "xenc": "application/xenc+xml", + "xer": "application/patch-ops-error+xml", + "xfdf": "application/vnd.adobe.xfdf", + "xfdl": "application/vnd.xfdl", + "xht": "application/xhtml+xml", + "xhtml": "application/xhtml+xml", + "xhvml": "application/xv+xml", + "xif": "image/vnd.xiff", + "xla": "application/vnd.ms-excel", + "xlam": "application/vnd.ms-excel.addin.macroenabled.12", + "xlc": "application/vnd.ms-excel", + "xlf": "application/x-xliff+xml", + "xlm": "application/vnd.ms-excel", + "xls": "application/vnd.ms-excel", + "xlsb": "application/vnd.ms-excel.sheet.binary.macroenabled.12", + "xlsm": "application/vnd.ms-excel.sheet.macroenabled.12", + "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "xlt": "application/vnd.ms-excel", + "xltm": "application/vnd.ms-excel.template.macroenabled.12", + "xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + "xlw": "application/vnd.ms-excel", + "xm": "audio/xm", + "xml": "text/xml", + "xo": "application/vnd.olpc-sugar", + "xop": "application/xop+xml", + "xpi": "application/x-xpinstall", + "xpl": "application/xproc+xml", + "xpm": "image/x-xpixmap", + "xpr": "application/vnd.is-xpr", + "xps": "application/vnd.ms-xpsdocument", + "xpw": "application/vnd.intercon.formnet", + "xpx": "application/vnd.intercon.formnet", + "xsd": "application/xml", + "xsl": "application/xml", + "xslt": "application/xslt+xml", + "xsm": "application/vnd.syncml+xml", + "xspf": "application/xspf+xml", + "xul": "application/vnd.mozilla.xul+xml", + "xvm": "application/xv+xml", + "xvml": "application/xv+xml", + "xwd": "image/x-xwindowdump", + "xyz": "chemical/x-xyz", + "xz": "application/x-xz", + "yaml": "text/yaml", + "yang": "application/yang", + "yin": "application/yin+xml", + "yml": "text/yaml", + "ymp": "text/x-suse-ymp", + "z1": "application/x-zmachine", + "z2": "application/x-zmachine", + "z3": "application/x-zmachine", + "z4": "application/x-zmachine", + "z5": "application/x-zmachine", + "z6": "application/x-zmachine", + "z7": "application/x-zmachine", + "z8": "application/x-zmachine", + "zaz": "application/vnd.zzazz.deck+xml", + "zip": "application/zip", + "zir": "application/vnd.zul", + "zirz": "application/vnd.zul", + "zmm": "application/vnd.handheld-entertainment+xml", +} var mimes sync.Map func init() { @@ -46,12 +1160,12 @@ func Detect(isDir bool, fn string) string { return defaultMimeDir } - ext := path.Ext(fn) + ext := strings.ToLower(strings.TrimPrefix(path.Ext(fn), ".")) mimeType := getCustomMime(ext) if mimeType == "" { - mimeType = gomime.TypeByExtension(ext) + mimeType = mimeTypes[ext] } if mimeType == "" { diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go index 9bd39f3dcd..115fe727f5 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/jsoncs3.go @@ -337,17 +337,6 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla eg.Go(func() error { err := m.Cache.Add(ctx, md.Id.StorageId, md.Id.SpaceId, shareID, s) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.Cache.Sync(ctx, md.Id.StorageId, md.Id.SpaceId); err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, err.Error()) - - return err - } - - err = m.Cache.Add(ctx, md.Id.StorageId, md.Id.SpaceId, shareID, s) - // TODO try more often? - } if err != nil { span.RecordError(err) @@ -359,17 +348,6 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla eg.Go(func() error { err := m.CreatedCache.Add(ctx, s.GetCreator().GetOpaqueId(), shareID) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.CreatedCache.Sync(ctx, s.GetCreator().GetOpaqueId()); err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, err.Error()) - - return err - } - - err = m.CreatedCache.Add(ctx, s.GetCreator().GetOpaqueId(), shareID) - // TODO try more often? - } if err != nil { span.RecordError(err) @@ -391,16 +369,6 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla State: collaboration.ShareState_SHARE_STATE_PENDING, } err := m.UserReceivedStates.Add(ctx, userid, spaceID, rs) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.UserReceivedStates.Sync(ctx, s.GetCreator().GetOpaqueId()); err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, err.Error()) - return err - } - - err = m.UserReceivedStates.Add(ctx, userid, spaceID, rs) - // TODO try more often? - } if err != nil { span.RecordError(err) @@ -413,16 +381,6 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla eg.Go(func() error { groupid := g.Grantee.GetGroupId().GetOpaqueId() err := m.GroupReceivedCache.Add(ctx, groupid, shareID) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.GroupReceivedCache.Sync(ctx, groupid); err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, err.Error()) - return err - } - - err = m.GroupReceivedCache.Add(ctx, groupid, shareID) - // TODO try more often? - } if err != nil { span.RecordError(err) @@ -445,13 +403,11 @@ func (m *Manager) Share(ctx context.Context, md *provider.ResourceInfo, g *colla // getByID must be called in a lock-controlled block. func (m *Manager) getByID(ctx context.Context, id *collaboration.ShareId) (*collaboration.Share, error) { storageID, spaceID, _ := shareid.Decode(id.OpaqueId) - // sync cache, maybe our data is outdated - err := m.Cache.Sync(ctx, storageID, spaceID) + + share, err := m.Cache.Get(ctx, storageID, spaceID, id.OpaqueId) if err != nil { return nil, err } - - share := m.Cache.Get(storageID, spaceID, id.OpaqueId) if share == nil { return nil, errtypes.NotFound(id.String()) } @@ -460,12 +416,10 @@ func (m *Manager) getByID(ctx context.Context, id *collaboration.ShareId) (*coll // getByKey must be called in a lock-controlled block. func (m *Manager) getByKey(ctx context.Context, key *collaboration.ShareKey) (*collaboration.Share, error) { - err := m.Cache.Sync(ctx, key.ResourceId.StorageId, key.ResourceId.SpaceId) + spaceShares, err := m.Cache.ListSpace(ctx, key.ResourceId.StorageId, key.ResourceId.SpaceId) if err != nil { return nil, err } - - spaceShares := m.Cache.ListSpace(key.ResourceId.StorageId, key.ResourceId.SpaceId) for _, share := range spaceShares.Shares { if utils.GranteeEqual(key.Grantee, share.Grantee) && utils.ResourceIDEqual(share.ResourceId, key.ResourceId) { return share, nil @@ -678,15 +632,11 @@ func (m *Manager) listSharesByIDs(ctx context.Context, user *userv1beta1.User, f var ss []*collaboration.Share for providerID, spaces := range providerSpaces { for spaceID := range spaces { - err := m.Cache.Sync(ctx, providerID, spaceID) + shares, err := m.Cache.ListSpace(ctx, providerID, spaceID) if err != nil { - span.RecordError(err) - span.SetStatus(codes.Error, err.Error()) return nil, err } - shares := m.Cache.ListSpace(providerID, spaceID) - for _, s := range shares.Shares { if share.IsExpired(s) { if err := m.removeShare(ctx, s); err != nil { @@ -737,20 +687,20 @@ func (m *Manager) listCreatedShares(ctx context.Context, user *userv1beta1.User, ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "listCreatedShares") defer span.End() - var ss []*collaboration.Share - - if err := m.CreatedCache.Sync(ctx, user.Id.OpaqueId); err != nil { + list, err := m.CreatedCache.List(ctx, user.Id.OpaqueId) + if err != nil { span.RecordError(err) span.SetStatus(codes.Error, err.Error()) - return ss, err + return nil, err } - for ssid, spaceShareIDs := range m.CreatedCache.List(user.Id.OpaqueId) { + + var ss []*collaboration.Share + for ssid, spaceShareIDs := range list { storageID, spaceID, _ := shareid.Decode(ssid) - err := m.Cache.Sync(ctx, storageID, spaceID) + spaceShares, err := m.Cache.ListSpace(ctx, storageID, spaceID) if err != nil { continue } - spaceShares := m.Cache.ListSpace(storageID, spaceID) for shareid := range spaceShareIDs.IDs { s := spaceShares.Shares[shareid] if s == nil { @@ -800,10 +750,11 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati // first collect all spaceids the user has access to as a group member for _, group := range user.Groups { - if err := m.GroupReceivedCache.Sync(ctx, group); err != nil { + list, err := m.GroupReceivedCache.List(ctx, group) + if err != nil { continue // ignore error, cache will be updated on next read } - for ssid, spaceShareIDs := range m.GroupReceivedCache.List(group) { + for ssid, spaceShareIDs := range list { // add a pending entry, the state will be updated // when reading the received shares below if they have already been accepted or denied var rs *receivedsharecache.Space @@ -825,6 +776,7 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati } // add all spaces the user has receved shares for, this includes mount points and share state for groups + // TODO: rewrite this code to not use the internal strucs anymore (e.g. by adding a List method). Sync can then be made private. _ = m.UserReceivedStates.Sync(ctx, user.Id.OpaqueId) // ignore error, cache will be updated on next read if m.UserReceivedStates.ReceivedSpaces[user.Id.OpaqueId] != nil { @@ -872,13 +824,9 @@ func (m *Manager) ListReceivedShares(ctx context.Context, filters []*collaborati g.Go(func() error { for w := range work { storageID, spaceID, _ := shareid.Decode(w.ssid) - err := m.Cache.Sync(ctx, storageID, spaceID) - if err != nil { - continue - } for shareID, state := range w.rspace.States { - s := m.Cache.Get(storageID, spaceID, shareID) - if s == nil { + s, err := m.Cache.Get(ctx, storageID, spaceID, shareID) + if err != nil || s == nil { continue } if share.IsExpired(s) { @@ -952,9 +900,8 @@ func (m *Manager) convert(ctx context.Context, userID string, s *collaboration.S storageID, spaceID, _ := shareid.Decode(s.Id.OpaqueId) - _ = m.UserReceivedStates.Sync(ctx, userID) // ignore error, cache will be updated on next read - state := m.UserReceivedStates.Get(userID, storageID+shareid.IDDelimiter+spaceID, s.Id.GetOpaqueId()) - if state != nil { + state, err := m.UserReceivedStates.Get(ctx, userID, storageID+shareid.IDDelimiter+spaceID, s.Id.GetOpaqueId()) + if err == nil && state != nil { rs.State = state.State rs.MountPoint = state.MountPoint } @@ -1031,14 +978,6 @@ func (m *Manager) UpdateReceivedShare(ctx context.Context, receivedShare *collab userID := ctxpkg.ContextMustGetUser(ctx) err = m.UserReceivedStates.Add(ctx, userID.GetId().GetOpaqueId(), rs.Share.ResourceId.StorageId+shareid.IDDelimiter+rs.Share.ResourceId.SpaceId, rs) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - // when persisting fails, download, readd and persist again - if err := m.UserReceivedStates.Sync(ctx, userID.GetId().GetOpaqueId()); err != nil { - return nil, err - } - err = m.UserReceivedStates.Add(ctx, userID.GetId().GetOpaqueId(), rs.Share.ResourceId.StorageId+shareid.IDDelimiter+rs.Share.ResourceId.SpaceId, rs) - // TODO try more often? - } if err != nil { return nil, err } @@ -1120,29 +1059,13 @@ func (m *Manager) removeShare(ctx context.Context, s *collaboration.Share) error eg.Go(func() error { storageID, spaceID, _ := shareid.Decode(s.Id.OpaqueId) err := m.Cache.Remove(ctx, storageID, spaceID, s.Id.OpaqueId) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.Cache.Sync(ctx, storageID, spaceID); err != nil { - return err - } - err = m.Cache.Remove(ctx, storageID, spaceID, s.Id.OpaqueId) - // TODO try more often? - } return err }) eg.Go(func() error { // remove from created cache - err := m.CreatedCache.Remove(ctx, s.GetCreator().GetOpaqueId(), s.Id.OpaqueId) - if _, ok := err.(errtypes.IsPreconditionFailed); ok { - if err := m.CreatedCache.Sync(ctx, s.GetCreator().GetOpaqueId()); err != nil { - return err - } - err = m.CreatedCache.Remove(ctx, s.GetCreator().GetOpaqueId(), s.Id.OpaqueId) - // TODO try more often? - } - - return err + return m.CreatedCache.Remove(ctx, s.GetCreator().GetOpaqueId(), s.Id.OpaqueId) }) // TODO remove from grantee cache diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go index 08cbb06000..2d80d2c190 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/providercache/providercache.go @@ -127,6 +127,13 @@ func (c *Cache) Add(ctx context.Context, storageID, spaceID, shareID string, sha unlock := c.LockSpace(spaceID) defer unlock() + if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { + err := c.syncWithLock(ctx, storageID, spaceID) + if err != nil { + return err + } + } + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Add") defer span.End() span.SetAttributes(attribute.String("cs3.storageid", storageID), attribute.String("cs3.spaceid", spaceID), attribute.String("cs3.shareid", shareID)) @@ -140,9 +147,25 @@ func (c *Cache) Add(ctx context.Context, storageID, spaceID, shareID string, sha return fmt.Errorf("missing share id") } c.initializeIfNeeded(storageID, spaceID) - c.Providers[storageID].Spaces[spaceID].Shares[shareID] = share - return c.Persist(ctx, storageID, spaceID) + persistFunc := func() error { + c.Providers[storageID].Spaces[spaceID].Shares[shareID] = share + + return c.Persist(ctx, storageID, spaceID) + } + err := persistFunc() + + if _, ok := err.(errtypes.IsPreconditionFailed); ok { + if err := c.syncWithLock(ctx, storageID, spaceID); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) + + return err + } + + err = persistFunc() + } + return err } // Remove removes a share from the cache @@ -150,38 +173,68 @@ func (c *Cache) Remove(ctx context.Context, storageID, spaceID, shareID string) unlock := c.LockSpace(spaceID) defer unlock() + if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { + err := c.syncWithLock(ctx, storageID, spaceID) + if err != nil { + return err + } + } + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Remove") defer span.End() span.SetAttributes(attribute.String("cs3.storageid", storageID), attribute.String("cs3.spaceid", spaceID), attribute.String("cs3.shareid", shareID)) - if c.Providers[storageID] == nil || - c.Providers[storageID].Spaces[spaceID] == nil { - return nil - } - delete(c.Providers[storageID].Spaces[spaceID].Shares, shareID) + persistFunc := func() error { + if c.Providers[storageID] == nil || + c.Providers[storageID].Spaces[spaceID] == nil { + return nil + } + delete(c.Providers[storageID].Spaces[spaceID].Shares, shareID) - return c.Persist(ctx, storageID, spaceID) + return c.Persist(ctx, storageID, spaceID) + } + err := persistFunc() + if _, ok := err.(errtypes.IsPreconditionFailed); ok { + if err := c.syncWithLock(ctx, storageID, spaceID); err != nil { + return err + } + err = persistFunc() + } + + return err } // Get returns one entry from the cache -func (c *Cache) Get(storageID, spaceID, shareID string) *collaboration.Share { +func (c *Cache) Get(ctx context.Context, storageID, spaceID, shareID string) (*collaboration.Share, error) { + // sync cache, maybe our data is outdated + err := c.Sync(ctx, storageID, spaceID) + if err != nil { + return nil, err + } + if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { - return nil + return nil, nil } - return c.Providers[storageID].Spaces[spaceID].Shares[shareID] + return c.Providers[storageID].Spaces[spaceID].Shares[shareID], nil } // ListSpace returns the list of shares in a given space -func (c *Cache) ListSpace(storageID, spaceID string) *Shares { - if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { - return &Shares{} +func (c *Cache) ListSpace(ctx context.Context, storageID, spaceID string) (*Shares, error) { + // sync cache, maybe our data is outdated + err := c.Sync(ctx, storageID, spaceID) + if err != nil { + return nil, err } - return c.Providers[storageID].Spaces[spaceID] + + if c.Providers[storageID] == nil || c.Providers[storageID].Spaces[spaceID] == nil { + return &Shares{}, nil + } + return c.Providers[storageID].Spaces[spaceID], nil } -// PersistWithTime persists the data of one space if it has not been modified since the given mtime -func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, mtime time.Time) error { +// Persist persists the data of one space +func (c *Cache) Persist(ctx context.Context, storageID, spaceID string) error { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "PersistWithTime") defer span.End() span.SetAttributes(attribute.String("cs3.storageid", storageID), attribute.String("cs3.spaceid", spaceID)) @@ -192,7 +245,7 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, } oldMtime := c.Providers[storageID].Spaces[spaceID].Mtime - c.Providers[storageID].Spaces[spaceID].Mtime = mtime + c.Providers[storageID].Spaces[spaceID].Mtime = time.Now() // FIXME there is a race when between this time now and the below Uploed another process also updates the file -> we need a lock createdBytes, err := json.Marshal(c.Providers[storageID].Spaces[spaceID]) @@ -213,7 +266,8 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, if err = c.storage.Upload(ctx, metadata.UploadRequest{ Path: jsonPath, Content: createdBytes, - IfUnmodifiedSince: c.Providers[storageID].Spaces[spaceID].Mtime, + IfUnmodifiedSince: oldMtime, + MTime: c.Providers[storageID].Spaces[spaceID].Mtime, }); err != nil { c.Providers[storageID].Spaces[spaceID].Mtime = oldMtime span.RecordError(err) @@ -224,16 +278,15 @@ func (c *Cache) PersistWithTime(ctx context.Context, storageID, spaceID string, return nil } -// Persist persists the data of one space -func (c *Cache) Persist(ctx context.Context, storageID, spaceID string) error { - return c.PersistWithTime(ctx, storageID, spaceID, time.Now()) -} - // Sync updates the in-memory data with the data from the storage if it is outdated func (c *Cache) Sync(ctx context.Context, storageID, spaceID string) error { unlock := c.LockSpace(spaceID) defer unlock() + return c.syncWithLock(ctx, storageID, spaceID) +} + +func (c *Cache) syncWithLock(ctx context.Context, storageID, spaceID string) error { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Sync") defer span.End() diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go index 4810f1ff13..c4d3aca072 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/receivedsharecache/receivedsharecache.go @@ -95,38 +95,62 @@ func (c *Cache) Add(ctx context.Context, userID, spaceID string, rs *collaborati unlock := c.lockUser(userID) defer unlock() + if c.ReceivedSpaces[userID] == nil { + err := c.syncWithLock(ctx, userID) + if err != nil { + return err + } + } + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Add") defer span.End() span.SetAttributes(attribute.String("cs3.userid", userID), attribute.String("cs3.spaceid", spaceID)) - if c.ReceivedSpaces[userID] == nil { - c.ReceivedSpaces[userID] = &Spaces{ - Spaces: map[string]*Space{}, + persistFunc := func() error { + if c.ReceivedSpaces[userID] == nil { + c.ReceivedSpaces[userID] = &Spaces{ + Spaces: map[string]*Space{}, + } + } + if c.ReceivedSpaces[userID].Spaces[spaceID] == nil { + c.ReceivedSpaces[userID].Spaces[spaceID] = &Space{} } - } - if c.ReceivedSpaces[userID].Spaces[spaceID] == nil { - c.ReceivedSpaces[userID].Spaces[spaceID] = &Space{} - } - receivedSpace := c.ReceivedSpaces[userID].Spaces[spaceID] - receivedSpace.Mtime = time.Now() - if receivedSpace.States == nil { - receivedSpace.States = map[string]*State{} - } - receivedSpace.States[rs.Share.Id.GetOpaqueId()] = &State{ - State: rs.State, - MountPoint: rs.MountPoint, - } + receivedSpace := c.ReceivedSpaces[userID].Spaces[spaceID] + receivedSpace.Mtime = time.Now() + if receivedSpace.States == nil { + receivedSpace.States = map[string]*State{} + } + receivedSpace.States[rs.Share.Id.GetOpaqueId()] = &State{ + State: rs.State, + MountPoint: rs.MountPoint, + } - return c.persist(ctx, userID) + return c.persist(ctx, userID) + } + err := persistFunc() + if _, ok := err.(errtypes.IsPreconditionFailed); ok { + if err := c.syncWithLock(ctx, userID); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) + return err + } + + err = persistFunc() + } + return err } // Get returns one entry from the cache -func (c *Cache) Get(userID, spaceID, shareID string) *State { - if c.ReceivedSpaces[userID] == nil || c.ReceivedSpaces[userID].Spaces[spaceID] == nil { - return nil +func (c *Cache) Get(ctx context.Context, userID, spaceID, shareID string) (*State, error) { + err := c.Sync(ctx, userID) + if err != nil { + return nil, err } - return c.ReceivedSpaces[userID].Spaces[spaceID].States[shareID] + if c.ReceivedSpaces[userID] == nil || c.ReceivedSpaces[userID].Spaces[spaceID] == nil { + return nil, nil + } + return c.ReceivedSpaces[userID].Spaces[spaceID].States[shareID], nil } // Sync updates the in-memory data with the data from the storage if it is outdated @@ -134,6 +158,10 @@ func (c *Cache) Sync(ctx context.Context, userID string) error { unlock := c.lockUser(userID) defer unlock() + return c.syncWithLock(ctx, userID) +} + +func (c *Cache) syncWithLock(ctx context.Context, userID string) error { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Sync") defer span.End() span.SetAttributes(attribute.String("cs3.userid", userID)) @@ -222,7 +250,8 @@ func (c *Cache) persist(ctx context.Context, userID string) error { if err = c.storage.Upload(ctx, metadata.UploadRequest{ Path: jsonPath, Content: createdBytes, - IfUnmodifiedSince: c.ReceivedSpaces[userID].Mtime, + IfUnmodifiedSince: oldMtime, + MTime: c.ReceivedSpaces[userID].Mtime, }); err != nil { c.ReceivedSpaces[userID].Mtime = oldMtime span.RecordError(err) diff --git a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go index f4058d4594..1814e3447e 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/share/manager/jsoncs3/sharecache/sharecache.go @@ -92,6 +92,13 @@ func (c *Cache) Add(ctx context.Context, userid, shareID string) error { unlock := c.lockUser(userid) defer unlock() + if c.UserShares[userid] == nil { + err := c.syncWithLock(ctx, userid) + if err != nil { + return err + } + } + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Add") defer span.End() span.SetAttributes(attribute.String("cs3.userid", userid), attribute.String("cs3.shareid", shareID)) @@ -99,22 +106,37 @@ func (c *Cache) Add(ctx context.Context, userid, shareID string) error { storageid, spaceid, _ := shareid.Decode(shareID) ssid := storageid + shareid.IDDelimiter + spaceid - now := time.Now() - if c.UserShares[userid] == nil { - c.UserShares[userid] = &UserShareCache{ - UserShares: map[string]*SpaceShareIDs{}, + persistFunc := func() error { + now := time.Now() + if c.UserShares[userid] == nil { + c.UserShares[userid] = &UserShareCache{ + UserShares: map[string]*SpaceShareIDs{}, + } } - } - if c.UserShares[userid].UserShares[ssid] == nil { - c.UserShares[userid].UserShares[ssid] = &SpaceShareIDs{ - IDs: map[string]struct{}{}, + if c.UserShares[userid].UserShares[ssid] == nil { + c.UserShares[userid].UserShares[ssid] = &SpaceShareIDs{ + IDs: map[string]struct{}{}, + } } + // add share id + c.UserShares[userid].UserShares[ssid].Mtime = now + c.UserShares[userid].UserShares[ssid].IDs[shareID] = struct{}{} + return c.Persist(ctx, userid) } - // add share id - c.UserShares[userid].Mtime = now - c.UserShares[userid].UserShares[ssid].Mtime = now - c.UserShares[userid].UserShares[ssid].IDs[shareID] = struct{}{} - return c.Persist(ctx, userid) + + err := persistFunc() + if _, ok := err.(errtypes.IsPreconditionFailed); ok { + if err := c.syncWithLock(ctx, userid); err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, err.Error()) + + return err + } + + err = persistFunc() + // TODO try more often? + } + return err } // Remove removes a share for the given user @@ -122,6 +144,13 @@ func (c *Cache) Remove(ctx context.Context, userid, shareID string) error { unlock := c.lockUser(userid) defer unlock() + if c.UserShares[userid] == nil { + err := c.syncWithLock(ctx, userid) + if err != nil { + return err + } + } + ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Remove") defer span.End() span.SetAttributes(attribute.String("cs3.userid", userid), attribute.String("cs3.shareid", shareID)) @@ -129,29 +158,44 @@ func (c *Cache) Remove(ctx context.Context, userid, shareID string) error { storageid, spaceid, _ := shareid.Decode(shareID) ssid := storageid + shareid.IDDelimiter + spaceid - now := time.Now() - if c.UserShares[userid] == nil { - c.UserShares[userid] = &UserShareCache{ - Mtime: now, - UserShares: map[string]*SpaceShareIDs{}, + persistFunc := func() error { + if c.UserShares[userid] == nil { + c.UserShares[userid] = &UserShareCache{ + UserShares: map[string]*SpaceShareIDs{}, + } } + + if c.UserShares[userid].UserShares[ssid] != nil { + // remove share id + c.UserShares[userid].UserShares[ssid].Mtime = time.Now() + delete(c.UserShares[userid].UserShares[ssid].IDs, shareID) + } + + return c.Persist(ctx, userid) } - if c.UserShares[userid].UserShares[ssid] != nil { - // remove share id - c.UserShares[userid].Mtime = now - c.UserShares[userid].UserShares[ssid].Mtime = now - delete(c.UserShares[userid].UserShares[ssid].IDs, shareID) + err := persistFunc() + if _, ok := err.(errtypes.IsPreconditionFailed); ok { + if err := c.syncWithLock(ctx, userid); err != nil { + return err + } + err = persistFunc() } - return c.Persist(ctx, userid) + return err } // List return the list of spaces/shares for the given user/group -func (c *Cache) List(userid string) map[string]SpaceShareIDs { +func (c *Cache) List(ctx context.Context, userid string) (map[string]SpaceShareIDs, error) { + unlock := c.lockUser(userid) + defer unlock() + if err := c.syncWithLock(ctx, userid); err != nil { + return nil, err + } + r := map[string]SpaceShareIDs{} if c.UserShares[userid] == nil { - return r + return r, nil } for ssid, cached := range c.UserShares[userid].UserShares { @@ -160,14 +204,10 @@ func (c *Cache) List(userid string) map[string]SpaceShareIDs { IDs: cached.IDs, } } - return r + return r, nil } -// Sync updates the in-memory data with the data from the storage if it is outdated -func (c *Cache) Sync(ctx context.Context, userID string) error { - unlock := c.lockUser(userID) - defer unlock() - +func (c *Cache) syncWithLock(ctx context.Context, userID string) error { ctx, span := appctx.GetTracerProvider(ctx).Tracer(tracerName).Start(ctx, "Sync") defer span.End() span.SetAttributes(attribute.String("cs3.userid", userID)) @@ -253,7 +293,8 @@ func (c *Cache) Persist(ctx context.Context, userid string) error { if err = c.storage.Upload(ctx, metadata.UploadRequest{ Path: jsonPath, Content: createdBytes, - IfUnmodifiedSince: c.UserShares[userid].Mtime, + IfUnmodifiedSince: oldMtime, + MTime: c.UserShares[userid].Mtime, }); err != nil { c.UserShares[userid].Mtime = oldMtime span.RecordError(err) diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/fs/s3ng/blobstore/blobstore.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/fs/s3ng/blobstore/blobstore.go index 8af18fa82b..9c744e7540 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/fs/s3ng/blobstore/blobstore.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/fs/s3ng/blobstore/blobstore.go @@ -71,9 +71,9 @@ func (bs *Blobstore) Upload(node *node.Node, source string) error { } defer reader.Close() - _, err1 := bs.client.PutObject(context.Background(), bs.bucket, bs.path(node), reader, node.Blobsize, minio.PutObjectOptions{ContentType: "application/octet-stream"}) + _, err = bs.client.PutObject(context.Background(), bs.bucket, bs.path(node), reader, node.Blobsize, minio.PutObjectOptions{ContentType: "application/octet-stream", SendContentMd5: true}) - if err1 != nil { + if err != nil { return errors.Wrapf(err, "could not store object '%s' into bucket '%s'", bs.path(node), bs.bucket) } return nil diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node/node.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node/node.go index 327437bccb..a3e31ee90b 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node/node.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/node/node.go @@ -60,7 +60,7 @@ func init() { // Define keys and values used in the node metadata const ( - LockdiscoveryKey = "DAV:lockdiscovery" + LockdiscoveryKey = "lockdiscovery" FavoriteKey = "http://owncloud.org/ns/favorite" ShareTypesKey = "http://owncloud.org/ns/share-types" ChecksumsKey = "http://owncloud.org/ns/checksums" diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/upload.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/upload.go index 7dcf5cd120..50a629c43e 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/upload.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/upload/upload.go @@ -292,6 +292,7 @@ func (upload *Upload) FinishUpload(_ context.Context) error { err = upload.Finalize() Cleanup(upload, err != nil, false) if err != nil { + log.Error().Err(err).Msg("failed to upload") return err } } diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go index d271b7e778..977066e0cb 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/cs3.go @@ -25,6 +25,7 @@ import ( "io" "net/http" "os" + "strconv" "time" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" @@ -34,7 +35,6 @@ import ( types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" ctxpkg "github.com/cs3org/reva/v2/pkg/ctx" "github.com/cs3org/reva/v2/pkg/errtypes" - "github.com/cs3org/reva/v2/pkg/rgrpc/status" "github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/v2/pkg/utils" "go.opentelemetry.io/otel" @@ -149,6 +149,7 @@ func (cs3 *CS3) Upload(ctx context.Context, req UploadRequest) error { } ifuReq := &provider.InitiateFileUploadRequest{ + Opaque: &types.Opaque{}, Ref: &provider.Reference{ ResourceId: cs3.SpaceRoot, Path: utils.MakeRelativePath(req.Path), @@ -165,13 +166,17 @@ func (cs3 *CS3) Upload(ctx context.Context, req UploadRequest) error { IfUnmodifiedSince: utils.TimeToTS(req.IfUnmodifiedSince), } } + if req.MTime != (time.Time{}) { + // The format of the X-OC-Mtime header is ., e.g. '1691053416.934129485' + ifuReq.Opaque = utils.AppendPlainToOpaque(ifuReq.Opaque, "X-OC-Mtime", strconv.Itoa(int(req.MTime.Unix()))+"."+strconv.Itoa(req.MTime.Nanosecond())) + } res, err := client.InitiateFileUpload(ctx, ifuReq) if err != nil { return err } if res.Status.Code != rpc.Code_CODE_OK { - return status.NewErrorFromCode(res.Status.Code, "cs3 metadata SimpleUpload") + return errtypes.NewErrtypeFromStatus(res.Status) } var endpoint string diff --git a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/storage.go b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/storage.go index be695374b3..2933f2a50a 100644 --- a/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/storage.go +++ b/vendor/github.com/cs3org/reva/v2/pkg/storage/utils/metadata/storage.go @@ -37,6 +37,7 @@ type UploadRequest struct { IfMatchEtag string IfUnmodifiedSince time.Time + MTime time.Time } // Storage is the interface to maintain metadata in a storage diff --git a/vendor/github.com/cubewise-code/go-mime/LICENSE b/vendor/github.com/cubewise-code/go-mime/LICENSE deleted file mode 100644 index fde8226e6d..0000000000 --- a/vendor/github.com/cubewise-code/go-mime/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Cubewise CODE - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/cubewise-code/go-mime/README.md b/vendor/github.com/cubewise-code/go-mime/README.md deleted file mode 100644 index 9dc0e19bff..0000000000 --- a/vendor/github.com/cubewise-code/go-mime/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# go-mime -Get the mime type / content type of a file from its extension without external dependencies - -# Usage -``` -go get github.com/cubewise-code/go-mime -``` - -```go -import ( - "github.com/cubewise-code/go-mime" -) - -// Get the file extension -ext := filepath.Ext(fileName) -// An empty string is returned if the extension is not found -contentType := gomime.TypeByExtension(ext) - -``` - -# Why -We wanted a simple mime library that gives a consistent result on each environment. The golang mime package (https://golang.org/pkg/mime/) loads the list of mime types using the OS, meaning you get a different list depending on OS and OS version. On Windows this depends on the programs installed and whether the user running the process has access to the registry. - -# Mime Source -The mime list are sourced from here: https://github.com/micnic/mime.json diff --git a/vendor/github.com/cubewise-code/go-mime/go-mime.go b/vendor/github.com/cubewise-code/go-mime/go-mime.go deleted file mode 100644 index 8ae33d537c..0000000000 --- a/vendor/github.com/cubewise-code/go-mime/go-mime.go +++ /dev/null @@ -1,1128 +0,0 @@ -package gomime - -import "strings" - -var mimeTypes = map[string]string{ - "123": "application/vnd.lotus-1-2-3", - "3dml": "text/vnd.in3d.3dml", - "3ds": "image/x-3ds", - "3g2": "video/3gpp2", - "3gp": "video/3gpp", - "3gpp": "video/3gpp", - "7z": "application/x-7z-compressed", - "aab": "application/x-authorware-bin", - "aac": "audio/x-aac", - "aam": "application/x-authorware-map", - "aas": "application/x-authorware-seg", - "abw": "application/x-abiword", - "ac": "application/pkix-attr-cert", - "acc": "application/vnd.americandynamics.acc", - "ace": "application/x-ace-compressed", - "acu": "application/vnd.acucobol", - "acutc": "application/vnd.acucorp", - "adp": "audio/adpcm", - "aep": "application/vnd.audiograph", - "afm": "application/x-font-type1", - "afp": "application/vnd.ibm.modcap", - "ahead": "application/vnd.ahead.space", - "ai": "application/postscript", - "aif": "audio/x-aiff", - "aifc": "audio/x-aiff", - "aiff": "audio/x-aiff", - "air": "application/vnd.adobe.air-application-installer-package+zip", - "ait": "application/vnd.dvb.ait", - "ami": "application/vnd.amiga.ami", - "apk": "application/vnd.android.package-archive", - "apng": "image/apng", - "appcache": "text/cache-manifest", - "application": "application/x-ms-application", - "apr": "application/vnd.lotus-approach", - "arc": "application/x-freearc", - "arj": "application/x-arj", - "arw": "image/x-sony-arw", - "asc": "application/pgp-signature", - "asf": "video/x-ms-asf", - "asm": "text/x-asm", - "aso": "application/vnd.accpac.simply.aso", - "asx": "video/x-ms-asf", - "atc": "application/vnd.acucorp", - "atom": "application/atom+xml", - "atomcat": "application/atomcat+xml", - "atomsvc": "application/atomsvc+xml", - "atx": "application/vnd.antix.game-component", - "au": "audio/basic", - "avi": "video/x-msvideo", - "aw": "application/applixware", - "azf": "application/vnd.airzip.filesecure.azf", - "azs": "application/vnd.airzip.filesecure.azs", - "azv": "image/vnd.airzip.accelerator.azv", - "azw": "application/vnd.amazon.ebook", - "bat": "application/x-msdownload", - "bcpio": "application/x-bcpio", - "bdf": "application/x-font-bdf", - "bdm": "application/vnd.syncml.dm+wbxml", - "bdoc": "application/x-bdoc", - "bed": "application/vnd.realvnc.bed", - "bh2": "application/vnd.fujitsu.oasysprs", - "bin": "application/octet-stream", - "blb": "application/x-blorb", - "blorb": "application/x-blorb", - "bmi": "application/vnd.bmi", - "bmp": "image/x-ms-bmp", - "book": "application/vnd.framemaker", - "box": "application/vnd.previewsystems.box", - "boz": "application/x-bzip2", - "bpk": "application/octet-stream", - "btif": "image/prs.btif", - "buffer": "application/octet-stream", - "bz": "application/x-bzip", - "bz2": "application/x-bzip2", - "c": "text/x-c", - "c11amc": "application/vnd.cluetrust.cartomobile-config", - "c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", - "c4d": "application/vnd.clonk.c4group", - "c4f": "application/vnd.clonk.c4group", - "c4g": "application/vnd.clonk.c4group", - "c4p": "application/vnd.clonk.c4group", - "c4u": "application/vnd.clonk.c4group", - "cab": "application/vnd.ms-cab-compressed", - "caf": "audio/x-caf", - "cap": "application/vnd.tcpdump.pcap", - "car": "application/vnd.curl.car", - "cat": "application/vnd.ms-pki.seccat", - "cb7": "application/x-cbr", - "cba": "application/x-cbr", - "cbr": "application/x-cbr", - "cbt": "application/x-cbr", - "cbz": "application/x-cbr", - "cc": "text/x-c", - "cco": "application/x-cocoa", - "cct": "application/x-director", - "ccxml": "application/ccxml+xml", - "cdbcmsg": "application/vnd.contact.cmsg", - "cdf": "application/x-netcdf", - "cdkey": "application/vnd.mediastation.cdkey", - "cdmia": "application/cdmi-capability", - "cdmic": "application/cdmi-container", - "cdmid": "application/cdmi-domain", - "cdmio": "application/cdmi-object", - "cdmiq": "application/cdmi-queue", - "cdx": "chemical/x-cdx", - "cdxml": "application/vnd.chemdraw+xml", - "cdy": "application/vnd.cinderella", - "cer": "application/pkix-cert", - "cfs": "application/x-cfs-compressed", - "cgm": "image/cgm", - "chat": "application/x-chat", - "chm": "application/vnd.ms-htmlhelp", - "chrt": "application/vnd.kde.kchart", - "cif": "chemical/x-cif", - "cii": "application/vnd.anser-web-certificate-issue-initiation", - "cil": "application/vnd.ms-artgalry", - "cla": "application/vnd.claymore", - "class": "application/java-vm", - "clkk": "application/vnd.crick.clicker.keyboard", - "clkp": "application/vnd.crick.clicker.palette", - "clkt": "application/vnd.crick.clicker.template", - "clkw": "application/vnd.crick.clicker.wordbank", - "clkx": "application/vnd.crick.clicker", - "clp": "application/x-msclip", - "cmc": "application/vnd.cosmocaller", - "cmdf": "chemical/x-cmdf", - "cml": "chemical/x-cml", - "cmp": "application/vnd.yellowriver-custom-menu", - "cmx": "image/x-cmx", - "cod": "application/vnd.rim.cod", - "coffee": "text/coffeescript", - "com": "application/x-msdownload", - "conf": "text/plain", - "cpio": "application/x-cpio", - "cpp": "text/x-c", - "cpt": "application/mac-compactpro", - "cr2": "image/x-canon-cr2", - "crd": "application/x-mscardfile", - "crl": "application/pkix-crl", - "crt": "application/x-x509-ca-cert", - "crw": "image/x-canon-crw", - "crx": "application/x-chrome-extension", - "cryptonote": "application/vnd.rig.cryptonote", - "csh": "application/x-csh", - "csl": "application/vnd.citationstyles.style+xml", - "csml": "chemical/x-csml", - "csp": "application/vnd.commonspace", - "css": "text/css", - "cst": "application/x-director", - "csv": "text/csv", - "cu": "application/cu-seeme", - "curl": "text/vnd.curl", - "cww": "application/prs.cww", - "cxt": "application/x-director", - "cxx": "text/x-c", - "dae": "model/vnd.collada+xml", - "daf": "application/vnd.mobius.daf", - "dart": "application/vnd.dart", - "dataless": "application/vnd.fdsn.seed", - "davmount": "application/davmount+xml", - "dbk": "application/docbook+xml", - "dcr": "application/x-director", - "dcurl": "text/vnd.curl.dcurl", - "dd2": "application/vnd.oma.dd2+xml", - "ddd": "application/vnd.fujixerox.ddd", - "deb": "application/x-debian-package", - "def": "text/plain", - "deploy": "application/octet-stream", - "der": "application/x-x509-ca-cert", - "dfac": "application/vnd.dreamfactory", - "dgc": "application/x-dgc-compressed", - "dic": "text/x-c", - "dir": "application/x-director", - "dis": "application/vnd.mobius.dis", - "disposition-notification": "message/disposition-notification", - "dist": "application/octet-stream", - "distz": "application/octet-stream", - "djv": "image/vnd.djvu", - "djvu": "image/vnd.djvu", - "dll": "application/x-msdownload", - "dmg": "application/x-apple-diskimage", - "dmp": "application/vnd.tcpdump.pcap", - "dms": "application/octet-stream", - "dna": "application/vnd.dna", - "dng": "image/x-adobe-dng", - "doc": "application/msword", - "docm": "application/vnd.ms-word.document.macroenabled.12", - "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "dot": "application/msword", - "dotm": "application/vnd.ms-word.template.macroenabled.12", - "dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", - "dp": "application/vnd.osgi.dp", - "dpg": "application/vnd.dpgraph", - "dra": "audio/vnd.dra", - "drle": "image/dicom-rle", - "dsc": "text/prs.lines.tag", - "dssc": "application/dssc+der", - "dtb": "application/x-dtbook+xml", - "dtd": "application/xml-dtd", - "dts": "audio/vnd.dts", - "dtshd": "audio/vnd.dts.hd", - "dump": "application/octet-stream", - "dvb": "video/vnd.dvb.file", - "dvi": "application/x-dvi", - "dwf": "model/vnd.dwf", - "dwg": "image/vnd.dwg", - "dxf": "image/vnd.dxf", - "dxp": "application/vnd.spotfire.dxp", - "dxr": "application/x-director", - "ear": "application/java-archive", - "ecelp4800": "audio/vnd.nuera.ecelp4800", - "ecelp7470": "audio/vnd.nuera.ecelp7470", - "ecelp9600": "audio/vnd.nuera.ecelp9600", - "ecma": "application/ecmascript", - "edm": "application/vnd.novadigm.edm", - "edx": "application/vnd.novadigm.edx", - "efif": "application/vnd.picsel", - "ei6": "application/vnd.pg.osasli", - "elc": "application/octet-stream", - "emf": "image/emf", - "eml": "message/rfc822", - "emma": "application/emma+xml", - "emz": "application/x-msmetafile", - "eol": "audio/vnd.digital-winds", - "eot": "application/vnd.ms-fontobject", - "eps": "application/postscript", - "epub": "application/epub+zip", - "erf": "image/x-epson-erf", - "es": "application/ecmascript", - "es3": "application/vnd.eszigno3+xml", - "esa": "application/vnd.osgi.subsystem", - "esf": "application/vnd.epson.esf", - "et3": "application/vnd.eszigno3+xml", - "etx": "text/x-setext", - "eva": "application/x-eva", - "evy": "application/x-envoy", - "exe": "application/x-msdownload", - "exi": "application/exi", - "exr": "image/aces", - "ext": "application/vnd.novadigm.ext", - "ez": "application/andrew-inset", - "ez2": "application/vnd.ezpix-album", - "ez3": "application/vnd.ezpix-package", - "f": "text/x-fortran", - "f4v": "video/x-f4v", - "f77": "text/x-fortran", - "f90": "text/x-fortran", - "fbs": "image/vnd.fastbidsheet", - "fcdt": "application/vnd.adobe.formscentral.fcdt", - "fcs": "application/vnd.isac.fcs", - "fdf": "application/vnd.fdf", - "fe_launch": "application/vnd.denovo.fcselayout-link", - "fg5": "application/vnd.fujitsu.oasysgp", - "fgd": "application/x-director", - "fh": "image/x-freehand", - "fh4": "image/x-freehand", - "fh5": "image/x-freehand", - "fh7": "image/x-freehand", - "fhc": "image/x-freehand", - "fig": "application/x-xfig", - "fits": "image/fits", - "flac": "audio/x-flac", - "fli": "video/x-fli", - "flo": "application/vnd.micrografx.flo", - "flv": "video/x-flv", - "flw": "application/vnd.kde.kivio", - "flx": "text/vnd.fmi.flexstor", - "fly": "text/vnd.fly", - "fm": "application/vnd.framemaker", - "fnc": "application/vnd.frogans.fnc", - "for": "text/x-fortran", - "fpx": "image/vnd.fpx", - "frame": "application/vnd.framemaker", - "fsc": "application/vnd.fsc.weblaunch", - "fst": "image/vnd.fst", - "ftc": "application/vnd.fluxtime.clip", - "fti": "application/vnd.anser-web-funds-transfer-initiation", - "fvt": "video/vnd.fvt", - "fxp": "application/vnd.adobe.fxp", - "fxpl": "application/vnd.adobe.fxp", - "fzs": "application/vnd.fuzzysheet", - "g2w": "application/vnd.geoplan", - "g3": "image/g3fax", - "g3w": "application/vnd.geospace", - "gac": "application/vnd.groove-account", - "gam": "application/x-tads", - "gbr": "application/rpki-ghostbusters", - "gca": "application/x-gca-compressed", - "gdl": "model/vnd.gdl", - "gdoc": "application/vnd.google-apps.document", - "geo": "application/vnd.dynageo", - "geojson": "application/geo+json", - "gex": "application/vnd.geometry-explorer", - "ggb": "application/vnd.geogebra.file", - "ggt": "application/vnd.geogebra.tool", - "ghf": "application/vnd.groove-help", - "gif": "image/gif", - "gim": "application/vnd.groove-identity-message", - "glb": "model/gltf-binary", - "gltf": "model/gltf+json", - "gml": "application/gml+xml", - "gmx": "application/vnd.gmx", - "gnumeric": "application/x-gnumeric", - "gph": "application/vnd.flographit", - "gpx": "application/gpx+xml", - "gqf": "application/vnd.grafeq", - "gqs": "application/vnd.grafeq", - "gram": "application/srgs", - "gramps": "application/x-gramps-xml", - "gre": "application/vnd.geometry-explorer", - "grv": "application/vnd.groove-injector", - "grxml": "application/srgs+xml", - "gsf": "application/x-font-ghostscript", - "gsheet": "application/vnd.google-apps.spreadsheet", - "gslides": "application/vnd.google-apps.presentation", - "gtar": "application/x-gtar", - "gtm": "application/vnd.groove-tool-message", - "gtw": "model/vnd.gtw", - "gv": "text/vnd.graphviz", - "gxf": "application/gxf", - "gxt": "application/vnd.geonext", - "gz": "application/gzip", - "h": "text/x-c", - "h261": "video/h261", - "h263": "video/h263", - "h264": "video/h264", - "hal": "application/vnd.hal+xml", - "hbci": "application/vnd.hbci", - "hbs": "text/x-handlebars-template", - "hdd": "application/x-virtualbox-hdd", - "hdf": "application/x-hdf", - "heic": "image/heic", - "heics": "image/heic-sequence", - "heif": "image/heif", - "heifs": "image/heif-sequence", - "hh": "text/x-c", - "hjson": "application/hjson", - "hlp": "application/winhlp", - "hpgl": "application/vnd.hp-hpgl", - "hpid": "application/vnd.hp-hpid", - "hps": "application/vnd.hp-hps", - "hqx": "application/mac-binhex40", - "htc": "text/x-component", - "htke": "application/vnd.kenameaapp", - "htm": "text/html", - "html": "text/html", - "hvd": "application/vnd.yamaha.hv-dic", - "hvp": "application/vnd.yamaha.hv-voice", - "hvs": "application/vnd.yamaha.hv-script", - "i2g": "application/vnd.intergeo", - "icc": "application/vnd.iccprofile", - "ice": "x-conference/x-cooltalk", - "icm": "application/vnd.iccprofile", - "ico": "image/x-icon", - "ics": "text/calendar", - "ief": "image/ief", - "ifb": "text/calendar", - "ifm": "application/vnd.shana.informed.formdata", - "iges": "model/iges", - "igl": "application/vnd.igloader", - "igm": "application/vnd.insors.igm", - "igs": "model/iges", - "igx": "application/vnd.micrografx.igx", - "iif": "application/vnd.shana.informed.interchange", - "img": "application/octet-stream", - "imp": "application/vnd.accpac.simply.imp", - "ims": "application/vnd.ms-ims", - "in": "text/plain", - "ini": "text/plain", - "ink": "application/inkml+xml", - "inkml": "application/inkml+xml", - "install": "application/x-install-instructions", - "iota": "application/vnd.astraea-software.iota", - "ipfix": "application/ipfix", - "ipk": "application/vnd.shana.informed.package", - "irm": "application/vnd.ibm.rights-management", - "irp": "application/vnd.irepository.package+xml", - "iso": "application/x-iso9660-image", - "itp": "application/vnd.shana.informed.formtemplate", - "ivp": "application/vnd.immervision-ivp", - "ivu": "application/vnd.immervision-ivu", - "jad": "text/vnd.sun.j2me.app-descriptor", - "jade": "text/jade", - "jam": "application/vnd.jam", - "jar": "application/java-archive", - "jardiff": "application/x-java-archive-diff", - "java": "text/x-java-source", - "jisp": "application/vnd.jisp", - "jls": "image/jls", - "jlt": "application/vnd.hp-jlyt", - "jng": "image/x-jng", - "jnlp": "application/x-java-jnlp-file", - "joda": "application/vnd.joost.joda-archive", - "jp2": "image/jp2", - "jpe": "image/jpeg", - "jpeg": "image/jpeg", - "jpf": "image/jpx", - "jpg": "image/jpeg", - "jpg2": "image/jp2", - "jpgm": "video/jpm", - "jpgv": "video/jpeg", - "jpm": "video/jpm", - "jpx": "image/jpx", - "js": "application/javascript", - "json": "application/json", - "json5": "application/json5", - "jsonld": "application/ld+json", - "jsonml": "application/jsonml+json", - "jsx": "text/jsx", - "k25": "image/x-kodak-k25", - "kar": "audio/midi", - "karbon": "application/vnd.kde.karbon", - "kdc": "image/x-kodak-kdc", - "keynote": "application/vnd.apple.keynote", - "kfo": "application/vnd.kde.kformula", - "kia": "application/vnd.kidspiration", - "kml": "application/vnd.google-earth.kml+xml", - "kmz": "application/vnd.google-earth.kmz", - "kne": "application/vnd.kinar", - "knp": "application/vnd.kinar", - "kon": "application/vnd.kde.kontour", - "kpr": "application/vnd.kde.kpresenter", - "kpt": "application/vnd.kde.kpresenter", - "kpxx": "application/vnd.ds-keypoint", - "ksp": "application/vnd.kde.kspread", - "ktr": "application/vnd.kahootz", - "ktx": "image/ktx", - "ktz": "application/vnd.kahootz", - "kwd": "application/vnd.kde.kword", - "kwt": "application/vnd.kde.kword", - "lasxml": "application/vnd.las.las+xml", - "latex": "application/x-latex", - "lbd": "application/vnd.llamagraphics.life-balance.desktop", - "lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", - "les": "application/vnd.hhe.lesson-player", - "less": "text/less", - "lha": "application/x-lzh-compressed", - "link66": "application/vnd.route66.link66+xml", - "list": "text/plain", - "list3820": "application/vnd.ibm.modcap", - "listafp": "application/vnd.ibm.modcap", - "litcoffee": "text/coffeescript", - "lnk": "application/x-ms-shortcut", - "log": "text/plain", - "lostxml": "application/lost+xml", - "lrf": "application/octet-stream", - "lrm": "application/vnd.ms-lrm", - "ltf": "application/vnd.frogans.ltf", - "lua": "text/x-lua", - "luac": "application/x-lua-bytecode", - "lvp": "audio/vnd.lucent.voice", - "lwp": "application/vnd.lotus-wordpro", - "lzh": "application/x-lzh-compressed", - "m13": "application/x-msmediaview", - "m14": "application/x-msmediaview", - "m1v": "video/mpeg", - "m21": "application/mp21", - "m2a": "audio/mpeg", - "m2v": "video/mpeg", - "m3a": "audio/mpeg", - "m3u": "audio/x-mpegurl", - "m3u8": "application/vnd.apple.mpegurl", - "m4a": "audio/x-m4a", - "m4p": "application/mp4", - "m4u": "video/vnd.mpegurl", - "m4v": "video/x-m4v", - "ma": "application/mathematica", - "mads": "application/mads+xml", - "mag": "application/vnd.ecowin.chart", - "maker": "application/vnd.framemaker", - "man": "text/troff", - "manifest": "text/cache-manifest", - "map": "application/json", - "mar": "application/octet-stream", - "markdown": "text/markdown", - "mathml": "application/mathml+xml", - "mb": "application/mathematica", - "mbk": "application/vnd.mobius.mbk", - "mbox": "application/mbox", - "mc1": "application/vnd.medcalcdata", - "mcd": "application/vnd.mcd", - "mcurl": "text/vnd.curl.mcurl", - "md": "text/markdown", - "mdb": "application/x-msaccess", - "mdi": "image/vnd.ms-modi", - "me": "text/troff", - "mesh": "model/mesh", - "meta4": "application/metalink4+xml", - "metalink": "application/metalink+xml", - "mets": "application/mets+xml", - "mfm": "application/vnd.mfmp", - "mft": "application/rpki-manifest", - "mgp": "application/vnd.osgeo.mapguide.package", - "mgz": "application/vnd.proteus.magazine", - "mid": "audio/midi", - "midi": "audio/midi", - "mie": "application/x-mie", - "mif": "application/vnd.mif", - "mime": "message/rfc822", - "mj2": "video/mj2", - "mjp2": "video/mj2", - "mjs": "application/javascript", - "mk3d": "video/x-matroska", - "mka": "audio/x-matroska", - "mkd": "text/x-markdown", - "mks": "video/x-matroska", - "mkv": "video/x-matroska", - "mlp": "application/vnd.dolby.mlp", - "mmd": "application/vnd.chipnuts.karaoke-mmd", - "mmf": "application/vnd.smaf", - "mml": "text/mathml", - "mmr": "image/vnd.fujixerox.edmics-mmr", - "mng": "video/x-mng", - "mny": "application/x-msmoney", - "mobi": "application/x-mobipocket-ebook", - "mods": "application/mods+xml", - "mov": "video/quicktime", - "movie": "video/x-sgi-movie", - "mp2": "audio/mpeg", - "mp21": "application/mp21", - "mp2a": "audio/mpeg", - "mp3": "audio/mpeg", - "mp4": "video/mp4", - "mp4a": "audio/mp4", - "mp4s": "application/mp4", - "mp4v": "video/mp4", - "mpc": "application/vnd.mophun.certificate", - "mpd": "application/dash+xml", - "mpe": "video/mpeg", - "mpeg": "video/mpeg", - "mpg": "video/mpeg", - "mpg4": "video/mp4", - "mpga": "audio/mpeg", - "mpkg": "application/vnd.apple.installer+xml", - "mpm": "application/vnd.blueice.multipass", - "mpn": "application/vnd.mophun.application", - "mpp": "application/vnd.ms-project", - "mpt": "application/vnd.ms-project", - "mpy": "application/vnd.ibm.minipay", - "mqy": "application/vnd.mobius.mqy", - "mrc": "application/marc", - "mrcx": "application/marcxml+xml", - "mrw": "image/x-minolta-mrw", - "ms": "text/troff", - "mscml": "application/mediaservercontrol+xml", - "mseed": "application/vnd.fdsn.mseed", - "mseq": "application/vnd.mseq", - "msf": "application/vnd.epson.msf", - "msg": "application/vnd.ms-outlook", - "msh": "model/mesh", - "msi": "application/x-msdownload", - "msl": "application/vnd.mobius.msl", - "msm": "application/octet-stream", - "msp": "application/octet-stream", - "msty": "application/vnd.muvee.style", - "mts": "model/vnd.mts", - "mus": "application/vnd.musician", - "musicxml": "application/vnd.recordare.musicxml+xml", - "mvb": "application/x-msmediaview", - "mwf": "application/vnd.mfer", - "mxf": "application/mxf", - "mxl": "application/vnd.recordare.musicxml", - "mxml": "application/xv+xml", - "mxs": "application/vnd.triscape.mxs", - "mxu": "video/vnd.mpegurl", - "n-gage": "application/vnd.nokia.n-gage.symbian.install", - "n3": "text/n3", - "nb": "application/mathematica", - "nbp": "application/vnd.wolfram.player", - "nc": "application/x-netcdf", - "ncx": "application/x-dtbncx+xml", - "nef": "image/x-nikon-nef", - "nfo": "text/x-nfo", - "ngdat": "application/vnd.nokia.n-gage.data", - "nitf": "application/vnd.nitf", - "nlu": "application/vnd.neurolanguage.nlu", - "nml": "application/vnd.enliven", - "nnd": "application/vnd.noblenet-directory", - "nns": "application/vnd.noblenet-sealer", - "nnw": "application/vnd.noblenet-web", - "npx": "image/vnd.net-fpx", - "nsc": "application/x-conference", - "nsf": "application/vnd.lotus-notes", - "ntf": "application/vnd.nitf", - "numbers": "application/vnd.apple.numbers", - "nzb": "application/x-nzb", - "oa2": "application/vnd.fujitsu.oasys2", - "oa3": "application/vnd.fujitsu.oasys3", - "oas": "application/vnd.fujitsu.oasys", - "obd": "application/x-msbinder", - "obj": "application/x-tgif", - "oda": "application/oda", - "odb": "application/vnd.oasis.opendocument.database", - "odc": "application/vnd.oasis.opendocument.chart", - "odf": "application/vnd.oasis.opendocument.formula", - "odft": "application/vnd.oasis.opendocument.formula-template", - "odg": "application/vnd.oasis.opendocument.graphics", - "odi": "application/vnd.oasis.opendocument.image", - "odm": "application/vnd.oasis.opendocument.text-master", - "odp": "application/vnd.oasis.opendocument.presentation", - "ods": "application/vnd.oasis.opendocument.spreadsheet", - "odt": "application/vnd.oasis.opendocument.text", - "oga": "audio/ogg", - "ogg": "audio/ogg", - "ogv": "video/ogg", - "ogx": "application/ogg", - "omdoc": "application/omdoc+xml", - "onepkg": "application/onenote", - "onetmp": "application/onenote", - "onetoc": "application/onenote", - "onetoc2": "application/onenote", - "opf": "application/oebps-package+xml", - "opml": "text/x-opml", - "oprc": "application/vnd.palm", - "orf": "image/x-olympus-orf", - "org": "text/x-org", - "osf": "application/vnd.yamaha.openscoreformat", - "osfpvg": "application/vnd.yamaha.openscoreformat.osfpvg+xml", - "otc": "application/vnd.oasis.opendocument.chart-template", - "otf": "font/otf", - "otg": "application/vnd.oasis.opendocument.graphics-template", - "oth": "application/vnd.oasis.opendocument.text-web", - "oti": "application/vnd.oasis.opendocument.image-template", - "otp": "application/vnd.oasis.opendocument.presentation-template", - "ots": "application/vnd.oasis.opendocument.spreadsheet-template", - "ott": "application/vnd.oasis.opendocument.text-template", - "ova": "application/x-virtualbox-ova", - "ovf": "application/x-virtualbox-ovf", - "owl": "application/rdf+xml", - "oxps": "application/oxps", - "oxt": "application/vnd.openofficeorg.extension", - "p": "text/x-pascal", - "p10": "application/pkcs10", - "p12": "application/x-pkcs12", - "p7b": "application/x-pkcs7-certificates", - "p7c": "application/pkcs7-mime", - "p7m": "application/pkcs7-mime", - "p7r": "application/x-pkcs7-certreqresp", - "p7s": "application/pkcs7-signature", - "p8": "application/pkcs8", - "pac": "application/x-ns-proxy-autoconfig", - "pages": "application/vnd.apple.pages", - "pas": "text/x-pascal", - "paw": "application/vnd.pawaafile", - "pbd": "application/vnd.powerbuilder6", - "pbm": "image/x-portable-bitmap", - "pcap": "application/vnd.tcpdump.pcap", - "pcf": "application/x-font-pcf", - "pcl": "application/vnd.hp-pcl", - "pclxl": "application/vnd.hp-pclxl", - "pct": "image/x-pict", - "pcurl": "application/vnd.curl.pcurl", - "pcx": "image/x-pcx", - "pdb": "application/x-pilot", - "pde": "text/x-processing", - "pdf": "application/pdf", - "pef": "image/x-pentax-pef", - "pem": "application/x-x509-ca-cert", - "pfa": "application/x-font-type1", - "pfb": "application/x-font-type1", - "pfm": "application/x-font-type1", - "pfr": "application/font-tdpfr", - "pfx": "application/x-pkcs12", - "pgm": "image/x-portable-graymap", - "pgn": "application/x-chess-pgn", - "pgp": "application/pgp-encrypted", - "php": "application/x-httpd-php", - "pic": "image/x-pict", - "pkg": "application/octet-stream", - "pki": "application/pkixcmp", - "pkipath": "application/pkix-pkipath", - "pkpass": "application/vnd.apple.pkpass", - "pl": "application/x-perl", - "plb": "application/vnd.3gpp.pic-bw-large", - "plc": "application/vnd.mobius.plc", - "plf": "application/vnd.pocketlearn", - "pls": "application/pls+xml", - "pm": "application/x-perl", - "pml": "application/vnd.ctc-posml", - "png": "image/png", - "pnm": "image/x-portable-anymap", - "portpkg": "application/vnd.macports.portpkg", - "pot": "application/vnd.ms-powerpoint", - "potm": "application/vnd.ms-powerpoint.template.macroenabled.12", - "potx": "application/vnd.openxmlformats-officedocument.presentationml.template", - "ppam": "application/vnd.ms-powerpoint.addin.macroenabled.12", - "ppd": "application/vnd.cups-ppd", - "ppm": "image/x-portable-pixmap", - "pps": "application/vnd.ms-powerpoint", - "ppsm": "application/vnd.ms-powerpoint.slideshow.macroenabled.12", - "ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", - "ppt": "application/vnd.ms-powerpoint", - "pptm": "application/vnd.ms-powerpoint.presentation.macroenabled.12", - "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - "pqa": "application/vnd.palm", - "prc": "application/x-pilot", - "pre": "application/vnd.lotus-freelance", - "prf": "application/pics-rules", - "ps": "application/postscript", - "psb": "application/vnd.3gpp.pic-bw-small", - "psd": "image/vnd.adobe.photoshop", - "psf": "application/x-font-linux-psf", - "pskcxml": "application/pskc+xml", - "pti": "image/prs.pti", - "ptid": "application/vnd.pvi.ptid1", - "pub": "application/x-mspublisher", - "pvb": "application/vnd.3gpp.pic-bw-var", - "pwn": "application/vnd.3m.post-it-notes", - "pya": "audio/vnd.ms-playready.media.pya", - "pyv": "video/vnd.ms-playready.media.pyv", - "qam": "application/vnd.epson.quickanime", - "qbo": "application/vnd.intu.qbo", - "qfx": "application/vnd.intu.qfx", - "qps": "application/vnd.publishare-delta-tree", - "qt": "video/quicktime", - "qwd": "application/vnd.quark.quarkxpress", - "qwt": "application/vnd.quark.quarkxpress", - "qxb": "application/vnd.quark.quarkxpress", - "qxd": "application/vnd.quark.quarkxpress", - "qxl": "application/vnd.quark.quarkxpress", - "qxt": "application/vnd.quark.quarkxpress", - "ra": "audio/x-realaudio", - "raf": "image/x-fuji-raf", - "ram": "audio/x-pn-realaudio", - "raml": "application/raml+yaml", - "rar": "application/x-rar-compressed", - "ras": "image/x-cmu-raster", - "raw": "image/x-panasonic-raw", - "rcprofile": "application/vnd.ipunplugged.rcprofile", - "rdf": "application/rdf+xml", - "rdz": "application/vnd.data-vision.rdz", - "rep": "application/vnd.businessobjects", - "res": "application/x-dtbresource+xml", - "rgb": "image/x-rgb", - "rif": "application/reginfo+xml", - "rip": "audio/vnd.rip", - "ris": "application/x-research-info-systems", - "rl": "application/resource-lists+xml", - "rlc": "image/vnd.fujixerox.edmics-rlc", - "rld": "application/resource-lists-diff+xml", - "rm": "application/vnd.rn-realmedia", - "rmi": "audio/midi", - "rmp": "audio/x-pn-realaudio-plugin", - "rms": "application/vnd.jcp.javame.midlet-rms", - "rmvb": "application/vnd.rn-realmedia-vbr", - "rnc": "application/relax-ng-compact-syntax", - "rng": "application/xml", - "roa": "application/rpki-roa", - "roff": "text/troff", - "rp9": "application/vnd.cloanto.rp9", - "rpm": "application/x-redhat-package-manager", - "rpss": "application/vnd.nokia.radio-presets", - "rpst": "application/vnd.nokia.radio-preset", - "rq": "application/sparql-query", - "rs": "application/rls-services+xml", - "rsd": "application/rsd+xml", - "rss": "application/rss+xml", - "rtf": "text/rtf", - "rtx": "text/richtext", - "run": "application/x-makeself", - "s": "text/x-asm", - "s3m": "audio/s3m", - "saf": "application/vnd.yamaha.smaf-audio", - "sass": "text/x-sass", - "sbml": "application/sbml+xml", - "sc": "application/vnd.ibm.secure-container", - "scd": "application/x-msschedule", - "scm": "application/vnd.lotus-screencam", - "scq": "application/scvp-cv-request", - "scs": "application/scvp-cv-response", - "scss": "text/x-scss", - "scurl": "text/vnd.curl.scurl", - "sda": "application/vnd.stardivision.draw", - "sdc": "application/vnd.stardivision.calc", - "sdd": "application/vnd.stardivision.impress", - "sdkd": "application/vnd.solent.sdkm+xml", - "sdkm": "application/vnd.solent.sdkm+xml", - "sdp": "application/sdp", - "sdw": "application/vnd.stardivision.writer", - "sea": "application/x-sea", - "see": "application/vnd.seemail", - "seed": "application/vnd.fdsn.seed", - "sema": "application/vnd.sema", - "semd": "application/vnd.semd", - "semf": "application/vnd.semf", - "ser": "application/java-serialized-object", - "setpay": "application/set-payment-initiation", - "setreg": "application/set-registration-initiation", - "sfd-hdstx": "application/vnd.hydrostatix.sof-data", - "sfs": "application/vnd.spotfire.sfs", - "sfv": "text/x-sfv", - "sgi": "image/sgi", - "sgl": "application/vnd.stardivision.writer-global", - "sgm": "text/sgml", - "sgml": "text/sgml", - "sh": "application/x-sh", - "shar": "application/x-shar", - "shex": "text/shex", - "shf": "application/shf+xml", - "shtml": "text/html", - "sid": "image/x-mrsid-image", - "sig": "application/pgp-signature", - "sil": "audio/silk", - "silo": "model/mesh", - "sis": "application/vnd.symbian.install", - "sisx": "application/vnd.symbian.install", - "sit": "application/x-stuffit", - "sitx": "application/x-stuffitx", - "skd": "application/vnd.koan", - "skm": "application/vnd.koan", - "skp": "application/vnd.koan", - "skt": "application/vnd.koan", - "sldm": "application/vnd.ms-powerpoint.slide.macroenabled.12", - "sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", - "slim": "text/slim", - "slm": "text/slim", - "slt": "application/vnd.epson.salt", - "sm": "application/vnd.stepmania.stepchart", - "smf": "application/vnd.stardivision.math", - "smi": "application/smil+xml", - "smil": "application/smil+xml", - "smv": "video/x-smv", - "smzip": "application/vnd.stepmania.package", - "snd": "audio/basic", - "snf": "application/x-font-snf", - "so": "application/octet-stream", - "spc": "application/x-pkcs7-certificates", - "spf": "application/vnd.yamaha.smaf-phrase", - "spl": "application/x-futuresplash", - "spot": "text/vnd.in3d.spot", - "spp": "application/scvp-vp-response", - "spq": "application/scvp-vp-request", - "spx": "audio/ogg", - "sql": "application/x-sql", - "sr2": "image/x-sony-sr2", - "src": "application/x-wais-source", - "srf": "image/x-sony-srf", - "srt": "application/x-subrip", - "sru": "application/sru+xml", - "srx": "application/sparql-results+xml", - "ssdl": "application/ssdl+xml", - "sse": "application/vnd.kodak-descriptor", - "ssf": "application/vnd.epson.ssf", - "ssml": "application/ssml+xml", - "st": "application/vnd.sailingtracker.track", - "stc": "application/vnd.sun.xml.calc.template", - "std": "application/vnd.sun.xml.draw.template", - "stf": "application/vnd.wt.stf", - "sti": "application/vnd.sun.xml.impress.template", - "stk": "application/hyperstudio", - "stl": "application/vnd.ms-pki.stl", - "str": "application/vnd.pg.format", - "stw": "application/vnd.sun.xml.writer.template", - "styl": "text/stylus", - "stylus": "text/stylus", - "sub": "text/vnd.dvb.subtitle", - "sus": "application/vnd.sus-calendar", - "susp": "application/vnd.sus-calendar", - "sv4cpio": "application/x-sv4cpio", - "sv4crc": "application/x-sv4crc", - "svc": "application/vnd.dvb.service", - "svd": "application/vnd.svd", - "svg": "image/svg+xml", - "svgz": "image/svg+xml", - "swa": "application/x-director", - "swf": "application/x-shockwave-flash", - "swi": "application/vnd.aristanetworks.swi", - "sxc": "application/vnd.sun.xml.calc", - "sxd": "application/vnd.sun.xml.draw", - "sxg": "application/vnd.sun.xml.writer.global", - "sxi": "application/vnd.sun.xml.impress", - "sxm": "application/vnd.sun.xml.math", - "sxw": "application/vnd.sun.xml.writer", - "t": "text/troff", - "t3": "application/x-t3vm-image", - "t38": "image/t38", - "taglet": "application/vnd.mynfc", - "tao": "application/vnd.tao.intent-module-archive", - "tap": "image/vnd.tencent.tap", - "tar": "application/x-tar", - "tcap": "application/vnd.3gpp2.tcap", - "tcl": "application/x-tcl", - "teacher": "application/vnd.smart.teacher", - "tei": "application/tei+xml", - "teicorpus": "application/tei+xml", - "tex": "application/x-tex", - "texi": "application/x-texinfo", - "texinfo": "application/x-texinfo", - "text": "text/plain", - "tfi": "application/thraud+xml", - "tfm": "application/x-tex-tfm", - "tfx": "image/tiff-fx", - "tga": "image/x-tga", - "thmx": "application/vnd.ms-officetheme", - "tif": "image/tiff", - "tiff": "image/tiff", - "tk": "application/x-tcl", - "tmo": "application/vnd.tmobile-livetv", - "torrent": "application/x-bittorrent", - "tpl": "application/vnd.groove-tool-template", - "tpt": "application/vnd.trid.tpt", - "tr": "text/troff", - "tra": "application/vnd.trueapp", - "trm": "application/x-msterminal", - "ts": "video/mp2t", - "tsd": "application/timestamped-data", - "tsv": "text/tab-separated-values", - "ttc": "font/collection", - "ttf": "font/ttf", - "ttl": "text/turtle", - "twd": "application/vnd.simtech-mindmapper", - "twds": "application/vnd.simtech-mindmapper", - "txd": "application/vnd.genomatix.tuxedo", - "txf": "application/vnd.mobius.txf", - "txt": "text/plain", - "u32": "application/x-authorware-bin", - "u8dsn": "message/global-delivery-status", - "u8hdr": "message/global-headers", - "u8mdn": "message/global-disposition-notification", - "u8msg": "message/global", - "udeb": "application/x-debian-package", - "ufd": "application/vnd.ufdl", - "ufdl": "application/vnd.ufdl", - "ulx": "application/x-glulx", - "umj": "application/vnd.umajin", - "unityweb": "application/vnd.unity", - "uoml": "application/vnd.uoml+xml", - "uri": "text/uri-list", - "uris": "text/uri-list", - "urls": "text/uri-list", - "ustar": "application/x-ustar", - "utz": "application/vnd.uiq.theme", - "uu": "text/x-uuencode", - "uva": "audio/vnd.dece.audio", - "uvd": "application/vnd.dece.data", - "uvf": "application/vnd.dece.data", - "uvg": "image/vnd.dece.graphic", - "uvh": "video/vnd.dece.hd", - "uvi": "image/vnd.dece.graphic", - "uvm": "video/vnd.dece.mobile", - "uvp": "video/vnd.dece.pd", - "uvs": "video/vnd.dece.sd", - "uvt": "application/vnd.dece.ttml+xml", - "uvu": "video/vnd.uvvu.mp4", - "uvv": "video/vnd.dece.video", - "uvva": "audio/vnd.dece.audio", - "uvvd": "application/vnd.dece.data", - "uvvf": "application/vnd.dece.data", - "uvvg": "image/vnd.dece.graphic", - "uvvh": "video/vnd.dece.hd", - "uvvi": "image/vnd.dece.graphic", - "uvvm": "video/vnd.dece.mobile", - "uvvp": "video/vnd.dece.pd", - "uvvs": "video/vnd.dece.sd", - "uvvt": "application/vnd.dece.ttml+xml", - "uvvu": "video/vnd.uvvu.mp4", - "uvvv": "video/vnd.dece.video", - "uvvx": "application/vnd.dece.unspecified", - "uvvz": "application/vnd.dece.zip", - "uvx": "application/vnd.dece.unspecified", - "uvz": "application/vnd.dece.zip", - "vbox": "application/x-virtualbox-vbox", - "vbox-extpack": "application/x-virtualbox-vbox-extpack", - "vcard": "text/vcard", - "vcd": "application/x-cdlink", - "vcf": "text/x-vcard", - "vcg": "application/vnd.groove-vcard", - "vcs": "text/x-vcalendar", - "vcx": "application/vnd.vcx", - "vdi": "application/x-virtualbox-vdi", - "vhd": "application/x-virtualbox-vhd", - "vis": "application/vnd.visionary", - "viv": "video/vnd.vivo", - "vmdk": "application/x-virtualbox-vmdk", - "vob": "video/x-ms-vob", - "vor": "application/vnd.stardivision.writer", - "vox": "application/x-authorware-bin", - "vrml": "model/vrml", - "vsd": "application/vnd.visio", - "vsf": "application/vnd.vsf", - "vss": "application/vnd.visio", - "vst": "application/vnd.visio", - "vsw": "application/vnd.visio", - "vtf": "image/vnd.valve.source.texture", - "vtt": "text/vtt", - "vtu": "model/vnd.vtu", - "vxml": "application/voicexml+xml", - "w3d": "application/x-director", - "wad": "application/x-doom", - "wadl": "application/vnd.sun.wadl+xml", - "war": "application/java-archive", - "wasm": "application/wasm", - "wav": "audio/x-wav", - "wax": "audio/x-ms-wax", - "wbmp": "image/vnd.wap.wbmp", - "wbs": "application/vnd.criticaltools.wbs+xml", - "wbxml": "application/vnd.wap.wbxml", - "wcm": "application/vnd.ms-works", - "wdb": "application/vnd.ms-works", - "wdp": "image/vnd.ms-photo", - "weba": "audio/webm", - "webapp": "application/x-web-app-manifest+json", - "webm": "video/webm", - "webmanifest": "application/manifest+json", - "webp": "image/webp", - "wg": "application/vnd.pmi.widget", - "wgt": "application/widget", - "wks": "application/vnd.ms-works", - "wm": "video/x-ms-wm", - "wma": "audio/x-ms-wma", - "wmd": "application/x-ms-wmd", - "wmf": "image/wmf", - "wml": "text/vnd.wap.wml", - "wmlc": "application/vnd.wap.wmlc", - "wmls": "text/vnd.wap.wmlscript", - "wmlsc": "application/vnd.wap.wmlscriptc", - "wmv": "video/x-ms-wmv", - "wmx": "video/x-ms-wmx", - "wmz": "application/x-msmetafile", - "woff": "font/woff", - "woff2": "font/woff2", - "wpd": "application/vnd.wordperfect", - "wpl": "application/vnd.ms-wpl", - "wps": "application/vnd.ms-works", - "wqd": "application/vnd.wqd", - "wri": "application/x-mswrite", - "wrl": "model/vrml", - "wsc": "message/vnd.wfa.wsc", - "wsdl": "application/wsdl+xml", - "wspolicy": "application/wspolicy+xml", - "wtb": "application/vnd.webturbo", - "wvx": "video/x-ms-wvx", - "x32": "application/x-authorware-bin", - "x3d": "model/x3d+xml", - "x3db": "model/x3d+binary", - "x3dbz": "model/x3d+binary", - "x3dv": "model/x3d+vrml", - "x3dvz": "model/x3d+vrml", - "x3dz": "model/x3d+xml", - "x3f": "image/x-sigma-x3f", - "xaml": "application/xaml+xml", - "xap": "application/x-silverlight-app", - "xar": "application/vnd.xara", - "xbap": "application/x-ms-xbap", - "xbd": "application/vnd.fujixerox.docuworks.binder", - "xbm": "image/x-xbitmap", - "xdf": "application/xcap-diff+xml", - "xdm": "application/vnd.syncml.dm+xml", - "xdp": "application/vnd.adobe.xdp+xml", - "xdssc": "application/dssc+xml", - "xdw": "application/vnd.fujixerox.docuworks", - "xenc": "application/xenc+xml", - "xer": "application/patch-ops-error+xml", - "xfdf": "application/vnd.adobe.xfdf", - "xfdl": "application/vnd.xfdl", - "xht": "application/xhtml+xml", - "xhtml": "application/xhtml+xml", - "xhvml": "application/xv+xml", - "xif": "image/vnd.xiff", - "xla": "application/vnd.ms-excel", - "xlam": "application/vnd.ms-excel.addin.macroenabled.12", - "xlc": "application/vnd.ms-excel", - "xlf": "application/x-xliff+xml", - "xlm": "application/vnd.ms-excel", - "xls": "application/vnd.ms-excel", - "xlsb": "application/vnd.ms-excel.sheet.binary.macroenabled.12", - "xlsm": "application/vnd.ms-excel.sheet.macroenabled.12", - "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - "xlt": "application/vnd.ms-excel", - "xltm": "application/vnd.ms-excel.template.macroenabled.12", - "xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", - "xlw": "application/vnd.ms-excel", - "xm": "audio/xm", - "xml": "text/xml", - "xo": "application/vnd.olpc-sugar", - "xop": "application/xop+xml", - "xpi": "application/x-xpinstall", - "xpl": "application/xproc+xml", - "xpm": "image/x-xpixmap", - "xpr": "application/vnd.is-xpr", - "xps": "application/vnd.ms-xpsdocument", - "xpw": "application/vnd.intercon.formnet", - "xpx": "application/vnd.intercon.formnet", - "xsd": "application/xml", - "xsl": "application/xml", - "xslt": "application/xslt+xml", - "xsm": "application/vnd.syncml+xml", - "xspf": "application/xspf+xml", - "xul": "application/vnd.mozilla.xul+xml", - "xvm": "application/xv+xml", - "xvml": "application/xv+xml", - "xwd": "image/x-xwindowdump", - "xyz": "chemical/x-xyz", - "xz": "application/x-xz", - "yaml": "text/yaml", - "yang": "application/yang", - "yin": "application/yin+xml", - "yml": "text/yaml", - "ymp": "text/x-suse-ymp", - "z1": "application/x-zmachine", - "z2": "application/x-zmachine", - "z3": "application/x-zmachine", - "z4": "application/x-zmachine", - "z5": "application/x-zmachine", - "z6": "application/x-zmachine", - "z7": "application/x-zmachine", - "z8": "application/x-zmachine", - "zaz": "application/vnd.zzazz.deck+xml", - "zip": "application/zip", - "zir": "application/vnd.zul", - "zirz": "application/vnd.zul", - "zmm": "application/vnd.handheld-entertainment+xml", -} - -// TypeByExtension returns the content type based on the extension of the file -func TypeByExtension(extension string) string { - if strings.HasPrefix(extension, ".") { - // Remove the period - extension = extension[1:] - } - contentType := mimeTypes[strings.ToLower(extension)] - return contentType -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 75763429c8..be59fad1a8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -352,7 +352,7 @@ github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1 github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1 github.com/cs3org/go-cs3apis/cs3/tx/v1beta1 github.com/cs3org/go-cs3apis/cs3/types/v1beta1 -# github.com/cs3org/reva/v2 v2.15.1-0.20230731132956-0fb5212d0551 +# github.com/cs3org/reva/v2 v2.15.1-0.20230809113840-3ceaf17cf7fb ## explicit; go 1.20 github.com/cs3org/reva/v2/cmd/revad/internal/grace github.com/cs3org/reva/v2/cmd/revad/runtime @@ -702,9 +702,6 @@ github.com/cs3org/reva/v2/pkg/user/manager/registry github.com/cs3org/reva/v2/pkg/utils github.com/cs3org/reva/v2/pkg/utils/ldap github.com/cs3org/reva/v2/tests/cs3mocks/mocks -# github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 -## explicit -github.com/cubewise-code/go-mime # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew