From 8648af09316b3534bea650c6c1dcd4f132f35169 Mon Sep 17 00:00:00 2001 From: Max Bischof Date: Wed, 29 May 2024 15:54:41 +0200 Subject: [PATCH 1/5] Add session handling and local setup --- docs/services/etherpad/How it works.md | 25 +++++ docs/services/etherpad/Local setup.md | 129 +++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 docs/services/etherpad/How it works.md create mode 100644 docs/services/etherpad/Local setup.md diff --git a/docs/services/etherpad/How it works.md b/docs/services/etherpad/How it works.md new file mode 100644 index 0000000..3af56ac --- /dev/null +++ b/docs/services/etherpad/How it works.md @@ -0,0 +1,25 @@ +# How it works + +## Session managment + +### Column and List Board +An etherpad session is created for every click on the etherpad element. This session expires after the amount of time defined by `ETHERPAD_COOKIE__EXPIRES_SECONDS`. This means that a user will loose access to the pad after that time period is expired. Losing access means that after interaction with the pad an english non translated message "You do not have permission to access this pad." will be shown instead of the pad. If a user is not interacting with the pad he will be able to see the content also after the period of `ETHERPAD_COOKIE__EXPIRES_SECONDS`. + +If a user clicks on the etherpad element for the second time, a session that already exists for this element might be returned. If the old session or a new one is created depends on the env var settings. `ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD` defines the amount of time a session must still be valid to be delivered to the user. Currenty in production `ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD` and +`ETHERPAD_COOKIE__EXPIRES_SECONDS` are set to the same value of 2 hours. With that setting for every click on an etherpad element a new session is created. + +There is no such thing as an automatic session renewal on interaction. Etherpad provides the config variable COOKIE_SESSION_REFRESH_INTERVAL which defines the amount of time after a session of a user gets automatically renewed in an open tab. Currently this is not set and so the default of 1 day has no influence because this value is greater than ETHERPAD_COOKIE__EXPIRES_SECONDS. So with that setting sessions are not automatically renewed. + +When user logsout out of schulcloud all sessions are removed and user loses access to the pads on interaction. (Please see description above) + +Currently on schulcloud user autologout, etherpad sessions are not removed automatically. But as long ETHERPAD_COOKIE__EXPIRES_SECONDS and JWT_TIMEOUT_SECONDS are set to the same value, all sessions should theoretically be invalid after autologout. + +A cookie with the name sessionID is stored for every session. Cookies are not programmatically removed after ETHERPAD_COOKIE__EXPIRES_SECONDS or schulcloud logout. + +### Legacy Topics + +Same session behavior also applies to legacy code. Env vars are used by both implementations. + +In contrast to the nest code in legacy code a session is created for every course and stored as a cookie for every etherpad. + + diff --git a/docs/services/etherpad/Local setup.md b/docs/services/etherpad/Local setup.md new file mode 100644 index 0000000..b246342 --- /dev/null +++ b/docs/services/etherpad/Local setup.md @@ -0,0 +1,129 @@ +# Local Setup + +## Running the Etherpad server + +To run the Etherpad service for the local development and resting purposes you can follow the below steps: + +1. Create a new dir that will contain all the needed files that we'll want to use when running the Etherpad service. +Create a directory called sc-etherpad and then enter it, in Unix-like systems you can use the following command: + + `mkdir sc-etherpad && cd sc-etherpad` + +2. Create a new file called APIKEY.txt in it, with the following content: + + `381d67e6347d235ac9446da3ea10a82efd6f8ae09fa2e90efeda80f82feeb4fd` + + We'll use this file to set a fixed Etherpad's API key on the Etherpad server's start. + +3. Create also a file called settings.env with the following content: + + ``` + REQUIRE_SESSION="true" + PAD_OPTIONS_SHOW_CHAT="true" + DISABLE_IP_LOGGING="true" + DEFAULT_PAD_TEXT="Schreib etwas!\n\nDieses Etherpad wird synchronisiert, während du tippst, so dass alle Betrachter jederzeit den selben Text sehen. So könnt ihr auf einfache Weise gemeinsam an Dokumenten arbeiten." + DB_TYPE=mongodb + DB_URL=mongodb://host.docker.internal:27017/etherpad + ``` + We'll use this file to provide all the needed environment variables to the Etherpad's server. + + Please note the last line, that contains the MongoDB connection string: + + `DB_URL=mongodb://host.docker.internal:27017/etherpad` + + Here we're using the host.docker.internal hostname which should make it possible for the Etherpad's container to connect to the host's local network and should work out of the box e.g. on macOS. But please modify it accordingly to your needs and your Docker's network configuration. An alternative configuaration would be to use `DB_URL=mongodb://localhost:27017/etherpad` and than add `--network="host"` to the following docker run command. + +4. Next, start the Etherpad's container: + ``` + docker run -d \ + -p 9001:9001 \ + --env-file ./settings.env \ + -v ./APIKEY.txt:/opt/etherpad-lite/APIKEY.txt \ + --name sc-etherpad \ + docker.io/etherpad/etherpad:2.0.0 + ``` + Please note we're using the docker.io/etherpad/etherpad:2.0.0 image in the command above which might be not the one that is being used anytime in the future when you read this article. To make sure you're using the current version (the one that is currently being used in the SchulCloud platform), please refer to the https://github.com/hpi-schul-cloud/dof_app_deploy/blob/main/ansible/group_vars/infra/dof_etherpad.yml file. + +5. To allow communication between schulcloud- and etherpad-server the following env vars must be set: + ``` + TLDRAW_ADMIN_API_CLIENT__API_KEY=randomString + ADMIN_API__ALLOWED_API_KEYS=randomString + TLDRAW_ADMIN_API_CLIENT__BASE_URL=http://localhost:3349 + ``` + +Now we should have the Etherpad service running locally on port 9001, we can verify it's working properly e.g. by fetching the current Etherpad's API version: + +``` +~ curl -v http://127.0.0.1:9001/api +* Trying 127.0.0.1:9001... +* Connected to 127.0.0.1 (127.0.0.1) port 9001 +> GET /api HTTP/1.1 +> Host: 127.0.0.1:9001 +> User-Agent: curl/8.4.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< X-Powered-By: Express +< X-UA-Compatible: IE=Edge,chrome=1 +< Referrer-Policy: same-origin +< Content-Type: application/json; charset=utf-8 +< Content-Length: 26 +< ETag: W/"1a-2HmNLqF3wPt+KQRlEmGwH4O+xu4" +< Date: Fri, 29 Mar 2024 13:27:00 GMT +< Connection: keep-alive +< Keep-Alive: timeout=5 +< +* Connection #0 to host 127.0.0.1 left intact +{"currentVersion":"1.3.0"} +``` + +We can also verify that the API key has been set successfully, let's use the example API call from the Etherpad's documentation ( https://etherpad.org/doc/v2.0.0/#_example_1 ): + +``` +~ curl -v http://127.0.0.1:9001/api/1/createAuthorIfNotExistsFor\?apikey\=381d67e6347d235ac9446da3ea10a82efd6f8ae09fa2e90efeda80f82feeb4fd\&name\=Michael\&authorMapper\=7 +* Trying 127.0.0.1:9001... +* Connected to 127.0.0.1 (127.0.0.1) port 9001 +> GET /api/1/createAuthorIfNotExistsFor?apikey=381d67e6347d235ac9446da3ea10a82efd6f8ae09fa2e90efeda80f82feeb4fd&name=Michael&authorMapper=7 HTTP/1.1 +> Host: 127.0.0.1:9001 +> User-Agent: curl/8.4.0 +> Accept: */* +> +< HTTP/1.1 200 OK +< X-Powered-By: Express +< X-UA-Compatible: IE=Edge,chrome=1 +< Referrer-Policy: same-origin +< Content-Type: application/json; charset=utf-8 +< Content-Length: 66 +< ETag: W/"42-bg92QA1xRFO6QmkNRbNXhfsFBUM" +< Date: Fri, 29 Mar 2024 13:40:05 GMT +< Connection: keep-alive +< Keep-Alive: timeout=5 +< +* Connection #0 to host 127.0.0.1 left intact +{"code":0,"message":"ok","data":{"authorID":"a.7BgkAuzbHXR1G8Cv"}} +``` + +In case of an unsuccessful result (e.g. improperly set or invalid API key) we would receive the following response: +``` +~ curl -v http://127.0.0.1:9001/api/1/createAuthorIfNotExistsFor\?apikey\=secret\&name\=Michael\&authorMapper\=7 +* Trying 127.0.0.1:9001... +* Connected to 127.0.0.1 (127.0.0.1) port 9001 +> GET /api/1/createAuthorIfNotExistsFor?apikey=secret&name=Michael&authorMapper=7 HTTP/1.1 +> Host: 127.0.0.1:9001 +> User-Agent: curl/8.4.0 +> Accept: */* +> +< HTTP/1.1 401 Unauthorized +< X-Powered-By: Express +< X-UA-Compatible: IE=Edge,chrome=1 +< Referrer-Policy: same-origin +< Content-Type: application/json; charset=utf-8 +< Content-Length: 54 +< ETag: W/"36-dbJd0O+vdNi3zPpwRXE+1EGLTho" +< Date: Fri, 29 Mar 2024 13:39:44 GMT +< Connection: keep-alive +< Keep-Alive: timeout=5 +< +* Connection #0 to host 127.0.0.1 left intact +{"code":4,"message":"no or wrong API Key","data":null} +``` \ No newline at end of file From 65591f52bdffcab97bea9a114f5c32038b5f8273 Mon Sep 17 00:00:00 2001 From: Max Bischof Date: Thu, 6 Jun 2024 13:24:04 +0200 Subject: [PATCH 2/5] Adjust how it works --- docs/services/etherpad/How it works.md | 65 ++++++++++++++++++++---- docs/services/etherpad/how_it_works.png | Bin 0 -> 91210 bytes 2 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 docs/services/etherpad/how_it_works.png diff --git a/docs/services/etherpad/How it works.md b/docs/services/etherpad/How it works.md index 3af56ac..a8e2237 100644 --- a/docs/services/etherpad/How it works.md +++ b/docs/services/etherpad/How it works.md @@ -1,20 +1,67 @@ # How it works -## Session managment +## Configuration +- ETHERPAD_COOKIE__EXPIRES_SECONDS - time in seconds after which a session expires +- ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD - time in seconds after which a session is not returned to the user +- ETHERPAD_API_KEY - api key for etherpad +- ETHERPAD_URI - uri of etherpad api +- ETHERPAD_API_PATH - path to etherpad api +- ETHERPAD_BASE_URL - base url of etherpad +- ETHERPAD__PAD_PATH +- ETHERPAD__PAD_URI +- ETHERPAD__NEW_DOMAIN +- ETHERPAD__OLD_DOMAIN + +## Creating and Opening an Etherpad Element on a Column Board + +![Requests of etherpad creation](how_it_works.png) + +### Creating an Etherpad Element +1. The user initiates the process by creating an Etherpad element on a column board. +2. Vue then sends a request to the board module in the Schulcloud server for a new Etherpad element. +3. The server responds by returning an Etherpad element which is then displayed on the board. + +### Interacting with the Etherpad Element +1. When the user clicks on the Etherpad element, the Vue client sends a request to the collaborative text editor module in the Schulcloud server for a new Etherpad. +2. The Schulcloud server is capable of creating Etherpads based on parent types. The parent type is further used for handling authorisation of the etherpad. Currently, the only parent type is a column board element. + +### Grouping and Creating Etherpads +1. The Schulcloud server first creates a group that clusters several Etherpads together. Each group shares a session and a new group is created for every column board element. This requires sending a request to the Etherpad server. +2. Once the group is created, the server can send a request to create an Etherpad within that group. + +### Session Creation and Cookie Setting +1. For session creation, the server first needs to request an Etherpad author and then the session for that author. +2. With that session, the server can set a session cookie in the client's browser and return the Etherpad URL to Vue. -### Column and List Board -An etherpad session is created for every click on the etherpad element. This session expires after the amount of time defined by `ETHERPAD_COOKIE__EXPIRES_SECONDS`. This means that a user will loose access to the pad after that time period is expired. Losing access means that after interaction with the pad an english non translated message "You do not have permission to access this pad." will be shown instead of the pad. If a user is not interacting with the pad he will be able to see the content also after the period of `ETHERPAD_COOKIE__EXPIRES_SECONDS`. +### Opening the Etherpad +In the final step, Vue opens the Etherpad URL in a new browser tab, enabling the user to interact directly with the Etherpad. It's important to note that the Etherpad client interface displayed to the user is served by the Etherpad server, and as such, it is not a part of our own codebase. + +## Etherpad Adapter +For the communication with the Etherpad server, the Schulcloud server uses an adapter. This adapter is responsible for handling all requests to the Etherpad server and ensuring that the correct data is sent and received. This adapter uses a client that is generated by open api generator. Client generation can be triggered with `generate-client:etherpad` and should be executed after update of etherpad server. + +## Authentication +The authentication process in our system works via a token. This token is sent with each request as a parameter to ensure secure communication. + +The token is defined by the `ETHERPAD_API_KEY` environment variable. This variable holds the key used for authentication, ensuring that only authorized requests are processed. + +In the Schulcloud server, this API key is passed to the etherpad adapter on its initialization in the collaborative text editor module. + +## Session managment -If a user clicks on the etherpad element for the second time, a session that already exists for this element might be returned. If the old session or a new one is created depends on the env var settings. `ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD` defines the amount of time a session must still be valid to be delivered to the user. Currenty in production `ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD` and -`ETHERPAD_COOKIE__EXPIRES_SECONDS` are set to the same value of 2 hours. With that setting for every click on an etherpad element a new session is created. +### Etherpad Session Creation and Expiration +Each interaction with an Etherpad element initiates the creation of a new session. The lifespan of this session is determined by the ETHERPAD_COOKIE__EXPIRES_SECONDS environment variable. Once this time period elapses, the user loses access to the pad. This loss of access is indicated by the display of a non-translated English message: "You do not have permission to access this pad." However, even after the session expires, users can still view the pad content as long as they do not interact with it. -There is no such thing as an automatic session renewal on interaction. Etherpad provides the config variable COOKIE_SESSION_REFRESH_INTERVAL which defines the amount of time after a session of a user gets automatically renewed in an open tab. Currently this is not set and so the default of 1 day has no influence because this value is greater than ETHERPAD_COOKIE__EXPIRES_SECONDS. So with that setting sessions are not automatically renewed. +### Session Reuse +Upon subsequent interactions with the Etherpad element, an existing session for that element may be reused. Whether an old session is reused or a new one is created depends on the environment variable settings. The `ETHERPAD_COOKIE_RELEASE_THRESHOLD` variable determines the remaining validity period of a session for it to be delivered to the user. In the current production environment, both `ETHERPAD_COOKIE_RELEASE_THRESHOLD` and `ETHERPAD_COOKIE__EXPIRES_SECONDS` are set to the same value of 2 hours. This configuration results in the creation of a new session for each interaction with an Etherpad element. -When user logsout out of schulcloud all sessions are removed and user loses access to the pads on interaction. (Please see description above) +### Session Renewal +Currently there is no automatic session renewal upon interaction. Etherpad provides the `COOKIE_SESSION_REFRESH_INTERVAL` configuration variable, which specifies the time period after which a user's session is automatically renewed in an open tab. However, this variable is currently unset, and the default value of 1 day has no effect because it exceeds the `ETHERPAD_COOKIE__EXPIRES_SECONDS` value. Therefore, sessions are not automatically renewed. -Currently on schulcloud user autologout, etherpad sessions are not removed automatically. But as long ETHERPAD_COOKIE__EXPIRES_SECONDS and JWT_TIMEOUT_SECONDS are set to the same value, all sessions should theoretically be invalid after autologout. +### Session Removal +When a user logs out of Schulcloud, all sessions are terminated, and the user loses access to the pads upon interaction. However, Etherpad sessions are not automatically removed upon user auto-logout in Schulcloud. As long as `ETHERPAD_COOKIE__EXPIRES_SECONDS` and `JWT_TIMEOUT_SECONDS` are set to the same value, all sessions should theoretically become invalid after auto-logout. -A cookie with the name sessionID is stored for every session. Cookies are not programmatically removed after ETHERPAD_COOKIE__EXPIRES_SECONDS or schulcloud logout. +### Cookie Management +A cookie named sessionID is stored for each session. These cookies are not programmatically removed after the `ETHERPAD_COOKIE__EXPIRES_SECONDS` period or upon Schulcloud logout. ### Legacy Topics diff --git a/docs/services/etherpad/how_it_works.png b/docs/services/etherpad/how_it_works.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf71e86d1696d2faeaacddc828400d07c47e3af GIT binary patch literal 91210 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℘#Zh`gj~- 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 J;(^mw{vRQbE4Bat literal 0 HcmV?d00001 From ae5db01f0e04056f6e56e611db9021fdfd291a4c Mon Sep 17 00:00:00 2001 From: Max Bischof Date: Thu, 6 Jun 2024 13:31:13 +0200 Subject: [PATCH 3/5] Fix styling --- docs/services/etherpad/How it works.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/services/etherpad/How it works.md b/docs/services/etherpad/How it works.md index a8e2237..5da3ec3 100644 --- a/docs/services/etherpad/How it works.md +++ b/docs/services/etherpad/How it works.md @@ -49,7 +49,7 @@ In the Schulcloud server, this API key is passed to the etherpad adapter on its ## Session managment ### Etherpad Session Creation and Expiration -Each interaction with an Etherpad element initiates the creation of a new session. The lifespan of this session is determined by the ETHERPAD_COOKIE__EXPIRES_SECONDS environment variable. Once this time period elapses, the user loses access to the pad. This loss of access is indicated by the display of a non-translated English message: "You do not have permission to access this pad." However, even after the session expires, users can still view the pad content as long as they do not interact with it. +Each interaction with an Etherpad element initiates the creation of a new session. The lifespan of this session is determined by the `ETHERPAD_COOKIE__EXPIRES_SECONDS` environment variable. Once this time period elapses, the user loses access to the pad. This loss of access is indicated by the display of a non-translated English message: "You do not have permission to access this pad." However, even after the session expires, users can still view the pad content as long as they do not interact with it. ### Session Reuse Upon subsequent interactions with the Etherpad element, an existing session for that element may be reused. Whether an old session is reused or a new one is created depends on the environment variable settings. The `ETHERPAD_COOKIE_RELEASE_THRESHOLD` variable determines the remaining validity period of a session for it to be delivered to the user. In the current production environment, both `ETHERPAD_COOKIE_RELEASE_THRESHOLD` and `ETHERPAD_COOKIE__EXPIRES_SECONDS` are set to the same value of 2 hours. This configuration results in the creation of a new session for each interaction with an Etherpad element. From 6e4b335a7f3b9c8ffa9901ddd1212acacc9404ad Mon Sep 17 00:00:00 2001 From: Max Bischof Date: Thu, 6 Jun 2024 14:16:22 +0200 Subject: [PATCH 4/5] Remove tldraw content --- docs/services/etherpad/Local setup.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/services/etherpad/Local setup.md b/docs/services/etherpad/Local setup.md index b246342..9fda7b3 100644 --- a/docs/services/etherpad/Local setup.md +++ b/docs/services/etherpad/Local setup.md @@ -44,13 +44,6 @@ Create a directory called sc-etherpad and then enter it, in Unix-like systems y ``` Please note we're using the docker.io/etherpad/etherpad:2.0.0 image in the command above which might be not the one that is being used anytime in the future when you read this article. To make sure you're using the current version (the one that is currently being used in the SchulCloud platform), please refer to the https://github.com/hpi-schul-cloud/dof_app_deploy/blob/main/ansible/group_vars/infra/dof_etherpad.yml file. -5. To allow communication between schulcloud- and etherpad-server the following env vars must be set: - ``` - TLDRAW_ADMIN_API_CLIENT__API_KEY=randomString - ADMIN_API__ALLOWED_API_KEYS=randomString - TLDRAW_ADMIN_API_CLIENT__BASE_URL=http://localhost:3349 - ``` - Now we should have the Etherpad service running locally on port 9001, we can verify it's working properly e.g. by fetching the current Etherpad's API version: ``` From 4d9ce365e656f91db7a43e8592dcdfd36bc41e44 Mon Sep 17 00:00:00 2001 From: Max Bischof Date: Fri, 7 Jun 2024 09:40:48 +0200 Subject: [PATCH 5/5] Add env var description --- docs/services/etherpad/How it works.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/services/etherpad/How it works.md b/docs/services/etherpad/How it works.md index 5da3ec3..42f46c3 100644 --- a/docs/services/etherpad/How it works.md +++ b/docs/services/etherpad/How it works.md @@ -3,14 +3,14 @@ ## Configuration - ETHERPAD_COOKIE__EXPIRES_SECONDS - time in seconds after which a session expires - ETHERPAD_ETHERPAD_COOKIE_RELEASE_THRESHOLD - time in seconds after which a session is not returned to the user -- ETHERPAD_API_KEY - api key for etherpad -- ETHERPAD_URI - uri of etherpad api -- ETHERPAD_API_PATH - path to etherpad api -- ETHERPAD_BASE_URL - base url of etherpad -- ETHERPAD__PAD_PATH -- ETHERPAD__PAD_URI -- ETHERPAD__NEW_DOMAIN -- ETHERPAD__OLD_DOMAIN +- ETHERPAD_API_KEY - api key used for authentication of schulcloud server requests +- ETHERPAD_URI - Used as base path for api client in nest +- ETHERPAD__PAD_PATH - Used in legacy client to set path on cookie. +- ETHERPAD__PAD_URI - Used for collab editor and lesson to build return url, Used in legacy client to build url +- ETHERPAD__NEW_DOMAIN - Used in legacy client to validate url +- ETHERPAD__OLD_DOMAIN - Used in legacy client to validate url +- ETHERPAD_API_PATH - Only used in tests. +- ETHERPAD_BASE_URL - Not used. ## Creating and Opening an Etherpad Element on a Column Board