diff --git a/master.html b/master.html index 60279ee0..947220d4 100644 --- a/master.html +++ b/master.html @@ -124,104 +124,104 @@ @@ -229,8 +229,8 @@

Getting started

-
-

About Radicale

+
+

About Radicale

Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts) server, that:

  • Shares calendars and contact lists through CalDAV, CardDAV and HTTP.
  • @@ -238,34 +238,34 @@
  • Works out-of-the-box, no complicated setup or configuration required.
  • Can limit access by authentication.
  • Can secure connections with TLS.
  • -
  • Works with many CalDAV and CardDAV clients.
  • +
  • Works with many CalDAV and CardDAV clients.
  • Stores all data on the file system in a simple folder structure.
  • Can be extended with plugins.
  • Is GPLv3-licensed free software.
-
-

Installation

+
+

Installation

Radicale is really easy to install and works out-of-the-box.

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! You can login with any username and password.

-

Want more? Check the tutorials and the documentation.

+

Want more? Check the tutorials and the documentation.

-
-

What's New?

+
+

What's New?

Read the changelog on GitHub.

Tutorials

-
-

Simple 5-minute setup

+
+

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!

-

When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

+

When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

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 enough to install the package python3-pip.

Then open a console and type:

# Run the following command as root or
@@ -274,8 +274,8 @@
 $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections

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 and download the latest version of Python 3. Then run the installer. On the first window of the installer, check the "Add Python to PATH" box and click on "Install now". Wait a couple of minutes, it's done!

Launch a command prompt and type:

C:\Users\User> python -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz
@@ -283,18 +283,18 @@
 

Victory! Open http://localhost:5232 in your browser! You can log in with any username and password.

-
-

Basic Configuration

-

Installation instructions can be found in the simple 5-minute setup tutorial.

+
+

Basic Configuration

+

Installation instructions can be found in the simple 5-minute setup tutorial.

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 passed via command line arguments.)

-

All configuration options are described in detail in the Configuration section.

-
-

Authentication

+

All configuration options are described in detail in the Configuration section.

+
+

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.

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:

# Create a new htpasswd file with the user "user1"
 $ htpasswd -c /path/to/users user1
@@ -311,8 +311,8 @@
 # encryption method used in the htpasswd file
 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:

user1:password1
 user2:password2
@@ -324,23 +324,23 @@ user2:password2
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 options (IPv4 and IPv6):

[server]
 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:

[storage]
 filesystem_folder = /path/to/storage
-

Security: The storage folder should not be readable by unauthorized users. Otherwise, they can read the calendar data and lock the storage. You can find OS dependent instructions in the Running as a service section.

+

Security: The storage folder should not be readable by unauthorized users. Otherwise, they can read the calendar data and lock the storage. You can find OS dependent instructions in the 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 incorrect authentication attempts. Connections are terminated after a timeout. The default values should be fine for most scenarios.

[server]
 max_connections = 20
@@ -354,11 +354,11 @@ user2:password2
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.) 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.)

Security: The storage should not be readable by others. (Run chmod -R o= /var/lib/radicale/collections as root.)

@@ -399,8 +399,8 @@ user2:password2 # View all log messages $ journalctl --unit radicale.service
-
-

Linux with systemd as a user

+
+

Linux with systemd as a user

Create the file ~/.config/systemd/user/radicale.service:

[Unit]
 Description=A simple CalDAV (calendar) and CardDAV (contact) server
@@ -422,8 +422,8 @@ user2:password2
# View all log messages $ journalctl --user --unit radicale.service
-
-

Windows with "NSSM - the Non-Sucking Service Manager"

+
+

Windows with "NSSM - the Non-Sucking Service Manager"

First install NSSM and start nssm install in a command prompt. Apply the following configuration:

  • Service name: Radicale
  • @@ -444,8 +444,8 @@ user2:password2

    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 from the URL path that is forwarded to Radicale.

Example nginx configuration:

location /radicale/ { # The trailing / is important!
@@ -472,8 +472,8 @@ user2:password2
# Set to directory of .htaccess file: RequestHeader set X-Script-Name /radicale

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. Radicale uses the user name provided in the X-Remote-User HTTP header and disables HTTP authentication.

Example nginx configuration:

location /radicale/ {
@@ -517,8 +517,8 @@ user2:password2

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 Radicale and a certificate for the reverse proxy. The following commands generate self-signed certificates. You will be asked to enter additional information about the certificate, the values don't matter and you can keep the defaults.

openssl req -x509 -newkey rsa:4096 -keyout server_key.pem -out server_cert.pem \
         -nodes -days 9999
@@ -541,8 +541,8 @@ user2:password2
}
-
-

WSGI Server

+
+

WSGI Server

Radicale is compatible with the WSGI specification.

A configuration file can be set with the RADICALE_CONFIG environment variable, otherwise no configuration file is loaded and the default configuration is used.

Example uWSGI configuration:

@@ -555,13 +555,13 @@ user2:password2

Example Gunicorn configuration:

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).

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:

.Radicale.cache
@@ -572,10 +572,10 @@ user2:password2

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.

An example configuration file looks like:

[server]
@@ -596,67 +596,67 @@ user2:password2
--auth-htpasswd-encryption md5

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

+
+

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 authenticate users with client-side certificates, you also have to write an 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.

Available backends:

none : Just allows all usernames and passwords.

@@ -665,13 +665,13 @@ user2:password2

http_x_remote_user : Takes the user name from the X-Remote-User HTTP header and disables HTTP authentication. This can be used to provide the user name from a reverse proxy.

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 or similar to generate this files.

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:

@@ -681,21 +681,21 @@ user2:password2

md5 : This uses an iterated md5 digest of the password with a salt.

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.

The recommended backend is owner_only. If access to calendars and address books outside the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. Choosing any other method is only useful if you access calendars and address books directly via URL.

Available backends:

@@ -705,41 +705,41 @@ user2:password2

from_file : Load the rules from a file.

Default: owner_only

-
-
file
-

File for the rights backend from_file. See the Rights section.

+
+
file
+

File for the rights backend from_file. See the Rights section.

-
-

storage

-
-
type
+
+

storage

+
+
type

The backend that is used to store data.

Available backends:

multifilesystem : Stores the data in the filesystem.

multifilesystem_nolock : 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
-

Command that is run after changes to storage. Take a look at the Versioning with Git tutorial for an example.

+
+
hook
+

Command that is run after changes to storage. Take a look at the Versioning with Git tutorial for an example.

Default:

-
-

web

-
-
type
+
+

web

+
+
type

The backend that provides the web interface of Radicale.

Available backends:

none : Just shows the message "Radicale works!".

@@ -747,29 +747,29 @@ user2:password2

Default: internal

-
-

logging

-
-
level
+
+

logging

+
+
level

Set the logging level.

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.

An example to relax the same-origin policy:

Access-Control-Allow-Origin = *
-
-

Supported Clients

+
+

Supported Clients

Radicale has been tested with:

  • Android with DAVx⁵ (formerly DAVdroid)
  • @@ -779,33 +779,33 @@ user2:password2

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.

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.

In Evolution add a new calendar and address book respectively with WebDAV. 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. http://localhost:5232/user/calendar). If you want to add calendars from 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. No additional configuration is required.

Set the URL of the Radicale server in config.js. If InfCloud is not hosted on the same server and port as Radicale, the browser will deny access to the Radicale server, because of the same-origin policy. 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 (e.g. DAVx⁵).

To create a new calendar run something like:

$ curl -u user -X MKCOL 'http://localhost:5232/user/calendar' --data \
@@ -848,8 +848,8 @@ user2:password2
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 section must point to the rights file.

The recommended rights method is owner_only. If access to calendars and address books outside the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. This is only useful if you access calendars and address books directly via URL.

An example rights file:

@@ -885,12 +885,12 @@ user2:password2
  • w: write address book and calendar collections
  • -
    -

    Storage

    +
    +

    Storage

    This document describes the layout and format of the file system storage (multifilesystem backend).

    -

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Versioning with Git).

    -
    -

    Layout

    +

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Versioning with Git).

    +
    +

    Layout

    The file system contains the following files and folders:

    • .Radicale.lock: The lock file for locking the storage.
    • @@ -903,28 +903,28 @@ user2:password2

      Caches and sync-tokens are stored in the .Radicale.cache folder inside of collections. This folder may be created or modified, while the storage is locked for shared access. In theory, it should be safe to delete the folder. Caches will be recreated automatically and clients will be told that their sync-token isn't valid anymore.

      You may encounter files or folders that start with .Radicale.tmp-. Radicale uses them for atomic creation and deletion of files and folders. 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 utility.

    # Exclusive
     $ flock --exclusive /path/to/storage/.Radicale.lock COMMAND
     # Shared
     $ flock --shared /path/to/storage/.Radicale.lock COMMAND
    -
    -
    Linux and MacOS
    +
    +
    Linux and MacOS

    Use the flock syscall. Python provides it in the fcntl module.

    -
    -
    Windows
    +
    +
    Windows

    Use LockFile for exclusive access or LockFileEx 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). To tell Radicale and clients that the collection is a calendar, you have to create the file .Radicale.props with the following content in the folder:

    {"tag": "VCALENDAR"}

    The calendar is now available at the URL path /user/calendar. For address books the file must contain:

    @@ -933,15 +933,15 @@ user2:password2

    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:

    @@ -989,8 +989,8 @@ user2:password2

    Radicale is not the client part of this architecture. It means that Radicale never draws calendars, address books, events and contacts on the screen. It only stores them and give the possibility to share them online with other people.

    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.

    __init__ : Contains the entry point for WSGI.

    __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.

    @@ -1009,11 +1009,11 @@ user2:password2

    xmlutils : 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.

    The easiest way to develop and install python modules is Distutils. For a minimal setup create the file setup.py with the following content in an empty folder:

    #!/usr/bin/env python3
    @@ -1053,62 +1053,62 @@ user2:password2

    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

    -
    -

    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.

    -
    -

    Hack

    +
    +

    Hack

    Interested in hacking? Feel free to clone the git repository on GitHub 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.

    Download

    -
    -

    PyPI

    +
    +

    PyPI

    Radicale is available on PyPI. To install, just type as superuser:

    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, or install it directly with:

    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.

    -
    -

    Source Packages

    +
    +

    Source Packages

    You can find the source packages of all releases on GitHub.

    -
    -

    Linux Distribution Packages

    +
    +

    Linux Distribution Packages

    Radicale has been packaged for:

    • ArchLinux by David Runge
    • @@ -1129,42 +1129,42 @@ user2:password2

    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.

    Calendar and contact manipulation is available from both local and distant accesses, possibly limited through authentication policies.

    It aims to be a lightweight solution, easy to use, easy to install, easy to configure. As a consequence, it requires few software dependencies and is 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.

    CalDAV and CardDAV are not perfect protocols. We think that their main problem is their complexity, that is why we decided not to implement the whole standard but just enough to understand some of its client-side implementations.

    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 features and use cases, but it is quite hard to implement fully.

    Some calendar servers have been created to follow the CalDAV and CardDAV RFCs as much as possible: Davical, Baïkal and Darwin Calendar Server, for example, are much more respectful of CalDAV and CardDAV and can be used with many clients. They are very good choices if you want to develop and test new CalDAV clients, or if you have a possibly heterogeneous list of user agents.

    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.

    The installation is very easy, particularly with Linux: one dependency, no superuser rights needed, no configuration required, no database. Installing and launching the main script out-of-the-box, as a normal user, are often the only steps to have a simple remote calendar and contact access.

    -

    Contrary to other servers that are often complicated, require high privileges 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.

    +

    Contrary to other servers that are often complicated, require high privileges 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.

    -
    -
    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 given in such cases.

    Radicale often assumes that the clients are perfect and that protocol 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.

    At the beginning, it was just a proof-of-concept. The main goal was to write a small, dirty and simple CalDAV server working with Lightning, using no external libraries. That's how we created a piece of code that's (quite) easy to understand, to use and to hack.

    The first lines have been added to the SVN (!) repository as I was drinking (many) beers at the very end of 2008 (Python 2.6 and 3.0 were just released). It's now packaged for a growing number of Linux distributions.

    diff --git a/v1.html b/v1.html index dcc38fd4..1cc8b66f 100644 --- a/v1.html +++ b/v1.html @@ -124,184 +124,184 @@ @@ -309,18 +309,18 @@

    A Simple Calendar and Contact Server

    -
    -

    Presentation

    +
    +

    Presentation

    The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.

    Calendars and address books are available for both local and remote access, possibly limited through authentication policies. They can be viewed and edited by calendar and contact clients on mobile phones or computers.

    -
    -

    Technical Description

    +
    +

    Technical Description

    Radicale aims to be a light solution, easy to use, easy to install, easy to configure. As a consequence, it requires few software dependencies and is pre-configured to work out-of-the-box.

    Radicale runs on most of the UNIX-like platforms (Linux, *BSD, MacOS X) and Windows. It is free and open-source software, written in Python, released under GPL version 3.

    -
    -

    Main Features

    +
    +

    Main Features

    • Shares calendars through CalDAV, WebDAV and HTTP
    • Shares contacts through CardDAV, WebDAV and HTTP
    • @@ -331,49 +331,49 @@
    • Secures connections
    -
    -

    Supported Clients

    -

    Radicale supports the latest versions of many CalDAV and CardDAV clients.

    +
    +

    Supported Clients

    +

    Radicale supports the latest versions of many CalDAV and CardDAV clients.

    -
    -

    Documentation

    -
    -

    User documentation

    +
    +

    Documentation

    +
    +

    User documentation

    This document describes how to install and configure the server.

    -
    -

    Project description

    +
    +

    Project description

    This document defines the main goals of the Radicale Project, what it covers and what it does not.

    -
    -

    Technical choices

    +
    +

    Technical choices

    This document describes the global technical choices of the Radicale Project and the global architectures of its different parts.

    -
    -

    User Documentation

    -
    -

    Installation

    -
    -
    Dependencies
    -

    Radicale is written in pure Python and does not depend on any library. It is known to work on Python 2.6, 2.7, 3.1, 3.2, 3.3, 3.4 and PyPy > 1.9. The dependencies are optional, as they are only needed for various authentication methods[1].

    -

    Linux and MacOS users certainly have Python already installed. For Windows users, please install Python[2] thanks to the adequate installer.

    +
    +

    User Documentation

    +
    +

    Installation

    +
    +
    Dependencies
    +

    Radicale is written in pure Python and does not depend on any library. It is known to work on Python 2.6, 2.7, 3.1, 3.2, 3.3, 3.4 and PyPy > 1.9. The dependencies are optional, as they are only needed for various authentication methods[1].

    +

    Linux and MacOS users certainly have Python already installed. For Windows users, please install Python[2] thanks to the adequate installer.

    -
    -
    Radicale
    +
    +
    Radicale

    Radicale can be freely downloaded on the project website, download section. Just get the file and unzip it in a folder of your choice.

    -
    -
    CalDAV and CardDAV Clients
    +
    +
    CalDAV and CardDAV Clients

    At this time Radicale has been tested and works fine with the latest version of:

    • Mozilla Lightning
    • @@ -389,24 +389,24 @@

      More clients will be supported in the future. However, it may work with any calendar or contact client which implements CalDAV or CardDAV specifications too (luck is highly recommended).

    -
    -

    Simple Usage

    -
    -
    Starting the Server
    +
    +

    Simple Usage

    +
    +
    Starting the Server

    To start Radicale CalDAV server, you have to launch the file called radicale.py located in the root folder of the software package.

    -
    -
    Starting the Client
    -
    -
    Lightning
    +
    +
    Starting the Client
    +
    +
    Lightning

    After starting Lightning, click on File and New Calendar. Upcoming window asks you about your calendar storage. Chose a calendar On the Network, otherwise Lightning will use its own file system storage instead of Radicale's one and your calendar won't be remotely accessible.

    Next window asks you to provide information about remote calendar access. Protocol used by Radicale is CalDAV. A standard location for a basic use of a Radicale calendar is http://localhost:5232/user/calendar.ics/, where you can replace user and calendar.ics by some strings of your choice. Calendars are automatically created if needed. Please note that the trailing slash is important.

    You can now customize your calendar by giving it a nickname and a color. This is only used by Lightning to identify calendars among others.

    If no warning sign appears next to the calendar name, you can now add events and tasks to your calendar. All events and tasks are stored in the server, they can be accessed and modified from multiple clients by multiple users at the same time.

    Lightning and Thunderbird cannot access CardDAV servers yet. Also, as of version 17.0.5 the SOGo Connector addon is not fully functionally and will create extra address book entries with every sync.

    -
    -
    Evolution
    +
    +
    Evolution

    Calendars

    First of all, show the calendar page in Evolution by clicking on the calendar icon at the bottom of the side pane. Then add a new calendar by choosing in the menu File → New → Calendar.

    A new window opens. The calendar type is CalDAV, and the location is something like http://localhost:5232/user/calendar.ics/, where you can replace user and calendar by some strings of your choice. Calendars are automatically created if needed. Please note that the trailing slash is important.

    @@ -415,8 +415,8 @@

    Contacts

    Switch to the contacts page and click File → New → Adress book. In the new window choose WebDAV as type and something like http://localhost:5232/user/addressbook.vcf/ as location. Remember to enter the correct username.

    -
    -
    KOrganizer
    +
    +
    KOrganizer

    Calendars

    Tested with 4.8.3, you need one running on Akonadi for Cal/CarDav support.

    The procedure below can also be done trough the sidebar "Calendar Manager". But to ensure it works for everyone this examples uses the menu-bar.

    @@ -446,8 +446,8 @@

    Contacts

    You can add a address book analogously to the above instructions, just choose CardDav and http://myserver:5232/Username/AddressBook.vcf/ in step 10 and 11. Also, if you already have a calendar set up you can add an address book to its "DAV groupware resource" under Configure-Kontact → Calendar → General → Calendars → Modify. This way you don't have to enter username and password twice.

    -
    -
    CalendarSync
    +
    +
    CalendarSync

    CalendarSync can be combined with any Android calendar app and can even store the calendars in existing Android calendars which are synced by other sync adapters. Of course it can also create its own calendars.

    So, to sync using CalendarSync you will have to:

      @@ -461,8 +461,8 @@

      Press test connection button. If everything signaled as OK then press search calendars button, select the calendars which you want to sync, and press the configure calendar button at the top of the display. Your calendars are now configured.

      You can then start the first sync by going back to the main screen of the app an pressing the Process Webicals button. Of course you can also configure the app at its preferences to sync automatically.

    -
    -
    ContactSync
    +
    +
    ContactSync

    ContactSync is designed to sync contacts from and to various sources. It can also overtake contacts and push them to the server, also if they are only available on the device (local only contacts).

    So to sync your contacts from the Radical server to your Android device:

      @@ -476,8 +476,8 @@

      Press test connection button, if everything signaled as OK then press search address book button. Select the address books which you want to sync and press the configure address book button at the top of the display.

      You can then start the first sync by going back to the main screen of the app and pressing the Handle WebContacts button. Of course you can also configure the app at its preferences to sync automatically.

    -
    -
    CalDAV-Sync
    +
    +
    CalDAV-Sync

    CalDAV-Sync is implemented as sync adapter to integrate seamlessly with any calendar app and widget. Therefore you have to access it via Accounts & Sync settings after installing it from the Market.

    So, to add new calendars to your phone open Accounts & Sync settings and tap on Add account, selecting CalDAV as type. In the next view, you have to switch to Manual Mode. Enter the full CalDAV URL of your Radicale account (e.g. http://example.com:5232/Username/) and corresponding login data. If you want to create a new calendar you have to specify its full URL e.g. http://example.com:5232/Username/Calendar.ics/. Please note that the trailing slash is important.

    Tap on Next and the app checks for all available calendars on your account, listing them in the next view. (Note: CalDAV-Sync will not only check under the url you entered but also under http://example.com:5232/UsernameYouEnteredForLogin/. This might cause strange errors.) You can now select calendars you want to sync and set a local nickname and color for each. Hitting Next again brings up the last page. Enter your email address and uncheck Sync from server to phone only if you want to use two-way-sync.

    @@ -487,25 +487,25 @@

    Tap on Finish and you're done. You're now able to use the new calendars in the same way you were using Google calendars before.

    -
    -
    CardDAV-Sync
    +
    +
    CardDAV-Sync

    Set up works like CalDAV-Sync, just use .vcf instead of .ics if you enter the URL, e.g. http://example.com:5232/Username/AddressBook.vcf/.

    -
    -
    DAVdroid
    +
    +
    DAVdroid

    DAVdroid is a free and open-source CalDAV/CardDAV client that is available in Play Store for a small fee or in FDroid for free.

    To make it working with Radicale, just add a new DAVdroid account and enter https://example.com/radicale/user/ as base URL (assuming that your Radicale runs at https://example.com/radicale/; don't forget to set base_prefix correctly).

    -
    -
    aCal
    +
    +
    aCal

    aCal is a CalDAV client for Android. It comes with its own calendar application and does not integrate in the Android calendar. It is a "CalDAV only" calendar, i.e. it only works in combination with a CalDAV server. It can connect to several calendars on the server and will display them all in one calendar. It works nice with Radicale.

    To configure aCal, start aCal, go to the Settings screen, select Server, then Add server. Choose Manual Configuration and select Advanced (bottom of the screen). Then enter the host name of your server, check Active, enter your user name and password. The Simple Domain of your server is the domain part of your fully qualified host name (e.g. if your server is myserver.mydomain.org, choose mydomain.org).

    As Simple Path you need to specify /<user> where user is the user you use to connect to Radicale. Server Name is the fully qualified name of your server machine (myserver.mydomain.org). The Server Path is /<user>/.

    For Authentication Type you need to specify the method you chose for Radicale. Check Use SSL if your Radicale is configured to use SSL.

    As the last thing you need to specify the port Radicale listens to. When your server is configured you can go back to the first Settings screen, and select Calendars and Addressbooks. You should find all the calendars that are available to your user on the Radicale server. You can then configure each of them (display colour, notifications, etc.).

    -
    -
    InfCloud, CalDavZAP & CardDavMATE
    +
    +
    InfCloud, CalDavZAP & CardDavMATE

    Because settings are the same for InfCloud, CalDavZAP and CardDavMATE
    only InfCloud is used in description below.

    Radicale configuration

    @@ -572,8 +572,8 @@ Download and accept the certificate offered by the Radicale server.
    After installing and accepting it you should restart your browser.

    -
    -
    iPhone & iPad
    +
    +
    iPhone & iPad

    Calendars

    For iOS devices, the setup is fairly straightforward but there are a few settings that are critical for proper operation.

      @@ -613,8 +613,8 @@ After installing and accepting it you should restart your browser.

      You'll need version 0.8.1 or up for this to work. Earlier versions will forget your new settings after a reboot.

    -
    -
    OS X
    +
    +
    OS X

    Note

    This description assumes you do not have any authentication or encryption configured. If you want to use iCal with authentication or encryption, you just have to fill in the corresponding fields in your calendar's configuration.

    @@ -658,12 +658,12 @@ After installing and accepting it you should restart your browser.

    You'll need version 0.8.1 or up for this to work. Earlier versions can read CardDAV contacts but can't add new contacts.

    -
    -
    syncEvolution
    +
    +
    syncEvolution

    You can find more information about syncEvolution and Radicale on the syncEvolution wiki page.

    -
    -
    Nokia / Microsoft Windows Phones
    +
    +
    Nokia / Microsoft Windows Phones
    1. Go to "Settings" > "email+accounts"
    2. Click "add an account" > "iCloud"
    3. @@ -687,23 +687,23 @@ After installing and accepting it you should restart your browser.

    -
    -

    Complex Configuration

    +
    +

    Complex Configuration

    Note

    This section is written for Linux users, but can be easily adapted for Windows and MacOS users.

    -
    -
    Installing the Server
    +
    +
    Installing the Server

    You can install Radicale thanks to the following command, with superuser rights:

    python setup.py install

    Then, launching the server can be easily done by typing as a normal user:

    radicale
    -
    -
    Configuring the Server
    -
    -
    Main Configuration File
    +
    +
    Configuring the Server
    +
    +
    Main Configuration File

    Note

    This section is following the latest stable version changes. Please look at the default configuration file included in your package if you have an older version of Radicale.

    @@ -891,8 +891,8 @@ After installing and accepting it you should restart your browser.

    #Access-Control-Allow-Origin = *

    This configuration file is read each time the server is launched. If some values are not given, the default ones are used. If no configuration file is available, all the default values are used.

    -
    -
    Logging Configuration File
    +
    +
    Logging Configuration File

    Radicale uses the default logging facility for Python. The default configuration prints the information messages to the standard output. It is possible to print debug messages thanks to:

    radicale --debug

    Radicale can also be configured to send the messages to the console, logging files, syslog, etc. For more information about the syntax of the configuration file, see: http://docs.python.org/library/logging.config.html. Here is an example of logging configuration file:

    @@ -945,18 +945,18 @@ After installing and accepting it you should restart your browser.

    # Full output format format = %(asctime)s - %(levelname)s: %(message)s
    -
    -
    Command Line Options
    +
    +
    Command Line Options

    All the options of the server part can be changed with command line options. These options are available by typing:

    radicale --help
    -
    -
    WSGI, CGI and FastCGI
    +
    +
    WSGI, CGI and FastCGI

    Radicale comes with a WSGI support, allowing the software to be used behind any HTTP server supporting WSGI such as Apache.

    Moreover, it is possible to use flup to wrap Radicale into a CGI, FastCGI, SCGI or AJP application, and therefore use it with Lighttpd, Nginx or even Tomcat.

    -
    -
    Apache and mod_wsgi
    +
    +
    Apache and mod_wsgi

    To use Radicale with Apache's mod_wsgi, you first have to install the Radicale module in your Python path and write your .wsgi file (in /var/www for example):

    import radicale
     radicale.log.start()
    @@ -1017,8 +1017,8 @@ After installing and accepting it you should restart your browser.

    -
    -
    Authentication
    +
    +
    Authentication

    Authentication is possible through:

    • Courier-Authdaemon socket
    • @@ -1030,34 +1030,34 @@ After installing and accepting it you should restart your browser.

    • Remote user given by HTTP server

    Check the [auth] section of your configuration file to know the different options offered by these authentication modules.

    -

    Some authentication methods need additional modules, see Python Versions and OS Support for further information.

    +

    Some authentication methods need additional modules, see Python Versions and OS Support for further information.

    You can also write and use a custom module handle authentication if you use a different technology.

    Please note that these modules have not been verified by security experts. If you need a really secure way to handle authentication, you should put Radicale behind a real HTTP server and use its authentication and rights management methods.

    -
    -
    Rights Management
    +
    +
    Rights Management

    You can set read and write rights for collections according to the authenticated user and the owner of the collection.

    The owner of a collection is determined by the URL of the collection. For example, http://my.server.com:5232/anna/calendar.ics/ is owned by the user called anna.

    The authenticated user is the login used for authentication.

    5 different configurations are available, you can choose the one you want in your configuration file. You can also write and use a custom module handle rights management if you need a specific pattern.

    -
    -
    None
    +
    +
    None

    Everybody (including anonymous users) has read and write access to all collections.

    -
    -
    Authenticated
    +
    +
    Authenticated

    An authenticated users has read and write access to all collections, anonymous users have no access to these collections.

    -
    -
    Owner Only
    +
    +
    Owner Only

    Only owners have read and write access to their own collections. The other users, authenticated or anonymous, have no access to these collections.

    -
    -
    Owner Write
    +
    +
    Owner Write

    Authenticated users have read access to all collections, but only owners have write access to their own collections. Anonymous users have no access to collections.

    -
    -
    From File
    +
    +
    From File

    Rights are based on a regex-based file whose name is specified in the config (section "right", key "file").

    Authentication login is matched against the "user" key, and collection's path is matched against the "collection" key. You can use Python's ConfigParser interpolation values %(login)s and %(path)s. You can also get groups from the user regex in the collection with {0}, {1}, etc.

    For example, for the "user" key, ".+" means "authenticated user" and ".*" means "anybody" (including anonymous users).

    @@ -1106,15 +1106,15 @@ After installing and accepting it you should restart your browser.

    permission: w
    -
    -
    Git Support
    +
    +
    Git Support

    Note

    If the project doesn't comply with the requirements to use Git, Radicale will still work. Your collections will run fine but without the versionning system.

    Git is now automatically supported on Radicale. It depends on dulwich.

    -
    -
    Configure Radicale
    +
    +
    Configure Radicale

    Radicale automatically detects the .git folder in the path you configured for the filesystem_folder variable in the [storage] section of your configuration file. Make sure a repository is created at this location or create one (using git init . for instance) else it won't work.

    To summarize :

      @@ -1124,95 +1124,95 @@ After installing and accepting it you should restart your browser.

    • Run Radicale and it should work
    -
    -
    How it works
    +
    +
    How it works

    Radicale will automatically commit any changes on your collections. It will use your git config to find parameters such as the committer and that's all.

    -
    -
    Issues
    +
    +
    Issues

    A dulwich project ported on Python 3 exists but it seems that it doesn't follow the current api (committer is mandatory and not retrieved from the git config by default). Until this problem isn't fixed, the Git support for Radicale on Python 3 will not be ensured.

    -
    -

    Python Versions and OS Support

    -
    -
    TLS Support
    +
    +

    Python Versions and OS Support

    +
    +
    TLS Support

    Python 2.6 suffered a bug causing huge timeout problems with TLS. The bug is fixed since Python 2.6.6.

    IMAP authentication over TLS requires Python 3.2.

    Python 2.7 and Python 3.x do not suffer this bug.

    -
    -
    Crypt Support
    +
    +
    Crypt Support

    With the htpasswd access, many encryption methods are available, and crypt is the default one in Radicale. Unfortunately, the crypt module is unavailable on Windows, you have to pick another method on this OS.

    Additional md5 and bcrypt methods are available when the passlib module is installed.

    -
    -
    IMAP Authentication
    +
    +
    IMAP Authentication

    The IMAP authentication module relies on the imaplib module, available with 2.x versions of Python. However, TLS is only available in Python 3.2. Older versions of Python or a non-modern server who does not support STARTTLS can only authenticate against localhost as passwords are transmitted in PLAIN. Legacy SSL mode on port 993 is not supported.

    -
    -
    LDAP Authentication
    +
    +
    LDAP Authentication

    The LDAP authentication module relies on the python-ldap module, and thus only works with 2.x versions of Python.

    -
    -
    PAM Authentication
    +
    +
    PAM Authentication

    The PAM authentication module relies on the python-pam module.

    Bear in mind that on Linux systems, if you're authenticating against PAM files (i.e. /etc/shadow), the user running Radicale must have the right permissions. For instance, you might want to add the radicale user to the shadow group.

    -
    -
    HTTP Authentication
    +
    +
    HTTP Authentication

    The HTTP authentication module relies on the requests module.

    -
    -
    Daemon Mode
    +
    +
    Daemon Mode

    The daemon mode relies on forks, and thus only works on Unix-like OSes (incuding Linux, OS X, BSD).

    -
    -

    Project Description

    -
    -

    Main Goals

    +
    +

    Project Description

    +
    +

    Main Goals

    The Radicale Project is a complete calendar and contact storing and manipulating solution. It can store multiple calendars and multiple address books.

    Calendar and contact manipulation is available from both local and distant accesses, possibly limited through authentication policies.

    -
    -

    What Radicale Is

    -
    -
    Calendar and Contact Server
    +
    +

    What Radicale Is

    +
    +
    Calendar and Contact Server

    The Radicale Project is mainly a calendar and contact server, giving local and distant access for reading, creating, modifying and deleting multiple calendars through simplified CalDAV and CardDAV protocols.

    Data can be encrypted by SSL, and their access can be restricted using different authentication methods.

    -
    -

    What Radicale Is not and will not Be

    -
    -
    Calendar or Contact User Agent
    -

    Radicale is a server, not a client. No interfaces will be created to work with the server, as it is a really (really really) much more difficult task[3].

    +
    +

    What Radicale Is not and will not Be

    +
    +
    Calendar or Contact User Agent
    +

    Radicale is a server, not a client. No interfaces will be created to work with the server, as it is a really (really really) much more difficult task[3].

    -
    -
    Original Calendar or Contact Access Protocol
    -

    CalDAV and CardDAV are not perfect protocols. We think that their main problem is their complexity[4], that is why we decided not to implement the whole standard but just enough to understand some of its client-side implementations [5].

    -

    CalDAV and CardDAV are the best open standards available and they are quite widely used by both clients and servers[6]. We decided to use it, and we will not use another one.

    +
    +
    Original Calendar or Contact Access Protocol
    +

    CalDAV and CardDAV are not perfect protocols. We think that their main problem is their complexity[4], that is why we decided not to implement the whole standard but just enough to understand some of its client-side implementations [5].

    +

    CalDAV and CardDAV are the best open standards available and they are quite widely used by both clients and servers[6]. We decided to use it, and we will not use another one.

    -
    -

    Technical Choices

    -
    -

    Global Technical Choices

    -
    -
    General Description
    +
    +

    Technical Choices

    +
    +

    Global Technical Choices

    +
    +
    General Description

    The Radicale Project aims to be a light solution, easy to use, easy to install, easy to configure. As a consequence, it requires few software dependencies and is pre-configured to work out-of-the-box.

    The Radicale Project runs on most of the UNIX-like platforms (Linux, *BSD, MacOS X) and Windows. It is free and open-source software.

    -
    -
    Language
    +
    +
    Language

    The different parts of the Radicale Project are written in Python. This is a high-level language, fully object-oriented, available for the main operating systems and released with a lot of useful libraries.

    -
    -
    Protocols and Formats
    +
    +
    Protocols and Formats

    The main protocols and formats fully or partially implemented in the Radicale Project are described by RFCs:

    • HyperText Transfer Protocol (HTTP) RFC 2616
    • @@ -1226,37 +1226,37 @@ After installing and accepting it you should restart your browser.

    Note

    -

    CalDAV and CardDAV implementations require iCal, vCard, ACL, WebDAV, HTTP and TLS. The Radicale Server does not and will not implement correctly these standards, as explained in the Development Choices part.

    +

    CalDAV and CardDAV implementations require iCal, vCard, ACL, WebDAV, HTTP and TLS. The Radicale Server does not and will not implement correctly these standards, as explained in the Development Choices part.

    -
    -
    Development Choices
    +
    +
    Development 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 features and use cases, but it is quite hard to implement fully.

    -

    Some calendar servers have been created to follow the CalDAV and CardDAV RFCs as much as possible: Davical[7], Cosmo[8] and Darwin Calendar Server[9], for example, are much more respectful of CalDAV and CardDAV and can be used with a large number of clients. They are very good choices if you want to develop and test new CalDAV clients, or if you have a possibly heterogeneous list of user agents.

    +

    Some calendar servers have been created to follow the CalDAV and CardDAV RFCs as much as possible: Davical[7], Cosmo[8] and Darwin Calendar Server[9], for example, are much more respectful of CalDAV and CardDAV and can be used with a large number of clients. They are very good choices if you want to develop and test new CalDAV clients, or if you have a possibly heterogeneous list of user agents.

    The Radicale Server does not and will not support the CalDAV and CardDAV standards. It supports the CalDAV and CardDAV implementations of different clients (Lightning, Evolution, Android, iPhone, iCal, and more).

    -
    -
    Simple
    +
    +
    Simple

    The Radicale Server is designed to be simple to install, simple to configure, simple to use.

    The installation is very easy, particularly with Linux: no dependencies, no superuser rights needed, no configuration required. Launching the main script out-of-the-box, as a normal user, is often the only step to have a simple remote calendar and contact access.

    -

    Contrary to other servers that are often complicated, require high privileges or need a strong configuration, the Radicale Server can (sometimes, if not often) be launched in a couple of minutes, if you follow the User Documentation.

    +

    Contrary to other servers that are often complicated, require high privileges or need a strong configuration, the Radicale Server can (sometimes, if not often) be launched in a couple of minutes, if you follow the User Documentation.

    -
    -
    Lazy
    -

    We, Radicale Project developers, are lazy. That is why we have chosen Python: no more ; or {}[10]. This is also why our server is lazy.

    +
    +
    Lazy
    +

    We, Radicale Project developers, are lazy. That is why we have chosen Python: no more ; or {}[10]. This is also why our server is 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 behaviours are given in such cases.

    The Radicale Server assumes that the clients are perfect and that protocol 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.

    As already mentioned, the Radicale server doesn't fully support the CalDAV and CardDAV RFCs. For example, nested filters in queries currently don't work in all cases. Examples of not working queries can be found in issues #120 and #121.

    -
    -

    Architectures

    -
    -
    General Architecture
    +
    +

    Architectures

    +
    +
    General Architecture

    Here is a simple overview of the global architecture for reaching a calendar through network:

    @@ -1294,8 +1294,8 @@ After installing and accepting it you should restart your browser.

    The Radicale Project is only the server part of this architecture.

    -
    -
    Code Architecture
    +
    +
    Code Architecture

    The package offers 8 modules.

    • __main__
      @@ -1322,34 +1322,34 @@ This folder is a set of storage modules able to read and write collections. Curr

    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.

    -
    -

    Hack

    +
    +

    Hack

    Interested in hacking? Feel free to clone the git repository on Github if you want to add new features, fix bugs or update documentation.

    Download

    -
    -

    PyPI

    +
    +

    PyPI

    Radicale is available on PyPI. To install, just type as superuser:

    pip install radicale==1.1.*
    -
    -

    Git Repository

    +
    +

    Git Repository

    If you want the development version of Radicale, take a look at the git repository on GitHub, or clone it thanks to:

    git clone git://github.com/Kozea/Radicale.git

    You can also download the Radicale package of the git repository.

    -
    -

    Source Packages

    +
    +

    Source Packages

    You can download the Radicale package for each release:

    -
    -

    Linux Distribution Packages

    +
    +

    Linux Distribution Packages

    Radicale has been packaged for:

    • ArchLinux (AUR) by Guillaume Bouchard
    • @@ -1400,73 +1400,73 @@ This folder is a set of storage modules able to read and write collections. Curr

    News

    -
    -

    May 19, 2020 - Radicale 1.1.7

    +
    +

    May 19, 2020 - Radicale 1.1.7

    Radicale 1.1.7 is out!

    -
    -

    1.1.7 - Third Law of Nature

    +
    +

    1.1.7 - Third Law of Nature

    • Fix error in --export-storage
    • Include documentation in source archive
    -
    -

    Jul 24, 2017 - Radicale 1.1.6

    +
    +

    Jul 24, 2017 - Radicale 1.1.6

    Radicale 1.1.6 is out!

    -
    -

    1.1.6 - Third Law of Nature

    +
    +

    1.1.6 - Third Law of Nature

    • Improve logging for --export-storage
    -
    -

    Jul 24, 2017 - Radicale 1.1.5

    +
    +

    Jul 24, 2017 - Radicale 1.1.5

    Radicale 1.1.5 is out!

    -
    -

    1.1.5 - Third Law of Nature

    +
    +

    1.1.5 - Third Law of Nature

    • Improve logging for --export-storage
    -
    -

    Jun 25, 2017 - Radicale 1.1.4

    +
    +

    Jun 25, 2017 - Radicale 1.1.4

    Radicale 1.1.4 is out!

    -
    -

    1.1.4 - Third Law of Nature

    +
    +

    1.1.4 - Third Law of Nature

    • Use shutil.move for --export-storage
    -
    -

    May 27, 2017 - Radicale 1.1.3

    +
    +

    May 27, 2017 - Radicale 1.1.3

    Radicale 1.1.3 is out!

    -
    -

    1.1.3 - Third Law of Nature

    +
    +

    1.1.3 - Third Law of Nature

    • Add a --export-storage=FOLDER command-line argument (by Unrud, see #606)
    -
    -

    April 19, 2017 - Radicale 1.1.2

    +
    +

    April 19, 2017 - Radicale 1.1.2

    Radicale 1.1.2 is out!

    -
    -

    1.1.2 - Third Law of Nature

    +
    +

    1.1.2 - Third Law of Nature

    • Security fix: Add a random timer to avoid timing oracles and simple bruteforce attacks when using the htpasswd authentication method.
    • Various minor fixes.
    -
    -

    December 31, 2015 - Radicale 1.1

    +
    +

    December 31, 2015 - Radicale 1.1

    Radicale 1.1 is out!

    -
    -

    1.1 - Law of Nature

    +
    +

    1.1 - Law of Nature

    One feature in this release is not backward compatible:

    • Use the first matching section for rights (inspired from daald)
    • @@ -1490,11 +1490,11 @@ This folder is a set of storage modules able to read and write collections. Curr
    -
    -

    September 14, 2015 - Radicale 1.0, what's next?

    +
    +

    September 14, 2015 - Radicale 1.0, what's next?

    Radicale 1.0 is out!

    -
    -

    1.0 - Sunflower

    +
    +

    1.0 - Sunflower

    • Enhanced performances (by Mathieu Dupuy)
    • Add MD5-APR1 and BCRYPT for htpasswd-based authentication (by Jan-Philip Gehrcke)
    • @@ -1536,11 +1536,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      Need to talk about this? You know how to contact us!

    -
    -

    January 12, 2015 - Radicale 0.10

    +
    +

    January 12, 2015 - Radicale 0.10

    Radicale 0.10 is out!

    -
    -

    0.10 - Lovely Endless Grass

    +
    +

    0.10 - Lovely Endless Grass

    • Support well-known URLs (by Mathieu Dupuy)
    • Fix collection discovery (by Markus Unterwaditzer)
    • @@ -1555,11 +1555,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      What's next? It's time to fix and improve the storage methods. A real API for the storage modules is a good beginning, many pull requests are already ready to be discussed and merged, and we will probably get some good news about performance this time. Who said "databases, please"?

    -
    -

    July 12, 2013 - Radicale 0.8

    +
    +

    July 12, 2013 - Radicale 0.8

    Radicale 0.8 is out!

    -
    -

    0.8 - Rainbow

    +
    +

    0.8 - Rainbow

    • New authentication and rights management modules (by Matthias Jordan)
    • Experimental database storage
    • @@ -1579,11 +1579,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      It has been a real pleasure to work on this version, with brilliant ideas and interesting bug reports from the community. I'd really like to thank all the people reporting bugs, chatting on IRC, sending mails and proposing pull requests: you are awesome.

    -
    -

    August 3, 2012 - Radicale 0.7.1

    +
    +

    August 3, 2012 - Radicale 0.7.1

    Radicale 0.7.1 is out!

    -
    -

    0.7.1 - Waterfalls

    +
    +

    0.7.1 - Waterfalls

    • Many address books fixes
    • New IMAP ACL (by Daniel Aleksandersen)
    • @@ -1598,11 +1598,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      Next time, as many mails have come from angry and desperate coders, tests will be finally added to help them to add features and fix bugs. And after that, who knows, it may be time to release Radicale 1.0…

    -
    -

    March 22, 2012 - Radicale 0.7

    +
    +

    March 22, 2012 - Radicale 0.7

    Radicale 0.7 is out, at least!

    -
    -

    0.7 - Eternal Sunshine

    +
    +

    0.7 - Eternal Sunshine

    • Repeating events
    • Collection deletion
    • @@ -1613,47 +1613,47 @@ This folder is a set of storage modules able to read and write collections. Curr

      A lot of people have reported bugs, proposed new features, added useful code and tested many clients. Thank you Lynn, Ron, Bill, Patrick, Hidde, Gerhard, Martin, Brendan, Vladimir, and everybody I've forgotten.

    -
    -

    January 5, 2012 - Radicale 0.6.4, News from Calypso

    +
    +

    January 5, 2012 - Radicale 0.6.4, News from Calypso

    New year, new release. Radicale 0.6.4 has a really short changelog:

    -
    -

    0.6.4 - Tulips

    +
    +

    0.6.4 - Tulips

    • Fix the installation with Python 3.1

    The bug was in fact caused by a bug in Python 3.1, everything should be OK now.

    -
    -

    Calypso

    +
    +

    Calypso

    After a lot of changes in Radicale, Keith Packard has decided to launch a fork called Calypso, with nice features such as a Git storage mechanism and a CardDAV support.

    There are lots of differences between the two projects, but the final goal for Radicale is to provide these new features as soon as possible. Thanks to the work of Keith and other people on GitHub, a basic CardDAV support has been added in the carddav branch and already works with Evolution. Korganizer also works with existing address books, and CardDAV-Sync will be tested soon. If you want to test other clients, please let us know!

    -
    -

    November 3, 2011 - Radicale 0.6.3

    +
    +

    November 3, 2011 - Radicale 0.6.3

    Radicale version 0.6.3 has been released, with bugfixes that could be interesting for you!

    -
    -

    0.6.3 - Red Roses

    +
    +

    0.6.3 - Red Roses

    • MOVE requests fixed
    • Faster REPORT answers
    • Executable script moved into the package
    -
    -

    What's New Since 0.6.2?

    +
    +

    What's New Since 0.6.2?

    The MOVE requests were suffering a little bug that is fixed now. These requests are only sent by Apple clients, Mac users will be happy.

    The REPORT request were really, really slow (several minutes for large calendars). This was caused by an awful algorithm parsing the entire calendar for each event in the calendar. The calendar is now only parsed three times, and the events are found in a Python list, turning minutes into seconds! Much better, but far from perfection…

    Finally, the executable script parsing the command line options and starting the HTTP servers has been moved from the radicale.py file into the radicale package. Two executable are now present in the archive: the good old radicale.py, and bin/radicale. The second one is only used by setup.py, where the hack used to rename radicale.py into radicale has therefore been removed. As a consequence, you can now launch Radicale with the simple python -m radicale command, without relying on an executable.

    -
    -

    Time for a Stable Release!

    +
    +

    Time for a Stable Release!

    The next release may be a stable release, symbolically called 1.0. Guess what's missing? Tests, of course!

    A non-regression testing suite, based on the clients' requests, will soon be added to Radicale. We're now thinking about a smart solution to store the tests, to represent the expected answers and to launch the requests. We've got crazy ideas, so be prepared: you'll definitely want to write tests during the next weeks!

    Repeating events, PAM and Courier authentication methods have already been added in master. You'll find them in the 1.0 release!

    -
    -

    What's Next?

    +
    +

    What's Next?

    Being stable is one thing, being cool is another one. If you want some cool new features, you may be interested in:

    • WebDAV and CardDAV support
    • @@ -1665,11 +1665,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      Issues have been reported in the bug tracker, you can follow there the latest news about these features. Your beloved text editor is waiting for you!

    -
    -

    September 27, 2011 - Radicale 0.6.2

    +
    +

    September 27, 2011 - Radicale 0.6.2

    0.6.2 is out with minor bugfixes.

    -
    -

    0.6.2 - Seeds

    +
    +

    0.6.2 - Seeds

    • iPhone and iPad support fixed
    • Backslashes replaced by slashes in PROPFIND answers on Windows
    • @@ -1677,11 +1677,11 @@ This folder is a set of storage modules able to read and write collections. Curr
    -
    -

    August 28, 2011 - Radicale 0.6.1, Changes, Future

    +
    +

    August 28, 2011 - Radicale 0.6.1, Changes, Future

    As previously imagined, a new 0.6.1 version has been released, mainly fixing obvious bugs.

    -
    -

    0.6.1 - Growing Up

    +
    +

    0.6.1 - Growing Up

    • Example files included in the tarball
    • htpasswd support fixed
    • @@ -1691,14 +1691,14 @@ This folder is a set of storage modules able to read and write collections. Curr

      The changelog is really small, so there should be no real new problems since 0.6. The example files for logging, FastCGI and WSGI are now included in the tarball, for the pleasure of our dear packagers!

      A new branch has been created for various future bug fixes. You can expect to get more 0.6.x versions, making this branch a kind of "stable" branch with no big changes.

    -
    -

    GitHub, Mailing List, New Website

    +
    +

    GitHub, Mailing List, New Website

    A lot of small changes occurred during the last weeks.

    If you're interested in code and new features, please note that we moved the project from Gitorious to GitHub. Being hosted by Gitorious was a nice experience, but the service was not that good and we were missing some useful features such as git hooks. Moreover, GitHub is really popular, we're sure that we'll meet a lot of kind users and coders there.

    We've also created a mailing-list on Librelist to keep a public trace of the mails we're receiving. It a bit empty now, but we're sure that you'll soon write us some kind words. For example, you can tell us what you think of our new website!

    -
    -

    Future Features

    +
    +

    Future Features

    In the next weeks, new exciting features are coming in the master branch! Some of them are almost ready:

    • Henry-Nicolas has added the support for the PAM and Courier-Authdaemon authentication mechanisms.
    • @@ -1707,11 +1707,11 @@ This folder is a set of storage modules able to read and write collections. Curr

      As you can find in the Radicale Roadmap, tests, rights and filters are expected for 0.7.

    -
    -

    August 1, 2011 - Radicale 0.6 Released

    +
    +

    August 1, 2011 - Radicale 0.6 Released

    Time for a new release with a lot of new exciting features!

    -
    -

    0.6 - Sapling

    +
    +

    0.6 - Sapling

    • WSGI support
    • IPv6 support
    • @@ -1733,22 +1733,22 @@ This folder is a set of storage modules able to read and write collections. Curr

      Because of all these changes, Radicale 0.6 may be a little bit buggy; a 0.6.1 will probably be released soon, fixing small problems with clients and features. Get ready to report bugs, I'm sure that you can find one (and fix it)!

    -
    -

    July 2, 2011 - Feature Freeze for 0.6

    +
    +

    July 2, 2011 - Feature Freeze for 0.6

    According to the roadmap, a lot of features have been added since Radicale 0.5, much more than expected. It's now time to test Radicale with your favourite client and to report bugs before we release the next stable version!

    Last week, the iCal and iPhone support written by Łukasz has been fixed in order to restore the broken Lightning support. After two afternoons of tests with Rémi, we managed to access the same calendar with Lightning, iCal, iPhone and Evolution, and finally discovered that CalDAV could also be a perfect instant messaging protocol between a Mac, a PC and a phone.

    After that, we've had the nice surprise to see events displayed without a problem (but after some strange steps of configuration) by aCal on Salem's Android phone.

    It was Friday, fun fun fun fun.

    So, that's it: Radicale supports Lightning, Evolution, Kontact, aCal for Android, iPhone and iCal. Of course, before releasing a new tarball:

      -
    • documentation is needed for the new clients that are not documented yet (Kontact, aCal and iPhone);
    • +
    • documentation is needed for the new clients that are not documented yet (Kontact, aCal and iPhone);
    • tests are welcome, particularly for the Apple clients that I can't test anymore;
    • no more features will be added, they'll wait in separate branches for the 0.7 development.

    Please report bugs if anything goes wrong during your tests, or just let us know by Jabber or by mail if everything is OK.

    -
    -

    May 1, 2011 - Ready for WSGI

    +
    +

    May 1, 2011 - Ready for WSGI

    Here it is! Radicale is now ready to be launched behind your favourite HTTP server (Apache, Lighttpd, Nginx or Tomcat for example). That's really good news, because:

    • Real HTTP servers are much more efficient and reliable than the default Python server used in Radicale;
    • @@ -1760,37 +1760,37 @@ This folder is a set of storage modules able to read and write collections. Curr

      The WSGI support has only be tested as a stand-alone executable and behind Lighttpd, you should definitely try if it works with you favourite server too!

      No more features will be added before (quite) a long time, because a lot of documentation and test is waiting for us. If you want to write tutorials for some CalDAV clients support (iCal, Android, iPhone), HTTP servers support or logging management, feel free to fork the documentation git repository and ask for a merge. It's plain text, I'm sure you can do it!

    -
    -

    April 30, 2011 - Apple iCal Support

    +
    +

    April 30, 2011 - Apple iCal Support

    After a long, long work, the iCal support has finally been added to Radicale! Well, this support is only for iCal 4 and is highly experimental, but you can test it right now with the git master branch. Bug reports are welcome!

    Dear MacOS users, you can thank all the gentlemen who sended a lot of debugging iformation. Special thanks to Andrew from DAViCal, who helped us a lot with his tips and his tests, and Rémi Hainaud who lent his laptop for the final tests.

    The default server address is localhost:5232/user/, where calendars can be added. Multiple calendars and owner-less calendars are not tested yet, but they should work quite well. More documentation will be added during the next days. It will then be time to release the Radicale 0.6 version, and work on the WSGI support.

    -
    -

    April 25, 2011 - Two Features and One New Roadmap

    +
    +

    April 25, 2011 - Two Features and One New Roadmap

    Two features have just reached the master branch, and the roadmap has been refreshed.

    -
    -

    LDAP Authentication

    +
    +

    LDAP Authentication

    Thanks to Corentin, the LDAP authentication is now included in Radicale. The support is experimental and may suffer unstable connexions and security problems. If you are interested in this feature (a lot of people seem to be), you can try it and give some feedback.

    No SSL support is included yet, but this may be quite easy to add. By the way, serious authentication methods will rely on a "real" HTTP server, as soon as Radicale supports WSGI.

    -
    -

    Journal Entries

    +
    +

    Journal Entries

    Mehmet asked for the journal entries (aka. notes or memos) support, that's done! This also was an occasion to clean some code in the iCal parser, and to add a much better management of multi-lines entries. People experiencing crazy X-RADICALE-NAME entries can now clean their files, Radicale won't pollute them again.

    -
    -

    New Roadmap

    +
    +

    New Roadmap

    Except from htpasswd and LDAP, most of the authentication backends (database, SASL, PAM, user groups) are not really easy to include in Radicale. The easiest solution to solve this problem is to give Radicale a CGI support, to put it behind a solid server such as Apache. Of course, CGI is not enough: a WSGI support is quite better, with the FastCGI, AJP and SCGI backends offered by flup. Quite exciting, isn't it?

    That's why it was important to add new versions on the roadmap. The 0.6 version is now waiting for the Apple iCal support, and of course for some tests to kill the last remaining bugs. The only 0.7 feature will be WSGI, allowing many new authentication methods and a real multithread support.

    After that, 0.8 may add CalDAV rights and filters, while 1.0 will draw thousands of rainbows and pink unicorns (WebDAV sync, CardDAV, Freebusy). A lot of funky work is waiting for you, hackers!

    -
    -

    Bugs

    +
    +

    Bugs

    Many bugs have also been fixed, most of them due to the owner-less calendars support. Radicale 0.6 may be out in a few weeks, you should spend some time testing the master branch and filling the bug tracker.

    -
    -

    April 10, 2011 - New Features

    +
    +

    April 10, 2011 - New Features

    Radicale 0.5 was released only 8 days ago, but 3 new features have already been added to the master branch:

    • IPv6 support, with multiple addresses/ports support
    • @@ -1799,11 +1799,11 @@ This folder is a set of storage modules able to read and write collections. Curr

    Most of the code has been written by Necoro and Corentin, and that was not easy at all: Radicale is now multithreaded! For sure, you can find many bugs and report them on the bug tracker. And if you're fond of logging, you can even add a default configuration file and more debug messages in the source.

    -
    -

    April 2, 2011 - Radicale 0.5 Released

    +
    +

    April 2, 2011 - Radicale 0.5 Released

    Radicale 0.5 is out! Here is what's new:

    -
    -

    0.5 - Historical Artifacts

    +
    +

    0.5 - Historical Artifacts

    • Calendar depth
    • iPhone support
    • @@ -1815,24 +1815,24 @@ This folder is a set of storage modules able to read and write collections. Curr

      So, what's next? As promised, some cool git branches will soon be merged, with LDAP support, logging, IPv6 and anonymous calendars. Sounds pretty cool, heh? Talking about new features, more and more people are asking for a CardDAV support in Radicale. A git branch and a feature request are open, feel free to hack and discuss.

    -
    -

    February 3, 2011 - Jabber Room and iPhone Support

    -

    After a lot of help and testing work from Andrew, Björn, Anders, Dorian and Pete (and other ones we could have forgotten), a simple iPhone support has been added in the git repository. If you are interested, you can test this feature right now by downloading the latest git version (a tarball is even available too if you don't want or know how to use git).

    +
    +

    February 3, 2011 - Jabber Room and iPhone Support

    +

    After a lot of help and testing work from Andrew, Björn, Anders, Dorian and Pete (and other ones we could have forgotten), a simple iPhone support has been added in the git repository. If you are interested, you can test this feature right now by downloading the latest git version (a tarball is even available too if you don't want or know how to use git).

    No documentation has been written yet, but using the right URL in the configuration should be enough to synchronize your calendars. If you have any problems, you can ask by joining our new Jabber room: radicale@room.jabber.kozea.fr.

    Radicale 0.5 will be released as soon as the iCal support is ready. If you have an Apple computer, Python skills and some time to spend, we'd be glad to help you debugging Radicale.

    -
    -

    October 21, 2010 - News from Radicale

    +
    +

    October 21, 2010 - News from Radicale

    During the last weeks, Radicale has not been idle, even if no news have been posted since August. Thanks to Pete, Pierre-Philipp and Andrew, we're trying to add a better support on MacOS, Windows and mobile devices like iPhone and Android-based phones.

    All the tests on Windows have been successful: launching Radicale and using Lightning as client works without any problems. On Android too, some testers have reported clients working with Radicale. These were the good news.

    The bad news come from Apple: both iPhone and MacOS default clients are not working yet, despite the latest enhancements given to the PROPFIND requests. The problems are quite hard to debug due to our lack of Apple hardware, but Pete is helping us in this difficult quest! Radicale 0.5 will be out as soon as these two clients are working.

    Some cool stuff is coming next, with calendar collections and groups, and a simple web-based CalDAV client in early development. Stay tuned!

    -
    -

    August 8, 2010 - Radicale 0.4 Released

    +
    +

    August 8, 2010 - Radicale 0.4 Released

    Radicale 0.4 is out! Here is what's new:

    -
    -

    0.4 - Hot Days Back

    +
    +

    0.4 - Hot Days Back

    • Personal calendars
    • HEAD requests
    • @@ -1843,8 +1843,8 @@ This folder is a set of storage modules able to read and write collections. Curr

      This release has mainly been released to help our dear packagers to include a default configuration file and to write init scripts. Big thanks to Necoro for his work on the new Gentoo ebuild!

    -
    -

    July 4, 2010 - Three Features Added Last Week

    +
    +

    July 4, 2010 - Three Features Added Last Week

    Some features have been added in the git repository during the last weeks, thanks to Jerome and Mariusz!

    • Personal Calendars
      @@ -1855,11 +1855,11 @@ Radicale can now answer HEAD requests. HTTP headers can be retrieved thanks to t The Last-Modified header gives the last time when the calendar has been modified. This is used by some clients to cache the calendars and not retrieving them if they have not been modified.

    -
    -

    June 14, 2010 - Radicale 0.3 Released

    +
    +

    June 14, 2010 - Radicale 0.3 Released

    Radicale 0.3 is out! Here is what’s new:

    -
    -

    0.3 - Dancing Flowers

    +
    +

    0.3 - Dancing Flowers

    • Evolution support
    • Version management
    • @@ -1869,29 +1869,29 @@ The Last-Modified header gives the last time when the calendar has been modified

      Next step is 0.5, with calendar collections, and Windows and MacOS support.

    -
    -

    May 31, 2010 - May News

    -
    -

    News from contributors

    +
    +

    May 31, 2010 - May News

    +
    +

    News from contributors

    Jonas Smedegaard packaged Radicale for Debian last week. Two packages, called radicale for the daemon and python-radicale for the module, have been added to Sid, the unstable branch of Debian. Thank you, Jonas!

    Sven Guckes corrected some of the strange-English-sentences present on this website. Thank you, Sven!

    -
    -

    News from software

    +
    +

    News from software

    A simple VERSION has been added in the library: you can now play with radicale.VERSION and $radicale --version.

    After playing with the version (should not be too long), you may notice that the next version is called 0.3, and not 0.5 as previously decided. The 0.3 main goal is to offer the support for Evolution as soon as possible, without waiting for the 0.5. After more than a month of test, we corrected all the bugs we found and everything seems to be fine; we can imagine that a brand new tarball will be released during the first days of June.

    -
    -

    April 19, 2010 - Evolution Supported

    +
    +

    April 19, 2010 - Evolution Supported

    Radicale now supports another CalDAV client: Evolution, the default mail, addressbook and calendaring client for Gnome. This feature was quite easy to add, as it required less than 20 new lines of code in the requests handler.

    If you are interested, just clone the git repository.

    -
    -

    April 13, 2010 - Radicale 0.2 Released

    +
    +

    April 13, 2010 - Radicale 0.2 Released

    Radicale 0.2 is out! Here is what’s new:

    -
    -

    0.2 - Snowflakes

    +
    +

    0.2 - Snowflakes

    • Sunbird pre-1.0 support
    • SSL connection
    • @@ -1909,8 +1909,8 @@ The Last-Modified header gives the last time when the calendar has been modified

      You may have noticed too that Radicale can be downloaded from PyPI. Of course, it is also available on the download page.

    -
    -

    January 21, 2010 - HTTPS and Authentication

    +
    +

    January 21, 2010 - HTTPS and Authentication

    HTTPS connections and authentication have been added to Radicale this week. Command-line options and personal configuration files are also ready for test. According to the TODO file included in the package, the next version will finally be 0.2, when sunbird 1.0 is out. Go, Mozilla hackers, go!

    • HTTPS connection
      @@ -1919,27 +1919,27 @@ HTTPS connections are now available using the standard TLS mechanisms. Give Radi A simple authentication architecture is now available, allowing different methods thanks to different modules. The first two modules are fake (no authentication) and htpasswd (authentication with an htpasswd file created by the Apache tool). More methods such as LDAP are coming soon!

    -
    -

    January 15, 2010 - Ready for Python 3

    +
    +

    January 15, 2010 - Ready for Python 3

    Dropping Twisted dependency was the first step leading to another big feature: Radicale now works with Python 3! The code was given a small cleanup, with some simplifications mainly about encoding. Before the 0.1.1 release, feel free to test the git repository, all Python versions from 2.5 should be OK.

    -
    -

    January 11, 2010 - Twisted no Longer Required

    +
    +

    January 11, 2010 - Twisted no Longer Required

    Good news! Radicale 0.1.1 will support Sunbird 1.0, but it has another great feature: it has no external dependency! Twisted is no longer required for the git version, removing about 50 lines of code.

    -
    -

    December 31, 2009 - Lightning and Sunbird 1.0b2pre Support

    +
    +

    December 31, 2009 - Lightning and Sunbird 1.0b2pre Support

    Lightning/Sunbird 1.0b2pre is out, adding minor changes in CalDAV support. A new commit makes Radicale work with versions 0.9, 1.0b1 et 1.0b2. Moreover, etags are now quoted according to the RFC 2616.

    -
    -

    December 9, 2009 - Thunderbird 3 released

    +
    +

    December 9, 2009 - Thunderbird 3 released

    Thunderbird 3 is out, and Lightning/Sunbird 1.0 should be released in a few days. The last commit in git should make Radicale work with versions 0.9 and 1.0b1pre. Radicale 0.1.1 will soon be released adding support for version 1.0.

    -
    -

    September 1, 2009 - Radicale 0.1 Released

    +
    +

    September 1, 2009 - Radicale 0.1 Released

    First Radicale release! Here is the changelog:

    -
    -

    0.1 - Crazy Vegetables

    +
    +

    0.1 - Crazy Vegetables

    • First release
    • Lightning/Sunbird 0.9 compatibility
    • @@ -1948,55 +1948,55 @@ A simple authentication architecture is now available, allowing different method

      You can download this version on the download page.

    -
    -

    July 28, 2009 - Radicale on Gitorious

    +
    +

    July 28, 2009 - Radicale on Gitorious

    Radicale code has been released on Gitorious! Take a look at the Radicale main page on Gitorious to view and download source code.

    -
    -

    July 27, 2009 - Radicale Ready to Launch

    +
    +

    July 27, 2009 - Radicale Ready to Launch

    The Radicale Project is launched. The code has been cleaned up and will be available soon…

    Footnotes

    -
    -

    1

    -

    See Python Versions and OS Support for further information.

    +
    +

    1

    +

    See Python Versions and OS Support for further information.

    -
    -

    2

    +
    +

    2

    Python download page.

    -
    -

    3

    -

    I repeat: we are lazy.

    +
    +

    3

    +

    I repeat: we are lazy.

    -
    -

    4

    +
    +

    4

    Try to read RFC 4791. Then try to understand it. Then try to implement it. Then try to read it again.

    -
    -

    5

    -

    Radicale is oriented to calendar user agents.

    +
    +

    5

    +

    Radicale is oriented to calendar user agents.

    -
    -

    6

    +
    +

    6

    CalDAV implementations, by Wikipedia.

    -
    -

    7

    +
    +

    7

    Davical, a standards-compliant calendar server.

    -
    -

    8

    +
    +

    8

    Cosmo, the web contents and calendars sharing server build to support the Chandler Project.

    -
    -

    9

    +
    +

    9

    Darwin Calendar Server, a standards-compliant calendar server mainly developed by Apple.

    -
    -

    10

    +
    +

    10

    Who says "Ruby is even less verbose!" should read the PEP 20.

    diff --git a/v2.html b/v2.html index 2df652f3..64121f24 100644 --- a/v2.html +++ b/v2.html @@ -124,277 +124,277 @@ @@ -402,8 +402,8 @@

    Getting started

    -
    -

    About Radicale

    +
    +

    About Radicale

    Radicale is a small but powerful CalDAV (calendars, todo-lists) and CardDAV (contacts) server, that:

    • Shares calendars through CalDAV, WebDAV and HTTP.
    • @@ -417,67 +417,67 @@
    • Is GPLv3-licensed free software.
    -
    -

    Installation

    +
    +

    Installation

    Radicale is really easy to install and works out-of-the-box.

    $ python3 -m pip install --upgrade radicale==2.1.*
     $ python3 -m radicale --config "" --storage-filesystem-folder=~/.var/lib/radicale/collections

    When your server is launched, you can check that everything's OK by going to http://localhost:5232/ with your browser! You can login with any username and password.

    -

    Want more? Why don't you check our wonderful documentation?

    +

    Want more? Why don't you check our wonderful documentation?

    -
    -

    What's New?

    +
    +

    What's New?

    Latest version of Radicale is 2.1.12, released on May 19, 2020 (changelog).

    Read latest news…

    -
    -

    Documentation

    -

    This documentation page is written for version 2.x.x. If you want to update Radicale from 1.x.x to 2.x.x, please follow our migration guide. You can find on GitHub the documentation page for the 1.1.x versions.

    -
    -

    Install and Set Up

    +
    +

    Documentation

    +

    This documentation page is written for version 2.x.x. If you want to update Radicale from 1.x.x to 2.x.x, please follow our migration guide. You can find on GitHub the documentation page for the 1.1.x versions.

    +
    +

    Install and Set Up

    You're new to Radicale and you want to know how to use it? Welcome aboard!

    -
    -

    Use

    +
    +

    Use

    -
    -

    Configure

    +
    +

    Configure

    Now that you have Radicale running, let's see what we can configure to make it fit your needs.

    -
    -

    Hack

    +
    +

    Hack

    Using is fun, but hacking is soooooooo coooooool. Radicale is a really small and simple piece of code, it may be the perfect project to start hacking!

    -
    -

    Tutorial

    +
    +

    Tutorial

    You want to try Radicale but only have 5 minutes free in your calendar? Let's go right now! You won't have the best installation ever, but it will be enough to play a little bit with Radicale.

    -

    When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

    +

    When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

    Follow one of the chapters below depending on your operating system.

    -
    -

    Linux / *BSD

    +
    +

    Linux / *BSD

    First of all, make sure that python 3.3 or later (python ≥ 3.6 is recommended) and pip are installed. On most distributions it should be enough to install the package python3-pip.

    Then open a console and type:

    # Run the following command as root or
    @@ -486,8 +486,8 @@
     $ python3 -m radicale --config "" --storage-filesystem-folder=~/.var/lib/radicale/collections

    Victory! Open http://localhost:5232/ in your browser! You can login with any username and password.

    -
    -

    Windows

    +
    +

    Windows

    The first step is to install Python. Go to python.org and download the latest version of Python 3. Then run the installer. On the first window of the installer, check the "Add Python to PATH" box and click on "Install now". Wait a couple of minutes, it's done!

    Launch a command prompt and type:

    C:\Users\User> python -m pip install --upgrade radicale==2.1.*
    @@ -495,26 +495,26 @@
     

    If you are using PowerShell replace --config "" with --config '""'.

    Victory! Open http://localhost:5232/ in your browser! You can login with any username and password.

    -
    -

    MacOS

    +
    +

    MacOS

    To be written.

    -
    -

    Basic Setup

    -

    Installation instructions can be found on the Tutorial page.

    -
    -

    Configuration

    +
    +

    Basic Setup

    +

    Installation instructions can be found on the Tutorial page.

    +
    +

    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.

    You should create a new configuration file at the desired location. (If the use of a configuration file is inconvenient, all options can be passed via command line arguments.)

    -

    All configuration options are described in detail on the Configuration page.

    +

    All configuration options are described in detail on the Configuration page.

    -
    -

    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.

    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:

    # Create a new htpasswd file with the user "user1"
     $ htpasswd -B -c /path/to/users user1
    @@ -533,8 +533,8 @@
     # encryption method used in the htpasswd file
     htpasswd_encryption = bcrypt
    -
    -
    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:

    user1:password1
     user2:password2
    @@ -546,22 +546,22 @@ user2:password2 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 options:

    [server]
     hosts = 0.0.0.0:5232

    More addresses can be added (separated by commas).

    -
    -

    Storage

    +
    +

    Storage

    Data is stored in the folder /var/lib/radicale/collections. The path can be changed with the following configuration:

    [storage]
     filesystem_folder = /path/to/storage

    Security: The storage folder should not be readable by unauthorized users. Otherwise, they can read the calendar data and lock the storage. You can find OS dependent instructions in the 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 incorrect authentication attempts. Connections are terminated after a timeout. The default values should be fine for most scenarios.

    [server]
     max_connections = 20
    @@ -574,11 +574,11 @@ user2:password2
    # Average delay after failed login attempts in seconds 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 as a user
    +
    +
    Linux with systemd as a user

    Create the file ~/.config/systemd/user/radicale.service:

    [Unit]
     Description=A simple CalDAV (calendar) and CardDAV (contact) server
    @@ -600,8 +600,8 @@ user2:password2
    # View all log messages $ journalctl --user --unit radicale.service
    -
    -
    Linux with systemd system-wide
    +
    +
    Linux with systemd system-wide

    Create the radicale user and group for the Radicale service. (Run useradd --system --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.)

    Security: The storage should not be readable by others. (Run chmod -R o= /var/lib/radicale/collections as root.)

    Create the file /etc/systemd/system/radicale.service:

    @@ -641,19 +641,19 @@ user2:password2 $ journalctl --unit radicale.service
    -
    -

    MacOS with launchd

    +
    +

    MacOS with launchd

    To be written.

    -
    -

    Classic daemonization

    +
    +

    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.

    +

    After daemonization the server will not log anything. You have to configure 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"

    +
    +

    Windows with "NSSM - the Non-Sucking Service Manager"

    First install NSSM and start nssm install in a command prompt. Apply the following configuration:

    • Service name: Radicale
    • @@ -672,8 +672,8 @@ user2:password2

      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 from the URL path that is forwarded to Radicale.

    Example nginx configuration:

    location /radicale/ { # The trailing / is important!
    @@ -692,8 +692,8 @@ user2:password2
    RequestHeader set X-Script-Name /radicale/ </Location>

    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. Radicale uses the user name provided in the X-Remote-User HTTP header and disables HTTP authentication.

    Example nginx configuration:

    location /radicale/ {
    @@ -721,8 +721,8 @@ user2:password2
    </Location>

    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 Radicale and a certificate for the reverse proxy. The following commands generate self-signed certificates. You will be asked to enter additional information about the certificate, the values don't matter and you can keep the defaults.

    $ 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
    @@ -743,8 +743,8 @@ user2:password2 }
    -
    -

    WSGI

    +
    +

    WSGI

    Radicale is compatible with the WSGI specification.

    A configuration file can be set with the RADICALE_CONFIG environment variable, otherwise no configuration file is loaded and the default configuration is used.

    Be reminded that Radicale's default configuration enforces limits on the maximum upload file size.

    @@ -758,13 +758,13 @@ user2:password2 env = RADICALE_CONFIG=/etc/radicale/config

    Example Gunicorn configuration:

    gunicorn --bind '127.0.0.1:5232' --workers 8 --env 'RADICALE_CONFIG=/etc/radicale/config' 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

    +
    +

    Versioning

    This page describes how to keep track of all changes to calendars and address books with git (or any other version control system).

    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:

    .Radicale.cache
    @@ -774,8 +774,8 @@ user2:password2
    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.

    -
    -

    Clients

    +
    +

    Clients

    Radicale has been tested with:

    • Android with DAVx⁵ (formerly DAVdroid)
    • @@ -785,36 +785,36 @@ user2:password2

    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 collections.

    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.

    In Evolution add a new calendar and address book respectively with WebDAV. 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. http://localhost:5232/user/calendar). If you want to add calendars from 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. No additional configuration is required.

    Set the URL of the Radicale server in config.js. If InfCloud is not hosted on the same server and port as Radicale, the browser will deny access to the Radicale server, because of the same-origin policy. You have to add additional HTTP header in the headers section of Radicale's configuration. The documentation of InfCloud has more details on this.

    -
    -

    Manual creation of calendars and address books

    +
    +

    Manual creation of calendars and address books

    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 (e.g. DAVx⁵).

    -
    -
    Direct editing of the storage
    +
    +
    Direct editing of the storage

    To create a new collection, you have to create the corresponding folder in the file system storage (e.g. collection-root/user/calendar). To tell Radicale and clients that the collection is a calendar, you have to create the file .Radicale.props with the following content in the folder:

    {"tag": "VCALENDAR"}

    The calendar is now available at the URL path /user/calendar. For address books the file must contain:

    @@ -822,8 +822,8 @@ user2:password2

    Calendar and address book collections must not have any child collections. Clients with automatic discovery of collections will only show calendars and addressbooks that are direct children of the path /USERNAME/.

    Delete collections by deleting the corresponding folders.

    -
    -
    HTTP requests with curl
    +
    +
    HTTP requests with curl

    To create a new calendar run something like:

    $ curl -u user -X MKCOL 'http://localhost:5232/user/calendar' --data \
     '<?xml version="1.0" encoding="UTF-8" ?>
    @@ -866,8 +866,8 @@ user2:password2
    -
    -

    Configuration

    +
    +

    Configuration

    Radicale can be configured with a configuration file or with command line arguments.

    An example configuration file looks like:

    [server]
    @@ -885,97 +885,97 @@ user2:password2
    python3 -m radicale --config "" --server-hosts 0.0.0.0:5232 --auth-type htpasswd --htpasswd-filename /path/to/htpasswd --htpasswd-encryption bcrypt

    The --config "" argument is required to stop Radicale from trying to load configuration files. Run python3 -m radicale --help for more information.

    In the following, all configuration categories and options are described.

    -
    -

    server

    +
    +

    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.

    -
    -
    hosts
    +
    +
    hosts

    A comma separated list of addresses that the server will bind to.

    Default: 127.0.0.1:5232

    -
    -
    daemon
    +
    +
    daemon

    Daemonize the Radicale process. It does not reset the umask.

    Default: False

    -
    -
    pid
    +
    +
    pid

    If daemon mode is enabled, Radicale will write its PID to this file.

    Default:

    -
    -
    max_connections
    +
    +
    max_connections

    The maximum number of parallel connections. Set to 0 to disable the limit.

    Default: 20

    -
    -
    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 authenticate users with client-side certificates, you also have to write an authentication plugin that extracts the user name from the certifcate.

    Default:

    -
    -
    protocol
    +
    +
    protocol

    SSL protocol used. See python's ssl module for available values.

    Default: PROTOCOL_TLSv1_2

    -
    -
    ciphers
    +
    +
    ciphers

    Available ciphers for SSL. See python's ssl module for available ciphers.

    Default:

    -
    -
    dns_lookup
    +
    +
    dns_lookup

    Reverse DNS to resolve client address in logs.

    Default: True

    -
    -
    realm
    +
    +
    realm

    Message displayed in the client when a password is needed.

    Default: Radicale - Password Required

    -
    -

    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.

    Available backends:

    None : Just allows all usernames and passwords. It also disables rights checking.

    @@ -984,13 +984,13 @@ user2:password2

    http_x_remote_user : Takes the user name from the X-Remote-User HTTP header and disables HTTP authentication. This can be used to provide the user name from a reverse proxy.

    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 or similar to generate this files.

    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:

    @@ -1003,16 +1003,16 @@ user2:password2

    crypt : This uses UNIX crypt(3). It's insecure!

    Default: bcrypt

    -
    -
    delay
    +
    +
    delay

    Average delay after failed login attempts in seconds.

    Default: 1

    -
    -

    rights

    -
    -
    type
    +
    +

    rights

    +
    +
    type

    The backend that is used to check the access rights of collections.

    The recommended backend is owner_only. If access to calendars and address books outside of the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. Choosing any other method is only useful if you access calendars and address books directly via URL.

    Available backends:

    @@ -1023,50 +1023,50 @@ user2:password2

    from_file : Load the rules from a file.

    Default: owner_only

    -
    -
    file
    -

    File for the rights backend from_file. See the Rights page.

    +
    +
    file
    +

    File for the rights backend from_file. See the Rights page.

    -
    -

    storage

    -
    -
    type
    +
    +

    storage

    +
    +
    type

    The backend that is used to store data.

    Available backends:

    multifilesystem : Stores the data in the filesystem.

    Default: multifilesystem

    -
    -
    filesystem_folder
    +
    +
    filesystem_folder

    Folder for storing local collections, created if not present.

    Default: /var/lib/radicale/collections

    -
    -
    filesystem_locking
    +
    +
    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
    +
    +
    max_sync_token_age

    Delete sync-token that are older than the specified time. (seconds)

    Default: 2592000

    -
    -
    filesystem_fsync
    +
    +
    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 Versioning page for an example.

    +
    +
    hook
    +

    Command that is run after changes to storage. Take a look at the Versioning page for an example.

    Default:

    -
    -

    web

    -
    -
    type
    +
    +

    web

    +
    +
    type

    The backend that provides the web interface of Radicale.

    Available backends:

    none : Just shows the message "Radicale works!".

    @@ -1074,38 +1074,38 @@ user2:password2

    Default: internal

    -
    -

    logging

    -
    -
    debug
    +
    +

    logging

    +
    +
    debug

    Set the default logging level to debug.

    Default: False

    -
    -
    full_environment
    +
    +
    full_environment

    Log all environment variables (including those set in the shell).

    Default: False

    -
    -
    mask_passwords
    +
    +
    mask_passwords

    Don't include passwords in logs.

    Default: True

    -
    -
    config
    -

    Logging configuration file. See the Logging page.

    +
    +
    config
    +

    Logging configuration file. See the Logging page.

    Default:

    -
    -

    headers

    +
    +

    headers

    In this section additional HTTP headers that are sent to clients can be specified.

    An example to relax the same-origin policy:

    Access-Control-Allow-Origin = *
    -
    -

    Authentication and Rights

    +
    +

    Authentication and Rights

    This page describes the format of the rights file for the from_file authentication backend. The configuration option file in the rights section must point to the rights file.

    The recommended rights method is owner_only. If access to calendars and address books outside of the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. This is only useful if you access calendars and address books directly via URL.

    An example rights file:

    @@ -1137,12 +1137,12 @@ user2:password2

    The path of the collection is separated by / and has no leading or trailing /. Therefore, the path of the root collection is empty.

    %(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.

    -
    -

    Storage

    +
    +

    Storage

    This document describes the layout and format of the file system storage (multifilesystem backend).

    -

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Git Versioning).

    -
    -

    Layout

    +

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Git Versioning).

    +
    +

    Layout

    The file system contains the following files and folders:

    • .Radicale.lock: The lock file for locking the storage.
    • @@ -1155,35 +1155,35 @@ user2:password2

      Future releases of Radicale 2.x.x will store caches and sync-tokens in the .Radicale.cache folder inside of collections. This folder may be created or modified, while the storage is locked for shared access. In theory, it should be safe to delete the folder. Caches will be recreated automatically and clients will be told that their sync-token isn't valid anymore.

      You may encounter files or folders that start with .Radicale.tmp-. Radicale uses them for atomic creation and deletion of files and folders. 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 utility.

    # Exclusive
     $ flock --exclusive /path/to/storage/.Radicale.lock COMMAND
     # Shared
     $ flock --shared /path/to/storage/.Radicale.lock COMMAND
    -
    -
    Linux and MacOS
    +
    +
    Linux and MacOS

    Use the flock syscall. Python provides it in the fcntl module.

    -
    -
    Windows
    +
    +
    Windows

    Use LockFile for exclusive access or LockFileEx which also supports shared access. Setting nNumberOfBytesToLockLow to 1 and nNumberOfBytesToLockHigh to 0 works.

    -
    -

    Logging

    +
    +

    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 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.

    -
    -

    Logging to a file

    +
    +

    Logging to a file

    An example configuration to write the log output to the file /var/log/radicale/log:

    [loggers]
     keys = root
    @@ -1210,8 +1210,8 @@ user2:password2

    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
    +
    +
    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:

    [handler_file]
     class = handlers.TimedRotatingFileHandler
    @@ -1221,8 +1221,8 @@ user2:password2
    args = ('/var/log/radicale/log', 'midnight', 1, 7) formatter = full
    -
    -
    Rotation of disk log files based on size
    +
    +
    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:

    [handler_file]
     class = handlers.RotatingFileHandler
    @@ -1234,11 +1234,11 @@ user2:password2
    -
    -

    Architecture

    +
    +

    Architecture

    Radicale is a really small piece of software, but understanding it is not as easy as it seems. But don't worry, reading this short page is enough to understand what a CalDAV/CardDAV server is, and how Radicale's code is organized.

    -
    -

    General Architecture

    +
    +

    General Architecture

    Here is a simple overview of the global architecture for reaching a calendar or an address book through network:

    @@ -1284,8 +1284,8 @@ user2:password2

    Radicale is not the client part of this architecture. It means that Radicale never draws calendars, address books, events and contacts on the screen. It only stores them and give the possibility to share them online with other people.

    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 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.

    __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.

    @@ -1298,11 +1298,11 @@ user2:password2

    web : This module contains the web interface.

    -
    -

    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 if the username and password are equal.

    The easiest way to develop and install python modules is Distutils. For a minimal setup create the file setup.py with the following content in an empty folder:

    #!/usr/bin/env python3
    @@ -1336,98 +1336,98 @@ user2:password2

    You can uninstall the module with:

    python3 -m pip uninstall radicale_silly_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.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.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.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 Collection that extends radicale.storage.BaseCollection. Take a look at the file radicale/storage.py in Radicale's source code for more information.

    -
    -

    Migration from 1.x.x to 2.x.x

    -
    -

    Why a Migration?

    +
    +

    Migration from 1.x.x to 2.x.x

    +
    +

    Why a Migration?

    Radicale 2.x.x is different from 1.x.x, here's everything you need to know about this! Please read this page carefully if you want to update Radicale.

    You'll also find extra information in issue #372.

    -
    -

    Python 3 Only

    +
    +

    Python 3 Only

    Radicale 2.x.x works with Python >= 3.3, and doesn't work anymore with Python 2.

    (No, Python 3.3 is not new, it's been released more than 4 years ago. Debian stable provides Python 3.4.)

    -
    -

    Dependencies

    +
    +

    Dependencies

    Radicale now depends on VObject, a "full-featured Python package for parsing and creating iCalendar and vCard files". That's the price to pay to correctly read crazy iCalendar files and support date-based filters, even on recurring events.

    -
    -

    Storage

    +
    +

    Storage

    Calendars and address books are stored in a different way between 1.x.x and 2.x.x versions. Launching 2.x.x without migrating your collections first will not work, Radicale won't be able to read your previous data.

    -

    There's now only one way to store data in Radicale: collections are stored as folders and events / contacts are stored in files. This new storage is close to the multifilesystem, but it's now thread-safe, with atomic writes and file locks. Other storage types can be used by creating plugins.

    +

    There's now only one way to store data in Radicale: collections are stored as folders and events / contacts are stored in files. This new storage is close to the multifilesystem, but it's now thread-safe, with atomic writes and file locks. Other storage types can be used by creating plugins.

    To migrate data to Radicale 2.x.x the command line argument --export-storage was added to Radicale 1.1.x. Start Radicale 1.x.x as you would normally do, but add the argument --export-storage path/to/empty/folder. Radicale will export the storage into the specified folder. This folder can be directly used with the default storage backend of Radicale 2.x.x.

    If you import big calendars or address books into Radicale 2.x.x the first request might take a long time, because it has to initialize its internal caches. Clients can time out, subsequent requests will be much faster.

    You can check the imported storage for errors by starting Radicale >= 2.1.5 with the --verify-storage argument.

    You can install version 1.1.x with:

    $ python3 -m pip install --upgrade radicale==1.1.*
    -
    -

    Authentication

    -

    Radicale 2.x.x only provides htpasswd authentication out-of-the-box. Other authentication methods can be added by creating or using plugins.

    +
    +

    Authentication

    +

    Radicale 2.x.x only provides htpasswd authentication out-of-the-box. Other authentication methods can be added by creating or using plugins.

    -
    -

    Rights

    -

    In Radicale 2.x.x, rights are managed using regex-based rules based on the login of the authenticated user and the URL of the resource. Default configurations are built in for common cases, you'll find more about this on the Authentication & Rights page.

    -

    Other rights managers can be added by creating plugins.

    +
    +

    Rights

    +

    In Radicale 2.x.x, rights are managed using regex-based rules based on the login of the authenticated user and the URL of the resource. Default configurations are built in for common cases, you'll find more about this on the Authentication & Rights page.

    +

    Other rights managers can be added by creating plugins.

    -
    -

    Versioning

    -

    Support for versioning with git was removed from Radicale 2.x.x. Instead, the configuration option hook in the storage section was added, the Collection Versioning page explains its usage for version control.

    +
    +

    Versioning

    +

    Support for versioning with git was removed from Radicale 2.x.x. Instead, the configuration option hook in the storage section was added, the Collection Versioning page explains its usage for version control.

    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.

    -
    -

    Hack

    +
    +

    Hack

    Interested in hacking? Feel free to clone the git repository on Github 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.

    Download

    -
    -

    PyPI

    +
    +

    PyPI

    Radicale is available on PyPI. To install, just type as superuser:

    $ python3 -m pip install --upgrade radicale==2.1.*
    -
    -

    Git Repository

    +
    +

    Git Repository

    If you want the development version of Radicale, take a look at the git repository on GitHub, or install it directly with:

    $ python3 -m pip install --upgrade git+https://github.com/Kozea/Radicale

    You can also download the content of the repository as an archive.

    -
    -

    Source Packages

    +
    +

    Source Packages

    You can download the Radicale package for each release:

    -
    -

    Linux Distribution Packages

    +
    +

    Linux Distribution Packages

    Radicale has been packaged for:

    • ArchLinux by David Runge
    • @@ -1481,42 +1481,42 @@ user2:password2

    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.

    Calendar and contact manipulation is available from both local and distant accesses, possibly limited through authentication policies.

    It aims to be a lightweight solution, easy to use, easy to install, easy to configure. As a consequence, it requires few software dependencies and is pre-configured 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, as it is a really (really really) much more difficult task.

    CalDAV and CardDAV are not perfect protocols. We think that their main problem is their complexity, that is why we decided not to implement the whole standard but just enough to understand some of its client-side implementations.

    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 features and use cases, but it is quite hard to implement fully.

    Some calendar servers have been created to follow the CalDAV and CardDAV RFCs as much as possible: Davical, Baïkal and Darwin Calendar Server, for example, are much more respectful of CalDAV and CardDAV and can be used with a large number of clients. They are very good choices if you want to develop and test new CalDAV clients, or if you have a possibly heterogeneous list of user agents.

    Even if it tries it best to follow the RFCs, Radicale does not and will not blindly implements 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.

    The installation is very easy, particularly with Linux: one dependency, no superuser rights needed, no configuration required, no database. Installing and launching the main script out-of-the-box, as a normal user, are often the only steps to have a simple remote calendar and contact access.

    -

    Contrary to other servers that are often complicated, require high privileges 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.

    +

    Contrary to other servers that are often complicated, require high privileges 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.

    -
    -
    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 behaviours are given in such cases.

    Radicale often assumes that the clients are perfect and that protocol 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.

    At the beginning, it was just a proof-of-concept. The main goal was to write a small, dirty and simple CalDAV server working with Lightning, using no external libraries. That's how we created a piece of code that's (quite) easy to understand, to use and to hack.

    The first lines have been added to the SVN (!) repository as I was drinking (many) beers at the very end of 2008 (Python 2.6 and 3.0 were just released). It's now packaged for a growing number of Linux distributions.

    @@ -1526,34 +1526,34 @@ user2:password2

    News

    Latest version of Radicale is 2.1.12, released on May 19, 2020 (changelog).

    -
    -

    May 19, 2020 - Radicale 2.1.12

    +
    +

    May 19, 2020 - Radicale 2.1.12

    Radicale 2.1.12 is out!

    -
    -

    2.1.12 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.12 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Include documentation in source archive
    -
    -

    November 5, 2018 - Radicale 2.1.11

    +
    +

    November 5, 2018 - Radicale 2.1.11

    Radicale 2.1.11 is out!

    -
    -

    2.1.11 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.11 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Fix moving items between collections
    -
    -

    August 16, 2018 - Radicale 2.1.10

    +
    +

    August 16, 2018 - Radicale 2.1.10

    Radicale 2.1.10 is out!

    -
    -

    2.1.10 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.10 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Update required versions for dependencies
    • Get RADICALE_CONFIG from WSGI environ
    • @@ -1564,12 +1564,12 @@ user2:password2
    -
    -

    April 21, 2018 - Radicale 2.1.9

    +
    +

    April 21, 2018 - Radicale 2.1.9

    Radicale 2.1.9 is out!

    -
    -

    2.1.9 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.9 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Specify versions for dependencies
    • Move WSGI initialization into module
    • @@ -1581,23 +1581,23 @@ user2:password2
    -
    -

    September 24, 2017 - Radicale 2.1.8

    +
    +

    September 24, 2017 - Radicale 2.1.8

    Radicale 2.1.8 is out!

    -
    -

    2.1.8 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.8 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Flush files before fsync'ing
    -
    -

    September 17, 2017 - Radicale 2.1.7

    +
    +

    September 17, 2017 - Radicale 2.1.7

    Radicale 2.1.7 is out!

    -
    -

    2.1.7 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.7 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Don't print warning when cache format changes
    • Add documentation for BaseAuth
    • @@ -1612,12 +1612,12 @@ user2:password2
    -
    -

    September 11, 2017 - Radicale 2.1.6

    +
    +

    September 11, 2017 - Radicale 2.1.6

    Radicale 2.1.6 is out!

    -
    -

    2.1.6 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.6 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Fix content-type of VLIST
    • Specify correct COMPONENT in content-type of VCALENDAR
    • @@ -1630,12 +1630,12 @@ user2:password2
    -
    -

    August 25, 2017 - Radicale 2.1.5

    +
    +

    August 25, 2017 - Radicale 2.1.5

    Radicale 2.1.5 is out!

    -
    -

    2.1.5 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.5 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Add --verify-storage command-line argument
    • Allow comments in the htpasswd file
    • @@ -1646,24 +1646,24 @@ user2:password2
    -
    -

    August 4, 2017 - Radicale 2.1.4

    +
    +

    August 4, 2017 - Radicale 2.1.4

    Radicale 2.1.4 is out!

    -
    -

    2.1.4 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.4 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Fix incorrect time range matching and calculation for some edge-cases with rescheduled recurrences
    • Fix owner property
    -
    -

    August 2, 2017 - Radicale 2.1.3

    +
    +

    August 2, 2017 - Radicale 2.1.3

    Radicale 2.1.3 is out!

    -
    -

    2.1.3 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.3 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Enable timeout for SSL handshakes and move them out of the main thread
    • Create cache entries during upload of items
    • @@ -1672,12 +1672,12 @@ user2:password2
    -
    -

    July 24, 2017 - Radicale 2.1.2

    +
    +

    July 24, 2017 - Radicale 2.1.2

    Radicale 2.1.2 is out!

    -
    -

    2.1.2 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.2 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Remove workarounds for bugs in VObject < 0.9.5
    • Error checking of collection tags and associated components
    • @@ -1687,12 +1687,12 @@ user2:password2
    -
    -

    July 1, 2017 - Radicale 2.1.1

    +
    +

    July 1, 2017 - Radicale 2.1.1

    Radicale 2.1.1 is out!

    -
    -

    2.1.1 - Wild Radish Again

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    +
    +

    2.1.1 - Wild Radish Again

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.x.x.

    • Add missing UIDs instead of failing
    • Improve error checking of calendar and address book objects
    • @@ -1700,12 +1700,12 @@ user2:password2
    -
    -

    June 25, 2017 - Radicale 2.1.0

    +
    +

    June 25, 2017 - Radicale 2.1.0

    Radicale 2.1.0 is out!

    -
    -

    2.1.0 - Wild Radish

    -

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.1.0.

    +
    +

    2.1.0 - Wild Radish

    +

    This release is compatible with version 2.0.0. Follow our migration guide if you want to switch from 1.x.x to 2.1.0.

    • Built-in web interface for creating and managing address books and calendars
        @@ -1740,12 +1740,12 @@ user2:password2
    -
    -

    May 27, 2017 - Radicale 2.0.0

    +
    +

    May 27, 2017 - Radicale 2.0.0

    Radicale 2.0.0 is out!

    -
    -

    2.0.0 - Little Big Radish

    -

    This feature is not compatible with the 1.x.x versions. Follow our migration guide if you want to switch from 1.x.x to 2.0.0.

    +
    +

    2.0.0 - Little Big Radish

    +

    This feature is not compatible with the 1.x.x versions. Follow our migration guide 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
    • @@ -1769,22 +1769,22 @@ user2:password2

      If you're interested in Radicale, you can read #372 and build its future.

    -
    -

    May 3, 2017 - Radicale 1.1.2

    +
    +

    May 3, 2017 - Radicale 1.1.2

    Radicale 1.1.2 is out!

    -
    -

    1.1.2 - Third Law of Nature

    +
    +

    1.1.2 - Third Law of Nature

    • Security fix: Add a random timer to avoid timing oracles and simple bruteforce attacks when using the htpasswd authentication method.
    • Various minor fixes.
    -
    -

    December 31, 2015 - Radicale 1.1

    +
    +

    December 31, 2015 - Radicale 1.1

    Radicale 1.1 is out!

    -
    -

    1.1 - Law of Nature

    +
    +

    1.1 - Law of Nature

    One feature in this release is not backward compatible:

    • Use the first matching section for rights (inspired from daald)
    • @@ -1808,11 +1808,11 @@ user2:password2
    -
    -

    September 14, 2015 - Radicale 1.0, what's next?

    +
    +

    September 14, 2015 - Radicale 1.0, what's next?

    Radicale 1.0 is out!

    -
    -

    1.0 - Sunflower

    +
    +

    1.0 - Sunflower

    • Enhanced performances (by Mathieu Dupuy)
    • Add MD5-APR1 and BCRYPT for htpasswd-based authentication (by Jan-Philip Gehrcke)
    • @@ -1854,11 +1854,11 @@ user2:password2

      Need to talk about this? You know how to contact us!

    -
    -

    January 12, 2015 - Radicale 0.10

    +
    +

    January 12, 2015 - Radicale 0.10

    Radicale 0.10 is out!

    -
    -

    0.10 - Lovely Endless Grass

    +
    +

    0.10 - Lovely Endless Grass

    • Support well-known URLs (by Mathieu Dupuy)
    • Fix collection discovery (by Markus Unterwaditzer)
    • @@ -1873,11 +1873,11 @@ user2:password2

      What's next? It's time to fix and improve the storage methods. A real API for the storage modules is a good beginning, many pull requests are already ready to be discussed and merged, and we will probably get some good news about performance this time. Who said "databases, please"?

    -
    -

    July 12, 2013 - Radicale 0.8

    +
    +

    July 12, 2013 - Radicale 0.8

    Radicale 0.8 is out!

    -
    -

    0.8 - Rainbow

    +
    +

    0.8 - Rainbow

    • New authentication and rights management modules (by Matthias Jordan)
    • Experimental database storage
    • @@ -1897,11 +1897,11 @@ user2:password2

      It has been a real pleasure to work on this version, with brilliant ideas and interesting bug reports from the community. I'd really like to thank all the people reporting bugs, chatting on IRC, sending mails and proposing pull requests: you are awesome.

    -
    -

    August 3, 2012 - Radicale 0.7.1

    +
    +

    August 3, 2012 - Radicale 0.7.1

    Radicale 0.7.1 is out!

    -
    -

    0.7.1 - Waterfalls

    +
    +

    0.7.1 - Waterfalls

    • Many address books fixes
    • New IMAP ACL (by Daniel Aleksandersen)
    • @@ -1916,11 +1916,11 @@ user2:password2

      Next time, as many mails have come from angry and desperate coders, tests will be finally added to help them to add features and fix bugs. And after that, who knows, it may be time to release Radicale 1.0…

    -
    -

    March 22, 2012 - Radicale 0.7

    +
    +

    March 22, 2012 - Radicale 0.7

    Radicale 0.7 is out, at least!

    -
    -

    0.7 - Eternal Sunshine

    +
    +

    0.7 - Eternal Sunshine

    • Repeating events
    • Collection deletion
    • @@ -1931,47 +1931,47 @@ user2:password2

      A lot of people have reported bugs, proposed new features, added useful code and tested many clients. Thank you Lynn, Ron, Bill, Patrick, Hidde, Gerhard, Martin, Brendan, Vladimir, and everybody I've forgotten.

    -
    -

    January 5, 2012 - Radicale 0.6.4, News from Calypso

    +
    +

    January 5, 2012 - Radicale 0.6.4, News from Calypso

    New year, new release. Radicale 0.6.4 has a really short changelog:

    -
    -

    0.6.4 - Tulips

    +
    +

    0.6.4 - Tulips

    • Fix the installation with Python 3.1

    The bug was in fact caused by a bug in Python 3.1, everything should be OK now.

    -
    -

    Calypso

    +
    +

    Calypso

    After a lot of changes in Radicale, Keith Packard has decided to launch a fork called Calypso, with nice features such as a Git storage mechanism and a CardDAV support.

    There are lots of differences between the two projects, but the final goal for Radicale is to provide these new features as soon as possible. Thanks to the work of Keith and other people on GitHub, a basic CardDAV support has been added in the carddav branch and already works with Evolution. Korganizer also works with existing address books, and CardDAV-Sync will be tested soon. If you want to test other clients, please let us know!

    -
    -

    November 3, 2011 - Radicale 0.6.3

    +
    +

    November 3, 2011 - Radicale 0.6.3

    Radicale version 0.6.3 has been released, with bugfixes that could be interesting for you!

    -
    -

    0.6.3 - Red Roses

    +
    +

    0.6.3 - Red Roses

    • MOVE requests fixed
    • Faster REPORT answers
    • Executable script moved into the package
    -
    -

    What's New Since 0.6.2?

    +
    +

    What's New Since 0.6.2?

    The MOVE requests were suffering a little bug that is fixed now. These requests are only sent by Apple clients, Mac users will be happy.

    The REPORT request were really, really slow (several minutes for large calendars). This was caused by an awful algorithm parsing the entire calendar for each event in the calendar. The calendar is now only parsed three times, and the events are found in a Python list, turning minutes into seconds! Much better, but far from perfection…

    Finally, the executable script parsing the command line options and starting the HTTP servers has been moved from the radicale.py file into the radicale package. Two executable are now present in the archive: the good old radicale.py, and bin/radicale. The second one is only used by setup.py, where the hack used to rename radicale.py into radicale has therefore been removed. As a consequence, you can now launch Radicale with the simple python -m radicale command, without relying on an executable.

    -
    -

    Time for a Stable Release!

    +
    +

    Time for a Stable Release!

    The next release may be a stable release, symbolically called 1.0. Guess what's missing? Tests, of course!

    A non-regression testing suite, based on the clients' requests, will soon be added to Radicale. We're now thinking about a smart solution to store the tests, to represent the expected answers and to launch the requests. We've got crazy ideas, so be prepared: you'll definitely want to write tests during the next weeks!

    Repeating events, PAM and Courier authentication methods have already been added in master. You'll find them in the 1.0 release!

    -
    -

    What's Next?

    +
    +

    What's Next?

    Being stable is one thing, being cool is another one. If you want some cool new features, you may be interested in:

    • WebDAV and CardDAV support
    • @@ -1983,11 +1983,11 @@ user2:password2

      Issues have been reported in the bug tracker, you can follow there the latest news about these features. Your beloved text editor is waiting for you!

    -
    -

    September 27, 2011 - Radicale 0.6.2

    +
    +

    September 27, 2011 - Radicale 0.6.2

    0.6.2 is out with minor bugfixes.

    -
    -

    0.6.2 - Seeds

    +
    +

    0.6.2 - Seeds

    • iPhone and iPad support fixed
    • Backslashes replaced by slashes in PROPFIND answers on Windows
    • @@ -1995,11 +1995,11 @@ user2:password2
    -
    -

    August 28, 2011 - Radicale 0.6.1, Changes, Future

    +
    +

    August 28, 2011 - Radicale 0.6.1, Changes, Future

    As previously imagined, a new 0.6.1 version has been released, mainly fixing obvious bugs.

    -
    -

    0.6.1 - Growing Up

    +
    +

    0.6.1 - Growing Up

    • Example files included in the tarball
    • htpasswd support fixed
    • @@ -2009,14 +2009,14 @@ user2:password2

      The changelog is really small, so there should be no real new problems since 0.6. The example files for logging, FastCGI and WSGI are now included in the tarball, for the pleasure of our dear packagers!

      A new branch has been created for various future bug fixes. You can expect to get more 0.6.x versions, making this branch a kind of "stable" branch with no big changes.

    -
    -

    GitHub, Mailing List, New Website

    +
    +

    GitHub, Mailing List, New Website

    A lot of small changes occurred during the last weeks.

    If you're interested in code and new features, please note that we moved the project from Gitorious to GitHub. Being hosted by Gitorious was a nice experience, but the service was not that good and we were missing some useful features such as git hooks. Moreover, GitHub is really popular, we're sure that we'll meet a lot of kind users and coders there.

    We've also created a mailing-list on Librelist to keep a public trace of the mails we're receiving. It a bit empty now, but we're sure that you'll soon write us some kind words. For example, you can tell us what you think of our new website!

    -
    -

    Future Features

    +
    +

    Future Features

    In the next weeks, new exciting features are coming in the master branch! Some of them are almost ready:

    • Henry-Nicolas has added the support for the PAM and Courier-Authdaemon authentication mechanisms.
    • @@ -2025,11 +2025,11 @@ user2:password2

      As you can find in the Radicale Roadmap, tests, rights and filters are expected for 0.7.

    -
    -

    August 1, 2011 - Radicale 0.6 Released

    +
    +

    August 1, 2011 - Radicale 0.6 Released

    Time for a new release with a lot of new exciting features!

    -
    -

    0.6 - Sapling

    +
    +

    0.6 - Sapling

    • WSGI support
    • IPv6 support
    • @@ -2051,8 +2051,8 @@ user2:password2

      Because of all these changes, Radicale 0.6 may be a little bit buggy; a 0.6.1 will probably be released soon, fixing small problems with clients and features. Get ready to report bugs, I'm sure that you can find one (and fix it)!

    -
    -

    July 2, 2011 - Feature Freeze for 0.6

    +
    +

    July 2, 2011 - Feature Freeze for 0.6

    According to the roadmap, a lot of features have been added since Radicale 0.5, much more than expected. It's now time to test Radicale with your favourite client and to report bugs before we release the next stable version!

    Last week, the iCal and iPhone support written by Łukasz has been fixed in order to restore the broken Lightning support. After two afternoons of tests with Rémi, we managed to access the same calendar with Lightning, iCal, iPhone and Evolution, and finally discovered that CalDAV could also be a perfect instant messaging protocol between a Mac, a PC and a phone.

    After that, we've had the nice surprise to see events displayed without a problem (but after some strange steps of configuration) by aCal on Salem's Android phone.

    @@ -2065,8 +2065,8 @@ user2:password2

    Please report bugs if anything goes wrong during your tests, or just let us know by Jabber or by mail if everything is OK.

    -
    -

    May 1, 2011 - Ready for WSGI

    +
    +

    May 1, 2011 - Ready for WSGI

    Here it is! Radicale is now ready to be launched behind your favourite HTTP server (Apache, Lighttpd, Nginx or Tomcat for example). That's really good news, because:

    • Real HTTP servers are much more efficient and reliable than the default Python server used in Radicale;
    • @@ -2078,37 +2078,37 @@ user2:password2

      The WSGI support has only be tested as a stand-alone executable and behind Lighttpd, you should definitely try if it works with you favourite server too!

      No more features will be added before (quite) a long time, because a lot of documentation and test is waiting for us. If you want to write tutorials for some CalDAV clients support (iCal, Android, iPhone), HTTP servers support or logging management, feel free to fork the documentation git repository and ask for a merge. It's plain text, I'm sure you can do it!

    -
    -

    April 30, 2011 - Apple iCal Support

    +
    +

    April 30, 2011 - Apple iCal Support

    After a long, long work, the iCal support has finally been added to Radicale! Well, this support is only for iCal 4 and is highly experimental, but you can test it right now with the git master branch. Bug reports are welcome!

    Dear MacOS users, you can thank all the gentlemen who sended a lot of debugging iformation. Special thanks to Andrew from DAViCal, who helped us a lot with his tips and his tests, and Rémi Hainaud who lent his laptop for the final tests.

    The default server address is localhost:5232/user/, where calendars can be added. Multiple calendars and owner-less calendars are not tested yet, but they should work quite well. More documentation will be added during the next days. It will then be time to release the Radicale 0.6 version, and work on the WSGI support.

    -
    -

    April 25, 2011 - Two Features and One New Roadmap

    +
    +

    April 25, 2011 - Two Features and One New Roadmap

    Two features have just reached the master branch, and the roadmap has been refreshed.

    -
    -

    LDAP Authentication

    +
    +

    LDAP Authentication

    Thanks to Corentin, the LDAP authentication is now included in Radicale. The support is experimental and may suffer unstable connexions and security problems. If you are interested in this feature (a lot of people seem to be), you can try it and give some feedback.

    No SSL support is included yet, but this may be quite easy to add. By the way, serious authentication methods will rely on a "real" HTTP server, as soon as Radicale supports WSGI.

    -
    -

    Journal Entries

    +
    +

    Journal Entries

    Mehmet asked for the journal entries (aka. notes or memos) support, that's done! This also was an occasion to clean some code in the iCal parser, and to add a much better management of multi-lines entries. People experiencing crazy X-RADICALE-NAME entries can now clean their files, Radicale won't pollute them again.

    -
    -

    New Roadmap

    +
    +

    New Roadmap

    Except from htpasswd and LDAP, most of the authentication backends (database, SASL, PAM, user groups) are not really easy to include in Radicale. The easiest solution to solve this problem is to give Radicale a CGI support, to put it behind a solid server such as Apache. Of course, CGI is not enough: a WSGI support is quite better, with the FastCGI, AJP and SCGI backends offered by flup. Quite exciting, isn't it?

    That's why it was important to add new versions on the roadmap. The 0.6 version is now waiting for the Apple iCal support, and of course for some tests to kill the last remaining bugs. The only 0.7 feature will be WSGI, allowing many new authentication methods and a real multithread support.

    After that, 0.8 may add CalDAV rights and filters, while 1.0 will draw thousands of rainbows and pink unicorns (WebDAV sync, CardDAV, Freebusy). A lot of funky work is waiting for you, hackers!

    -
    -

    Bugs

    +
    +

    Bugs

    Many bugs have also been fixed, most of them due to the owner-less calendars support. Radicale 0.6 may be out in a few weeks, you should spend some time testing the master branch and filling the bug tracker.

    -
    -

    April 10, 2011 - New Features

    +
    +

    April 10, 2011 - New Features

    Radicale 0.5 was released only 8 days ago, but 3 new features have already been added to the master branch:

    • IPv6 support, with multiple addresses/ports support
    • @@ -2117,11 +2117,11 @@ user2:password2

    Most of the code has been written by Necoro and Corentin, and that was not easy at all: Radicale is now multithreaded! For sure, you can find many bugs and report them on the bug tracker. And if you're fond of logging, you can even add a default configuration file and more debug messages in the source.

    -
    -

    April 2, 2011 - Radicale 0.5 Released

    +
    +

    April 2, 2011 - Radicale 0.5 Released

    Radicale 0.5 is out! Here is what's new:

    -
    -

    0.5 - Historical Artifacts

    +
    +

    0.5 - Historical Artifacts

    • Calendar depth
    • iPhone support
    • @@ -2133,24 +2133,24 @@ user2:password2

      So, what's next? As promised, some cool git branches will soon be merged, with LDAP support, logging, IPv6 and anonymous calendars. Sounds pretty cool, heh? Talking about new features, more and more people are asking for a CardDAV support in Radicale. A git branch and a feature request are open, feel free to hack and discuss.

    -
    -

    February 3, 2011 - Jabber Room and iPhone Support

    -

    After a lot of help and testing work from Andrew, Björn, Anders, Dorian and Pete (and other ones we could have forgotten), a simple iPhone support has been added in the git repository. If you are interested, you can test this feature right now by downloading the latest git version (a tarball is even available too if you don't want or know how to use git).

    +
    +

    February 3, 2011 - Jabber Room and iPhone Support

    +

    After a lot of help and testing work from Andrew, Björn, Anders, Dorian and Pete (and other ones we could have forgotten), a simple iPhone support has been added in the git repository. If you are interested, you can test this feature right now by downloading the latest git version (a tarball is even available too if you don't want or know how to use git).

    No documentation has been written yet, but using the right URL in the configuration should be enough to synchronize your calendars. If you have any problems, you can ask by joining our new Jabber room: radicale@room.jabber.kozea.fr.

    Radicale 0.5 will be released as soon as the iCal support is ready. If you have an Apple computer, Python skills and some time to spend, we'd be glad to help you debugging Radicale.

    -
    -

    October 21, 2010 - News from Radicale

    +
    +

    October 21, 2010 - News from Radicale

    During the last weeks, Radicale has not been idle, even if no news have been posted since August. Thanks to Pete, Pierre-Philipp and Andrew, we're trying to add a better support on MacOS, Windows and mobile devices like iPhone and Android-based phones.

    All the tests on Windows have been successful: launching Radicale and using Lightning as client works without any problems. On Android too, some testers have reported clients working with Radicale. These were the good news.

    The bad news come from Apple: both iPhone and MacOS default clients are not working yet, despite the latest enhancements given to the PROPFIND requests. The problems are quite hard to debug due to our lack of Apple hardware, but Pete is helping us in this difficult quest! Radicale 0.5 will be out as soon as these two clients are working.

    Some cool stuff is coming next, with calendar collections and groups, and a simple web-based CalDAV client in early development. Stay tuned!

    -
    -

    August 8, 2010 - Radicale 0.4 Released

    +
    +

    August 8, 2010 - Radicale 0.4 Released

    Radicale 0.4 is out! Here is what's new:

    -
    -

    0.4 - Hot Days Back

    +
    +

    0.4 - Hot Days Back

    • Personal calendars
    • HEAD requests
    • @@ -2161,18 +2161,18 @@ user2:password2

      This release has mainly been released to help our dear packagers to include a default configuration file and to write init scripts. Big thanks to Necoro for his work on the new Gentoo ebuild!

    -
    -

    July 4, 2010 - Three Features Added Last Week

    +
    +

    July 4, 2010 - Three Features Added Last Week

    Some features have been added in the git repository during the last weeks, thanks to Jerome and Mariusz!

    Personal Calendars Calendars accessed through the htpasswd ACL module can now be personal. Thanks to the personal option, a user called bob can access calendars at /bob/* but not to the /alice/* ones.

    HEAD Requests Radicale can now answer HEAD requests. HTTP headers can be retrieved thanks to this request, without getting contents given by the GET requests.

    Last-Modified HTTP header The Last-Modified header gives the last time when the calendar has been modified. This is used by some clients to cache the calendars and not retrieving them if they have not been modified.

    -
    -

    June 14, 2010 - Radicale 0.3 Released

    +
    +

    June 14, 2010 - Radicale 0.3 Released

    Radicale 0.3 is out! Here is what’s new:

    -
    -

    0.3 - Dancing Flowers

    +
    +

    0.3 - Dancing Flowers

    • Evolution support
    • Version management
    • @@ -2182,29 +2182,29 @@ user2:password2

      Next step is 0.5, with calendar collections, and Windows and MacOS support.

    -
    -

    May 31, 2010 - May News

    -
    -

    News from contributors

    +
    +

    May 31, 2010 - May News

    +
    +

    News from contributors

    Jonas Smedegaard packaged Radicale for Debian last week. Two packages, called radicale for the daemon and python-radicale for the module, have been added to Sid, the unstable branch of Debian. Thank you, Jonas!

    Sven Guckes corrected some of the strange-English-sentences present on this website. Thank you, Sven!

    -
    -

    News from software

    +
    +

    News from software

    A simple VERSION has been added in the library: you can now play with radicale.VERSION and $radicale --version.

    After playing with the version (should not be too long), you may notice that the next version is called 0.3, and not 0.5 as previously decided. The 0.3 main goal is to offer the support for Evolution as soon as possible, without waiting for the 0.5. After more than a month of test, we corrected all the bugs we found and everything seems to be fine; we can imagine that a brand new tarball will be released during the first days of June.

    -
    -

    April 19, 2010 - Evolution Supported

    +
    +

    April 19, 2010 - Evolution Supported

    Radicale now supports another CalDAV client: Evolution, the default mail, addressbook and calendaring client for Gnome. This feature was quite easy to add, as it required less than 20 new lines of code in the requests handler.

    If you are interested, just clone the git repository.

    -
    -

    April 13, 2010 - Radicale 0.2 Released

    +
    +

    April 13, 2010 - Radicale 0.2 Released

    Radicale 0.2 is out! Here is what’s new:

    -
    -

    0.2 - Snowflakes

    +
    +

    0.2 - Snowflakes

    • Sunbird pre-1.0 support
    • SSL connection
    • @@ -2222,33 +2222,33 @@ user2:password2

      You may have noticed too that Radicale can be downloaded from PyPI. Of course, it is also available on the download page.

    -
    -

    January 21, 2010 - HTTPS and Authentication

    +
    +

    January 21, 2010 - HTTPS and Authentication

    HTTPS connections and authentication have been added to Radicale this week. Command-line options and personal configuration files are also ready for test. According to the TODO file included in the package, the next version will finally be 0.2, when sunbird 1.0 is out. Go, Mozilla hackers, go!

    HTTPS connection HTTPS connections are now available using the standard TLS mechanisms. Give Radicale a private key and a certificate, and your data are now safe.

    Authentication A simple authentication architecture is now available, allowing different methods thanks to different modules. The first two modules are fake (no authentication) and htpasswd (authentication with an htpasswd file created by the Apache tool). More methods such as LDAP are coming soon!

    -
    -

    January 15, 2010 - Ready for Python 3

    +
    +

    January 15, 2010 - Ready for Python 3

    Dropping Twisted dependency was the first step leading to another big feature: Radicale now works with Python 3! The code was given a small cleanup, with some simplifications mainly about encoding. Before the 0.1.1 release, feel free to test the git repository, all Python versions from 2.5 should be OK.

    -
    -

    January 11, 2010 - Twisted no Longer Required

    +
    +

    January 11, 2010 - Twisted no Longer Required

    Good news! Radicale 0.1.1 will support Sunbird 1.0, but it has another great feature: it has no external dependency! Twisted is no longer required for the git version, removing about 50 lines of code.

    -
    -

    December 31, 2009 - Lightning and Sunbird 1.0b2pre Support

    +
    +

    December 31, 2009 - Lightning and Sunbird 1.0b2pre Support

    Lightning/Sunbird 1.0b2pre is out, adding minor changes in CalDAV support. A new commit makes Radicale work with versions 0.9, 1.0b1 et 1.0b2. Moreover, etags are now quoted according to the RFC 2616.

    -
    -

    December 9, 2009 - Thunderbird 3 released

    +
    +

    December 9, 2009 - Thunderbird 3 released

    Thunderbird 3 is out, and Lightning/Sunbird 1.0 should be released in a few days. The last commit in git should make Radicale work with versions 0.9 and 1.0b1pre. Radicale 0.1.1 will soon be released adding support for version 1.0.

    -
    -

    September 1, 2009 - Radicale 0.1 Released

    +
    +

    September 1, 2009 - Radicale 0.1 Released

    First Radicale release! Here is the changelog:

    -
    -

    0.1 - Crazy Vegetables

    +
    +

    0.1 - Crazy Vegetables

    • First release
    • Lightning/Sunbird 0.9 compatibility
    • @@ -2257,12 +2257,12 @@ user2:password2

      You can download this version on the download page.

    -
    -

    July 28, 2009 - Radicale on Gitorious

    +
    +

    July 28, 2009 - Radicale on Gitorious

    Radicale code has been released on Gitorious! Take a look at the Radicale main page on Gitorious to view and download source code.

    -
    -

    July 27, 2009 - Radicale Ready to Launch

    +
    +

    July 27, 2009 - Radicale Ready to Launch

    The Radicale Project is launched. The code has been cleaned up and will be available soon…

    diff --git a/v3.html b/v3.html index 519e709d..95ef21e1 100644 --- a/v3.html +++ b/v3.html @@ -124,104 +124,104 @@ @@ -229,8 +229,8 @@

    Getting started

    -
    -

    About Radicale

    +
    +

    About Radicale

    Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts) server, that:

    • Shares calendars and contact lists through CalDAV, CardDAV and HTTP.
    • @@ -238,34 +238,34 @@
    • Works out-of-the-box, no complicated setup or configuration required.
    • Can limit access by authentication.
    • Can secure connections with TLS.
    • -
    • Works with many CalDAV and CardDAV clients.
    • +
    • Works with many CalDAV and CardDAV clients.
    • Stores all data on the file system in a simple folder structure.
    • Can be extended with plugins.
    • Is GPLv3-licensed free software.
    -
    -

    Installation

    +
    +

    Installation

    Radicale is really easy to install and works out-of-the-box.

    $ python3 -m pip install --upgrade radicale
     $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections

    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 and the documentation.

    +

    Want more? Check the tutorials and the documentation.

    -
    -

    What's New?

    +
    +

    What's New?

    Read the changelog on GitHub.

    Tutorials

    -
    -

    Simple 5-minute setup

    +
    +

    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!

    -

    When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

    +

    When everything works, you can get a client and start creating calendars and address books. The server only binds to localhost (is not reachable over the network) and you can log in with any user name and password. If Radicale fits your needs, it may be time for some basic configuration.

    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 enough to install the package python3-pip.

    Then open a console and type:

    # Run the following command as root or
    @@ -274,8 +274,8 @@
     $ python3 -m radicale --storage-filesystem-folder=~/.var/lib/radicale/collections

    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 and download the latest version of Python 3. Then run the installer. On the first window of the installer, check the "Add Python to PATH" box and click on "Install now". Wait a couple of minutes, it's done!

    Launch a command prompt and type:

    C:\Users\User> python -m pip install --upgrade radicale
    @@ -283,18 +283,18 @@
     

    Victory! Open http://localhost:5232/ in your browser! You can log in with any username and password.

    -
    -

    Basic Configuration

    -

    Installation instructions can be found in the simple 5-minute setup tutorial.

    +
    +

    Basic Configuration

    +

    Installation instructions can be found in the simple 5-minute setup tutorial.

    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 passed via command line arguments.)

    -

    All configuration options are described in detail in the Configuration section.

    -
    -

    Authentication

    +

    All configuration options are described in detail in the Configuration section.

    +
    +

    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.

    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:

    # Create a new htpasswd file with the user "user1"
     $ htpasswd -c /path/to/users user1
    @@ -311,8 +311,8 @@
     # encryption method used in the htpasswd file
     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:

    user1:password1
     user2:password2
    @@ -324,23 +324,23 @@ user2:password2
    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 options (IPv4 and IPv6):

    [server]
     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:

    [storage]
     filesystem_folder = /path/to/storage
    -

    Security: The storage folder should not be readable by unauthorized users. Otherwise, they can read the calendar data and lock the storage. You can find OS dependent instructions in the Running as a service section.

    +

    Security: The storage folder should not be readable by unauthorized users. Otherwise, they can read the calendar data and lock the storage. You can find OS dependent instructions in the 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 incorrect authentication attempts. Connections are terminated after a timeout. The default values should be fine for most scenarios.

    [server]
     max_connections = 20
    @@ -354,11 +354,11 @@ user2:password2
    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.) 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.)

    Security: The storage should not be readable by others. (Run chmod -R o= /var/lib/radicale/collections as root.)

    @@ -399,8 +399,8 @@ user2:password2 # View all log messages $ journalctl --unit radicale.service
    -
    -

    Linux with systemd as a user

    +
    +

    Linux with systemd as a user

    Create the file ~/.config/systemd/user/radicale.service:

    [Unit]
     Description=A simple CalDAV (calendar) and CardDAV (contact) server
    @@ -422,8 +422,8 @@ user2:password2
    # View all log messages $ journalctl --user --unit radicale.service
    -
    -

    Windows with "NSSM - the Non-Sucking Service Manager"

    +
    +

    Windows with "NSSM - the Non-Sucking Service Manager"

    First install NSSM and start nssm install in a command prompt. Apply the following configuration:

    • Service name: Radicale
    • @@ -444,8 +444,8 @@ user2:password2

      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 from the URL path that is forwarded to Radicale.

    Example nginx configuration:

    location /radicale/ { # The trailing / is important!
    @@ -472,8 +472,8 @@ user2:password2
    # Set to directory of .htaccess file: RequestHeader set X-Script-Name /radicale

    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. Radicale uses the user name provided in the X-Remote-User HTTP header and disables HTTP authentication.

    Example nginx configuration:

    location /radicale/ {
    @@ -517,8 +517,8 @@ user2:password2

    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 Radicale and a certificate for the reverse proxy. The following commands generate self-signed certificates. You will be asked to enter additional information about the certificate, the values don't matter and you can keep the defaults.

    $ 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
    @@ -539,8 +539,8 @@ user2:password2 }
    -
    -

    WSGI Server

    +
    +

    WSGI Server

    Radicale is compatible with the WSGI specification.

    A configuration file can be set with the RADICALE_CONFIG environment variable, otherwise no configuration file is loaded and the default configuration is used.

    Example uWSGI configuration:

    @@ -552,13 +552,13 @@ user2:password2 env = RADICALE_CONFIG=/etc/radicale/config

    Example Gunicorn configuration:

    gunicorn --bind '127.0.0.1:5232' --workers 8 --env 'RADICALE_CONFIG=/etc/radicale/config' 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).

    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:

    .Radicale.cache
    @@ -569,10 +569,10 @@ user2:password2

    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.

    An example configuration file looks like:

    [server]
    @@ -591,67 +591,67 @@ user2:password2
    python3 -m radicale --server-hosts 0.0.0.0:5232,[::]:5232 --auth-type htpasswd --htpasswd-filename ~/.config/radicale/users --htpasswd-encryption md5

    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

    +
    +

    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 authenticate users with client-side certificates, you also have to write an 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.

    Available backends:

    none : Just allows all usernames and passwords.

    @@ -660,13 +660,13 @@ user2:password2

    http_x_remote_user : Takes the user name from the X-Remote-User HTTP header and disables HTTP authentication. This can be used to provide the user name from a reverse proxy.

    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 or similar to generate this files.

    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:

    @@ -676,21 +676,21 @@ user2:password2

    md5 : This uses an iterated md5 digest of the password with a salt.

    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.

    The recommended backend is owner_only. If access to calendars and address books outside the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. Choosing any other method is only useful if you access calendars and address books directly via URL.

    Available backends:

    @@ -700,40 +700,40 @@ user2:password2

    from_file : Load the rules from a file.

    Default: owner_only

    -
    -
    file
    -

    File for the rights backend from_file. See the Rights section.

    +
    +
    file
    +

    File for the rights backend from_file. See the Rights section.

    -
    -

    storage

    -
    -
    type
    +
    +

    storage

    +
    +
    type

    The backend that is used to store data.

    Available backends:

    multifilesystem : Stores the data in the filesystem.

    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
    -

    Command that is run after changes to storage. Take a look at the Versioning with Git tutorial for an example.

    +
    +
    hook
    +

    Command that is run after changes to storage. Take a look at the Versioning with Git tutorial for an example.

    Default:

    -
    -

    web

    -
    -
    type
    +
    +

    web

    +
    +
    type

    The backend that provides the web interface of Radicale.

    Available backends:

    none : Just shows the message "Radicale works!".

    @@ -741,29 +741,29 @@ user2:password2

    Default: internal

    -
    -

    logging

    -
    -
    level
    +
    +

    logging

    +
    +
    level

    Set the logging level.

    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.

    An example to relax the same-origin policy:

    Access-Control-Allow-Origin = *
    -
    -

    Supported Clients

    +
    +

    Supported Clients

    Radicale has been tested with:

    • Android with DAVx⁵ (formerly DAVdroid)
    • @@ -773,33 +773,33 @@ user2:password2

    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.

    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.

    In Evolution add a new calendar and address book respectively with WebDAV. 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. http://localhost:5232/user/calendar). If you want to add calendars from 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. No additional configuration is required.

    Set the URL of the Radicale server in config.js. If InfCloud is not hosted on the same server and port as Radicale, the browser will deny access to the Radicale server, because of the same-origin policy. 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 (e.g. DAVx⁵).

    To create a new calendar run something like:

    $ curl -u user -X MKCOL 'http://localhost:5232/user/calendar' --data \
    @@ -842,8 +842,8 @@ user2:password2
    $ 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 section must point to the rights file.

    The recommended rights method is owner_only. If access to calendars and address books outside the home directory of users (that's /USERNAME/) is granted, clients won't detect these collections and will not show them to the user. This is only useful if you access calendars and address books directly via URL.

    An example rights file:

    @@ -879,12 +879,12 @@ user2:password2
  • w: write address book and calendar collections
  • -
    -

    Storage

    +
    +

    Storage

    This document describes the layout and format of the file system storage (multifilesystem backend).

    -

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Versioning with Git).

    -
    -

    Layout

    +

    It's safe to access and manipulate the data by hand or with scripts. Scripts can be invoked manually, periodically (e.g. with cron) or after each change to the storage with the configuration option hook in the storage section (e.g. Versioning with Git).

    +
    +

    Layout

    The file system contains the following files and folders:

    • .Radicale.lock: The lock file for locking the storage.
    • @@ -897,28 +897,28 @@ user2:password2

      Caches and sync-tokens are stored in the .Radicale.cache folder inside of collections. This folder may be created or modified, while the storage is locked for shared access. In theory, it should be safe to delete the folder. Caches will be recreated automatically and clients will be told that their sync-token isn't valid anymore.

      You may encounter files or folders that start with .Radicale.tmp-. Radicale uses them for atomic creation and deletion of files and folders. 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 utility.

    # Exclusive
     $ flock --exclusive /path/to/storage/.Radicale.lock COMMAND
     # Shared
     $ flock --shared /path/to/storage/.Radicale.lock COMMAND
    -
    -
    Linux and MacOS
    +
    +
    Linux and MacOS

    Use the flock syscall. Python provides it in the fcntl module.

    -
    -
    Windows
    +
    +
    Windows

    Use LockFile for exclusive access or LockFileEx 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). To tell Radicale and clients that the collection is a calendar, you have to create the file .Radicale.props with the following content in the folder:

    {"tag": "VCALENDAR"}

    The calendar is now available at the URL path /user/calendar. For address books the file must contain:

    @@ -927,15 +927,15 @@ user2:password2

    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:

    @@ -981,8 +981,8 @@ user2:password2

    Radicale is not the client part of this architecture. It means that Radicale never draws calendars, address books, events and contacts on the screen. It only stores them and give the possibility to share them online with other people.

    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.

    __init__ : Contains the entry point for WSGI.

    __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.

    @@ -1001,11 +1001,11 @@ user2:password2

    xmlutils : 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.

    The easiest way to develop and install python modules is Distutils. For a minimal setup create the file setup.py with the following content in an empty folder:

    #!/usr/bin/env python3
    @@ -1045,62 +1045,62 @@ user2:password2

    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

    -
    -

    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.

    -
    -

    Hack

    +
    +

    Hack

    Interested in hacking? Feel free to clone the git repository on GitHub 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.

    Download

    -
    -

    PyPI

    +
    +

    PyPI

    Radicale is available on PyPI. To install, just type as superuser:

    $ 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, or install it directly with:

    $ 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.

    -
    -

    Source Packages

    +
    +

    Source Packages

    You can find the source packages of all releases on GitHub.

    -
    -

    Linux Distribution Packages

    +
    +

    Linux Distribution Packages

    Radicale has been packaged for:

    • ArchLinux by David Runge
    • @@ -1121,42 +1121,42 @@ user2:password2

    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.

    Calendar and contact manipulation is available from both local and distant accesses, possibly limited through authentication policies.

    It aims to be a lightweight solution, easy to use, easy to install, easy to configure. As a consequence, it requires few software dependencies and is 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.

    CalDAV and CardDAV are not perfect protocols. We think that their main problem is their complexity, that is why we decided not to implement the whole standard but just enough to understand some of its client-side implementations.

    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 features and use cases, but it is quite hard to implement fully.

    Some calendar servers have been created to follow the CalDAV and CardDAV RFCs as much as possible: Davical, Baïkal and Darwin Calendar Server, for example, are much more respectful of CalDAV and CardDAV and can be used with many clients. They are very good choices if you want to develop and test new CalDAV clients, or if you have a possibly heterogeneous list of user agents.

    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.

    The installation is very easy, particularly with Linux: one dependency, no superuser rights needed, no configuration required, no database. Installing and launching the main script out-of-the-box, as a normal user, are often the only steps to have a simple remote calendar and contact access.

    -

    Contrary to other servers that are often complicated, require high privileges 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.

    +

    Contrary to other servers that are often complicated, require high privileges 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.

    -
    -
    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 given in such cases.

    Radicale often assumes that the clients are perfect and that protocol 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.

    At the beginning, it was just a proof-of-concept. The main goal was to write a small, dirty and simple CalDAV server working with Lightning, using no external libraries. That's how we created a piece of code that's (quite) easy to understand, to use and to hack.

    The first lines have been added to the SVN (!) repository as I was drinking (many) beers at the very end of 2008 (Python 2.6 and 3.0 were just released). It's now packaged for a growing number of Linux distributions.