Initial overhaul of documentation
This commit is contained in:
		
							
								
								
									
										430
									
								
								DOCUMENTATION.md
									
									
									
									
									
								
							
							
						
						
									
										430
									
								
								DOCUMENTATION.md
									
									
									
									
									
								
							| @@ -21,7 +21,7 @@ Radicale is really easy to install and works out-of-the-box. | ||||
|  | ||||
| ```bash | ||||
| $ python3 -m pip install --upgrade radicale | ||||
| $ python3 -m radicale --config "" --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| ``` | ||||
|  | ||||
| When your server is launched, you can check that everything's OK by going | ||||
| @@ -60,7 +60,6 @@ fit your needs. | ||||
| - [What can I configure?](#documentation/configuration) | ||||
| - [Authentication & Rights.](#documentation/authentication-and-rights) | ||||
| - [Storage.](#documentation/storage) | ||||
| - [Logging.](#documentation/logging) | ||||
|  | ||||
| ### Hack | ||||
|  | ||||
| @@ -97,7 +96,7 @@ Then open a console and type: | ||||
| # Run the following command as root or | ||||
| # add the --user argument to only install for the current user | ||||
| $ python3 -m pip install --upgrade radicale | ||||
| $ python3 -m radicale --config "" --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections | ||||
| ``` | ||||
|  | ||||
| Victory! Open [http://localhost:5232/](http://localhost:5232/) in your browser! | ||||
| @@ -115,11 +114,9 @@ Launch a command prompt and type: | ||||
|  | ||||
| ```powershell | ||||
| C:\Users\User> python -m pip install --upgrade radicale | ||||
| C:\Users\User> python -m radicale --config "" --storage-filesystem-folder=~/radicale/collections | ||||
| C:\Users\User> python -m radicale --storage-filesystem-folder=~/radicale/collections | ||||
| ``` | ||||
|  | ||||
| If you are using PowerShell replace ``--config ""`` with ``--config '""'``. | ||||
|  | ||||
| Victory! Open [http://localhost:5232/](http://localhost:5232/) in your browser! | ||||
| You can login with any username and password. | ||||
|  | ||||
| @@ -134,10 +131,12 @@ Installation instructions can be found on the | ||||
|  | ||||
| ### Configuration | ||||
|  | ||||
| Radicale tries to load configuration files from `/etc/radicale/config`, | ||||
| `~/.config/radicale/config` and the `RADICALE_CONFIG` environment variable. | ||||
| A custom path can be specified with the `--config /path/to/config` command | ||||
| line argument. | ||||
| Radicale tries to load configuration files from `/etc/radicale/config` and | ||||
| `~/.config/radicale/config`. | ||||
| Custom paths can be specified with the `--config /path/to/config` command | ||||
| line argument or the `RADICALE_CONFIG` environment variable. | ||||
| Multiple configuration files can be separated by `:` (resp. `;` on Windows). | ||||
| Paths that start with `?` are optional. | ||||
|  | ||||
| You should create a new configuration file at the desired location. | ||||
| (If the use of a configuration file is inconvenient, all options can be | ||||
| @@ -160,19 +159,14 @@ The `users` file can be created and managed with | ||||
| [htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html): | ||||
| ```bash | ||||
| # Create a new htpasswd file with the user "user1" | ||||
| $ htpasswd -B -c /path/to/users user1 | ||||
| $ htpasswd -c /path/to/users user1 | ||||
| New password: | ||||
| Re-type new password: | ||||
| # Add another user | ||||
| $ htpasswd -B /path/to/users user2 | ||||
| $ htpasswd /path/to/users user2 | ||||
| New password: | ||||
| Re-type new password: | ||||
| ``` | ||||
| **bcrypt** is used to secure the passwords. Radicale requires additional | ||||
| dependencies for this encryption method: | ||||
| ```bash | ||||
| $ python3 -m pip install --upgrade radicale[bcrypt] | ||||
| ``` | ||||
|  | ||||
| Authentication can be enabled with the following configuration: | ||||
| ```ini | ||||
| @@ -180,7 +174,7 @@ Authentication can be enabled with the following configuration: | ||||
| type = htpasswd | ||||
| htpasswd_filename = /path/to/users | ||||
| # encryption method used in the htpasswd file | ||||
| htpasswd_encryption = bcrypt | ||||
| htpasswd_encryption = md5 | ||||
| ``` | ||||
|  | ||||
| #### The simple but insecure way | ||||
| @@ -206,15 +200,13 @@ htpasswd_encryption = plain | ||||
|  | ||||
| The default configuration binds the server to localhost. It can't be reached | ||||
| from other computers. This can be changed with the following configuration | ||||
| options: | ||||
| options (IPv4 and IPv6): | ||||
|  | ||||
| ```ini | ||||
| [server] | ||||
| hosts = 0.0.0.0:5232 | ||||
| hosts = 0.0.0.0:5232, [::]:5232 | ||||
| ``` | ||||
|  | ||||
| More addresses can be added (separated by commas). | ||||
|  | ||||
| ### Storage | ||||
|  | ||||
| Data is stored in the folder `/var/lib/radicale/collections`. The path can | ||||
| @@ -342,21 +334,6 @@ $ journalctl --unit radicale.service | ||||
|  | ||||
| *To be written.* | ||||
|  | ||||
| ### Classic daemonization | ||||
|  | ||||
| Set the configuration option `daemon` in the section `server` to `True`. | ||||
| You may want to set the option `pid` to the path of a PID file. | ||||
|  | ||||
| After daemonization the server will not log anything. You have to configure | ||||
| [Logging](#documentation/logging). | ||||
|  | ||||
| If you start Radicale now, it will initialize and fork into the background. | ||||
| The main process exits, after the PID file is written. | ||||
|  | ||||
| **Security:** You can set the **umask** with `umask 0027` before you start the | ||||
| daemon, to protect your calendar data and log files from other users. | ||||
| Don't forget to set permissions of files that are already created! | ||||
|  | ||||
| ### Windows with "NSSM - the Non-Sucking Service Manager" | ||||
|  | ||||
| First install [NSSM](https://nssm.cc/) and start `nssm install` in a command | ||||
| @@ -569,7 +546,7 @@ 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](http://localhost:5232)) to create and manage | ||||
| collections. | ||||
| 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 | ||||
| @@ -716,60 +693,49 @@ An example configuration file looks like: | ||||
| ```ini | ||||
| [server] | ||||
| # Bind all addresses | ||||
| hosts = 0.0.0.0:5232 | ||||
| hosts = 0.0.0.0:5232, [::]:5232 | ||||
|  | ||||
| [auth] | ||||
| type = htpasswd | ||||
| htpasswd_filename = /path/to/users | ||||
| htpasswd_encryption = bcrypt | ||||
| htpasswd_encryption = md5 | ||||
| [storage] | ||||
| filesystem_folder = ~/.var/lib/radicale/collections | ||||
| ``` | ||||
|  | ||||
| Radicale tries to load configuration files from `/etc/radicale/config`, | ||||
| `~/.config/radicale/config` and the `RADICALE_CONFIG` environment variable. | ||||
| This behaviour can be overwritten by specifying a path with the | ||||
| `--config /path/to/config` command line argument. | ||||
| Radicale tries to load configuration files from `/etc/radicale/config` and | ||||
| `~/.config/radicale/config`. | ||||
| Custom paths can be specified with the `--config /path/to/config` command | ||||
| line argument or the `RADICALE_CONFIG` environment variable. | ||||
| Multiple configuration files can be separated by `:` (resp. `;` on Windows). | ||||
| Paths that start with `?` are optional. | ||||
|  | ||||
| The same example configuration via command line arguments looks like: | ||||
| ```bash | ||||
| python3 -m radicale --config "" --server-hosts 0.0.0.0:5232 --auth-type htpasswd --htpasswd-filename /path/to/htpasswd --htpasswd-encryption bcrypt | ||||
| python3 -m radicale --server-hosts 0.0.0.0:5232,[::]:5232 --auth-type htpasswd --htpasswd-filename /path/to/htpasswd --htpasswd-encryption md5 | ||||
| ``` | ||||
|  | ||||
| The `--config ""` argument is required to stop Radicale from trying | ||||
| to load configuration files. Run `python3 -m radicale --help` for more information. | ||||
| Add the argument `--config ""` to stop Radicale from loading the default | ||||
| configuration files. Run `python3 -m radicale --help` for more information. | ||||
|  | ||||
| In the following, all configuration categories and options are described. | ||||
|  | ||||
| ### server | ||||
|  | ||||
| Most configuration options in this category are only relevant in standalone | ||||
| mode. All options beside `max_content_length` and `realm` are ignored, | ||||
| when Radicale runs via WSGI. | ||||
| The configuration options in this category are only relevant in standalone | ||||
| mode. All options are ignored, when Radicale runs via WSGI. | ||||
|  | ||||
| #### hosts | ||||
|  | ||||
| A comma separated list of addresses that the server will bind to. | ||||
|  | ||||
| Default: `127.0.0.1:5232` | ||||
|  | ||||
| #### daemon | ||||
|  | ||||
| Daemonize the Radicale process. It does not reset the umask. | ||||
|  | ||||
| Default: `False` | ||||
|  | ||||
| #### pid | ||||
|  | ||||
| If daemon mode is enabled, Radicale will write its PID to this file. | ||||
|  | ||||
| Default: | ||||
| Default: `localhost:5232` | ||||
|  | ||||
| #### max_connections | ||||
|  | ||||
| The maximum number of parallel connections. Set to `0` to disable the limit. | ||||
|  | ||||
| Default: `20` | ||||
| Default: `8` | ||||
|  | ||||
| #### max_content_length | ||||
|  | ||||
| @@ -810,30 +776,6 @@ authentication plugin that extracts the user name from the certifcate. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| #### protocol | ||||
|  | ||||
| SSL protocol used. See python's ssl module for available values. | ||||
|  | ||||
| Default: `PROTOCOL_TLSv1_2` | ||||
|  | ||||
| #### ciphers | ||||
|  | ||||
| Available ciphers for SSL. See python's ssl module for available ciphers. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| #### dns_lookup | ||||
|  | ||||
| Reverse DNS to resolve client address in logs. | ||||
|  | ||||
| Default: `True` | ||||
|  | ||||
| #### realm | ||||
|  | ||||
| Message displayed in the client when a password is needed. | ||||
|  | ||||
| Default: `Radicale - Password Required` | ||||
|  | ||||
| ### encoding | ||||
| #### request | ||||
|  | ||||
| @@ -897,25 +839,12 @@ Available methods: | ||||
|  | ||||
| `bcrypt` | ||||
| : This uses a modified version of the Blowfish stream cipher. It's very secure. | ||||
|   The **passlib** python module is required for this. Additionally you may need | ||||
|   one of the following python modules: **bcrypt**, **py-bcrypt** or **bcryptor**. | ||||
|   The installation of **radicale[bcrypt]** is required for this. | ||||
|  | ||||
| `md5` | ||||
| : This uses an iterated md5 digest of the password with a salt. | ||||
|   The **passlib** python module is required for this. | ||||
|  | ||||
| `sha1` | ||||
| : Passwords are stored as SHA1 hashes. It's insecure! | ||||
|  | ||||
| `ssha` | ||||
| : Passwords are stored as salted SHA1 hashes. It's insecure! | ||||
|  | ||||
| `crypt` | ||||
| : This uses UNIX | ||||
|   [crypt(3)](https://manpages.debian.org/unstable/manpages-dev/crypt.3.en.html). | ||||
|   It's insecure! | ||||
|  | ||||
| Default: `bcrypt` | ||||
| Default: `md5` | ||||
|  | ||||
| #### delay | ||||
|  | ||||
| @@ -923,6 +852,12 @@ Average delay after failed login attempts in seconds. | ||||
|  | ||||
| Default: `1` | ||||
|  | ||||
| #### realm | ||||
|  | ||||
| Message displayed in the client when a password is needed. | ||||
|  | ||||
| Default: `Radicale - Password Required` | ||||
|  | ||||
| ### rights | ||||
| #### type | ||||
|  | ||||
| @@ -978,28 +913,12 @@ Folder for storing local collections, created if not present. | ||||
|  | ||||
| Default: `/var/lib/radicale/collections` | ||||
|  | ||||
| #### filesystem_locking | ||||
|  | ||||
| Lock the storage. This must be disabled if locking is not supported by the | ||||
| underlying file system. Never start multiple instances of Radicale or edit the | ||||
| storage externally while Radicale is running if disabled. | ||||
|  | ||||
| Default: `True` | ||||
|  | ||||
| #### max_sync_token_age | ||||
|  | ||||
| Delete sync-token that are older than the specified time. (seconds) | ||||
|  | ||||
| Default: `2592000` | ||||
|  | ||||
| #### filesystem_fsync | ||||
|  | ||||
| Sync all changes to disk during requests. (This can impair performance.) | ||||
| Disabling it increases the risk of data loss, when the system crashes or | ||||
| power fails! | ||||
|  | ||||
| Default: `True` | ||||
|  | ||||
| #### hook | ||||
|  | ||||
| Command that is run after changes to storage. Take a look at the | ||||
| @@ -1023,17 +942,13 @@ Available backends: | ||||
| Default: `internal` | ||||
|  | ||||
| ### logging | ||||
| #### debug | ||||
| #### level | ||||
|  | ||||
| Set the default logging level to debug. | ||||
| Set the logging level. | ||||
|  | ||||
| Default: `False` | ||||
| Available levels: **debug**, **info**, **warning**, **error**, **critical** | ||||
|  | ||||
| #### full_environment | ||||
|  | ||||
| Log all environment variables (including those set in the shell). | ||||
|  | ||||
| Default: `False` | ||||
| Default: `warning` | ||||
|  | ||||
| #### mask_passwords | ||||
|  | ||||
| @@ -1041,12 +956,6 @@ Don't include passwords in logs. | ||||
|  | ||||
| Default: `True` | ||||
|  | ||||
| #### config | ||||
|  | ||||
| Logging configuration file. See the [Logging](#documentation/logging) page. | ||||
|  | ||||
| Default: | ||||
|  | ||||
| ### headers | ||||
|  | ||||
| In this section additional HTTP headers that are sent to clients can be | ||||
| @@ -1110,7 +1019,7 @@ The path of the collection is separated by `/` and has no leading or trailing | ||||
|  | ||||
| `%(login)s` gets replaced by the user name and `%(path)s` by the path of | ||||
| the collection. You can also get groups from the `user` regex in the | ||||
| `collection` regex with `{0}`, `{1}`, etc. | ||||
| `collection` regex with `{1}`, `{2}`, etc. | ||||
|  | ||||
| ## Storage | ||||
|  | ||||
| @@ -1196,85 +1105,9 @@ and `nNumberOfBytesToLockHigh` to `0` works. | ||||
| ## Logging | ||||
|  | ||||
| Radicale logs to `stderr`. The verbosity of the log output can be controlled | ||||
| with `--debug` command line argument or the `debug` configuration option in | ||||
| with `--debug` command line argument or the `level` configuration option in | ||||
| the `logging` section. | ||||
|  | ||||
| This is the recommended configuration for use with modern init systems | ||||
| (like **systemd**) or if you just test Radicale in a terminal. | ||||
|  | ||||
| You can configure Radicale to write its logging output to files (and even | ||||
| rotate them). | ||||
| This is useful if the process daemonizes or if your chosen method of running | ||||
| Radicale doesn't handle logging output. | ||||
|  | ||||
| A logging configuration file can be specified in the `config` configuration | ||||
| option in the `logging` section. The file format is explained in the | ||||
| [Python Logging Module](https://docs.python.org/3/library/logging.config.html#configuration-file-format). | ||||
|  | ||||
| ### Logging to a file | ||||
|  | ||||
| An example configuration to write the log output to the file `/var/log/radicale/log`: | ||||
| ```ini | ||||
| [loggers] | ||||
| keys = root | ||||
|  | ||||
| [handlers] | ||||
| keys = file | ||||
|  | ||||
| [formatters] | ||||
| keys = full | ||||
|  | ||||
| [logger_root] | ||||
| # Change this to DEBUG or INFO for higher verbosity. | ||||
| level = WARNING | ||||
| handlers = file | ||||
|  | ||||
| [handler_file] | ||||
| class = FileHandler | ||||
| # Specify the output file here. | ||||
| args = ('/var/log/radicale/log',) | ||||
| formatter = full | ||||
|  | ||||
| [formatter_full] | ||||
| format = %(asctime)s - [%(thread)x] %(levelname)s: %(message)s | ||||
| ``` | ||||
|  | ||||
| You can specify multiple **logger**, **handler** and **formatter** if you want | ||||
| to have multiple simultaneous log outputs. | ||||
|  | ||||
| The parent folder of the log files must exist and must be writable by Radicale. | ||||
|  | ||||
| **Security:** The log files should not be readable by unauthorized users. Set | ||||
| permissions accordingly. | ||||
|  | ||||
| #### Timed rotation of disk log files | ||||
|  | ||||
| An example **handler** configuration to write the log output to the file `/var/log/radicale/log` and rotate it. | ||||
| Replace the section `handler_file` from the file logging example: | ||||
| ```ini | ||||
| [handler_file] | ||||
| class = handlers.TimedRotatingFileHandler | ||||
| # Specify the output file and parameter for rotation here. | ||||
| # See https://docs.python.org/3/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler | ||||
| # Example: rollover at midnight and keep 7 files (means one week) | ||||
| args = ('/var/log/radicale/log', 'midnight', 1, 7) | ||||
| formatter = full | ||||
| ``` | ||||
|  | ||||
| #### Rotation of disk log files based on size | ||||
|  | ||||
| An example **handler** configuration to write the log output to the file `/var/log/radicale/log` and rotate it . | ||||
| Replace the section `handle_file` from the file logging example: | ||||
| ```ini | ||||
| [handler_file] | ||||
| class = handlers.RotatingFileHandler | ||||
| # Specify the output file and parameter for rotation here. | ||||
| # See https://docs.python.org/3/library/logging.handlers.html#logging.handlers.RotatingFileHandler | ||||
| # Example: rollover at 100000 kB and keep 10 files (means 1 MB) | ||||
| args = ('/var/log/radicale/log', 'a', 100000, 10) | ||||
| formatter = full | ||||
| ``` | ||||
|  | ||||
| ## Architecture | ||||
|  | ||||
| Radicale is a really small piece of software, but understanding it is not as | ||||
| @@ -1343,61 +1176,63 @@ icons and buttons, a terminal or another web application. | ||||
|  | ||||
| ### Code Architecture | ||||
|  | ||||
| The ``radicale`` package offers 9 modules. | ||||
|  | ||||
| `__main__` | ||||
| : The main module provides a simple function called run. Its main work is to | ||||
|   read the configuration from the configuration file and from the options given | ||||
|   in the command line; then it creates a server, according to the configuration. | ||||
| The ``radicale`` package offers the following modules. | ||||
|  | ||||
| `__init__` | ||||
| : This is the core part of the module, with the code for the CalDAV/CardDAV | ||||
|   server. The server inherits from a WSGIServer server class, which relies on | ||||
|   the default HTTP server class given by Python. The code managing the | ||||
|   different HTTP requests according to the CalDAV/CardDAV normalization is | ||||
|   written here. | ||||
| : Contains the entry point for WSGI. | ||||
|  | ||||
| `config` | ||||
| : This part gives a dict-like access to the server configuration, read from the | ||||
|   configuration file. The configuration can be altered when launching the | ||||
|   executable with some command line options. | ||||
| `__main__` | ||||
| : Provides the entry point for the ``radicale`` executable and | ||||
|   includes the command line parser. It loads configuration files from | ||||
|   the default (or specified) paths and starts the internal server. | ||||
|  | ||||
| `xmlutils` | ||||
| : The functions defined in this module are mainly called by the CalDAV/CardDAV | ||||
|   server class to read the XML part of the request, read or alter the | ||||
|   calendars, and create the XML part of the response. The main part of this | ||||
|   code relies on ElementTree. | ||||
|  | ||||
| `log` | ||||
| : The start function provided by this module starts a logging mechanism based | ||||
|   on the default Python logging module. Logging options can be stored in a | ||||
|   logging configuration file. | ||||
| `app` | ||||
| : This is the core part of Radicale, with the code for the CalDAV/CardDAV | ||||
|   server. The code managing the different HTTP requests according to the | ||||
|   CalDAV/CardDAV specification can be found here. | ||||
|  | ||||
| `auth` | ||||
| : This module provides a default authentication manager equivalent to Apache's | ||||
|   htpasswd. Login + password couples are stored in a file and used to | ||||
|   authenticate users. Passwords can be encrypted using various methods. Other | ||||
|   authentication methods can inherit from the base class in this file and be | ||||
|   provided as plugins. | ||||
| : Used for authenticating users based on username and password, mapping | ||||
|   usernames to internal users and optionally retrieving credentials from | ||||
|   the environment. | ||||
|  | ||||
| `config` | ||||
| : Contains the code for managing configuration and loading settings from files. | ||||
|  | ||||
| `ìtem` | ||||
| : Internal represenation of address book and calendar entries. Based on | ||||
|   [VObject](https://eventable.github.io/vobject/). | ||||
|  | ||||
| `log` | ||||
| : The logger for Radicale based on the default Python logging module. | ||||
|  | ||||
| `rights` | ||||
| : This module is a set of Access Control Lists, a set of methods used by | ||||
|   Radicale to manage rights to access the calendars. When the CalDAV/CardDAV | ||||
|   server is launched, an Access Control List is chosen in the set, according to | ||||
|   the configuration. The HTTP requests are then filtered to restrict the access | ||||
|   depending on who is authenticated. Other configurations can be written using | ||||
|   regex-based rules. Other rights managers can also inherit from the base class | ||||
|   in this file and be provided as plugins. | ||||
| : This module is used by Radicale to manage access rights to collections, | ||||
|   address books and calendars. | ||||
|  | ||||
| `server` | ||||
| : The integrated HTTP server for standalone use. | ||||
|  | ||||
| `storage` | ||||
| : In this module are written the classes representing collections and items in | ||||
|   Radicale, and the class storing these collections and items in your | ||||
|   filesystem. Other storage classes can inherit from the base class in this | ||||
|   file and be provided as plugins. | ||||
| : This module contains the classes representing collections in Radicale and | ||||
|   the code for storing and loading them in the filesystem. | ||||
|  | ||||
| `web` | ||||
| : This module contains the web interface. | ||||
|  | ||||
| `utils` | ||||
| : Contains general helper functions. | ||||
|  | ||||
| `httputils` | ||||
| : Contains helper functions for working with HTTP. | ||||
|  | ||||
| `pathutils` | ||||
| : Helper functions for working with paths and the filesystem. | ||||
|  | ||||
| `xmlutils` | ||||
| : Helper functions for working with the XML part of CalDAV/CardDAV requests | ||||
|   and responses. It's based on the ElementTree XML API. | ||||
|  | ||||
| ## Plugins | ||||
|  | ||||
| Radicale can be extended by plugins for authentication, rights management and | ||||
| @@ -1406,7 +1241,7 @@ storage. Plugins are **python** modules. | ||||
| ### Getting started | ||||
|  | ||||
| To get started we walk through the creation of a simple authentication | ||||
| plugin, that accepts login attempts if the username and password are equal. | ||||
| plugin, that accepts login attempts with a static password. | ||||
|  | ||||
| The easiest way to develop and install **python** modules is | ||||
| [Distutils](https://docs.python.org/3/distutils/setupscript.html). | ||||
| @@ -1418,31 +1253,36 @@ in an empty folder: | ||||
|  | ||||
| from distutils.core import setup | ||||
|  | ||||
| setup(name="radicale_silly_auth", packages=["radicale_silly_auth"]) | ||||
| setup(name="radicale_static_password_auth", packages=["radicale_static_password_auth"]) | ||||
| ``` | ||||
|  | ||||
| In the same folder create the sub-folder `radicale_silly_auth`. The folder | ||||
| must have the same name as specified in `packages` above. | ||||
| In the same folder create the sub-folder `radicale_static_password_auth`. | ||||
| The folder must have the same name as specified in `packages` above. | ||||
|  | ||||
| Create the file `__init__.py` in the `radicale_silly_auth` folder with the | ||||
| following content: | ||||
| Create the file `__init__.py` in the `radicale_static_password_auth` folder | ||||
| with the following content: | ||||
|  | ||||
| ```python | ||||
| from radicale.auth import BaseAuth | ||||
| from radicale.log import logger | ||||
|  | ||||
| PLUGIN_CONFIG_SCHEMA = {"auth": { | ||||
|     "password": {"value": "", "type": str}}} | ||||
|  | ||||
|  | ||||
| class Auth(BaseAuth): | ||||
|     def is_authenticated(self, user, password): | ||||
|         # Example custom configuration option | ||||
|         foo = "" | ||||
|         if self.configuration.has_option("auth", "foo"): | ||||
|             foo = self.configuration.get("auth", "foo") | ||||
|         self.logger.info("Configuration option %r is %r", "foo", foo) | ||||
|     def __init__(self, configuration): | ||||
|         super().__init__(configuration.copy(PLUGIN_CONFIG_SCHEMA)) | ||||
|  | ||||
|     def login(self, user, password): | ||||
|         # Get password from configuration option | ||||
|         static_password = self.configuration.get("auth", "password") | ||||
|         # Check authentication | ||||
|         self.logger.info("Login attempt by %r with password %r", | ||||
|                          user, password) | ||||
|         return user == password | ||||
|         logger.info("Login attempt by %r with password %r", | ||||
|                     user, password) | ||||
|         if password == static_password: | ||||
|             return user | ||||
|         return "" | ||||
| ``` | ||||
|  | ||||
| Install the python module by running the following command in the same folder | ||||
| @@ -1452,46 +1292,46 @@ python3 -m pip install --upgrade . | ||||
| ``` | ||||
|  | ||||
| To make use this great creation in Radicale, set the configuration option | ||||
| `type` in the `auth` section to `radicale_silly_auth`: | ||||
| `type` in the `auth` section to `radicale_static_password_auth`: | ||||
|  | ||||
| ```ini | ||||
| [auth] | ||||
| type = radicale_silly_auth | ||||
| foo = bar | ||||
| type = radicale_static_password_auth | ||||
| password = secret | ||||
| ``` | ||||
|  | ||||
| You can uninstall the module with: | ||||
| ```bash | ||||
| python3 -m pip uninstall radicale_silly_auth | ||||
| python3 -m pip uninstall radicale_static_password_auth | ||||
| ``` | ||||
|  | ||||
| ### 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.py` in | ||||
| Radicale's source code for more information. | ||||
| `radicale.auth.BaseAuth`. Take a look at the file `radicale/auth/__init__.py` | ||||
| in Radicale's source code for more information. | ||||
|  | ||||
| ### 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.py` in | ||||
| Radicale's source code for more information. | ||||
| `radicale.rights.BaseRights`. Take a look at the file | ||||
| `radicale/rights/__init__.py` in Radicale's source code for more information. | ||||
|  | ||||
| ### 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.py` in | ||||
| `radicale.web.BaseWeb`. Take a look at the file `radicale/web/__init__.py` in | ||||
| Radicale's source code for more information. | ||||
|  | ||||
| ### Storage plugins | ||||
|  | ||||
| This plugin is used to store collections and items. | ||||
| The module must contain a class `Collection` that extends | ||||
| `radicale.storage.BaseCollection`. Take a look at the file `radicale/storage.py` | ||||
| in Radicale's source code for more information. | ||||
| 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 | ||||
|  | ||||
| @@ -1507,7 +1347,7 @@ Found a bug? Want a new feature? Report a new issue on the | ||||
| ### Hack | ||||
|  | ||||
| Interested in hacking? Feel free to clone the | ||||
| [git repository on Github](https://github.com/Kozea/Radicale) if you want to | ||||
| [git repository on GitHub](https://github.com/Kozea/Radicale) if you want to | ||||
| add new features, fix bugs or update the documentation. | ||||
|  | ||||
| ### Documentation | ||||
| @@ -1537,34 +1377,8 @@ You can also download the content of the repository as an | ||||
|  | ||||
| ### Source Packages | ||||
|  | ||||
| You can download the Radicale package for each release: | ||||
|  | ||||
| - [**2.1.11 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.11) | ||||
| - [**2.1.10 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.10) | ||||
| - [**2.1.9 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.9) | ||||
| - [**2.1.8 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.8) | ||||
| - [**2.1.7 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.7) | ||||
| - [**2.1.6 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.6) | ||||
| - [**2.1.5 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.5) | ||||
| - [**2.1.4 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.4) | ||||
| - [**2.1.3 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.3) | ||||
| - [**2.1.2 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.2) | ||||
| - [**1.1.6 - Sixth Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1.6) | ||||
| - [**2.1.1 - Wild Radish Again**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.1) | ||||
| - [**2.1.0 - Wild Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0) | ||||
| - [**1.1.4 - Fifth Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1.4) | ||||
| - [2.1.0rc3](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc3) | ||||
| - [2.1.0rc2](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc2) | ||||
| - [2.1.0rc1](https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc1) | ||||
| - [**2.0.0 - Little Big Radish**](https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0) | ||||
| - [**1.1.3 - Fourth Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1.3) | ||||
| - [2.0.0rc2](https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0rc2) | ||||
| - [**1.1.2 - Third Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1.2) | ||||
| - [2.0.0rc1](https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0rc1) | ||||
| - [**1.1.1 - Second Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1.1) | ||||
| - [**1.1 - Law of Nature**](https://api.github.com/repos/Kozea/Radicale/tarball/1.1) | ||||
| - [**1.0.1 - Sunflower Again**](https://api.github.com/repos/Kozea/Radicale/tarball/1.0.1) | ||||
| - [**1.0 - Sunflower**](https://api.github.com/repos/Kozea/Radicale/tarball/1.0) | ||||
| You can find the source packages of all releases on | ||||
| [GitHub](https://github.com/Kozea/Radicale/releases). | ||||
|  | ||||
| ### Linux Distribution Packages | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Unrud
					Unrud