diff --git a/README.md b/README.md index 14e3aa09..59648b9b 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ node server.js --config=/etc/wildduck.toml ### Step 4\. Create an user account -See [API Docs](https://github.com/nodemailer/wildduck/wiki/API-Docs#add-a-new-user) for details about creating new user accounts +See [API Docs](https://api.wildduck.email/#api-Users-PostUser) for details about creating new user accounts ### Step 5\. Use an IMAP/POP3 client to log in @@ -107,15 +107,15 @@ Any IMAP or POP3 client will do. Use the credentials from step 4\. to log in. Users, mailboxes and messages can be managed with HTTP requests against Wild Duck API -### [API Docs](https://github.com/nodemailer/wildduck/wiki/API-Docs) +**[API Docs](https://api.wildduck.email/)** # FAQ ### Does it work? -Yes, it does. You can run the server and get working IMAP and POP3 servers for mail store, LMTP server for pushing messages to the mail store and HTTP API -server to create new users. All handled by Node.js, MongoDB and Redis, no additional dependencies needed. Provided services can be disabled and enabled one by -one so, for example you could process just IMAP in one host and LMTP in another. +Yes, it does. You can run the server and get working IMAP and POP3 servers for mail store, LMTP server for pushing messages to the mail store and +[HTTP API](https://api.wildduck.email/) server to create new users. All handled by Node.js, MongoDB and Redis, no additional dependencies needed. Provided +services can be disabled and enabled one by one so, for example you could process just IMAP in one host and LMTP in another. ### How is security implemented in Wild Duck? @@ -134,8 +134,8 @@ Read about Wild Duck security implementation from the [Wiki](https://github.com/ 5. **Works on any OS including Windows.** At least if you get MongoDB and Redis running first. 6. Focus on **internationalization**, ie. supporting email addresses with non-ascii characters 7. **Deduplication of attachments.** If the same attachment is referenced by different messages then only a single copy of the attachment is stored. -8. Access messages both using **IMAP and HTTP API**. The latter serves parsed data, so no need to fetch RFC822 messages and parse out html, plaintext content or - attachments. It is super easy to create a webmail interface on top of this. +8. Access messages both using **IMAP and [HTTP API](https://api.wildduck.email/)**. The latter serves parsed data, so no need to fetch RFC822 messages and parse + out html, plaintext content or attachments. It is super easy to create a webmail interface on top of this. 9. Built in **address labels**: _username+label@example.com_ is delivered to _username@example.com_ 10. Dots in usernames and addresses are informational only. username@example.com is the same as user.name@example.com 11. **HTTP Event Source** to push modifications in user email account to browser for super snappy webmail clients @@ -250,7 +250,7 @@ If a messages is deleted by a client this message gets marked as Seen and moved Wild Duck has built-in message filtering in LMTP server. This is somewhat similar to Sieve even though the filters are not scripts. -Filters can be managed via the [Wild Duck API](https://github.com/nodemailer/wildduck/wiki/API-Docs). +Filters can be managed via the [Wild Duck API](https://api.wildduck.email/#api-Filters). ## IMAP Protocol Differences diff --git a/docs/api_data.js b/docs/api_data.js index 16a37075..a36556f5 100644 --- a/docs/api_data.js +++ b/docs/api_data.js @@ -1 +1 @@ -define({ "api": [ { "type": "delete", "url": "/users/:id", "title": "Delete an User", "name": "DeleteUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0?ip=127.0.0.1", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users/:id", "title": "Request User information", "name": "GetUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "retention", "description": "

Default retention time in ms. false if not enabled

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "enabled2fa", "description": "

List of enabled 2FA methods

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "keyInfo", "description": "

Information about public key or false if key is not available

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.name", "description": "

Name listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.address", "description": "

E-mail address listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.fingerprint", "description": "

Fingerprint of the public key

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits", "description": "

Account limits and usage

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.recipients", "description": "

Sending quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.allowed", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.used", "description": "

How many messages are sent during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.forwards", "description": "

Forwarding quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.allowed", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.used", "description": "

How many messages are forwarded during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "tags", "description": "

List of tags associated with the User

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"59fc66a03e54454869460e45\",\n \"username\": \"testuser01\",\n \"name\": null,\n \"address\": \"testuser01@example.com\",\n \"retention\": false,\n \"enabled2fa\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"pubKey\": \"\",\n \"keyInfo\": false,\n \"forward\": [],\n \"targetUrl\": \"\",\n \"limits\": {\n \"quota\": {\n \"allowed\": 107374182400,\n \"used\": 289838\n },\n \"recipients\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n },\n \"forwards\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n }\n },\n \"tags\": [\"green\", \"blue\"],\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users", "title": "List registered Users", "name": "GetUsers", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": true, "field": "query", "description": "

Partial match of username or default email address

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "tags", "description": "

Comma separated list of tags. The User must have at least one to be set

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "requiredTags", "description": "

Comma separated list of tags. The User must have all listed tags to be set

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "limit", "defaultValue": "20", "description": "

How many records to return

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "page", "defaultValue": "1", "description": "

Current page number. Informational only, page numbers start from 1

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "next", "description": "

Cursor value for next page, retrieved from nextCursor response value

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "previous", "description": "

Cursor value for previous page, retrieved from previousCursor response value

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "total", "description": "

How many results were found

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "page", "description": "

Current page number. Derived from page query argument

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "previousCursor", "description": "

Either a cursor string or false if there are not any previous results

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "nextCursor", "description": "

Either a cursor string or false if there are not any next results

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

User listing

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.tags", "description": "

List of tags associated with the User'

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "results.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"total\": 1,\n \"page\": 1,\n \"previousCursor\": false,\n \"nextCursor\": false,\n \"results\": [\n {\n \"id\": \"59cb948ad80a820b68f05230\",\n \"username\": \"myuser\",\n \"name\": \"John Doe\",\n \"address\": \"john@example.com\",\n \"tags\": [],\n \"forward\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"quota\": {\n \"allowed\": 1073741824,\n \"used\": 17799833\n },\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Database error\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users", "title": "Create new user", "name": "PostUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "name", "description": "

Username of the User

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "address", "description": "

Default email address for the User (autogenerated if not set)

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "emptyAddress", "description": "

If true then do not autogenerate missing email address for the User. Only needed if you want to create an user account that does not have any email address associated

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created User

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1bda70bfbd1442cd96c6f0\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This username already exists\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users \\\n-H 'Content-type: application/json' \\\n-d '{\n \"username\": \"myuser\",\n \"password\": \"verysecret\",\n \"name\": \"John Doe\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/quota/reset", "title": "Recalculate User quota", "name": "PostUserQuota", "group": "Users", "description": "

This method recalculates quota usage for an User. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "storageUsed", "description": "

Calculated quota usage for the user

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"storageUsed\": 1234567\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/59fc66a03e54454869460e45/quota/reset \\\n-H 'Content-type: application/json' \\\n-d '{}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id", "title": "Update User information", "name": "PutUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the User

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "existingPassword", "description": "

If provided then validates against account password before applying any changes

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45 \\\n-H 'Content-type: application/json' \\\n-d '{\n \"name\": \"Updated user name\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id/logout", "title": "Log out User", "name": "PutUserLogout", "group": "Users", "description": "

This method logs out all user sessions in IMAP

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/logout \\\n-H 'Content-type: application/json' \\\n-d '{\n \"reason\": \"Logout requested from API\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/password/reset", "title": "Reset password for an User", "name": "ResetUserPassword", "group": "Users", "description": "

This method generates a new temporary password for an User. Additionally it removes all two-factor authentication settings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "password", "description": "

Temporary password

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"password\": \"temporarypass\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96/password/reset \\\n-H 'Content-type: application/json' \\\n-d '{\n \"ip\": \"127.0.0.1\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" } ] }); +define({ "api": [ { "type": "delete", "url": "/users/:user/filters/:filter", "title": "Delete a Filter", "name": "DeleteFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This filter does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "get", "url": "/users/:user/filters/:filter", "title": "Request Filter information", "name": "GetFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the Filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the Filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1c0ee490a34c67e266931c\",\n \"created\": \"2017-11-27T13:11:00.835Z\",\n \"query_from\": \"Mäger\",\n \"action_seen\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This filter does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "get", "url": "/users/:user/filters", "title": "List Filters for an User", "name": "GetFilters", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

Filter description

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Filter ID

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name for the filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.created", "description": "

Datestring of the time the filter was created

" }, { "group": "Success 200", "type": "Array[]", "optional": false, "field": "results.query", "description": "

A list of query descriptions

" }, { "group": "Success 200", "type": "Array[]", "optional": false, "field": "results.action", "description": "

A list of action descriptions

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"results\": [\n {\n \"id\": \"5a1c0ee490a34c67e266931c\",\n \"query\": [\n [\n \"from\",\n \"(Mäger)\"\n ]\n ],\n \"action\": [\n [\n \"mark as read\"\n ]\n ],\n \"created\": \"2017-11-27T13:11:00.835Z\"\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "post", "url": "/users/:user/filters", "title": "Create new Filter", "name": "PostFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the Filter

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created Filter

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1c0ee490a34c67e266931c\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Empty filter query\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters \\\n-H 'Content-type: application/json' \\\n-d '{\n \"query_from\": \"Mäger\",\n \"action_seen\": true\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "put", "url": "/users/:user/filters/:filter", "title": "Update Filter information", "name": "PutFilter", "group": "Filters", "description": "

This method updates Filter data. To unset a value, use empty strings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the Filter

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created Filter

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Empty filter query\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c \\\n-H 'Content-type: application/json' \\\n-d '{\n \"action_seen\": \"\",\n \"action_flag\": true\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "delete", "url": "/users/:id", "title": "Delete an User", "name": "DeleteUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0?ip=127.0.0.1", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users/:id", "title": "Request User information", "name": "GetUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "retention", "description": "

Default retention time in ms. false if not enabled

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "enabled2fa", "description": "

List of enabled 2FA methods

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "keyInfo", "description": "

Information about public key or false if key is not available

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.name", "description": "

Name listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.address", "description": "

E-mail address listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.fingerprint", "description": "

Fingerprint of the public key

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits", "description": "

Account limits and usage

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.recipients", "description": "

Sending quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.allowed", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.used", "description": "

How many messages are sent during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.forwards", "description": "

Forwarding quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.allowed", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.used", "description": "

How many messages are forwarded during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "tags", "description": "

List of tags associated with the User

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"59fc66a03e54454869460e45\",\n \"username\": \"testuser01\",\n \"name\": null,\n \"address\": \"testuser01@example.com\",\n \"retention\": false,\n \"enabled2fa\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"pubKey\": \"\",\n \"keyInfo\": false,\n \"forward\": [],\n \"targetUrl\": \"\",\n \"limits\": {\n \"quota\": {\n \"allowed\": 107374182400,\n \"used\": 289838\n },\n \"recipients\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n },\n \"forwards\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n }\n },\n \"tags\": [\"green\", \"blue\"],\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users", "title": "List registered Users", "name": "GetUsers", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": true, "field": "query", "description": "

Partial match of username or default email address

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "tags", "description": "

Comma separated list of tags. The User must have at least one to be set

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "requiredTags", "description": "

Comma separated list of tags. The User must have all listed tags to be set

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "limit", "defaultValue": "20", "description": "

How many records to return

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "page", "defaultValue": "1", "description": "

Current page number. Informational only, page numbers start from 1

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "next", "description": "

Cursor value for next page, retrieved from nextCursor response value

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "previous", "description": "

Cursor value for previous page, retrieved from previousCursor response value

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "total", "description": "

How many results were found

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "page", "description": "

Current page number. Derived from page query argument

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "previousCursor", "description": "

Either a cursor string or false if there are not any previous results

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "nextCursor", "description": "

Either a cursor string or false if there are not any next results

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

User listing

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.tags", "description": "

List of tags associated with the User'

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "results.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"total\": 1,\n \"page\": 1,\n \"previousCursor\": false,\n \"nextCursor\": false,\n \"results\": [\n {\n \"id\": \"59cb948ad80a820b68f05230\",\n \"username\": \"myuser\",\n \"name\": \"John Doe\",\n \"address\": \"john@example.com\",\n \"tags\": [],\n \"forward\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"quota\": {\n \"allowed\": 1073741824,\n \"used\": 17799833\n },\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Database error\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users", "title": "Create new user", "name": "PostUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "name", "description": "

Username of the User

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "address", "description": "

Default email address for the User (autogenerated if not set)

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "emptyAddress", "description": "

If true then do not autogenerate missing email address for the User. Only needed if you want to create an user account that does not have any email address associated

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created User

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1bda70bfbd1442cd96c6f0\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This username already exists\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users \\\n-H 'Content-type: application/json' \\\n-d '{\n \"username\": \"myuser\",\n \"password\": \"verysecret\",\n \"name\": \"John Doe\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/quota/reset", "title": "Recalculate User quota", "name": "PostUserQuota", "group": "Users", "description": "

This method recalculates quota usage for an User. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "storageUsed", "description": "

Calculated quota usage for the user

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"storageUsed\": 1234567\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/59fc66a03e54454869460e45/quota/reset \\\n-H 'Content-type: application/json' \\\n-d '{}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id", "title": "Update User information", "name": "PutUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the User

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "existingPassword", "description": "

If provided then validates against account password before applying any changes

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45 \\\n-H 'Content-type: application/json' \\\n-d '{\n \"name\": \"Updated user name\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id/logout", "title": "Log out User", "name": "PutUserLogout", "group": "Users", "description": "

This method logs out all user sessions in IMAP

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/logout \\\n-H 'Content-type: application/json' \\\n-d '{\n \"reason\": \"Logout requested from API\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/password/reset", "title": "Reset password for an User", "name": "ResetUserPassword", "group": "Users", "description": "

This method generates a new temporary password for an User. Additionally it removes all two-factor authentication settings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "password", "description": "

Temporary password

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"password\": \"temporarypass\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96/password/reset \\\n-H 'Content-type: application/json' \\\n-d '{\n \"ip\": \"127.0.0.1\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" } ] }); diff --git a/docs/api_data.json b/docs/api_data.json index 32e2e688..7824beed 100644 --- a/docs/api_data.json +++ b/docs/api_data.json @@ -1 +1 @@ -[ { "type": "delete", "url": "/users/:id", "title": "Delete an User", "name": "DeleteUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0?ip=127.0.0.1", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users/:id", "title": "Request User information", "name": "GetUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "retention", "description": "

Default retention time in ms. false if not enabled

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "enabled2fa", "description": "

List of enabled 2FA methods

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "keyInfo", "description": "

Information about public key or false if key is not available

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.name", "description": "

Name listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.address", "description": "

E-mail address listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.fingerprint", "description": "

Fingerprint of the public key

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits", "description": "

Account limits and usage

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.recipients", "description": "

Sending quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.allowed", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.used", "description": "

How many messages are sent during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.forwards", "description": "

Forwarding quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.allowed", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.used", "description": "

How many messages are forwarded during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "tags", "description": "

List of tags associated with the User

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"59fc66a03e54454869460e45\",\n \"username\": \"testuser01\",\n \"name\": null,\n \"address\": \"testuser01@example.com\",\n \"retention\": false,\n \"enabled2fa\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"pubKey\": \"\",\n \"keyInfo\": false,\n \"forward\": [],\n \"targetUrl\": \"\",\n \"limits\": {\n \"quota\": {\n \"allowed\": 107374182400,\n \"used\": 289838\n },\n \"recipients\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n },\n \"forwards\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n }\n },\n \"tags\": [\"green\", \"blue\"],\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users", "title": "List registered Users", "name": "GetUsers", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": true, "field": "query", "description": "

Partial match of username or default email address

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "tags", "description": "

Comma separated list of tags. The User must have at least one to be set

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "requiredTags", "description": "

Comma separated list of tags. The User must have all listed tags to be set

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "limit", "defaultValue": "20", "description": "

How many records to return

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "page", "defaultValue": "1", "description": "

Current page number. Informational only, page numbers start from 1

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "next", "description": "

Cursor value for next page, retrieved from nextCursor response value

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "previous", "description": "

Cursor value for previous page, retrieved from previousCursor response value

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "total", "description": "

How many results were found

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "page", "description": "

Current page number. Derived from page query argument

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "previousCursor", "description": "

Either a cursor string or false if there are not any previous results

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "nextCursor", "description": "

Either a cursor string or false if there are not any next results

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

User listing

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.tags", "description": "

List of tags associated with the User'

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "results.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"total\": 1,\n \"page\": 1,\n \"previousCursor\": false,\n \"nextCursor\": false,\n \"results\": [\n {\n \"id\": \"59cb948ad80a820b68f05230\",\n \"username\": \"myuser\",\n \"name\": \"John Doe\",\n \"address\": \"john@example.com\",\n \"tags\": [],\n \"forward\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"quota\": {\n \"allowed\": 1073741824,\n \"used\": 17799833\n },\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Database error\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users", "title": "Create new user", "name": "PostUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "name", "description": "

Username of the User

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "address", "description": "

Default email address for the User (autogenerated if not set)

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "emptyAddress", "description": "

If true then do not autogenerate missing email address for the User. Only needed if you want to create an user account that does not have any email address associated

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created User

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1bda70bfbd1442cd96c6f0\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This username already exists\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users \\\n-H 'Content-type: application/json' \\\n-d '{\n \"username\": \"myuser\",\n \"password\": \"verysecret\",\n \"name\": \"John Doe\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/quota/reset", "title": "Recalculate User quota", "name": "PostUserQuota", "group": "Users", "description": "

This method recalculates quota usage for an User. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "storageUsed", "description": "

Calculated quota usage for the user

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"storageUsed\": 1234567\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/59fc66a03e54454869460e45/quota/reset \\\n-H 'Content-type: application/json' \\\n-d '{}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id", "title": "Update User information", "name": "PutUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the User

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "existingPassword", "description": "

If provided then validates against account password before applying any changes

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45 \\\n-H 'Content-type: application/json' \\\n-d '{\n \"name\": \"Updated user name\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id/logout", "title": "Log out User", "name": "PutUserLogout", "group": "Users", "description": "

This method logs out all user sessions in IMAP

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/logout \\\n-H 'Content-type: application/json' \\\n-d '{\n \"reason\": \"Logout requested from API\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/password/reset", "title": "Reset password for an User", "name": "ResetUserPassword", "group": "Users", "description": "

This method generates a new temporary password for an User. Additionally it removes all two-factor authentication settings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "password", "description": "

Temporary password

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"password\": \"temporarypass\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96/password/reset \\\n-H 'Content-type: application/json' \\\n-d '{\n \"ip\": \"127.0.0.1\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" } ] +[ { "type": "delete", "url": "/users/:user/filters/:filter", "title": "Delete a Filter", "name": "DeleteFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This filter does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "get", "url": "/users/:user/filters/:filter", "title": "Request Filter information", "name": "GetFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the Filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the Filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Success 200", "type": "Bolean", "optional": false, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1c0ee490a34c67e266931c\",\n \"created\": \"2017-11-27T13:11:00.835Z\",\n \"query_from\": \"Mäger\",\n \"action_seen\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This filter does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "get", "url": "/users/:user/filters", "title": "List Filters for an User", "name": "GetFilters", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

Filter description

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Filter ID

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name for the filter

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.created", "description": "

Datestring of the time the filter was created

" }, { "group": "Success 200", "type": "Array[]", "optional": false, "field": "results.query", "description": "

A list of query descriptions

" }, { "group": "Success 200", "type": "Array[]", "optional": false, "field": "results.action", "description": "

A list of action descriptions

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"results\": [\n {\n \"id\": \"5a1c0ee490a34c67e266931c\",\n \"query\": [\n [\n \"from\",\n \"(Mäger)\"\n ]\n ],\n \"action\": [\n [\n \"mark as read\"\n ]\n ],\n \"created\": \"2017-11-27T13:11:00.835Z\"\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "post", "url": "/users/:user/filters", "title": "Create new Filter", "name": "PostFilter", "group": "Filters", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the Filter

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created Filter

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1c0ee490a34c67e266931c\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Empty filter query\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters \\\n-H 'Content-type: application/json' \\\n-d '{\n \"query_from\": \"Mäger\",\n \"action_seen\": true\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "put", "url": "/users/:user/filters/:filter", "title": "Update Filter information", "name": "PutFilter", "group": "Filters", "description": "

This method updates Filter data. To unset a value, use empty strings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "user", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "filter", "description": "

Filters unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the Filter

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_from", "description": "

Partial match for the From: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_to", "description": "

Partial match for the To:/Cc: headers (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_subject", "description": "

Partial match for the Subject: header (case insensitive)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "query_text", "description": "

Fulltext search against message text

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "query_ha", "description": "

Does a message have to have an attachment or not

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "query_size", "description": "

Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_seen", "description": "

If true then mark matching messages as Seen

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_flag", "description": "

If true then mark matching messages as Flagged

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_delete", "description": "

If true then do not store matching messages

" }, { "group": "Parameter", "type": "Bolean", "optional": true, "field": "action_spam", "description": "

If true then store matching messags to Junk Mail folder

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_mailbox", "description": "

Mailbox ID to store matching messages to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_forward", "description": "

An email address where matching messages should be forwarded to

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "action_targetUrl", "description": "

An URL where matching messages should be POSTed to

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created Filter

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Empty filter query\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c \\\n-H 'Content-type: application/json' \\\n-d '{\n \"action_seen\": \"\",\n \"action_flag\": true\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/filters.js", "groupTitle": "Filters" }, { "type": "delete", "url": "/users/:id", "title": "Delete an User", "name": "DeleteUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XDELETE http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0?ip=127.0.0.1", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users/:id", "title": "Request User information", "name": "GetUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "retention", "description": "

Default retention time in ms. false if not enabled

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "enabled2fa", "description": "

List of enabled 2FA methods

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "keyInfo", "description": "

Information about public key or false if key is not available

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.name", "description": "

Name listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.address", "description": "

E-mail address listed in public key

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "keyInfo.fingerprint", "description": "

Fingerprint of the public key

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits", "description": "

Account limits and usage

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.recipients", "description": "

Sending quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.allowed", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.used", "description": "

How many messages are sent during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.recipients.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "limits.forwards", "description": "

Forwarding quota

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.allowed", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.used", "description": "

How many messages are forwarded during current 24 hour period

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "limits.forwards.ttl", "description": "

Time until the end of current 24 hour period

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "tags", "description": "

List of tags associated with the User

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"59fc66a03e54454869460e45\",\n \"username\": \"testuser01\",\n \"name\": null,\n \"address\": \"testuser01@example.com\",\n \"retention\": false,\n \"enabled2fa\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"pubKey\": \"\",\n \"keyInfo\": false,\n \"forward\": [],\n \"targetUrl\": \"\",\n \"limits\": {\n \"quota\": {\n \"allowed\": 107374182400,\n \"used\": 289838\n },\n \"recipients\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n },\n \"forwards\": {\n \"allowed\": 2000,\n \"used\": 0,\n \"ttl\": false\n }\n },\n \"tags\": [\"green\", \"blue\"],\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users/59fc66a03e54454869460e45", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "get", "url": "/users", "title": "List registered Users", "name": "GetUsers", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": true, "field": "query", "description": "

Partial match of username or default email address

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "tags", "description": "

Comma separated list of tags. The User must have at least one to be set

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "requiredTags", "description": "

Comma separated list of tags. The User must have all listed tags to be set

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "limit", "defaultValue": "20", "description": "

How many records to return

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "page", "defaultValue": "1", "description": "

Current page number. Informational only, page numbers start from 1

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "next", "description": "

Cursor value for next page, retrieved from nextCursor response value

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "previous", "description": "

Cursor value for previous page, retrieved from previousCursor response value

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "total", "description": "

How many results were found

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "page", "description": "

Current page number. Derived from page query argument

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "previousCursor", "description": "

Either a cursor string or false if there are not any previous results

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "nextCursor", "description": "

Either a cursor string or false if there are not any next results

" }, { "group": "Success 200", "type": "Object[]", "optional": false, "field": "results", "description": "

User listing

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.id", "description": "

Users unique ID (24 byte hex)

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.username", "description": "

Username of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.name", "description": "

Name of the User

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "results.address", "description": "

Main email address of the User

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.tags", "description": "

List of tags associated with the User'

" }, { "group": "Success 200", "type": "String[]", "optional": false, "field": "results.forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Success 200", "type": "Object", "optional": false, "field": "results.quota", "description": "

Quota usage limits

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.allowed", "description": "

Allowed quota of the user in bytes

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "results.quota.used", "description": "

Space used in bytes

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.hasPasswordSet", "description": "

If true then the User has a password set and can authenticate

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.activated", "description": "

Is the account activated

" }, { "group": "Success 200", "type": "Boolean", "optional": false, "field": "results.disabled", "description": "

If true then the user can not authenticate or receive any new mail

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"total\": 1,\n \"page\": 1,\n \"previousCursor\": false,\n \"nextCursor\": false,\n \"results\": [\n {\n \"id\": \"59cb948ad80a820b68f05230\",\n \"username\": \"myuser\",\n \"name\": \"John Doe\",\n \"address\": \"john@example.com\",\n \"tags\": [],\n \"forward\": [],\n \"encryptMessages\": false,\n \"encryptForwarded\": false,\n \"quota\": {\n \"allowed\": 1073741824,\n \"used\": 17799833\n },\n \"hasPasswordSet\": true,\n \"activated\": true,\n \"disabled\": false\n }\n ]\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"Database error\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i http://localhost:8080/users", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users", "title": "Create new user", "name": "PostUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "name", "description": "

Username of the User

" }, { "group": "Parameter", "type": "String", "optional": false, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "address", "description": "

Default email address for the User (autogenerated if not set)

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "emptyAddress", "description": "

If true then do not autogenerate missing email address for the User. Only needed if you want to create an user account that does not have any email address associated

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "id", "description": "

ID for the created User

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"id\": \"5a1bda70bfbd1442cd96c6f0\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This username already exists\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users \\\n-H 'Content-type: application/json' \\\n-d '{\n \"username\": \"myuser\",\n \"password\": \"verysecret\",\n \"name\": \"John Doe\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/quota/reset", "title": "Recalculate User quota", "name": "PostUserQuota", "group": "Users", "description": "

This method recalculates quota usage for an User. Normally not needed, only use it if quota numbers are way off. This method is not transactional, so if the user is currently receiving new messages then the resulting value is not exact.

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "Number", "optional": false, "field": "storageUsed", "description": "

Calculated quota usage for the user

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"storageUsed\": 1234567\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/59fc66a03e54454869460e45/quota/reset \\\n-H 'Content-type: application/json' \\\n-d '{}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id", "title": "Update User information", "name": "PutUser", "group": "Users", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "name", "description": "

Name of the User

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "existingPassword", "description": "

If provided then validates against account password before applying any changes

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "password", "description": "

New password for the account

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "retention", "description": "

Default retention time in ms. Set to 0 to disable

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptMessages", "description": "

If true then received messages are encrypted

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "encryptForwarded", "description": "

If true then forwarded messages are encrypted

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "pubKey", "description": "

Public PGP key for the User that is used for encryption. Use empty string to remove the key

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "language", "description": "

Language code for the User

" }, { "group": "Parameter", "type": "String[]", "optional": true, "field": "forward", "description": "

A list of email addresses to forward all incoming emails

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "targetUrl", "description": "

An URL to post all incoming emails

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "quota", "description": "

Allowed quota of the user in bytes

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "recipients", "description": "

How many messages per 24 hour can be sent

" }, { "group": "Parameter", "type": "Number", "optional": true, "field": "forwards", "description": "

How many messages per 24 hour can be forwarded

" }, { "group": "Parameter", "type": "Boolean", "optional": true, "field": "disabled", "description": "

If true then disables user account (can not login, can not receive messages)

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45 \\\n-H 'Content-type: application/json' \\\n-d '{\n \"name\": \"Updated user name\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "put", "url": "/users/:id/logout", "title": "Log out User", "name": "PutUserLogout", "group": "Users", "description": "

This method logs out all user sessions in IMAP

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "reason", "description": "

Message to be shown to connected IMAP client

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/logout \\\n-H 'Content-type: application/json' \\\n-d '{\n \"reason\": \"Logout requested from API\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" }, { "type": "post", "url": "/users/:id/password/reset", "title": "Reset password for an User", "name": "ResetUserPassword", "group": "Users", "description": "

This method generates a new temporary password for an User. Additionally it removes all two-factor authentication settings

", "header": { "fields": { "Header": [ { "group": "Header", "type": "String", "optional": false, "field": "X-Access-Token", "description": "

Optional access token if authentication is enabled

" } ] }, "examples": [ { "title": "Header-Example:", "content": "{\n \"X-Access-Token\": \"59fc66a03e54454869460e45\"\n}", "type": "json" } ] }, "parameter": { "fields": { "Parameter": [ { "group": "Parameter", "type": "String", "optional": false, "field": "id", "description": "

Users unique ID.

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "sess", "description": "

Session identifier for the logs

" }, { "group": "Parameter", "type": "String", "optional": true, "field": "ip", "description": "

IP address for the logs

" } ] } }, "success": { "fields": { "Success 200": [ { "group": "Success 200", "type": "Boolean", "optional": false, "field": "success", "description": "

Indicates successful response

" }, { "group": "Success 200", "type": "String", "optional": false, "field": "password", "description": "

Temporary password

" } ] }, "examples": [ { "title": "Success-Response:", "content": "HTTP/1.1 200 OK\n{\n \"success\": true,\n \"password\": \"temporarypass\"\n}", "type": "json" } ] }, "error": { "fields": { "Error 4xx": [ { "group": "Error 4xx", "optional": false, "field": "error", "description": "

Description of the error

" } ] }, "examples": [ { "title": "Error-Response:", "content": "HTTP/1.1 200 OK\n{\n \"error\": \"This user does not exist\"\n}", "type": "json" } ] }, "examples": [ { "title": "Example usage:", "content": "curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96/password/reset \\\n-H 'Content-type: application/json' \\\n-d '{\n \"ip\": \"127.0.0.1\"\n}'", "type": "curl" } ], "version": "0.0.0", "filename": "lib/api/users.js", "groupTitle": "Users" } ] diff --git a/docs/api_project.js b/docs/api_project.js index bdc47b52..6c6d4dfa 100644 --- a/docs/api_project.js +++ b/docs/api_project.js @@ -1 +1 @@ -define({ "name": "wildduck", "version": "1.0.0", "description": "WildDuck API docs", "title": "WildDuck API", "url": "http://localhost:8080", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2017-11-27T12:20:35.334Z", "url": "http://apidocjs.com", "version": "0.17.6" } }); +define({ "name": "wildduck", "version": "1.0.0", "description": "WildDuck API docs", "title": "WildDuck API", "url": "http://localhost:8080", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2017-11-27T13:55:26.682Z", "url": "http://apidocjs.com", "version": "0.17.6" } }); diff --git a/docs/api_project.json b/docs/api_project.json index bc00e9fa..bbe5dfe2 100644 --- a/docs/api_project.json +++ b/docs/api_project.json @@ -1 +1 @@ -{ "name": "wildduck", "version": "1.0.0", "description": "WildDuck API docs", "title": "WildDuck API", "url": "http://localhost:8080", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2017-11-27T12:20:35.334Z", "url": "http://apidocjs.com", "version": "0.17.6" } } +{ "name": "wildduck", "version": "1.0.0", "description": "WildDuck API docs", "title": "WildDuck API", "url": "http://localhost:8080", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", "generator": { "name": "apidoc", "time": "2017-11-27T13:55:26.682Z", "url": "http://apidocjs.com", "version": "0.17.6" } } diff --git a/lib/api/filters.js b/lib/api/filters.js index a1a7f20b..fdae39ec 100644 --- a/lib/api/filters.js +++ b/lib/api/filters.js @@ -5,11 +5,69 @@ const ObjectID = require('mongodb').ObjectID; const urllib = require('url'); module.exports = (db, server) => { + /** + * @api {get} /users/:user/filters List Filters for an User + * @apiName GetFilters + * @apiGroup Filters + * @apiHeader {String} X-Access-Token Optional access token if authentication is enabled + * @apiHeaderExample {json} Header-Example: + * { + * "X-Access-Token": "59fc66a03e54454869460e45" + * } + * + * @apiParam {String} user Users unique ID + * + * @apiSuccess {Boolean} success Indicates successful response + * @apiSuccess {Object[]} results Filter description + * @apiSuccess {String} results.id Filter ID + * @apiSuccess {String} results.name Name for the filter + * @apiSuccess {String} results.created Datestring of the time the filter was created + * @apiSuccess {Array[]} results.query A list of query descriptions + * @apiSuccess {Array[]} results.action A list of action descriptions + * + * @apiError error Description of the error + * + * @apiExample {curl} Example usage: + * curl -i http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "success": true, + * "results": [ + * { + * "id": "5a1c0ee490a34c67e266931c", + * "query": [ + * [ + * "from", + * "(Mäger)" + * ] + * ], + * "action": [ + * [ + * "mark as read" + * ] + * ], + * "created": "2017-11-27T13:11:00.835Z" + * } + * ] + * } + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 200 OK + * { + * "error": "This user does not exist" + * } + */ server.get('/users/:user/filters', (req, res, next) => { res.charSet('utf-8'); const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required() + user: Joi.string() + .hex() + .lowercase() + .length(24) + .required() }); const result = Joi.validate(req.params, schema, { @@ -26,92 +84,155 @@ module.exports = (db, server) => { let user = new ObjectID(result.value.user); - db.users.collection('users').findOne({ - _id: user - }, { - fields: { - address: true - } - }, (err, userData) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - if (!userData) { - res.json({ - error: 'This user does not exist' - }); - return next(); - } - - db.database - .collection('mailboxes') - .find({ - user - }) - .project({ _id: 1, path: 1 }) - .sort({ _id: 1 }) - .toArray((err, mailboxes) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - - if (!mailboxes) { - mailboxes = []; - } - - db.database - .collection('filters') - .find({ - user - }) - .sort({ - _id: 1 - }) - .toArray((err, filters) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - - if (!filters) { - filters = []; - } + db.users.collection('users').findOne( + { + _id: user + }, + { + fields: { + address: true + } + }, + (err, userData) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + if (!userData) { + res.json({ + error: 'This user does not exist' + }); + return next(); + } + db.database + .collection('mailboxes') + .find({ + user + }) + .project({ _id: 1, path: 1 }) + .sort({ _id: 1 }) + .toArray((err, mailboxes) => { + if (err) { res.json({ - success: true, - - results: filters.map(filter => { - let descriptions = getFilterStrings(filter, mailboxes); - return { - id: filter._id, - name: filter.name, - query: descriptions.query, - action: descriptions.action, - created: filter.created - }; - }) + error: 'MongoDB Error: ' + err.message }); - return next(); - }); - }); - }); + } + + if (!mailboxes) { + mailboxes = []; + } + + db.database + .collection('filters') + .find({ + user + }) + .sort({ + _id: 1 + }) + .toArray((err, filters) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + + if (!filters) { + filters = []; + } + + res.json({ + success: true, + + results: filters.map(filter => { + let descriptions = getFilterStrings(filter, mailboxes); + return { + id: filter._id, + name: filter.name, + query: descriptions.query, + action: descriptions.action, + created: filter.created + }; + }) + }); + + return next(); + }); + }); + } + ); }); + /** + * @api {get} /users/:user/filters/:filter Request Filter information + * @apiName GetFilter + * @apiGroup Filters + * @apiHeader {String} X-Access-Token Optional access token if authentication is enabled + * @apiHeaderExample {json} Header-Example: + * { + * "X-Access-Token": "59fc66a03e54454869460e45" + * } + * + * @apiParam {String} user Users unique ID. + * @apiParam {String} filter Filters unique ID. + * + * @apiSuccess {Boolean} success Indicates successful response + * @apiSuccess {String} id ID for the Filter + * @apiSuccess {String} name Name of the Filter + * @apiSuccess {String} query_from Partial match for the From: header (case insensitive) + * @apiSuccess {String} query_to Partial match for the To:/Cc: headers (case insensitive) + * @apiSuccess {String} query_subject Partial match for the Subject: header (case insensitive) + * @apiSuccess {String} query_text Fulltext search against message text + * @apiSuccess {Bolean} query_ha Does a message have to have an attachment or not + * @apiSuccess {Number} query_size Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value + * @apiSuccess {Bolean} action_seen If true then mark matching messages as Seen + * @apiSuccess {Bolean} action_flag If true then mark matching messages as Flagged + * @apiSuccess {Bolean} action_delete If true then do not store matching messages + * @apiSuccess {Bolean} action_spam If true then store matching messags to Junk Mail folder + * @apiSuccess {String} action_mailbox Mailbox ID to store matching messages to + * @apiSuccess {String} action_forward An email address where matching messages should be forwarded to + * @apiSuccess {String} action_targetUrl An URL where matching messages should be POSTed to + * + * @apiError error Description of the error + * + * @apiExample {curl} Example usage: + * curl -i http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "success": true, + * "id": "5a1c0ee490a34c67e266931c", + * "created": "2017-11-27T13:11:00.835Z", + * "query_from": "Mäger", + * "action_seen": true + * } + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 200 OK + * { + * "error": "This filter does not exist" + * } + */ server.get('/users/:user/filters/:filter', (req, res, next) => { res.charSet('utf-8'); const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - filter: Joi.string().hex().lowercase().length(24).required() + user: Joi.string() + .hex() + .lowercase() + .length(24) + .required(), + filter: Joi.string() + .hex() + .lowercase() + .length(24) + .required() }); const result = Joi.validate(req.params, schema, { @@ -129,76 +250,119 @@ module.exports = (db, server) => { let user = new ObjectID(result.value.user); let filter = new ObjectID(result.value.filter); - db.database.collection('filters').findOne({ - _id: filter, - user - }, (err, filterData) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - if (!filterData) { - res.json({ - error: 'This filter does not exist' - }); - return next(); - } - - db.database - .collection('mailboxes') - .find({ - user - }) - .project({ _id: 1, path: 1 }) - .sort({ _id: 1 }) - .toArray((err, mailboxes) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - - if (!mailboxes) { - mailboxes = []; - } - - let result = { - success: true, - id: filterData._id, - name: filterData.name, - created: filterData.created - }; - - Object.keys((filterData.query && filterData.query.headers) || {}).forEach(key => { - result['query_' + key] = filterData.query.headers[key]; + db.database.collection('filters').findOne( + { + _id: filter, + user + }, + (err, filterData) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message }); - - Object.keys(filterData.query || {}).forEach(key => { - if (key !== 'headers') { - result['query_' + key] = filterData.query[key]; - } - }); - - Object.keys(filterData.action || {}).forEach(key => { - result['action_' + key] = filterData.action[key]; - }); - - res.json(result); - return next(); - }); - }); + } + if (!filterData) { + res.json({ + error: 'This filter does not exist' + }); + return next(); + } + + db.database + .collection('mailboxes') + .find({ + user + }) + .project({ _id: 1, path: 1 }) + .sort({ _id: 1 }) + .toArray((err, mailboxes) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + + if (!mailboxes) { + mailboxes = []; + } + + let result = { + success: true, + id: filterData._id, + name: filterData.name, + created: filterData.created + }; + + Object.keys((filterData.query && filterData.query.headers) || {}).forEach(key => { + result['query_' + key] = filterData.query.headers[key]; + }); + + Object.keys(filterData.query || {}).forEach(key => { + if (key !== 'headers') { + result['query_' + key] = filterData.query[key]; + } + }); + + Object.keys(filterData.action || {}).forEach(key => { + result['action_' + key] = filterData.action[key]; + }); + + res.json(result); + + return next(); + }); + } + ); }); + /** + * @api {delete} /users/:user/filters/:filter Delete a Filter + * @apiName DeleteFilter + * @apiGroup Filters + * @apiHeader {String} X-Access-Token Optional access token if authentication is enabled + * @apiHeaderExample {json} Header-Example: + * { + * "X-Access-Token": "59fc66a03e54454869460e45" + * } + * + * @apiParam {String} user Users unique ID + * @apiParam {String} filter Filters unique ID + * + * @apiSuccess {Boolean} success Indicates successful response + * + * @apiError error Description of the error + * + * @apiExample {curl} Example usage: + * curl -i -XDELETE http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "success": true + * } + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 200 OK + * { + * "error": "This filter does not exist" + * } + */ server.del('/users/:user/filters/:filter', (req, res, next) => { res.charSet('utf-8'); const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - filter: Joi.string().hex().lowercase().length(24).required() + user: Joi.string() + .hex() + .lowercase() + .length(24) + .required(), + filter: Joi.string() + .hex() + .lowercase() + .length(24) + .required() }); const result = Joi.validate(req.params, schema, { @@ -216,54 +380,144 @@ module.exports = (db, server) => { let user = new ObjectID(result.value.user); let filter = new ObjectID(result.value.filter); - db.database.collection('filters').deleteOne({ - _id: filter, - user - }, (err, r) => { - if (err) { + db.database.collection('filters').deleteOne( + { + _id: filter, + user + }, + (err, r) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + + if (!r.deletedCount) { + res.status(404); + res.json({ + error: 'Filter was not found' + }); + return next(); + } + res.json({ - error: 'MongoDB Error: ' + err.message + success: true }); return next(); } - - if (!r.deletedCount) { - res.status(404); - res.json({ - error: 'Filter was not found' - }); - return next(); - } - - res.json({ - success: true - }); - return next(); - }); + ); }); + /** + * @api {post} /users/:user/filters Create new Filter + * @apiName PostFilter + * @apiGroup Filters + * @apiHeader {String} X-Access-Token Optional access token if authentication is enabled + * @apiHeaderExample {json} Header-Example: + * { + * "X-Access-Token": "59fc66a03e54454869460e45" + * } + * + * @apiParam {String} user Users unique ID. + * @apiParam {String} [name] Name of the Filter + * @apiParam {String} [query_from] Partial match for the From: header (case insensitive) + * @apiParam {String} [query_to] Partial match for the To:/Cc: headers (case insensitive) + * @apiParam {String} [query_subject] Partial match for the Subject: header (case insensitive) + * @apiParam {String} [query_text] Fulltext search against message text + * @apiParam {Bolean} [query_ha] Does a message have to have an attachment or not + * @apiParam {Number} [query_size] Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value + * @apiParam {Bolean} [action_seen] If true then mark matching messages as Seen + * @apiParam {Bolean} [action_flag] If true then mark matching messages as Flagged + * @apiParam {Bolean} [action_delete] If true then do not store matching messages + * @apiParam {Bolean} [action_spam] If true then store matching messags to Junk Mail folder + * @apiParam {String} [action_mailbox] Mailbox ID to store matching messages to + * @apiParam {String} [action_forward] An email address where matching messages should be forwarded to + * @apiParam {String} [action_targetUrl] An URL where matching messages should be POSTed to + * + * @apiSuccess {Boolean} success Indicates successful response + * @apiSuccess {String} id ID for the created Filter + * + * @apiError error Description of the error + * + * @apiExample {curl} Example usage: + * curl -i -XPOST http://localhost:8080/users/5a1bda70bfbd1442cd96c6f0/filters \ + * -H 'Content-type: application/json' \ + * -d '{ + * "query_from": "Mäger", + * "action_seen": true + * }' + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "success": true, + * "id": "5a1c0ee490a34c67e266931c" + * } + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 200 OK + * { + * "error": "Empty filter query" + * } + */ server.post('/users/:user/filters', (req, res, next) => { res.charSet('utf-8'); const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), + user: Joi.string() + .hex() + .lowercase() + .length(24) + .required(), - name: Joi.string().trim().max(255).empty(''), + name: Joi.string() + .trim() + .max(255) + .empty(''), - query_from: Joi.string().trim().max(255).empty(''), - query_to: Joi.string().trim().max(255).empty(''), - query_subject: Joi.string().trim().max(255).empty(''), - query_text: Joi.string().trim().max(255).empty(''), - query_ha: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), + query_from: Joi.string() + .trim() + .max(255) + .empty(''), + query_to: Joi.string() + .trim() + .max(255) + .empty(''), + query_subject: Joi.string() + .trim() + .max(255) + .empty(''), + query_text: Joi.string() + .trim() + .max(255) + .empty(''), + query_ha: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), query_size: Joi.number().empty(''), - action_seen: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_flag: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_delete: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_spam: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), + action_seen: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_flag: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_delete: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_spam: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), - action_mailbox: Joi.string().hex().lowercase().length(24).empty(''), - action_forward: Joi.string().email().empty(''), + action_mailbox: Joi.string() + .hex() + .lowercase() + .length(24) + .empty(''), + action_forward: Joi.string() + .email() + .empty(''), action_targetUrl: Joi.string() .uri({ scheme: ['http', 'https'], @@ -343,26 +597,29 @@ module.exports = (db, server) => { if (!result.value.action_mailbox) { return done(); } - db.database.collection('mailboxes').findOne({ - _id: new ObjectID(result.value.action_mailbox), - user - }, (err, mailboxData) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); + db.database.collection('mailboxes').findOne( + { + _id: new ObjectID(result.value.action_mailbox), + user + }, + (err, mailboxData) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + if (!mailboxData) { + res.json({ + error: 'This mailbox does not exist' + }); + return next(); + } + filterData.action.mailbox = mailboxData._id; + hasAction = true; + done(); } - if (!mailboxData) { - res.json({ - error: 'This mailbox does not exist' - }); - return next(); - } - filterData.action.mailbox = mailboxData._id; - hasAction = true; - done(); - }); + ); }; checkFilterMailbox(() => { @@ -380,67 +637,163 @@ module.exports = (db, server) => { return next(); } - db.users.collection('users').findOne({ - _id: user - }, { - fields: { - address: true - } - }, (err, userData) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); - } - if (!userData) { - res.json({ - error: 'This user does not exist' - }); - return next(); - } - - db.database.collection('filters').insertOne(filterData, (err, r) => { + db.users.collection('users').findOne( + { + _id: user + }, + { + fields: { + address: true + } + }, + (err, userData) => { if (err) { res.json({ error: 'MongoDB Error: ' + err.message }); return next(); } + if (!userData) { + res.json({ + error: 'This user does not exist' + }); + return next(); + } - res.json({ - success: !!r.insertedCount, - id: filterData._id + db.database.collection('filters').insertOne(filterData, (err, r) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + + res.json({ + success: !!r.insertedCount, + id: filterData._id + }); + return next(); }); - return next(); - }); - }); + } + ); }); }); + /** + * @api {put} /users/:user/filters/:filter Update Filter information + * @apiName PutFilter + * @apiGroup Filters + * @apiDescription This method updates Filter data. To unset a value, use empty strings + * @apiHeader {String} X-Access-Token Optional access token if authentication is enabled + * @apiHeaderExample {json} Header-Example: + * { + * "X-Access-Token": "59fc66a03e54454869460e45" + * } + * + * @apiParam {String} user Users unique ID. + * @apiParam {String} filter Filters unique ID. + * @apiParam {String} [name] Name of the Filter + * @apiParam {String} [query_from] Partial match for the From: header (case insensitive) + * @apiParam {String} [query_to] Partial match for the To:/Cc: headers (case insensitive) + * @apiParam {String} [query_subject] Partial match for the Subject: header (case insensitive) + * @apiParam {String} [query_text] Fulltext search against message text + * @apiParam {Bolean} [query_ha] Does a message have to have an attachment or not + * @apiParam {Number} [query_size] Message size in bytes. If the value is a positive number then message needs to be larger, if negative then message needs to be smaller than abs(size) value + * @apiParam {Bolean} [action_seen] If true then mark matching messages as Seen + * @apiParam {Bolean} [action_flag] If true then mark matching messages as Flagged + * @apiParam {Bolean} [action_delete] If true then do not store matching messages + * @apiParam {Bolean} [action_spam] If true then store matching messags to Junk Mail folder + * @apiParam {String} [action_mailbox] Mailbox ID to store matching messages to + * @apiParam {String} [action_forward] An email address where matching messages should be forwarded to + * @apiParam {String} [action_targetUrl] An URL where matching messages should be POSTed to + * + * @apiSuccess {Boolean} success Indicates successful response + * @apiSuccess {String} id ID for the created Filter + * + * @apiError error Description of the error + * + * @apiExample {curl} Example usage: + * curl -i -XPUT http://localhost:8080/users/59fc66a03e54454869460e45/filters/5a1c0ee490a34c67e266931c \ + * -H 'Content-type: application/json' \ + * -d '{ + * "action_seen": "", + * "action_flag": true + * }' + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "success": true + * } + * + * @apiErrorExample {json} Error-Response: + * HTTP/1.1 200 OK + * { + * "error": "Empty filter query" + * } + */ server.put('/users/:user/filters/:filter', (req, res, next) => { res.charSet('utf-8'); const schema = Joi.object().keys({ - user: Joi.string().hex().lowercase().length(24).required(), - filter: Joi.string().hex().lowercase().length(24).required(), + user: Joi.string() + .hex() + .lowercase() + .length(24) + .required(), + filter: Joi.string() + .hex() + .lowercase() + .length(24) + .required(), - name: Joi.string().trim().max(255).empty(''), + name: Joi.string() + .trim() + .max(255) + .empty(''), - query_from: Joi.string().trim().max(255).empty(''), - query_to: Joi.string().trim().max(255).empty(''), - query_subject: Joi.string().trim().max(255).empty(''), - query_text: Joi.string().trim().max(255).empty(''), - query_ha: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), + query_from: Joi.string() + .trim() + .max(255) + .empty(''), + query_to: Joi.string() + .trim() + .max(255) + .empty(''), + query_subject: Joi.string() + .trim() + .max(255) + .empty(''), + query_text: Joi.string() + .trim() + .max(255) + .empty(''), + query_ha: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), query_size: Joi.number().empty(''), - action_seen: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_flag: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_delete: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), - action_spam: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).empty(''), + action_seen: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_flag: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_delete: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), + action_spam: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .empty(''), - action_mailbox: Joi.string().hex().lowercase().length(24).empty(''), - action_forward: Joi.string().email().empty(''), + action_mailbox: Joi.string() + .hex() + .lowercase() + .length(24) + .empty(''), + action_forward: Joi.string() + .email() + .empty(''), action_targetUrl: Joi.string() .uri({ scheme: ['http', 'https'], @@ -537,26 +890,29 @@ module.exports = (db, server) => { } return done(); } - db.database.collection('mailboxes').findOne({ - _id: new ObjectID(result.value.action_mailbox), - user - }, (err, mailboxData) => { - if (err) { - res.json({ - error: 'MongoDB Error: ' + err.message - }); - return next(); + db.database.collection('mailboxes').findOne( + { + _id: new ObjectID(result.value.action_mailbox), + user + }, + (err, mailboxData) => { + if (err) { + res.json({ + error: 'MongoDB Error: ' + err.message + }); + return next(); + } + if (!mailboxData) { + res.json({ + error: 'This mailbox does not exist' + }); + return next(); + } + $set['action.mailbox'] = mailboxData._id; + hasAction = true; + done(); } - if (!mailboxData) { - res.json({ - error: 'This mailbox does not exist' - }); - return next(); - } - $set['action.mailbox'] = mailboxData._id; - hasAction = true; - done(); - }); + ); }; checkFilterMailbox(() => {