mirror of
https://github.com/Kozea/Radicale.git
synced 2025-06-26 16:45:52 +00:00
3228 lines
199 KiB
HTML
3228 lines
199 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html lang="en">
|
|
<meta charset="utf-8">
|
|
<meta content="pandoc" name="generator">
|
|
<meta content="width=device-width, initial-scale=1" name="viewport">
|
|
<style>
|
|
code{white-space: pre-wrap;}
|
|
span.smallcaps{font-variant: small-caps;}
|
|
div.columns{display: flex; gap: min(4vw, 1.5em);}
|
|
div.column{flex: auto; overflow-x: auto;}
|
|
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
|
|
/* The extra [class] is a hack that increases specificity enough to
|
|
override a similar rule in reveal.js */
|
|
ul.task-list[class]{list-style: none;}
|
|
ul.task-list li input[type="checkbox"] {
|
|
font-size: inherit;
|
|
width: 0.8em;
|
|
margin: 0 0.8em 0.2em -1.6em;
|
|
vertical-align: middle;
|
|
}
|
|
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
|
|
/* CSS for syntax highlighting */
|
|
pre > code.sourceCode { white-space: pre; position: relative; }
|
|
pre > code.sourceCode > span { line-height: 1.25; }
|
|
pre > code.sourceCode > span:empty { height: 1.2em; }
|
|
.sourceCode { overflow: visible; }
|
|
code.sourceCode > span { color: inherit; text-decoration: inherit; }
|
|
div.sourceCode { margin: 1em 0; }
|
|
pre.sourceCode { margin: 0; }
|
|
@media screen {
|
|
div.sourceCode { overflow: auto; }
|
|
}
|
|
@media print {
|
|
pre > code.sourceCode { white-space: pre-wrap; }
|
|
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
|
|
}
|
|
pre.numberSource code
|
|
{ counter-reset: source-line 0; }
|
|
pre.numberSource code > span
|
|
{ position: relative; left: -4em; counter-increment: source-line; }
|
|
pre.numberSource code > span > a:first-child::before
|
|
{ content: counter(source-line);
|
|
position: relative; left: -1em; text-align: right; vertical-align: baseline;
|
|
border: none; display: inline-block;
|
|
-webkit-touch-callout: none; -webkit-user-select: none;
|
|
-khtml-user-select: none; -moz-user-select: none;
|
|
-ms-user-select: none; user-select: none;
|
|
padding: 0 4px; width: 4em;
|
|
color: #aaaaaa;
|
|
}
|
|
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
|
div.sourceCode
|
|
{ }
|
|
@media screen {
|
|
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
|
|
}
|
|
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
|
|
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
|
|
code span.at { color: #7d9029; } /* Attribute */
|
|
code span.bn { color: #40a070; } /* BaseN */
|
|
code span.bu { color: #008000; } /* BuiltIn */
|
|
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
|
|
code span.ch { color: #4070a0; } /* Char */
|
|
code span.cn { color: #880000; } /* Constant */
|
|
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
|
|
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
|
|
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
|
|
code span.dt { color: #902000; } /* DataType */
|
|
code span.dv { color: #40a070; } /* DecVal */
|
|
code span.er { color: #ff0000; font-weight: bold; } /* Error */
|
|
code span.ex { } /* Extension */
|
|
code span.fl { color: #40a070; } /* Float */
|
|
code span.fu { color: #06287e; } /* Function */
|
|
code span.im { color: #008000; font-weight: bold; } /* Import */
|
|
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
|
|
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
|
|
code span.op { color: #666666; } /* Operator */
|
|
code span.ot { color: #007020; } /* Other */
|
|
code span.pp { color: #bc7a00; } /* Preprocessor */
|
|
code span.sc { color: #4070a0; } /* SpecialChar */
|
|
code span.ss { color: #bb6688; } /* SpecialString */
|
|
code span.st { color: #4070a0; } /* String */
|
|
code span.va { color: #19177c; } /* Variable */
|
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
|
</style>
|
|
<link href="assets/all.css" media="all" rel="stylesheet">
|
|
<link href="assets/screen.css" media="screen" rel="stylesheet">
|
|
<link href="assets/screen-narrow.css" media="screen and (max-width: 50em)" rel="stylesheet">
|
|
<link href="assets/print.css" media="print" rel="stylesheet">
|
|
<noscript><link href="assets/screen-noscript.css" media="screen" rel="stylesheet"></noscript>
|
|
<link href="https://github.com/Kozea/Radicale/releases.atom" rel="alternate" title="Radicale Releases" type="application/atom+xml">
|
|
<link href="assets/icon.png" rel="icon" type="image/png">
|
|
<title>Radicale v2 Documentation</title>
|
|
<meta content="Free and Open-Source CalDAV and CardDAV Server" name="description">
|
|
<script src="assets/navigation.js"></script>
|
|
<script src="assets/document-branches.js"></script>
|
|
<script src="assets/narrow-menu.js"></script>
|
|
<script src="assets/navigation-scroll-fix.js"></script>
|
|
<header>
|
|
<div class="logoContainer">
|
|
<h1>
|
|
Radicale
|
|
<span class="documentBranch">
|
|
<span>v2</span>
|
|
<select style="display: none;">
|
|
<option value="master.html">master</option>
|
|
<option value="v3.html">v3</option>
|
|
<option selected value="v2.html">v2</option>
|
|
<option value="v1.html">v1</option>
|
|
</select>
|
|
</span>
|
|
</h1>
|
|
<p>Free and Open-Source CalDAV and CardDAV Server</p>
|
|
</div>
|
|
<div class="linkContainer">
|
|
<ul>
|
|
<li><a href="https://community.kozea.fr">Made with ❤ by Kozea Community</a></li>
|
|
<li><a href="https://github.com/Kozea/Radicale">Fork me on GitHub</a></li>
|
|
</ul>
|
|
</div>
|
|
</header>
|
|
<main>
|
|
<div class="navButtonContainer" style="display: none;">
|
|
<button data-name="nav-open">Contents</button>
|
|
</div>
|
|
<nav>
|
|
<div class="navContainer">
|
|
<div class="navButtonContainer" style="display: none;">
|
|
<button data-name="nav-close">Close</button>
|
|
</div>
|
|
<h2>Contents</h2>
|
|
<ul>
|
|
<li class="level2"><a href="#getting-started" id="toc-getting-started">Getting
|
|
started</a>
|
|
<ul>
|
|
<li class="level4"><a href="#about-radicale" id="toc-about-radicale">About
|
|
Radicale</a></li>
|
|
<li class="level4"><a href="#installation" id="toc-installation">Installation</a></li>
|
|
<li class="level4"><a href="#whats-new" id="toc-whats-new">What's New?</a></li>
|
|
</ul></li>
|
|
<li class="level2"><a href="#documentation-1" id="toc-documentation-1">Documentation</a>
|
|
<ul>
|
|
<li class="level4"><a href="#install-and-set-up" id="toc-install-and-set-up">Install
|
|
and Set Up</a></li>
|
|
<li class="level4"><a href="#use" id="toc-use">Use</a></li>
|
|
<li class="level4"><a href="#configure" id="toc-configure">Configure</a></li>
|
|
<li class="level4"><a href="#hack" id="toc-hack">Hack</a></li>
|
|
<li class="level3"><a href="#tutorial" id="toc-tutorial">Tutorial</a>
|
|
<ul>
|
|
<li class="level4"><a href="#linux--bsd" id="toc-linux--bsd">Linux / *BSD</a></li>
|
|
<li class="level4"><a href="#windows" id="toc-windows">Windows</a></li>
|
|
<li class="level4"><a href="#macos" id="toc-macos">MacOS</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#basic-setup" id="toc-basic-setup">Basic Setup</a>
|
|
<ul>
|
|
<li class="level4"><a href="#configuration" id="toc-configuration">Configuration</a></li>
|
|
<li class="level4"><a href="#authentication" id="toc-authentication">Authentication</a></li>
|
|
<li class="level4"><a href="#addresses" id="toc-addresses">Addresses</a></li>
|
|
<li class="level4"><a href="#storage" id="toc-storage">Storage</a></li>
|
|
<li class="level4"><a href="#limits" id="toc-limits">Limits</a></li>
|
|
<li class="level4"><a href="#running-as-a-service" id="toc-running-as-a-service">Running as a service</a></li>
|
|
<li class="level4"><a href="#macos-with-launchd" id="toc-macos-with-launchd">MacOS with
|
|
launchd</a></li>
|
|
<li class="level4"><a href="#classic-daemonization" id="toc-classic-daemonization">Classic daemonization</a></li>
|
|
<li class="level4"><a href="#windows-with-nssm---the-non-sucking-service-manager" id="toc-windows-with-nssm---the-non-sucking-service-manager">Windows
|
|
with "NSSM - the Non-Sucking Service Manager"</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#reverse-proxy" id="toc-reverse-proxy">Reverse Proxy</a>
|
|
<ul>
|
|
<li class="level4"><a href="#manage-user-accounts-with-the-reverse-proxy" id="toc-manage-user-accounts-with-the-reverse-proxy">Manage user
|
|
accounts with the reverse proxy</a></li>
|
|
<li class="level4"><a href="#secure-connection-between-radicale-and-the-reverse-proxy" id="toc-secure-connection-between-radicale-and-the-reverse-proxy">Secure
|
|
connection between Radicale and the reverse proxy</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#wsgi" id="toc-wsgi">WSGI</a>
|
|
<ul>
|
|
<li class="level4"><a href="#manage-user-accounts-with-the-wsgi-server" id="toc-manage-user-accounts-with-the-wsgi-server">Manage user accounts
|
|
with the WSGI server</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#versioning" id="toc-versioning">Versioning</a></li>
|
|
<li class="level3"><a href="#clients" id="toc-clients">Clients</a>
|
|
<ul>
|
|
<li class="level4"><a href="#davx⁵" id="toc-davx⁵">DAVx⁵</a></li>
|
|
<li class="level4"><a href="#gnome-calendar-contacts-and-evolution" id="toc-gnome-calendar-contacts-and-evolution">GNOME Calendar, Contacts
|
|
and Evolution</a></li>
|
|
<li class="level4"><a href="#thunderbird" id="toc-thunderbird">Thunderbird</a></li>
|
|
<li class="level4"><a href="#infcloud-caldavzap-and-carddavmate" id="toc-infcloud-caldavzap-and-carddavmate">InfCloud, CalDavZAP and
|
|
CardDavMATE</a></li>
|
|
<li class="level4"><a href="#manual-creation-of-calendars-and-address-books" id="toc-manual-creation-of-calendars-and-address-books">Manual creation
|
|
of calendars and address books</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#configuration-1" id="toc-configuration-1">Configuration</a>
|
|
<ul>
|
|
<li class="level4"><a href="#server" id="toc-server">server</a></li>
|
|
<li class="level4"><a href="#encoding" id="toc-encoding">encoding</a></li>
|
|
<li class="level4"><a href="#auth" id="toc-auth">auth</a></li>
|
|
<li class="level4"><a href="#rights" id="toc-rights">rights</a></li>
|
|
<li class="level4"><a href="#storage-1" id="toc-storage-1">storage</a></li>
|
|
<li class="level4"><a href="#web" id="toc-web">web</a></li>
|
|
<li class="level4"><a href="#logging" id="toc-logging">logging</a></li>
|
|
<li class="level4"><a href="#headers" id="toc-headers">headers</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#authentication-and-rights" id="toc-authentication-and-rights">Authentication and Rights</a></li>
|
|
<li class="level3"><a href="#storage-2" id="toc-storage-2">Storage</a>
|
|
<ul>
|
|
<li class="level4"><a href="#layout" id="toc-layout">Layout</a></li>
|
|
<li class="level4"><a href="#locking" id="toc-locking">Locking</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#logging-1" id="toc-logging-1">Logging</a>
|
|
<ul>
|
|
<li class="level4"><a href="#logging-to-a-file" id="toc-logging-to-a-file">Logging to a
|
|
file</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#architecture" id="toc-architecture">Architecture</a>
|
|
<ul>
|
|
<li class="level4"><a href="#general-architecture" id="toc-general-architecture">General Architecture</a></li>
|
|
<li class="level4"><a href="#code-architecture" id="toc-code-architecture">Code
|
|
Architecture</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#plugins" id="toc-plugins">Plugins</a>
|
|
<ul>
|
|
<li class="level4"><a href="#getting-started-1" id="toc-getting-started-1">Getting
|
|
started</a></li>
|
|
<li class="level4"><a href="#authentication-plugins" id="toc-authentication-plugins">Authentication plugins</a></li>
|
|
<li class="level4"><a href="#rights-management-plugins" id="toc-rights-management-plugins">Rights management plugins</a></li>
|
|
<li class="level4"><a href="#web-plugins" id="toc-web-plugins">Web plugins</a></li>
|
|
<li class="level4"><a href="#storage-plugins" id="toc-storage-plugins">Storage
|
|
plugins</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#migration-from-1xx-to-2xx" id="toc-migration-from-1xx-to-2xx">Migration from 1.x.x to 2.x.x</a>
|
|
<ul>
|
|
<li class="level4"><a href="#why-a-migration" id="toc-why-a-migration">Why a
|
|
Migration?</a></li>
|
|
<li class="level4"><a href="#python-3-only" id="toc-python-3-only">Python 3
|
|
Only</a></li>
|
|
<li class="level4"><a href="#dependencies" id="toc-dependencies">Dependencies</a></li>
|
|
<li class="level4"><a href="#storage-3" id="toc-storage-3">Storage</a></li>
|
|
<li class="level4"><a href="#authentication-1" id="toc-authentication-1">Authentication</a></li>
|
|
<li class="level4"><a href="#rights-1" id="toc-rights-1">Rights</a></li>
|
|
<li class="level4"><a href="#versioning-1" id="toc-versioning-1">Versioning</a></li>
|
|
</ul></li>
|
|
</ul></li>
|
|
<li class="level2"><a href="#contribute" id="toc-contribute">Contribute</a>
|
|
<ul>
|
|
<li class="level4"><a href="#chat-with-us-on-irc" id="toc-chat-with-us-on-irc">Chat
|
|
with Us on IRC</a></li>
|
|
<li class="level4"><a href="#report-bugs" id="toc-report-bugs">Report Bugs</a></li>
|
|
<li class="level4"><a href="#hack-1" id="toc-hack-1">Hack</a></li>
|
|
<li class="level4"><a href="#documentation-2" id="toc-documentation-2">Documentation</a></li>
|
|
</ul></li>
|
|
<li class="level2"><a href="#download" id="toc-download">Download</a>
|
|
<ul>
|
|
<li class="level4"><a href="#pypi" id="toc-pypi">PyPI</a></li>
|
|
<li class="level4"><a href="#git-repository" id="toc-git-repository">Git
|
|
Repository</a></li>
|
|
<li class="level4"><a href="#source-packages" id="toc-source-packages">Source
|
|
Packages</a></li>
|
|
<li class="level4"><a href="#linux-distribution-packages" id="toc-linux-distribution-packages">Linux Distribution
|
|
Packages</a></li>
|
|
</ul></li>
|
|
<li class="level2"><a href="#about" id="toc-about">About</a>
|
|
<ul>
|
|
<li class="level4"><a href="#main-goals" id="toc-main-goals">Main Goals</a></li>
|
|
<li class="level4"><a href="#what-radicale-will-never-be" id="toc-what-radicale-will-never-be">What Radicale Will Never
|
|
Be</a></li>
|
|
<li class="level4"><a href="#technical-choices" id="toc-technical-choices">Technical
|
|
Choices</a></li>
|
|
<li class="level4"><a href="#history" id="toc-history">History</a></li>
|
|
</ul></li>
|
|
<li class="level2"><a href="#news" id="toc-news">News</a>
|
|
<ul>
|
|
<li class="level3"><a href="#may-19-2020---radicale-2112" id="toc-may-19-2020---radicale-2112">May 19, 2020 - Radicale 2.1.12</a>
|
|
<ul>
|
|
<li class="level4"><a href="#2112---wild-radish" id="toc-2112---wild-radish">2.1.12 -
|
|
Wild Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#november-5-2018---radicale-2111" id="toc-november-5-2018---radicale-2111">November 5, 2018 - Radicale
|
|
2.1.11</a>
|
|
<ul>
|
|
<li class="level4"><a href="#2111---wild-radish" id="toc-2111---wild-radish">2.1.11 -
|
|
Wild Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-16-2018---radicale-2110" id="toc-august-16-2018---radicale-2110">August 16, 2018 - Radicale
|
|
2.1.10</a>
|
|
<ul>
|
|
<li class="level4"><a href="#2110---wild-radish" id="toc-2110---wild-radish">2.1.10 -
|
|
Wild Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#april-21-2018---radicale-219" id="toc-april-21-2018---radicale-219">April 21, 2018 - Radicale
|
|
2.1.9</a>
|
|
<ul>
|
|
<li class="level4"><a href="#219---wild-radish" id="toc-219---wild-radish">2.1.9 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#september-24-2017---radicale-218" id="toc-september-24-2017---radicale-218">September 24, 2017 - Radicale
|
|
2.1.8</a>
|
|
<ul>
|
|
<li class="level4"><a href="#218---wild-radish" id="toc-218---wild-radish">2.1.8 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#september-17-2017---radicale-217" id="toc-september-17-2017---radicale-217">September 17, 2017 - Radicale
|
|
2.1.7</a>
|
|
<ul>
|
|
<li class="level4"><a href="#217---wild-radish" id="toc-217---wild-radish">2.1.7 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#september-11-2017---radicale-216" id="toc-september-11-2017---radicale-216">September 11, 2017 - Radicale
|
|
2.1.6</a>
|
|
<ul>
|
|
<li class="level4"><a href="#216---wild-radish" id="toc-216---wild-radish">2.1.6 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-25-2017---radicale-215" id="toc-august-25-2017---radicale-215">August 25, 2017 - Radicale
|
|
2.1.5</a>
|
|
<ul>
|
|
<li class="level4"><a href="#215---wild-radish" id="toc-215---wild-radish">2.1.5 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-4-2017---radicale-214" id="toc-august-4-2017---radicale-214">August 4, 2017 - Radicale
|
|
2.1.4</a>
|
|
<ul>
|
|
<li class="level4"><a href="#214---wild-radish" id="toc-214---wild-radish">2.1.4 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-2-2017---radicale-213" id="toc-august-2-2017---radicale-213">August 2, 2017 - Radicale
|
|
2.1.3</a>
|
|
<ul>
|
|
<li class="level4"><a href="#213---wild-radish" id="toc-213---wild-radish">2.1.3 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-24-2017---radicale-212" id="toc-july-24-2017---radicale-212">July 24, 2017 - Radicale 2.1.2</a>
|
|
<ul>
|
|
<li class="level4"><a href="#212---wild-radish" id="toc-212---wild-radish">2.1.2 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-1-2017---radicale-211" id="toc-july-1-2017---radicale-211">July 1, 2017 - Radicale 2.1.1</a>
|
|
<ul>
|
|
<li class="level4"><a href="#211---wild-radish-again" id="toc-211---wild-radish-again">2.1.1 - Wild Radish Again</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#june-25-2017---radicale-210" id="toc-june-25-2017---radicale-210">June 25, 2017 - Radicale 2.1.0</a>
|
|
<ul>
|
|
<li class="level4"><a href="#210---wild-radish" id="toc-210---wild-radish">2.1.0 - Wild
|
|
Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#may-27-2017---radicale-200" id="toc-may-27-2017---radicale-200">May 27, 2017 - Radicale 2.0.0</a>
|
|
<ul>
|
|
<li class="level4"><a href="#200---little-big-radish" id="toc-200---little-big-radish">2.0.0 - Little Big Radish</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#may-3-2017---radicale-112" id="toc-may-3-2017---radicale-112">May 3, 2017 - Radicale 1.1.2</a>
|
|
<ul>
|
|
<li class="level4"><a href="#112---third-law-of-nature" id="toc-112---third-law-of-nature">1.1.2 - Third Law of Nature</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#december-31-2015---radicale-11" id="toc-december-31-2015---radicale-11">December 31, 2015 - Radicale
|
|
1.1</a>
|
|
<ul>
|
|
<li class="level4"><a href="#11---law-of-nature" id="toc-11---law-of-nature">1.1 - Law
|
|
of Nature</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#september-14-2015---radicale-10-whats-next" id="toc-september-14-2015---radicale-10-whats-next">September 14, 2015 -
|
|
Radicale 1.0, what's next?</a>
|
|
<ul>
|
|
<li class="level4"><a href="#10---sunflower" id="toc-10---sunflower">1.0 -
|
|
Sunflower</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#january-12-2015---radicale-010" id="toc-january-12-2015---radicale-010">January 12, 2015 - Radicale
|
|
0.10</a>
|
|
<ul>
|
|
<li class="level4"><a href="#010---lovely-endless-grass" id="toc-010---lovely-endless-grass">0.10 - Lovely Endless Grass</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-12-2013---radicale-08" id="toc-july-12-2013---radicale-08">July 12, 2013 - Radicale 0.8</a>
|
|
<ul>
|
|
<li class="level4"><a href="#08---rainbow" id="toc-08---rainbow">0.8 - Rainbow</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-3-2012---radicale-071" id="toc-august-3-2012---radicale-071">August 3, 2012 - Radicale
|
|
0.7.1</a>
|
|
<ul>
|
|
<li class="level4"><a href="#071---waterfalls" id="toc-071---waterfalls">0.7.1 -
|
|
Waterfalls</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#march-22-2012---radicale-07" id="toc-march-22-2012---radicale-07">March 22, 2012 - Radicale 0.7</a>
|
|
<ul>
|
|
<li class="level4"><a href="#07---eternal-sunshine" id="toc-07---eternal-sunshine">0.7
|
|
- Eternal Sunshine</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#january-5-2012---radicale-064-news-from-calypso" id="toc-january-5-2012---radicale-064-news-from-calypso">January 5, 2012
|
|
- Radicale 0.6.4, News from Calypso</a>
|
|
<ul>
|
|
<li class="level4"><a href="#064---tulips" id="toc-064---tulips">0.6.4 -
|
|
Tulips</a></li>
|
|
<li class="level4"><a href="#calypso" id="toc-calypso">Calypso</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#november-3-2011---radicale-063" id="toc-november-3-2011---radicale-063">November 3, 2011 - Radicale
|
|
0.6.3</a>
|
|
<ul>
|
|
<li class="level4"><a href="#063---red-roses" id="toc-063---red-roses">0.6.3 - Red
|
|
Roses</a></li>
|
|
<li class="level4"><a href="#whats-new-since-062" id="toc-whats-new-since-062">What's
|
|
New Since 0.6.2?</a></li>
|
|
<li class="level4"><a href="#time-for-a-stable-release" id="toc-time-for-a-stable-release">Time for a Stable Release!</a></li>
|
|
<li class="level4"><a href="#whats-next" id="toc-whats-next">What's Next?</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#september-27-2011---radicale-062" id="toc-september-27-2011---radicale-062">September 27, 2011 - Radicale
|
|
0.6.2</a>
|
|
<ul>
|
|
<li class="level4"><a href="#062---seeds" id="toc-062---seeds">0.6.2 - Seeds</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-28-2011---radicale-061-changes-future" id="toc-august-28-2011---radicale-061-changes-future">August 28, 2011 -
|
|
Radicale 0.6.1, Changes, Future</a>
|
|
<ul>
|
|
<li class="level4"><a href="#061---growing-up" id="toc-061---growing-up">0.6.1 -
|
|
Growing Up</a></li>
|
|
<li class="level4"><a href="#github-mailing-list-new-website" id="toc-github-mailing-list-new-website">GitHub, Mailing List, New
|
|
Website</a></li>
|
|
<li class="level4"><a href="#future-features" id="toc-future-features">Future
|
|
Features</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#august-1-2011---radicale-06-released" id="toc-august-1-2011---radicale-06-released">August 1, 2011 - Radicale
|
|
0.6 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#06---sapling" id="toc-06---sapling">0.6 - Sapling</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-2-2011---feature-freeze-for-06" id="toc-july-2-2011---feature-freeze-for-06">July 2, 2011 - Feature
|
|
Freeze for 0.6</a></li>
|
|
<li class="level3"><a href="#may-1-2011---ready-for-wsgi" id="toc-may-1-2011---ready-for-wsgi">May 1, 2011 - Ready for
|
|
WSGI</a></li>
|
|
<li class="level3"><a href="#april-30-2011---apple-ical-support" id="toc-april-30-2011---apple-ical-support">April 30, 2011 - Apple iCal
|
|
Support</a></li>
|
|
<li class="level3"><a href="#april-25-2011---two-features-and-one-new-roadmap" id="toc-april-25-2011---two-features-and-one-new-roadmap">April 25, 2011
|
|
- Two Features and One New Roadmap</a>
|
|
<ul>
|
|
<li class="level4"><a href="#ldap-authentication" id="toc-ldap-authentication">LDAP
|
|
Authentication</a></li>
|
|
<li class="level4"><a href="#journal-entries" id="toc-journal-entries">Journal
|
|
Entries</a></li>
|
|
<li class="level4"><a href="#new-roadmap" id="toc-new-roadmap">New Roadmap</a></li>
|
|
<li class="level4"><a href="#bugs" id="toc-bugs">Bugs</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#april-10-2011---new-features" id="toc-april-10-2011---new-features">April 10, 2011 - New
|
|
Features</a></li>
|
|
<li class="level3"><a href="#april-2-2011---radicale-05-released" id="toc-april-2-2011---radicale-05-released">April 2, 2011 - Radicale
|
|
0.5 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#05---historical-artifacts" id="toc-05---historical-artifacts">0.5 - Historical Artifacts</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#february-3-2011---jabber-room-and-iphone-support" id="toc-february-3-2011---jabber-room-and-iphone-support">February 3,
|
|
2011 - Jabber Room and iPhone Support</a></li>
|
|
<li class="level3"><a href="#october-21-2010---news-from-radicale" id="toc-october-21-2010---news-from-radicale">October 21, 2010 - News
|
|
from Radicale</a></li>
|
|
<li class="level3"><a href="#august-8-2010---radicale-04-released" id="toc-august-8-2010---radicale-04-released">August 8, 2010 - Radicale
|
|
0.4 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#04---hot-days-back" id="toc-04---hot-days-back">0.4 - Hot
|
|
Days Back</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-4-2010---three-features-added-last-week" id="toc-july-4-2010---three-features-added-last-week">July 4, 2010 -
|
|
Three Features Added Last Week</a></li>
|
|
<li class="level3"><a href="#june-14-2010---radicale-03-released" id="toc-june-14-2010---radicale-03-released">June 14, 2010 - Radicale
|
|
0.3 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#03---dancing-flowers" id="toc-03---dancing-flowers">0.3 -
|
|
Dancing Flowers</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#may-31-2010---may-news" id="toc-may-31-2010---may-news">May 31, 2010 - May News</a>
|
|
<ul>
|
|
<li class="level4"><a href="#news-from-contributors" id="toc-news-from-contributors">News from contributors</a></li>
|
|
<li class="level4"><a href="#news-from-software" id="toc-news-from-software">News from
|
|
software</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#april-19-2010---evolution-supported" id="toc-april-19-2010---evolution-supported">April 19, 2010 - Evolution
|
|
Supported</a></li>
|
|
<li class="level3"><a href="#april-13-2010---radicale-02-released" id="toc-april-13-2010---radicale-02-released">April 13, 2010 - Radicale
|
|
0.2 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#02---snowflakes" id="toc-02---snowflakes">0.2 -
|
|
Snowflakes</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#january-21-2010---https-and-authentication" id="toc-january-21-2010---https-and-authentication">January 21, 2010 -
|
|
HTTPS and Authentication</a></li>
|
|
<li class="level3"><a href="#january-15-2010---ready-for-python-3" id="toc-january-15-2010---ready-for-python-3">January 15, 2010 - Ready
|
|
for Python 3</a></li>
|
|
<li class="level3"><a href="#january-11-2010---twisted-no-longer-required" id="toc-january-11-2010---twisted-no-longer-required">January 11, 2010 -
|
|
Twisted no Longer Required</a></li>
|
|
<li class="level3"><a href="#december-31-2009---lightning-and-sunbird-10b2pre-support" id="toc-december-31-2009---lightning-and-sunbird-10b2pre-support">December
|
|
31, 2009 - Lightning and Sunbird 1.0b2pre Support</a></li>
|
|
<li class="level3"><a href="#december-9-2009---thunderbird-3-released" id="toc-december-9-2009---thunderbird-3-released">December 9, 2009 -
|
|
Thunderbird 3 released</a></li>
|
|
<li class="level3"><a href="#september-1-2009---radicale-01-released" id="toc-september-1-2009---radicale-01-released">September 1, 2009 -
|
|
Radicale 0.1 Released</a>
|
|
<ul>
|
|
<li class="level4"><a href="#01---crazy-vegetables" id="toc-01---crazy-vegetables">0.1
|
|
- Crazy Vegetables</a></li>
|
|
</ul></li>
|
|
<li class="level3"><a href="#july-28-2009---radicale-on-gitorious" id="toc-july-28-2009---radicale-on-gitorious">July 28, 2009 - Radicale
|
|
on Gitorious</a></li>
|
|
<li class="level3"><a href="#july-27-2009---radicale-ready-to-launch" id="toc-july-27-2009---radicale-ready-to-launch">July 27, 2009 -
|
|
Radicale Ready to Launch</a></li>
|
|
</ul></li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
<div class="documentContainer">
|
|
<section class="level2" id="getting-started">
|
|
<h2>Getting started <a class="headerlink" href="#getting-started">¶</a></h2>
|
|
<section class="level4" id="about-radicale">
|
|
<h4>About Radicale <a class="headerlink" href="#about-radicale">¶</a></h4>
|
|
<p>Radicale is a small but powerful CalDAV (calendars, todo-lists) and
|
|
CardDAV (contacts) server, that:</p>
|
|
<ul>
|
|
<li>Shares calendars through CalDAV, WebDAV and HTTP.</li>
|
|
<li>Shares contacts through CardDAV, WebDAV and HTTP.</li>
|
|
<li>Supports events, todos, journal entries and business cards.</li>
|
|
<li>Works out-of-the-box, no installation nor configuration
|
|
required.</li>
|
|
<li>Can warn users on concurrent editing.</li>
|
|
<li>Can limit access by authentication.</li>
|
|
<li>Can secure connections.</li>
|
|
<li>Works with many CalDAV and CardDAV clients.</li>
|
|
<li>Is GPLv3-licensed free software.</li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="installation">
|
|
<h4>Installation <a class="headerlink" href="#installation">¶</a></h4>
|
|
<p>Radicale is really easy to install and works out-of-the-box.</p>
|
|
<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a aria-hidden="true" href="#cb1-1" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale==2.1.<span class="pp">*</span></span>
|
|
<span id="cb1-2"><a aria-hidden="true" href="#cb1-2" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> radicale <span class="at">--config</span> <span class="st">""</span> <span class="at">--storage-filesystem-folder</span><span class="op">=</span>~/.var/lib/radicale/collections</span></code></pre></div>
|
|
<p>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.</p>
|
|
<p>Want more? Why don't you check our wonderful <a href="#documentation-1">documentation</a>?</p>
|
|
</section>
|
|
<section class="level4" id="whats-new">
|
|
<h4>What's New? <a class="headerlink" href="#whats-new">¶</a></h4>
|
|
<p>Latest version of Radicale is 2.1.12, released on May 19, 2020 (<a href="https://github.com/Kozea/Radicale/blob/2.1.12/NEWS.md">changelog</a>).</p>
|
|
<p><a href="#news">Read latest news…</a></p>
|
|
</section>
|
|
</section>
|
|
<section class="level2" id="documentation-1">
|
|
<h2>Documentation <a class="headerlink" href="#documentation-1">¶</a></h2>
|
|
<p>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 <a href="#migration-from-1xx-to-2xx">migration guide</a>. You can find on
|
|
GitHub the <a href="1.1.x.html">documentation page for the 1.1.x
|
|
versions</a>.</p>
|
|
<section class="level4" id="install-and-set-up">
|
|
<h4>Install and Set Up <a class="headerlink" href="#install-and-set-up">¶</a></h4>
|
|
<p>You're new to Radicale and you want to know how to use it? Welcome
|
|
aboard!</p>
|
|
<ul>
|
|
<li><a href="#about">What is Radicale?</a></li>
|
|
<li><a href="#tutorial">A really simple 5-minute tutorial.</a></li>
|
|
<li><a href="#basic-setup">A simple but solid setup.</a></li>
|
|
<li><a href="#reverse-proxy">Run behind a reverse proxy.</a></li>
|
|
<li><a href="#wsgi">Run with a WSGI server.</a></li>
|
|
<li><a href="#versioning">Track all changes to calendars and address
|
|
books with Git.</a></li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="use">
|
|
<h4>Use <a class="headerlink" href="#use">¶</a></h4>
|
|
<ul>
|
|
<li><a href="#clients">Which clients are supported?</a></li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="configure">
|
|
<h4>Configure <a class="headerlink" href="#configure">¶</a></h4>
|
|
<p>Now that you have Radicale running, let's see what we can configure
|
|
to make it fit your needs.</p>
|
|
<ul>
|
|
<li><a href="#configuration-1">What can I configure?</a></li>
|
|
<li><a href="#authentication-and-rights">Authentication &
|
|
Rights.</a></li>
|
|
<li><a href="#storage-2">Storage.</a></li>
|
|
<li><a href="#logging-1">Logging.</a></li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="hack">
|
|
<h4>Hack <a class="headerlink" href="#hack">¶</a></h4>
|
|
<p>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!</p>
|
|
<ul>
|
|
<li><a href="#architecture">How does Radicale work?</a></li>
|
|
<li><a href="#plugins">Plugins.</a></li>
|
|
<li><a href="#contribute">Adding or fixing documentation.</a></li>
|
|
</ul>
|
|
</section>
|
|
<section class="level3" id="tutorial">
|
|
<h3>Tutorial <a class="headerlink" href="#tutorial">¶</a></h3>
|
|
<p>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.</p>
|
|
<p>When everything works, you can get a <a href="#clients">client</a>
|
|
and start creating calendars and address books. The server
|
|
<strong>only</strong> binds to localhost (is <strong>not</strong>
|
|
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 <a href="#basic-setup">some basic configuration</a>.</p>
|
|
<p>Follow one of the chapters below depending on your operating
|
|
system.</p>
|
|
<section class="level4" id="linux--bsd">
|
|
<h4>Linux / *BSD <a class="headerlink" href="#linux--bsd">¶</a></h4>
|
|
<p>First of all, make sure that <strong>python</strong> 3.3 or later
|
|
(<strong>python</strong> ≥ 3.6 is recommended) and <strong>pip</strong>
|
|
are installed. On most distributions it should be enough to install the
|
|
package <code>python3-pip</code>.</p>
|
|
<p>Then open a console and type:</p>
|
|
<div class="sourceCode" id="cb2"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a aria-hidden="true" href="#cb2-1" tabindex="-1"></a><span class="co"># Run the following command as root or</span></span>
|
|
<span id="cb2-2"><a aria-hidden="true" href="#cb2-2" tabindex="-1"></a><span class="co"># add the --user argument to only install for the current user</span></span>
|
|
<span id="cb2-3"><a aria-hidden="true" href="#cb2-3" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale==2.1.<span class="pp">*</span></span>
|
|
<span id="cb2-4"><a aria-hidden="true" href="#cb2-4" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> radicale <span class="at">--config</span> <span class="st">""</span> <span class="at">--storage-filesystem-folder</span><span class="op">=</span>~/.var/lib/radicale/collections</span></code></pre></div>
|
|
<p>Victory! Open <a href="http://localhost:5232/">http://localhost:5232/</a> in your
|
|
browser! You can login with any username and password.</p>
|
|
</section>
|
|
<section class="level4" id="windows">
|
|
<h4>Windows <a class="headerlink" href="#windows">¶</a></h4>
|
|
<p>The first step is to install Python. Go to <a href="https://python.org">python.org</a> 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!</p>
|
|
<p>Launch a command prompt and type:</p>
|
|
<div class="sourceCode" id="cb3"><pre class="sourceCode powershell"><code class="sourceCode powershell"><span id="cb3-1"><a aria-hidden="true" href="#cb3-1" tabindex="-1"></a>C<span class="op">:</span>\Users\User<span class="op">></span> python <span class="op">-</span>m pip install <span class="op">--</span>upgrade radicale<span class="op">==</span>2<span class="op">.</span><span class="fu">1</span><span class="op">.*</span></span>
|
|
<span id="cb3-2"><a aria-hidden="true" href="#cb3-2" tabindex="-1"></a>C<span class="op">:</span>\Users\User<span class="op">></span> python <span class="op">-</span>m radicale <span class="op">--</span>config <span class="st">""</span> <span class="op">--</span>storage<span class="op">-</span>filesystem<span class="op">-</span>folder<span class="op">=~/</span>radicale<span class="op">/</span>collections</span></code></pre></div>
|
|
<p>If you are using PowerShell replace <code>--config ""</code> with
|
|
<code>--config '""'</code>.</p>
|
|
<p>Victory! Open <a href="http://localhost:5232/">http://localhost:5232/</a> in your
|
|
browser! You can login with any username and password.</p>
|
|
</section>
|
|
<section class="level4" id="macos">
|
|
<h4>MacOS <a class="headerlink" href="#macos">¶</a></h4>
|
|
<p><em>To be written.</em></p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="basic-setup">
|
|
<h3>Basic Setup <a class="headerlink" href="#basic-setup">¶</a></h3>
|
|
<p>Installation instructions can be found on the <a href="#tutorial">Tutorial</a> page.</p>
|
|
<section class="level4" id="configuration">
|
|
<h4>Configuration <a class="headerlink" href="#configuration">¶</a></h4>
|
|
<p>Radicale tries to load configuration files from
|
|
<code>/etc/radicale/config</code>,
|
|
<code>~/.config/radicale/config</code> and the
|
|
<code>RADICALE_CONFIG</code> environment variable. A custom path can be
|
|
specified with the <code>--config /path/to/config</code> command line
|
|
argument.</p>
|
|
<p>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.)</p>
|
|
<p>All configuration options are described in detail on the <a href="#configuration-1">Configuration</a> page.</p>
|
|
</section>
|
|
<section class="level4" id="authentication">
|
|
<h4>Authentication <a class="headerlink" href="#authentication">¶</a></h4>
|
|
<p>In its default configuration Radicale doesn't check user names or
|
|
passwords. If the server is reachable over a network, you should change
|
|
this.</p>
|
|
<p>First a <code>users</code> file with all user names and passwords
|
|
must be created. It can be stored in the same directory as the
|
|
configuration file.</p>
|
|
<section class="level5" id="the-secure-way">
|
|
<h5>The secure way <a class="headerlink" href="#the-secure-way">¶</a></h5>
|
|
<p>The <code>users</code> file can be created and managed with <a href="https://httpd.apache.org/docs/current/programs/htpasswd.html">htpasswd</a>:</p>
|
|
<div class="sourceCode" id="cb4"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb4-1"><a aria-hidden="true" href="#cb4-1" tabindex="-1"></a><span class="co"># Create a new htpasswd file with the user "user1"</span></span>
|
|
<span id="cb4-2"><a aria-hidden="true" href="#cb4-2" tabindex="-1"></a><span class="ex">$</span> htpasswd <span class="at">-B</span> <span class="at">-c</span> /path/to/users user1</span>
|
|
<span id="cb4-3"><a aria-hidden="true" href="#cb4-3" tabindex="-1"></a><span class="ex">New</span> password:</span>
|
|
<span id="cb4-4"><a aria-hidden="true" href="#cb4-4" tabindex="-1"></a><span class="ex">Re-type</span> new password:</span>
|
|
<span id="cb4-5"><a aria-hidden="true" href="#cb4-5" tabindex="-1"></a><span class="co"># Add another user</span></span>
|
|
<span id="cb4-6"><a aria-hidden="true" href="#cb4-6" tabindex="-1"></a><span class="ex">$</span> htpasswd <span class="at">-B</span> /path/to/users user2</span>
|
|
<span id="cb4-7"><a aria-hidden="true" href="#cb4-7" tabindex="-1"></a><span class="ex">New</span> password:</span>
|
|
<span id="cb4-8"><a aria-hidden="true" href="#cb4-8" tabindex="-1"></a><span class="ex">Re-type</span> new password:</span></code></pre></div>
|
|
<p><strong>bcrypt</strong> is used to secure the passwords. Radicale
|
|
requires additional dependencies for this encryption method:</p>
|
|
<div class="sourceCode" id="cb5"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a aria-hidden="true" href="#cb5-1" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale<span class="pp">[</span><span class="ss">bcrypt</span><span class="pp">]</span>==2.1.<span class="pp">*</span></span></code></pre></div>
|
|
<p>Authentication can be enabled with the following configuration:</p>
|
|
<div class="sourceCode" id="cb6"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb6-1"><a aria-hidden="true" href="#cb6-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
|
<span id="cb6-2"><a aria-hidden="true" href="#cb6-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
|
<span id="cb6-3"><a aria-hidden="true" href="#cb6-3" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> /path/to/users</span></span>
|
|
<span id="cb6-4"><a aria-hidden="true" href="#cb6-4" tabindex="-1"></a><span class="co"># encryption method used in the htpasswd file</span></span>
|
|
<span id="cb6-5"><a aria-hidden="true" href="#cb6-5" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> bcrypt</span></span></code></pre></div>
|
|
</section>
|
|
<section class="level5" id="the-simple-but-insecure-way">
|
|
<h5>The simple but insecure way <a class="headerlink" href="#the-simple-but-insecure-way">¶</a></h5>
|
|
<p>Create the <code>users</code> file by hand with lines containing the
|
|
user name and password separated by <code>:</code>. Example:</p>
|
|
<pre class="htpasswd"><code>user1:password1
|
|
user2:password2</code></pre>
|
|
<p>Authentication can be enabled with the following configuration:</p>
|
|
<div class="sourceCode" id="cb8"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb8-1"><a aria-hidden="true" href="#cb8-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
|
<span id="cb8-2"><a aria-hidden="true" href="#cb8-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
|
<span id="cb8-3"><a aria-hidden="true" href="#cb8-3" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> /path/to/users</span></span>
|
|
<span id="cb8-4"><a aria-hidden="true" href="#cb8-4" tabindex="-1"></a><span class="co"># encryption method used in the htpasswd file</span></span>
|
|
<span id="cb8-5"><a aria-hidden="true" href="#cb8-5" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> plain</span></span></code></pre></div>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="addresses">
|
|
<h4>Addresses <a class="headerlink" href="#addresses">¶</a></h4>
|
|
<p>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:</p>
|
|
<div class="sourceCode" id="cb9"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb9-1"><a aria-hidden="true" href="#cb9-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
|
<span id="cb9-2"><a aria-hidden="true" href="#cb9-2" tabindex="-1"></a><span class="dt">hosts </span><span class="ot">=</span><span class="st"> 0.0.0.0:5232</span></span></code></pre></div>
|
|
<p>More addresses can be added (separated by commas).</p>
|
|
</section>
|
|
<section class="level4" id="storage">
|
|
<h4>Storage <a class="headerlink" href="#storage">¶</a></h4>
|
|
<p>Data is stored in the folder
|
|
<code>/var/lib/radicale/collections</code>. The path can be changed with
|
|
the following configuration:</p>
|
|
<div class="sourceCode" id="cb10"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb10-1"><a aria-hidden="true" href="#cb10-1" tabindex="-1"></a><span class="kw">[storage]</span></span>
|
|
<span id="cb10-2"><a aria-hidden="true" href="#cb10-2" tabindex="-1"></a><span class="dt">filesystem_folder </span><span class="ot">=</span><span class="st"> /path/to/storage</span></span></code></pre></div>
|
|
<p><strong>Security:</strong> 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
|
|
<strong>Running as a service</strong> section.</p>
|
|
</section>
|
|
<section class="level4" id="limits">
|
|
<h4>Limits <a class="headerlink" href="#limits">¶</a></h4>
|
|
<p>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.</p>
|
|
<div class="sourceCode" id="cb11"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb11-1"><a aria-hidden="true" href="#cb11-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
|
<span id="cb11-2"><a aria-hidden="true" href="#cb11-2" tabindex="-1"></a><span class="dt">max_connections </span><span class="ot">=</span><span class="st"> </span><span class="dv">20</span></span>
|
|
<span id="cb11-3"><a aria-hidden="true" href="#cb11-3" tabindex="-1"></a><span class="co"># 100 Megabyte</span></span>
|
|
<span id="cb11-4"><a aria-hidden="true" href="#cb11-4" tabindex="-1"></a><span class="dt">max_content_length </span><span class="ot">=</span><span class="st"> </span><span class="dv">100000000</span></span>
|
|
<span id="cb11-5"><a aria-hidden="true" href="#cb11-5" tabindex="-1"></a><span class="co"># 30 seconds</span></span>
|
|
<span id="cb11-6"><a aria-hidden="true" href="#cb11-6" tabindex="-1"></a><span class="dt">timeout </span><span class="ot">=</span><span class="st"> </span><span class="dv">30</span></span>
|
|
<span id="cb11-7"><a aria-hidden="true" href="#cb11-7" tabindex="-1"></a></span>
|
|
<span id="cb11-8"><a aria-hidden="true" href="#cb11-8" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
|
<span id="cb11-9"><a aria-hidden="true" href="#cb11-9" tabindex="-1"></a><span class="co"># Average delay after failed login attempts in seconds</span></span>
|
|
<span id="cb11-10"><a aria-hidden="true" href="#cb11-10" tabindex="-1"></a><span class="dt">delay </span><span class="ot">=</span><span class="st"> </span><span class="dv">1</span></span></code></pre></div>
|
|
</section>
|
|
<section class="level4" id="running-as-a-service">
|
|
<h4>Running as a service <a class="headerlink" href="#running-as-a-service">¶</a></h4>
|
|
<p>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.</p>
|
|
<section class="level5" id="linux-with-systemd-as-a-user">
|
|
<h5>Linux with systemd as a user <a class="headerlink" href="#linux-with-systemd-as-a-user">¶</a></h5>
|
|
<p>Create the file
|
|
<code>~/.config/systemd/user/radicale.service</code>:</p>
|
|
<div class="sourceCode" id="cb12"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb12-1"><a aria-hidden="true" href="#cb12-1" tabindex="-1"></a><span class="kw">[Unit]</span></span>
|
|
<span id="cb12-2"><a aria-hidden="true" href="#cb12-2" tabindex="-1"></a><span class="dt">Description</span><span class="ot">=</span><span class="st">A simple CalDAV (calendar) and CardDAV (contact) server</span></span>
|
|
<span id="cb12-3"><a aria-hidden="true" href="#cb12-3" tabindex="-1"></a></span>
|
|
<span id="cb12-4"><a aria-hidden="true" href="#cb12-4" tabindex="-1"></a><span class="kw">[Service]</span></span>
|
|
<span id="cb12-5"><a aria-hidden="true" href="#cb12-5" tabindex="-1"></a><span class="dt">ExecStart</span><span class="ot">=</span><span class="st">/usr/bin/env python3 -m radicale</span></span>
|
|
<span id="cb12-6"><a aria-hidden="true" href="#cb12-6" tabindex="-1"></a><span class="dt">Restart</span><span class="ot">=</span><span class="st">on-failure</span></span>
|
|
<span id="cb12-7"><a aria-hidden="true" href="#cb12-7" tabindex="-1"></a></span>
|
|
<span id="cb12-8"><a aria-hidden="true" href="#cb12-8" tabindex="-1"></a><span class="kw">[Install]</span></span>
|
|
<span id="cb12-9"><a aria-hidden="true" href="#cb12-9" tabindex="-1"></a><span class="dt">WantedBy</span><span class="ot">=</span><span class="st">default.target</span></span></code></pre></div>
|
|
<p>Radicale will load the configuration file from
|
|
<code>~/.config/radicale/config</code>. You should set the configuration
|
|
option <code>filesystem_folder</code> in the <code>storage</code>
|
|
section to something like
|
|
<code>~/.var/lib/radicale/collections</code>.</p>
|
|
<p>To enable and manage the service run:</p>
|
|
<div class="sourceCode" id="cb13"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb13-1"><a aria-hidden="true" href="#cb13-1" tabindex="-1"></a><span class="co"># Enable the service</span></span>
|
|
<span id="cb13-2"><a aria-hidden="true" href="#cb13-2" tabindex="-1"></a><span class="ex">$</span> systemctl <span class="at">--user</span> enable radicale</span>
|
|
<span id="cb13-3"><a aria-hidden="true" href="#cb13-3" tabindex="-1"></a><span class="co"># Start the service</span></span>
|
|
<span id="cb13-4"><a aria-hidden="true" href="#cb13-4" tabindex="-1"></a><span class="ex">$</span> systemctl <span class="at">--user</span> start radicale</span>
|
|
<span id="cb13-5"><a aria-hidden="true" href="#cb13-5" tabindex="-1"></a><span class="co"># Check the status of the service</span></span>
|
|
<span id="cb13-6"><a aria-hidden="true" href="#cb13-6" tabindex="-1"></a><span class="ex">$</span> systemctl <span class="at">--user</span> status radicale</span>
|
|
<span id="cb13-7"><a aria-hidden="true" href="#cb13-7" tabindex="-1"></a><span class="co"># View all log messages</span></span>
|
|
<span id="cb13-8"><a aria-hidden="true" href="#cb13-8" tabindex="-1"></a><span class="ex">$</span> journalctl <span class="at">--user</span> <span class="at">--unit</span> radicale.service</span></code></pre></div>
|
|
</section>
|
|
<section class="level5" id="linux-with-systemd-system-wide">
|
|
<h5>Linux with systemd system-wide <a class="headerlink" href="#linux-with-systemd-system-wide">¶</a></h5>
|
|
<p>Create the <strong>radicale</strong> user and group for the Radicale
|
|
service. (Run
|
|
<code>useradd --system --home-dir / --shell /sbin/nologin radicale</code>
|
|
as root.) The storage folder must be writable by
|
|
<strong>radicale</strong>. (Run
|
|
<code>mkdir -p /var/lib/radicale/collections && chown -R radicale:radicale /var/lib/radicale/collections</code>
|
|
as root.)</p>
|
|
<p><strong>Security:</strong> The storage should not be readable by
|
|
others. (Run <code>chmod -R o= /var/lib/radicale/collections</code> as
|
|
root.)</p>
|
|
<p>Create the file
|
|
<code>/etc/systemd/system/radicale.service</code>:</p>
|
|
<div class="sourceCode" id="cb14"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb14-1"><a aria-hidden="true" href="#cb14-1" tabindex="-1"></a><span class="kw">[Unit]</span></span>
|
|
<span id="cb14-2"><a aria-hidden="true" href="#cb14-2" tabindex="-1"></a><span class="dt">Description</span><span class="ot">=</span><span class="st">A simple CalDAV (calendar) and CardDAV (contact) server</span></span>
|
|
<span id="cb14-3"><a aria-hidden="true" href="#cb14-3" tabindex="-1"></a><span class="dt">After</span><span class="ot">=</span><span class="st">network.target</span></span>
|
|
<span id="cb14-4"><a aria-hidden="true" href="#cb14-4" tabindex="-1"></a><span class="dt">Requires</span><span class="ot">=</span><span class="st">network.target</span></span>
|
|
<span id="cb14-5"><a aria-hidden="true" href="#cb14-5" tabindex="-1"></a></span>
|
|
<span id="cb14-6"><a aria-hidden="true" href="#cb14-6" tabindex="-1"></a><span class="kw">[Service]</span></span>
|
|
<span id="cb14-7"><a aria-hidden="true" href="#cb14-7" tabindex="-1"></a><span class="dt">ExecStart</span><span class="ot">=</span><span class="st">/usr/bin/env python3 -m radicale</span></span>
|
|
<span id="cb14-8"><a aria-hidden="true" href="#cb14-8" tabindex="-1"></a><span class="dt">Restart</span><span class="ot">=</span><span class="st">on-failure</span></span>
|
|
<span id="cb14-9"><a aria-hidden="true" href="#cb14-9" tabindex="-1"></a><span class="dt">User</span><span class="ot">=</span><span class="st">radicale</span></span>
|
|
<span id="cb14-10"><a aria-hidden="true" href="#cb14-10" tabindex="-1"></a><span class="co"># Deny other users access to the calendar data</span></span>
|
|
<span id="cb14-11"><a aria-hidden="true" href="#cb14-11" tabindex="-1"></a><span class="dt">UMask</span><span class="ot">=</span><span class="dv">0027</span></span>
|
|
<span id="cb14-12"><a aria-hidden="true" href="#cb14-12" tabindex="-1"></a><span class="co"># Optional security settings</span></span>
|
|
<span id="cb14-13"><a aria-hidden="true" href="#cb14-13" tabindex="-1"></a><span class="dt">PrivateTmp</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-14"><a aria-hidden="true" href="#cb14-14" tabindex="-1"></a><span class="dt">ProtectSystem</span><span class="ot">=</span><span class="st">strict</span></span>
|
|
<span id="cb14-15"><a aria-hidden="true" href="#cb14-15" tabindex="-1"></a><span class="dt">ProtectHome</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-16"><a aria-hidden="true" href="#cb14-16" tabindex="-1"></a><span class="dt">PrivateDevices</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-17"><a aria-hidden="true" href="#cb14-17" tabindex="-1"></a><span class="dt">ProtectKernelTunables</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-18"><a aria-hidden="true" href="#cb14-18" tabindex="-1"></a><span class="dt">ProtectKernelModules</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-19"><a aria-hidden="true" href="#cb14-19" tabindex="-1"></a><span class="dt">ProtectControlGroups</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-20"><a aria-hidden="true" href="#cb14-20" tabindex="-1"></a><span class="dt">NoNewPrivileges</span><span class="ot">=</span><span class="kw">true</span></span>
|
|
<span id="cb14-21"><a aria-hidden="true" href="#cb14-21" tabindex="-1"></a><span class="dt">ReadWritePaths</span><span class="ot">=</span><span class="st">/var/lib/radicale/collections</span></span>
|
|
<span id="cb14-22"><a aria-hidden="true" href="#cb14-22" tabindex="-1"></a></span>
|
|
<span id="cb14-23"><a aria-hidden="true" href="#cb14-23" tabindex="-1"></a><span class="kw">[Install]</span></span>
|
|
<span id="cb14-24"><a aria-hidden="true" href="#cb14-24" tabindex="-1"></a><span class="dt">WantedBy</span><span class="ot">=</span><span class="st">multi-user.target</span></span></code></pre></div>
|
|
<p>Radicale will load the configuration file from
|
|
<code>/etc/radicale/config</code>.</p>
|
|
<p>To enable and manage the service run:</p>
|
|
<div class="sourceCode" id="cb15"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb15-1"><a aria-hidden="true" href="#cb15-1" tabindex="-1"></a><span class="co"># Enable the service</span></span>
|
|
<span id="cb15-2"><a aria-hidden="true" href="#cb15-2" tabindex="-1"></a><span class="ex">$</span> systemctl enable radicale</span>
|
|
<span id="cb15-3"><a aria-hidden="true" href="#cb15-3" tabindex="-1"></a><span class="co"># Start the service</span></span>
|
|
<span id="cb15-4"><a aria-hidden="true" href="#cb15-4" tabindex="-1"></a><span class="ex">$</span> systemctl start radicale</span>
|
|
<span id="cb15-5"><a aria-hidden="true" href="#cb15-5" tabindex="-1"></a><span class="co"># Check the status of the service</span></span>
|
|
<span id="cb15-6"><a aria-hidden="true" href="#cb15-6" tabindex="-1"></a><span class="ex">$</span> systemctl status radicale</span>
|
|
<span id="cb15-7"><a aria-hidden="true" href="#cb15-7" tabindex="-1"></a><span class="co"># View all log messages</span></span>
|
|
<span id="cb15-8"><a aria-hidden="true" href="#cb15-8" tabindex="-1"></a><span class="ex">$</span> journalctl <span class="at">--unit</span> radicale.service</span></code></pre></div>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="macos-with-launchd">
|
|
<h4>MacOS with launchd <a class="headerlink" href="#macos-with-launchd">¶</a></h4>
|
|
<p><em>To be written.</em></p>
|
|
</section>
|
|
<section class="level4" id="classic-daemonization">
|
|
<h4>Classic daemonization <a class="headerlink" href="#classic-daemonization">¶</a></h4>
|
|
<p>Set the configuration option <code>daemon</code> in the section
|
|
<code>server</code> to <code>True</code>. You may want to set the option
|
|
<code>pid</code> to the path of a PID file.</p>
|
|
<p>After daemonization the server will not log anything. You have to
|
|
configure <a href="#logging-1">Logging</a>.</p>
|
|
<p>If you start Radicale now, it will initialize and fork into the
|
|
background. The main process exits, after the PID file is written.</p>
|
|
<p><strong>Security:</strong> You can set the <strong>umask</strong>
|
|
with <code>umask 0027</code> 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!</p>
|
|
</section>
|
|
<section class="level4" id="windows-with-nssm---the-non-sucking-service-manager">
|
|
<h4>Windows with "NSSM - the Non-Sucking Service Manager" <a class="headerlink" href="#windows-with-nssm---the-non-sucking-service-manager">¶</a></h4>
|
|
<p>First install <a href="https://nssm.cc/">NSSM</a> and start
|
|
<code>nssm install</code> in a command prompt. Apply the following
|
|
configuration:</p>
|
|
<ul>
|
|
<li>Service name: <code>Radicale</code></li>
|
|
<li>Application
|
|
<ul>
|
|
<li>Path: <code>C:\Path\To\Python\python.exe</code></li>
|
|
<li>Arguments: <code>-m radicale --config C:\Path\To\Config</code></li>
|
|
</ul></li>
|
|
<li>I/O redirection
|
|
<ul>
|
|
<li>Error: <code>C:\Path\To\Radicale.log</code></li>
|
|
</ul></li>
|
|
</ul>
|
|
<p><strong>Security:</strong> Be aware that the service runs in the
|
|
local system account, you might want to change this. Managing user
|
|
accounts is beyond the scope of this manual. Also make sure that the
|
|
storage folder and log file is not readable by unauthorized users.</p>
|
|
<p>The log file might grow very big over time, you can configure file
|
|
rotation in <strong>NSSM</strong> to prevent this.</p>
|
|
<p>The service is configured to start automatically when the computer
|
|
starts. To start the service manually open <strong>Services</strong> in
|
|
<strong>Computer Management</strong> and start the
|
|
<strong>Radicale</strong> service.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="reverse-proxy">
|
|
<h3>Reverse Proxy <a class="headerlink" href="#reverse-proxy">¶</a></h3>
|
|
<p>When a reverse proxy is used, the path at which Radicale is available
|
|
must be provided via the <code>X-Script-Name</code> header. The proxy
|
|
must remove the location from the URL path that is forwarded to
|
|
Radicale.</p>
|
|
<p>Example <strong>nginx</strong> configuration:</p>
|
|
<pre class="nginx"><code>location /radicale/ { # The trailing / is important!
|
|
proxy_pass http://localhost:5232/; # The / is important!
|
|
proxy_set_header X-Script-Name /radicale;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_pass_header Authorization;
|
|
}</code></pre>
|
|
<p>Example <strong>Apache</strong> configuration:</p>
|
|
<div class="sourceCode" id="cb17"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb17-1"><a aria-hidden="true" href="#cb17-1" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
|
<span id="cb17-2"><a aria-hidden="true" href="#cb17-2" tabindex="-1"></a>RewriteRule<span class="st"> ^/radicale$ /radicale/ [R,L]</span></span>
|
|
<span id="cb17-3"><a aria-hidden="true" href="#cb17-3" tabindex="-1"></a></span>
|
|
<span id="cb17-4"><a aria-hidden="true" href="#cb17-4" tabindex="-1"></a><span class="fu"><Location</span><span class="at"> "/radicale/"</span><span class="fu">></span></span>
|
|
<span id="cb17-5"><a aria-hidden="true" href="#cb17-5" tabindex="-1"></a> ProxyPass<span class="st"> http://localhost:5232/ retry=0</span></span>
|
|
<span id="cb17-6"><a aria-hidden="true" href="#cb17-6" tabindex="-1"></a> ProxyPassReverse<span class="st"> http://localhost:5232/</span></span>
|
|
<span id="cb17-7"><a aria-hidden="true" href="#cb17-7" tabindex="-1"></a> RequestHeader<span class="st"> set X-Script-Name /radicale/</span></span>
|
|
<span id="cb17-8"><a aria-hidden="true" href="#cb17-8" tabindex="-1"></a><span class="fu"></Location></span></span></code></pre></div>
|
|
<p>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.</p>
|
|
<section class="level4" id="manage-user-accounts-with-the-reverse-proxy">
|
|
<h4>Manage user accounts with the reverse proxy <a class="headerlink" href="#manage-user-accounts-with-the-reverse-proxy">¶</a></h4>
|
|
<p>Set the configuration option <code>type</code> in the
|
|
<code>auth</code> section to <code>http_x_remote_user</code>. Radicale
|
|
uses the user name provided in the <code>X-Remote-User</code> HTTP
|
|
header and disables HTTP authentication.</p>
|
|
<p>Example <strong>nginx</strong> configuration:</p>
|
|
<pre class="nginx"><code>location /radicale/ {
|
|
proxy_pass http://localhost:5232/;
|
|
proxy_set_header X-Script-Name /radicale;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Remote-User $remote_user;
|
|
auth_basic "Radicale - Password Required";
|
|
auth_basic_user_file /etc/nginx/htpasswd;
|
|
}</code></pre>
|
|
<p>Example <strong>Apache</strong> configuration:</p>
|
|
<div class="sourceCode" id="cb19"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb19-1"><a aria-hidden="true" href="#cb19-1" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
|
<span id="cb19-2"><a aria-hidden="true" href="#cb19-2" tabindex="-1"></a>RewriteRule<span class="st"> ^/radicale$ /radicale/ [R,L]</span></span>
|
|
<span id="cb19-3"><a aria-hidden="true" href="#cb19-3" tabindex="-1"></a></span>
|
|
<span id="cb19-4"><a aria-hidden="true" href="#cb19-4" tabindex="-1"></a><span class="fu"><Location</span><span class="at"> "/radicale/"</span><span class="fu">></span></span>
|
|
<span id="cb19-5"><a aria-hidden="true" href="#cb19-5" tabindex="-1"></a> <span class="ex">AuthType</span><span class="ch"> </span><span class="kw">Basic</span></span>
|
|
<span id="cb19-6"><a aria-hidden="true" href="#cb19-6" tabindex="-1"></a> AuthName<span class="st"> "Radicale - Password Required"</span></span>
|
|
<span id="cb19-7"><a aria-hidden="true" href="#cb19-7" tabindex="-1"></a> AuthUserFile<span class="st"> "/etc/radicale/htpasswd"</span></span>
|
|
<span id="cb19-8"><a aria-hidden="true" href="#cb19-8" tabindex="-1"></a> Require<span class="st"> valid-user</span></span>
|
|
<span id="cb19-9"><a aria-hidden="true" href="#cb19-9" tabindex="-1"></a></span>
|
|
<span id="cb19-10"><a aria-hidden="true" href="#cb19-10" tabindex="-1"></a> ProxyPass<span class="st"> http://localhost:5232/ retry=0</span></span>
|
|
<span id="cb19-11"><a aria-hidden="true" href="#cb19-11" tabindex="-1"></a> ProxyPassReverse<span class="st"> http://localhost:5232/</span></span>
|
|
<span id="cb19-12"><a aria-hidden="true" href="#cb19-12" tabindex="-1"></a> RequestHeader<span class="st"> set X-Script-Name /radicale/</span></span>
|
|
<span id="cb19-13"><a aria-hidden="true" href="#cb19-13" tabindex="-1"></a> RequestHeader<span class="st"> set X-Remote-User expr=%{REMOTE_USER}</span></span>
|
|
<span id="cb19-14"><a aria-hidden="true" href="#cb19-14" tabindex="-1"></a><span class="fu"></Location></span></span></code></pre></div>
|
|
<p><strong>Security:</strong> Untrusted clients should not be able to
|
|
access the Radicale server directly. Otherwise, they can authenticate as
|
|
any user.</p>
|
|
</section>
|
|
<section class="level4" id="secure-connection-between-radicale-and-the-reverse-proxy">
|
|
<h4>Secure connection between Radicale and the reverse proxy <a class="headerlink" href="#secure-connection-between-radicale-and-the-reverse-proxy">¶</a></h4>
|
|
<p>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.</p>
|
|
<div class="sourceCode" id="cb20"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb20-1"><a aria-hidden="true" href="#cb20-1" tabindex="-1"></a><span class="ex">$</span> openssl req <span class="at">-x509</span> <span class="at">-newkey</span> rsa:4096 <span class="at">-keyout</span> server_key.pem <span class="at">-out</span> server_cert.pem <span class="at">-nodes</span> <span class="at">-days</span> 9999</span>
|
|
<span id="cb20-2"><a aria-hidden="true" href="#cb20-2" tabindex="-1"></a><span class="ex">$</span> openssl req <span class="at">-x509</span> <span class="at">-newkey</span> rsa:4096 <span class="at">-keyout</span> client_key.pem <span class="at">-out</span> client_cert.pem <span class="at">-nodes</span> <span class="at">-days</span> 9999</span></code></pre></div>
|
|
<p>Use the following configuration for Radicale:</p>
|
|
<div class="sourceCode" id="cb21"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb21-1"><a aria-hidden="true" href="#cb21-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
|
<span id="cb21-2"><a aria-hidden="true" href="#cb21-2" tabindex="-1"></a><span class="dt">ssl </span><span class="ot">=</span><span class="st"> </span><span class="kw">True</span></span>
|
|
<span id="cb21-3"><a aria-hidden="true" href="#cb21-3" tabindex="-1"></a><span class="dt">certificate </span><span class="ot">=</span><span class="st"> /path/to/server_cert.pem</span></span>
|
|
<span id="cb21-4"><a aria-hidden="true" href="#cb21-4" tabindex="-1"></a><span class="dt">key </span><span class="ot">=</span><span class="st"> /path/to/server_key.pem</span></span>
|
|
<span id="cb21-5"><a aria-hidden="true" href="#cb21-5" tabindex="-1"></a><span class="dt">certificate_authority </span><span class="ot">=</span><span class="st"> /path/to/client_cert.pem</span></span></code></pre></div>
|
|
<p>Example <strong>nginx</strong> configuration:</p>
|
|
<pre class="nginx"><code>location /radicale/ {
|
|
proxy_pass https://localhost:5232/;
|
|
...
|
|
# Place the files somewhere nginx is allowed to access (e.g. /etc/nginx/...).
|
|
proxy_ssl_certificate /path/to/client_cert.pem;
|
|
proxy_ssl_certificate_key /path/to/client_key.pem;
|
|
proxy_ssl_trusted_certificate /path/to/server_cert.pem;
|
|
}</code></pre>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="wsgi">
|
|
<h3>WSGI <a class="headerlink" href="#wsgi">¶</a></h3>
|
|
<p>Radicale is compatible with the WSGI specification.</p>
|
|
<p>A configuration file can be set with the <code>RADICALE_CONFIG</code>
|
|
environment variable, otherwise no configuration file is loaded and the
|
|
default configuration is used.</p>
|
|
<p>Be reminded that Radicale's default configuration enforces limits on
|
|
the maximum upload file size.</p>
|
|
<p><strong>Security:</strong> The <code>None</code> authentication type
|
|
disables all rights checking. Don't use it with
|
|
<code>REMOTE_USER</code>. Use <code>remote_user</code> instead.</p>
|
|
<p>Example <strong>uWSGI</strong> configuration:</p>
|
|
<div class="sourceCode" id="cb23"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb23-1"><a aria-hidden="true" href="#cb23-1" tabindex="-1"></a><span class="kw">[uwsgi]</span></span>
|
|
<span id="cb23-2"><a aria-hidden="true" href="#cb23-2" tabindex="-1"></a><span class="dt">http-socket </span><span class="ot">=</span><span class="st"> 127.0.0.1:5232</span></span>
|
|
<span id="cb23-3"><a aria-hidden="true" href="#cb23-3" tabindex="-1"></a><span class="dt">processes </span><span class="ot">=</span><span class="st"> </span><span class="dv">8</span></span>
|
|
<span id="cb23-4"><a aria-hidden="true" href="#cb23-4" tabindex="-1"></a><span class="dt">plugin </span><span class="ot">=</span><span class="st"> python3</span></span>
|
|
<span id="cb23-5"><a aria-hidden="true" href="#cb23-5" tabindex="-1"></a><span class="dt">module </span><span class="ot">=</span><span class="st"> radicale</span></span>
|
|
<span id="cb23-6"><a aria-hidden="true" href="#cb23-6" tabindex="-1"></a><span class="dt">env </span><span class="ot">=</span><span class="st"> RADICALE_CONFIG=/etc/radicale/config</span></span></code></pre></div>
|
|
<p>Example <strong>Gunicorn</strong> configuration:</p>
|
|
<div class="sourceCode" id="cb24"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb24-1"><a aria-hidden="true" href="#cb24-1" tabindex="-1"></a><span class="ex">gunicorn</span> <span class="at">--bind</span> <span class="st">'127.0.0.1:5232'</span> <span class="at">--workers</span> 8 <span class="at">--env</span> <span class="st">'RADICALE_CONFIG=/etc/radicale/config'</span> radicale</span></code></pre></div>
|
|
<section class="level4" id="manage-user-accounts-with-the-wsgi-server">
|
|
<h4>Manage user accounts with the WSGI server <a class="headerlink" href="#manage-user-accounts-with-the-wsgi-server">¶</a></h4>
|
|
<p>Set the configuration option <code>type</code> in the
|
|
<code>auth</code> section to <code>remote_user</code>. Radicale uses the
|
|
user name provided by the WSGI server and disables authentication over
|
|
HTTP.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="versioning">
|
|
<h3>Versioning <a class="headerlink" href="#versioning">¶</a></h3>
|
|
<p>This page describes how to keep track of all changes to calendars and
|
|
address books with <strong>git</strong> (or any other version control
|
|
system).</p>
|
|
<p>The repository must be initialized by running <code>git init</code>
|
|
in the file system folder. Internal files of Radicale can be excluded by
|
|
creating the file <code>.gitignore</code> with the following
|
|
content:</p>
|
|
<pre><code>.Radicale.cache
|
|
.Radicale.lock
|
|
.Radicale.tmp-*</code></pre>
|
|
<p>The configuration option <code>hook</code> in the
|
|
<code>storage</code> section must be set to the following command:</p>
|
|
<div class="sourceCode" id="cb26"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb26-1"><a aria-hidden="true" href="#cb26-1" tabindex="-1"></a><span class="fu">git</span> add <span class="at">-A</span> <span class="kw">&&</span> <span class="kw">(</span><span class="fu">git</span> diff <span class="at">--cached</span> <span class="at">--quiet</span> <span class="kw">||</span> <span class="fu">git</span> commit <span class="at">-m</span> <span class="st">"Changes by "</span>%<span class="er">(</span><span class="ex">user</span><span class="kw">)</span><span class="ex">s</span><span class="kw">)</span></span></code></pre></div>
|
|
<p>The command gets executed after every change to the storage and
|
|
commits the changes into the <strong>git</strong> repository.</p>
|
|
</section>
|
|
<section class="level3" id="clients">
|
|
<h3>Clients <a class="headerlink" href="#clients">¶</a></h3>
|
|
<p>Radicale has been tested with:</p>
|
|
<ul>
|
|
<li><a href="https://android.com/">Android</a> with <a href="https://www.davx5.com/">DAVx⁵</a> (formerly DAVdroid)</li>
|
|
<li><a href="https://wiki.gnome.org/Apps/Calendar">GNOME Calendar</a>,
|
|
<a href="https://wiki.gnome.org/Apps/Contacts">Contacts</a> and <a href="https://wiki.gnome.org/Apps/Evolution">Evolution</a></li>
|
|
<li><a href="https://www.mozilla.org/thunderbird/">Mozilla
|
|
Thunderbird</a> with <a href="https://addons.mozilla.org/thunderbird/addon/cardbook/">CardBook</a>
|
|
and <a href="https://www.mozilla.org/projects/calendar/">Lightning</a></li>
|
|
<li><a href="https://www.inf-it.com/open-source/clients/infcloud/">InfCloud</a>,
|
|
<a href="https://www.inf-it.com/open-source/clients/caldavzap/">CalDavZAP</a>
|
|
and <a href="https://www.inf-it.com/open-source/clients/carddavmate/">CardDavMATE</a></li>
|
|
</ul>
|
|
<p>Many clients do not support the creation of new calendars and address
|
|
books. You can use Radicale's web interface (e.g. <a href="http://localhost:5232">http://localhost:5232</a>) to create and
|
|
manage collections.</p>
|
|
<p>In some clients you can just enter the URL of the Radicale server
|
|
(e.g. <code>http://localhost:5232</code>) and your user name. In others,
|
|
you have to enter the URL of the collection directly (e.g.
|
|
<code>http://localhost:5232/user/calendar</code>).</p>
|
|
<section class="level4" id="davx⁵">
|
|
<h4>DAVx⁵ <a class="headerlink" href="#davx⁵">¶</a></h4>
|
|
<p>Enter the URL of the Radicale server (e.g.
|
|
<code>http://localhost:5232</code>) and your user name. DAVx⁵ will show
|
|
all existing calendars and address books and you can create new.</p>
|
|
</section>
|
|
<section class="level4" id="gnome-calendar-contacts-and-evolution">
|
|
<h4>GNOME Calendar, Contacts and Evolution <a class="headerlink" href="#gnome-calendar-contacts-and-evolution">¶</a></h4>
|
|
<p><strong>GNOME Calendar</strong> and <strong>Contacts</strong> do not
|
|
support adding WebDAV calendars and address books directly, but you can
|
|
add them in <strong>Evolution</strong>.</p>
|
|
<p>In <strong>Evolution</strong> add a new calendar and address book
|
|
respectively with WebDAV. Enter the URL of the Radicale server (e.g.
|
|
<code>http://localhost:5232</code>) and your user name. Clicking on the
|
|
search button will list the existing calendars and address books.</p>
|
|
</section>
|
|
<section class="level4" id="thunderbird">
|
|
<h4>Thunderbird <a class="headerlink" href="#thunderbird">¶</a></h4>
|
|
<section class="level5" id="cardbook">
|
|
<h5>CardBook <a class="headerlink" href="#cardbook">¶</a></h5>
|
|
<p>Add a new address book on the network with CardDAV. You have to enter
|
|
the full URL of the collection (e.g.
|
|
<code>http://localhost:5232/user/addressbook</code>) and your user
|
|
name.</p>
|
|
</section>
|
|
<section class="level5" id="lightning">
|
|
<h5>Lightning <a class="headerlink" href="#lightning">¶</a></h5>
|
|
<p>Add a new calendar on the network with <code>CalDAV</code>. (Don't
|
|
use <code>iCalendar (ICS)</code>!) You have to enter the full URL of the
|
|
collection (e.g. <code>http://localhost:5232/user/calendar</code>). If
|
|
you want to add calendars from different users on the same server, you
|
|
can specify the user name in the URL (e.g.
|
|
<code>http://user@localhost...</code>)</p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="infcloud-caldavzap-and-carddavmate">
|
|
<h4>InfCloud, CalDavZAP and CardDavMATE <a class="headerlink" href="#infcloud-caldavzap-and-carddavmate">¶</a></h4>
|
|
<p>You can integrate InfCloud into Radicale's web interface with <a href="https://github.com/Unrud/RadicaleInfCloud">RadicaleInfCloud</a>.
|
|
No additional configuration is required.</p>
|
|
<p>Set the URL of the Radicale server in <code>config.js</code>. If
|
|
<strong>InfCloud</strong> is not hosted on the same server and port as
|
|
Radicale, the browser will deny access to the Radicale server, because
|
|
of the <a href="https://en.wikipedia.org/wiki/Same-origin_policy">same-origin
|
|
policy</a>. You have to add additional HTTP header in the
|
|
<code>headers</code> section of Radicale's configuration. The
|
|
documentation of <strong>InfCloud</strong> has more details on this.</p>
|
|
</section>
|
|
<section class="level4" id="manual-creation-of-calendars-and-address-books">
|
|
<h4>Manual creation of calendars and address books <a class="headerlink" href="#manual-creation-of-calendars-and-address-books">¶</a></h4>
|
|
<p>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. <strong>DAVx⁵</strong>).</p>
|
|
<section class="level5" id="direct-editing-of-the-storage">
|
|
<h5>Direct editing of the storage <a class="headerlink" href="#direct-editing-of-the-storage">¶</a></h5>
|
|
<p>To create a new collection, you have to create the corresponding
|
|
folder in the file system storage (e.g.
|
|
<code>collection-root/user/calendar</code>). To tell Radicale and
|
|
clients that the collection is a calendar, you have to create the file
|
|
<code>.Radicale.props</code> with the following content in the
|
|
folder:</p>
|
|
<div class="sourceCode" id="cb27"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb27-1"><a aria-hidden="true" href="#cb27-1" tabindex="-1"></a><span class="fu">{</span><span class="dt">"tag"</span><span class="fu">:</span> <span class="st">"VCALENDAR"</span><span class="fu">}</span></span></code></pre></div>
|
|
<p>The calendar is now available at the URL path
|
|
<code>/user/calendar</code>. For address books the file must
|
|
contain:</p>
|
|
<div class="sourceCode" id="cb28"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb28-1"><a aria-hidden="true" href="#cb28-1" tabindex="-1"></a><span class="fu">{</span><span class="dt">"tag"</span><span class="fu">:</span> <span class="st">"VADDRESSBOOK"</span><span class="fu">}</span></span></code></pre></div>
|
|
<p>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
|
|
<code>/USERNAME/</code>.</p>
|
|
<p>Delete collections by deleting the corresponding folders.</p>
|
|
</section>
|
|
<section class="level5" id="http-requests-with-curl">
|
|
<h5>HTTP requests with curl <a class="headerlink" href="#http-requests-with-curl">¶</a></h5>
|
|
<p>To create a new calendar run something like:</p>
|
|
<div class="sourceCode" id="cb29"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb29-1"><a aria-hidden="true" href="#cb29-1" tabindex="-1"></a><span class="ex">$</span> curl <span class="at">-u</span> user <span class="at">-X</span> MKCOL <span class="st">'http://localhost:5232/user/calendar'</span> <span class="at">--data</span> <span class="dt">\</span></span>
|
|
<span id="cb29-2"><a aria-hidden="true" href="#cb29-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
|
<span id="cb29-3"><a aria-hidden="true" href="#cb29-3" tabindex="-1"></a><span class="st"><create xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:I="http://apple.com/ns/ical/"></span></span>
|
|
<span id="cb29-4"><a aria-hidden="true" href="#cb29-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
|
<span id="cb29-5"><a aria-hidden="true" href="#cb29-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
|
<span id="cb29-6"><a aria-hidden="true" href="#cb29-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
|
<span id="cb29-7"><a aria-hidden="true" href="#cb29-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
|
<span id="cb29-8"><a aria-hidden="true" href="#cb29-8" tabindex="-1"></a><span class="st"> <C:calendar /></span></span>
|
|
<span id="cb29-9"><a aria-hidden="true" href="#cb29-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
|
<span id="cb29-10"><a aria-hidden="true" href="#cb29-10" tabindex="-1"></a><span class="st"> <C:supported-calendar-component-set></span></span>
|
|
<span id="cb29-11"><a aria-hidden="true" href="#cb29-11" tabindex="-1"></a><span class="st"> <C:comp name="VEVENT" /></span></span>
|
|
<span id="cb29-12"><a aria-hidden="true" href="#cb29-12" tabindex="-1"></a><span class="st"> <C:comp name="VJOURNAL" /></span></span>
|
|
<span id="cb29-13"><a aria-hidden="true" href="#cb29-13" tabindex="-1"></a><span class="st"> <C:comp name="VTODO" /></span></span>
|
|
<span id="cb29-14"><a aria-hidden="true" href="#cb29-14" tabindex="-1"></a><span class="st"> </C:supported-calendar-component-set></span></span>
|
|
<span id="cb29-15"><a aria-hidden="true" href="#cb29-15" tabindex="-1"></a><span class="st"> <displayname>Calendar</displayname></span></span>
|
|
<span id="cb29-16"><a aria-hidden="true" href="#cb29-16" tabindex="-1"></a><span class="st"> <C:calendar-description>Example calendar</C:calendar-description></span></span>
|
|
<span id="cb29-17"><a aria-hidden="true" href="#cb29-17" tabindex="-1"></a><span class="st"> <I:calendar-color>#ff0000ff</I:calendar-color></span></span>
|
|
<span id="cb29-18"><a aria-hidden="true" href="#cb29-18" tabindex="-1"></a><span class="st"> </prop></span></span>
|
|
<span id="cb29-19"><a aria-hidden="true" href="#cb29-19" tabindex="-1"></a><span class="st"> </set></span></span>
|
|
<span id="cb29-20"><a aria-hidden="true" href="#cb29-20" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
|
<p>To create a new address book run something like:</p>
|
|
<div class="sourceCode" id="cb30"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb30-1"><a aria-hidden="true" href="#cb30-1" tabindex="-1"></a><span class="ex">$</span> curl <span class="at">-u</span> user <span class="at">-X</span> MKCOL <span class="st">'http://localhost:5232/user/addressbook'</span> <span class="at">--data</span> <span class="dt">\</span></span>
|
|
<span id="cb30-2"><a aria-hidden="true" href="#cb30-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
|
<span id="cb30-3"><a aria-hidden="true" href="#cb30-3" tabindex="-1"></a><span class="st"><create xmlns="DAV:" xmlns:CR="urn:ietf:params:xml:ns:carddav"></span></span>
|
|
<span id="cb30-4"><a aria-hidden="true" href="#cb30-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
|
<span id="cb30-5"><a aria-hidden="true" href="#cb30-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
|
<span id="cb30-6"><a aria-hidden="true" href="#cb30-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
|
<span id="cb30-7"><a aria-hidden="true" href="#cb30-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
|
<span id="cb30-8"><a aria-hidden="true" href="#cb30-8" tabindex="-1"></a><span class="st"> <CR:addressbook /></span></span>
|
|
<span id="cb30-9"><a aria-hidden="true" href="#cb30-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
|
<span id="cb30-10"><a aria-hidden="true" href="#cb30-10" tabindex="-1"></a><span class="st"> <displayname>Address book</displayname></span></span>
|
|
<span id="cb30-11"><a aria-hidden="true" href="#cb30-11" tabindex="-1"></a><span class="st"> <CR:addressbook-description>Example address book</CR:addressbook-description></span></span>
|
|
<span id="cb30-12"><a aria-hidden="true" href="#cb30-12" tabindex="-1"></a><span class="st"> </prop></span></span>
|
|
<span id="cb30-13"><a aria-hidden="true" href="#cb30-13" tabindex="-1"></a><span class="st"> </set></span></span>
|
|
<span id="cb30-14"><a aria-hidden="true" href="#cb30-14" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
|
<p>The collection <code>/USERNAME</code> will be created automatically,
|
|
when the user authenticates to Radicale for the first time. Clients with
|
|
automatic discovery of collections will only show calendars and address
|
|
books that are direct children of the path <code>/USERNAME/</code>.</p>
|
|
<p>Delete the collections by running something like:</p>
|
|
<div class="sourceCode" id="cb31"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb31-1"><a aria-hidden="true" href="#cb31-1" tabindex="-1"></a><span class="ex">$</span> curl <span class="at">-u</span> user <span class="at">-X</span> DELETE <span class="st">'http://localhost:5232/user/calendar'</span></span></code></pre></div>
|
|
</section>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="configuration-1">
|
|
<h3>Configuration <a class="headerlink" href="#configuration-1">¶</a></h3>
|
|
<p>Radicale can be configured with a configuration file or with command
|
|
line arguments.</p>
|
|
<p>An example configuration file looks like:</p>
|
|
<div class="sourceCode" id="cb32"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb32-1"><a aria-hidden="true" href="#cb32-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
|
<span id="cb32-2"><a aria-hidden="true" href="#cb32-2" tabindex="-1"></a><span class="co"># Bind all addresses</span></span>
|
|
<span id="cb32-3"><a aria-hidden="true" href="#cb32-3" tabindex="-1"></a><span class="dt">hosts </span><span class="ot">=</span><span class="st"> 0.0.0.0:5232</span></span>
|
|
<span id="cb32-4"><a aria-hidden="true" href="#cb32-4" tabindex="-1"></a></span>
|
|
<span id="cb32-5"><a aria-hidden="true" href="#cb32-5" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
|
<span id="cb32-6"><a aria-hidden="true" href="#cb32-6" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
|
<span id="cb32-7"><a aria-hidden="true" href="#cb32-7" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> /path/to/users</span></span>
|
|
<span id="cb32-8"><a aria-hidden="true" href="#cb32-8" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> bcrypt</span></span>
|
|
<span id="cb32-9"><a aria-hidden="true" href="#cb32-9" tabindex="-1"></a><span class="kw">[storage]</span></span>
|
|
<span id="cb32-10"><a aria-hidden="true" href="#cb32-10" tabindex="-1"></a><span class="dt">filesystem_folder </span><span class="ot">=</span><span class="st"> ~/.var/lib/radicale/collections</span></span></code></pre></div>
|
|
<p>Radicale tries to load configuration files from
|
|
<code>/etc/radicale/config</code>,
|
|
<code>~/.config/radicale/config</code> and the
|
|
<code>RADICALE_CONFIG</code> environment variable. This behaviour can be
|
|
overwritten by specifying a path with the
|
|
<code>--config /path/to/config</code> command line argument.</p>
|
|
<p>The same example configuration via command line arguments looks
|
|
like:</p>
|
|
<div class="sourceCode" id="cb33"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb33-1"><a aria-hidden="true" href="#cb33-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> radicale <span class="at">--config</span> <span class="st">""</span> <span class="at">--server-hosts</span> 0.0.0.0:5232 <span class="at">--auth-type</span> htpasswd <span class="at">--htpasswd-filename</span> /path/to/htpasswd <span class="at">--htpasswd-encryption</span> bcrypt</span></code></pre></div>
|
|
<p>The <code>--config ""</code> argument is required to stop Radicale
|
|
from trying to load configuration files. Run
|
|
<code>python3 -m radicale --help</code> for more information.</p>
|
|
<p>In the following, all configuration categories and options are
|
|
described.</p>
|
|
<section class="level4" id="server">
|
|
<h4>server <a class="headerlink" href="#server">¶</a></h4>
|
|
<p>Most configuration options in this category are only relevant in
|
|
standalone mode. All options beside <code>max_content_length</code> and
|
|
<code>realm</code> are ignored, when Radicale runs via WSGI.</p>
|
|
<section class="level5" id="hosts">
|
|
<h5>hosts <a class="headerlink" href="#hosts">¶</a></h5>
|
|
<p>A comma separated list of addresses that the server will bind to.</p>
|
|
<p>Default: <code>127.0.0.1:5232</code></p>
|
|
</section>
|
|
<section class="level5" id="daemon">
|
|
<h5>daemon <a class="headerlink" href="#daemon">¶</a></h5>
|
|
<p>Daemonize the Radicale process. It does not reset the umask.</p>
|
|
<p>Default: <code>False</code></p>
|
|
</section>
|
|
<section class="level5" id="pid">
|
|
<h5>pid <a class="headerlink" href="#pid">¶</a></h5>
|
|
<p>If daemon mode is enabled, Radicale will write its PID to this
|
|
file.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
<section class="level5" id="max_connections">
|
|
<h5>max_connections <a class="headerlink" href="#max_connections">¶</a></h5>
|
|
<p>The maximum number of parallel connections. Set to <code>0</code> to
|
|
disable the limit.</p>
|
|
<p>Default: <code>20</code></p>
|
|
</section>
|
|
<section class="level5" id="max_content_length">
|
|
<h5>max_content_length <a class="headerlink" href="#max_content_length">¶</a></h5>
|
|
<p>The maximum size of the request body. (bytes)</p>
|
|
<p>Default: <code>100000000</code></p>
|
|
</section>
|
|
<section class="level5" id="timeout">
|
|
<h5>timeout <a class="headerlink" href="#timeout">¶</a></h5>
|
|
<p>Socket timeout. (seconds)</p>
|
|
<p>Default: <code>30</code></p>
|
|
</section>
|
|
<section class="level5" id="ssl">
|
|
<h5>ssl <a class="headerlink" href="#ssl">¶</a></h5>
|
|
<p>Enable transport layer encryption.</p>
|
|
<p>Default: <code>False</code></p>
|
|
</section>
|
|
<section class="level5" id="certificate">
|
|
<h5>certificate <a class="headerlink" href="#certificate">¶</a></h5>
|
|
<p>Path of the SSL certifcate.</p>
|
|
<p>Default: <code>/etc/ssl/radicale.cert.pem</code></p>
|
|
</section>
|
|
<section class="level5" id="key">
|
|
<h5>key <a class="headerlink" href="#key">¶</a></h5>
|
|
<p>Path to the private key for SSL. Only effective if <code>ssl</code>
|
|
is enabled.</p>
|
|
<p>Default: <code>/etc/ssl/radicale.key.pem</code></p>
|
|
</section>
|
|
<section class="level5" id="certificate_authority">
|
|
<h5>certificate_authority <a class="headerlink" href="#certificate_authority">¶</a></h5>
|
|
<p>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.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
<section class="level5" id="protocol">
|
|
<h5>protocol <a class="headerlink" href="#protocol">¶</a></h5>
|
|
<p>SSL protocol used. See python's ssl module for available values.</p>
|
|
<p>Default: <code>PROTOCOL_TLSv1_2</code></p>
|
|
</section>
|
|
<section class="level5" id="ciphers">
|
|
<h5>ciphers <a class="headerlink" href="#ciphers">¶</a></h5>
|
|
<p>Available ciphers for SSL. See python's ssl module for available
|
|
ciphers.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
<section class="level5" id="dns_lookup">
|
|
<h5>dns_lookup <a class="headerlink" href="#dns_lookup">¶</a></h5>
|
|
<p>Reverse DNS to resolve client address in logs.</p>
|
|
<p>Default: <code>True</code></p>
|
|
</section>
|
|
<section class="level5" id="realm">
|
|
<h5>realm <a class="headerlink" href="#realm">¶</a></h5>
|
|
<p>Message displayed in the client when a password is needed.</p>
|
|
<p>Default: <code>Radicale - Password Required</code></p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="encoding">
|
|
<h4>encoding <a class="headerlink" href="#encoding">¶</a></h4>
|
|
<section class="level5" id="request">
|
|
<h5>request <a class="headerlink" href="#request">¶</a></h5>
|
|
<p>Encoding for responding requests.</p>
|
|
<p>Default: <code>utf-8</code></p>
|
|
</section>
|
|
<section class="level5" id="stock">
|
|
<h5>stock <a class="headerlink" href="#stock">¶</a></h5>
|
|
<p>Encoding for storing local collections</p>
|
|
<p>Default: <code>utf-8</code></p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="auth">
|
|
<h4>auth <a class="headerlink" href="#auth">¶</a></h4>
|
|
<section class="level5" id="type">
|
|
<h5>type <a class="headerlink" href="#type">¶</a></h5>
|
|
<p>The method to verify usernames and passwords.</p>
|
|
<p>Available backends:</p>
|
|
<p><code>None</code> : Just allows all usernames and passwords. It also
|
|
disables rights checking.</p>
|
|
<p><code>htpasswd</code> : Use an <a href="https://httpd.apache.org/docs/current/programs/htpasswd.html">Apache
|
|
htpasswd file</a> to store usernames and passwords.</p>
|
|
<p><code>remote_user</code> : Takes the user name from the
|
|
<code>REMOTE_USER</code> environment variable and disables HTTP
|
|
authentication. This can be used to provide the user name from a WSGI
|
|
server.</p>
|
|
<p><code>http_x_remote_user</code> : Takes the user name from the
|
|
<code>X-Remote-User</code> HTTP header and disables HTTP authentication.
|
|
This can be used to provide the user name from a reverse proxy.</p>
|
|
<p>Default: <code>None</code></p>
|
|
</section>
|
|
<section class="level5" id="htpasswd_filename">
|
|
<h5>htpasswd_filename <a class="headerlink" href="#htpasswd_filename">¶</a></h5>
|
|
<p>Path to the htpasswd file.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
<section class="level5" id="htpasswd_encryption">
|
|
<h5>htpasswd_encryption <a class="headerlink" href="#htpasswd_encryption">¶</a></h5>
|
|
<p>The encryption method that is used in the htpasswd file. Use the <a href="https://httpd.apache.org/docs/current/programs/htpasswd.html">htpasswd</a>
|
|
or similar to generate this files.</p>
|
|
<p>Available methods:</p>
|
|
<p><code>plain</code> : Passwords are stored in plaintext. This is
|
|
obviously not secure! The htpasswd file for this can be created by hand
|
|
and looks like:</p>
|
|
<pre class="htpasswd"><code>user1:password1
|
|
user2:password2</code></pre>
|
|
<p><code>bcrypt</code> : This uses a modified version of the Blowfish
|
|
stream cipher. It's very secure. The <strong>passlib</strong> python
|
|
module is required for this. Additionally you may need one of the
|
|
following python modules: <strong>bcrypt</strong>,
|
|
<strong>py-bcrypt</strong> or <strong>bcryptor</strong>.</p>
|
|
<p><code>md5</code> : This uses an iterated md5 digest of the password
|
|
with a salt. The <strong>passlib</strong> python module is required for
|
|
this.</p>
|
|
<p><code>sha1</code> : Passwords are stored as SHA1 hashes. It's
|
|
insecure!</p>
|
|
<p><code>ssha</code> : Passwords are stored as salted SHA1 hashes. It's
|
|
insecure!</p>
|
|
<p><code>crypt</code> : This uses UNIX <a href="https://manpages.debian.org/unstable/manpages-dev/crypt.3.en.html">crypt(3)</a>.
|
|
It's insecure!</p>
|
|
<p>Default: <code>bcrypt</code></p>
|
|
</section>
|
|
<section class="level5" id="delay">
|
|
<h5>delay <a class="headerlink" href="#delay">¶</a></h5>
|
|
<p>Average delay after failed login attempts in seconds.</p>
|
|
<p>Default: <code>1</code></p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="rights">
|
|
<h4>rights <a class="headerlink" href="#rights">¶</a></h4>
|
|
<section class="level5" id="type-1">
|
|
<h5>type <a class="headerlink" href="#type-1">¶</a></h5>
|
|
<p>The backend that is used to check the access rights of
|
|
collections.</p>
|
|
<p>The recommended backend is <code>owner_only</code>. If access to
|
|
calendars and address books outside of the home directory of users
|
|
(that's <code>/USERNAME/</code>) 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.</p>
|
|
<p>Available backends:</p>
|
|
<p><code>None</code> : Everyone can read and write everything.</p>
|
|
<p><code>authenticated</code> : Authenticated users can read and write
|
|
everything.</p>
|
|
<p><code>owner_only</code> : Authenticated users can read and write
|
|
their own collections under the path <em>/USERNAME/</em>.</p>
|
|
<p><code>owner_write</code> : Authenticated users can read everything
|
|
and write their own collections under the path <em>/USERNAME/</em>.</p>
|
|
<p><code>from_file</code> : Load the rules from a file.</p>
|
|
<p>Default: <code>owner_only</code></p>
|
|
</section>
|
|
<section class="level5" id="file">
|
|
<h5>file <a class="headerlink" href="#file">¶</a></h5>
|
|
<p>File for the rights backend <code>from_file</code>. See the <a href="#authentication-and-rights">Rights</a> page.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="storage-1">
|
|
<h4>storage <a class="headerlink" href="#storage-1">¶</a></h4>
|
|
<section class="level5" id="type-2">
|
|
<h5>type <a class="headerlink" href="#type-2">¶</a></h5>
|
|
<p>The backend that is used to store data.</p>
|
|
<p>Available backends:</p>
|
|
<p><code>multifilesystem</code> : Stores the data in the filesystem.</p>
|
|
<p>Default: <code>multifilesystem</code></p>
|
|
</section>
|
|
<section class="level5" id="filesystem_folder">
|
|
<h5>filesystem_folder <a class="headerlink" href="#filesystem_folder">¶</a></h5>
|
|
<p>Folder for storing local collections, created if not present.</p>
|
|
<p>Default: <code>/var/lib/radicale/collections</code></p>
|
|
</section>
|
|
<section class="level5" id="filesystem_locking">
|
|
<h5>filesystem_locking <a class="headerlink" href="#filesystem_locking">¶</a></h5>
|
|
<p>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.</p>
|
|
<p>Default: <code>True</code></p>
|
|
</section>
|
|
<section class="level5" id="max_sync_token_age">
|
|
<h5>max_sync_token_age <a class="headerlink" href="#max_sync_token_age">¶</a></h5>
|
|
<p>Delete sync-token that are older than the specified time.
|
|
(seconds)</p>
|
|
<p>Default: <code>2592000</code></p>
|
|
</section>
|
|
<section class="level5" id="filesystem_fsync">
|
|
<h5>filesystem_fsync <a class="headerlink" href="#filesystem_fsync">¶</a></h5>
|
|
<p>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!</p>
|
|
<p>Default: <code>True</code></p>
|
|
</section>
|
|
<section class="level5" id="hook">
|
|
<h5>hook <a class="headerlink" href="#hook">¶</a></h5>
|
|
<p>Command that is run after changes to storage. Take a look at the <a href="#versioning">Versioning</a> page for an example.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="web">
|
|
<h4>web <a class="headerlink" href="#web">¶</a></h4>
|
|
<section class="level5" id="type-3">
|
|
<h5>type <a class="headerlink" href="#type-3">¶</a></h5>
|
|
<p>The backend that provides the web interface of Radicale.</p>
|
|
<p>Available backends:</p>
|
|
<p><code>none</code> : Just shows the message "Radicale works!".</p>
|
|
<p><code>internal</code> : Allows creation and management of address
|
|
books and calendars.</p>
|
|
<p>Default: <code>internal</code></p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="logging">
|
|
<h4>logging <a class="headerlink" href="#logging">¶</a></h4>
|
|
<section class="level5" id="debug">
|
|
<h5>debug <a class="headerlink" href="#debug">¶</a></h5>
|
|
<p>Set the default logging level to debug.</p>
|
|
<p>Default: <code>False</code></p>
|
|
</section>
|
|
<section class="level5" id="full_environment">
|
|
<h5>full_environment <a class="headerlink" href="#full_environment">¶</a></h5>
|
|
<p>Log all environment variables (including those set in the shell).</p>
|
|
<p>Default: <code>False</code></p>
|
|
</section>
|
|
<section class="level5" id="mask_passwords">
|
|
<h5>mask_passwords <a class="headerlink" href="#mask_passwords">¶</a></h5>
|
|
<p>Don't include passwords in logs.</p>
|
|
<p>Default: <code>True</code></p>
|
|
</section>
|
|
<section class="level5" id="config">
|
|
<h5>config <a class="headerlink" href="#config">¶</a></h5>
|
|
<p>Logging configuration file. See the <a href="#logging-1">Logging</a>
|
|
page.</p>
|
|
<p>Default:</p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="headers">
|
|
<h4>headers <a class="headerlink" href="#headers">¶</a></h4>
|
|
<p>In this section additional HTTP headers that are sent to clients can
|
|
be specified.</p>
|
|
<p>An example to relax the same-origin policy:</p>
|
|
<div class="sourceCode" id="cb35"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb35-1"><a aria-hidden="true" href="#cb35-1" tabindex="-1"></a><span class="dt">Access-Control-Allow-Origin </span><span class="ot">=</span><span class="st"> *</span></span></code></pre></div>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="authentication-and-rights">
|
|
<h3>Authentication and Rights <a class="headerlink" href="#authentication-and-rights">¶</a></h3>
|
|
<p>This page describes the format of the rights file for the
|
|
<code>from_file</code> authentication backend. The configuration option
|
|
<code>file</code> in the <code>rights</code> section must point to the
|
|
rights file.</p>
|
|
<p>The recommended rights method is <code>owner_only</code>. If access
|
|
to calendars and address books outside of the home directory of users
|
|
(that's <code>/USERNAME/</code>) 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.</p>
|
|
<p>An example rights file:</p>
|
|
<div class="sourceCode" id="cb36"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb36-1"><a aria-hidden="true" href="#cb36-1" tabindex="-1"></a><span class="co"># The user "admin" can read and write any collection.</span></span>
|
|
<span id="cb36-2"><a aria-hidden="true" href="#cb36-2" tabindex="-1"></a><span class="kw">[admin]</span></span>
|
|
<span id="cb36-3"><a aria-hidden="true" href="#cb36-3" tabindex="-1"></a><span class="dt">user </span><span class="ot">=</span><span class="st"> admin</span></span>
|
|
<span id="cb36-4"><a aria-hidden="true" href="#cb36-4" tabindex="-1"></a><span class="dt">collection </span><span class="ot">=</span><span class="st"> .*</span></span>
|
|
<span id="cb36-5"><a aria-hidden="true" href="#cb36-5" tabindex="-1"></a><span class="dt">permission </span><span class="ot">=</span><span class="st"> rw</span></span>
|
|
<span id="cb36-6"><a aria-hidden="true" href="#cb36-6" tabindex="-1"></a></span>
|
|
<span id="cb36-7"><a aria-hidden="true" href="#cb36-7" tabindex="-1"></a><span class="co"># Block access for the user "user" to everything.</span></span>
|
|
<span id="cb36-8"><a aria-hidden="true" href="#cb36-8" tabindex="-1"></a><span class="kw">[block]</span></span>
|
|
<span id="cb36-9"><a aria-hidden="true" href="#cb36-9" tabindex="-1"></a><span class="dt">user </span><span class="ot">=</span><span class="st"> user</span></span>
|
|
<span id="cb36-10"><a aria-hidden="true" href="#cb36-10" tabindex="-1"></a><span class="dt">collection </span><span class="ot">=</span><span class="st"> .*</span></span>
|
|
<span id="cb36-11"><a aria-hidden="true" href="#cb36-11" tabindex="-1"></a><span class="dt">permission </span><span class="ot">=</span></span>
|
|
<span id="cb36-12"><a aria-hidden="true" href="#cb36-12" tabindex="-1"></a></span>
|
|
<span id="cb36-13"><a aria-hidden="true" href="#cb36-13" tabindex="-1"></a><span class="co"># Authenticated users can read and write their own collections.</span></span>
|
|
<span id="cb36-14"><a aria-hidden="true" href="#cb36-14" tabindex="-1"></a><span class="kw">[owner-write]</span></span>
|
|
<span id="cb36-15"><a aria-hidden="true" href="#cb36-15" tabindex="-1"></a><span class="dt">user </span><span class="ot">=</span><span class="st"> .+</span></span>
|
|
<span id="cb36-16"><a aria-hidden="true" href="#cb36-16" tabindex="-1"></a><span class="dt">collection </span><span class="ot">=</span><span class="st"> %(login)s(/.*)?</span></span>
|
|
<span id="cb36-17"><a aria-hidden="true" href="#cb36-17" tabindex="-1"></a><span class="dt">permission </span><span class="ot">=</span><span class="st"> rw</span></span>
|
|
<span id="cb36-18"><a aria-hidden="true" href="#cb36-18" tabindex="-1"></a></span>
|
|
<span id="cb36-19"><a aria-hidden="true" href="#cb36-19" tabindex="-1"></a><span class="co"># Everyone can read the root collection</span></span>
|
|
<span id="cb36-20"><a aria-hidden="true" href="#cb36-20" tabindex="-1"></a><span class="kw">[read]</span></span>
|
|
<span id="cb36-21"><a aria-hidden="true" href="#cb36-21" tabindex="-1"></a><span class="dt">user </span><span class="ot">=</span><span class="st"> .*</span></span>
|
|
<span id="cb36-22"><a aria-hidden="true" href="#cb36-22" tabindex="-1"></a><span class="dt">collection </span><span class="ot">=</span></span>
|
|
<span id="cb36-23"><a aria-hidden="true" href="#cb36-23" tabindex="-1"></a><span class="dt">permission </span><span class="ot">=</span><span class="st"> r</span></span></code></pre></div>
|
|
<p>The titles of the sections are ignored (but must be unique). The keys
|
|
<code>user</code> and <code>collection</code> contain regular
|
|
expressions, that are matched against the user name and the path of the
|
|
collection. Permissions from the first matching section are used. If no
|
|
section matches, access gets denied.</p>
|
|
<p>The user name is empty for anonymous users. Therefore, the regex
|
|
<code>.+</code> only matches authenticated users and <code>.*</code>
|
|
matches everyone (including anonymous users).</p>
|
|
<p>The path of the collection is separated by <code>/</code> and has no
|
|
leading or trailing <code>/</code>. Therefore, the path of the root
|
|
collection is empty.</p>
|
|
<p><code>%(login)s</code> gets replaced by the user name and
|
|
<code>%(path)s</code> by the path of the collection. You can also get
|
|
groups from the <code>user</code> regex in the <code>collection</code>
|
|
regex with <code>{0}</code>, <code>{1}</code>, etc.</p>
|
|
</section>
|
|
<section class="level3" id="storage-2">
|
|
<h3>Storage <a class="headerlink" href="#storage-2">¶</a></h3>
|
|
<p>This document describes the layout and format of the file system
|
|
storage (<code>multifilesystem</code> backend).</p>
|
|
<p>It's safe to access and manipulate the data by hand or with scripts.
|
|
Scripts can be invoked manually, periodically (e.g. with <a href="https://manpages.debian.org/unstable/cron/cron.8.en.html">cron</a>)
|
|
or after each change to the storage with the configuration option
|
|
<code>hook</code> in the <code>storage</code> section (e.g. <a href="#versioning">Git Versioning</a>).</p>
|
|
<section class="level4" id="layout">
|
|
<h4>Layout <a class="headerlink" href="#layout">¶</a></h4>
|
|
<p>The file system contains the following files and folders:</p>
|
|
<ul>
|
|
<li><code>.Radicale.lock</code>: The lock file for locking the
|
|
storage.</li>
|
|
<li><code>collection-root</code>: This folder contains all collections
|
|
and items.</li>
|
|
</ul>
|
|
<p>A collection is represented by a folder. This folder may contain the
|
|
file <code>.Radicale.props</code> with all WebDAV properties of the
|
|
collection encoded as <a href="https://en.wikipedia.org/wiki/JSON">JSON</a>.</p>
|
|
<p>An item is represented by a file containing the iCalendar data.</p>
|
|
<p>All files and folders, whose names start with a dot but not
|
|
<code>.Radicale.</code> (internal files) are ignored.</p>
|
|
<p>If you introduce syntax errors in any of the files, all requests that
|
|
access the faulty data will fail. The logging output should contain the
|
|
names of the culprits.</p>
|
|
<p>Future releases of Radicale 2.x.x will store caches and sync-tokens
|
|
in the <code>.Radicale.cache</code> 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.</p>
|
|
<p>You may encounter files or folders that start with
|
|
<code>.Radicale.tmp-</code>. 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.</p>
|
|
</section>
|
|
<section class="level4" id="locking">
|
|
<h4>Locking <a class="headerlink" href="#locking">¶</a></h4>
|
|
<p>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
|
|
<code>hook</code> runs.</p>
|
|
<section class="level5" id="linux-shell-scripts">
|
|
<h5>Linux shell scripts <a class="headerlink" href="#linux-shell-scripts">¶</a></h5>
|
|
<p>Use the <a href="https://manpages.debian.org/unstable/util-linux/flock.1.en.html">flock</a>
|
|
utility.</p>
|
|
<div class="sourceCode" id="cb37"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb37-1"><a aria-hidden="true" href="#cb37-1" tabindex="-1"></a><span class="co"># Exclusive</span></span>
|
|
<span id="cb37-2"><a aria-hidden="true" href="#cb37-2" tabindex="-1"></a><span class="ex">$</span> flock <span class="at">--exclusive</span> /path/to/storage/.Radicale.lock COMMAND</span>
|
|
<span id="cb37-3"><a aria-hidden="true" href="#cb37-3" tabindex="-1"></a><span class="co"># Shared</span></span>
|
|
<span id="cb37-4"><a aria-hidden="true" href="#cb37-4" tabindex="-1"></a><span class="ex">$</span> flock <span class="at">--shared</span> /path/to/storage/.Radicale.lock COMMAND</span></code></pre></div>
|
|
</section>
|
|
<section class="level5" id="linux-and-macos">
|
|
<h5>Linux and MacOS <a class="headerlink" href="#linux-and-macos">¶</a></h5>
|
|
<p>Use the <a href="https://manpages.debian.org/unstable/manpages-dev/flock.2.en.html">flock</a>
|
|
syscall. Python provides it in the <a href="https://docs.python.org/3/library/fcntl.html#fcntl.flock">fcntl</a>
|
|
module.</p>
|
|
</section>
|
|
<section class="level5" id="windows-1">
|
|
<h5>Windows <a class="headerlink" href="#windows-1">¶</a></h5>
|
|
<p>Use <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202%28v=vs.85%29.aspx">LockFile</a>
|
|
for exclusive access or <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203%28v=vs.85%29.aspx">LockFileEx</a>
|
|
which also supports shared access. Setting
|
|
<code>nNumberOfBytesToLockLow</code> to <code>1</code> and
|
|
<code>nNumberOfBytesToLockHigh</code> to <code>0</code> works.</p>
|
|
</section>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="logging-1">
|
|
<h3>Logging <a class="headerlink" href="#logging-1">¶</a></h3>
|
|
<p>Radicale logs to <code>stderr</code>. The verbosity of the log output
|
|
can be controlled with <code>--debug</code> command line argument or the
|
|
<code>debug</code> configuration option in the <code>logging</code>
|
|
section.</p>
|
|
<p>This is the recommended configuration for use with modern init
|
|
systems (like <strong>systemd</strong>) or if you just test Radicale in
|
|
a terminal.</p>
|
|
<p>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.</p>
|
|
<p>A logging configuration file can be specified in the
|
|
<code>config</code> configuration option in the <code>logging</code>
|
|
section. The file format is explained in the <a href="https://docs.python.org/3/library/logging.config.html#configuration-file-format">Python
|
|
Logging Module</a>.</p>
|
|
<section class="level4" id="logging-to-a-file">
|
|
<h4>Logging to a file <a class="headerlink" href="#logging-to-a-file">¶</a></h4>
|
|
<p>An example configuration to write the log output to the file
|
|
<code>/var/log/radicale/log</code>:</p>
|
|
<div class="sourceCode" id="cb38"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb38-1"><a aria-hidden="true" href="#cb38-1" tabindex="-1"></a><span class="kw">[loggers]</span></span>
|
|
<span id="cb38-2"><a aria-hidden="true" href="#cb38-2" tabindex="-1"></a><span class="dt">keys </span><span class="ot">=</span><span class="st"> root</span></span>
|
|
<span id="cb38-3"><a aria-hidden="true" href="#cb38-3" tabindex="-1"></a></span>
|
|
<span id="cb38-4"><a aria-hidden="true" href="#cb38-4" tabindex="-1"></a><span class="kw">[handlers]</span></span>
|
|
<span id="cb38-5"><a aria-hidden="true" href="#cb38-5" tabindex="-1"></a><span class="dt">keys </span><span class="ot">=</span><span class="st"> file</span></span>
|
|
<span id="cb38-6"><a aria-hidden="true" href="#cb38-6" tabindex="-1"></a></span>
|
|
<span id="cb38-7"><a aria-hidden="true" href="#cb38-7" tabindex="-1"></a><span class="kw">[formatters]</span></span>
|
|
<span id="cb38-8"><a aria-hidden="true" href="#cb38-8" tabindex="-1"></a><span class="dt">keys </span><span class="ot">=</span><span class="st"> full</span></span>
|
|
<span id="cb38-9"><a aria-hidden="true" href="#cb38-9" tabindex="-1"></a></span>
|
|
<span id="cb38-10"><a aria-hidden="true" href="#cb38-10" tabindex="-1"></a><span class="kw">[logger_root]</span></span>
|
|
<span id="cb38-11"><a aria-hidden="true" href="#cb38-11" tabindex="-1"></a><span class="co"># Change this to DEBUG or INFO for higher verbosity.</span></span>
|
|
<span id="cb38-12"><a aria-hidden="true" href="#cb38-12" tabindex="-1"></a><span class="dt">level </span><span class="ot">=</span><span class="st"> WARNING</span></span>
|
|
<span id="cb38-13"><a aria-hidden="true" href="#cb38-13" tabindex="-1"></a><span class="dt">handlers </span><span class="ot">=</span><span class="st"> file</span></span>
|
|
<span id="cb38-14"><a aria-hidden="true" href="#cb38-14" tabindex="-1"></a></span>
|
|
<span id="cb38-15"><a aria-hidden="true" href="#cb38-15" tabindex="-1"></a><span class="kw">[handler_file]</span></span>
|
|
<span id="cb38-16"><a aria-hidden="true" href="#cb38-16" tabindex="-1"></a><span class="dt">class </span><span class="ot">=</span><span class="st"> FileHandler</span></span>
|
|
<span id="cb38-17"><a aria-hidden="true" href="#cb38-17" tabindex="-1"></a><span class="co"># Specify the output file here.</span></span>
|
|
<span id="cb38-18"><a aria-hidden="true" href="#cb38-18" tabindex="-1"></a><span class="dt">args </span><span class="ot">=</span><span class="st"> ('/var/log/radicale/log',)</span></span>
|
|
<span id="cb38-19"><a aria-hidden="true" href="#cb38-19" tabindex="-1"></a><span class="dt">formatter </span><span class="ot">=</span><span class="st"> full</span></span>
|
|
<span id="cb38-20"><a aria-hidden="true" href="#cb38-20" tabindex="-1"></a></span>
|
|
<span id="cb38-21"><a aria-hidden="true" href="#cb38-21" tabindex="-1"></a><span class="kw">[formatter_full]</span></span>
|
|
<span id="cb38-22"><a aria-hidden="true" href="#cb38-22" tabindex="-1"></a><span class="dt">format </span><span class="ot">=</span><span class="st"> %(asctime)s - [%(thread)x] %(levelname)s: %(message)s</span></span></code></pre></div>
|
|
<p>You can specify multiple <strong>logger</strong>,
|
|
<strong>handler</strong> and <strong>formatter</strong> if you want to
|
|
have multiple simultaneous log outputs.</p>
|
|
<p>The parent folder of the log files must exist and must be writable by
|
|
Radicale.</p>
|
|
<p><strong>Security:</strong> The log files should not be readable by
|
|
unauthorized users. Set permissions accordingly.</p>
|
|
<section class="level5" id="timed-rotation-of-disk-log-files">
|
|
<h5>Timed rotation of disk log files <a class="headerlink" href="#timed-rotation-of-disk-log-files">¶</a></h5>
|
|
<p>An example <strong>handler</strong> configuration to write the log
|
|
output to the file <code>/var/log/radicale/log</code> and rotate it.
|
|
Replace the section <code>handler_file</code> from the file logging
|
|
example:</p>
|
|
<div class="sourceCode" id="cb39"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb39-1"><a aria-hidden="true" href="#cb39-1" tabindex="-1"></a><span class="kw">[handler_file]</span></span>
|
|
<span id="cb39-2"><a aria-hidden="true" href="#cb39-2" tabindex="-1"></a><span class="dt">class </span><span class="ot">=</span><span class="st"> handlers.TimedRotatingFileHandler</span></span>
|
|
<span id="cb39-3"><a aria-hidden="true" href="#cb39-3" tabindex="-1"></a><span class="co"># Specify the output file and parameter for rotation here.</span></span>
|
|
<span id="cb39-4"><a aria-hidden="true" href="#cb39-4" tabindex="-1"></a><span class="co"># See https://docs.python.org/3/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler</span></span>
|
|
<span id="cb39-5"><a aria-hidden="true" href="#cb39-5" tabindex="-1"></a><span class="co"># Example: rollover at midnight and keep 7 files (means one week)</span></span>
|
|
<span id="cb39-6"><a aria-hidden="true" href="#cb39-6" tabindex="-1"></a><span class="dt">args </span><span class="ot">=</span><span class="st"> ('/var/log/radicale/log', 'midnight', 1, 7)</span></span>
|
|
<span id="cb39-7"><a aria-hidden="true" href="#cb39-7" tabindex="-1"></a><span class="dt">formatter </span><span class="ot">=</span><span class="st"> full</span></span></code></pre></div>
|
|
</section>
|
|
<section class="level5" id="rotation-of-disk-log-files-based-on-size">
|
|
<h5>Rotation of disk log files based on size <a class="headerlink" href="#rotation-of-disk-log-files-based-on-size">¶</a></h5>
|
|
<p>An example <strong>handler</strong> configuration to write the log
|
|
output to the file <code>/var/log/radicale/log</code> and rotate it .
|
|
Replace the section <code>handle_file</code> from the file logging
|
|
example:</p>
|
|
<div class="sourceCode" id="cb40"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb40-1"><a aria-hidden="true" href="#cb40-1" tabindex="-1"></a><span class="kw">[handler_file]</span></span>
|
|
<span id="cb40-2"><a aria-hidden="true" href="#cb40-2" tabindex="-1"></a><span class="dt">class </span><span class="ot">=</span><span class="st"> handlers.RotatingFileHandler</span></span>
|
|
<span id="cb40-3"><a aria-hidden="true" href="#cb40-3" tabindex="-1"></a><span class="co"># Specify the output file and parameter for rotation here.</span></span>
|
|
<span id="cb40-4"><a aria-hidden="true" href="#cb40-4" tabindex="-1"></a><span class="co"># See https://docs.python.org/3/library/logging.handlers.html#logging.handlers.RotatingFileHandler</span></span>
|
|
<span id="cb40-5"><a aria-hidden="true" href="#cb40-5" tabindex="-1"></a><span class="co"># Example: rollover at 100000 kB and keep 10 files (means 1 MB)</span></span>
|
|
<span id="cb40-6"><a aria-hidden="true" href="#cb40-6" tabindex="-1"></a><span class="dt">args </span><span class="ot">=</span><span class="st"> ('/var/log/radicale/log', 'a', 100000, 10)</span></span>
|
|
<span id="cb40-7"><a aria-hidden="true" href="#cb40-7" tabindex="-1"></a><span class="dt">formatter </span><span class="ot">=</span><span class="st"> full</span></span></code></pre></div>
|
|
</section>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="architecture">
|
|
<h3>Architecture <a class="headerlink" href="#architecture">¶</a></h3>
|
|
<p>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.</p>
|
|
<section class="level4" id="general-architecture">
|
|
<h4>General Architecture <a class="headerlink" href="#general-architecture">¶</a></h4>
|
|
<p>Here is a simple overview of the global architecture for reaching a
|
|
calendar or an address book through network:</p>
|
|
<div class="tableContainer"><table>
|
|
<thead>
|
|
<tr>
|
|
<th>Part</th>
|
|
<th>Layer</th>
|
|
<th>Protocol or Format</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td rowspan="2">Server</td>
|
|
<td>Calendar/Contact Storage</td>
|
|
<td>iCal/vCard</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Calendar/Contact Server</td>
|
|
<td>CalDAV/CardDAV Server</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Transfer</td>
|
|
<td>Network</td>
|
|
<td>CalDAV/CardDAV (HTTP + TLS)</td>
|
|
</tr>
|
|
<tr>
|
|
<td rowspan="2">Client</td>
|
|
<td>Calendar/Contact Client</td>
|
|
<td>CalDAV/CardDAV Client</td>
|
|
</tr>
|
|
<tr>
|
|
<td>GUI</td>
|
|
<td>Terminal, GTK, Web interface, etc.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table></div>
|
|
<p>Radicale is <strong>only the server part</strong> of this
|
|
architecture.</p>
|
|
<p>Please note that:</p>
|
|
<ul>
|
|
<li>CalDAV and CardDAV are superset protocols of WebDAV,</li>
|
|
<li>WebDAV is a superset protocol of HTTP.</li>
|
|
</ul>
|
|
<p>Radicale being a CalDAV/CardDAV server, it also can be seen as a
|
|
special WebDAV and HTTP server.</p>
|
|
<p>Radicale is <strong>not the client part</strong> 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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level4" id="code-architecture">
|
|
<h4>Code Architecture <a class="headerlink" href="#code-architecture">¶</a></h4>
|
|
<p>The <code>radicale</code> package offers 9 modules.</p>
|
|
<p><code>__main__</code> : 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.</p>
|
|
<p><code>__init__</code> : 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.</p>
|
|
<p><code>config</code> : This part gives a dict-like access to the
|
|
server configuration, read from the configuration file. The
|
|
configuration can be altered when launching the executable with some
|
|
command line options.</p>
|
|
<p><code>xmlutils</code> : The functions defined in this module are
|
|
mainly called by the CalDAV/CardDAV server class to read the XML part of
|
|
the request, read or alter the calendars, and create the XML part of the
|
|
response. The main part of this code relies on ElementTree.</p>
|
|
<p><code>log</code> : The start function provided by this module starts
|
|
a logging mechanism based on the default Python logging module. Logging
|
|
options can be stored in a logging configuration file.</p>
|
|
<p><code>auth</code> : This module provides a default authentication
|
|
manager equivalent to Apache's htpasswd. Login + password couples are
|
|
stored in a file and used to authenticate users. Passwords can be
|
|
encrypted using various methods. Other authentication methods can
|
|
inherit from the base class in this file and be provided as plugins.</p>
|
|
<p><code>rights</code> : This module is a set of Access Control Lists, a
|
|
set of methods used by Radicale to manage rights to access the
|
|
calendars. When the CalDAV/CardDAV server is launched, an Access Control
|
|
List is chosen in the set, according to the configuration. The HTTP
|
|
requests are then filtered to restrict the access depending on who is
|
|
authenticated. Other configurations can be written using regex-based
|
|
rules. Other rights managers can also inherit from the base class in
|
|
this file and be provided as plugins.</p>
|
|
<p><code>storage</code> : In this module are written the classes
|
|
representing collections and items in Radicale, and the class storing
|
|
these collections and items in your filesystem. Other storage classes
|
|
can inherit from the base class in this file and be provided as
|
|
plugins.</p>
|
|
<p><code>web</code> : This module contains the web interface.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="plugins">
|
|
<h3>Plugins <a class="headerlink" href="#plugins">¶</a></h3>
|
|
<p>Radicale can be extended by plugins for authentication, rights
|
|
management and storage. Plugins are <strong>python</strong> modules.</p>
|
|
<section class="level4" id="getting-started-1">
|
|
<h4>Getting started <a class="headerlink" href="#getting-started-1">¶</a></h4>
|
|
<p>To get started we walk through the creation of a simple
|
|
authentication plugin, that accepts login attempts if the username and
|
|
password are equal.</p>
|
|
<p>The easiest way to develop and install <strong>python</strong>
|
|
modules is <a href="https://docs.python.org/3/distutils/setupscript.html">Distutils</a>.
|
|
For a minimal setup create the file <code>setup.py</code> with the
|
|
following content in an empty folder:</p>
|
|
<div class="sourceCode" id="cb41"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb41-1"><a aria-hidden="true" href="#cb41-1" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
|
|
<span id="cb41-2"><a aria-hidden="true" href="#cb41-2" tabindex="-1"></a></span>
|
|
<span id="cb41-3"><a aria-hidden="true" href="#cb41-3" tabindex="-1"></a><span class="im">from</span> distutils.core <span class="im">import</span> setup</span>
|
|
<span id="cb41-4"><a aria-hidden="true" href="#cb41-4" tabindex="-1"></a></span>
|
|
<span id="cb41-5"><a aria-hidden="true" href="#cb41-5" tabindex="-1"></a>setup(name<span class="op">=</span><span class="st">"radicale_silly_auth"</span>, packages<span class="op">=</span>[<span class="st">"radicale_silly_auth"</span>])</span></code></pre></div>
|
|
<p>In the same folder create the sub-folder
|
|
<code>radicale_silly_auth</code>. The folder must have the same name as
|
|
specified in <code>packages</code> above.</p>
|
|
<p>Create the file <code>__init__.py</code> in the
|
|
<code>radicale_silly_auth</code> folder with the following content:</p>
|
|
<div class="sourceCode" id="cb42"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb42-1"><a aria-hidden="true" href="#cb42-1" tabindex="-1"></a><span class="im">from</span> radicale.auth <span class="im">import</span> BaseAuth</span>
|
|
<span id="cb42-2"><a aria-hidden="true" href="#cb42-2" tabindex="-1"></a></span>
|
|
<span id="cb42-3"><a aria-hidden="true" href="#cb42-3" tabindex="-1"></a></span>
|
|
<span id="cb42-4"><a aria-hidden="true" href="#cb42-4" tabindex="-1"></a><span class="kw">class</span> Auth(BaseAuth):</span>
|
|
<span id="cb42-5"><a aria-hidden="true" href="#cb42-5" tabindex="-1"></a> <span class="kw">def</span> is_authenticated(<span class="va">self</span>, user, password):</span>
|
|
<span id="cb42-6"><a aria-hidden="true" href="#cb42-6" tabindex="-1"></a> <span class="co"># Example custom configuration option</span></span>
|
|
<span id="cb42-7"><a aria-hidden="true" href="#cb42-7" tabindex="-1"></a> foo <span class="op">=</span> <span class="st">""</span></span>
|
|
<span id="cb42-8"><a aria-hidden="true" href="#cb42-8" tabindex="-1"></a> <span class="cf">if</span> <span class="va">self</span>.configuration.has_option(<span class="st">"auth"</span>, <span class="st">"foo"</span>):</span>
|
|
<span id="cb42-9"><a aria-hidden="true" href="#cb42-9" tabindex="-1"></a> foo <span class="op">=</span> <span class="va">self</span>.configuration.get(<span class="st">"auth"</span>, <span class="st">"foo"</span>)</span>
|
|
<span id="cb42-10"><a aria-hidden="true" href="#cb42-10" tabindex="-1"></a> <span class="va">self</span>.logger.info(<span class="st">"Configuration option </span><span class="sc">%r</span><span class="st"> is </span><span class="sc">%r</span><span class="st">"</span>, <span class="st">"foo"</span>, foo)</span>
|
|
<span id="cb42-11"><a aria-hidden="true" href="#cb42-11" tabindex="-1"></a></span>
|
|
<span id="cb42-12"><a aria-hidden="true" href="#cb42-12" tabindex="-1"></a> <span class="co"># Check authentication</span></span>
|
|
<span id="cb42-13"><a aria-hidden="true" href="#cb42-13" tabindex="-1"></a> <span class="va">self</span>.logger.info(<span class="st">"Login attempt by </span><span class="sc">%r</span><span class="st"> with password </span><span class="sc">%r</span><span class="st">"</span>,</span>
|
|
<span id="cb42-14"><a aria-hidden="true" href="#cb42-14" tabindex="-1"></a> user, password)</span>
|
|
<span id="cb42-15"><a aria-hidden="true" href="#cb42-15" tabindex="-1"></a> <span class="cf">return</span> user <span class="op">==</span> password</span></code></pre></div>
|
|
<p>Install the python module by running the following command in the
|
|
same folder as <code>setup.py</code>:</p>
|
|
<div class="sourceCode" id="cb43"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb43-1"><a aria-hidden="true" href="#cb43-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> .</span></code></pre></div>
|
|
<p>To make use this great creation in Radicale, set the configuration
|
|
option <code>type</code> in the <code>auth</code> section to
|
|
<code>radicale_silly_auth</code>:</p>
|
|
<div class="sourceCode" id="cb44"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb44-1"><a aria-hidden="true" href="#cb44-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
|
<span id="cb44-2"><a aria-hidden="true" href="#cb44-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> radicale_silly_auth</span></span>
|
|
<span id="cb44-3"><a aria-hidden="true" href="#cb44-3" tabindex="-1"></a><span class="dt">foo </span><span class="ot">=</span><span class="st"> bar</span></span></code></pre></div>
|
|
<p>You can uninstall the module with:</p>
|
|
<div class="sourceCode" id="cb45"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb45-1"><a aria-hidden="true" href="#cb45-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip uninstall radicale_silly_auth</span></code></pre></div>
|
|
</section>
|
|
<section class="level4" id="authentication-plugins">
|
|
<h4>Authentication plugins <a class="headerlink" href="#authentication-plugins">¶</a></h4>
|
|
<p>This plugin type is used to check login credentials. The module must
|
|
contain a class <code>Auth</code> that extends
|
|
<code>radicale.auth.BaseAuth</code>. Take a look at the file
|
|
<code>radicale/auth.py</code> in Radicale's source code for more
|
|
information.</p>
|
|
</section>
|
|
<section class="level4" id="rights-management-plugins">
|
|
<h4>Rights management plugins <a class="headerlink" href="#rights-management-plugins">¶</a></h4>
|
|
<p>This plugin type is used to check if a user has access to a path. The
|
|
module must contain a class <code>Rights</code> that extends
|
|
<code>radicale.rights.BaseRights</code>. Take a look at the file
|
|
<code>radicale/rights.py</code> in Radicale's source code for more
|
|
information.</p>
|
|
</section>
|
|
<section class="level4" id="web-plugins">
|
|
<h4>Web plugins <a class="headerlink" href="#web-plugins">¶</a></h4>
|
|
<p>This plugin type is used to provide the web interface for Radicale.
|
|
The module must contain a class <code>Web</code> that extends
|
|
<code>radicale.web.BaseWeb</code>. Take a look at the file
|
|
<code>radicale/web.py</code> in Radicale's source code for more
|
|
information.</p>
|
|
</section>
|
|
<section class="level4" id="storage-plugins">
|
|
<h4>Storage plugins <a class="headerlink" href="#storage-plugins">¶</a></h4>
|
|
<p>This plugin is used to store collections and items. The module must
|
|
contain a class <code>Collection</code> that extends
|
|
<code>radicale.storage.BaseCollection</code>. Take a look at the file
|
|
<code>radicale/storage.py</code> in Radicale's source code for more
|
|
information.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="migration-from-1xx-to-2xx">
|
|
<h3>Migration from 1.x.x to 2.x.x <a class="headerlink" href="#migration-from-1xx-to-2xx">¶</a></h3>
|
|
<section class="level4" id="why-a-migration">
|
|
<h4>Why a Migration? <a class="headerlink" href="#why-a-migration">¶</a></h4>
|
|
<p>Radicale 2.x.x is different from 1.x.x, here's everything you need to
|
|
know about this! <strong>Please read this page carefully if you want to
|
|
update Radicale.</strong></p>
|
|
<p>You'll also find extra information in <a href="https://github.com/Kozea/Radicale/issues/372">issue #372</a>.</p>
|
|
</section>
|
|
<section class="level4" id="python-3-only">
|
|
<h4>Python 3 Only <a class="headerlink" href="#python-3-only">¶</a></h4>
|
|
<p>Radicale 2.x.x works with Python >= 3.3, and <strong>doesn't work
|
|
anymore with Python 2</strong>.</p>
|
|
<p>(No, Python 3.3 is not new, it's been released more than 4 years ago.
|
|
Debian stable provides Python 3.4.)</p>
|
|
</section>
|
|
<section class="level4" id="dependencies">
|
|
<h4>Dependencies <a class="headerlink" href="#dependencies">¶</a></h4>
|
|
<p>Radicale now depends on <a href="https://eventable.github.io/vobject/">VObject</a>, 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 <strong>support date-based filters, even on recurring
|
|
events</strong>.</p>
|
|
</section>
|
|
<section class="level4" id="storage-3">
|
|
<h4>Storage <a class="headerlink" href="#storage-3">¶</a></h4>
|
|
<p>Calendars and address books are stored in a different way between
|
|
1.x.x and 2.x.x versions. <strong>Launching 2.x.x without migrating your
|
|
collections first will not work, Radicale won't be able to read your
|
|
previous data.</strong></p>
|
|
<p>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 <code>multifilesystem</code>, but <strong>it's
|
|
now thread-safe, with atomic writes and file locks</strong>. Other
|
|
storage types can be used by creating <a href="#plugins">plugins</a>.</p>
|
|
<p>To migrate data to Radicale 2.x.x the command line argument
|
|
<code>--export-storage</code> was added to Radicale 1.1.x. Start
|
|
Radicale 1.x.x as you would normally do, but add the argument
|
|
<code>--export-storage path/to/empty/folder</code>. 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.</p>
|
|
<p>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.</p>
|
|
<p>You can check the imported storage for errors by starting Radicale
|
|
>= 2.1.5 with the <code>--verify-storage</code> argument.</p>
|
|
<p>You can install version 1.1.x with:</p>
|
|
<div class="sourceCode" id="cb46"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb46-1"><a aria-hidden="true" href="#cb46-1" tabindex="-1"></a><span class="ex">$</span> python3 <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale==1.1.<span class="pp">*</span></span></code></pre></div>
|
|
</section>
|
|
<section class="level4" id="authentication-1">
|
|
<h4>Authentication <a class="headerlink" href="#authentication-1">¶</a></h4>
|
|
<p><strong>Radicale 2.x.x only provides htpasswd authentication
|
|
out-of-the-box.</strong> Other authentication methods can be added by
|
|
creating or using <a href="#plugins">plugins</a>.</p>
|
|
</section>
|
|
<section class="level4" id="rights-1">
|
|
<h4>Rights <a class="headerlink" href="#rights-1">¶</a></h4>
|
|
<p>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 <a href="#authentication-and-rights">Authentication
|
|
& Rights</a> page.</p>
|
|
<p>Other rights managers can be added by creating <a href="#plugins">plugins</a>.</p>
|
|
</section>
|
|
<section class="level4" id="versioning-1">
|
|
<h4>Versioning <a class="headerlink" href="#versioning-1">¶</a></h4>
|
|
<p>Support for versioning with <strong>git</strong> was removed from
|
|
Radicale 2.x.x. Instead, the configuration option <code>hook</code> in
|
|
the <code>storage</code> section was added, the <a href="#versioning">Collection Versioning</a> page explains its usage for
|
|
version control.</p>
|
|
</section>
|
|
</section>
|
|
</section>
|
|
<section class="level2" id="contribute">
|
|
<h2>Contribute <a class="headerlink" href="#contribute">¶</a></h2>
|
|
<section class="level4" id="chat-with-us-on-irc">
|
|
<h4>Chat with Us on IRC <a class="headerlink" href="#chat-with-us-on-irc">¶</a></h4>
|
|
<p>Want to say something? Join our IRC room: <code>##kozea</code> on
|
|
Freenode.</p>
|
|
</section>
|
|
<section class="level4" id="report-bugs">
|
|
<h4>Report Bugs <a class="headerlink" href="#report-bugs">¶</a></h4>
|
|
<p>Found a bug? Want a new feature? Report a new issue on the <a href="https://github.com/Kozea/Radicale/issues">Radicale
|
|
bug-tracker</a>.</p>
|
|
</section>
|
|
<section class="level4" id="hack-1">
|
|
<h4>Hack <a class="headerlink" href="#hack-1">¶</a></h4>
|
|
<p>Interested in hacking? Feel free to clone the <a href="https://github.com/Kozea/Radicale">git repository on Github</a> if
|
|
you want to add new features, fix bugs or update the documentation.</p>
|
|
</section>
|
|
<section class="level4" id="documentation-2">
|
|
<h4>Documentation <a class="headerlink" href="#documentation-2">¶</a></h4>
|
|
<p>To change or complement the documentation create a pull request to <a href="https://github.com/Kozea/Radicale/blob/master/DOCUMENTATION.md">DOCUMENTATION.md</a>.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level2" id="download">
|
|
<h2>Download <a class="headerlink" href="#download">¶</a></h2>
|
|
<section class="level4" id="pypi">
|
|
<h4>PyPI <a class="headerlink" href="#pypi">¶</a></h4>
|
|
<p>Radicale is <a href="https://pypi.python.org/pypi/Radicale/">available on PyPI</a>. To
|
|
install, just type as superuser:</p>
|
|
<pre><code>$ python3 -m pip install --upgrade radicale==2.1.*</code></pre>
|
|
</section>
|
|
<section class="level4" id="git-repository">
|
|
<h4>Git Repository <a class="headerlink" href="#git-repository">¶</a></h4>
|
|
<p>If you want the development version of Radicale, take a look at the
|
|
<a href="https://github.com/Kozea/Radicale/">git repository on
|
|
GitHub</a>, or install it directly with:</p>
|
|
<pre><code>$ python3 -m pip install --upgrade git+https://github.com/Kozea/Radicale</code></pre>
|
|
<p>You can also download the content of the repository as an <a href="https://github.com/Kozea/Radicale/tarball/master">archive</a>.</p>
|
|
</section>
|
|
<section class="level4" id="source-packages">
|
|
<h4>Source Packages <a class="headerlink" href="#source-packages">¶</a></h4>
|
|
<p>You can download the Radicale package for each release:</p>
|
|
<ul>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.12"><strong>2.1.12
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.11"><strong>2.1.11
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.10"><strong>2.1.10
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.9"><strong>2.1.9
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.8"><strong>2.1.8
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.7"><strong>2.1.7
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.6"><strong>2.1.6
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.5"><strong>2.1.5
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.4"><strong>2.1.4
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.3"><strong>2.1.3
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.2"><strong>2.1.2
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1.6"><strong>1.1.6
|
|
- Sixth Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.1"><strong>2.1.1
|
|
- Wild Radish Again</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0"><strong>2.1.0
|
|
- Wild Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1.4"><strong>1.1.4
|
|
- Fifth Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc3">2.1.0rc3</a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc2">2.1.0rc2</a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.1.0rc1">2.1.0rc1</a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0"><strong>2.0.0
|
|
- Little Big Radish</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1.3"><strong>1.1.3
|
|
- Fourth Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0rc2">2.0.0rc2</a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1.2"><strong>1.1.2
|
|
- Third Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/2.0.0rc1">2.0.0rc1</a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1.1"><strong>1.1.1
|
|
- Second Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.1"><strong>1.1
|
|
- Law of Nature</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.0.1"><strong>1.0.1
|
|
- Sunflower Again</strong></a></li>
|
|
<li><a href="https://api.github.com/repos/Kozea/Radicale/tarball/1.0"><strong>1.0
|
|
- Sunflower</strong></a></li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="linux-distribution-packages">
|
|
<h4>Linux Distribution Packages <a class="headerlink" href="#linux-distribution-packages">¶</a></h4>
|
|
<p>Radicale has been packaged for:</p>
|
|
<ul>
|
|
<li><a href="https://www.archlinux.org/packages/community/any/radicale/">ArchLinux</a>
|
|
by David Runge</li>
|
|
<li><a href="http://packages.debian.org/radicale">Debian</a> by Jonas
|
|
Smedegaard</li>
|
|
<li><a href="https://packages.gentoo.org/packages/www-apps/radicale">Gentoo</a>
|
|
by René Neumann, Maxim Koltsov and Manuel Rüger</li>
|
|
<li><a href="https://admin.fedoraproject.org/pkgdb/package/radicale/">Fedora</a>
|
|
by Jorti</li>
|
|
<li><a href="http://madb.mageia.org/package/show/application/0/name/radicale">Mageia</a>
|
|
by Jani Välimaa</li>
|
|
<li><a href="http://openports.se/productivity/radicale">OpenBSD</a> by
|
|
Sergey Bronnikov, Stuart Henderson and Ian Darwin</li>
|
|
<li><a href="http://software.opensuse.org/package/Radicale?search_term=radicale">openSUSE</a>
|
|
by Ákos Szőts and Rueckert</li>
|
|
<li><a href="http://code.activestate.com/pypm/radicale/">PyPM</a></li>
|
|
<li><a href="http://schoepfer.info/slackware.xhtml#packages-network">Slackware</a>
|
|
by Johannes Schöpfer</li>
|
|
<li><a href="http://packages.trisquel.info/search?searchon=names&keywords=radicale">Trisquel</a></li>
|
|
<li><a href="http://packages.ubuntu.com/radicale">Ubuntu</a> by the MOTU
|
|
and Jonas Smedegaard</li>
|
|
</ul>
|
|
<p>Radicale is also <a href="https://cloudron.io/button.html?app=org.radicale.cloudronapp">available
|
|
on Cloudron</a> and has a Dockerfile.</p>
|
|
<p>If you are interested in creating packages for other Linux
|
|
distributions, read the <a href="#contribute">"Contribute" page</a>.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level2" id="about">
|
|
<h2>About <a class="headerlink" href="#about">¶</a></h2>
|
|
<section class="level4" id="main-goals">
|
|
<h4>Main Goals <a class="headerlink" href="#main-goals">¶</a></h4>
|
|
<p>Radicale is a complete calendar and contact storing and manipulating
|
|
solution. It can store multiple calendars and multiple address
|
|
books.</p>
|
|
<p>Calendar and contact manipulation is available from both local and
|
|
distant accesses, possibly limited through authentication policies.</p>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level4" id="what-radicale-will-never-be">
|
|
<h4>What Radicale Will Never Be <a class="headerlink" href="#what-radicale-will-never-be">¶</a></h4>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level4" id="technical-choices">
|
|
<h4>Technical Choices <a class="headerlink" href="#technical-choices">¶</a></h4>
|
|
<p>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.</p>
|
|
<section class="level5" id="oriented-to-calendar-and-contact-user-agents">
|
|
<h5>Oriented to Calendar and Contact User Agents <a class="headerlink" href="#oriented-to-calendar-and-contact-user-agents">¶</a></h5>
|
|
<p>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.</p>
|
|
<p>Some calendar servers have been created to follow the CalDAV and
|
|
CardDAV RFCs as much as possible: <a href="http://www.davical.org/">Davical</a>, <a href="http://sabre.io/baikal/">Baïkal</a> and <a href="http://trac.calendarserver.org/">Darwin Calendar Server</a>, 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.</p>
|
|
<p>Even if it tries it best to follow the RFCs, Radicale does not and
|
|
<strong>will not</strong> blindly implements the CalDAV and CardDAV
|
|
standards. It is mainly designed to support the CalDAV and CardDAV
|
|
implementations of different clients.</p>
|
|
</section>
|
|
<section class="level5" id="simple">
|
|
<h5>Simple <a class="headerlink" href="#simple">¶</a></h5>
|
|
<p>Radicale is designed to be simple to install, simple to configure,
|
|
simple to use.</p>
|
|
<p>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.</p>
|
|
<p>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 <a href="#tutorial">tutorial</a>.</p>
|
|
</section>
|
|
<section class="level5" id="lazy">
|
|
<h5>Lazy <a class="headerlink" href="#lazy">¶</a></h5>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level4" id="history">
|
|
<h4>History <a class="headerlink" href="#history">¶</a></h4>
|
|
<p>Radicale has been started as a (free topic) stupid school project
|
|
replacing another (assigned topic) even more stupid school project.</p>
|
|
<p>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.</p>
|
|
<p>The <a href="https://github.com/Kozea/Radicale/commit/b1591aea">first
|
|
lines</a> 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.</p>
|
|
<p>And that was fun going from here to there thanks to you!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level2" id="news">
|
|
<h2>News <a class="headerlink" href="#news">¶</a></h2>
|
|
<p>Latest version of Radicale is 2.1.12, released on May 19, 2020 (<a href="https://github.com/Kozea/Radicale/blob/2.1.12/NEWS.md">changelog</a>).</p>
|
|
<section class="level3" id="may-19-2020---radicale-2112">
|
|
<h3>May 19, 2020 - Radicale 2.1.12 <a class="headerlink" href="#may-19-2020---radicale-2112">¶</a></h3>
|
|
<p>Radicale 2.1.12 is out!</p>
|
|
<section class="level4" id="2112---wild-radish">
|
|
<h4>2.1.12 - Wild Radish <a class="headerlink" href="#2112---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Include documentation in source archive</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="november-5-2018---radicale-2111">
|
|
<h3>November 5, 2018 - Radicale 2.1.11 <a class="headerlink" href="#november-5-2018---radicale-2111">¶</a></h3>
|
|
<p>Radicale 2.1.11 is out!</p>
|
|
<section class="level4" id="2111---wild-radish">
|
|
<h4>2.1.11 - Wild Radish <a class="headerlink" href="#2111---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Fix moving items between collections</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-16-2018---radicale-2110">
|
|
<h3>August 16, 2018 - Radicale 2.1.10 <a class="headerlink" href="#august-16-2018---radicale-2110">¶</a></h3>
|
|
<p>Radicale 2.1.10 is out!</p>
|
|
<section class="level4" id="2110---wild-radish">
|
|
<h4>2.1.10 - Wild Radish <a class="headerlink" href="#2110---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Update required versions for dependencies</li>
|
|
<li>Get <code>RADICALE_CONFIG</code> from WSGI environ</li>
|
|
<li>Improve HTTP status codes</li>
|
|
<li>Fix race condition in storage lock creation</li>
|
|
<li>Raise default limits for content length and timeout</li>
|
|
<li>Log output from hook</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="april-21-2018---radicale-219">
|
|
<h3>April 21, 2018 - Radicale 2.1.9 <a class="headerlink" href="#april-21-2018---radicale-219">¶</a></h3>
|
|
<p>Radicale 2.1.9 is out!</p>
|
|
<section class="level4" id="219---wild-radish">
|
|
<h4>2.1.9 - Wild Radish <a class="headerlink" href="#219---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Specify versions for dependencies</li>
|
|
<li>Move WSGI initialization into module</li>
|
|
<li>Check if <code>REPORT</code> method is actually supported</li>
|
|
<li>Include <code>rights</code> file in source distribution</li>
|
|
<li>Specify <code>md5</code> and <code>bcrypt</code> as extras</li>
|
|
<li>Improve logging messages</li>
|
|
<li>Windows: Fix crash when item path is a directory</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="september-24-2017---radicale-218">
|
|
<h3>September 24, 2017 - Radicale 2.1.8 <a class="headerlink" href="#september-24-2017---radicale-218">¶</a></h3>
|
|
<p>Radicale 2.1.8 is out!</p>
|
|
<section class="level4" id="218---wild-radish">
|
|
<h4>2.1.8 - Wild Radish <a class="headerlink" href="#218---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Flush files before fsync'ing</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="september-17-2017---radicale-217">
|
|
<h3>September 17, 2017 - Radicale 2.1.7 <a class="headerlink" href="#september-17-2017---radicale-217">¶</a></h3>
|
|
<p>Radicale 2.1.7 is out!</p>
|
|
<section class="level4" id="217---wild-radish">
|
|
<h4>2.1.7 - Wild Radish <a class="headerlink" href="#217---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Don't print warning when cache format changes</li>
|
|
<li>Add documentation for <code>BaseAuth</code></li>
|
|
<li>Add <code>is_authenticated2(login, user, password)</code> to
|
|
<code>BaseAuth</code></li>
|
|
<li>Fix names of custom properties in PROPFIND requests with
|
|
<code>D:propname</code> or <code>D:allprop</code></li>
|
|
<li>Return all properties in PROPFIND requests with
|
|
<code>D:propname</code> or <code>D:allprop</code></li>
|
|
<li>Allow <code>D:displayname</code> property on all collections</li>
|
|
<li>Answer with <code>D:unauthenticated</code> for
|
|
<code>D:current-user-principal</code> property when not logged in</li>
|
|
<li>Remove non-existing <code>ICAL:calendar-color</code> and
|
|
<code>C:calendar-timezone</code> properties from PROPFIND requests with
|
|
<code>D:propname</code> or <code>D:allprop</code></li>
|
|
<li>Add <code>D:owner</code> property to calendar and address book
|
|
objects</li>
|
|
<li>Remove <code>D:getetag</code> and <code>D:getlastmodified</code>
|
|
properties from regular collections</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="september-11-2017---radicale-216">
|
|
<h3>September 11, 2017 - Radicale 2.1.6 <a class="headerlink" href="#september-11-2017---radicale-216">¶</a></h3>
|
|
<p>Radicale 2.1.6 is out!</p>
|
|
<section class="level4" id="216---wild-radish">
|
|
<h4>2.1.6 - Wild Radish <a class="headerlink" href="#216---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Fix content-type of VLIST</li>
|
|
<li>Specify correct COMPONENT in content-type of VCALENDAR</li>
|
|
<li>Cache COMPONENT of calendar objects (improves speed with some
|
|
clients)</li>
|
|
<li>Stricter parsing of filters</li>
|
|
<li>Improve support for CardDAV filter</li>
|
|
<li>Fix some smaller bugs in CalDAV filter</li>
|
|
<li>Add X-WR-CALNAME and X-WR-CALDESC to calendars downloaded via
|
|
HTTP/WebDAV</li>
|
|
<li>Use X-WR-CALNAME and X-WR-CALDESC from calendars published via
|
|
WebDAV</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-25-2017---radicale-215">
|
|
<h3>August 25, 2017 - Radicale 2.1.5 <a class="headerlink" href="#august-25-2017---radicale-215">¶</a></h3>
|
|
<p>Radicale 2.1.5 is out!</p>
|
|
<section class="level4" id="215---wild-radish">
|
|
<h4>2.1.5 - Wild Radish <a class="headerlink" href="#215---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Add <code>--verify-storage</code> command-line argument</li>
|
|
<li>Allow comments in the htpasswd file</li>
|
|
<li>Don't strip whitespaces from user names and passwords in the
|
|
htpasswd file</li>
|
|
<li>Remove cookies from logging output</li>
|
|
<li>Allow uploads of whole collections with many components</li>
|
|
<li>Show warning message if server.timeout is used with Python <
|
|
3.5.2</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-4-2017---radicale-214">
|
|
<h3>August 4, 2017 - Radicale 2.1.4 <a class="headerlink" href="#august-4-2017---radicale-214">¶</a></h3>
|
|
<p>Radicale 2.1.4 is out!</p>
|
|
<section class="level4" id="214---wild-radish">
|
|
<h4>2.1.4 - Wild Radish <a class="headerlink" href="#214---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Fix incorrect time range matching and calculation for some
|
|
edge-cases with rescheduled recurrences</li>
|
|
<li>Fix owner property</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-2-2017---radicale-213">
|
|
<h3>August 2, 2017 - Radicale 2.1.3 <a class="headerlink" href="#august-2-2017---radicale-213">¶</a></h3>
|
|
<p>Radicale 2.1.3 is out!</p>
|
|
<section class="level4" id="213---wild-radish">
|
|
<h4>2.1.3 - Wild Radish <a class="headerlink" href="#213---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Enable timeout for SSL handshakes and move them out of the main
|
|
thread</li>
|
|
<li>Create cache entries during upload of items</li>
|
|
<li>Stop built-in server on Windows when Ctrl+C is pressed</li>
|
|
<li>Prevent slow down when multiple requests hit a collection during
|
|
cache warm-up</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-24-2017---radicale-212">
|
|
<h3>July 24, 2017 - Radicale 2.1.2 <a class="headerlink" href="#july-24-2017---radicale-212">¶</a></h3>
|
|
<p>Radicale 2.1.2 is out!</p>
|
|
<section class="level4" id="212---wild-radish">
|
|
<h4>2.1.2 - Wild Radish <a class="headerlink" href="#212---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Remove workarounds for bugs in VObject < 0.9.5</li>
|
|
<li>Error checking of collection tags and associated components</li>
|
|
<li>Improve error checking of uploaded collections and components</li>
|
|
<li>Don't delete empty collection properties implicitly</li>
|
|
<li>Improve logging of VObject serialization</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-1-2017---radicale-211">
|
|
<h3>July 1, 2017 - Radicale 2.1.1 <a class="headerlink" href="#july-1-2017---radicale-211">¶</a></h3>
|
|
<p>Radicale 2.1.1 is out!</p>
|
|
<section class="level4" id="211---wild-radish-again">
|
|
<h4>2.1.1 - Wild Radish Again <a class="headerlink" href="#211---wild-radish-again">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.x.x.</p>
|
|
<ul>
|
|
<li>Add missing UIDs instead of failing</li>
|
|
<li>Improve error checking of calendar and address book objects</li>
|
|
<li>Fix upload of whole address books</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="june-25-2017---radicale-210">
|
|
<h3>June 25, 2017 - Radicale 2.1.0 <a class="headerlink" href="#june-25-2017---radicale-210">¶</a></h3>
|
|
<p>Radicale 2.1.0 is out!</p>
|
|
<section class="level4" id="210---wild-radish">
|
|
<h4>2.1.0 - Wild Radish <a class="headerlink" href="#210---wild-radish">¶</a></h4>
|
|
<p>This release is compatible with version 2.0.0. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.1.0.</p>
|
|
<ul>
|
|
<li>Built-in web interface for creating and managing address books and
|
|
calendars
|
|
<ul>
|
|
<li>can be extended with web plugins</li>
|
|
</ul></li>
|
|
<li>Much faster storage backend</li>
|
|
<li>Significant reduction in memory usage</li>
|
|
<li>Improved logging
|
|
<ul>
|
|
<li>Include paths (of invalid items / requests) in log messages</li>
|
|
<li>Include configuration values causing problems in log messages</li>
|
|
<li>Log warning message for invalid requests by clients</li>
|
|
<li>Log error message for invalid files in the storage backend</li>
|
|
<li>No stack traces unless debugging is enabled</li>
|
|
</ul></li>
|
|
<li>Time range filter also regards overwritten recurrences</li>
|
|
<li>Items that couldn't be filtered because of bugs in VObject are
|
|
always returned (and a warning message is logged)</li>
|
|
<li>Basic error checking of configuration files</li>
|
|
<li>File system locking isn't disabled implicitly anymore, instead a new
|
|
configuration option gets introduced</li>
|
|
<li>The permissions of the lock file are not changed anymore</li>
|
|
<li>Support for sync-token</li>
|
|
<li>Support for client-side SSL certificates</li>
|
|
<li>Rights plugins can decide if access to an item is granted explicitly
|
|
<ul>
|
|
<li>Respond with 403 instead of 404 for principal collections of
|
|
non-existing users when <code>owner_only</code> plugin is used
|
|
(information leakage)</li>
|
|
</ul></li>
|
|
<li>Authentication plugins can provide the login and password from the
|
|
environment
|
|
<ul>
|
|
<li>new <code>remote_user</code> plugin, that gets the login from the
|
|
<code>REMOTE_USER</code> environment variable (for WSGI server)</li>
|
|
<li>new <code>http_x_remote_user</code> plugin, that gets the login from
|
|
the <code>X-Remote-User</code> HTTP header (for reverse proxies)</li>
|
|
</ul></li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="may-27-2017---radicale-200">
|
|
<h3>May 27, 2017 - Radicale 2.0.0 <a class="headerlink" href="#may-27-2017---radicale-200">¶</a></h3>
|
|
<p>Radicale 2.0.0 is out!</p>
|
|
<section class="level4" id="200---little-big-radish">
|
|
<h4>2.0.0 - Little Big Radish <a class="headerlink" href="#200---little-big-radish">¶</a></h4>
|
|
<p>This feature is not compatible with the 1.x.x versions. Follow our <a href="#migration-from-1xx-to-2xx">migration guide</a> if you want to
|
|
switch from 1.x.x to 2.0.0.</p>
|
|
<ul>
|
|
<li>Support Python 3.3+ only, Python 2 is not supported anymore</li>
|
|
<li>Keep only one simple filesystem-based storage system</li>
|
|
<li>Remove built-in Git support</li>
|
|
<li>Remove built-in authentication modules</li>
|
|
<li>Keep the WSGI interface, use Python HTTP server by default</li>
|
|
<li>Use a real iCal parser, rely on the "vobject" external module</li>
|
|
<li>Add a solid calendar discovery</li>
|
|
<li>Respect the difference between "files" and "folders", don't rely on
|
|
slashes</li>
|
|
<li>Remove the calendar creation with GET requests</li>
|
|
<li>Be stateless</li>
|
|
<li>Use a file locker</li>
|
|
<li>Add threading</li>
|
|
<li>Get atomic writes</li>
|
|
<li>Support new filters</li>
|
|
<li>Support read-only permissions</li>
|
|
<li>Allow External plugins for authentication, rights management,
|
|
storage and version control</li>
|
|
</ul>
|
|
<p>This release concludes endless months of hard work from the
|
|
community. You, all users and contributors, deserve a big <strong>thank
|
|
you</strong>.</p>
|
|
<p>This project has been an increadible experience for me, your dear
|
|
Guillaume, creator and maintainer of Radicale. After more than 8 years
|
|
of fun, I think that it's time to open this software to its
|
|
contributors. Radicale can grow and become more than the toy it used to
|
|
be. I've always seen Radicale as a small and simple piece of code, and I
|
|
don't want to prevent people from adding features just because I can't
|
|
or don't want to maintain them. The community is now large enough to
|
|
handle this.</p>
|
|
<p>If you're interested in Radicale, you can read <a href="https://github.com/Kozea/Radicale/issues/372">#372</a> and build
|
|
its future.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="may-3-2017---radicale-112">
|
|
<h3>May 3, 2017 - Radicale 1.1.2 <a class="headerlink" href="#may-3-2017---radicale-112">¶</a></h3>
|
|
<p>Radicale 1.1.2 is out!</p>
|
|
<section class="level4" id="112---third-law-of-nature">
|
|
<h4>1.1.2 - Third Law of Nature <a class="headerlink" href="#112---third-law-of-nature">¶</a></h4>
|
|
<ul>
|
|
<li><strong>Security fix</strong>: Add a random timer to avoid timing
|
|
oracles and simple bruteforce attacks when using the htpasswd
|
|
authentication method.</li>
|
|
<li>Various minor fixes.</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="december-31-2015---radicale-11">
|
|
<h3>December 31, 2015 - Radicale 1.1 <a class="headerlink" href="#december-31-2015---radicale-11">¶</a></h3>
|
|
<p>Radicale 1.1 is out!</p>
|
|
<section class="level4" id="11---law-of-nature">
|
|
<h4>1.1 - Law of Nature <a class="headerlink" href="#11---law-of-nature">¶</a></h4>
|
|
<p>One feature in this release is <strong>not backward
|
|
compatible</strong>:</p>
|
|
<ul>
|
|
<li>Use the first matching section for rights (inspired from daald)</li>
|
|
</ul>
|
|
<p>Now, the first section matching the path and current user in your
|
|
custom rights file is used. In the previous versions, the most
|
|
permissive rights of all the matching sections were applied. This new
|
|
behaviour gives a simple way to make specific rules at the top of the
|
|
file independant from the generic ones.</p>
|
|
<p>Many <strong>improvements in this release are related to
|
|
security</strong>, you should upgrade Radicale as soon as possible:</p>
|
|
<ul>
|
|
<li>Improve the regex used for well-known URIs (by Unrud)</li>
|
|
<li>Prevent regex injection in rights management (by Unrud)</li>
|
|
<li>Prevent crafted HTTP request from calling arbitrary functions (by
|
|
Unrud)</li>
|
|
<li>Improve URI sanitation and conversion to filesystem path (by
|
|
Unrud)</li>
|
|
<li>Decouple the daemon from its parent environment (by Unrud)</li>
|
|
</ul>
|
|
<p>Some bugs have been fixed and little enhancements have been
|
|
added:</p>
|
|
<ul>
|
|
<li>Assign new items to corret key (by Unrud)</li>
|
|
<li>Avoid race condition in PID file creation (by Unrud)</li>
|
|
<li>Improve the docker version (by cdpb)</li>
|
|
<li>Encode message and commiter for git commits</li>
|
|
<li>Test with Python 3.5</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="september-14-2015---radicale-10-whats-next">
|
|
<h3>September 14, 2015 - Radicale 1.0, what's next? <a class="headerlink" href="#september-14-2015---radicale-10-whats-next">¶</a></h3>
|
|
<p>Radicale 1.0 is out!</p>
|
|
<section class="level4" id="10---sunflower">
|
|
<h4>1.0 - Sunflower <a class="headerlink" href="#10---sunflower">¶</a></h4>
|
|
<ul>
|
|
<li>Enhanced performances (by Mathieu Dupuy)</li>
|
|
<li>Add MD5-APR1 and BCRYPT for htpasswd-based authentication (by
|
|
Jan-Philip Gehrcke)</li>
|
|
<li>Use PAM service (by Stephen Paul Weber)</li>
|
|
<li>Don't discard PROPPATCH on empty collections (Markus
|
|
Unterwaditzer)</li>
|
|
<li>Write the path of the collection in the git message (Matthew
|
|
Monaco)</li>
|
|
<li>Tests launched on Travis</li>
|
|
</ul>
|
|
<p>As explained in a previous <a href="http://librelist.com/browser//radicale/2015/8/21/radicale-1-0-is-coming-what-s-next/">mail</a>,
|
|
this version is called 1.0 because:</p>
|
|
<ul>
|
|
<li>there are no big changes since 0.10 but some small changes are
|
|
really useful,</li>
|
|
<li>simple tests are now automatically launched on Travis, and more can
|
|
be added in the future (<a href="https://travis-ci.org/Kozea/Radicale">https://travis-ci.org/Kozea/Radicale</a>).</li>
|
|
</ul>
|
|
<p>This version will be maintained with only simple bug fixes on a
|
|
separate git branch called <code>1.0.x</code>.</p>
|
|
<p>Now that this milestone is reached, it's time to think about the
|
|
future. When Radicale has been created, it was just a proof-of-concept.
|
|
The main goal was to write a small, stupid 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.</p>
|
|
<p>The first lines have been added to the SVN (!) repository as I was
|
|
drinking beers at the very end of 2008. It's now packaged for a growing
|
|
number of Linux distributions.</p>
|
|
<p>And that was fun going from here to there thanks to you. So…
|
|
<strong>Thank you, you're amazing</strong>. I'm so glad I've spent
|
|
endless hours fixing stupid bugs, arguing about databases and meeting
|
|
invitations, reading incredibly interesting RFCs and debugging with the
|
|
fabulous clients from Apple. I mean: that really, really was really,
|
|
really cool :).</p>
|
|
<p>During these years, a lot of things have changed and many users now
|
|
rely on Radicale in production. For example, I use it to manage medical
|
|
calendars, with thousands requests per day. Many people are happy to
|
|
install Radicale on their small home servers, but are also frustrated by
|
|
performance and unsupported specifications when they're trying to use it
|
|
seriously.</p>
|
|
<p>So, now is THE FUTURE! I think that Radicale 2.0 should:</p>
|
|
<ul>
|
|
<li>rely on a few external libraries for simple critical points (dealing
|
|
with HTTP and iCal for example),</li>
|
|
<li>be thread-safe,</li>
|
|
<li>be small,</li>
|
|
<li>be documented in a different way (for example by splitting the
|
|
client part from the server part, and by adding use cases),</li>
|
|
<li>let most of the "auth" modules outside in external modules,</li>
|
|
<li>have more and more tests,</li>
|
|
<li>have reliable and faster filesystem and database storage
|
|
mechanisms,</li>
|
|
<li>get a new design :).</li>
|
|
</ul>
|
|
<p>I'd also secretly love to drop the Python 2.x support.</p>
|
|
<p>These ideas are not all mine (except from the really, really, really
|
|
important "design" point :p), they have been proposed by many developers
|
|
and users. I've just tried to gather them and keep points that seem
|
|
important to me.</p>
|
|
<p>Other points have been discussed with many users and contibutors,
|
|
including:</p>
|
|
<ul>
|
|
<li>support of other clients, including Windows and BlackBerry
|
|
phones,</li>
|
|
<li>server-side meeting invitations,</li>
|
|
<li>different storage system as default (or even unique?).</li>
|
|
</ul>
|
|
<p>I'm not a huge fan of these features, either because I can't do
|
|
anything about them, or because I think that they're Really Bad Ideas®™.
|
|
But I'm ready to talk about them, because, well, I may not be always
|
|
right!</p>
|
|
<p>Need to talk about this? You know how to <a href="#contribute">contact us</a>!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="january-12-2015---radicale-010">
|
|
<h3>January 12, 2015 - Radicale 0.10 <a class="headerlink" href="#january-12-2015---radicale-010">¶</a></h3>
|
|
<p>Radicale 0.10 is out!</p>
|
|
<section class="level4" id="010---lovely-endless-grass">
|
|
<h4>0.10 - Lovely Endless Grass <a class="headerlink" href="#010---lovely-endless-grass">¶</a></h4>
|
|
<ul>
|
|
<li>Support well-known URLs (by Mathieu Dupuy)</li>
|
|
<li>Fix collection discovery (by Markus Unterwaditzer)</li>
|
|
<li>Reload logger config on SIGHUP (by Élie Bouttier)</li>
|
|
<li>Remove props files when deleting a collection (by Vincent Untz)</li>
|
|
<li>Support salted SHA1 passwords (by Marc Kleine-Budde)</li>
|
|
<li>Don't spam the logs about non-SSL IMAP connections to localhost (by
|
|
Giel van Schijndel)</li>
|
|
</ul>
|
|
<p>This version should bring some interesting discovery and
|
|
auto-configuration features, mostly with Apple clients.</p>
|
|
<p>Lots of love and kudos for the people who have spent hours to test
|
|
features and report issues, that was long but really useful (and some of
|
|
you have been really patient :p).</p>
|
|
<p>Issues are welcome, I'm sure that you'll find horrible, terrible,
|
|
crazy bugs faster than me. I'll release a version 0.10.1 if needed.</p>
|
|
<p>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"?</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-12-2013---radicale-08">
|
|
<h3>July 12, 2013 - Radicale 0.8 <a class="headerlink" href="#july-12-2013---radicale-08">¶</a></h3>
|
|
<p>Radicale 0.8 is out!</p>
|
|
<section class="level4" id="08---rainbow">
|
|
<h4>0.8 - Rainbow <a class="headerlink" href="#08---rainbow">¶</a></h4>
|
|
<ul>
|
|
<li>New authentication and rights management modules (by Matthias
|
|
Jordan)</li>
|
|
<li>Experimental database storage</li>
|
|
<li>Command-line option for custom configuration file (by Mark
|
|
Adams)</li>
|
|
<li>Root URL not at the root of a domain (by Clint Adams, Fabrice
|
|
Bellet, Vincent Untz)</li>
|
|
<li>Improved support for iCal, CalDAVSync, CardDAVSync, CalDavZAP and
|
|
CardDavMATE</li>
|
|
<li>Empty PROPFIND requests handled (by Christoph Polcin)</li>
|
|
<li>Colon allowed in passwords</li>
|
|
<li>Configurable realm message</li>
|
|
</ul>
|
|
<p>This version brings some of the biggest changes since Radicale's
|
|
creation, including an experimental support of database storage, clean
|
|
authentication modules, and rights management finally designed for real
|
|
users.</p>
|
|
<p>So, dear user, be careful: <strong>this version changes important
|
|
things in the configuration file, so check twice that everything is OK
|
|
when you update to 0.8, or you can have big problems</strong>.</p>
|
|
<p>More and more clients are supported, as a lot of bug fixes and
|
|
features have been added for this purpose. And before you ask: yes, 2
|
|
web-based clients, <a href="http://www.inf-it.com/open-source/clients/">CalDavZAP and
|
|
CardDavMATE</a>, are now supported!</p>
|
|
<p>Even if there has been a lot of time to test these new features, I am
|
|
pretty sure that some really annoying bugs have been left in this
|
|
version. We will probably release minor versions with bugfixes during
|
|
the next weeks, and it will not take one more year to reach 0.8.1.</p>
|
|
<p>The documentation has been updated, but some parts are missing and
|
|
some may be out of date. You can <a href="https://github.com/Kozea/Radicale/issues">report bugs</a> or even
|
|
<a href="https://github.com/Kozea/Radicale/blob/website/pages/user_documentation.rst">write
|
|
documentation directly on GitHub</a> if you find something strange (and
|
|
you probably will).</p>
|
|
<p>If anything is not clear, or if the way rights work is a bit
|
|
complicated to understand, or if you are so happy because everything
|
|
works so well, you can <a href="#contribute">share your
|
|
thoughts</a>!</p>
|
|
<p>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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-3-2012---radicale-071">
|
|
<h3>August 3, 2012 - Radicale 0.7.1 <a class="headerlink" href="#august-3-2012---radicale-071">¶</a></h3>
|
|
<p>Radicale 0.7.1 is out!</p>
|
|
<section class="level4" id="071---waterfalls">
|
|
<h4>0.7.1 - Waterfalls <a class="headerlink" href="#071---waterfalls">¶</a></h4>
|
|
<ul>
|
|
<li>Many address books fixes</li>
|
|
<li>New IMAP ACL (by Daniel Aleksandersen)</li>
|
|
<li>PAM ACL fixed (by Daniel Aleksandersen)</li>
|
|
<li>Courier ACL fixed (by Benjamin Frank)</li>
|
|
<li>Always set display name to collections (by Oskari Timperi)</li>
|
|
<li>Various DELETE responses fixed</li>
|
|
</ul>
|
|
<p>It's been a long time since the last version… As usual, many people
|
|
have contributed to this new version, that's a pleasure to get these
|
|
pull requests.</p>
|
|
<p>Most of the commits are bugfixes, especially about ACL backends and
|
|
address books. Many clients (including aCal and SyncEvolution) will be
|
|
much happier with this new version than with the previous one.</p>
|
|
<p>By the way, one main new feature has been added: a new IMAP ACL
|
|
backend, by Daniel. And about authentication, exciting features are
|
|
coming soon, stay tuned!</p>
|
|
<p>Next time, as many mails have come from angry and desperate coders,
|
|
tests will be <em>finally</em> added to help them to add features and
|
|
fix bugs. And after that, who knows, it may be time to release Radicale
|
|
1.0…</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="march-22-2012---radicale-07">
|
|
<h3>March 22, 2012 - Radicale 0.7 <a class="headerlink" href="#march-22-2012---radicale-07">¶</a></h3>
|
|
<p>Radicale 0.7 is out, at least!</p>
|
|
<section class="level4" id="07---eternal-sunshine">
|
|
<h4>0.7 - Eternal Sunshine <a class="headerlink" href="#07---eternal-sunshine">¶</a></h4>
|
|
<ul>
|
|
<li>Repeating events</li>
|
|
<li>Collection deletion</li>
|
|
<li>Courier and PAM authentication methods</li>
|
|
<li>CardDAV support</li>
|
|
<li>Custom LDAP filters supported</li>
|
|
</ul>
|
|
<p><strong>A lot</strong> 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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="january-5-2012---radicale-064-news-from-calypso">
|
|
<h3>January 5, 2012 - Radicale 0.6.4, News from Calypso <a class="headerlink" href="#january-5-2012---radicale-064-news-from-calypso">¶</a></h3>
|
|
<p>New year, new release. Radicale 0.6.4 has a really short
|
|
changelog:</p>
|
|
<section class="level4" id="064---tulips">
|
|
<h4>0.6.4 - Tulips <a class="headerlink" href="#064---tulips">¶</a></h4>
|
|
<ul>
|
|
<li>Fix the installation with Python 3.1</li>
|
|
</ul>
|
|
<p>The bug was in fact caused by a <a href="http://bugs.python.org/issue9561">bug in Python 3.1</a>,
|
|
everything should be OK now.</p>
|
|
</section>
|
|
<section class="level4" id="calypso">
|
|
<h4>Calypso <a class="headerlink" href="#calypso">¶</a></h4>
|
|
<p>After a lot of changes in Radicale, Keith Packard has decided to
|
|
launch a fork called <a href="http://keithp.com/blogs/calypso/">Calypso</a>, with nice features
|
|
such as a Git storage mechanism and a CardDAV support.</p>
|
|
<p>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 <a href="https://github.com/Kozea/Radicale/tree/carddav">carddav branch</a>
|
|
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!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="november-3-2011---radicale-063">
|
|
<h3>November 3, 2011 - Radicale 0.6.3 <a class="headerlink" href="#november-3-2011---radicale-063">¶</a></h3>
|
|
<p>Radicale version 0.6.3 has been released, with bugfixes that could be
|
|
interesting for you!</p>
|
|
<section class="level4" id="063---red-roses">
|
|
<h4>0.6.3 - Red Roses <a class="headerlink" href="#063---red-roses">¶</a></h4>
|
|
<ul>
|
|
<li>MOVE requests fixed</li>
|
|
<li>Faster REPORT answers</li>
|
|
<li>Executable script moved into the package</li>
|
|
</ul>
|
|
</section>
|
|
<section class="level4" id="whats-new-since-062">
|
|
<h4>What's New Since 0.6.2? <a class="headerlink" href="#whats-new-since-062">¶</a></h4>
|
|
<p>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.</p>
|
|
<p>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…</p>
|
|
<p>Finally, the executable script parsing the command line options and
|
|
starting the HTTP servers has been moved from the
|
|
<code>radicale.py</code> file into the <code>radicale</code> package.
|
|
Two executable are now present in the archive: the good old
|
|
<code>radicale.py</code>, and <code>bin/radicale</code>. The second one
|
|
is only used by <code>setup.py</code>, where the hack used to rename
|
|
<code>radicale.py</code> into <code>radicale</code> has therefore been
|
|
removed. As a consequence, you can now launch Radicale with the simple
|
|
<code>python -m radicale</code> command, without relying on an
|
|
executable.</p>
|
|
</section>
|
|
<section class="level4" id="time-for-a-stable-release">
|
|
<h4>Time for a Stable Release! <a class="headerlink" href="#time-for-a-stable-release">¶</a></h4>
|
|
<p>The next release may be a stable release, symbolically called 1.0.
|
|
Guess what's missing? Tests, of course!</p>
|
|
<p>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
|
|
<em>want</em> to write tests during the next weeks!</p>
|
|
<p>Repeating events, PAM and Courier authentication methods have already
|
|
been added in master. You'll find them in the 1.0 release!</p>
|
|
</section>
|
|
<section class="level4" id="whats-next">
|
|
<h4>What's Next? <a class="headerlink" href="#whats-next">¶</a></h4>
|
|
<p>Being stable is one thing, being cool is another one. If you want
|
|
some cool new features, you may be interested in:</p>
|
|
<ul>
|
|
<li>WebDAV and CardDAV support</li>
|
|
<li>Filters and rights management</li>
|
|
<li>Multiple storage backends, such as databases and git</li>
|
|
<li>Freebusy periods</li>
|
|
<li>Email alarms</li>
|
|
</ul>
|
|
<p>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!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="september-27-2011---radicale-062">
|
|
<h3>September 27, 2011 - Radicale 0.6.2 <a class="headerlink" href="#september-27-2011---radicale-062">¶</a></h3>
|
|
<p>0.6.2 is out with minor bugfixes.</p>
|
|
<section class="level4" id="062---seeds">
|
|
<h4>0.6.2 - Seeds <a class="headerlink" href="#062---seeds">¶</a></h4>
|
|
<ul>
|
|
<li>iPhone and iPad support fixed</li>
|
|
<li>Backslashes replaced by slashes in PROPFIND answers on Windows</li>
|
|
<li>PyPI archive set as default download URL</li>
|
|
</ul>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-28-2011---radicale-061-changes-future">
|
|
<h3>August 28, 2011 - Radicale 0.6.1, Changes, Future <a class="headerlink" href="#august-28-2011---radicale-061-changes-future">¶</a></h3>
|
|
<p>As previously imagined, a new 0.6.1 version has been released, mainly
|
|
fixing obvious bugs.</p>
|
|
<section class="level4" id="061---growing-up">
|
|
<h4>0.6.1 - Growing Up <a class="headerlink" href="#061---growing-up">¶</a></h4>
|
|
<ul>
|
|
<li>Example files included in the tarball</li>
|
|
<li>htpasswd support fixed</li>
|
|
<li>Redirection loop bug fixed</li>
|
|
<li>Testing message on GET requests</li>
|
|
</ul>
|
|
<p>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!</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level4" id="github-mailing-list-new-website">
|
|
<h4>GitHub, Mailing List, New Website <a class="headerlink" href="#github-mailing-list-new-website">¶</a></h4>
|
|
<p>A lot of small changes occurred during the last weeks.</p>
|
|
<p>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.</p>
|
|
<p>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!</p>
|
|
</section>
|
|
<section class="level4" id="future-features">
|
|
<h4>Future Features <a class="headerlink" href="#future-features">¶</a></h4>
|
|
<p>In the next weeks, new exciting features are coming in the master
|
|
branch! Some of them are almost ready:</p>
|
|
<ul>
|
|
<li>Henry-Nicolas has added the support for the PAM and
|
|
Courier-Authdaemon authentication mechanisms.</li>
|
|
<li>An anonymous called Keith Packard has prepared some small changes,
|
|
such as one file per event, cache and git versioning. Yes. Really.</li>
|
|
</ul>
|
|
<p>As you can find in the <a href="http://redmine.kozea.fr/versions/">Radicale Roadmap</a>, tests,
|
|
rights and filters are expected for 0.7.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="august-1-2011---radicale-06-released">
|
|
<h3>August 1, 2011 - Radicale 0.6 Released <a class="headerlink" href="#august-1-2011---radicale-06-released">¶</a></h3>
|
|
<p>Time for a new release with <strong>a lot</strong> of new exciting
|
|
features!</p>
|
|
<section class="level4" id="06---sapling">
|
|
<h4>0.6 - Sapling <a class="headerlink" href="#06---sapling">¶</a></h4>
|
|
<ul>
|
|
<li>WSGI support</li>
|
|
<li>IPv6 support</li>
|
|
<li>Smart, verbose and configurable logs</li>
|
|
<li>Apple iCal 4 and iPhone support (by Łukasz Langa)</li>
|
|
<li>CalDAV-Sync support (by Marten Gajda)</li>
|
|
<li>aCal support</li>
|
|
<li>KDE KOrganizer support</li>
|
|
<li>LDAP auth backend (by Corentin Le Bail)</li>
|
|
<li>Public and private calendars (by René Neumann)</li>
|
|
<li>PID file</li>
|
|
<li>MOVE requests management</li>
|
|
<li>Journal entries support</li>
|
|
<li>Drop Python 2.5 support</li>
|
|
</ul>
|
|
<p>Well, it's been a little longer than expected, but for good reasons:
|
|
a lot of features have been added, and a lot of clients are known to
|
|
work with Radicale, thanks to kind contributors. That's definitely good
|
|
news! But…</p>
|
|
<p>Testing all the clients is really painful, moreover for the ones from
|
|
Apple (I have no Mac nor iPhone of my own). We should seriously think of
|
|
automated tests, even if it's really hard to maintain, and maybe not
|
|
that useful. If you're interested in tests, you can look at <a href="http://repo.or.cz/w/davical.git/tree/HEAD:/testing/tests/regression-suite">the
|
|
wonderful regression suite of DAViCal</a>.</p>
|
|
<p>The new features, for example the WSGI support, are also poorly
|
|
documented. If you have some Apache or lighttpd configuration working
|
|
with Radicale, you can make the world a little bit better by writing a
|
|
paragraph or two in the <a href="https://gitorious.org/radicale/website">Radicale
|
|
documentation</a>. It's simple plain text, don't be afraid!</p>
|
|
<p>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)!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-2-2011---feature-freeze-for-06">
|
|
<h3>July 2, 2011 - Feature Freeze for 0.6 <a class="headerlink" href="#july-2-2011---feature-freeze-for-06">¶</a></h3>
|
|
<p>According to the <a href="http://redmine.kozea.fr/projects/radicale/roadmap">roadmap</a>, 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!</p>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
<p>It was Friday, fun fun fun fun.</p>
|
|
<p>So, that's it: Radicale supports Lightning, Evolution, Kontact, aCal
|
|
for Android, iPhone and iCal. Of course, before releasing a new
|
|
tarball:</p>
|
|
<ul>
|
|
<li><a href="1.1.html#documentation/user-documentation/simple-usage/starting-the-client">documentation</a>
|
|
is needed for the new clients that are not documented yet (Kontact, aCal
|
|
and iPhone);</li>
|
|
<li>tests are welcome, particularly for the Apple clients that I can't
|
|
test anymore;</li>
|
|
<li>no more features will be added, they'll wait in separate branches
|
|
for the 0.7 development.</li>
|
|
</ul>
|
|
<p>Please <a href="http://redmine.kozea.fr/projects/radicale/issues">report bugs</a>
|
|
if anything goes wrong during your tests, or just let us know <a href="#contribute">by Jabber or by mail</a> if everything is OK.</p>
|
|
</section>
|
|
<section class="level3" id="may-1-2011---ready-for-wsgi">
|
|
<h3>May 1, 2011 - Ready for WSGI <a class="headerlink" href="#may-1-2011---ready-for-wsgi">¶</a></h3>
|
|
<p>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:</p>
|
|
<ul>
|
|
<li>Real HTTP servers are much more efficient and reliable than the
|
|
default Python server used in Radicale;</li>
|
|
<li>All the authentication backends available for your server will be
|
|
available for Radicale;</li>
|
|
<li>Thanks to <a href="http://trac.saddi.com/flup">flup</a>, Radicale
|
|
can be interfaced with all the servers supporting CGI, AJP, FastCGI or
|
|
SCGI;</li>
|
|
<li>Radicale works very well without any additional server, without any
|
|
dependencies, without configuration, just as it was working before;</li>
|
|
<li>This one more feature removes useless code, less is definitely
|
|
more.</li>
|
|
</ul>
|
|
<p>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!</p>
|
|
<p>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!</p>
|
|
</section>
|
|
<section class="level3" id="april-30-2011---apple-ical-support">
|
|
<h3>April 30, 2011 - Apple iCal Support <a class="headerlink" href="#april-30-2011---apple-ical-support">¶</a></h3>
|
|
<p>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!</p>
|
|
<p>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.</p>
|
|
<p>The default server address is <code>localhost:5232/user/</code>,
|
|
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.</p>
|
|
</section>
|
|
<section class="level3" id="april-25-2011---two-features-and-one-new-roadmap">
|
|
<h3>April 25, 2011 - Two Features and One New Roadmap <a class="headerlink" href="#april-25-2011---two-features-and-one-new-roadmap">¶</a></h3>
|
|
<p>Two features have just reached the master branch, and the roadmap has
|
|
been refreshed.</p>
|
|
<section class="level4" id="ldap-authentication">
|
|
<h4>LDAP Authentication <a class="headerlink" href="#ldap-authentication">¶</a></h4>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level4" id="journal-entries">
|
|
<h4>Journal Entries <a class="headerlink" href="#journal-entries">¶</a></h4>
|
|
<p>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 <code>X-RADICALE-NAME</code> entries can now
|
|
clean their files, Radicale won't pollute them again.</p>
|
|
</section>
|
|
<section class="level4" id="new-roadmap">
|
|
<h4>New Roadmap <a class="headerlink" href="#new-roadmap">¶</a></h4>
|
|
<p>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 <a href="http://trac.saddi.com/flup/">flup</a>. Quite exciting, isn't
|
|
it?</p>
|
|
<p>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.</p>
|
|
<p>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!</p>
|
|
</section>
|
|
<section class="level4" id="bugs">
|
|
<h4>Bugs <a class="headerlink" href="#bugs">¶</a></h4>
|
|
<p>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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="april-10-2011---new-features">
|
|
<h3>April 10, 2011 - New Features <a class="headerlink" href="#april-10-2011---new-features">¶</a></h3>
|
|
<p>Radicale 0.5 was released only 8 days ago, but 3 new features have
|
|
already been added to the master branch:</p>
|
|
<ul>
|
|
<li>IPv6 support, with multiple addresses/ports support</li>
|
|
<li>Logs and debug mode</li>
|
|
<li>Owner-less calendars</li>
|
|
</ul>
|
|
<p>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 <a href="http://redmine.kozea.fr/projects/radicale/issues">bug tracker</a>.
|
|
And if you're fond of logging, you can even add a default configuration
|
|
file and more debug messages in the source.</p>
|
|
</section>
|
|
<section class="level3" id="april-2-2011---radicale-05-released">
|
|
<h3>April 2, 2011 - Radicale 0.5 Released <a class="headerlink" href="#april-2-2011---radicale-05-released">¶</a></h3>
|
|
<p>Radicale 0.5 is out! Here is what's new:</p>
|
|
<section class="level4" id="05---historical-artifacts">
|
|
<h4>0.5 - Historical Artifacts <a class="headerlink" href="#05---historical-artifacts">¶</a></h4>
|
|
<ul>
|
|
<li>Calendar depth</li>
|
|
<li>iPhone support</li>
|
|
<li>MacOS and Windows support</li>
|
|
<li>HEAD requests management</li>
|
|
<li>htpasswd user from calendar path</li>
|
|
</ul>
|
|
<p>iPhone support, but no iCal support for 0.5, despite our hard work,
|
|
sorry! After 1 month with no more activity on the dedicated bug, it was
|
|
time to forget it and hack on new awesome features. Thanks for your
|
|
help, dear Apple users, I keep the hope that one day, Radicale will work
|
|
with you!</p>
|
|
<p>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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="february-3-2011---jabber-room-and-iphone-support">
|
|
<h3>February 3, 2011 - Jabber Room and iPhone Support <a class="headerlink" href="#february-3-2011---jabber-room-and-iphone-support">¶</a></h3>
|
|
<p>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 <em>right now</em> by <a href="#git-repository">downloading the latest git version</a> (a tarball
|
|
is even available too if you don't want or know how to use git).</p>
|
|
<p>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: <a href="mailto:radicale@room.jabber.kozea.fr">radicale@room.jabber.kozea.fr</a>.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level3" id="october-21-2010---news-from-radicale">
|
|
<h3>October 21, 2010 - News from Radicale <a class="headerlink" href="#october-21-2010---news-from-radicale">¶</a></h3>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
<p>Some cool stuff is coming next, with calendar collections and groups,
|
|
and a simple web-based CalDAV client in early development. Stay
|
|
tuned!</p>
|
|
</section>
|
|
<section class="level3" id="august-8-2010---radicale-04-released">
|
|
<h3>August 8, 2010 - Radicale 0.4 Released <a class="headerlink" href="#august-8-2010---radicale-04-released">¶</a></h3>
|
|
<p>Radicale 0.4 is out! Here is what's new:</p>
|
|
<section class="level4" id="04---hot-days-back">
|
|
<h4>0.4 - Hot Days Back <a class="headerlink" href="#04---hot-days-back">¶</a></h4>
|
|
<ul>
|
|
<li>Personal calendars</li>
|
|
<li>HEAD requests</li>
|
|
<li>Last-Modified HTTP header</li>
|
|
<li><code>no-ssl</code> and <code>foreground</code> options</li>
|
|
<li>Default configuration file</li>
|
|
</ul>
|
|
<p>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!</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-4-2010---three-features-added-last-week">
|
|
<h3>July 4, 2010 - Three Features Added Last Week <a class="headerlink" href="#july-4-2010---three-features-added-last-week">¶</a></h3>
|
|
<p>Some features have been added in the git repository during the last
|
|
weeks, thanks to Jerome and Mariusz!</p>
|
|
<p>Personal Calendars Calendars accessed through the htpasswd ACL module
|
|
can now be personal. Thanks to the <code>personal</code> option, a user
|
|
called <code>bob</code> can access calendars at <code>/bob/*</code> but
|
|
not to the <code>/alice/*</code> ones.</p>
|
|
<p>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.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level3" id="june-14-2010---radicale-03-released">
|
|
<h3>June 14, 2010 - Radicale 0.3 Released <a class="headerlink" href="#june-14-2010---radicale-03-released">¶</a></h3>
|
|
<p>Radicale 0.3 is out! Here is what’s new:</p>
|
|
<section class="level4" id="03---dancing-flowers">
|
|
<h4>0.3 - Dancing Flowers <a class="headerlink" href="#03---dancing-flowers">¶</a></h4>
|
|
<ul>
|
|
<li>Evolution support</li>
|
|
<li>Version management</li>
|
|
</ul>
|
|
<p>The website changed a little bit too, with some small HTML5 and CSS3
|
|
features such as articles, sections, transitions, opacity, box shadows
|
|
and rounded corners. If you’re reading this website with Internet
|
|
Explorer, you should consider using a standard-compliant browser!</p>
|
|
<p>Radicale is now included in Squeeze, the testing branch of Debian. A
|
|
<a href="http://bugs.gentoo.org/show_bug.cgi?id=322811">Radicale ebuild
|
|
for Gentoo</a> has been proposed too. If you want to package Radicale
|
|
for another distribution, you’re welcome!</p>
|
|
<p>Next step is 0.5, with calendar collections, and Windows and MacOS
|
|
support.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="may-31-2010---may-news">
|
|
<h3>May 31, 2010 - May News <a class="headerlink" href="#may-31-2010---may-news">¶</a></h3>
|
|
<section class="level4" id="news-from-contributors">
|
|
<h4>News from contributors <a class="headerlink" href="#news-from-contributors">¶</a></h4>
|
|
<p>Jonas Smedegaard packaged Radicale for Debian last week. Two
|
|
packages, called <code>radicale</code> for the daemon and
|
|
<code>python-radicale</code> for the module, have been added to Sid, the
|
|
unstable branch of Debian. Thank you, Jonas!</p>
|
|
<p>Sven Guckes corrected some of the strange-English-sentences present
|
|
on this website. Thank you, Sven!</p>
|
|
</section>
|
|
<section class="level4" id="news-from-software">
|
|
<h4>News from software <a class="headerlink" href="#news-from-software">¶</a></h4>
|
|
<p>A simple <code>VERSION</code> has been added in the library: you can
|
|
now play with <code>radicale.VERSION</code> and
|
|
<code>$radicale --version</code>.</p>
|
|
<p>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.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="april-19-2010---evolution-supported">
|
|
<h3>April 19, 2010 - Evolution Supported <a class="headerlink" href="#april-19-2010---evolution-supported">¶</a></h3>
|
|
<p>Radicale now supports another CalDAV client: <a href="http://projects.gnome.org/evolution/">Evolution, the default mail,
|
|
addressbook and calendaring client for Gnome</a>. This feature was quite
|
|
easy to add, as it required less than 20 new lines of code in the
|
|
requests handler.</p>
|
|
<p>If you are interested, just clone the <a href="http://www.gitorious.org/radicale/radicale">git
|
|
repository</a>.</p>
|
|
</section>
|
|
<section class="level3" id="april-13-2010---radicale-02-released">
|
|
<h3>April 13, 2010 - Radicale 0.2 Released <a class="headerlink" href="#april-13-2010---radicale-02-released">¶</a></h3>
|
|
<p>Radicale 0.2 is out! Here is what’s new:</p>
|
|
<section class="level4" id="02---snowflakes">
|
|
<h4>0.2 - Snowflakes <a class="headerlink" href="#02---snowflakes">¶</a></h4>
|
|
<ul>
|
|
<li>Sunbird pre-1.0 support</li>
|
|
<li>SSL connection</li>
|
|
<li>Htpasswd authentication</li>
|
|
<li>Daemon mode</li>
|
|
<li>User configuration</li>
|
|
<li>Twisted dependency removed</li>
|
|
<li>Python 3 support</li>
|
|
<li>Real URLs for PUT and DELETE</li>
|
|
<li>Concurrent modification reported to users</li>
|
|
<li>Many bugs fixed by Roger Wenham</li>
|
|
</ul>
|
|
<p>First of all, we would like to thank Roger Wenham for his bugfixes
|
|
and his supercool words.</p>
|
|
<p>You may have noticed that Sunbird 1.0 has not been released, but
|
|
according to the Mozilla developers, 1.0pre is something like a final
|
|
version.</p>
|
|
<p>You may have noticed too that Radicale can be <a href="http://pypi.python.org/pypi/Radicale/0.2">downloaded from
|
|
PyPI</a>. Of course, it is also available on the <a href="#download">download page</a>.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="january-21-2010---https-and-authentication">
|
|
<h3>January 21, 2010 - HTTPS and Authentication <a class="headerlink" href="#january-21-2010---https-and-authentication">¶</a></h3>
|
|
<p>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!</p>
|
|
<p>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.</p>
|
|
<p>Authentication A simple authentication architecture is now available,
|
|
allowing different methods thanks to different modules. The first two
|
|
modules are <code>fake</code> (no authentication) and
|
|
<code>htpasswd</code> (authentication with an <code>htpasswd</code> file
|
|
created by the Apache tool). More methods such as LDAP are coming
|
|
soon!</p>
|
|
</section>
|
|
<section class="level3" id="january-15-2010---ready-for-python-3">
|
|
<h3>January 15, 2010 - Ready for Python 3 <a class="headerlink" href="#january-15-2010---ready-for-python-3">¶</a></h3>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level3" id="january-11-2010---twisted-no-longer-required">
|
|
<h3>January 11, 2010 - Twisted no Longer Required <a class="headerlink" href="#january-11-2010---twisted-no-longer-required">¶</a></h3>
|
|
<p>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.</p>
|
|
</section>
|
|
<section class="level3" id="december-31-2009---lightning-and-sunbird-10b2pre-support">
|
|
<h3>December 31, 2009 - Lightning and Sunbird 1.0b2pre Support <a class="headerlink" href="#december-31-2009---lightning-and-sunbird-10b2pre-support">¶</a></h3>
|
|
<p>Lightning/Sunbird 1.0b2pre is out, adding minor changes in CalDAV
|
|
support. A <a href="http://www.gitorious.org/radicale/radicale/commit/330283e">new
|
|
commit</a> makes Radicale work with versions 0.9, 1.0b1 et 1.0b2.
|
|
Moreover, etags are now quoted according to the RFC 2616.</p>
|
|
</section>
|
|
<section class="level3" id="december-9-2009---thunderbird-3-released">
|
|
<h3>December 9, 2009 - Thunderbird 3 released <a class="headerlink" href="#december-9-2009---thunderbird-3-released">¶</a></h3>
|
|
<p><a href="http://www.mozillamessaging.com/thunderbird/3.0/releasenotes/">Thunderbird
|
|
3 is out</a>, and Lightning/Sunbird 1.0 should be released in a few
|
|
days. The <a href="http://gitorious.org/radicale/radicale/commit/6545bc8">last commit
|
|
in git</a> 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.</p>
|
|
</section>
|
|
<section class="level3" id="september-1-2009---radicale-01-released">
|
|
<h3>September 1, 2009 - Radicale 0.1 Released <a class="headerlink" href="#september-1-2009---radicale-01-released">¶</a></h3>
|
|
<p>First Radicale release! Here is the changelog:</p>
|
|
<section class="level4" id="01---crazy-vegetables">
|
|
<h4>0.1 - Crazy Vegetables <a class="headerlink" href="#01---crazy-vegetables">¶</a></h4>
|
|
<ul>
|
|
<li>First release</li>
|
|
<li>Lightning/Sunbird 0.9 compatibility</li>
|
|
<li>Easy installer</li>
|
|
</ul>
|
|
<p>You can download this version on the <a href="#download">download
|
|
page</a>.</p>
|
|
</section>
|
|
</section>
|
|
<section class="level3" id="july-28-2009---radicale-on-gitorious">
|
|
<h3>July 28, 2009 - Radicale on Gitorious <a class="headerlink" href="#july-28-2009---radicale-on-gitorious">¶</a></h3>
|
|
<p>Radicale code has been released on Gitorious! Take a look at the <a href="http://www.gitorious.org/radicale">Radicale main page on
|
|
Gitorious</a> to view and download source code.</p>
|
|
</section>
|
|
<section class="level3 last" id="july-27-2009---radicale-ready-to-launch">
|
|
<h3>July 27, 2009 - Radicale Ready to Launch <a class="headerlink" href="#july-27-2009---radicale-ready-to-launch">¶</a></h3>
|
|
<p>The Radicale Project is launched. The code has been cleaned up and
|
|
will be available soon…</p>
|
|
</section>
|
|
</section>
|
|
</div>
|
|
</main>
|
|
</html>
|