add frontend endpoint descriptions

Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
This commit is contained in:
Jörn Friedrich Dreyer
2021-04-20 15:04:56 +00:00
parent 10ac4946ef
commit 781272e327
6 changed files with 525 additions and 16 deletions
+162 -7
View File
@@ -26,9 +26,108 @@ The dashed lines in the diagram indicate requests that are made to authenticate
2. The gateway will verify the JWT signature of the `x-access-token` or try to authenticate the request itself, e.g. using a public link token.
{{< hint warning >}}
The bottom part is lighter because we will deprecate it in favor of using only the CS3 user and group providers after moving some account functionality into reva and glauth. The metadata storage is not registered in the reva gateway to seperate metadata necessary for running the service from data that is being served directly.
The bottom part is lighter because we will deprecate it in favor of using only the CS3 user and group providers after moving some account functionality into reva and glauth. The metadata storage is not registered in the reva gateway to seperate metadata necessary for running the service from data that is being served directly.
{{< /hint >}}
## Endpoints and references
In order to reason about the request flow, two aspects in the architecture need to be understood well:
1. The endpoints that are handling requests: what resources are presented at the available URL endpoints?
2. The resource identifiers that are exposed or required: path or id based?
### Frontend
The ocis frontend service starts all services that handle incoming HTTP requests:
- *ocdav* for ownCloud flavoured WebDAV
- *ocs* for sharing, user management, capabilities and other OCS API endpoints
- *datagateway* for up and downloads
- TODO: *ocm*
{{< svg src="extensions/storage/static/frontend.drawio.svg" >}}
#### WebDAV
The ocdav service not only handles all WebDAV requests under `(remote.php/)(web)dav` but also some other legacy endpoints like `status.php`:
| endpoint | service | CS3 api | CS3 namespace | description | TODO |
|----------|---------|-------------|------|------|------|
| `status.php` | ocdav | - | - | currently static | should return compiled version and dynamic values |
| `(remote.php/)webdav` | ocdav | storageprovider | `/home` | the old webdav endpoint | |
| `(remote.php/)dav/files/<username>` | ocdav | storageprovider | `/home` | the new webdav endpoint | |
| `(remote.php/)dav/meta/<fileid>/v` | ocdav | storageprovider | id based | versions | |
| `(remote.php/)dav/trash-bin/<username>` | ocdav | recycle | - | trash | should aggregate the trash of storage spaces the user has access to |
| `(remote.php/)dav/public-files/<token>` | ocdav | storageprovider | `/public/<token>` | public links | |
| `(remote.php/)dav/avatars/<username>` | ocdav | - | - | avatars, hardcoded | look up from user provider and cache |
| *CernBox setup:* |||||
| `(remote.php/)webdav` | ocdav | storageprovider | `/` | | |
| *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>` | | |
| *Spaces concept:* |||||
| `(remote.php/)dav/(spaces|global)/<username>/<spaceid>` | ocdav | storageregistry & storageprovider | `spaceid`+`relative path` | spaces concept | allow listing and accessing spaces |
The correct endpoint for a users home storage space in oc10 is `remote.php/dav/files/<username>`. In oc10 All requests at this endpoint use a path based reference that is relative to the users home. In oCIS this can be configured and defaults to `/home` as well. Other API endpoints like ocs and the web UI still expect this to be the users home.
In oc10 we originally had `remote.php/webdav` which would render the current users home storage space. The early versions (pre OC7) would jail all received shares into a `remote.php/webdav/shares` subfolder. The semantics for syncing such a folder are [not trivially predictable](https://github.com/owncloud/core/issues/5349), which is why we made shares [freely mountable](https://github.com/owncloud/core/pull/8026) anywhere in the users home.
The current reva implementation jails shares into a `remote.php/webdav/Shares` folder for performance reasons. Obviously, this brings back the [special semantics for syncing](https://github.com/owncloud/product/issues/7). In the future we will follow [a different solution](https://github.com/owncloud/product/issues/302) and jail the received shares into a dedicated `/shares` space, on the same level as `/home` and `/spaces`. We will add a dedicated [API to list all *storage spaces*](https://github.com/owncloud/ocis/pull/1827) a user has access to and where they are mounted in the users *namespace*.
{{< hint warning >}}
Existing folder sync pairs in legacy clients will break when moving the user home down in the path hierarchy like CernBox did.
For legacy clients the `remote.php/webdav` endpoint will no longer list the users home directly, but instead present the different types of storage spaces:
- `remote.php/webdav/home`: the users home is pushed down into a new `home` *storage space*
- `remote.php/webdav/shares`: all mounted shares will be moved to a new `shares` *storage space*
- `remote.php/webdav/spaces`: other *storage spaces* the user has access to, e.g. group or project drives
{{< /hint >}}
{{< hint warning >}}
An alternative would be to introduce a new `remote.php/dav/spaces` or `remote.php/dav/global` endpoint. However, `remote.php/dav` properly follows the WebDAV RFCs strictly. To ensure that all resources under that namespace are scoped to the user the URL would have to include the principal like `remote.php/dav/spaces/<username>`, a precondition for e.g. WebDAV [RFC5397](https://tools.ietf.org/html/rfc5397). For a history lesson start at [Replace WebDAV with REST
owncloud/core#12504](https://github.com/owncloud/core/issues/12504#issuecomment-65218491) which spawned [Add extra layer in DAV to accomodate for other services like versions, trashbin, etc owncloud/core#12543](https://github.com/owncloud/core/issues/12543)
{{< /hint >}}
#### Sharing
The [OCS Share API](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html) endpoint `/ocs/v1.php/apps/files_sharing/api/v1/shares` returns shares, which have their own share id and reference files using a path relative to the users home. They API also lists the numeric storage id as well as the string type `storage_id` (which is confusing ... but yeah) which would allow constructing combined references with a storage spacle id and a path relative to the root of that storage space. The web UI however assumes that it can take the path from the `file_target` and append it to the users home to access it.
{{< hint >}}
The API [already returns the storage id](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html#example-request-response-payloads-4) (and numeric id) in addition to the file id:
```
<storage_id>home::auser</storage_id>
<storage>993</storage>
<item_source>3994486</item_source>
<file_source>3994486</file_source>
<file_parent>3994485</file_parent>
<file_target>/Shared/Paris.jpg</file_target>
```
[Creating shares only takes the **path** as the argument](https://doc.owncloud.com/server/developer_manual/core/apis/ocs-share-api.html#function-arguments) so creating and navigating shares only needs the path. When you update or delete a share it takes the `share id` not the `file id`.
{{< /hint >}}
The OCS service makes a stat request to the storage provider to get a [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) object. It contains both, a [`ResourceId`](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId) *and* an absolute path. If the *resource* exists a request is sent to the gateway. Depending on the type of share the [Collaboration API](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.CollaborationAPI), the [Link API](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.LinkAPI) or the [Open Cloud Mesh API](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.OcmAPI) endpoints are used.
| API | Request | Resource identified by | Grant type | Further arguments |
|-----|---------|------------------------|------------|-------------------|
| Collaboration | [CreateShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.CreateShareRequest) | [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) | [ShareGrant](https://cs3org.github.io/cs3apis/#cs3.sharing.collaboration.v1beta1.ShareGrant) | - |
| Link | [CreatePublicShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.CreatePublicShareRequest) | [ResourceInfo](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceInfo) | Link [Grant](https://cs3org.github.io/cs3apis/#cs3.sharing.link.v1beta1.Grant) | We send the public link `name` in the `ArbitraryMetadata` of the `ResourceInfo` |
| Open Cloud Mesh | [CreateOCMShareRequest](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.CreateOCMShareRequest) | [ResourceId](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId) | OCM [ShareGrant](https://cs3org.github.io/cs3apis/#cs3.sharing.ocm.v1beta1.ShareGrant) | OCM [ProviderInfo](https://cs3org.github.io/cs3apis/#cs3.ocm.provider.v1beta1.ProviderInfo) |
{{< hint >}}
The user and public share provider implementations identify the file using the `ResourceId`. The `ResourceInfo` is passed so the share provider can also store who the owner of the resource is. The *path* is not part of the other API calls, e.g. when listing shares.
The OCM API takes an id based reference on the CS3 api, even if the OCM HTTP endpoint takes a path argument. Why? Does it not need the owner? It only stores the owner of the share, which is always the currently looged in user, when creating a share. Afterwards only the owner can update a share ... so collaborative management of shares is not possible. At least for OCM shares.
{{< /hint >}}
#### 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 configuted to build several path segments by filling in user properties, e.g. the first two characters of the username or the issuer.
{{< 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.
{{< /hint >}}
We are currently working on adding [user management through the CS3 API](https://github.com/owncloud/ocis/pull/1930) to handle user and group provisioning (and deprovisioning).
## Terminology
Communication is hard. And clear communication is even harder. You may encounter the following terms throughout the documentation, in the code or when talking to other developers. Just keep in mind that whenever you hear or read *storage*, that term needs to be clarified, because on its own it is too vague. PR welcome.
@@ -47,21 +146,44 @@ A [*reference*](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.R
- an [*id* based reference](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.ResourceId), uniquely identifying a *resource* in the *namespace* of a *storage provider*. It consists of a `storage provider id` and an `opaque id`. The `storage provider id` must NOT start with a `/`.
{{< hint info >}}
The `/` is important because currenty the static *storage registry* uses a map to look up which *storage provider* is responsible for the resource. Paths must be prefixed with `/` so there can be no collisions between paths and storage provider ids in the same map.
The `/` is important because currently the static *storage registry* uses a map to look up which *storage provider* is responsible for the resource. Paths must be prefixed with `/` so there can be no collisions between paths and storage provider ids in the same map.
{{< /hint >}}
{{< hint ok >}}
#### Alternative 1: root:(fileid|path) references ####
A *reference* is a logical concept. It identifies a *resource* and consists of
a *storage space* and an *opaqueid* or a *path* relative to the *root* of the storage space:
```
<storages_space>:<relative_path>
<storages_space>:<opaqueid>
```
In order to build a global namespace storage spaces can have aliases that the registry resolves into id based references. The ocdav service would have to look up the storage space that is responsible for an absolute path by talking to the registry (or the gateway transparently resolves absolute paths)
{{< /hint >}}
{{< hint warning >}}
**Proposed Change**
#### Alternative 2: reference triple ####
A *reference* is a logical concept. It identifies a *resource* and consists of
a *root* and a *path* relative to that *root*.
A *root* is a `storage space id` and a `logical uuid` of a resource inside the *storage space*:
```
<storages_pace>:<logical_uuid>:<relative_path>
`------------root------------´ `----path-----´
<storages_space>:<root_id>:<relative_path>
`-----------root---------´ `----path-----´
```
*root* and *path* are both optional. The `storage space id` should be a uuid to prevent references from breaking when a *user* or *storage space* gets renamed. The following are all valid references:
or to clarify
```
<storages_space>:<root>:<relative_path>
```
Where actually only three cases are used:
1. `::<relative_path>` = absolute path
2. `<storages_space>::<relative_path>` = path relative to the root of the space
3. `<storages_space>:<root>:<relative_path>` = path relative to the specified node in the space
| Name | Description |
|------|-------------|
|`::/users/alice/projects/foo` | follow this path in the global namespace (path based reference)|
@@ -73,9 +195,41 @@ A *root* is a `storage space id` and a `logical uuid` of a resource inside the *
All those examples reference the same *resource* (if the `logical uuid` of `projects` is
`c3cf23bb-8f47-4719-a150-1d25a1f6fb56` and the `logical uuid` of `foo` is `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a`).
To move *storage spaces* between *storage providers*, migrate files or restore backups, the `logical uuid` of a file must be writable.
A reference will often start as an absolute/global path, e.g. `::/home/Projects/Foo`. The gateway will look up the storage provider that is responsible for the path
| Name | Description | Who resolves it? |
|------|-------------|-|
| `::/home/Projects/Foo` | the absolute path a client like davfs will use. | The gateway uses the storage registry to look up the responsible storage provider |
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62::/Projects/Foo` | the `storage space id` is the same as the `root`, the path becomes relative to the root | the storage provider can use this reference to identify this resource |
Now, the same file is accessed as a share
| Name | Description |
| `::/users/Einstein/Projects/Foo` | `Foo` is the shared folder |
| `ee1687e5-ac7f-426d-a6c0-03fed91d5f62:56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a:` | `56f7ceca-e7f8-4530-9a7a-fe4b7ec8089a` is the id of `Foo`, the path is empty |
{{< /hint >}}
{{< hint >}}
Note: the graph api uses `!` to seperate the `driveId` from a drive internal item `id` (`1383` which obviously is an opaque string no one should mess with):
```json
"parentReference": {
"driveId": "c12644a14b0a7750",
"driveType": "personal",
"id": "C12644A14B0A7750!1383",
"name": "Screenshots",
"path": "/drive/root:/Bilder/Screenshots"
},
```
For the hot migration of oc10 instances a single *storage provider* with the owncloudsql *storage driver* can be used to handle all existing storages by prefixing the numeric `storage` id from the oc_storages table, e.g. `legacy-home` or `oc10-storages`. Using `$` as a seperator the reference *root* would be `<prefix>$<storage>` or `oc10-storages$234`.
File ids would become `<prefix>$<storage>!<fileid>`.
{{< /hint >}}
### Namespaces
A *namespace* is a set of paths with a common prefix. There is a global namespace when making requests against the CS3 *gateway* and a local namespace for every *storage provider*. Currently, oCIS mounts these *storage providers* out of the box:
@@ -146,6 +300,7 @@ a *quota* and *permissions*, identified by a `storage space id`.
{{< svg src="extensions/storage/static/storagespace.drawio.svg" >}}
Examples would be every user's home storage space, project storage spaces or group storage spaces. While they all serve different purposes and may or may not have workflows like anti virus scanning enabled, we need a way to identify and manage these subtrees in a generic way. By creating a dedicated concept for them this becomes easier and literally makes the codebase cleaner.
Examples would be every user's home storage space, project storage spaces or group storage spaces. While they all serve different purposes and may or may not have workflows like anti virus scanning enabled, we need a way to identify and manage these subtrees in a generic way. By creating a dedicated concept for them this becomes easier and literally makes the codebase cleaner. A *storage registry* then allows listing the properties of storage spaces, e.g. free space, quota, owner, syncable, root etag, uploed workflow steps, ...
Finally, a logical `storage space id` is not tied to a specific storage provider. If the *storage driver* supports it, we can import existing files including their *file id*, which makes it possible to move storage spaces between storage spaces to implement storage classes, e.g. with or without archival, workflows, on SSDs or HDDs.
@@ -0,0 +1,303 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-0.5 -0.5 1154 474" 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 8 71 L 317.87 70.73" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 323.87 70.73 L 315.87 74.73 L 317.87 70.73 L 315.86 66.73 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 62px; margin-left: 162px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
GET /data/&lt;transfer_token&gt;
</font>
</div>
</div>
</div>
</foreignObject>
<text x="162" y="65" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
GET /da...
</text>
</switch>
</g>
<path d="M 8 132 L 317.87 132.21" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 323.87 132.21 L 315.86 136.21 L 317.87 132.21 L 315.87 128.21 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 122px; margin-left: 162px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
PROPFIND /webdav
</font>
</div>
</div>
</div>
</foreignObject>
<text x="162" y="125" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
PROPFIN...
</text>
</switch>
</g>
<path d="M 8 228 L 317.87 227.74" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 323.87 227.73 L 315.87 231.74 L 317.87 227.74 L 315.86 223.74 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 194px; margin-left: 152px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<div style="text-align: left">
<font face="Courier New">
POST /ocs/v1/apps/files_sharing/api/v1/shares
</font>
</div>
<div style="text-align: left">
<font face="Courier New">
path=/path/to/file
</font>
</div>
<div style="text-align: left">
<font face="Courier New">
shareType=0
</font>
</div>
<div style="text-align: left">
<font face="Courier New">
shareWith=&lt;username&gt;
</font>
</div>
</div>
</div>
</div>
</foreignObject>
<text x="152" y="197" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
POST /o...
</text>
</switch>
</g>
<rect x="308" y="2" width="217" height="326.31" rx="8.68" ry="8.68" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<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: 189px; height: 1px; padding-top: 22px; margin-left: 322px;">
<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; ">
frontend
</div>
</div>
</div>
</foreignObject>
<text x="417" y="34" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
frontend
</text>
</switch>
</g>
<rect x="500.13" y="293.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,515.77,317.92)" pointer-events="all"/>
<rect x="495.35" y="296.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
<path d="M 500.79 315.89 L 496.28 313.98 C 495.62 313.61 495.35 313.08 495.6 312.32 L 497.32 308.13 C 497.7 307.5 498.19 307.14 498.96 307.45 L 503.18 309.61 C 504.53 307.99 506 306.38 507.64 304.98 L 505.79 300.38 C 505.65 299.83 505.6 299.29 506.38 298.78 L 510.62 296.96 C 511.43 296.7 511.89 297.05 512.16 297.54 L 514.06 302.25 C 515.96 301.87 517.85 301.69 520.07 302.36 L 521.98 297.57 C 522.39 296.9 522.93 296.72 523.57 296.96 L 527.79 298.78 C 528.48 299.22 528.55 299.76 528.38 300.32 L 526.51 305.04 C 528.15 306.38 529.67 307.82 530.9 309.44 L 535.44 307.55 C 536.26 307.32 536.74 307.64 537.04 308.25 L 538.82 312.54 C 538.94 313.17 538.8 313.7 538.19 314.06 L 533.57 315.96 C 533.79 317.8 533.77 320.1 533.56 322.13 L 538.18 324.03 C 538.8 324.42 539.07 324.93 538.87 325.59 L 537.21 329.61 C 536.88 330.13 536.42 330.4 535.75 330.23 L 531.09 328.32 C 529.87 330.02 528.34 331.53 526.62 332.84 L 528.46 337.47 C 528.75 338.2 528.37 338.83 527.94 339.06 L 523.47 340.96 C 522.87 341.06 522.33 341.02 522.07 340.25 L 520.18 335.52 C 518.48 336.01 516.36 336.13 514.19 335.57 L 512.32 340.23 C 512.02 340.72 511.68 341.15 510.85 340.94 L 506.49 339.1 C 505.87 338.65 505.59 338.1 505.98 337.34 L 508.05 333.14 C 506.22 331.74 504.69 330.24 503.49 328.65 L 499.04 330.51 C 498.34 330.77 497.77 330.59 497.37 329.94 L 495.59 325.6 C 495.4 325.04 495.55 324.36 496.21 324.03 L 500.81 322 C 500.63 319.96 500.61 317.93 500.79 315.89 Z M 505.76 318.84 C 505.76 326.05 511.6 330.52 517.3 330.52 C 523.5 330.52 528.61 325.18 528.61 318.95 C 528.61 312.28 523.1 307.28 517.33 307.28 C 511.69 307.28 505.76 311.61 505.76 318.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="326.1" y="38.17" width="183.38" height="65.11" rx="9.77" ry="9.77" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<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: 181px; height: 1px; padding-top: 71px; margin-left: 327px;">
<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; ">
datagateway
</div>
</div>
</div>
</foreignObject>
<text x="418" y="74" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
datagateway
</text>
</switch>
</g>
<rect x="326.1" y="110.51" width="183.38" height="86.81" rx="13.02" ry="13.02" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<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: 181px; height: 1px; padding-top: 154px; margin-left: 327px;">
<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; ">
ocdav
</div>
</div>
</div>
</foreignObject>
<text x="418" y="158" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
ocdav
</text>
</switch>
</g>
<rect x="326.1" y="206.55" width="183.38" height="84.71" rx="12.71" ry="12.71" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<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: 181px; height: 1px; padding-top: 249px; margin-left: 327px;">
<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; ">
ocs
</div>
</div>
</div>
</foreignObject>
<text x="418" y="253" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
ocs
</text>
</switch>
</g>
<rect x="678" y="96" width="217" height="232.31" rx="8.68" ry="8.68" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<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: 189px; height: 1px; padding-top: 116px; margin-left: 692px;">
<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; ">
gateway
</div>
</div>
</div>
</foreignObject>
<text x="786" y="128" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
gateway
</text>
</switch>
</g>
<rect x="870.13" y="293.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,885.77,317.92)" pointer-events="all"/>
<rect x="865.34" y="296.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
<path d="M 870.79 315.89 L 866.27 313.98 C 865.61 313.61 865.34 313.08 865.6 312.32 L 867.32 308.13 C 867.69 307.5 868.19 307.14 868.96 307.45 L 873.18 309.61 C 874.52 307.99 876 306.38 877.63 304.98 L 875.78 300.38 C 875.65 299.83 875.59 299.29 876.37 298.78 L 880.61 296.96 C 881.42 296.7 881.88 297.05 882.16 297.54 L 884.05 302.25 C 885.96 301.87 887.84 301.69 890.07 302.36 L 891.97 297.57 C 892.38 296.9 892.92 296.72 893.56 296.96 L 897.78 298.78 C 898.48 299.22 898.54 299.76 898.38 300.32 L 896.5 305.04 C 898.15 306.38 899.67 307.82 900.89 309.44 L 905.43 307.55 C 906.25 307.32 906.73 307.64 907.04 308.25 L 908.81 312.54 C 908.93 313.17 908.79 313.7 908.18 314.06 L 903.57 315.96 C 903.79 317.8 903.76 320.1 903.56 322.13 L 908.17 324.03 C 908.79 324.42 909.06 324.93 908.87 325.59 L 907.2 329.61 C 906.87 330.13 906.41 330.4 905.75 330.23 L 901.09 328.32 C 899.86 330.02 898.33 331.53 896.61 332.84 L 898.45 337.47 C 898.74 338.2 898.37 338.83 897.94 339.06 L 893.46 340.96 C 892.87 341.06 892.33 341.02 892.06 340.25 L 890.18 335.52 C 888.47 336.01 886.35 336.13 884.18 335.57 L 882.31 340.23 C 882.01 340.72 881.67 341.15 880.85 340.94 L 876.48 339.1 C 875.87 338.65 875.58 338.1 875.98 337.34 L 878.05 333.14 C 876.22 331.74 874.69 330.24 873.49 328.65 L 869.04 330.51 C 868.33 330.77 867.77 330.59 867.36 329.94 L 865.59 325.6 C 865.4 325.04 865.54 324.36 866.2 324.03 L 870.81 322 C 870.62 319.96 870.6 317.93 870.79 315.89 Z M 875.76 318.84 C 875.76 326.05 881.6 330.52 887.29 330.52 C 893.49 330.52 898.61 325.18 898.61 318.95 C 898.61 312.28 893.1 307.28 887.33 307.28 C 881.68 307.28 875.76 311.61 875.76 318.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="918" y="2" width="217" height="216.31" rx="8.65" ry="8.65" fill="none" stroke="#505050" stroke-width="5" pointer-events="all"/>
<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: 189px; height: 1px; padding-top: 22px; margin-left: 932px;">
<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; ">
storage home | users | ...
</div>
</div>
</div>
</foreignObject>
<text x="1026" y="34" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
storage home | users | ...
</text>
</switch>
</g>
<rect x="1110.13" y="183.85" width="31.28" height="48.15" rx="4.69" ry="4.69" fill="#ffffff" stroke="none" transform="rotate(40,1125.77,207.92)" pointer-events="all"/>
<rect x="1105.34" y="186.7" width="43.72" height="44.45" fill="none" stroke="none" pointer-events="all"/>
<path d="M 1110.79 205.89 L 1106.27 203.98 C 1105.61 203.61 1105.34 203.08 1105.6 202.32 L 1107.32 198.13 C 1107.69 197.5 1108.19 197.14 1108.96 197.45 L 1113.18 199.61 C 1114.52 197.99 1116 196.38 1117.63 194.98 L 1115.78 190.38 C 1115.65 189.83 1115.59 189.29 1116.37 188.78 L 1120.61 186.96 C 1121.42 186.7 1121.88 187.05 1122.16 187.54 L 1124.05 192.25 C 1125.96 191.87 1127.84 191.69 1130.07 192.36 L 1131.97 187.57 C 1132.38 186.9 1132.92 186.72 1133.56 186.96 L 1137.78 188.78 C 1138.48 189.22 1138.54 189.76 1138.38 190.32 L 1136.5 195.04 C 1138.15 196.38 1139.67 197.82 1140.89 199.44 L 1145.43 197.55 C 1146.25 197.32 1146.73 197.64 1147.04 198.25 L 1148.81 202.54 C 1148.93 203.17 1148.79 203.7 1148.18 204.06 L 1143.57 205.96 C 1143.79 207.8 1143.76 210.1 1143.56 212.13 L 1148.17 214.03 C 1148.79 214.42 1149.06 214.93 1148.87 215.59 L 1147.2 219.61 C 1146.87 220.13 1146.41 220.4 1145.75 220.23 L 1141.09 218.32 C 1139.86 220.02 1138.33 221.53 1136.61 222.84 L 1138.45 227.47 C 1138.74 228.2 1138.37 228.83 1137.94 229.06 L 1133.46 230.96 C 1132.87 231.06 1132.33 231.02 1132.06 230.25 L 1130.18 225.52 C 1128.47 226.01 1126.35 226.13 1124.18 225.57 L 1122.31 230.23 C 1122.01 230.72 1121.67 231.15 1120.85 230.94 L 1116.48 229.1 C 1115.87 228.65 1115.58 228.1 1115.98 227.34 L 1118.05 223.14 C 1116.22 221.74 1114.69 220.24 1113.49 218.65 L 1109.04 220.51 C 1108.33 220.77 1107.77 220.59 1107.36 219.94 L 1105.59 215.6 C 1105.4 215.04 1105.54 214.36 1106.2 214.03 L 1110.81 212 C 1110.62 209.96 1110.6 207.93 1110.79 205.89 Z M 1115.76 208.84 C 1115.76 216.05 1121.6 220.52 1127.29 220.52 C 1133.49 220.52 1138.61 215.18 1138.61 208.95 C 1138.61 202.28 1133.1 197.28 1127.33 197.28 C 1121.68 197.28 1115.76 201.61 1115.76 208.84 Z" fill="#505050" stroke="none" pointer-events="all"/>
<rect x="934.8" y="114.16" width="183.38" height="65.11" rx="9.77" ry="9.77" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<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: 181px; height: 1px; padding-top: 147px; margin-left: 936px;">
<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; ">
storageprovider
</div>
</div>
</div>
</foreignObject>
<text x="1026" y="150" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
storageprovider
</text>
</switch>
</g>
<rect x="934.81" y="40.16" width="183.38" height="60" rx="9" ry="9" fill="none" stroke="#505050" stroke-dasharray="3 3" pointer-events="all"/>
<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: 181px; height: 1px; padding-top: 70px; margin-left: 936px;">
<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; ">
dataprovider
</div>
</div>
</div>
</foreignObject>
<text x="1026" y="74" fill="#1A1A1A" font-family="Helvetica" font-size="12px" text-anchor="middle">
dataprovider
</text>
</switch>
</g>
<path d="M 509.49 70.72 L 926.57 70.17" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 932.57 70.16 L 924.57 74.17 L 926.57 70.17 L 924.56 66.17 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 62px; margin-left: 717px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
GET target URL extracted from transfer token (JWT)
</font>
</div>
</div>
</div>
</foreignObject>
<text x="717" y="66" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
GET tar...
</text>
</switch>
</g>
<path d="M 509.49 153.91 L 669.76 154.07" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 675.76 154.08 L 667.76 158.07 L 669.76 154.07 L 667.77 150.07 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 132px; margin-left: 597px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
Stat
<br/>
ListContainer
</font>
</div>
</div>
</div>
</foreignObject>
<text x="597" y="135" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
Stat...
</text>
</switch>
</g>
<path d="M 509.49 270.09 L 669.76 270.23" fill="none" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 675.76 270.23 L 667.76 274.22 L 669.76 270.23 L 667.77 266.22 Z" fill="#505050" stroke="#505050" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/>
<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: 232px; margin-left: 597px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #1A1A1A; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">
<font face="Courier New">
Stat
<br/>
CreateShare
<br/>
CreatePublicShare
<br/>
CreateOCMShare
</font>
</div>
</div>
</div>
</foreignObject>
<text x="597" y="235" fill="#1A1A1A" font-family="Helvetica" font-size="11px" text-anchor="middle">
Stat...
</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
Viewer does not support full SVG 1.1
</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 192 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

@@ -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="851px" height="401px" viewBox="-0.5 -0.5 851 401" 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" viewBox="-0.5 -0.5 851 401" 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>
<rect x="270" y="231" width="50" height="45" fill="none" stroke="none" pointer-events="all"/>

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB