Lint markdown
This commit is contained in:
		
							
								
								
									
										4
									
								
								.mdl.style
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								.mdl.style
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| all | ||||
| rule 'MD026', :punctuation => '.,;:!' | ||||
| exclude_rule 'MD001' | ||||
| exclude_rule 'MD024' | ||||
							
								
								
									
										308
									
								
								DOCUMENTATION.md
									
									
									
									
									
								
							
							
						
						
									
										308
									
								
								DOCUMENTATION.md
									
									
									
									
									
								
							| @@ -1,5 +1,8 @@ | ||||
| # Getting started | ||||
| ### About Radicale | ||||
| # Documentation | ||||
|  | ||||
| ## Getting started | ||||
|  | ||||
| #### About Radicale | ||||
|  | ||||
| Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV | ||||
| (contacts) server, that: | ||||
| @@ -15,28 +18,29 @@ Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV | ||||
| * Can be extended with plugins. | ||||
| * Is GPLv3-licensed free software. | ||||
|  | ||||
| ### Installation | ||||
| #### Installation | ||||
|  | ||||
| Radicale is really easy to install and works out-of-the-box. | ||||
|  | ||||
| ```bash | ||||
| $ python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz | ||||
| $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz | ||||
| python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| ``` | ||||
|  | ||||
| When the server is launched, open http://localhost:5232/ in your browser! | ||||
| When the server is launched, open <http://localhost:5232> in your browser! | ||||
| You can login with any username and password. | ||||
|  | ||||
| Want more? Check the [tutorials](#tutorials) and the | ||||
| [documentation](#documentation). | ||||
|  | ||||
| ### What's New? | ||||
| #### What's New? | ||||
|  | ||||
| Read the | ||||
| [changelog on GitHub.](https://github.com/Kozea/Radicale/blob/master/NEWS.md) | ||||
|  | ||||
| # Tutorials | ||||
| ## Simple 5-minute setup | ||||
| ## Tutorials | ||||
|  | ||||
| ### Simple 5-minute setup | ||||
|  | ||||
| You want to try Radicale but only have 5 minutes free in your calendar? Let's | ||||
| go right now and play a bit with Radicale! | ||||
| @@ -49,7 +53,7 @@ user name and password. If Radicale fits your needs, it may be time for | ||||
|  | ||||
| Follow one of the chapters below depending on your operating system. | ||||
|  | ||||
| ### Linux / \*BSD | ||||
| #### Linux / \*BSD | ||||
|  | ||||
| First, make sure that **python** 3.5 or later (**python** ≥ 3.6 is | ||||
| recommended) and **pip** are installed. On most distributions it should be | ||||
| @@ -64,10 +68,10 @@ $ python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/mas | ||||
| $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| ``` | ||||
|  | ||||
| Victory! Open http://localhost:5232/ in your browser! | ||||
| Victory! Open <http://localhost:5232> in your browser! | ||||
| You can log in with any username and password. | ||||
|  | ||||
| ### Windows | ||||
| #### Windows | ||||
|  | ||||
| The first step is to install Python. Go to | ||||
| [python.org](https://python.org) and download the latest version of Python 3. | ||||
| @@ -82,10 +86,10 @@ C:\Users\User> python -m pip install --upgrade https://github.com/Kozea/Radicale | ||||
| C:\Users\User> python -m radicale --storage-filesystem-folder=~/radicale/collections | ||||
| ``` | ||||
|  | ||||
| Victory! Open http://localhost:5232/ in your browser! | ||||
| Victory! Open <http://localhost:5232> in your browser! | ||||
| You can log in with any username and password. | ||||
|  | ||||
| ## Basic Configuration | ||||
| ### Basic Configuration | ||||
|  | ||||
| Installation instructions can be found in the | ||||
| [simple 5-minute setup](#tutorials/simple-5-minute-setup) tutorial. | ||||
| @@ -104,7 +108,7 @@ passed via command line arguments.) | ||||
| All configuration options are described in detail in the | ||||
| [Configuration](#documentation/configuration) section. | ||||
|  | ||||
| ### Authentication | ||||
| #### Authentication | ||||
|  | ||||
| In its default configuration Radicale doesn't check user names or passwords. | ||||
| If the server is reachable over a network, you should change this. | ||||
| @@ -112,7 +116,7 @@ If the server is reachable over a network, you should change this. | ||||
| First a `users` file with all user names and passwords must be created. | ||||
| It can be stored in the same directory as the configuration file. | ||||
|  | ||||
| #### The secure way | ||||
| ##### The secure way | ||||
|  | ||||
| The `users` file can be created and managed with | ||||
| [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html): | ||||
| @@ -138,7 +142,7 @@ htpasswd_filename = /path/to/users | ||||
| htpasswd_encryption = md5 | ||||
| ``` | ||||
|  | ||||
| #### The simple but insecure way | ||||
| ##### The simple but insecure way | ||||
|  | ||||
| Create the `users` file by hand with lines containing the user name and | ||||
| password separated by `:`. Example: | ||||
| @@ -158,7 +162,7 @@ htpasswd_filename = /path/to/users | ||||
| htpasswd_encryption = plain | ||||
| ``` | ||||
|  | ||||
| ### Addresses | ||||
| #### Addresses | ||||
|  | ||||
| The default configuration binds the server to localhost. It can't be reached | ||||
| from other computers. This can be changed with the following configuration | ||||
| @@ -169,7 +173,7 @@ options (IPv4 and IPv6): | ||||
| hosts = 0.0.0.0:5232, [::]:5232 | ||||
| ``` | ||||
|  | ||||
| ### Storage | ||||
| #### Storage | ||||
|  | ||||
| Data is stored in the folder `/var/lib/radicale/collections`. The path can | ||||
| be changed with the following configuration: | ||||
| @@ -184,7 +188,7 @@ filesystem_folder = /path/to/storage | ||||
| > You can find OS dependent instructions in the | ||||
| > [Running as a service](#tutorials/running-as-a-service) section. | ||||
|  | ||||
| ### Limits | ||||
| #### Limits | ||||
|  | ||||
| Radicale enforces limits on the maximum number of parallel connections, | ||||
| the maximum file size (important for contacts with big photos) and the rate of | ||||
| @@ -204,16 +208,16 @@ timeout = 30 | ||||
| delay = 1 | ||||
| ``` | ||||
|  | ||||
| ## Running as a service | ||||
| ### Running as a service | ||||
|  | ||||
| The method to run Radicale as a service depends on your host operating system. | ||||
| Follow one of the chapters below depending on your operating system and | ||||
| requirements. | ||||
|  | ||||
| ### Linux with systemd system-wide | ||||
| #### Linux with systemd system-wide | ||||
|  | ||||
| Create the **radicale** user and group for the Radicale service. | ||||
| (Run `useradd --system --user-group --home-dir / --shell /sbin/nologin radicale` as root.) | ||||
| Create the **radicale** user and group for the Radicale service. (Run | ||||
| `useradd --system --user-group --home-dir / --shell /sbin/nologin radicale` as root.) | ||||
| The storage folder must be writable by **radicale**. (Run | ||||
| `mkdir -p /var/lib/radicale/collections && chown -R radicale:radicale /var/lib/radicale/collections` | ||||
| as root.) | ||||
| @@ -249,6 +253,7 @@ ReadWritePaths=/var/lib/radicale/collections | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
| ``` | ||||
|  | ||||
| Radicale will load the configuration file from `/etc/radicale/config`. | ||||
|  | ||||
| To enable and manage the service run: | ||||
| @@ -264,7 +269,7 @@ $ systemctl status radicale | ||||
| $ journalctl --unit radicale.service | ||||
| ``` | ||||
|  | ||||
| ### Linux with systemd as a user | ||||
| #### Linux with systemd as a user | ||||
|  | ||||
| Create the file `~/.config/systemd/user/radicale.service`: | ||||
|  | ||||
| @@ -297,7 +302,7 @@ $ systemctl --user status radicale | ||||
| $ journalctl --user --unit radicale.service | ||||
| ``` | ||||
|  | ||||
| ### Windows with "NSSM - the Non-Sucking Service Manager" | ||||
| #### Windows with "NSSM - the Non-Sucking Service Manager" | ||||
|  | ||||
| First install [NSSM](https://nssm.cc/) and start `nssm install` in a command | ||||
| prompt. Apply the following configuration: | ||||
| @@ -321,7 +326,7 @@ The service is configured to start automatically when the computer starts. | ||||
| To start the service manually open **Services** in **Computer Management** and | ||||
| start the **Radicale** service. | ||||
|  | ||||
| ## Reverse Proxy | ||||
| ### Reverse Proxy | ||||
|  | ||||
| When a reverse proxy is used, the path at which Radicale is available must | ||||
| be provided via the `X-Script-Name` header. The proxy must remove the location | ||||
| @@ -367,7 +372,7 @@ Be reminded that Radicale's default configuration enforces limits on the | ||||
| maximum number of parallel connections, the maximum file size and the rate of | ||||
| incorrect authentication attempts. Connections are terminated after a timeout. | ||||
|  | ||||
| ### Manage user accounts with the reverse proxy | ||||
| #### Manage user accounts with the reverse proxy | ||||
|  | ||||
| Set the configuration option `type` in the `auth` section to | ||||
| `http_x_remote_user`. | ||||
| @@ -427,7 +432,7 @@ RequestHeader set X-Remote-User expr=%{REMOTE_USER} | ||||
| > **Security:** Untrusted clients should not be able to access the Radicale | ||||
| > server directly. Otherwise, they can authenticate as any user. | ||||
|  | ||||
| ### Secure connection between Radicale and the reverse proxy | ||||
| #### Secure connection between Radicale and the reverse proxy | ||||
|  | ||||
| SSL certificates can be used to encrypt and authenticate the connection between | ||||
| Radicale and the reverse proxy. First you have to generate a certificate for | ||||
| @@ -437,8 +442,10 @@ information about the certificate, the values don't matter and you can keep the | ||||
| defaults. | ||||
|  | ||||
| ```bash | ||||
| $ openssl req -x509 -newkey rsa:4096 -keyout server_key.pem -out server_cert.pem -nodes -days 9999 | ||||
| $ openssl req -x509 -newkey rsa:4096 -keyout client_key.pem -out client_cert.pem -nodes -days 9999 | ||||
| openssl req -x509 -newkey rsa:4096 -keyout server_key.pem -out server_cert.pem \ | ||||
|         -nodes -days 9999 | ||||
| openssl req -x509 -newkey rsa:4096 -keyout client_key.pem -out client_cert.pem \ | ||||
|         -nodes -days 9999 | ||||
| ``` | ||||
|  | ||||
| Use the following configuration for Radicale: | ||||
| @@ -464,7 +471,7 @@ location /radicale/ { | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ## WSGI Server | ||||
| ### WSGI Server | ||||
|  | ||||
| Radicale is compatible with the WSGI specification. | ||||
|  | ||||
| @@ -486,16 +493,17 @@ env = RADICALE_CONFIG=/etc/radicale/config | ||||
| Example **Gunicorn** configuration: | ||||
|  | ||||
| ```bash | ||||
| gunicorn --bind '127.0.0.1:5232' --workers 8 --env 'RADICALE_CONFIG=/etc/radicale/config' radicale | ||||
| gunicorn --bind '127.0.0.1:5232' --env 'RADICALE_CONFIG=/etc/radicale/config' \ | ||||
|          --workers 8 radicale | ||||
| ``` | ||||
|  | ||||
| ### Manage user accounts with the WSGI server | ||||
| #### Manage user accounts with the WSGI server | ||||
|  | ||||
| Set the configuration option `type` in the `auth` section to `remote_user`. | ||||
| Radicale uses the user name provided by the WSGI server and disables | ||||
| authentication over HTTP. | ||||
|  | ||||
| ## Versioning with Git | ||||
| ### Versioning with Git | ||||
|  | ||||
| This tutorial describes how to keep track of all changes to calendars and | ||||
| address books with **git** (or any other version control system). | ||||
| @@ -504,7 +512,7 @@ The repository must be initialized by running `git init` in the file | ||||
| system folder. Internal files of Radicale can be excluded by creating the | ||||
| file `.gitignore` with the following content: | ||||
|  | ||||
| ``` | ||||
| ```gitignore | ||||
| .Radicale.cache | ||||
| .Radicale.lock | ||||
| .Radicale.tmp-* | ||||
| @@ -520,8 +528,9 @@ git add -A && (git diff --cached --quiet || git commit -m "Changes by "%(user)s) | ||||
| The command gets executed after every change to the storage and commits | ||||
| the changes into the **git** repository. | ||||
|  | ||||
| # Documentation | ||||
| ## Configuration | ||||
| ## Documentation | ||||
|  | ||||
| ### Configuration | ||||
|  | ||||
| Radicale can be configured with a configuration file or with | ||||
| command line arguments. | ||||
| @@ -552,7 +561,9 @@ Paths that start with `?` are optional. | ||||
| The same example configuration via command line arguments looks like: | ||||
|  | ||||
| ```bash | ||||
| python3 -m radicale --server-hosts 0.0.0.0:5232,[::]:5232 --auth-type htpasswd --auth-htpasswd-filename ~/.config/radicale/users --auth-htpasswd-encryption md5 | ||||
| python3 -m radicale --server-hosts 0.0.0.0:5232,[::]:5232 \ | ||||
|         --auth-type htpasswd --auth-htpasswd-filename ~/.config/radicale/users \ | ||||
|         --auth-htpasswd-encryption md5 | ||||
| ``` | ||||
|  | ||||
| Add the argument `--config ""` to stop Radicale from loading the default | ||||
| @@ -560,54 +571,54 @@ configuration files. Run `python3 -m radicale --help` for more information. | ||||
|  | ||||
| In the following, all configuration categories and options are described. | ||||
|  | ||||
| ### server | ||||
| #### server | ||||
|  | ||||
| The configuration options in this category are only relevant in standalone | ||||
| mode. All options are ignored, when Radicale runs via WSGI. | ||||
|  | ||||
| #### hosts | ||||
| ##### hosts | ||||
|  | ||||
| A comma separated list of addresses that the server will bind to. | ||||
|  | ||||
| Default: `localhost:5232` | ||||
|  | ||||
| #### max_connections | ||||
| ##### max_connections | ||||
|  | ||||
| The maximum number of parallel connections. Set to `0` to disable the limit. | ||||
|  | ||||
| Default: `8` | ||||
|  | ||||
| #### max_content_length | ||||
| ##### max_content_length | ||||
|  | ||||
| The maximum size of the request body. (bytes) | ||||
|  | ||||
| Default: `100000000` | ||||
|  | ||||
| #### timeout | ||||
| ##### timeout | ||||
|  | ||||
| Socket timeout. (seconds) | ||||
|  | ||||
| Default: `30` | ||||
|  | ||||
| #### ssl | ||||
| ##### ssl | ||||
|  | ||||
| Enable transport layer encryption. | ||||
|  | ||||
| Default: `False` | ||||
|  | ||||
| #### certificate | ||||
| ##### certificate | ||||
|  | ||||
| Path of the SSL certifcate. | ||||
|  | ||||
| Default: `/etc/ssl/radicale.cert.pem` | ||||
|  | ||||
| #### key | ||||
| ##### key | ||||
|  | ||||
| Path to the private key for SSL. Only effective if `ssl` is enabled. | ||||
|  | ||||
| Default: `/etc/ssl/radicale.key.pem` | ||||
|  | ||||
| #### certificate_authority | ||||
| ##### certificate_authority | ||||
|  | ||||
| Path to the CA certificate for validating client certificates. This can be used | ||||
| to secure TCP traffic between Radicale and a reverse proxy. If you want to | ||||
| @@ -616,21 +627,23 @@ authentication plugin that extracts the user name from the certificate. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| ### encoding | ||||
| #### request | ||||
| #### encoding | ||||
|  | ||||
| ##### request | ||||
|  | ||||
| Encoding for responding requests. | ||||
|  | ||||
| Default: `utf-8` | ||||
|  | ||||
| #### stock | ||||
| ##### stock | ||||
|  | ||||
| Encoding for storing local collections | ||||
|  | ||||
| Default: `utf-8` | ||||
|  | ||||
| ### auth | ||||
| #### type | ||||
| #### auth | ||||
|  | ||||
| ##### type | ||||
|  | ||||
| The method to verify usernames and passwords. | ||||
|  | ||||
| @@ -656,13 +669,13 @@ Available backends: | ||||
|  | ||||
| Default: `none` | ||||
|  | ||||
| #### htpasswd_filename | ||||
| ##### htpasswd_filename | ||||
|  | ||||
| Path to the htpasswd file. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| #### htpasswd_encryption | ||||
| ##### htpasswd_encryption | ||||
|  | ||||
| The encryption method that is used in the htpasswd file. Use the | ||||
| [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html) | ||||
| @@ -673,6 +686,7 @@ Available methods: | ||||
| `plain` | ||||
| : Passwords are stored in plaintext. This is obviously not secure! | ||||
|   The htpasswd file for this can be created by hand and looks like: | ||||
|  | ||||
|   ```htpasswd | ||||
|   user1:password1 | ||||
|   user2:password2 | ||||
| @@ -687,20 +701,21 @@ Available methods: | ||||
|  | ||||
| Default: `md5` | ||||
|  | ||||
| #### delay | ||||
| ##### delay | ||||
|  | ||||
| Average delay after failed login attempts in seconds. | ||||
|  | ||||
| Default: `1` | ||||
|  | ||||
| #### realm | ||||
| ##### realm | ||||
|  | ||||
| Message displayed in the client when a password is needed. | ||||
|  | ||||
| Default: `Radicale - Password Required` | ||||
|  | ||||
| ### rights | ||||
| #### type | ||||
| #### rights | ||||
|  | ||||
| ##### type | ||||
|  | ||||
| The backend that is used to check the access rights of collections. | ||||
|  | ||||
| @@ -728,13 +743,14 @@ Available backends: | ||||
|  | ||||
| Default: `owner_only` | ||||
|  | ||||
| #### file | ||||
| ##### file | ||||
|  | ||||
| File for the rights backend `from_file`.  See the | ||||
| [Rights](#documentation/authentication-and-rights) section. | ||||
|  | ||||
| ### storage | ||||
| #### type | ||||
| #### storage | ||||
|  | ||||
| ##### type | ||||
|  | ||||
| The backend that is used to store data. | ||||
|  | ||||
| @@ -744,31 +760,33 @@ Available backends: | ||||
| : Stores the data in the filesystem. | ||||
|  | ||||
| `multifilesystem_nolock` | ||||
| : The `multifilesystem` backend without file-based locking. Must only be used with a single process. | ||||
| : The `multifilesystem` backend without file-based locking. | ||||
|   Must only be used with a single process. | ||||
|  | ||||
| Default: `multifilesystem` | ||||
|  | ||||
| #### filesystem_folder | ||||
| ##### filesystem_folder | ||||
|  | ||||
| Folder for storing local collections, created if not present. | ||||
|  | ||||
| Default: `/var/lib/radicale/collections` | ||||
|  | ||||
| #### max_sync_token_age | ||||
| ##### max_sync_token_age | ||||
|  | ||||
| Delete sync-token that are older than the specified time. (seconds) | ||||
|  | ||||
| Default: `2592000` | ||||
|  | ||||
| #### hook | ||||
| ##### hook | ||||
|  | ||||
| Command that is run after changes to storage. Take a look at the | ||||
| [Versioning with Git](#tutorials/versioning-with-git) tutorial for an example. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| ### web | ||||
| #### type | ||||
| #### web | ||||
|  | ||||
| ##### type | ||||
|  | ||||
| The backend that provides the web interface of Radicale. | ||||
|  | ||||
| @@ -782,8 +800,9 @@ Available backends: | ||||
|  | ||||
| Default: `internal` | ||||
|  | ||||
| ### logging | ||||
| #### level | ||||
| #### logging | ||||
|  | ||||
| ##### level | ||||
|  | ||||
| Set the logging level. | ||||
|  | ||||
| @@ -791,13 +810,13 @@ Available levels: **debug**, **info**, **warning**, **error**, **critical** | ||||
|  | ||||
| Default: `warning` | ||||
|  | ||||
| #### mask_passwords | ||||
| ##### mask_passwords | ||||
|  | ||||
| Don't include passwords in logs. | ||||
|  | ||||
| Default: `True` | ||||
|  | ||||
| ### headers | ||||
| #### headers | ||||
|  | ||||
| In this section additional HTTP headers that are sent to clients can be | ||||
| specified. | ||||
| @@ -808,7 +827,7 @@ An example to relax the same-origin policy: | ||||
| Access-Control-Allow-Origin = * | ||||
| ``` | ||||
|  | ||||
| ## Supported Clients | ||||
| ### Supported Clients | ||||
|  | ||||
| Radicale has been tested with: | ||||
|  | ||||
| @@ -826,20 +845,20 @@ Radicale has been tested with: | ||||
|  | ||||
| Many clients do not support the creation of new calendars and address books. | ||||
| You can use Radicale's web interface | ||||
| (e.g. http://localhost:5232) to create and manage address books and calendars. | ||||
| (e.g. <http://localhost:5232>) to create and manage address books and calendars. | ||||
|  | ||||
| In some clients you can just enter the URL of the Radicale server | ||||
| (e.g. `http://localhost:5232`) and your user name. In others, you have to | ||||
| enter the URL of the collection directly | ||||
| (e.g. `http://localhost:5232/user/calendar`). | ||||
|  | ||||
| ### DAVx⁵ | ||||
| #### DAVx⁵ | ||||
|  | ||||
| Enter the URL of the Radicale server (e.g. `http://localhost:5232`) and your | ||||
| user name. DAVx⁵ will show all existing calendars and address books and you | ||||
| can create new. | ||||
|  | ||||
| ### GNOME Calendar, Contacts and Evolution | ||||
| #### GNOME Calendar, Contacts and Evolution | ||||
|  | ||||
| **GNOME Calendar** and **Contacts** do not support adding WebDAV calendars | ||||
| and address books directly, but you can add them in **Evolution**. | ||||
| @@ -849,14 +868,15 @@ Enter the URL of the Radicale server (e.g. `http://localhost:5232`) and your | ||||
| user name. Clicking on the search button will list the existing calendars and | ||||
| address books. | ||||
|  | ||||
| ### Thunderbird | ||||
| #### CardBook | ||||
| #### Thunderbird | ||||
|  | ||||
| ##### CardBook | ||||
|  | ||||
| Add a new address book on the network with CardDAV. You have to enter the full | ||||
| URL of the collection (e.g. `http://localhost:5232/user/addressbook`) and | ||||
| your user name. | ||||
|  | ||||
| #### Lightning | ||||
| ##### Lightning | ||||
|  | ||||
| Add a new calendar on the network with `CalDAV`. (Don't use `iCalendar (ICS)`!) | ||||
| You have to enter the full URL of the collection (e.g. | ||||
| @@ -864,7 +884,7 @@ You have to enter the full URL of the collection (e.g. | ||||
| different users on the same server, you can specify the user name in the URL | ||||
| (e.g. `http://user@localhost...`) | ||||
|  | ||||
| ### InfCloud, CalDavZAP and CardDavMATE | ||||
| #### InfCloud, CalDavZAP and CardDavMATE | ||||
|  | ||||
| You can integrate InfCloud into Radicale's web interface with | ||||
| [RadicaleInfCloud](https://github.com/Unrud/RadicaleInfCloud). No additional | ||||
| @@ -877,7 +897,7 @@ the Radicale server, because of the | ||||
| You have to add additional HTTP header in the `headers` section of Radicale's | ||||
| configuration. The documentation of **InfCloud** has more details on this. | ||||
|  | ||||
| ### Command line | ||||
| #### Command line | ||||
|  | ||||
| This is not the recommended way of creating and managing your calendars and | ||||
| address books. Use Radicale's web interface or a client with support for it | ||||
| @@ -935,10 +955,10 @@ children of the path `/USERNAME/`. | ||||
| Delete the collections by running something like: | ||||
|  | ||||
| ```bash | ||||
| $ curl -u user -X DELETE 'http://localhost:5232/user/calendar' | ||||
| curl -u user -X DELETE 'http://localhost:5232/user/calendar' | ||||
| ``` | ||||
|  | ||||
| ## Authentication and Rights | ||||
| ### Authentication and Rights | ||||
|  | ||||
| This section describes the format of the rights file for the `from_file` | ||||
| authentication backend. The configuration option `file` in the `rights` | ||||
| @@ -1000,7 +1020,7 @@ The following `permissions` are recognized: | ||||
| * **W:** write collections (excluding address books and calendars) | ||||
| * **w:** write address book and calendar collections | ||||
|  | ||||
| ## Storage | ||||
| ### Storage | ||||
|  | ||||
| This document describes the layout and format of the file system storage | ||||
| (`multifilesystem` backend). | ||||
| @@ -1011,7 +1031,7 @@ Scripts can be invoked manually, periodically (e.g. with | ||||
| change to the storage with the configuration option `hook` in the `storage` | ||||
| section (e.g. [Versioning with Git](#tutorials/versioning-with-git)). | ||||
|  | ||||
| ### Layout | ||||
| #### Layout | ||||
|  | ||||
| The file system contains the following files and folders: | ||||
|  | ||||
| @@ -1045,14 +1065,14 @@ They should be deleted after requests are finished but it's possible that | ||||
| they are left behind when Radicale or the computer crashes. | ||||
| It's safe to delete them. | ||||
|  | ||||
| ### Locking | ||||
| #### Locking | ||||
|  | ||||
| When the data is accessed by hand or by an externally invoked script, | ||||
| the storage must be locked. The storage can be locked for exclusive or | ||||
| shared access. It prevents Radicale from reading or writing the file system. | ||||
| The storage is locked with exclusive access while the `hook` runs. | ||||
|  | ||||
| #### Linux shell scripts | ||||
| ##### Linux shell scripts | ||||
|  | ||||
| Use the | ||||
| [flock](https://manpages.debian.org/unstable/util-linux/flock.1.en.html) | ||||
| @@ -1065,14 +1085,14 @@ $ flock --exclusive /path/to/storage/.Radicale.lock COMMAND | ||||
| $ flock --shared /path/to/storage/.Radicale.lock COMMAND | ||||
| ``` | ||||
|  | ||||
| #### Linux and MacOS | ||||
| ##### Linux and MacOS | ||||
|  | ||||
| Use the | ||||
| [flock](https://manpages.debian.org/unstable/manpages-dev/flock.2.en.html) | ||||
| syscall. Python provides it in the | ||||
| [fcntl](https://docs.python.org/3/library/fcntl.html#fcntl.flock) module. | ||||
|  | ||||
| #### Windows | ||||
| ##### Windows | ||||
|  | ||||
| Use | ||||
| [LockFile](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202%28v=vs.85%29.aspx) | ||||
| @@ -1081,7 +1101,7 @@ for exclusive access or | ||||
| which also supports shared access. Setting `nNumberOfBytesToLockLow` to `1` | ||||
| and `nNumberOfBytesToLockHigh` to `0` works. | ||||
|  | ||||
| ### Manually creating collections | ||||
| #### Manually creating collections | ||||
|  | ||||
| To create a new collection, you have to create the corresponding folder in the | ||||
| file system storage (e.g. `collection-root/user/calendar`). | ||||
| @@ -1105,58 +1125,31 @@ address books that are direct children of the path `/USERNAME/`. | ||||
|  | ||||
| Delete collections by deleting the corresponding folders. | ||||
|  | ||||
| ## Logging | ||||
| ### Logging | ||||
|  | ||||
| Radicale logs to `stderr`. The verbosity of the log output can be controlled | ||||
| with `--debug` command line argument or the `level` configuration option in | ||||
| the `logging` section. | ||||
|  | ||||
| ## Architecture | ||||
| ### Architecture | ||||
|  | ||||
| Radicale is a small piece of software, but understanding it is not as | ||||
| easy as it seems. But don't worry, reading this short section is enough to | ||||
| understand what a CalDAV/CardDAV server is, and how Radicale's code is | ||||
| organized. | ||||
|  | ||||
| ### Protocol overview | ||||
| #### Protocol overview | ||||
|  | ||||
| Here is a simple overview of the global architecture for reaching a calendar or | ||||
| an address book through network: | ||||
|  | ||||
| <table> | ||||
|   <thead> | ||||
|     <tr> | ||||
|       <th>Part</th> | ||||
|       <th>Layer</th> | ||||
|       <th>Protocol or Format</th> | ||||
|     </tr> | ||||
|   </thead> | ||||
|   <tbody> | ||||
|     <tr> | ||||
|       <td rowspan="2">Server</td> | ||||
|       <td>Calendar/Contact Storage</td> | ||||
|       <td>iCal/vCard</td> | ||||
|     </tr> | ||||
|     <tr> | ||||
|       <td>Calendar/Contact Server</td> | ||||
|       <td>CalDAV/CardDAV Server</td> | ||||
|     </tr> | ||||
|     <tr> | ||||
|       <td>Transfer</td> | ||||
|       <td>Network</td> | ||||
|       <td>CalDAV/CardDAV (HTTP + TLS)</td> | ||||
|     </tr> | ||||
|     <tr> | ||||
|       <td rowspan="2">Client</td> | ||||
|       <td>Calendar/Contact Client</td> | ||||
|       <td>CalDAV/CardDAV Client</td> | ||||
|     </tr> | ||||
|     <tr> | ||||
|       <td>GUI</td> | ||||
|       <td>Terminal, GTK, Web interface, etc.</td> | ||||
|     </tr> | ||||
|   </tbody> | ||||
| </table> | ||||
| | Part     | Layer                    | Protocol or Format                 | | ||||
| |----------|--------------------------|------------------------------------| | ||||
| | Server   | Calendar/Contact Storage | iCal/vCard                         | | ||||
| | ''       | Calendar/Contact Server  | CalDAV/CardDAV Server              | | ||||
| | Transfer | Network                  | CalDAV/CardDAV (HTTP + TLS)        | | ||||
| | Client   | Calendar/Contact Client  | CalDAV/CardDAV Client              | | ||||
| | ''       | GUI                      | Terminal, GTK, Web interface, etc. | | ||||
|  | ||||
| Radicale is **only the server part** of this architecture. | ||||
|  | ||||
| @@ -1177,7 +1170,7 @@ If you want to see or edit your events and your contacts, you have to use | ||||
| another software called a client, that can be a "normal" applications with | ||||
| icons and buttons, a terminal or another web application. | ||||
|  | ||||
| ### Code Architecture | ||||
| #### Code Architecture | ||||
|  | ||||
| The ``radicale`` package offers the following modules. | ||||
|  | ||||
| @@ -1236,12 +1229,12 @@ The ``radicale`` package offers the following modules. | ||||
| : Helper functions for working with the XML part of CalDAV/CardDAV requests | ||||
|   and responses. It's based on the ElementTree XML API. | ||||
|  | ||||
| ## Plugins | ||||
| ### Plugins | ||||
|  | ||||
| Radicale can be extended by plugins for authentication, rights management and | ||||
| storage. Plugins are **python** modules. | ||||
|  | ||||
| ### Getting started | ||||
| #### Getting started | ||||
|  | ||||
| To get started we walk through the creation of a simple authentication | ||||
| plugin, that accepts login attempts with a static password. | ||||
| @@ -1311,82 +1304,86 @@ You can uninstall the module with: | ||||
| python3 -m pip uninstall radicale_static_password_auth | ||||
| ``` | ||||
|  | ||||
| ### Authentication plugins | ||||
| #### Authentication plugins | ||||
|  | ||||
| This plugin type is used to check login credentials. | ||||
| The module must contain a class `Auth` that extends | ||||
| `radicale.auth.BaseAuth`. Take a look at the file `radicale/auth/__init__.py` | ||||
| in Radicale's source code for more information. | ||||
|  | ||||
| ### Rights management plugins | ||||
| #### Rights management plugins | ||||
|  | ||||
| This plugin type is used to check if a user has access to a path. | ||||
| The module must contain a class `Rights` that extends | ||||
| `radicale.rights.BaseRights`. Take a look at the file | ||||
| `radicale/rights/__init__.py` in Radicale's source code for more information. | ||||
|  | ||||
| ### Web plugins | ||||
| #### Web plugins | ||||
|  | ||||
| This plugin type is used to provide the web interface for Radicale. | ||||
| The module must contain a class `Web` that extends | ||||
| `radicale.web.BaseWeb`. Take a look at the file `radicale/web/__init__.py` in | ||||
| Radicale's source code for more information. | ||||
|  | ||||
| ### Storage plugins | ||||
| #### Storage plugins | ||||
|  | ||||
| This plugin is used to store collections and items. | ||||
| The module must contain a class `Storage` that extends | ||||
| `radicale.storage.BaseStorage`. Take a look at the file | ||||
| `radicale/storage/__init__.py` in Radicale's source code for more information. | ||||
|  | ||||
| # Contribute | ||||
| ## Contribute | ||||
|  | ||||
| ### Chat with Us on IRC | ||||
| #### Chat with Us on IRC | ||||
|  | ||||
| Want to say something? Join our IRC room: `##kozea` on Freenode. | ||||
|  | ||||
| ### Report Bugs | ||||
| #### Report Bugs | ||||
|  | ||||
| Found a bug? Want a new feature? Report a new issue on the | ||||
| [Radicale bug-tracker](https://github.com/Kozea/Radicale/issues). | ||||
|  | ||||
| ### Hack | ||||
| #### Hack | ||||
|  | ||||
| Interested in hacking? Feel free to clone the | ||||
| [git repository on GitHub](https://github.com/Kozea/Radicale) if you want to | ||||
| add new features, fix bugs or update the documentation. | ||||
|  | ||||
| ### Documentation | ||||
| #### Documentation | ||||
|  | ||||
| To change or complement the documentation create a pull request to | ||||
| [DOCUMENTATION.md](https://github.com/Kozea/Radicale/blob/master/DOCUMENTATION.md). | ||||
|  | ||||
| # Download | ||||
| ## Download | ||||
|  | ||||
| ### PyPI | ||||
| #### PyPI | ||||
|  | ||||
| Radicale is [available on PyPI](https://pypi.python.org/pypi/Radicale/). To | ||||
| install, just type as superuser: | ||||
|  | ||||
|     $ python3 -m pip install --upgrade radicale | ||||
| ```bash | ||||
| python3 -m pip install --upgrade radicale | ||||
| ``` | ||||
|  | ||||
| ### Git Repository | ||||
| #### Git Repository | ||||
|  | ||||
| If you want the development version of Radicale, take a look at the | ||||
| [git repository on GitHub](https://github.com/Kozea/Radicale/), or install it | ||||
| directly with: | ||||
|  | ||||
|     $ python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz | ||||
| ```bash | ||||
| python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz | ||||
| ``` | ||||
|  | ||||
| You can also download the content of the repository as an | ||||
| [archive](https://github.com/Kozea/Radicale/tarball/master). | ||||
|  | ||||
| ### Source Packages | ||||
| #### Source Packages | ||||
|  | ||||
| You can find the source packages of all releases on | ||||
| [GitHub](https://github.com/Kozea/Radicale/releases). | ||||
|  | ||||
| ### Linux Distribution Packages | ||||
| #### Linux Distribution Packages | ||||
|  | ||||
| Radicale has been packaged for: | ||||
|  | ||||
| @@ -1395,7 +1392,8 @@ Radicale has been packaged for: | ||||
| * [Debian](http://packages.debian.org/radicale) by Jonas Smedegaard | ||||
| * [Gentoo](https://packages.gentoo.org/packages/www-apps/radicale) | ||||
|   by René Neumann, Maxim Koltsov and Manuel Rüger | ||||
|   * [Fedora/RHEL/CentOS](https://src.fedoraproject.org/rpms/radicale) by Jorti and Peter Bieringer | ||||
| * [Fedora/RHEL/CentOS](https://src.fedoraproject.org/rpms/radicale) by Jorti | ||||
|   and Peter Bieringer | ||||
| * [Mageia](http://madb.mageia.org/package/show/application/0/name/radicale) | ||||
|   by Jani Välimaa | ||||
| * [OpenBSD](http://openports.se/productivity/radicale) by Sergey Bronnikov, | ||||
| @@ -1416,9 +1414,9 @@ and has a Dockerfile. | ||||
| If you are interested in creating packages for other Linux distributions, read | ||||
| the ["Contribute" section](#contribute). | ||||
|  | ||||
| # About | ||||
| ## About | ||||
|  | ||||
| ### Main Goals | ||||
| #### Main Goals | ||||
|  | ||||
| Radicale is a complete calendar and contact storing and manipulating | ||||
| solution. It can store multiple calendars and multiple address books. | ||||
| @@ -1433,7 +1431,7 @@ preconfigured to work out-of-the-box. | ||||
| Radicale is written in Python. It runs on most of the UNIX-like platforms | ||||
| (Linux, \*BSD, macOS) and Windows. It is free and open-source software. | ||||
|  | ||||
| ### What Radicale Will Never Be | ||||
| #### What Radicale Will Never Be | ||||
|  | ||||
| Radicale is a server, not a client. No interfaces will be created to work with | ||||
| the server. | ||||
| @@ -1446,14 +1444,14 @@ CalDAV and CardDAV are the best open standards available, and they are quite | ||||
| widely used by both clients and servers. We decided to use it, and we will not | ||||
| use another one. | ||||
|  | ||||
| ### Technical Choices | ||||
| #### Technical Choices | ||||
|  | ||||
| Important global development choices have been decided before writing | ||||
| code. They are very useful to understand why the Radicale Project is different | ||||
| from other CalDAV and CardDAV servers, and why features are included or not in | ||||
| the code. | ||||
|  | ||||
| #### Oriented to Calendar and Contact User Agents | ||||
| ##### Oriented to Calendar and Contact User Agents | ||||
|  | ||||
| Calendar and contact servers work with calendar and contact clients, using a | ||||
| defined protocol. CalDAV and CardDAV are good protocols, covering lots of | ||||
| @@ -1471,7 +1469,7 @@ Even if it tries it best to follow the RFCs, Radicale does not and **will not** | ||||
| blindly implement the CalDAV and CardDAV standards. It is mainly designed to | ||||
| support the CalDAV and CardDAV implementations of different clients. | ||||
|  | ||||
| #### Simple | ||||
| ##### Simple | ||||
|  | ||||
| Radicale is designed to be simple to install, simple to configure, simple to | ||||
| use. | ||||
| @@ -1486,7 +1484,7 @@ or need a strong configuration, the Radicale Server can (sometimes, if not | ||||
| often) be launched in a couple of minutes, if you follow the | ||||
| [tutorial](#tutorials/simple-5-minute-setup). | ||||
|  | ||||
| #### Lazy | ||||
| ##### Lazy | ||||
|  | ||||
| The CalDAV RFC defines what must be done, what can be done and what cannot be | ||||
| done. Many violations of the protocol are totally defined and behaviors are | ||||
| @@ -1497,7 +1495,7 @@ violations do not exist. That is why most of the errors in client requests have | ||||
| undetermined consequences for the lazy server that can reply good answers, bad | ||||
| answers, or even no answer. | ||||
|  | ||||
| ### History | ||||
| #### History | ||||
|  | ||||
| Radicale has been started as a (free topic) stupid school project replacing | ||||
| another (assigned topic) even more stupid school project. | ||||
|   | ||||
							
								
								
									
										129
									
								
								NEWS.md
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								NEWS.md
									
									
									
									
									
								
							| @@ -11,7 +11,8 @@ | ||||
| * Start storage hook in own process group | ||||
| * Kill storage hook on error or exit | ||||
| * Try to kill child processes of storage hook | ||||
|   * Internal Server: Exit immediately when signal is received (do not wait for clients or storage hook to finish) | ||||
| * Internal Server: Exit immediately when signal is received | ||||
|   (do not wait for clients or storage hook to finish) | ||||
|  | ||||
| ## 3.0.4 | ||||
|  | ||||
| @@ -47,9 +48,9 @@ See the upgrade checklist below. | ||||
|   * Major refactor | ||||
|   * Never sanitize paths multiple times (check if they are sanitized) | ||||
| * Config | ||||
|       * Multiple configuration files separated by ``:`` (resp. ``;`` | ||||
|   * Multiple configuration files separated by `:` (resp. `;` | ||||
|     on Windows) | ||||
|       * Optional configuration files by prepending file path with ``?`` | ||||
|   * Optional configuration files by prepending file path with `?` | ||||
|   * Check validity of every configuration file and command line | ||||
|     arguments separately | ||||
|     * Report the source of invalid configuration parameters in | ||||
| @@ -58,29 +59,29 @@ See the upgrade checklist below. | ||||
|     * Store configuration as parsed values | ||||
|     * Use Schema that describes configuration and allow plugins to apply | ||||
|       their own schemas | ||||
|           * Mark internal settings with ``_`` | ||||
|     * Mark internal settings with `_` | ||||
| * Internal server | ||||
|   * Bind to IPv4 and IPv6 address, when both are available for hostname | ||||
|       * Set default address to ``localhost:5232`` | ||||
|   * Set default address to `localhost:5232` | ||||
|   * Remove settings for SSL ciphers and protocol versions (enforce safe | ||||
|     defaults instead) | ||||
|   * Remove settings for file locking because they are of little use | ||||
|   * Remove daemonization (should be handled by service managers) | ||||
| * Logging | ||||
|   * Replace complex Python logger configuration with simple | ||||
|         ``logging.level`` setting | ||||
|       * Write PID and ``threadName`` instead of cryptic id's in log messages | ||||
|       * Use ``wsgi.errors`` for logging (as required by the WSGI spec) | ||||
|     `logging.level` setting | ||||
|   * Write PID and `threadName` instead of cryptic id's in log messages | ||||
|   * Use `wsgi.errors` for logging (as required by the WSGI spec) | ||||
|   * Code cleanup: | ||||
|           * Don't pass logger object around (use ``logging.getLogger()`` | ||||
|     * Don't pass logger object around (use `logging.getLogger()` | ||||
|       instead) | ||||
| * Auth | ||||
|       * Use ``md5`` as default for ``htpasswd_encryption`` setting | ||||
|       * Move setting ``realm`` from section ``server`` to ``auth`` | ||||
|   * Use `md5` as default for `htpasswd_encryption` setting | ||||
|   * Move setting `realm` from section `server` to `auth` | ||||
| * Rights | ||||
|       * Use permissions ``RW`` for non-leaf collections and ``rw`` for | ||||
|   * Use permissions `RW` for non-leaf collections and `rw` for | ||||
|     address books/calendars | ||||
|       * New permission ``i`` that only allows access with HTTP method GET | ||||
|   * New permission `i` that only allows access with HTTP method GET | ||||
|     (CalDAV/CardDAV is susceptible to expensive search requests) | ||||
| * Web | ||||
|   * Add upload dialog for calendars/address books from file | ||||
| @@ -97,30 +98,30 @@ See the upgrade checklist below. | ||||
|  | ||||
| * Config | ||||
|   * Some settings were removed | ||||
|       * The default of ``auth.htpasswd_encryption`` changed to ``md5`` | ||||
|       * The setting ``server.realm`` moved to ``auth.realm`` | ||||
|       * The setting ``logging.debug`` was replaced by ``logging.level`` | ||||
|       * The format of the ``rights.file`` configuration file changed: | ||||
|           * Permission ``r`` replaced by ``Rr`` | ||||
|           * Permission ``w`` replaced by ``Ww`` | ||||
|           * New permission ``i`` added as subset of ``r`` | ||||
|           * Replaced variable ``%(login)s`` by ``{user}`` | ||||
|           * Removed variable ``%(path)s`` | ||||
|           * ``{`` must be escaped as ``{{`` and ``}`` as ``}}`` in regexes | ||||
|   * The default of `auth.htpasswd_encryption` changed to `md5` | ||||
|   * The setting `server.realm` moved to `auth.realm` | ||||
|   * The setting `logging.debug` was replaced by `logging.level` | ||||
|   * The format of the `rights.file` configuration file changed: | ||||
|     * Permission `r` replaced by `Rr` | ||||
|     * Permission `w` replaced by `Ww` | ||||
|     * New permission `i` added as subset of `r` | ||||
|     * Replaced variable `%(login)s` by `{user}` | ||||
|     * Removed variable `%(path)s` | ||||
|     * `{` must be escaped as `{{` and `}` as `}}` in regexes | ||||
| * File system storage | ||||
|   * The storage format is compatible with Radicale 2.x.x | ||||
|       * Run ``radicale --verify-storage`` to check for errors | ||||
|   * Run `radicale --verify-storage` to check for errors | ||||
| * Custom plugins: | ||||
|       * ``auth`` and ``web`` plugins require minor adjustments | ||||
|       * ``rights`` plugins must be adapted to the new permission model | ||||
|       * ``storage`` plugins require major changes | ||||
|   * `auth` and `web` plugins require minor adjustments | ||||
|   * `rights` plugins must be adapted to the new permission model | ||||
|   * `storage` plugins require major changes | ||||
|  | ||||
| ## 2.1.10 - Wild Radish | ||||
|  | ||||
| This release is compatible with version 2.0.0. | ||||
|  | ||||
| * Update required versions for dependencies | ||||
|   * Get ``RADICALE_CONFIG`` from WSGI environ | ||||
| * Get `RADICALE_CONFIG` from WSGI environ | ||||
| * Improve HTTP status codes | ||||
| * Fix race condition in storage lock creation | ||||
| * Raise default limits for content length and timeout | ||||
| @@ -132,9 +133,9 @@ This release is compatible with version 2.0.0. | ||||
|  | ||||
| * Specify versions for dependencies | ||||
| * Move WSGI initialization into module | ||||
|   * Check if ``REPORT`` method is actually supported | ||||
|   * Include ``rights`` file in source distribution | ||||
|   * Specify ``md5`` and ``bcrypt`` as extras | ||||
| * Check if `REPORT` method is actually supported | ||||
| * Include `rights` file in source distribution | ||||
| * Specify `md5` and `bcrypt` as extras | ||||
| * Improve logging messages | ||||
| * Windows: Fix crash when item path is a directory | ||||
|  | ||||
| @@ -149,22 +150,21 @@ This release is compatible with version 2.0.0. | ||||
| This release is compatible with version 2.0.0. | ||||
|  | ||||
| * Don't print warning when cache format changes | ||||
|   * Add documentation for ``BaseAuth`` | ||||
|   * Add ``is_authenticated2(login, user, password)`` to ``BaseAuth`` | ||||
| * Add documentation for `BaseAuth` | ||||
| * Add `is_authenticated2(login, user, password)` to `BaseAuth` | ||||
| * Fix names of custom properties in PROPFIND requests with | ||||
|     ``D:propname`` or ``D:allprop`` | ||||
|   * Return all properties in PROPFIND requests with ``D:propname`` or | ||||
|     ``D:allprop`` | ||||
|   * Allow ``D:displayname`` property on all collections | ||||
|   * Answer with ``D:unauthenticated`` for ``D:current-user-principal`` property | ||||
|   `D:propname` or `D:allprop` | ||||
| * Return all properties in PROPFIND requests with `D:propname` or | ||||
|   `D:allprop` | ||||
| * Allow `D:displayname` property on all collections | ||||
| * Answer with `D:unauthenticated` for `D:current-user-principal` property | ||||
|   when not logged in | ||||
|   * Remove non-existing ``ICAL:calendar-color`` and ``C:calendar-timezone`` | ||||
|     properties from PROPFIND requests with ``D:propname`` or ``D:allprop`` | ||||
|   * Add ``D:owner`` property to calendar and address book objects | ||||
|   * Remove ``D:getetag`` and ``D:getlastmodified`` properties from regular | ||||
| * Remove non-existing `ICAL:calendar-color` and `C:calendar-timezone` | ||||
|   properties from PROPFIND requests with `D:propname` or `D:allprop` | ||||
| * Add `D:owner` property to calendar and address book objects | ||||
| * Remove `D:getetag` and `D:getlastmodified` properties from regular | ||||
|   collections | ||||
|  | ||||
|  | ||||
| ## 2.1.6 - Wild Radish | ||||
|  | ||||
| This release is compatible with version 2.0.0. | ||||
| @@ -182,7 +182,7 @@ This release is compatible with version 2.0.0. | ||||
|  | ||||
| This release is compatible with version 2.0.0. | ||||
|  | ||||
|   * Add ``--verify-storage`` command-line argument | ||||
| * Add `--verify-storage` command-line argument | ||||
| * Allow comments in the htpasswd file | ||||
| * Don't strip whitespaces from user names and passwords in the htpasswd file | ||||
| * Remove cookies from logging output | ||||
| @@ -249,20 +249,19 @@ This release is compatible with version 2.0.0. | ||||
| * Support for client-side SSL certificates | ||||
| * Rights plugins can decide if access to an item is granted explicitly | ||||
|   * Respond with 403 instead of 404 for principal collections of non-existing | ||||
|         users when ``owner_only`` plugin is used (information leakage) | ||||
|     users when `owner_only` plugin is used (information leakage) | ||||
| * Authentication plugins can provide the login and password from the | ||||
|   environment | ||||
|       * new ``remote_user`` plugin, that gets the login from the ``REMOTE_USER`` | ||||
|   * new `remote_user` plugin, that gets the login from the `REMOTE_USER` | ||||
|     environment variable (for WSGI server) | ||||
|       * new ``http_x_remote_user`` plugin, that gets the login from the | ||||
|         ``X-Remote-User`` HTTP header (for reverse proxies) | ||||
|  | ||||
|   * new `http_x_remote_user` plugin, that gets the login from the | ||||
|     `X-Remote-User` HTTP header (for reverse proxies) | ||||
|  | ||||
| ## 2.0.0 - Little Big Radish | ||||
|  | ||||
| This feature is not compatible with the 1.x.x versions. Follow our | ||||
| [migration guide](https://radicale.org/2.1.html#documentation/migration-from-1xx-to-2xx) if you want to switch from 1.x.x to | ||||
| 2.0.0. | ||||
| [migration guide](https://radicale.org/2.1.html#documentation/migration-from-1xx-to-2xx) | ||||
| if you want to switch from 1.x.x to 2.0.0. | ||||
|  | ||||
| * Support Python 3.3+ only, Python 2 is not supported anymore | ||||
| * Keep only one simple filesystem-based storage system | ||||
| @@ -282,16 +281,13 @@ This feature is not compatible with the 1.x.x versions. Follow our | ||||
| * Allow External plugins for authentication, rights management, storage and | ||||
|   version control | ||||
|  | ||||
|  | ||||
| ## 1.1.4 - Fifth Law of Nature | ||||
|  | ||||
|   * Use ``shutil.move`` for ``--export-storage`` | ||||
|  | ||||
| * Use `shutil.move` for `--export-storage` | ||||
|  | ||||
| ## 1.1.3 - Fourth Law of Nature | ||||
|  | ||||
|   * Add a ``--export-storage=FOLDER`` command-line argument (by Unrud, see #606) | ||||
|  | ||||
| * Add a `--export-storage=FOLDER` command-line argument (by Unrud, see #606) | ||||
|  | ||||
| ## 1.1.2 - Third Law of Nature | ||||
|  | ||||
| @@ -299,12 +295,10 @@ This feature is not compatible with the 1.x.x versions. Follow our | ||||
|   bruteforce attacks when using the htpasswd authentication method. | ||||
| * Various minor fixes. | ||||
|  | ||||
|  | ||||
| ## 1.1.1 - Second Law of Nature | ||||
|  | ||||
| * Fix the owner_write rights rule | ||||
|  | ||||
|  | ||||
| ## 1.1 - Law of Nature | ||||
|  | ||||
| One feature in this release is **not backward compatible**: | ||||
| @@ -333,12 +327,10 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Encode message and commiter for git commits | ||||
| * Test with Python 3.5 | ||||
|  | ||||
|  | ||||
| ## 1.0.1 - Sunflower Again | ||||
|  | ||||
| * Update the version because of a **stupid** "feature"™ of PyPI | ||||
|  | ||||
|  | ||||
| ## 1.0 - Sunflower | ||||
|  | ||||
| * Enhanced performances (by Mathieu Dupuy) | ||||
| @@ -348,7 +340,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Write the path of the collection in the git message (by Matthew Monaco) | ||||
| * Tests launched on Travis | ||||
|  | ||||
|  | ||||
| ## 0.10 - Lovely Endless Grass | ||||
|  | ||||
| * Support well-known URLs (by Mathieu Dupuy) | ||||
| @@ -358,7 +349,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Support salted SHA1 passwords (by Marc Kleine-Budde) | ||||
| * Don't spam the logs about non-SSL IMAP connections to localhost (by Giel van Schijndel) | ||||
|  | ||||
|  | ||||
| ## 0.9 - Rivers | ||||
|  | ||||
| * Custom handlers for auth, storage and rights (by Sergey Fursov) | ||||
| @@ -376,7 +366,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Move pid file creation in child process (by Mathieu Dupuy) | ||||
| * Allow requests without base_prefix (by jheidemann) | ||||
|  | ||||
|  | ||||
| ## 0.8 - Rainbow | ||||
|  | ||||
| * New authentication and rights management modules (by Matthias Jordan) | ||||
| @@ -388,7 +377,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Colon allowed in passwords | ||||
| * Configurable realm message | ||||
|  | ||||
|  | ||||
| ## 0.7.1 - Waterfalls | ||||
|  | ||||
| * Many address books fixes | ||||
| @@ -398,7 +386,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Always set display name to collections (by Oskari Timperi) | ||||
| * Various DELETE responses fixed | ||||
|  | ||||
|  | ||||
| ## 0.7 - Eternal Sunshine | ||||
|  | ||||
| * Repeating events | ||||
| @@ -407,26 +394,22 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * CardDAV support | ||||
| * Custom LDAP filters supported | ||||
|  | ||||
|  | ||||
| ## 0.6.4 - Tulips | ||||
|  | ||||
| * Fix the installation with Python 3.1 | ||||
|  | ||||
|  | ||||
| ## 0.6.3 - Red Roses | ||||
|  | ||||
| * MOVE requests fixed | ||||
| * Faster REPORT answers | ||||
| * Executable script moved into the package | ||||
|  | ||||
|  | ||||
| ## 0.6.2 - Seeds | ||||
|  | ||||
| * iPhone and iPad support fixed | ||||
| * Backslashes replaced by slashes in PROPFIND answers on Windows | ||||
| * PyPI archive set as default download URL | ||||
|  | ||||
|  | ||||
| ## 0.6.1 - Growing Up | ||||
|  | ||||
| * Example files included in the tarball | ||||
| @@ -434,7 +417,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Redirection loop bug fixed | ||||
| * Testing message on GET requests | ||||
|  | ||||
|  | ||||
| ## 0.6 - Sapling | ||||
|  | ||||
| * WSGI support | ||||
| @@ -449,7 +431,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Journal entries support | ||||
| * Drop Python 2.5 support | ||||
|  | ||||
|  | ||||
| ## 0.5 - Historical Artifacts | ||||
|  | ||||
| * Calendar depth | ||||
| @@ -457,21 +438,18 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * HEAD requests management | ||||
| * htpasswd user from calendar path | ||||
|  | ||||
|  | ||||
| ## 0.4 - Hot Days Back | ||||
|  | ||||
| * Personal calendars | ||||
| * Last-Modified HTTP header | ||||
|   * ``no-ssl`` and ``foreground`` options | ||||
| * `no-ssl` and `foreground` options | ||||
| * Default configuration file | ||||
|  | ||||
|  | ||||
| ## 0.3 - Dancing Flowers | ||||
|  | ||||
| * Evolution support | ||||
| * Version management | ||||
|  | ||||
|  | ||||
| ## 0.2 - Snowflakes | ||||
|  | ||||
| * Sunbird pre-1.0 support | ||||
| @@ -485,7 +463,6 @@ Some bugs have been fixed and little enhancements have been added: | ||||
| * Concurrent modification reported to users | ||||
| * Many bugs fixed (by Roger Wenham) | ||||
|  | ||||
|  | ||||
| ## 0.1 - Crazy Vegetables | ||||
|  | ||||
| * First release | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Unrud
					Unrud