Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
This commit is contained in:
Jörn Friedrich Dreyer
2021-09-13 13:06:02 +00:00
parent a022ab78f3
commit 27863fdb43
6 changed files with 67 additions and 67 deletions
+3 -3
View File
@@ -16,7 +16,7 @@ The different paths in the namespaces need to be translated while passing [*refe
| oc10 namespace | CS3 global namespace | storage provider | reference | content |
|--------------------------------------------------|----------------------------------------|------------------|-----------|---------|
| `/webdav/path/to/file.ext` `/dav/files/<username>/path/to/file.ext` | `/home/path/to/file.ext` | home | `/<userlayout>/path/to/file.ext` | currently logged in users home |
| `/webdav/path/to/file.ext` `/dav/files/<username>/path/to/file.ext` | `/home/path/to/file.ext` | home | `/<user_layout>/path/to/file.ext` | currently logged in users home |
| `/webdav/Shares/foo` `/dav/files/<username>/Shares/foo` | `/home/Shares/foo` | users | id based access | all users, used to access collaborative shares |
| `/dav/public-files/<token>/rel/path/to/file.ext` | `/public/<token>/rel/path/to/file.ext` | public | id based access | publicly shared files, used to access public links |
@@ -43,7 +43,7 @@ The *CS3 global namespace* in oCIS is configured in the storage [*spaces registr
| global namespace | description |
|-|-|
| `/home` | an alias for the currently logged in uses private space |
| `/users/<userlayout>` | user private spaces |
| `/users/<user_layout>` | user private spaces |
| `/shares` | a virtual listing of share spaces a user has access to |
| `/public/<token>` | a virtual folder listing public shares |
| `/spaces/<spacename>` | *TODO: project or group spaces* |
@@ -51,7 +51,7 @@ The *CS3 global namespace* in oCIS is configured in the storage [*spaces registr
Technically, the `/home` namespace is not necessary: the storage [*spaces registry*]({{< ref "./spacesregistry" >}}) knows the path to a users private space in the `/users` namespace and the gateway can forward the requests to the responsible storage provider.
{{< hint warning >}}
*@jfd: Why don't we use `/home/<userlayout>` instead of `/users/<userlayout>`. Then the paths would be consistent with most unix systems.
*@jfd: Why don't we use `/home/<user_layout>` instead of `/users/<user_layout>`. Then the paths would be consistent with most unix systems.
{{< /hint >}}
The `/shares` namespace is used to solve two problems:
+11 -19
View File
@@ -13,29 +13,21 @@ Some architectural changes still need to be clarified or changed. Maybe an ADR i
## A dedicated shares storage provider
Currently, the *gateway* treats `/home/shares` different than any other path: it will stat all children and calculate an etag to allow clients to discover changes in accepted shares. This requires the storage provider to cooperate and provide this special `/shares` folder in the root of a users home when it is accessed as a home storage, which is a config flag that needs to be set for every storage driver.
Currently, when a user accepts a share, a cs3 reference is created in the users `/home/shares` folder. This reference represents the mount point of a share and can be renamed, similar to the share jail in ownCloud 10. This spreads the metadata of a share in two places:
- the share is persisted in the *share manager*
- the mount point of a share is persisted in the home *storage provider*
The `enable_home` flag will cause drivers to jail path based requests into a `<userlayout>` subfolder. In effect it divides a storage provider into multiple [*storage spaces*]({{< ref "#storage-spaces" >}}): when calling `CreateHome` a subfolder following the `<userlayout>` is created and market as the root of a users home. Both, the eos and ocis storage drivers use extended attributes to mark the folder as the end of the size aggregation and tree mtime propagation mechanism. Even setting the quota is possible like that. All this literally is a [*storage space*]({{< ref "#storage-spaces" >}}).
Furthermore, the *gateway* treats `/home/shares` different than any other path: it will stat all children and calculate an etag to allow clients to discover changes in accepted shares. This requires the storage provider to cooperate and provide this special `/shares` folder in the root of a users home when it is accessed as a home storage. That is the origin of the `enable_home` config flag that needs to be implemented for every storage driver.
We can implement [ListStorageSpaces](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ListStorageSpacesRequest) by either
- iterating over the root of the storage and treating every folder following the `<userlayout>` as a `home` *storage space*,
- iterating over the root of the storage and treating every folder following a new `<projectlayout>` as a `project` *storage space*, or
- iterating over the root of the storage and treating every folder following a generic `<layout>` as a *storage space* for a configurable space type, or
- we allow configuring a map of `space type` to `layout` (based on the [CreateStorageSpaceRequest](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.CreateStorageSpaceRequest)) which would allow things like
```
home=/var/lib/ocis/storage/home/{{substr 0 1 .Owner.Username}}/{{.Owner.Username}}
spaces=/spaces/var/lib/ocis/storage/projects/{{.Name}}
```
In order to have a single source of truth we need to make the *share manager* aware of the mount point. We can then move all the logic that aggregates the etag in the share folder to a dedicated *shares storage provider* that is using the *share manager* for persistence. The *shares storage provider* would provide a `/shares` namespace outside of `/home` that lists all accepted shares for the current user. As a result the storage drivers no longer need to have a `enable_home` flag that jails users into their home. The `/home/shares` folder would move outside of the `/home`. In fact `/home` will no longer be needed, because the home folder concept can be implemented as a space: `CreateHome` would create a `personal` space on the.
This would make the `GetHome()` call return the path to the *storage provider* including the relative path to the *storage space*. No need for a *storage provider* mounted at `/home`. This is just a UI alias for `/users/<userlayout>`. Just like a normal `/home/<username>` on a linux machine.
Work on this is done in https://github.com/cs3org/reva/pull/2023
But if we have no `/home` where do we find the shares, and how can clients discover changes in accepted shares?
The `/shares` namespace should be provided by a *shares storage provider* that lists all accepted shares for the current user... but what about copy pasting links from the browser? Well this storage is only really needed to have a path to ocm shares that actually reside on other instances. In the UI the shares would be listed by querying a *share manager*. It returns ResourceIds, which can be stated to fetch a path that is then accessible in the CS3 global namespace. Two caveats:
{{< hint warning >}}
What about copy pasting links from the browser? Well this storage is only really needed to have a path to ocm shares that actually reside on other instances. In the UI the shares would be listed by querying a *share manager*. It returns ResourceIds, which can be stated to fetch a path that is then accessible in the CS3 global namespace. Two caveats:
- This only works for resources that are actually hosted by the current instance. For those it would leak the parent path segments to a shared resource.
- For accepted OCM shares there must be a path in the [*CS3 global namespace*]({{< ref "./namespaces.md#cs3-global-namespaces" >}}) that has to be the same for all users, otherwise they cannot copy and share those URLs.
Work on this is done in https://github.com/cs3org/reva/pull/1846
{{< /hint >}}
### The gateway should be responsible for path transformations
@@ -47,9 +39,9 @@ Work is done in https://github.com/cs3org/reva/pull/1866
## URL escaped string representation of a CS3 reference
For the `/dav/spaces/` endpoint we need to encode the *reference* in a url compatible way.
For the spaces concept we introduced the `/dav/spaces/` endpoint. It encodes a cs3 *reference* in a URL compatible way.
1. We can separate the path using a `/`: `/dav/spaces/<spaceid>/<path>`
2. The `spaceid` currently is a cs3 resourceid, consisting of `<storageid>` and `<nodeid>`. Since the nodeid might contain `/` eg. for the local driver we have to urlencode the spaceid.
2. The `spaceid` currently is a cs3 resourceid, consisting of `<storageid>` and `<opaqueid>`. Since the opaqueid might contain `/` eg. for the local driver we have to urlencode the spaceid.
To access resources by id we need to make the `/dav/meta/<resourceid>` able to list directories... Otherwise id based navigation first has to look up the path. Or we use the libregraph api for id based navigation.
+11
View File
@@ -26,3 +26,14 @@ Finally, a logical `storage space id` is not tied to a specific [*spaces provide
## Shares
*To be clarified: we are aware that [*storage spaces*]({{< ref "#storage-spaces" >}}) may be too 'heavywheight' for ad hoc sharing with groups. That being said, there is no technical reason why group shares should not be treated like storage [*spaces*]({{< ref "#storage-spaces" >}}) that users can provision themselves. They would share the quota with the users home or personal storage [*space*]({{< ref "#storage-spaces" >}}) and the share initiator would be the sole owner. Technically, the mechanism of treating a share like a new storage [*space*]({{< ref "#storage-spaces" >}}) would be the same. This obviously also extends to user shares and even file individual shares that would be wrapped in a virtual collection. It would also become possible to share collections of arbitrary files in a single storage space, e.g. the ten best pictures from a large album.*
## Notes
We can implement [ListStorageSpaces](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ListStorageSpacesRequest) by either
- iterating over the root of the storage and treating every folder following the `<user_layout>` as a `home` *storage space*,
- iterating over the root of the storage and treating every folder following a new `<project_layout>` as a `project` *storage space*, or
- iterating over the root of the storage and treating every folder following a generic `<layout>` as a *storage space* for a configurable space type, or
- we allow configuring a map of `space type` to `layout` (based on the [CreateStorageSpaceRequest](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.CreateStorageSpaceRequest)) which would allow things like
```
home=/var/lib/ocis/storage/home/{{substr 0 1 .Owner.Username}}/{{.Owner.Username}}
spaces=/spaces/var/lib/ocis/storage/projects/{{.Name}}
```
+1 -1
View File
@@ -49,7 +49,7 @@ The ocdav service not only handles all WebDAV requests under `(remote.php/)(web)
| *Note: existing folder sync pairs in legacy clients will break when moving the user home down in the path hierarchy* |||||
| `(remote.php/)webdav/home` | ocdav | storageprovider | `/home` | | |
| `(remote.php/)webdav/users` | ocdav | storageprovider | `/users` | | |
| `(remote.php/)dav/files/<username>` | ocdav | storageprovider | `/users/<userlayout>` | | |
| `(remote.php/)dav/files/<username>` | ocdav | storageprovider | `/users/<user_layout>` | | |
| *Spaces concept also needs a new endpoint:* |||||
| `(remote.php/)dav/spaces/<spaceid>/<relative_path>` | ocdav | storageregistry & storageprovider | bypass path based namespace and directly talk to the responsible storage provider using a relative path | [spaces concept](https://github.com/owncloud/ocis/pull/1827) needs to point to storage [*spaces*]({{< ref "./spaces.md" >}}) | allow accessing spaces, listing is done by the graph api |
@@ -1,4 +1,4 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1157px" height="295px" viewBox="-0.5 -0.5 1157 295" content="&lt;mxfile pages=&quot;4&quot;&gt;&lt;diagram id=&quot;ivlTgcF_GoFNmAPzzRq-&quot; name=&quot;overview&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;">
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1157px" height="295px" viewBox="-0.5 -0.5 1157 295" content="&lt;mxfile pages=&quot;4&quot;&gt;&lt;diagram id=&quot;ivlTgcF_GoFNmAPzzRq-&quot; name=&quot;overview&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;">
<defs/>
<g>
<path d="M 808 142.26 L 989.76 141.69" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
@@ -35,7 +35,7 @@
/home
</div>
<div>
/users/&lt;userlayout&gt;
/users/&lt;user_layout&gt;
</div>
<div>
/public
@@ -52,13 +52,13 @@
</text>
</switch>
</g>
<rect x="998" y="83" width="148.03" height="117.34" rx="4.69" ry="4.69" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<rect x="998" y="83" width="148.03" height="117.34" rx="4.69" ry="4.69" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 146px; height: 1px; padding-top: 90px; margin-left: 999px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
storage home
</div>
</div>
@@ -69,16 +69,15 @@
</text>
</switch>
</g>
<rect x="1132.62" y="182.64" width="16.86" height="26.26" rx="2.53" ry="2.53" fill="#ffffff" stroke="none" transform="rotate(40,1141.05,195.77)" pointer-events="all"/>
<rect x="1130.04" y="184.2" width="23.57" height="24.24" fill="none" stroke="none" pointer-events="all"/>
<path d="M 1132.98 194.66 L 1130.54 193.62 C 1130.19 193.42 1130.04 193.13 1130.18 192.71 L 1131.11 190.43 C 1131.31 190.09 1131.58 189.89 1131.99 190.06 L 1134.26 191.24 C 1134.99 190.35 1135.78 189.48 1136.67 188.71 L 1135.67 186.2 C 1135.6 185.9 1135.57 185.61 1135.99 185.33 L 1138.27 184.34 C 1138.71 184.2 1138.96 184.39 1139.11 184.65 L 1140.13 187.22 C 1141.15 187.02 1142.17 186.92 1143.37 187.28 L 1144.4 184.67 C 1144.62 184.31 1144.91 184.21 1145.25 184.34 L 1147.53 185.33 C 1147.91 185.57 1147.94 185.86 1147.85 186.17 L 1146.84 188.74 C 1147.73 189.48 1148.55 190.26 1149.21 191.14 L 1151.66 190.12 C 1152.09 189.99 1152.36 190.16 1152.52 190.5 L 1153.48 192.83 C 1153.54 193.18 1153.47 193.47 1153.14 193.66 L 1150.65 194.7 C 1150.77 195.7 1150.75 196.96 1150.64 198.06 L 1153.13 199.1 C 1153.47 199.31 1153.61 199.59 1153.51 199.95 L 1152.61 202.14 C 1152.43 202.43 1152.18 202.58 1151.82 202.48 L 1149.31 201.44 C 1148.65 202.37 1147.83 203.19 1146.9 203.91 L 1147.89 206.43 C 1148.05 206.83 1147.85 207.17 1147.61 207.3 L 1145.2 208.33 C 1144.88 208.39 1144.59 208.36 1144.45 207.95 L 1143.43 205.36 C 1142.51 205.63 1141.37 205.7 1140.2 205.39 L 1139.19 207.94 C 1139.03 208.2 1138.84 208.43 1138.4 208.32 L 1136.05 207.32 C 1135.72 207.07 1135.56 206.77 1135.77 206.36 L 1136.89 204.07 C 1135.9 203.3 1135.08 202.48 1134.43 201.62 L 1132.03 202.63 C 1131.65 202.77 1131.35 202.68 1131.13 202.32 L 1130.17 199.96 C 1130.07 199.65 1130.15 199.28 1130.5 199.1 L 1132.99 197.99 C 1132.89 196.88 1132.88 195.77 1132.98 194.66 Z M 1135.66 196.27 C 1135.66 200.2 1138.8 202.64 1141.87 202.64 C 1145.22 202.64 1147.97 199.72 1147.97 196.33 C 1147.97 192.69 1145 189.96 1141.89 189.96 C 1138.85 189.96 1135.66 192.33 1135.66 196.27 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="1007.02" y="110.14" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="1132.62" y="182.64" width="16.86" height="26.26" rx="2.53" ry="2.53" fill="#ffffff" stroke="none" transform="rotate(40,1141.05,195.77)" pointer-events="none"/>
<path d="M 1132.98 194.66 L 1130.54 193.62 C 1130.19 193.42 1130.04 193.13 1130.18 192.71 L 1131.11 190.43 C 1131.31 190.09 1131.58 189.89 1131.99 190.06 L 1134.26 191.24 C 1134.99 190.35 1135.78 189.48 1136.67 188.71 L 1135.67 186.2 C 1135.6 185.9 1135.57 185.61 1135.99 185.33 L 1138.27 184.34 C 1138.71 184.2 1138.96 184.39 1139.11 184.65 L 1140.13 187.22 C 1141.15 187.02 1142.17 186.92 1143.37 187.28 L 1144.4 184.67 C 1144.62 184.31 1144.91 184.21 1145.25 184.34 L 1147.53 185.33 C 1147.91 185.57 1147.94 185.86 1147.85 186.17 L 1146.84 188.74 C 1147.73 189.48 1148.55 190.26 1149.21 191.14 L 1151.66 190.12 C 1152.09 189.99 1152.36 190.16 1152.52 190.5 L 1153.48 192.83 C 1153.54 193.18 1153.47 193.47 1153.14 193.66 L 1150.65 194.7 C 1150.77 195.7 1150.75 196.96 1150.64 198.06 L 1153.13 199.1 C 1153.47 199.31 1153.61 199.59 1153.51 199.95 L 1152.61 202.14 C 1152.43 202.43 1152.18 202.58 1151.82 202.48 L 1149.31 201.44 C 1148.65 202.37 1147.83 203.19 1146.9 203.91 L 1147.89 206.43 C 1148.05 206.83 1147.85 207.17 1147.61 207.3 L 1145.2 208.33 C 1144.88 208.39 1144.59 208.36 1144.45 207.95 L 1143.43 205.36 C 1142.51 205.63 1141.37 205.7 1140.2 205.39 L 1139.19 207.94 C 1139.03 208.2 1138.84 208.43 1138.4 208.32 L 1136.05 207.32 C 1135.72 207.07 1135.56 206.77 1135.77 206.36 L 1136.89 204.07 C 1135.9 203.3 1135.08 202.48 1134.43 201.62 L 1132.03 202.63 C 1131.65 202.77 1131.35 202.68 1131.13 202.32 L 1130.17 199.96 C 1130.07 199.65 1130.15 199.28 1130.5 199.1 L 1132.99 197.99 C 1132.89 196.88 1132.88 195.77 1132.98 194.66 Z M 1135.66 196.27 C 1135.66 200.2 1138.8 202.64 1141.87 202.64 C 1145.22 202.64 1147.97 199.72 1147.97 196.33 C 1147.97 192.69 1145 189.96 1141.89 189.96 C 1138.85 189.96 1135.66 192.33 1135.66 196.27 Z" fill="#505050" stroke="none" pointer-events="none"/>
<rect x="1007.02" y="110.14" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 126px; margin-left: 1008px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
storageprovider
</div>
</div>
@@ -89,13 +88,13 @@
</text>
</switch>
</g>
<rect x="1007.02" y="148.78" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="1007.02" y="148.78" width="130" height="31.37" rx="4.71" ry="4.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 164px; margin-left: 1008px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
dataprovider
</div>
</div>
@@ -106,13 +105,13 @@
</text>
</switch>
</g>
<rect x="328" y="56.06" width="128.33" height="165.94" rx="5.13" ry="5.13" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<rect x="328" y="56.06" width="128.33" height="165.94" rx="5.13" ry="5.13" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 112px; height: 1px; padding-top: 70px; margin-left: 336px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
frontend
</div>
</div>
@@ -123,16 +122,15 @@
</text>
</switch>
</g>
<rect x="442.77" y="202.21" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,451.3,215.34)" pointer-events="all"/>
<rect x="440.16" y="203.76" width="23.84" height="24.24" fill="none" stroke="none" pointer-events="all"/>
<path d="M 443.13 214.23 L 440.67 213.19 C 440.31 212.99 440.16 212.7 440.3 212.28 L 441.24 210 C 441.44 209.65 441.71 209.45 442.13 209.63 L 444.43 210.81 C 445.17 209.92 445.97 209.04 446.86 208.28 L 445.86 205.77 C 445.78 205.47 445.75 205.18 446.17 204.9 L 448.49 203.91 C 448.93 203.76 449.18 203.96 449.33 204.22 L 450.36 206.79 C 451.4 206.58 452.43 206.49 453.64 206.85 L 454.68 204.24 C 454.91 203.88 455.2 203.77 455.55 203.91 L 457.85 204.9 C 458.23 205.14 458.26 205.43 458.17 205.74 L 457.15 208.31 C 458.05 209.04 458.88 209.83 459.55 210.71 L 462.02 209.68 C 462.47 209.56 462.73 209.73 462.9 210.06 L 463.87 212.4 C 463.93 212.75 463.86 213.04 463.52 213.23 L 461.01 214.27 C 461.13 215.27 461.11 216.52 461 217.63 L 463.52 218.67 C 463.86 218.88 464 219.16 463.9 219.52 L 462.99 221.71 C 462.81 222 462.56 222.14 462.19 222.05 L 459.65 221 C 458.98 221.93 458.15 222.76 457.21 223.47 L 458.21 225.99 C 458.37 226.4 458.17 226.74 457.94 226.86 L 455.49 227.9 C 455.17 227.96 454.88 227.93 454.73 227.51 L 453.7 224.93 C 452.77 225.2 451.62 225.27 450.43 224.96 L 449.41 227.5 C 449.25 227.77 449.07 228 448.62 227.89 L 446.23 226.88 C 445.9 226.64 445.75 226.34 445.96 225.93 L 447.09 223.64 C 446.09 222.87 445.26 222.05 444.6 221.19 L 442.18 222.2 C 441.79 222.34 441.48 222.24 441.26 221.89 L 440.29 219.53 C 440.19 219.22 440.27 218.84 440.63 218.67 L 443.14 217.56 C 443.04 216.45 443.03 215.34 443.13 214.23 Z M 445.84 215.84 C 445.84 219.77 449.03 222.21 452.13 222.21 C 455.51 222.21 458.3 219.29 458.3 215.9 C 458.3 212.26 455.29 209.53 452.15 209.53 C 449.07 209.53 445.84 211.89 445.84 215.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="347.87" y="93.06" width="100" height="66" rx="9.9" ry="9.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="442.77" y="202.21" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,451.3,215.34)" pointer-events="none"/>
<path d="M 443.13 214.23 L 440.67 213.19 C 440.31 212.99 440.16 212.7 440.3 212.28 L 441.24 210 C 441.44 209.65 441.71 209.45 442.13 209.63 L 444.43 210.81 C 445.17 209.92 445.97 209.04 446.86 208.28 L 445.86 205.77 C 445.78 205.47 445.75 205.18 446.17 204.9 L 448.49 203.91 C 448.93 203.76 449.18 203.96 449.33 204.22 L 450.36 206.79 C 451.4 206.58 452.43 206.49 453.64 206.85 L 454.68 204.24 C 454.91 203.88 455.2 203.77 455.55 203.91 L 457.85 204.9 C 458.23 205.14 458.26 205.43 458.17 205.74 L 457.15 208.31 C 458.05 209.04 458.88 209.83 459.55 210.71 L 462.02 209.68 C 462.47 209.56 462.73 209.73 462.9 210.06 L 463.87 212.4 C 463.93 212.75 463.86 213.04 463.52 213.23 L 461.01 214.27 C 461.13 215.27 461.11 216.52 461 217.63 L 463.52 218.67 C 463.86 218.88 464 219.16 463.9 219.52 L 462.99 221.71 C 462.81 222 462.56 222.14 462.19 222.05 L 459.65 221 C 458.98 221.93 458.15 222.76 457.21 223.47 L 458.21 225.99 C 458.37 226.4 458.17 226.74 457.94 226.86 L 455.49 227.9 C 455.17 227.96 454.88 227.93 454.73 227.51 L 453.7 224.93 C 452.77 225.2 451.62 225.27 450.43 224.96 L 449.41 227.5 C 449.25 227.77 449.07 228 448.62 227.89 L 446.23 226.88 C 445.9 226.64 445.75 226.34 445.96 225.93 L 447.09 223.64 C 446.09 222.87 445.26 222.05 444.6 221.19 L 442.18 222.2 C 441.79 222.34 441.48 222.24 441.26 221.89 L 440.29 219.53 C 440.19 219.22 440.27 218.84 440.63 218.67 L 443.14 217.56 C 443.04 216.45 443.03 215.34 443.13 214.23 Z M 445.84 215.84 C 445.84 219.77 449.03 222.21 452.13 222.21 C 455.51 222.21 458.3 219.29 458.3 215.9 C 458.3 212.26 455.29 209.53 452.15 209.53 C 449.07 209.53 445.84 211.89 445.84 215.84 Z" fill="#505050" stroke="none" pointer-events="none"/>
<rect x="347.87" y="93.06" width="100" height="66" rx="9.9" ry="9.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 126px; margin-left: 349px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
ocdav
</div>
</div>
@@ -143,13 +141,13 @@
</text>
</switch>
</g>
<rect x="347.87" y="173.06" width="100" height="26.65" rx="4" ry="4" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="347.87" y="173.06" width="100" height="26.65" rx="4" ry="4" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 186px; margin-left: 349px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
ocs
</div>
</div>
@@ -160,14 +158,14 @@
</text>
</switch>
</g>
<path d="M 8 110 L 339.63 109.57" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 345.63 109.56 L 337.64 113.57 L 339.63 109.57 L 337.63 105.57 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 8 110 L 339.63 109.57" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
<path d="M 345.63 109.56 L 337.64 113.57 L 339.63 109.57 L 337.63 105.57 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 51px; margin-left: 80px;">
<div style="box-sizing: border-box; font-size: 0; text-align: left; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
/webdav
<br/>
@@ -203,14 +201,14 @@
</text>
</switch>
</g>
<path d="M 8 186 L 339.63 186.38" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 345.63 186.38 L 337.63 190.37 L 339.63 186.38 L 337.64 182.37 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 8 186 L 339.63 186.38" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
<path d="M 345.63 186.38 L 337.63 190.37 L 339.63 186.38 L 337.64 182.37 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 170px; margin-left: 178px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
/ocs/v1.php/apps/files_sharing/api/v1/shares
</font>
@@ -223,13 +221,13 @@
</text>
</switch>
</g>
<rect x="608" y="56.06" width="213.87" height="166.34" rx="6.65" ry="6.65" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<rect x="608" y="56.06" width="213.87" height="166.34" rx="6.65" ry="6.65" fill="none" stroke="#505050" stroke-width="5" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 216px; height: 1px; padding-top: 61px; margin-left: 607px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
gateway
</div>
</div>
@@ -240,16 +238,15 @@
</text>
</switch>
</g>
<rect x="808.31" y="203.61" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,816.83,216.74)" pointer-events="all"/>
<rect x="805.7" y="205.16" width="23.84" height="24.24" fill="none" stroke="none" pointer-events="all"/>
<path d="M 808.67 215.63 L 806.2 214.59 C 805.85 214.39 805.7 214.1 805.84 213.68 L 806.77 211.4 C 806.98 211.05 807.25 210.85 807.67 211.03 L 809.97 212.21 C 810.7 211.32 811.51 210.44 812.4 209.68 L 811.39 207.17 C 811.32 206.87 811.29 206.58 811.71 206.3 L 814.02 205.31 C 814.47 205.16 814.72 205.36 814.87 205.62 L 815.9 208.19 C 816.94 207.98 817.97 207.89 819.18 208.25 L 820.22 205.64 C 820.44 205.28 820.74 205.17 821.09 205.31 L 823.39 206.3 C 823.77 206.54 823.8 206.83 823.71 207.14 L 822.69 209.71 C 823.59 210.44 824.41 211.23 825.08 212.11 L 827.56 211.08 C 828 210.96 828.27 211.13 828.43 211.46 L 829.4 213.8 C 829.47 214.15 829.39 214.44 829.06 214.63 L 826.54 215.67 C 826.66 216.67 826.65 217.92 826.54 219.03 L 829.05 220.07 C 829.39 220.28 829.54 220.56 829.43 220.92 L 828.52 223.11 C 828.34 223.4 828.09 223.54 827.73 223.45 L 825.19 222.4 C 824.52 223.33 823.69 224.16 822.75 224.87 L 823.75 227.39 C 823.91 227.8 823.71 228.14 823.47 228.26 L 821.03 229.3 C 820.71 229.36 820.41 229.33 820.27 228.91 L 819.24 226.33 C 818.31 226.6 817.15 226.67 815.97 226.36 L 814.95 228.9 C 814.79 229.17 814.6 229.4 814.15 229.29 L 811.77 228.28 C 811.44 228.04 811.28 227.74 811.5 227.33 L 812.62 225.04 C 811.63 224.27 810.79 223.45 810.14 222.59 L 807.71 223.6 C 807.33 223.74 807.02 223.64 806.8 223.29 L 805.83 220.93 C 805.73 220.62 805.81 220.24 806.16 220.07 L 808.68 218.96 C 808.58 217.85 808.57 216.74 808.67 215.63 Z M 811.38 217.24 C 811.38 221.17 814.56 223.61 817.67 223.61 C 821.05 223.61 823.84 220.69 823.84 217.3 C 823.84 213.66 820.83 210.93 817.69 210.93 C 814.61 210.93 811.38 213.29 811.38 217.24 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="738" y="86.06" width="70" height="112.41" rx="4.9" ry="4.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="808.31" y="203.61" width="17.06" height="26.26" rx="2.56" ry="2.56" fill="#ffffff" stroke="none" transform="rotate(40,816.83,216.74)" pointer-events="none"/>
<path d="M 808.67 215.63 L 806.2 214.59 C 805.85 214.39 805.7 214.1 805.84 213.68 L 806.77 211.4 C 806.98 211.05 807.25 210.85 807.67 211.03 L 809.97 212.21 C 810.7 211.32 811.51 210.44 812.4 209.68 L 811.39 207.17 C 811.32 206.87 811.29 206.58 811.71 206.3 L 814.02 205.31 C 814.47 205.16 814.72 205.36 814.87 205.62 L 815.9 208.19 C 816.94 207.98 817.97 207.89 819.18 208.25 L 820.22 205.64 C 820.44 205.28 820.74 205.17 821.09 205.31 L 823.39 206.3 C 823.77 206.54 823.8 206.83 823.71 207.14 L 822.69 209.71 C 823.59 210.44 824.41 211.23 825.08 212.11 L 827.56 211.08 C 828 210.96 828.27 211.13 828.43 211.46 L 829.4 213.8 C 829.47 214.15 829.39 214.44 829.06 214.63 L 826.54 215.67 C 826.66 216.67 826.65 217.92 826.54 219.03 L 829.05 220.07 C 829.39 220.28 829.54 220.56 829.43 220.92 L 828.52 223.11 C 828.34 223.4 828.09 223.54 827.73 223.45 L 825.19 222.4 C 824.52 223.33 823.69 224.16 822.75 224.87 L 823.75 227.39 C 823.91 227.8 823.71 228.14 823.47 228.26 L 821.03 229.3 C 820.71 229.36 820.41 229.33 820.27 228.91 L 819.24 226.33 C 818.31 226.6 817.15 226.67 815.97 226.36 L 814.95 228.9 C 814.79 229.17 814.6 229.4 814.15 229.29 L 811.77 228.28 C 811.44 228.04 811.28 227.74 811.5 227.33 L 812.62 225.04 C 811.63 224.27 810.79 223.45 810.14 222.59 L 807.71 223.6 C 807.33 223.74 807.02 223.64 806.8 223.29 L 805.83 220.93 C 805.73 220.62 805.81 220.24 806.16 220.07 L 808.68 218.96 C 808.58 217.85 808.57 216.74 808.67 215.63 Z M 811.38 217.24 C 811.38 221.17 814.56 223.61 817.67 223.61 C 821.05 223.61 823.84 220.69 823.84 217.3 C 823.84 213.66 820.83 210.93 817.69 210.93 C 814.61 210.93 811.38 213.29 811.38 217.24 Z" fill="#505050" stroke="none" pointer-events="none"/>
<rect x="738" y="86.06" width="70" height="112.41" rx="4.9" ry="4.9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 142px; margin-left: 739px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
gateway
</div>
</div>
@@ -260,13 +257,13 @@
</text>
</switch>
</g>
<rect x="628" y="86.06" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="628" y="86.06" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 110px; margin-left: 629px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
authregistry
</div>
</div>
@@ -277,13 +274,13 @@
</text>
</switch>
</g>
<rect x="628" y="149.99" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<rect x="628" y="149.99" width="90" height="48.48" rx="7.27" ry="7.27" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 174px; margin-left: 629px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: none; white-space: normal; word-wrap: normal; ">
storageregistry
</div>
</div>
@@ -294,15 +291,15 @@
</text>
</switch>
</g>
<path d="M 738 114.16 L 718 110.3" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<path d="M 738 170.36 L 718 174.23" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<path d="M 338 251 L 338 1" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/>
<path d="M 738 114.16 L 718 110.3" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/>
<path d="M 738 170.36 L 718 174.23" fill="none" stroke="#505050" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/>
<path d="M 338 251 L 338 1" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 281px; margin-left: 338px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
oc10 namespace
<br/>
(all paths aere relative to the users home)
@@ -315,13 +312,13 @@
</text>
</switch>
</g>
<path d="M 618 251 L 618 11" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="stroke"/>
<path d="M 618 251 L 618 11" fill="none" stroke="#505050" stroke-width="3" stroke-miterlimit="10" stroke-dasharray="9 9" pointer-events="none"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 281px; margin-left: 618px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #505050; line-height: 1.2; pointer-events: none; background-color: #ffffff; white-space: nowrap; ">
CS3 global namespace
</div>
</div>

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

+1 -1
View File
@@ -11,7 +11,7 @@ TODO add this to the storage overview? or is this a different part? That should
### User and Group provisioning
In oc10 users are identified by a username, which cannot change, because it is used as a foreign key in several tables. For oCIS we are internally identifying users by a UUID, while using the username in the WebDAV and OCS APIs for backwards compatability. To distinguish this in the URLs we are using `<username>` instead of `<userid>`. You may have encountered `<userlayout>`, which refers to a template that can be configured to build several path segments by filling in user properties, e.g. the first character of the username (`{{substr 0 1 .Username}}/{{.Username}}`), the identity provider (`{{.Id.Idp}}/{{.Username}}`) or the email (`{{.Mail}}`)
In oc10 users are identified by a username, which cannot change, because it is used as a foreign key in several tables. For oCIS we are internally identifying users by a UUID, while using the username in the WebDAV and OCS APIs for backwards compatability. To distinguish this in the URLs we are using `<username>` instead of `<userid>`. You may have encountered `<user_layout>`, which refers to a template that can be configured to build several path segments by filling in user properties, e.g. the first character of the username (`{{substr 0 1 .Username}}/{{.Username}}`), the identity provider (`{{.Id.Idp}}/{{.Username}}`) or the email (`{{.Mail}}`)
{{< hint warning >}}
Make no mistake, the [OCS Provisioning API](https://doc.owncloud.com/server/developer_manual/core/apis/provisioning-api.html) uses `userid` while it actually is the username, because it is what you use to login.