Psono version v1 (work in progess)
https://psono.example.com/server
The Psono API is the interface between server and client. Due to my personal preference it violates some of the rest naming conventions (nome/verb instead of nomes only). It is also sadly not consistent across the usage of PUT vs POST for creating / updating content for which I have to apologize. (Edit Me on GitLab)
/authentication/login/
Call to login. Usually called after /info/
post /authentication/login/
Call to login. Usually called after /info/
Query Parameters
- login_info: required(string)
The encrypted login info (username, authkey, device fingerprint, device description) (hex)
- login_info_nonce: required(string)
The nonce of the login info (hex)
- public_key: required(string)
The session public key (hex)
- session_duration: (integer)
The time the session should be valid for in seconds, defaults (usually) to 86400 seconds (24h)
Body
Media type: application/json
Type: any
Example:
{
"login_info": "45ea72e76ebbca03d3c8eecb72118847e75788bd390536667b57eaadd4f10d9bcf78f08f40d30ce19c9d861ecf0c44bcecbfbb7c8d24c33ac3c5e5dce2f8b2bd78705815b4b0c415ce060aec02554d1bfedabda61a565f399fcdc58f61f0e89e684bddc4309ef2c63eea530c7503509419c03b6c7884d197fa68f4dfb282c2f1b9da7dced88d1fb918719b4761aa7726506ed5fa111182b5edd5a8ca9260c90fd64583309c52caadebbf18d74ea993e89fef1f68612146f653edd0632e8d1bfeecb6b0f47a1c7b503b5a5ba33e893bb22f1c780503e62d5306ae0787f3a891416325f61913000e4cceb4df27e83909a0fce48682a42826f7cabac3cbf8058e62961a417c6d35824e475b9d28d769723d171e386e9c264d7d8864509266d2d5d578b64ae4f1a523b783bcd1e49c70f54a216a055054406f9d97e2819edc7fb2e8995ce742430f8a3ae54a994f5c20336015098655742faf5cf97771103d7ae9942cf64a4b722498328c9acebd2943cd6cac03efd187c0eb095ccdcba7a1",
"login_info_nonce": "c232016c0cb5499d84d16c9b22e2b1711dd54aa244388e7b",
"public_key": "88a4cc86aa9d13da8cbce647049455db00914f217f76393e262a1022701b7e26",
"session_duration": 2592000
}
/authentication/logout/
Destroys a session and potentially logs out a user
post /authentication/logout/
Destroys a session and potentially logs out a user
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- session_id: (string)
The session to delete. If not specified its the current session
HTTP status code 200
Session deleted / logout successful
Body
Media type: application/json
Type: any
Example:
{}
/authentication/ga-verify/
Solves the google authenticator challenge during the login process. Usually called after /authentication/login/
post /authentication/ga-verify/
Solves the google authenticator challenge during the login process. Usually called after /authentication/login/
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- ga_token: required(string)
The google authenticator token
/authentication/yubikey-otp-verify/
Solves the Yubikey OTP challenge during the login process. Usually called after /authentication/login/
post /authentication/yubikey-otp-verify/
Solves the Yubikey OTP challenge during the login process. Usually called after /authentication/login/
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- yubikey_otp: required(string)
The Yubikey OTP token
/authentication/duo-verify/
Solves the Duo challenge during the login process. Usually called after /authentication/login/
post /authentication/duo-verify/
Solves the Duo challenge during the login process. Usually called after /authentication/login/
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- duo_token: (string)
The current duo token, or empty then mobile approval is expected to happen
/authentication/activate-token/
Activates the token after all challenges have been solved. Usually called after /authentication/login/ or challenge solvers like for example /authentication/yubikey-otp-verify/
post /authentication/activate-token/
Activates the token after all challenges have been solved. Usually called after /authentication/login/ or challenge solvers like for example /authentication/yubikey-otp-verify/
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- verification: required(string)
The encrypted verification as proof that one is now in the posession of the users private keys
- verification_nonce: required(string)
The nonce of the encrypted verification
Body
Media type: application/json
Type: any
Example:
{
"verification": "1ff04d6bdfb718af0c0ec757fe65bc6fd6a02612139dbdc860e589d5b8ce03481db2390c93c61766b0fd7d495d01aec0d3c08acebedf5c8afbdf4b806d643e97a17d086df34c2028f324b1fe5722f54c",
"verification_nonce": "155d6ed73175605e916c5f7aa5aa6b3e797fed8ea29a59e4"
}
/authentication/sessions/
Lists all active sessions.
get /authentication/sessions/
Lists all active sessions.
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
/authentication/register/
Register a user.
post /authentication/register/
Register a user.
Query Parameters
- email: required(string)
email address of the user
- username: required(string)
username of the user (in email format)
- authkey: required(string)
authkey gets generated by generate_authkey(email, password)
- public_key: required(string)
public_key of the public/private key pair for asymmetric encryption (sharing)
- private_key: required(string)
private_key of the public/private key pair, encrypted with encrypt_secret
- private_key_nonce: required(string)
the nonce for decrypting the encrypted private_key
- secret_key: required(string)
secret_key for symmetric encryption, encrypted with encrypt_secret
- secret_key_nonce: required(string)
the nonce for decrypting the encrypted secret_key
- user_sauce: required(string)
the random user sauce used
- base_url: required(string)
the base url for the activation link creation
/authentication/verify-email/
Verifies the email address.
post /authentication/verify-email/
Verifies the email address.
/user/update/
Updates user informations like for example a new password (means new authkey) or new public key
put /user/update/
Updates user informations like for example a new password (means new authkey) or new public key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- email: (string)
New email address
- authkey: (string)
The new authkey
- authkey_old: required(string)
The old authkey
- private_key: (string)
The (encrypted) new private key
- private_key_nonce: (string)
The nonce for the private key
- secret_key: (string)
The (encrypted) secret key
- secret_key_nonce: (string)
The nonce for the secret key
/user/ga/
Generates a Google Authenticator key
Activates a google authenticator by sending one token
Returns a list of all Google Authenticators
Deletes a Google Authenticators
put /user/ga/
Generates a Google Authenticator key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- title: required(string)
The title of the new Google Authenticator
post /user/ga/
Activates a google authenticator by sending one token
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- google_authenticator_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The google authenticator id to activate
- google_authenticator_token: required(string)
One of the google authenticator codes
get /user/ga/
Returns a list of all Google Authenticators
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of all Google Authenticators
Body
Media type: application/json
Type: any
Example:
{
"google_authenticators": [
{
"id": "9714382d-c224-4066-9cfd-04ccc12acc2b",
"title": "Title 1"
},
{
"id": "2ec13b1a-39f7-4215-914e-77cf506a09fa",
"title": "Title 2"
}
]
}
delete /user/ga/
Deletes a Google Authenticators
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- google_authenticator_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The google authenticator id to delete
/user/duo/
Generates a Duo
Activates a duo by sending one code or by the user pushing the "Allow" button on the mobile
Returns a list of all Duos
Deletes a Duo
put /user/duo/
Generates a Duo
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- title: required(string)
The title of the new Duo
- integration_key: required(string)
The Duo integration key
- secret_key: required(string)
The Duo secret key
- host: required(string)
The Duo host
post /user/duo/
Activates a duo by sending one code or by the user pushing the "Allow" button on the mobile
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- duo_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The duo id to activate
- duo_token: (string)
One of the Duo codes
get /user/duo/
Returns a list of all Duos
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of all Duos
Body
Media type: application/json
Type: any
Example:
{
"duos": [
{
"id": "9714382d-c224-4066-9cfd-04ccc12acc2b",
"title": "Title 1"
},
{
"id": "2ec13b1a-39f7-4215-914e-77cf506a09fa",
"title": "Title 2"
}
]
}
delete /user/duo/
Deletes a Duo
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- duo_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The duo id to delete
/user/yubikey-otp/
Create / set a new YubiKey OTP token
Activates a yubikey by sending one token. (optional, as Yubikeys are by default active)
Returns a list of all YubiKey OTP token
Deletes a YubiKey OTP token
put /user/yubikey-otp/
Create / set a new YubiKey OTP token
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- title: required(string)
The title of the new Yubikey OTP token
- yubikey_otp: required(string)
One YubiKey OTP Code
post /user/yubikey-otp/
Activates a yubikey by sending one token. (optional, as Yubikeys are by default active)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- yubikey_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The yubikey id to activate
- yubikey_otp: required(string)
One yubikey code
get /user/yubikey-otp/
Returns a list of all YubiKey OTP token
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of all YubiKey OTP token
Body
Media type: application/json
Type: any
Example:
{
"yubikey_otps": [
{
"id": "3bd9c967-9664-4119-8ac9-bf5c03c4fcd2",
"title": "Title 1"
},
{
"id": "7803eb14-28ee-484f-9602-ece7091edda4",
"title": "Title 2'
}
]
}
delete /user/yubikey-otp/
Deletes a YubiKey OTP token
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- yubikey_otp_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The google YubiKey OTP token id to delete
/user/search/
Searches a user according to its id or username
post /user/search/
Searches a user according to its id or username
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- user_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The user ID
- user_username: (string)
The user's name
HTTP status code 200
Returns the found user
Body
Media type: application/json
Type: any
Example:
{
"id": "448826d6-ce87-4eb7-8636-3800bf9b4d38",
"public_key": "ae2a71bab7ff8c2c8125953318a6829a993b269c433a0dcd2f785945e23d1e79",
"username": "test@example.com"
}
HTTP status code 400
Some error occured, or no user found
/user/delete/
Deletes the own user account
delete /user/delete/
Deletes the own user account
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- authkey: required(string)
The authkey of the user
/password/
First step of the password reset with a recovery code
Second step of the recovery code password reset. Validates the code and sets the new password.
post /password/
First step of the password reset with a recovery code
Query Parameters
- username: required(string)
the account's username e.g dummy@example.com
- recovery_authkey: required(string)
The recovery_authkey (derivative of the recovery_password)
put /password/
Second step of the recovery code password reset. Validates the code and sets the new password.
Query Parameters
- username: required(string)
the account's username e.g dummy@example.com
- recovery_authkey: required(string)
The recovery_authkey (derivative of the recovery_password)
- update_data: required(string)
The private and secret key object encrypted with the verifier
- update_data_nonce: required(string)
The nonce of the encrypted private and secret key object
/recoverycode/
Creates a recovery code
post /recoverycode/
Creates a recovery code
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- recovery_authkey: required(string)
The recovery_authkey (derivative of the recovery_password)
- recovery_data: required(string)
The Recovery Data, an encrypted json object
- recovery_data_nonce: required(string)
The nonce used for the encryption of the data
- recovery_sauce: required(string)
The random sauce used as salt
/datastore/
Lists all datastores of the user
Creates a new datastore
Updates a specific datastore
Deletes a specific datastore
get /datastore/
Lists all datastores of the user
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of all datastores
Body
Media type: application/json
Type: any
Example:
{
"datastores": [
{
"id": "82addac0-f8fc-49a9-b2fd-2ea443d86bd5",
"type": "password",
"description": "Default",
"is_default": true
},
{
"id": "38656eed-6faf-4376-b804-5213089776c6",
"type": "user",
"description": "Default",
"is_default": true
}
]
}
put /datastore/
Creates a new datastore
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- type: required(string)
The type of the datastore
- description: required(string)
The description of the datastore
- data: (string)
Data for the new datastore
- data_nonce: (string)
Nonce for data, necessary if data is provided
- is_default: (boolean)
Is the new default datastore of this type
- secret_key: required(string)
Encrypted secret key
- secret_key_nonce: required(string)
Nonce for secret key
post /datastore/
Updates a specific datastore
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- datastore_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The datastore id
- data: (string)
Data for the datastore
- data_nonce: (string)
Nonce for data, necessary if data is provided
- secret_key: (string)
The encrypted secret key, wont update on the server if not provided
- secret_key_nonce: (string)
The nonce for secret key, wont update on the server if not provided
- description: (string)
The new description of the datastore
- is_default: (boolean)
Is this the new default datastore
delete /datastore/
Deletes a specific datastore
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- datastore_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The datastore id
- authkey: required(string)
The authkey of the user
/datastore/{datastore_id}/
Retrieve a specific datastore
get /datastore/{datastore_id}/
Retrieve a specific datastore
URI Parameters
- datastore_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one datastore
Body
Media type: application/json
Type: any
Example:
{
"data": "...",
"data_nonce": "...",
"type": "password",
"description": "Default",
"secret_key": "...",
"secret_key_nonce": "...",
"is_default": true,
"write_date": "2023-12-20T08:29:50.797936+00:00",
}
/secret/link/
Moves a secret link
Deletes a secret link
post /secret/link/
Moves a secret link
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
- new_parent_share_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the new parent share
- new_parent_datastore_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the new parent datastore
delete /secret/link/
Deletes a secret link
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
/secret/
Creates a new secret
Updates a specific secret
put /secret/
Creates a new secret
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- data: required(string)
The data for the new secret
- data_nonce: required(string)
The nonce for data, necessary if data is provided
- callback_url: (string)
A potential callback url that is used upon change of the secret
- callback_user: (string)
A username for the callback url basic auth
- callback_pass: (string)
A password for the callback url basic auth
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The local id of the share in the datastructure
- parent_datastore_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
Id of the parent datastore, may be left empty if the share resides in a share
- parent_share_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
Id of the parent share, may be left empty if the share resides in the datastore
post /secret/
Updates a specific secret
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- secret_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The secret id
- data: (string)
The new data for the secret
- data_nonce: (string)
The nonce for data, necessary if data is provided
- callback_url: (string)
A potential callback url that is used upon change of the secret
- callback_user: (string)
A username for the callback url basic auth
- callback_pass: (string)
A password for the callback url basic auth
/secret/history/{secret_id}/
Lists the history of a specific secret
get /secret/history/{secret_id}/
Lists the history of a specific secret
URI Parameters
- secret_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Read the list of history entries for a specific secret
Body
Media type: application/json
Type: any
Example:
{
"history": [
{
"id": "cf9eeee4-64f2-4d61-96ad-9a1f558318e7",
"create_date": "2018...",
"username": "something@example.com",
}
]
}
HTTP status code 400
Some error occured, no secret created
/history/{secret_history_id}/
Reads a specify secret history entry
get /history/{secret_history_id}/
Reads a specify secret history entry
URI Parameters
- secret_history_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Read one specific secret history entry
Body
Media type: application/json
Type: any
Example:
{
"create_date": "2023-12-20T08:29:50.797936+00:00",
"write_date": "2023-12-20T08:29:50.797936+00:00",
"data": "...",
"data_nonce": "...",
"type": "password",
"callback_url": "https://example.com/something",
"callback_user": "myUser",
"callback_pass": "password"
}
HTTP status code 400
Some error occured, no secret created
/secret/{secret_id}/
Retrieve a specific secret
get /secret/{secret_id}/
Retrieve a specific secret
URI Parameters
- secret_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one secret
Body
Media type: application/json
Type: any
Example:
{
"create_date": "2023-12-20T08:29:50.797936+00:00",
"write_date":"2023-12-20T08:29:50.797936+00:00",
"data": "...",
"data_nonce": "...",
"type": "password",
"callback_url": "https://example.com/something",
"callback_user": "myUser",
"callback_pass": "password"
}
HTTP status code 400
Some error occured
HTTP status code 403
Some error occured
/share/rights/{share_id}/
Retrieve the user's user and group rights of the share
get /share/rights/{share_id}/
Retrieve the user's user and group rights of the share
URI Parameters
- share_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one share
Body
Media type: application/json
Type: any
Example:
{
"id": "99b52043-b62d-420e-8ff2-6cd84231b3c2",
"own_share_rights": {
"read": true,
"write": false,
"grant": true,
},
"user_share_rights": [
{
"id": "b1a20090-a792-4efd-9b98-47777a39f1b5",
"accepted": true,
"read": true,
"write": false,
"grant": false,
"user_id": true,
"share_id": "2fe9201b-4ec4-4c15-b21f-76e78465f12c",
"username": "demo@example.com"
}
],
"group_share_rights": [
{
"id": "4b74f9bc-e76c-467e-ae48-75abe6d42277",
"accepted": true,
"read": true,
"write": false,
"grant": false,
"user_id": true,
"share_id": "2fe9201b-4ec4-4c15-b21f-76e78465f12c",
"group_name": "Group Name"
}
]
}
HTTP status code 400
Some error occured
HTTP status code 403
You don't have permission to access or it does not exist
Body
Media type: application/json
Type: any
Example:
{
"message":"You don't have permission to access or it does not exist."
}
HTTP status code 404
UUID for share not specified.
Body
Media type: application/json
Type: any
Example:
{
"message": "UUID for share not specified."
}
/share/right/accept/
Accepts a user share right
post /share/right/accept/
Accepts a user share right
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- share_right_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share right id
- key: (string)
The data for the new secret
- key_nonce: (string)
The nonce for data, necessary if data is provided
- key_type: (string - default: symmetric)
The nonce for data, necessary if data is provided
/share/right/decline/
Declines a user share right
post /share/right/decline/
Declines a user share right
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- share_right_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share right id
/share/right/
List of all share rights
creates a user or group share right
Updates a user or group share right
Deletes a user or group share right
get /share/right/
List of all share rights
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Read all shares successful
Body
Media type: application/json
Type: any
Example:
{
"share_rights": [
{
"share_id": "4de97cdf-c8ee-4c89-93b9-6ef986f6521d",
"read": true,
"write": true,
"grant": true,
}
]
}
put /share/right/
creates a user or group share right
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- title: required(string)
The title shown to the user before he accepts
- title_nonce: required(string)
The corresponding title nonce
- type: required(string)
The type of the share
- type_nonce: required(string)
The corresponding type nonce
- share_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share id
- user_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The target user's user ID
- group_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The target group's group ID
- key: required(string)
The encrypted share secret, encrypted with the public key of the target user
- key_nonce: required(string)
The unique nonce for decryption
- read: required(boolean)
Read permission
- write: required(boolean)
Write permission
- grant: required(boolean)
Grant permission
post /share/right/
Updates a user or group share right
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- share_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share id
- user_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The target user's user ID
- group_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The target group's group ID
- read: required(boolean)
Read permission
- write: required(boolean)
Write permission
- grant: required(boolean)
Grant permission
delete /share/right/
Deletes a user or group share right
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- user_share_right_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The user share right id to delete
- group_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The group share right id to delete
/share/right/{user_share_right_id}/
Reads a specific user share right
get /share/right/{user_share_right_id}/
Reads a specific user share right
URI Parameters
- user_share_right_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one share right
Body
Media type: application/json
Type: any
Example:
{
"id": "ce6e8c5e-6ce3-456f-8d10-350d77b3fe4a",
"title": "...",
"title_nonce": "...",
"key": "...",
"key_nonce": "...",
"read": true,
"write": true,
"grant": true,
"share_id": "776c73f3-cf64-4703-8ef0-43e1567cec4c"
}
HTTP status code 400
Some error occured
HTTP status code 403
You don't have permission to access or it does not exist
Body
Media type: application/json
Type: any
Example:
{
"message":"You don't have permission to access or it does not exist."
}
/share/link/
Creates share link in share tree
Update share link in share tree
Delete share link in share tree
put /share/link/
Creates share link in share tree
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
- share_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share id
- parent_share_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The parent share id
- parent_datastore_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The parent share id
post /share/link/
Update share link in share tree
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
- parent_share_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The new parent share id
- parent_datastore_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The new parent share id
delete /share/link/
Delete share link in share tree
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
/share/
Returns a list of all shares with user share rights (for the user)
Updates a share
Creates a new share
get /share/
Returns a list of all shares with user share rights (for the user)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
A list of all shares with own share rights
Body
Media type: application/json
Type: any
Example:
{
"shares": [
{
"id": "735654b1-be1f-4b13-a319-918564eacd70",
"share_right_id": "03cca7fe-ea4e-4d61-a59e-b8ecd34f5c36",
"share_right_user_id": "d1263081-3576-4225-9f31-6683391788f5",
"share_right_title": "...",
"share_right_title_nonce":"...",
"share_right_key": "...",
"share_right_key_nonce": "...",
"share_right_key_type": u.key_type,
"share_right_read": true,
"share_right_write": true,
"share_right_grant": true,
"share_right_accepted": true,
"share_right_create_user_id": 6d03a126-34f9-4d63-8ca3-3872434cfc7e,
"share_right_create_user_username": "demo@example.com",
"share_right_create_user_public_key": "..."
}
]
}
put /share/
Updates a share
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- share_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The share id
- data: required(string)
The new data
- data_nonce: required(string)
The nonce for the new data
post /share/
Creates a new share
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- link_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The link id
- data: required(string)
The new data
- data_nonce: required(string)
The nonce for the new data
- parent_share_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the parent share
- parent_datastore_id: (string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the parent datastore
- key: required(string)
Encrypted key used by the encryption
- key_nonce: required(string)
Nonce for key, necessary if a key is provided
- key_type: (string - default: asymmetric)
The type of the key
/share/{share_id}/
Reads a specific share
get /share/{share_id}/
Reads a specific share
URI Parameters
- share_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one share
Body
Media type: application/json
Type: any
Example:
{
"id": "a4c664d3-7b43-44c2-b372-8bfc96ac0129",
"data": "...",
"data_nonce": "...",
"user_id": "ecf5fdca-52f8-4677-b0e2-9f19d84f4eb1",
"rights": {
"read": true,
"write": true,
"grant": true,
},
}
HTTP status code 400
Some error occured
/group/
Returns a list of all groups with group share rights (for the user)
Creates a group
Updates a group
Deletes a group
get /group/
Returns a list of all groups with group share rights (for the user)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of groups
Body
Media type: application/json
Type: any
Example:
{
"groups": [
{
"group_id": "24af8c5a-a5c8-422f-898e-c93819a83811",
"membership_id": "1e47fb66-d552-4ece-8a00-df04936a3d21",
"name": "Group Name 1",
"public_key": "...",
"group_admin": true,
"accepted": true,
"secret_key": "...",
"secret_key_nonce": "...",
"secret_key_type": "symmetric",
"private_key": "...",
"private_key_nonce": "...",
"private_key_type": "symmetric"
},
{
"group_id": "388cdef7-3793-4224-a1e0-11afdff531dc",
"membership_id": "3714b1da-ed77-4049-ad3a-389be3b0807b",
"name": "Group Name 2",
"public_key": "...",
"group_admin": true,
"accepted": None,
"user_id": "5cc17339-65ac-4d57-bcfc-6d6324112ca8",
"user_username": "demo@example.com",
"share_right_grant": true
},
{
"group_id": "ab973385-6694-4dd8-9676-0df775e365e5",
"membership_id": "fb741df0-c493-4b7d-97fa-0169c14b35bb",
"name": "Group Name 3",
"public_key": "...",
"group_admin": true,
"accepted": false
}
]
}
put /group/
Creates a group
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- name: required(string)
The name of the group
- secret_key: required(string)
The (encrypted) secret key of the group
- secret_key_nonce: required(string)
The nonce of the secret key
- private_key: required(string)
The (encrypted) private key of the group
- private_key_nonce: required(string)
The nonce of the private key
- public_key: required(string)
The public key of the group
HTTP status code 200
Group created successfully
Body
Media type: application/json
Type: any
Example:
{
"group_id": "177f5e47-f500-4b32-ab18-198baab51e95",
"name": "Group Name",
"secret_key": "...",
"secret_key_nonce": "...",
"secret_key_type": "symmetric",
"private_key": "...",
"private_key_nonce": "...",
"private_key_type": "symmetric",
"public_key": "...",
"group_admin": True,
"accepted": True,
}
HTTP status code 400
Some error occured
post /group/
Updates a group
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- group_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the group
- name: (string)
The new name of the group
delete /group/
Deletes a group
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- group_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the group
/emergency-login/
Second step of the login with emergency code.
First step of the login with an emergency code
put /emergency-login/
Second step of the login with emergency code.
Query Parameters
- username: required(string)
The username of the user
- emergency_authkey: required(string)
The authkey of the emergency code
- update_data: required(string)
The encrypted data to verify the legitimacy of the request
- update_data_nonce: required(string)
The nonce for update_data
post /emergency-login/
First step of the login with an emergency code
Query Parameters
- username: required(string)
The username of the user
- emergency_authkey: required(string)
The authkey of the emergency code
HTTP status code 200
Emergency code successfully activated and can be used in "remaining_wait_time"
Body
Media type: application/json
Type: any
Example:
{
"remaining_wait_time": 0,
"status": "ready",
"emergency_data": "...",
"emergency_data_nonce": "...",
"emergency_sauce": "...",
"user_sauce": "...",
"verifier_public_key": "...",
"verifier_time_valid": 600,
}
HTTP status code 400
Some error occured
/emergencycode/
Returns a list of all emergency codes of the user
Creates a new emergency code
Deletes an emergency code
get /emergencycode/
Returns a list of all emergency codes of the user
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns a list of emergency codes
Body
Media type: application/json
Type: any
Example:
{
"emegency_codes": [
{
"id": "eed43cb4-b45d-4c72-b9e6-907fad2e22e2",
"description": "Some description",
"activation_date": "2018...",
"activation_delay": 0,
},
{
"id": "c19366b8-5547-43ca-9046-0ce7da02d7a8",
"description": "Another emergency code",
"activation_date": None,
"activation_delay": 86400,
}
]
}
post /emergencycode/
Creates a new emergency code
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- description: required(string)
The description of the emergency code
- activation_delay: required(integer)
The activation delay in seconds
- emergency_authkey: required(string)
The authkey of the emergency code
- emergency_data: required(string)
The encrypted data of the emergency code
- emergency_data_nonce: required(string)
The nonce of the emergency code data
- emergency_sauce: required(string)
The emergency sauce
delete /emergencycode/
Deletes an emergency code
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- emergency_code_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the emergency code to delete
/group/{group_id}/
Returns the specified group if the user has any rights for it
get /group/{group_id}/
Returns the specified group if the user has any rights for it
URI Parameters
- group_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Returns one group
Body
Media type: application/json
Type: any
Example:
{
"group_id": "309f6b32-818e-4f94-a785-30abc09e777a",
"name": "Group Name",
"public_key": "...",
"group_admin": false,
"accepted": true,
"secret_key": "...",
"secret_key_nonce": "...",
"secret_key_type": "symmetric",
"private_key": "...",
"private_key_nonce": "...",
"private_key_type": "symmetric",
"members": [
{
"id": "3db080a0-6113-498d-9d7f-5550c6146ff4",
"membership_id": "25af5d7d-5a50-4393-8328-d1160bf56a1b",
"name": "Own User Name",
"public_key": "...",
"group_admin": false,
"accepted": true,
}
],
"group_share_rights": [
{
"id": "2fef4fc7-9302-4b1f-99c5-25135875308d",
"share_id": "080453b2-741d-4e16-a139-8023060e1839",
"title": "...",
"title_nonce": "...",
"type": "...",
"type_nonce": "...",
"key": "...",
"key_nonce": "...",
"read": true,
"write": false,
"grant": false,
}
]
}
HTTP status code 400
Some error occured
/group/rights/
Returns a list of all group rights affecting the current user
get /group/rights/
Returns a list of all group rights affecting the current user
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Successful, returning a list of all group rights affecting the current user
Body
Media type: application/json
Type: any
Example:
{
"group_rights": [
{
"id": "b4bc3e64-8803-4b5a-83ba-d3059ed6cb76",
"group_id": "66375ed8-ded0-4314-975b-734563f82f08",
"share_id": "d1e4fb91-7aff-467f-8db9-fdeb6cc93ceb",
"read": true,
"write": true,
"grant": true,
}
]
}
/group/rights/{group_id}/
Returns a list of all group rights (memberships) of a group
get /group/rights/{group_id}/
Returns a list of all group rights (memberships) of a group
URI Parameters
- group_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Successful, returning a list of all group rights (memberships) of a group
Body
Media type: application/json
Type: any
Example:
{
"group_rights": [
{
"id": "b4bc3e64-8803-4b5a-83ba-d3059ed6cb76",
"group_id": "66375ed8-ded0-4314-975b-734563f82f08",
"share_id": "d1e4fb91-7aff-467f-8db9-fdeb6cc93ceb",
"read": true,
"write": true,
"grant": true,
}
]
}
HTTP status code 400
Some error occured
/membership/accept/
Accepts a membership
post /membership/accept/
Accepts a membership
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- membership_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the membership
HTTP status code 200
Successful, accepted membership
Body
Media type: application/json
Type: any
Example:
{
"shares": [
{
"share_id": "3c0b2a42-92ca-42da-89da-e8925bed38ce",
"share_title": "...",
"share_title_nonce": "...",
"share_type": "...",
"share_type_nonce": "...",
"share_data": "...",
"share_data_nonce": "...",
"share_key": "...",
"share_key_nonce": "...",
}
],
"secret_key": "...",
"secret_key_nonce": "...",
"secret_key_type": "asymmetric",
"private_key": "...",
"private_key_nonce": "...",
"private_key_type": "asymmetric"
}
HTTP status code 400
Some error occured
/membership/decline/
Declines a membership
post /membership/decline/
Declines a membership
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- membership_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the membership
/membership/
Creates a new group membership
Updates a group membership
Deletes a group membership
put /membership/
Creates a new group membership
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- user_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the user
- group_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the group
- secret_key: required(string)
The secret key
- secret_key_nonce: required(string)
The nonce for the secret key
- secret_key_type: (string - default: asymmetric)
The type for the secret key
- private_key: required(string)
The private key
- private_key_nonce: required(string)
The nonce for the private key
- private_key_type: (string - default: asymmetric)
The type for the private key
- group_admin: (boolean - default: false)
Group admin privileges
post /membership/
Updates a group membership
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- membership_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the membership
- group_admin: required(boolean)
Group admin privileges
delete /membership/
Deletes a group membership
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- membership_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the membership
/api-key-access/inspect/
Inspects an API key
post /api-key-access/inspect/
Inspects an API key
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key
HTTP status code 200
Successful, retuns the details
Body
Media type: application/json
Type: any
Example:
{
'allow_insecure_access': False,
'restrict_to_secrets': True,
'read': True,
'write': True,
'api_key_secrets': [{
'secret_id': '4620cff5-f22b-4466-afb7-7fec94411243'
}, {
'secret_id': '345d8909-fae3-446a-8b97-9b6a9dbf0851'
}
]
}
HTTP status code 400
Some error occured
/api-key-access/secret/
Reads a secret and (optional) decrypts it and (optional) filters it on the server
Writes a secret and (optional) encrypts it on the server
post /api-key-access/secret/
Reads a secret and (optional) decrypts it and (optional) filters it on the server
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key
- secret_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the secret
- api_key_secret_key: (string)
The decrypted api key secret to decrypt the secrets for the user
- json_filter: (string)
A dot separated list, specifying the path of the element to return
put /api-key-access/secret/
Writes a secret and (optional) encrypts it on the server
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key
- secret_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the secret
- api_key_secret_key: (string)
The decrypted api key secret to encrypt the secrets for the user
- data: (string)
The new data for the secret
- data_nonce: (string)
The nonce for data, necessary if data is provided
- callback_url: (string)
A potential callback url that is used upon change of the secret
- callback_user: (string)
A username for the callback url basic auth
- callback_pass: (string)
A password for the callback url basic auth
/api-key/secret/{api_key_id}/
Returns a list of all secrets of an API key
get /api-key/secret/{api_key_id}/
Returns a list of all secrets of an API key
URI Parameters
- api_key_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Successful, returning a list of all secrets assigned to an api key
Body
Media type: application/json
Type: any
Example:
[
{
"id": "f461063a-e3b6-4755-9ce7-6e4314532755",
"secret_id": "0564c248-a7a2-4ef2-a3dd-17748026ab45",
"title": "...",
"title_nonce": "..."
}
]
HTTP status code 400
Some error occured
/api-key/secret/
Adds a secret to an api key
Removes a secret from an api key
put /api-key/secret/
Adds a secret to an api key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key
- secret_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the secret
- secret_key: required(string)
The encrypted secret key of the secret
- secret_key_nonce: required(string)
The nonce for the secret key
- title: required(string)
The encrypted title of the secret
- title_nonce: required(string)
The nonce of the title
delete /api-key/secret/
Removes a secret from an api key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- api_key_secret_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key secret
/api-key/login/
Login with API key to get an active session
post /api-key/login/
Login with API key to get an active session
Query Parameters
- info: required(string)
The json encoded info
- signature: required(string)
The signature of the signed info
/api-key/{api_key_id}/
Returns the specific api key and all its stored data
get /api-key/{api_key_id}/
Returns the specific api key and all its stored data
URI Parameters
- api_key_id: required(string)
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
Successful, returning the api key
Body
Media type: application/json
Type: any
Example:
{
"id": "cbccdb84-4946-44df-b6b5-583c850283d3",
"title": "Some title",
"public_key": "...",
"private_key": "...",
"private_key_nonce": "...",
"secret_key": "...",
"secret_key_nonce": "...",
"read": true,
"write": true,
"restrict_to_secrets": true,
"allow_insecure_access": true,
"active": true,
}
HTTP status code 400
Some error occured
/api-key/
Creates a new api key
Updates an api key
Deletes an api key
put /api-key/
Creates a new api key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- title: required(string)
The title of the API key
- read: (boolean - default: true)
Allows GET requests with this API key
- write: (boolean - default: false)
Allows all not GET requests with this API key
- restrict_to_secrets: (boolean - default: false)
Restricts the API key to usage only with specifc secrets
- allow_insecure_access: (boolean - default: false)
Allows server side decryption
- public_key: required(string)
The public key of the api key
- private_key: required(string)
The encrypted private key of the api key
- private_key_nonce: required(string)
The private key nonce of the api key
- secret_key: required(string)
The encrypted secret key of the api key
- secret_key_nonce: required(string)
The secret key nonce of the api key
- user_private_key: required(string)
The encrypted private key of the user (encrypted with the api key secret)
- user_private_key_nonce: required(string)
The private key nonce of the user
- user_secret_key: required(string)
The encrypted secret key of the user (encrypted with the api key secret)
post /api-key/
Updates an api key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key
- title: (string)
The new title of the api key
- read: (boolean)
Allows GET requests with this API key
- write: (boolean)
Allows all not GET requests with this API key
- restrict_to_secrets: (boolean)
Restricts the API key to usage only with specifc secrets
- allow_insecure_access: (boolean)
Allows server side decryption
delete /api-key/
Deletes an api key
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
Query Parameters
- api_key_id: required(string - pattern: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$)
The id of the api key to delete
/user/status/
Returns the user status, e.g. unapproved shares and so on
get /user/status/
Returns the user status, e.g. unapproved shares and so on
Headers
- Authorization: required(string)
The authorization token received in /login/. Don't forget to prepand the "Token " string before the actual token (check the example)
Example:
Token e0714f13ef15249c53fe2d4610eeec69f04fd85a5745d34083b4888e5a3a4008c14ecec07177fdcf6e0e0802b2b804463941ec55a2320217a1350c89038f376b
HTTP status code 200
The status of the user, e.g. unaccepted shared or group invites
Body
Media type: application/json
Type: any
Example:
{
"unaccepted_shares_count": 3,
"unaccepted_groups_count": 0
}
/healthcheck/
Check the health of the application
get /healthcheck/
Check the health of the application
HTTP status code 200
Healthy Application
Body
Media type: application/json
Type: any
Example:
{
"time_sync":{"healthy":true},
"db_read":{"healthy":true},
"db_sync":{"healthy":true}
}
HTTP status code 400
Unhealthy Application, the JSON indicates the problem
Body
Media type: application/json
Type: any
Example:
{
"time_sync":{"healthy":false},
"db_read":{"healthy":true},
"db_sync":{"healthy":true}
}
/info/
Returns the Server's signed information. Usually the first call before logging in.
get /info/
Returns the Server's signed information. Usually the first call before logging in.
HTTP status code 200
The Servers signed information
Body
Media type: application/json
Type: any
Example:
{
"info":"{\"api\": 1, \"public_key\": \"fc226a04f47fd32b11b815de697fe60a80aea21a104b3a83e6f71fd41ef37301\", \"version\": \"1.1.8 (Build 0fe0bf7f)\", \"log_audit\": false}",
"verify_key":"a16301bd25e3a445a83b279e7091ea91d085901933f310fdb1b137db9676de59",
"signature":"f1a6d39264667f47413b03e8ca937f9b3495193f2d0832754cced65961f1e5466cd78249887a0e0f7489e3a544006612708f0a7c77a592ab7980901caf41b00f"
}