mirror of
https://github.com/Kozea/Radicale.git
synced 2025-07-02 16:58:30 +00:00
Generate documentation
This commit is contained in:
parent
5e9be50ca2
commit
277152eb11
1 changed files with 198 additions and 439 deletions
637
v3.html
637
v3.html
|
@ -182,23 +182,18 @@ with the WSGI server</a></li>
|
||||||
<li class="level4"><a href="#web" id="toc-web">web</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="#logging" id="toc-logging">logging</a></li>
|
||||||
<li class="level4"><a href="#headers" id="toc-headers">headers</a></li>
|
<li class="level4"><a href="#headers" id="toc-headers">headers</a></li>
|
||||||
<li class="level4"><a href="#hook-1" id="toc-hook-1">hook</a></li>
|
|
||||||
<li class="level4"><a href="#rabbitmq_endpoint" id="toc-rabbitmq_endpoint">rabbitmq_endpoint</a></li>
|
|
||||||
<li class="level4"><a href="#rabbitmq_topic" id="toc-rabbitmq_topic">rabbitmq_topic</a></li>
|
|
||||||
<li class="level4"><a href="#rabbitmq_queue_type" id="toc-rabbitmq_queue_type">rabbitmq_queue_type</a></li>
|
|
||||||
<li class="level4"><a href="#reporting" id="toc-reporting">reporting</a></li>
|
|
||||||
</ul></li>
|
</ul></li>
|
||||||
</ul></li>
|
<li class="level3"><a href="#supported-clients" id="toc-supported-clients">Supported
|
||||||
<li class="level2"><a href="#supported-clients" id="toc-supported-clients">Supported
|
|
||||||
Clients</a>
|
Clients</a>
|
||||||
<ul>
|
<ul>
|
||||||
<li class="level4"><a href="#davx⁵" id="toc-davx⁵">DAVx⁵</a></li>
|
<li class="level4"><a href="#davx⁵" id="toc-davx⁵">DAVx⁵</a></li>
|
||||||
<li class="level4"><a href="#gnome-calendar-contacts" id="toc-gnome-calendar-contacts">GNOME Calendar, Contacts</a></li>
|
<li class="level4"><a href="#gnome-calendar-contacts-and-evolution" id="toc-gnome-calendar-contacts-and-evolution">GNOME Calendar, Contacts
|
||||||
<li class="level4"><a href="#evolution" id="toc-evolution">Evolution</a></li>
|
and Evolution</a></li>
|
||||||
<li class="level4"><a href="#thunderbird" id="toc-thunderbird">Thunderbird</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
|
<li class="level4"><a href="#infcloud-caldavzap-and-carddavmate" id="toc-infcloud-caldavzap-and-carddavmate">InfCloud, CalDavZAP and
|
||||||
CardDavMATE</a></li>
|
CardDavMATE</a></li>
|
||||||
<li class="level4"><a href="#command-line" id="toc-command-line">Command line</a></li>
|
<li class="level4"><a href="#command-line" id="toc-command-line">Command line</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="#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>
|
<li class="level3"><a href="#storage-2" id="toc-storage-2">Storage</a>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -228,6 +223,8 @@ plugins</a></li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
<li class="level2"><a href="#contribute" id="toc-contribute">Contribute</a>
|
<li class="level2"><a href="#contribute" id="toc-contribute">Contribute</a>
|
||||||
<ul>
|
<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="#report-bugs" id="toc-report-bugs">Report Bugs</a></li>
|
||||||
<li class="level4"><a href="#hack" id="toc-hack">Hack</a></li>
|
<li class="level4"><a href="#hack" id="toc-hack">Hack</a></li>
|
||||||
<li class="level4"><a href="#documentation-2" id="toc-documentation-2">Documentation</a></li>
|
<li class="level4"><a href="#documentation-2" id="toc-documentation-2">Documentation</a></li>
|
||||||
|
@ -280,15 +277,15 @@ structure.</li>
|
||||||
<section class="level4" id="installation">
|
<section class="level4" id="installation">
|
||||||
<h4>Installation <a class="headerlink" href="#installation">¶</a></h4>
|
<h4>Installation <a class="headerlink" href="#installation">¶</a></h4>
|
||||||
<p>Radicale is really easy to install and works out-of-the-box.</p>
|
<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">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> https://github.com/Kozea/Radicale/archive/master.tar.gz</span>
|
<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">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale</span>
|
||||||
<span id="cb1-2"><a aria-hidden="true" href="#cb1-2" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> radicale <span class="at">--logging-level</span> info <span class="at">--storage-filesystem-folder</span><span class="op">=</span>~/.var/lib/radicale/collections</span></code></pre></div>
|
<span id="cb1-2"><a aria-hidden="true" href="#cb1-2" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> radicale <span class="at">--storage-filesystem-folder</span><span class="op">=</span>~/.var/lib/radicale/collections</span></code></pre></div>
|
||||||
<p>When the server is launched, open <a href="http://localhost:5232">http://localhost:5232</a> in your browser!
|
<p>When the server is launched, open <a href="http://localhost:5232">http://localhost:5232</a> in your browser!
|
||||||
You can login with any username and password.</p>
|
You can login with any username and password.</p>
|
||||||
<p>Want more? Check the <a href="#tutorials">tutorials</a> and the <a href="#documentation-1">documentation</a>.</p>
|
<p>Want more? Check the <a href="#tutorials">tutorials</a> and the <a href="#documentation-1">documentation</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="whats-new">
|
<section class="level4" id="whats-new">
|
||||||
<h4>What's New? <a class="headerlink" href="#whats-new">¶</a></h4>
|
<h4>What's New? <a class="headerlink" href="#whats-new">¶</a></h4>
|
||||||
<p>Read the <a href="https://github.com/Kozea/Radicale/blob/master/CHANGELOG.md">changelog
|
<p>Read the <a href="https://github.com/Kozea/Radicale/blob/v3/CHANGELOG.md">changelog
|
||||||
on GitHub.</a></p>
|
on GitHub.</a></p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
@ -307,13 +304,14 @@ for <a href="#basic-configuration">some basic configuration</a>.</p>
|
||||||
system.</p>
|
system.</p>
|
||||||
<section class="level4" id="linux--bsd">
|
<section class="level4" id="linux--bsd">
|
||||||
<h4>Linux / *BSD <a class="headerlink" href="#linux--bsd">¶</a></h4>
|
<h4>Linux / *BSD <a class="headerlink" href="#linux--bsd">¶</a></h4>
|
||||||
<p>First, make sure that <strong>python</strong> 3.8 or later and
|
<p>First, make sure that <strong>python</strong> 3.5 or later
|
||||||
<strong>pip</strong> are installed. On most distributions it should be
|
(<strong>python</strong> ≥ 3.6 is recommended) and <strong>pip</strong>
|
||||||
enough to install the package <code>python3-pip</code>.</p>
|
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>
|
<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>
|
<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-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> https://github.com/Kozea/Radicale/archive/master.tar.gz</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</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">--storage-filesystem-folder</span><span class="op">=</span>~/.var/lib/radicale/collections</span></code></pre></div>
|
<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">--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!
|
<p>Victory! Open <a href="http://localhost:5232">http://localhost:5232</a> in your browser!
|
||||||
You can log in with any username and password.</p>
|
You can log in with any username and password.</p>
|
||||||
|
@ -325,7 +323,7 @@ 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
|
installer, check the "Add Python to PATH" box and click on "Install
|
||||||
now". Wait a couple of minutes, it's done!</p>
|
now". Wait a couple of minutes, it's done!</p>
|
||||||
<p>Launch a command prompt and type:</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>python <span class="op">-</span>m pip install <span class="op">--</span>upgrade https<span class="op">://</span>github<span class="op">.</span><span class="fu">com</span><span class="op">/</span>Kozea<span class="op">/</span>Radicale<span class="op">/</span>archive<span class="op">/</span>master<span class="op">.</span><span class="fu">tar</span><span class="op">.</span><span class="fu">gz</span></span>
|
<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>python <span class="op">-</span>m pip install <span class="op">--</span>upgrade radicale</span>
|
||||||
<span id="cb3-2"><a aria-hidden="true" href="#cb3-2" tabindex="-1"></a>python <span class="op">-</span>m radicale <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>
|
<span id="cb3-2"><a aria-hidden="true" href="#cb3-2" tabindex="-1"></a>python <span class="op">-</span>m radicale <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>Victory! Open <a href="http://localhost:5232">http://localhost:5232</a> in your browser!
|
<p>Victory! Open <a href="http://localhost:5232">http://localhost:5232</a> in your browser!
|
||||||
You can log in with any username and password.</p>
|
You can log in with any username and password.</p>
|
||||||
|
@ -357,19 +355,20 @@ file.</p>
|
||||||
<section class="level5" id="the-secure-way">
|
<section class="level5" id="the-secure-way">
|
||||||
<h5>The secure way <a class="headerlink" href="#the-secure-way">¶</a></h5>
|
<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>
|
<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" using SHA-512 as hash method</span></span>
|
<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">-5</span> <span class="at">-c</span> /path/to/users user1</span>
|
<span id="cb4-2"><a aria-hidden="true" href="#cb4-2" tabindex="-1"></a><span class="ex">$</span> htpasswd <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-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-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-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">-5</span> /path/to/users user2</span>
|
<span id="cb4-6"><a aria-hidden="true" href="#cb4-6" tabindex="-1"></a><span class="ex">$</span> htpasswd /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-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>
|
<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>Authentication can be enabled with the following configuration:</p>
|
<p>Authentication can be enabled with the following configuration:</p>
|
||||||
<div class="sourceCode" id="cb5"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb5-1"><a aria-hidden="true" href="#cb5-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
<div class="sourceCode" id="cb5"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb5-1"><a aria-hidden="true" href="#cb5-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
||||||
<span id="cb5-2"><a aria-hidden="true" href="#cb5-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
<span id="cb5-2"><a aria-hidden="true" href="#cb5-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
||||||
<span id="cb5-3"><a aria-hidden="true" href="#cb5-3" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> /path/to/users</span></span>
|
<span id="cb5-3"><a aria-hidden="true" href="#cb5-3" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> /path/to/users</span></span>
|
||||||
<span id="cb5-4"><a aria-hidden="true" href="#cb5-4" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> autodetect</span></span></code></pre></div>
|
<span id="cb5-4"><a aria-hidden="true" href="#cb5-4" tabindex="-1"></a><span class="co"># encryption method used in the htpasswd file</span></span>
|
||||||
|
<span id="cb5-5"><a aria-hidden="true" href="#cb5-5" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> md5</span></span></code></pre></div>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="the-simple-but-insecure-way">
|
<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>
|
<h5>The simple but insecure way <a class="headerlink" href="#the-simple-but-insecure-way">¶</a></h5>
|
||||||
|
@ -432,8 +431,6 @@ operating system. Follow one of the chapters below depending on your
|
||||||
operating system and requirements.</p>
|
operating system and requirements.</p>
|
||||||
<section class="level4" id="linux-with-systemd-system-wide">
|
<section class="level4" id="linux-with-systemd-system-wide">
|
||||||
<h4>Linux with systemd system-wide <a class="headerlink" href="#linux-with-systemd-system-wide">¶</a></h4>
|
<h4>Linux with systemd system-wide <a class="headerlink" href="#linux-with-systemd-system-wide">¶</a></h4>
|
||||||
<p>Recommendation: check support by <a href="#linux-distribution-packages">Linux Distribution Packages</a>
|
|
||||||
instead of manual setup / initial configuration.</p>
|
|
||||||
<p>Create the <strong>radicale</strong> user and group for the Radicale
|
<p>Create the <strong>radicale</strong> user and group for the Radicale
|
||||||
service. (Run
|
service. (Run
|
||||||
<code>useradd --system --user-group --home-dir / --shell /sbin/nologin radicale</code>
|
<code>useradd --system --user-group --home-dir / --shell /sbin/nologin radicale</code>
|
||||||
|
@ -562,11 +559,15 @@ below.</p>
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
proxy_pass_header Authorization;
|
proxy_pass_header Authorization;
|
||||||
}</code></pre>
|
}</code></pre>
|
||||||
<p>Example <strong>Caddy</strong> configuration:</p>
|
<p>Example <strong>Caddy</strong> configuration with basicauth from
|
||||||
<pre><code>handle_path /radicale/* {
|
Caddy:</p>
|
||||||
uri strip_prefix /radicale
|
<pre class="Caddy"><code>handle_path /radicale* {
|
||||||
|
basicauth {
|
||||||
|
user hash
|
||||||
|
}
|
||||||
reverse_proxy localhost:5232 {
|
reverse_proxy localhost:5232 {
|
||||||
header_up X-Script-Name /radicale
|
header_up +X-Script-Name "/radicale"
|
||||||
|
header_up +X-remote-user "{http.auth.user.id}"
|
||||||
}
|
}
|
||||||
}</code></pre>
|
}</code></pre>
|
||||||
<p>Example <strong>Apache</strong> configuration:</p>
|
<p>Example <strong>Apache</strong> configuration:</p>
|
||||||
|
@ -595,19 +596,6 @@ below.</p>
|
||||||
<span id="cb18-9"><a aria-hidden="true" href="#cb18-9" tabindex="-1"></a><span class="fu"><If</span><span class="at"> "%{HTTPS} =~ /on/"</span><span class="fu">></span></span>
|
<span id="cb18-9"><a aria-hidden="true" href="#cb18-9" tabindex="-1"></a><span class="fu"><If</span><span class="at"> "%{HTTPS} =~ /on/"</span><span class="fu">></span></span>
|
||||||
<span id="cb18-10"><a aria-hidden="true" href="#cb18-10" tabindex="-1"></a>RequestHeader<span class="st"> set X-Forwarded-Proto "https"</span></span>
|
<span id="cb18-10"><a aria-hidden="true" href="#cb18-10" tabindex="-1"></a>RequestHeader<span class="st"> set X-Forwarded-Proto "https"</span></span>
|
||||||
<span id="cb18-11"><a aria-hidden="true" href="#cb18-11" tabindex="-1"></a><span class="fu"></If></span></span></code></pre></div>
|
<span id="cb18-11"><a aria-hidden="true" href="#cb18-11" tabindex="-1"></a><span class="fu"></If></span></span></code></pre></div>
|
||||||
<p>Example <strong>lighttpd</strong> configuration:</p>
|
|
||||||
<pre class="lighttpd"><code>server.modules += ( "mod_proxy" , "mod_setenv", "mod_rewrite" )
|
|
||||||
|
|
||||||
$HTTP["url"] =~ "^/radicale/" {
|
|
||||||
proxy.server = ( "" => (( "host" => "127.0.0.1", "port" => "5232" )) )
|
|
||||||
proxy.header = ( "map-urlpath" => ( "/radicale/" => "/" ))
|
|
||||||
|
|
||||||
setenv.add-request-header = (
|
|
||||||
"X-Script-Name" => "/radicale",
|
|
||||||
"Script-Name" => "/radicale",
|
|
||||||
)
|
|
||||||
url.rewrite-once = ( "^/radicale/radicale/(.*)" => "/radicale/$1" )
|
|
||||||
}</code></pre>
|
|
||||||
<p>Be reminded that Radicale's default configuration enforces limits on
|
<p>Be reminded that Radicale's default configuration enforces limits on
|
||||||
the maximum number of parallel connections, the maximum file size and
|
the maximum number of parallel connections, the maximum file size and
|
||||||
the rate of incorrect authentication attempts. Connections are
|
the rate of incorrect authentication attempts. Connections are
|
||||||
|
@ -628,45 +616,34 @@ and disables HTTP authentication.</p>
|
||||||
auth_basic "Radicale - Password Required";
|
auth_basic "Radicale - Password Required";
|
||||||
auth_basic_user_file /etc/nginx/htpasswd;
|
auth_basic_user_file /etc/nginx/htpasswd;
|
||||||
}</code></pre>
|
}</code></pre>
|
||||||
<p>Example <strong>Caddy</strong> configuration:</p>
|
|
||||||
<pre><code>handle_path /radicale/* {
|
|
||||||
uri strip_prefix /radicale
|
|
||||||
basicauth {
|
|
||||||
USER HASH
|
|
||||||
}
|
|
||||||
reverse_proxy localhost:5232 {
|
|
||||||
header_up X-Script-Name /radicale
|
|
||||||
header_up X-remote-user {http.auth.user.id}
|
|
||||||
}
|
|
||||||
}</code></pre>
|
|
||||||
<p>Example <strong>Apache</strong> configuration:</p>
|
<p>Example <strong>Apache</strong> configuration:</p>
|
||||||
<div class="sourceCode" id="cb22"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb22-1"><a aria-hidden="true" href="#cb22-1" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
<div class="sourceCode" id="cb20"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb20-1"><a aria-hidden="true" href="#cb20-1" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
||||||
<span id="cb22-2"><a aria-hidden="true" href="#cb22-2" tabindex="-1"></a>RewriteRule<span class="st"> ^/radicale$ /radicale/ [R,L]</span></span>
|
<span id="cb20-2"><a aria-hidden="true" href="#cb20-2" tabindex="-1"></a>RewriteRule<span class="st"> ^/radicale$ /radicale/ [R,L]</span></span>
|
||||||
<span id="cb22-3"><a aria-hidden="true" href="#cb22-3" tabindex="-1"></a></span>
|
<span id="cb20-3"><a aria-hidden="true" href="#cb20-3" tabindex="-1"></a></span>
|
||||||
<span id="cb22-4"><a aria-hidden="true" href="#cb22-4" tabindex="-1"></a><span class="fu"><Location</span><span class="at"> "/radicale/"</span><span class="fu">></span></span>
|
<span id="cb20-4"><a aria-hidden="true" href="#cb20-4" tabindex="-1"></a><span class="fu"><Location</span><span class="at"> "/radicale/"</span><span class="fu">></span></span>
|
||||||
<span id="cb22-5"><a aria-hidden="true" href="#cb22-5" tabindex="-1"></a> <span class="ex">AuthType</span><span class="ch"> </span><span class="kw">Basic</span></span>
|
<span id="cb20-5"><a aria-hidden="true" href="#cb20-5" tabindex="-1"></a> <span class="ex">AuthType</span><span class="ch"> </span><span class="kw">Basic</span></span>
|
||||||
<span id="cb22-6"><a aria-hidden="true" href="#cb22-6" tabindex="-1"></a> AuthName<span class="st"> "Radicale - Password Required"</span></span>
|
<span id="cb20-6"><a aria-hidden="true" href="#cb20-6" tabindex="-1"></a> AuthName<span class="st"> "Radicale - Password Required"</span></span>
|
||||||
<span id="cb22-7"><a aria-hidden="true" href="#cb22-7" tabindex="-1"></a> AuthUserFile<span class="st"> "/etc/radicale/htpasswd"</span></span>
|
<span id="cb20-7"><a aria-hidden="true" href="#cb20-7" tabindex="-1"></a> AuthUserFile<span class="st"> "/etc/radicale/htpasswd"</span></span>
|
||||||
<span id="cb22-8"><a aria-hidden="true" href="#cb22-8" tabindex="-1"></a> Require<span class="st"> valid-user</span></span>
|
<span id="cb20-8"><a aria-hidden="true" href="#cb20-8" tabindex="-1"></a> Require<span class="st"> valid-user</span></span>
|
||||||
<span id="cb22-9"><a aria-hidden="true" href="#cb22-9" tabindex="-1"></a></span>
|
<span id="cb20-9"><a aria-hidden="true" href="#cb20-9" tabindex="-1"></a></span>
|
||||||
<span id="cb22-10"><a aria-hidden="true" href="#cb22-10" tabindex="-1"></a> ProxyPass<span class="st"> http://localhost:5232/ retry=0</span></span>
|
<span id="cb20-10"><a aria-hidden="true" href="#cb20-10" tabindex="-1"></a> ProxyPass<span class="st"> http://localhost:5232/ retry=0</span></span>
|
||||||
<span id="cb22-11"><a aria-hidden="true" href="#cb22-11" tabindex="-1"></a> ProxyPassReverse<span class="st"> http://localhost:5232/</span></span>
|
<span id="cb20-11"><a aria-hidden="true" href="#cb20-11" tabindex="-1"></a> ProxyPassReverse<span class="st"> http://localhost:5232/</span></span>
|
||||||
<span id="cb22-12"><a aria-hidden="true" href="#cb22-12" tabindex="-1"></a> RequestHeader<span class="st"> set X-Script-Name /radicale</span></span>
|
<span id="cb20-12"><a aria-hidden="true" href="#cb20-12" tabindex="-1"></a> RequestHeader<span class="st"> set X-Script-Name /radicale</span></span>
|
||||||
<span id="cb22-13"><a aria-hidden="true" href="#cb22-13" tabindex="-1"></a> RequestHeader<span class="st"> set X-Remote-User expr=%{REMOTE_USER}</span></span>
|
<span id="cb20-13"><a aria-hidden="true" href="#cb20-13" tabindex="-1"></a> RequestHeader<span class="st"> set X-Remote-User expr=%{REMOTE_USER}</span></span>
|
||||||
<span id="cb22-14"><a aria-hidden="true" href="#cb22-14" tabindex="-1"></a><span class="fu"></Location></span></span></code></pre></div>
|
<span id="cb20-14"><a aria-hidden="true" href="#cb20-14" tabindex="-1"></a><span class="fu"></Location></span></span></code></pre></div>
|
||||||
<p>Example <strong>Apache .htaccess</strong> configuration:</p>
|
<p>Example <strong>Apache .htaccess</strong> configuration:</p>
|
||||||
<div class="sourceCode" id="cb23"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb23-1"><a aria-hidden="true" href="#cb23-1" tabindex="-1"></a>DirectoryIndex<span class="st"> disabled</span></span>
|
<div class="sourceCode" id="cb21"><pre class="sourceCode apache"><code class="sourceCode apache"><span id="cb21-1"><a aria-hidden="true" href="#cb21-1" tabindex="-1"></a>DirectoryIndex<span class="st"> disabled</span></span>
|
||||||
<span id="cb23-2"><a aria-hidden="true" href="#cb23-2" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
<span id="cb21-2"><a aria-hidden="true" href="#cb21-2" tabindex="-1"></a><span class="ex">RewriteEngine</span><span class="ch"> </span><span class="kw">On</span></span>
|
||||||
<span id="cb23-3"><a aria-hidden="true" href="#cb23-3" tabindex="-1"></a>RewriteRule<span class="st"> ^(.*)$ http://localhost:5232/$1 [P,L]</span></span>
|
<span id="cb21-3"><a aria-hidden="true" href="#cb21-3" tabindex="-1"></a>RewriteRule<span class="st"> ^(.*)$ http://localhost:5232/$1 [P,L]</span></span>
|
||||||
<span id="cb23-4"><a aria-hidden="true" href="#cb23-4" tabindex="-1"></a></span>
|
<span id="cb21-4"><a aria-hidden="true" href="#cb21-4" tabindex="-1"></a></span>
|
||||||
<span id="cb23-5"><a aria-hidden="true" href="#cb23-5" tabindex="-1"></a><span class="ex">AuthType</span><span class="ch"> </span><span class="kw">Basic</span></span>
|
<span id="cb21-5"><a aria-hidden="true" href="#cb21-5" tabindex="-1"></a><span class="ex">AuthType</span><span class="ch"> </span><span class="kw">Basic</span></span>
|
||||||
<span id="cb23-6"><a aria-hidden="true" href="#cb23-6" tabindex="-1"></a>AuthName<span class="st"> "Radicale - Password Required"</span></span>
|
<span id="cb21-6"><a aria-hidden="true" href="#cb21-6" tabindex="-1"></a>AuthName<span class="st"> "Radicale - Password Required"</span></span>
|
||||||
<span id="cb23-7"><a aria-hidden="true" href="#cb23-7" tabindex="-1"></a>AuthUserFile<span class="st"> "/etc/radicale/htpasswd"</span></span>
|
<span id="cb21-7"><a aria-hidden="true" href="#cb21-7" tabindex="-1"></a>AuthUserFile<span class="st"> "/etc/radicale/htpasswd"</span></span>
|
||||||
<span id="cb23-8"><a aria-hidden="true" href="#cb23-8" tabindex="-1"></a>Require<span class="st"> valid-user</span></span>
|
<span id="cb21-8"><a aria-hidden="true" href="#cb21-8" tabindex="-1"></a>Require<span class="st"> valid-user</span></span>
|
||||||
<span id="cb23-9"><a aria-hidden="true" href="#cb23-9" tabindex="-1"></a></span>
|
<span id="cb21-9"><a aria-hidden="true" href="#cb21-9" tabindex="-1"></a></span>
|
||||||
<span id="cb23-10"><a aria-hidden="true" href="#cb23-10" tabindex="-1"></a><span class="co"># Set to directory of .htaccess file:</span></span>
|
<span id="cb21-10"><a aria-hidden="true" href="#cb21-10" tabindex="-1"></a><span class="co"># Set to directory of .htaccess file:</span></span>
|
||||||
<span id="cb23-11"><a aria-hidden="true" href="#cb23-11" tabindex="-1"></a>RequestHeader<span class="st"> set X-Script-Name /radicale</span></span>
|
<span id="cb21-11"><a aria-hidden="true" href="#cb21-11" tabindex="-1"></a>RequestHeader<span class="st"> set X-Script-Name /radicale</span></span>
|
||||||
<span id="cb23-12"><a aria-hidden="true" href="#cb23-12" tabindex="-1"></a>RequestHeader<span class="st"> set X-Remote-User expr=%{REMOTE_USER}</span></span></code></pre></div>
|
<span id="cb21-12"><a aria-hidden="true" href="#cb21-12" tabindex="-1"></a>RequestHeader<span class="st"> set X-Remote-User expr=%{REMOTE_USER}</span></span></code></pre></div>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p><strong>Security:</strong> Untrusted clients should not be able to
|
<p><strong>Security:</strong> Untrusted clients should not be able to
|
||||||
access the Radicale server directly. Otherwise, they can authenticate as
|
access the Radicale server directly. Otherwise, they can authenticate as
|
||||||
|
@ -681,22 +658,16 @@ generate a certificate for Radicale and a certificate for the reverse
|
||||||
proxy. The following commands generate self-signed certificates. You
|
proxy. The following commands generate self-signed certificates. You
|
||||||
will be asked to enter additional information about the certificate, the
|
will be asked to enter additional information about the certificate, the
|
||||||
values don't matter and you can keep the defaults.</p>
|
values don't matter and you can keep the defaults.</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">openssl</span> 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="dt">\</span></span>
|
<div class="sourceCode" id="cb22"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb22-1"><a aria-hidden="true" href="#cb22-1" tabindex="-1"></a><span class="ex">openssl</span> 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="dt">\</span></span>
|
||||||
<span id="cb24-2"><a aria-hidden="true" href="#cb24-2" tabindex="-1"></a> <span class="at">-nodes</span> <span class="at">-days</span> 9999</span>
|
<span id="cb22-2"><a aria-hidden="true" href="#cb22-2" tabindex="-1"></a> <span class="at">-nodes</span> <span class="at">-days</span> 9999</span>
|
||||||
<span id="cb24-3"><a aria-hidden="true" href="#cb24-3" tabindex="-1"></a><span class="ex">openssl</span> 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="dt">\</span></span>
|
<span id="cb22-3"><a aria-hidden="true" href="#cb22-3" tabindex="-1"></a><span class="ex">openssl</span> 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="dt">\</span></span>
|
||||||
<span id="cb24-4"><a aria-hidden="true" href="#cb24-4" tabindex="-1"></a> <span class="at">-nodes</span> <span class="at">-days</span> 9999</span></code></pre></div>
|
<span id="cb22-4"><a aria-hidden="true" href="#cb22-4" tabindex="-1"></a> <span class="at">-nodes</span> <span class="at">-days</span> 9999</span></code></pre></div>
|
||||||
<p>Use the following configuration for Radicale:</p>
|
<p>Use the following configuration for Radicale:</p>
|
||||||
<div class="sourceCode" id="cb25"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb25-1"><a aria-hidden="true" href="#cb25-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
<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">[server]</span></span>
|
||||||
<span id="cb25-2"><a aria-hidden="true" href="#cb25-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="cb23-2"><a aria-hidden="true" href="#cb23-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="cb25-3"><a aria-hidden="true" href="#cb25-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="cb23-3"><a aria-hidden="true" href="#cb23-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="cb25-4"><a aria-hidden="true" href="#cb25-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="cb23-4"><a aria-hidden="true" href="#cb23-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="cb25-5"><a aria-hidden="true" href="#cb25-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>
|
<span id="cb23-5"><a aria-hidden="true" href="#cb23-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>If you're using the Let's Encrypt's Certbot, the configuration should
|
|
||||||
look similar to this:</p>
|
|
||||||
<div class="sourceCode" id="cb26"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb26-1"><a aria-hidden="true" href="#cb26-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
|
||||||
<span id="cb26-2"><a aria-hidden="true" href="#cb26-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="cb26-3"><a aria-hidden="true" href="#cb26-3" tabindex="-1"></a><span class="dt">certificate </span><span class="ot">=</span><span class="st"> /etc/letsencrypt/live/{Your Domain}/fullchain.pem</span></span>
|
|
||||||
<span id="cb26-4"><a aria-hidden="true" href="#cb26-4" tabindex="-1"></a><span class="dt">key </span><span class="ot">=</span><span class="st"> /etc/letsencrypt/live/{Your Domain}/privkey.pem</span></span></code></pre></div>
|
|
||||||
<p>Example <strong>nginx</strong> configuration:</p>
|
<p>Example <strong>nginx</strong> configuration:</p>
|
||||||
<pre class="nginx"><code>location /radicale/ {
|
<pre class="nginx"><code>location /radicale/ {
|
||||||
proxy_pass https://localhost:5232/;
|
proxy_pass https://localhost:5232/;
|
||||||
|
@ -715,15 +686,15 @@ look similar to this:</p>
|
||||||
environment variable, otherwise no configuration file is loaded and the
|
environment variable, otherwise no configuration file is loaded and the
|
||||||
default configuration is used.</p>
|
default configuration is used.</p>
|
||||||
<p>Example <strong>uWSGI</strong> configuration:</p>
|
<p>Example <strong>uWSGI</strong> configuration:</p>
|
||||||
<div class="sourceCode" id="cb28"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb28-1"><a aria-hidden="true" href="#cb28-1" tabindex="-1"></a><span class="kw">[uwsgi]</span></span>
|
<div class="sourceCode" id="cb25"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb25-1"><a aria-hidden="true" href="#cb25-1" tabindex="-1"></a><span class="kw">[uwsgi]</span></span>
|
||||||
<span id="cb28-2"><a aria-hidden="true" href="#cb28-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="cb25-2"><a aria-hidden="true" href="#cb25-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="cb28-3"><a aria-hidden="true" href="#cb28-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="cb25-3"><a aria-hidden="true" href="#cb25-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="cb28-4"><a aria-hidden="true" href="#cb28-4" tabindex="-1"></a><span class="dt">plugin </span><span class="ot">=</span><span class="st"> python3</span></span>
|
<span id="cb25-4"><a aria-hidden="true" href="#cb25-4" tabindex="-1"></a><span class="dt">plugin </span><span class="ot">=</span><span class="st"> python3</span></span>
|
||||||
<span id="cb28-5"><a aria-hidden="true" href="#cb28-5" tabindex="-1"></a><span class="dt">module </span><span class="ot">=</span><span class="st"> radicale</span></span>
|
<span id="cb25-5"><a aria-hidden="true" href="#cb25-5" tabindex="-1"></a><span class="dt">module </span><span class="ot">=</span><span class="st"> radicale</span></span>
|
||||||
<span id="cb28-6"><a aria-hidden="true" href="#cb28-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>
|
<span id="cb25-6"><a aria-hidden="true" href="#cb25-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>
|
<p>Example <strong>Gunicorn</strong> configuration:</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">gunicorn</span> <span class="at">--bind</span> <span class="st">'127.0.0.1:5232'</span> <span class="at">--env</span> <span class="st">'RADICALE_CONFIG=/etc/radicale/config'</span> <span class="dt">\</span></span>
|
<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="ex">gunicorn</span> <span class="at">--bind</span> <span class="st">'127.0.0.1:5232'</span> <span class="at">--env</span> <span class="st">'RADICALE_CONFIG=/etc/radicale/config'</span> <span class="dt">\</span></span>
|
||||||
<span id="cb29-2"><a aria-hidden="true" href="#cb29-2" tabindex="-1"></a> <span class="at">--workers</span> 8 radicale</span></code></pre></div>
|
<span id="cb26-2"><a aria-hidden="true" href="#cb26-2" tabindex="-1"></a> <span class="at">--workers</span> 8 radicale</span></code></pre></div>
|
||||||
<section class="level4" id="manage-user-accounts-with-the-wsgi-server">
|
<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>
|
<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
|
<p>Set the configuration option <code>type</code> in the
|
||||||
|
@ -746,18 +717,9 @@ content:</p>
|
||||||
.Radicale.tmp-*</code></pre>
|
.Radicale.tmp-*</code></pre>
|
||||||
<p>The configuration option <code>hook</code> in the
|
<p>The configuration option <code>hook</code> in the
|
||||||
<code>storage</code> section must be set to the following command:</p>
|
<code>storage</code> section must be set to the following command:</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="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="dt">\"</span><span class="st">%(user)s</span><span class="dt">\"</span><span class="st">"</span><span class="kw">)</span></span></code></pre></div>
|
<div class="sourceCode" id="cb28"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb28-1"><a aria-hidden="true" href="#cb28-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
|
<p>The command gets executed after every change to the storage and
|
||||||
commits the changes into the <strong>git</strong> repository.</p>
|
commits the changes into the <strong>git</strong> repository.</p>
|
||||||
<p>For the hook to not cause errors either <strong>git</strong> user
|
|
||||||
details need to be set and match the owner of the collections directory
|
|
||||||
or the repository needs to be marked as safe.</p>
|
|
||||||
<p>When using the systemd unit file from the <a href="#running-as-a-service">Running as a service</a> section this
|
|
||||||
<strong>cannot</strong> be done via a <code>.gitconfig</code> file in
|
|
||||||
the users home directory, as Radicale won't have read permissions!</p>
|
|
||||||
<p>In <code>/var/lib/radicale/collections/.git</code> run:</p>
|
|
||||||
<div class="sourceCode" id="cb32"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb32-1"><a aria-hidden="true" href="#cb32-1" tabindex="-1"></a><span class="fu">git</span> config user.name <span class="st">"radicale"</span></span>
|
|
||||||
<span id="cb32-2"><a aria-hidden="true" href="#cb32-2" tabindex="-1"></a><span class="fu">git</span> config user.email <span class="st">"radicale@example.com"</span></span></code></pre></div>
|
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section class="level2" id="documentation-1">
|
<section class="level2" id="documentation-1">
|
||||||
|
@ -767,17 +729,17 @@ the users home directory, as Radicale won't have read permissions!</p>
|
||||||
<p>Radicale can be configured with a configuration file or with command
|
<p>Radicale can be configured with a configuration file or with command
|
||||||
line arguments.</p>
|
line arguments.</p>
|
||||||
<p>An example configuration file looks like:</p>
|
<p>An example configuration file looks like:</p>
|
||||||
<div class="sourceCode" id="cb33"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb33-1"><a aria-hidden="true" href="#cb33-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
<div class="sourceCode" id="cb29"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb29-1"><a aria-hidden="true" href="#cb29-1" tabindex="-1"></a><span class="kw">[server]</span></span>
|
||||||
<span id="cb33-2"><a aria-hidden="true" href="#cb33-2" tabindex="-1"></a><span class="co"># Bind all addresses</span></span>
|
<span id="cb29-2"><a aria-hidden="true" href="#cb29-2" tabindex="-1"></a><span class="co"># Bind all addresses</span></span>
|
||||||
<span id="cb33-3"><a aria-hidden="true" href="#cb33-3" tabindex="-1"></a><span class="dt">hosts </span><span class="ot">=</span><span class="st"> 0.0.0.0:5232, [::]:5232</span></span>
|
<span id="cb29-3"><a aria-hidden="true" href="#cb29-3" tabindex="-1"></a><span class="dt">hosts </span><span class="ot">=</span><span class="st"> 0.0.0.0:5232, [::]:5232</span></span>
|
||||||
<span id="cb33-4"><a aria-hidden="true" href="#cb33-4" tabindex="-1"></a></span>
|
<span id="cb29-4"><a aria-hidden="true" href="#cb29-4" tabindex="-1"></a></span>
|
||||||
<span id="cb33-5"><a aria-hidden="true" href="#cb33-5" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
<span id="cb29-5"><a aria-hidden="true" href="#cb29-5" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
||||||
<span id="cb33-6"><a aria-hidden="true" href="#cb33-6" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
<span id="cb29-6"><a aria-hidden="true" href="#cb29-6" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> htpasswd</span></span>
|
||||||
<span id="cb33-7"><a aria-hidden="true" href="#cb33-7" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> ~/.config/radicale/users</span></span>
|
<span id="cb29-7"><a aria-hidden="true" href="#cb29-7" tabindex="-1"></a><span class="dt">htpasswd_filename </span><span class="ot">=</span><span class="st"> ~/.config/radicale/users</span></span>
|
||||||
<span id="cb33-8"><a aria-hidden="true" href="#cb33-8" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> autodetect</span></span>
|
<span id="cb29-8"><a aria-hidden="true" href="#cb29-8" tabindex="-1"></a><span class="dt">htpasswd_encryption </span><span class="ot">=</span><span class="st"> md5</span></span>
|
||||||
<span id="cb33-9"><a aria-hidden="true" href="#cb33-9" tabindex="-1"></a></span>
|
<span id="cb29-9"><a aria-hidden="true" href="#cb29-9" tabindex="-1"></a></span>
|
||||||
<span id="cb33-10"><a aria-hidden="true" href="#cb33-10" tabindex="-1"></a><span class="kw">[storage]</span></span>
|
<span id="cb29-10"><a aria-hidden="true" href="#cb29-10" tabindex="-1"></a><span class="kw">[storage]</span></span>
|
||||||
<span id="cb33-11"><a aria-hidden="true" href="#cb33-11" 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>
|
<span id="cb29-11"><a aria-hidden="true" href="#cb29-11" 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
|
<p>Radicale tries to load configuration files from
|
||||||
<code>/etc/radicale/config</code> and
|
<code>/etc/radicale/config</code> and
|
||||||
<code>~/.config/radicale/config</code>. Custom paths can be specified
|
<code>~/.config/radicale/config</code>. Custom paths can be specified
|
||||||
|
@ -788,9 +750,9 @@ configuration files can be separated by <code>:</code> (resp.
|
||||||
optional.</p>
|
optional.</p>
|
||||||
<p>The same example configuration via command line arguments looks
|
<p>The same example configuration via command line arguments looks
|
||||||
like:</p>
|
like:</p>
|
||||||
<div class="sourceCode" id="cb34"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb34-1"><a aria-hidden="true" href="#cb34-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> radicale <span class="at">--server-hosts</span> 0.0.0.0:5232,[::]:5232 <span class="dt">\</span></span>
|
<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">python3</span> <span class="at">-m</span> radicale <span class="at">--server-hosts</span> 0.0.0.0:5232,[::]:5232 <span class="dt">\</span></span>
|
||||||
<span id="cb34-2"><a aria-hidden="true" href="#cb34-2" tabindex="-1"></a> <span class="at">--auth-type</span> htpasswd <span class="at">--auth-htpasswd-filename</span> ~/.config/radicale/users <span class="dt">\</span></span>
|
<span id="cb30-2"><a aria-hidden="true" href="#cb30-2" tabindex="-1"></a> <span class="at">--auth-type</span> htpasswd <span class="at">--auth-htpasswd-filename</span> ~/.config/radicale/users <span class="dt">\</span></span>
|
||||||
<span id="cb34-3"><a aria-hidden="true" href="#cb34-3" tabindex="-1"></a> <span class="at">--auth-htpasswd-encryption</span> autodetect</span></code></pre></div>
|
<span id="cb30-3"><a aria-hidden="true" href="#cb30-3" tabindex="-1"></a> <span class="at">--auth-htpasswd-encryption</span> md5</span></code></pre></div>
|
||||||
<p>Add the argument <code>--config ""</code> to stop Radicale from
|
<p>Add the argument <code>--config ""</code> to stop Radicale from
|
||||||
loading the default configuration files. Run
|
loading the default configuration files. Run
|
||||||
<code>python3 -m radicale --help</code> for more information.</p>
|
<code>python3 -m radicale --help</code> for more information.</p>
|
||||||
|
@ -877,8 +839,6 @@ server.</p>
|
||||||
<p><code>http_x_remote_user</code> : Takes the username from the
|
<p><code>http_x_remote_user</code> : Takes the username from the
|
||||||
<code>X-Remote-User</code> HTTP header and disables HTTP authentication.
|
<code>X-Remote-User</code> HTTP header and disables HTTP authentication.
|
||||||
This can be used to provide the username from a reverse proxy.</p>
|
This can be used to provide the username from a reverse proxy.</p>
|
||||||
<p><code>ldap</code> : Use a LDAP or AD server to authenticate
|
|
||||||
users.</p>
|
|
||||||
<p>Default: <code>none</code></p>
|
<p>Default: <code>none</code></p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="htpasswd_filename">
|
<section class="level5" id="htpasswd_filename">
|
||||||
|
@ -898,16 +858,10 @@ and looks like:</p>
|
||||||
user2:password2</code></pre>
|
user2:password2</code></pre>
|
||||||
<p><code>bcrypt</code> : This uses a modified version of the Blowfish
|
<p><code>bcrypt</code> : This uses a modified version of the Blowfish
|
||||||
stream cipher. It's very secure. The installation of
|
stream cipher. It's very secure. The installation of
|
||||||
<strong>bcrypt</strong> is required for this.</p>
|
<strong>radicale[bcrypt]</strong> is required for this.</p>
|
||||||
<p><code>md5</code> : This uses an iterated MD5 digest of the password
|
<p><code>md5</code> : This uses an iterated md5 digest of the password
|
||||||
with a salt (nowadays insecure).</p>
|
with a salt.</p>
|
||||||
<p><code>sha256</code> : This uses an iterated SHA-256 digest of the
|
<p>Default: <code>md5</code></p>
|
||||||
password with a salt.</p>
|
|
||||||
<p><code>sha512</code> : This uses an iterated SHA-512 digest of the
|
|
||||||
password with a salt.</p>
|
|
||||||
<p><code>autodetect</code> : This selects autodetection of method per
|
|
||||||
entry.</p>
|
|
||||||
<p>Default: <code>autodetect</code></p>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="delay">
|
<section class="level5" id="delay">
|
||||||
<h5>delay <a class="headerlink" href="#delay">¶</a></h5>
|
<h5>delay <a class="headerlink" href="#delay">¶</a></h5>
|
||||||
|
@ -919,78 +873,6 @@ entry.</p>
|
||||||
<p>Message displayed in the client when a password is needed.</p>
|
<p>Message displayed in the client when a password is needed.</p>
|
||||||
<p>Default: <code>Radicale - Password Required</code></p>
|
<p>Default: <code>Radicale - Password Required</code></p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="ldap_uri">
|
|
||||||
<h5>ldap_uri <a class="headerlink" href="#ldap_uri">¶</a></h5>
|
|
||||||
<p>The URI to the ldap server</p>
|
|
||||||
<p>Default: <code>ldap://localhost</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_base">
|
|
||||||
<h5>ldap_base <a class="headerlink" href="#ldap_base">¶</a></h5>
|
|
||||||
<p>LDAP base DN of the ldap server. This parameter must be provided if
|
|
||||||
auth type is ldap.</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_reader_dn">
|
|
||||||
<h5>ldap_reader_dn <a class="headerlink" href="#ldap_reader_dn">¶</a></h5>
|
|
||||||
<p>The DN of a ldap user with read access to get the user accounts. This
|
|
||||||
parameter must be provided if auth type is ldap.</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_secret">
|
|
||||||
<h5>ldap_secret <a class="headerlink" href="#ldap_secret">¶</a></h5>
|
|
||||||
<p>The password of the ldap_reader_dn. This parameter must be provided
|
|
||||||
if auth type is ldap.</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_filter">
|
|
||||||
<h5>ldap_filter <a class="headerlink" href="#ldap_filter">¶</a></h5>
|
|
||||||
<p>The search filter to find the user DN to authenticate by the
|
|
||||||
username. User '{0}' as placeholder for the user name.</p>
|
|
||||||
<p>Default: <code>(cn={0})</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_load_groups">
|
|
||||||
<h5>ldap_load_groups <a class="headerlink" href="#ldap_load_groups">¶</a></h5>
|
|
||||||
<p>Load the ldap groups of the authenticated user. These groups can be
|
|
||||||
used later on to define rights. This also gives you access to the group
|
|
||||||
calendars, if they exist.</p>
|
|
||||||
<ul>
|
|
||||||
<li>The group calendar will be placed under
|
|
||||||
collection_root_folder/GROUPS</li>
|
|
||||||
<li>The name of the calendar directory is the base64 encoded group
|
|
||||||
name.</li>
|
|
||||||
<li>The group calneder folders will not be created automaticaly. This
|
|
||||||
must be created manualy. <a href="https://github.com/Kozea/Radicale/wiki/LDAP-authentication">Here</a>
|
|
||||||
you can find a script to create group calneder folders <a href="https://github.com/Kozea/Radicale/wiki/LDAP-authentication">https://github.com/Kozea/Radicale/wiki/LDAP-authentication</a></li>
|
|
||||||
</ul>
|
|
||||||
<p>Default: False</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_use_ssl">
|
|
||||||
<h5>ldap_use_ssl <a class="headerlink" href="#ldap_use_ssl">¶</a></h5>
|
|
||||||
<p>Use ssl on the ldap connection</p>
|
|
||||||
<p>Default: False</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_ssl_verify_mode">
|
|
||||||
<h5>ldap_ssl_verify_mode <a class="headerlink" href="#ldap_ssl_verify_mode">¶</a></h5>
|
|
||||||
<p>The certifikat verification mode. NONE, OPTIONAL or REQUIRED</p>
|
|
||||||
<p>Default: REQUIRED</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="ldap_ssl_ca_file">
|
|
||||||
<h5>ldap_ssl_ca_file <a class="headerlink" href="#ldap_ssl_ca_file">¶</a></h5>
|
|
||||||
<p>The path to the CA file in pem format which is used to certificate
|
|
||||||
the server certificate</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="lc_username">
|
|
||||||
<h5>lc_username <a class="headerlink" href="#lc_username">¶</a></h5>
|
|
||||||
<p>Сonvert username to lowercase, must be true for case-insensitive auth
|
|
||||||
providers like ldap, kerberos</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="strip_domain">
|
|
||||||
<h5>strip_domain <a class="headerlink" href="#strip_domain">¶</a></h5>
|
|
||||||
<p>Strip domain from username</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="rights">
|
<section class="level4" id="rights">
|
||||||
<h4>rights <a class="headerlink" href="#rights">¶</a></h4>
|
<h4>rights <a class="headerlink" href="#rights">¶</a></h4>
|
||||||
|
@ -1018,22 +900,6 @@ and write their own collections under the path <em>/USERNAME/</em>.</p>
|
||||||
<h5>file <a class="headerlink" href="#file">¶</a></h5>
|
<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> section.</p>
|
<p>File for the rights backend <code>from_file</code>. See the <a href="#authentication-and-rights">Rights</a> section.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="permit_delete_collection">
|
|
||||||
<h5>permit_delete_collection <a class="headerlink" href="#permit_delete_collection">¶</a></h5>
|
|
||||||
<p>(New since 3.1.9)</p>
|
|
||||||
<p>Global control of permission to delete complete collection (default:
|
|
||||||
True)</p>
|
|
||||||
<p>If False it can be permitted by permissions per section with: D If
|
|
||||||
True it can be forbidden by permissions per section with: d</p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="permit_overwrite_collection">
|
|
||||||
<h5>permit_overwrite_collection <a class="headerlink" href="#permit_overwrite_collection">¶</a></h5>
|
|
||||||
<p>(New since 3.3.0)</p>
|
|
||||||
<p>Global control of permission to overwrite complete collection
|
|
||||||
(default: True)</p>
|
|
||||||
<p>If False it can be permitted by permissions per section with: O If
|
|
||||||
True it can be forbidden by permissions per section with: o</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="storage-1">
|
<section class="level4" id="storage-1">
|
||||||
<h4>storage <a class="headerlink" href="#storage-1">¶</a></h4>
|
<h4>storage <a class="headerlink" href="#storage-1">¶</a></h4>
|
||||||
|
@ -1058,34 +924,12 @@ only be used with a single process.</p>
|
||||||
(seconds)</p>
|
(seconds)</p>
|
||||||
<p>Default: <code>2592000</code></p>
|
<p>Default: <code>2592000</code></p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="skip_broken_item">
|
|
||||||
<h5>skip_broken_item <a class="headerlink" href="#skip_broken_item">¶</a></h5>
|
|
||||||
<p>Skip broken item instead of triggering an exception</p>
|
|
||||||
<p>Default: <code>True</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="hook">
|
<section class="level5" id="hook">
|
||||||
<h5>hook <a class="headerlink" href="#hook">¶</a></h5>
|
<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-with-git">Versioning with Git</a> tutorial for an
|
<p>Command that is run after changes to storage. Take a look at the <a href="#versioning-with-git">Versioning with Git</a> tutorial for an
|
||||||
example.</p>
|
example.</p>
|
||||||
<p>Default:</p>
|
<p>Default:</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="predefined_collections">
|
|
||||||
<h5>predefined_collections <a class="headerlink" href="#predefined_collections">¶</a></h5>
|
|
||||||
<p>Create predefined user collections</p>
|
|
||||||
<p>Example:</p>
|
|
||||||
<pre><code> {
|
|
||||||
"def-addressbook": {
|
|
||||||
"D:displayname": "Personal Address Book",
|
|
||||||
"tag": "VADDRESSBOOK"
|
|
||||||
},
|
|
||||||
"def-calendar": {
|
|
||||||
"C:supported-calendar-component-set": "VEVENT,VJOURNAL,VTODO",
|
|
||||||
"D:displayname": "Personal Calendar",
|
|
||||||
"tag": "VCALENDAR"
|
|
||||||
}
|
|
||||||
}</code></pre>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="web">
|
<section class="level4" id="web">
|
||||||
<h4>web <a class="headerlink" href="#web">¶</a></h4>
|
<h4>web <a class="headerlink" href="#web">¶</a></h4>
|
||||||
|
@ -1114,88 +958,17 @@ books and calendars.</p>
|
||||||
<p>Don't include passwords in logs.</p>
|
<p>Don't include passwords in logs.</p>
|
||||||
<p>Default: <code>True</code></p>
|
<p>Default: <code>True</code></p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level5" id="bad_put_request_content">
|
|
||||||
<h5>bad_put_request_content <a class="headerlink" href="#bad_put_request_content">¶</a></h5>
|
|
||||||
<p>Log bad PUT request content (for further diagnostics)</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="backtrace_on_debug">
|
|
||||||
<h5>backtrace_on_debug <a class="headerlink" href="#backtrace_on_debug">¶</a></h5>
|
|
||||||
<p>Log backtrace on level=debug</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="request_header_on_debug">
|
|
||||||
<h5>request_header_on_debug <a class="headerlink" href="#request_header_on_debug">¶</a></h5>
|
|
||||||
<p>Log request on level=debug</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="request_content_on_debug">
|
|
||||||
<h5>request_content_on_debug <a class="headerlink" href="#request_content_on_debug">¶</a></h5>
|
|
||||||
<p>Log request on level=debug</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="response_content_on_debug--true">
|
|
||||||
<h5>response_content_on_debug = True <a class="headerlink" href="#response_content_on_debug--true">¶</a></h5>
|
|
||||||
<p>Log response on level=debug</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
<section class="level5" id="rights_rule_doesnt_match_on_debug--true">
|
|
||||||
<h5>rights_rule_doesnt_match_on_debug = True <a class="headerlink" href="#rights_rule_doesnt_match_on_debug--true">¶</a></h5>
|
|
||||||
<p>Log rights rule which doesn't match on level=debug</p>
|
|
||||||
<p>Default: <code>False</code></p>
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="headers">
|
<section class="level4" id="headers">
|
||||||
<h4>headers <a class="headerlink" href="#headers">¶</a></h4>
|
<h4>headers <a class="headerlink" href="#headers">¶</a></h4>
|
||||||
<p>In this section additional HTTP headers that are sent to clients can
|
<p>In this section additional HTTP headers that are sent to clients can
|
||||||
be specified.</p>
|
be specified.</p>
|
||||||
<p>An example to relax the same-origin policy:</p>
|
<p>An example to relax the same-origin policy:</p>
|
||||||
<div class="sourceCode" id="cb37"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb37-1"><a aria-hidden="true" href="#cb37-1" tabindex="-1"></a><span class="dt">Access-Control-Allow-Origin </span><span class="ot">=</span><span class="st"> *</span></span></code></pre></div>
|
<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="dt">Access-Control-Allow-Origin </span><span class="ot">=</span><span class="st"> *</span></span></code></pre></div>
|
||||||
</section>
|
|
||||||
<section class="level4" id="hook-1">
|
|
||||||
<h4>hook <a class="headerlink" href="#hook-1">¶</a></h4>
|
|
||||||
<section class="level5" id="type-4">
|
|
||||||
<h5>type <a class="headerlink" href="#type-4">¶</a></h5>
|
|
||||||
<p>Hook binding for event changes and deletion notifications.</p>
|
|
||||||
<p>Available types:</p>
|
|
||||||
<p><code>none</code> : Disabled. Nothing will be notified.</p>
|
|
||||||
<p><code>rabbitmq</code> : Push the message to the rabbitmq server.</p>
|
|
||||||
<p>Default: <code>none</code></p>
|
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="rabbitmq_endpoint">
|
<section class="level3" id="supported-clients">
|
||||||
<h4>rabbitmq_endpoint <a class="headerlink" href="#rabbitmq_endpoint">¶</a></h4>
|
<h3>Supported Clients <a class="headerlink" href="#supported-clients">¶</a></h3>
|
||||||
<p>End-point address for rabbitmq server. Ex:
|
|
||||||
amqp://user:password@localhost:5672/</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level4" id="rabbitmq_topic">
|
|
||||||
<h4>rabbitmq_topic <a class="headerlink" href="#rabbitmq_topic">¶</a></h4>
|
|
||||||
<p>RabbitMQ topic to publish message.</p>
|
|
||||||
<p>Default:</p>
|
|
||||||
</section>
|
|
||||||
<section class="level4" id="rabbitmq_queue_type">
|
|
||||||
<h4>rabbitmq_queue_type <a class="headerlink" href="#rabbitmq_queue_type">¶</a></h4>
|
|
||||||
<p>RabbitMQ queue type for the topic.</p>
|
|
||||||
<p>Default: classic</p>
|
|
||||||
</section>
|
|
||||||
<section class="level4" id="reporting">
|
|
||||||
<h4>reporting <a class="headerlink" href="#reporting">¶</a></h4>
|
|
||||||
<section class="level5" id="max_freebusy_occurrence">
|
|
||||||
<h5>max_freebusy_occurrence <a class="headerlink" href="#max_freebusy_occurrence">¶</a></h5>
|
|
||||||
<p>When returning a free-busy report, a list of busy time occurrences
|
|
||||||
are generated based on a given time frame. Large time frames could
|
|
||||||
generate a lot of occurrences based on the time frame supplied. This
|
|
||||||
setting limits the lookup to prevent potential denial of service attacks
|
|
||||||
on large time frames. If the limit is reached, an HTTP error is thrown
|
|
||||||
instead of returning the results.</p>
|
|
||||||
<p>Default: 10000</p>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
</section>
|
|
||||||
<section class="level2" id="supported-clients">
|
|
||||||
<h2>Supported Clients <a class="headerlink" href="#supported-clients">¶</a></h2>
|
|
||||||
<p>Radicale has been tested with:</p>
|
<p>Radicale has been tested with:</p>
|
||||||
<ul>
|
<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://android.com/">Android</a> with <a href="https://www.davx5.com/">DAVx⁵</a> (formerly DAVdroid)</li>
|
||||||
|
@ -1221,25 +994,15 @@ you have to enter the URL of the collection directly (e.g.
|
||||||
<code>http://localhost:5232</code>) and your username. DAVx⁵ will show
|
<code>http://localhost:5232</code>) and your username. DAVx⁵ will show
|
||||||
all existing calendars and address books and you can create new.</p>
|
all existing calendars and address books and you can create new.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="gnome-calendar-contacts">
|
<section class="level4" id="gnome-calendar-contacts-and-evolution">
|
||||||
<h4>GNOME Calendar, Contacts <a class="headerlink" href="#gnome-calendar-contacts">¶</a></h4>
|
<h4>GNOME Calendar, Contacts and Evolution <a class="headerlink" href="#gnome-calendar-contacts-and-evolution">¶</a></h4>
|
||||||
<p>GNOME 46 added CalDAV and CardDAV support to <em>GNOME Online
|
<p><strong>GNOME Calendar</strong> and <strong>Contacts</strong> do not
|
||||||
Accounts</em>.</p>
|
support adding WebDAV calendars and address books directly, but you can
|
||||||
<p>Open GNOME Settings, navigate to <em>Online Accounts</em> >
|
add them in <strong>Evolution</strong>.</p>
|
||||||
<em>Connect an Account</em> > <em>Calendar, Contacts and Files</em>.
|
|
||||||
Enter the URL (e.g. <code>https://example.com/radicale</code>) and your
|
|
||||||
credentials then click <em>Sign In</em>. In the pop-up dialog, turn off
|
|
||||||
<em>Files</em>. After adding Radicale in <em>GNOME Online Accounts</em>,
|
|
||||||
it should be available in GNOME Contacts and GNOME Calendar.</p>
|
|
||||||
</section>
|
|
||||||
<section class="level4" id="evolution">
|
|
||||||
<h4>Evolution <a class="headerlink" href="#evolution">¶</a></h4>
|
|
||||||
<p>In <strong>Evolution</strong> add a new calendar and address book
|
<p>In <strong>Evolution</strong> add a new calendar and address book
|
||||||
respectively with WebDAV. Enter the URL of the Radicale server (e.g.
|
respectively with WebDAV. Enter the URL of the Radicale server (e.g.
|
||||||
<code>http://localhost:5232</code>) and your username. Clicking on the
|
<code>http://localhost:5232</code>) and your username. Clicking on the
|
||||||
search button will list the existing calendars and address books.</p>
|
search button will list the existing calendars and address books.</p>
|
||||||
<p>Adding CalDAV and CardDAV accounts in Evolution will automatically
|
|
||||||
make them available in GNOME Contacts and GNOME Calendar.</p>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="thunderbird">
|
<section class="level4" id="thunderbird">
|
||||||
<h4>Thunderbird <a class="headerlink" href="#thunderbird">¶</a></h4>
|
<h4>Thunderbird <a class="headerlink" href="#thunderbird">¶</a></h4>
|
||||||
|
@ -1271,49 +1034,48 @@ documentation of <strong>InfCloud</strong> has more details on this.</p>
|
||||||
calendars and address books. Use Radicale's web interface or a client
|
calendars and address books. Use Radicale's web interface or a client
|
||||||
with support for it (e.g. <strong>DAVx⁵</strong>).</p>
|
with support for it (e.g. <strong>DAVx⁵</strong>).</p>
|
||||||
<p>To create a new calendar run something like:</p>
|
<p>To create a new calendar run something like:</p>
|
||||||
<div class="sourceCode" id="cb38"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb38-1"><a aria-hidden="true" href="#cb38-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>
|
<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">$</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="cb38-2"><a aria-hidden="true" href="#cb38-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
<span id="cb33-2"><a aria-hidden="true" href="#cb33-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
||||||
<span id="cb38-3"><a aria-hidden="true" href="#cb38-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="cb33-3"><a aria-hidden="true" href="#cb33-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="cb38-4"><a aria-hidden="true" href="#cb38-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
<span id="cb33-4"><a aria-hidden="true" href="#cb33-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
||||||
<span id="cb38-5"><a aria-hidden="true" href="#cb38-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
<span id="cb33-5"><a aria-hidden="true" href="#cb33-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
||||||
<span id="cb38-6"><a aria-hidden="true" href="#cb38-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
<span id="cb33-6"><a aria-hidden="true" href="#cb33-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
||||||
<span id="cb38-7"><a aria-hidden="true" href="#cb38-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
<span id="cb33-7"><a aria-hidden="true" href="#cb33-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
||||||
<span id="cb38-8"><a aria-hidden="true" href="#cb38-8" tabindex="-1"></a><span class="st"> <C:calendar /></span></span>
|
<span id="cb33-8"><a aria-hidden="true" href="#cb33-8" tabindex="-1"></a><span class="st"> <C:calendar /></span></span>
|
||||||
<span id="cb38-9"><a aria-hidden="true" href="#cb38-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
<span id="cb33-9"><a aria-hidden="true" href="#cb33-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
||||||
<span id="cb38-10"><a aria-hidden="true" href="#cb38-10" tabindex="-1"></a><span class="st"> <C:supported-calendar-component-set></span></span>
|
<span id="cb33-10"><a aria-hidden="true" href="#cb33-10" tabindex="-1"></a><span class="st"> <C:supported-calendar-component-set></span></span>
|
||||||
<span id="cb38-11"><a aria-hidden="true" href="#cb38-11" tabindex="-1"></a><span class="st"> <C:comp name="VEVENT" /></span></span>
|
<span id="cb33-11"><a aria-hidden="true" href="#cb33-11" tabindex="-1"></a><span class="st"> <C:comp name="VEVENT" /></span></span>
|
||||||
<span id="cb38-12"><a aria-hidden="true" href="#cb38-12" tabindex="-1"></a><span class="st"> <C:comp name="VJOURNAL" /></span></span>
|
<span id="cb33-12"><a aria-hidden="true" href="#cb33-12" tabindex="-1"></a><span class="st"> <C:comp name="VJOURNAL" /></span></span>
|
||||||
<span id="cb38-13"><a aria-hidden="true" href="#cb38-13" tabindex="-1"></a><span class="st"> <C:comp name="VTODO" /></span></span>
|
<span id="cb33-13"><a aria-hidden="true" href="#cb33-13" tabindex="-1"></a><span class="st"> <C:comp name="VTODO" /></span></span>
|
||||||
<span id="cb38-14"><a aria-hidden="true" href="#cb38-14" tabindex="-1"></a><span class="st"> </C:supported-calendar-component-set></span></span>
|
<span id="cb33-14"><a aria-hidden="true" href="#cb33-14" tabindex="-1"></a><span class="st"> </C:supported-calendar-component-set></span></span>
|
||||||
<span id="cb38-15"><a aria-hidden="true" href="#cb38-15" tabindex="-1"></a><span class="st"> <displayname>Calendar</displayname></span></span>
|
<span id="cb33-15"><a aria-hidden="true" href="#cb33-15" tabindex="-1"></a><span class="st"> <displayname>Calendar</displayname></span></span>
|
||||||
<span id="cb38-16"><a aria-hidden="true" href="#cb38-16" tabindex="-1"></a><span class="st"> <C:calendar-description>Example calendar</C:calendar-description></span></span>
|
<span id="cb33-16"><a aria-hidden="true" href="#cb33-16" tabindex="-1"></a><span class="st"> <C:calendar-description>Example calendar</C:calendar-description></span></span>
|
||||||
<span id="cb38-17"><a aria-hidden="true" href="#cb38-17" tabindex="-1"></a><span class="st"> <I:calendar-color>#ff0000ff</I:calendar-color></span></span>
|
<span id="cb33-17"><a aria-hidden="true" href="#cb33-17" tabindex="-1"></a><span class="st"> <I:calendar-color>#ff0000ff</I:calendar-color></span></span>
|
||||||
<span id="cb38-18"><a aria-hidden="true" href="#cb38-18" tabindex="-1"></a><span class="st"> </prop></span></span>
|
<span id="cb33-18"><a aria-hidden="true" href="#cb33-18" tabindex="-1"></a><span class="st"> </prop></span></span>
|
||||||
<span id="cb38-19"><a aria-hidden="true" href="#cb38-19" tabindex="-1"></a><span class="st"> </set></span></span>
|
<span id="cb33-19"><a aria-hidden="true" href="#cb33-19" tabindex="-1"></a><span class="st"> </set></span></span>
|
||||||
<span id="cb38-20"><a aria-hidden="true" href="#cb38-20" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
<span id="cb33-20"><a aria-hidden="true" href="#cb33-20" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
||||||
<p>To create a new address book run something like:</p>
|
<p>To create a new address book run something like:</p>
|
||||||
<div class="sourceCode" id="cb39"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb39-1"><a aria-hidden="true" href="#cb39-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>
|
<div class="sourceCode" id="cb34"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb34-1"><a aria-hidden="true" href="#cb34-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="cb39-2"><a aria-hidden="true" href="#cb39-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
<span id="cb34-2"><a aria-hidden="true" href="#cb34-2" tabindex="-1"></a><span class="st">'<?xml version="1.0" encoding="UTF-8" ?></span></span>
|
||||||
<span id="cb39-3"><a aria-hidden="true" href="#cb39-3" tabindex="-1"></a><span class="st"><create xmlns="DAV:" xmlns:CR="urn:ietf:params:xml:ns:carddav"></span></span>
|
<span id="cb34-3"><a aria-hidden="true" href="#cb34-3" tabindex="-1"></a><span class="st"><create xmlns="DAV:" xmlns:CR="urn:ietf:params:xml:ns:carddav"></span></span>
|
||||||
<span id="cb39-4"><a aria-hidden="true" href="#cb39-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
<span id="cb34-4"><a aria-hidden="true" href="#cb34-4" tabindex="-1"></a><span class="st"> <set></span></span>
|
||||||
<span id="cb39-5"><a aria-hidden="true" href="#cb39-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
<span id="cb34-5"><a aria-hidden="true" href="#cb34-5" tabindex="-1"></a><span class="st"> <prop></span></span>
|
||||||
<span id="cb39-6"><a aria-hidden="true" href="#cb39-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
<span id="cb34-6"><a aria-hidden="true" href="#cb34-6" tabindex="-1"></a><span class="st"> <resourcetype></span></span>
|
||||||
<span id="cb39-7"><a aria-hidden="true" href="#cb39-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
<span id="cb34-7"><a aria-hidden="true" href="#cb34-7" tabindex="-1"></a><span class="st"> <collection /></span></span>
|
||||||
<span id="cb39-8"><a aria-hidden="true" href="#cb39-8" tabindex="-1"></a><span class="st"> <CR:addressbook /></span></span>
|
<span id="cb34-8"><a aria-hidden="true" href="#cb34-8" tabindex="-1"></a><span class="st"> <CR:addressbook /></span></span>
|
||||||
<span id="cb39-9"><a aria-hidden="true" href="#cb39-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
<span id="cb34-9"><a aria-hidden="true" href="#cb34-9" tabindex="-1"></a><span class="st"> </resourcetype></span></span>
|
||||||
<span id="cb39-10"><a aria-hidden="true" href="#cb39-10" tabindex="-1"></a><span class="st"> <displayname>Address book</displayname></span></span>
|
<span id="cb34-10"><a aria-hidden="true" href="#cb34-10" tabindex="-1"></a><span class="st"> <displayname>Address book</displayname></span></span>
|
||||||
<span id="cb39-11"><a aria-hidden="true" href="#cb39-11" tabindex="-1"></a><span class="st"> <CR:addressbook-description>Example address book</CR:addressbook-description></span></span>
|
<span id="cb34-11"><a aria-hidden="true" href="#cb34-11" tabindex="-1"></a><span class="st"> <CR:addressbook-description>Example address book</CR:addressbook-description></span></span>
|
||||||
<span id="cb39-12"><a aria-hidden="true" href="#cb39-12" tabindex="-1"></a><span class="st"> </prop></span></span>
|
<span id="cb34-12"><a aria-hidden="true" href="#cb34-12" tabindex="-1"></a><span class="st"> </prop></span></span>
|
||||||
<span id="cb39-13"><a aria-hidden="true" href="#cb39-13" tabindex="-1"></a><span class="st"> </set></span></span>
|
<span id="cb34-13"><a aria-hidden="true" href="#cb34-13" tabindex="-1"></a><span class="st"> </set></span></span>
|
||||||
<span id="cb39-14"><a aria-hidden="true" href="#cb39-14" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
<span id="cb34-14"><a aria-hidden="true" href="#cb34-14" tabindex="-1"></a><span class="st"></create>'</span></span></code></pre></div>
|
||||||
<p>The collection <code>/USERNAME</code> will be created automatically,
|
<p>The collection <code>/USERNAME</code> will be created automatically,
|
||||||
when the user authenticates to Radicale for the first time. Clients with
|
when the user authenticates to Radicale for the first time. Clients with
|
||||||
automatic discovery of collections will only show calendars and address
|
automatic discovery of collections will only show calendars and address
|
||||||
books that are direct children of the path <code>/USERNAME/</code>.</p>
|
books that are direct children of the path <code>/USERNAME/</code>.</p>
|
||||||
<p>Delete the collections by running something like:</p>
|
<p>Delete the collections by running something like:</p>
|
||||||
<div class="sourceCode" id="cb40"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb40-1"><a aria-hidden="true" href="#cb40-1" tabindex="-1"></a><span class="ex">curl</span> <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>
|
<div class="sourceCode" id="cb35"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb35-1"><a aria-hidden="true" href="#cb35-1" tabindex="-1"></a><span class="ex">curl</span> <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>
|
||||||
<p>Note: requires config/option
|
</section>
|
||||||
<code>permit_delete_collection = True</code></p>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="level3" id="authentication-and-rights">
|
<section class="level3" id="authentication-and-rights">
|
||||||
<h3>Authentication and Rights <a class="headerlink" href="#authentication-and-rights">¶</a></h3>
|
<h3>Authentication and Rights <a class="headerlink" href="#authentication-and-rights">¶</a></h3>
|
||||||
|
@ -1327,24 +1089,24 @@ to calendars and address books outside the home directory of users
|
||||||
collections and will not show them to the user. This is only useful if
|
collections and will not show them to the user. This is only useful if
|
||||||
you access calendars and address books directly via URL.</p>
|
you access calendars and address books directly via URL.</p>
|
||||||
<p>An example rights file:</p>
|
<p>An example rights file:</p>
|
||||||
<div class="sourceCode" id="cb41"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb41-1"><a aria-hidden="true" href="#cb41-1" tabindex="-1"></a><span class="co"># Allow reading root collection for authenticated users</span></span>
|
<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"># Allow reading root collection for authenticated users</span></span>
|
||||||
<span id="cb41-2"><a aria-hidden="true" href="#cb41-2" tabindex="-1"></a><span class="kw">[root]</span></span>
|
<span id="cb36-2"><a aria-hidden="true" href="#cb36-2" tabindex="-1"></a><span class="kw">[root]</span></span>
|
||||||
<span id="cb41-3"><a aria-hidden="true" href="#cb41-3" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
<span id="cb36-3"><a aria-hidden="true" href="#cb36-3" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
||||||
<span id="cb41-4"><a aria-hidden="true" href="#cb41-4" tabindex="-1"></a><span class="dt">collection:</span></span>
|
<span id="cb36-4"><a aria-hidden="true" href="#cb36-4" tabindex="-1"></a><span class="dt">collection:</span></span>
|
||||||
<span id="cb41-5"><a aria-hidden="true" href="#cb41-5" tabindex="-1"></a><span class="dt">permissions: r</span></span>
|
<span id="cb36-5"><a aria-hidden="true" href="#cb36-5" tabindex="-1"></a><span class="dt">permissions: r</span></span>
|
||||||
<span id="cb41-6"><a aria-hidden="true" href="#cb41-6" tabindex="-1"></a></span>
|
<span id="cb36-6"><a aria-hidden="true" href="#cb36-6" tabindex="-1"></a></span>
|
||||||
<span id="cb41-7"><a aria-hidden="true" href="#cb41-7" tabindex="-1"></a><span class="co"># Allow reading and writing principal collection (same as username)</span></span>
|
<span id="cb36-7"><a aria-hidden="true" href="#cb36-7" tabindex="-1"></a><span class="co"># Allow reading and writing principal collection (same as username)</span></span>
|
||||||
<span id="cb41-8"><a aria-hidden="true" href="#cb41-8" tabindex="-1"></a><span class="kw">[principal]</span></span>
|
<span id="cb36-8"><a aria-hidden="true" href="#cb36-8" tabindex="-1"></a><span class="kw">[principal]</span></span>
|
||||||
<span id="cb41-9"><a aria-hidden="true" href="#cb41-9" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
<span id="cb36-9"><a aria-hidden="true" href="#cb36-9" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
||||||
<span id="cb41-10"><a aria-hidden="true" href="#cb41-10" tabindex="-1"></a><span class="dt">collection: {user}</span></span>
|
<span id="cb36-10"><a aria-hidden="true" href="#cb36-10" tabindex="-1"></a><span class="dt">collection: {user}</span></span>
|
||||||
<span id="cb41-11"><a aria-hidden="true" href="#cb41-11" tabindex="-1"></a><span class="dt">permissions: RW</span></span>
|
<span id="cb36-11"><a aria-hidden="true" href="#cb36-11" tabindex="-1"></a><span class="dt">permissions: RW</span></span>
|
||||||
<span id="cb41-12"><a aria-hidden="true" href="#cb41-12" tabindex="-1"></a></span>
|
<span id="cb36-12"><a aria-hidden="true" href="#cb36-12" tabindex="-1"></a></span>
|
||||||
<span id="cb41-13"><a aria-hidden="true" href="#cb41-13" tabindex="-1"></a><span class="co"># Allow reading and writing calendars and address books that are direct</span></span>
|
<span id="cb36-13"><a aria-hidden="true" href="#cb36-13" tabindex="-1"></a><span class="co"># Allow reading and writing calendars and address books that are direct</span></span>
|
||||||
<span id="cb41-14"><a aria-hidden="true" href="#cb41-14" tabindex="-1"></a><span class="co"># children of the principal collection</span></span>
|
<span id="cb36-14"><a aria-hidden="true" href="#cb36-14" tabindex="-1"></a><span class="co"># children of the principal collection</span></span>
|
||||||
<span id="cb41-15"><a aria-hidden="true" href="#cb41-15" tabindex="-1"></a><span class="kw">[calendars]</span></span>
|
<span id="cb36-15"><a aria-hidden="true" href="#cb36-15" tabindex="-1"></a><span class="kw">[calendars]</span></span>
|
||||||
<span id="cb41-16"><a aria-hidden="true" href="#cb41-16" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
<span id="cb36-16"><a aria-hidden="true" href="#cb36-16" tabindex="-1"></a><span class="dt">user: .+</span></span>
|
||||||
<span id="cb41-17"><a aria-hidden="true" href="#cb41-17" tabindex="-1"></a><span class="dt">collection: {user}/</span><span class="kw">[^/]</span><span class="dt">+</span></span>
|
<span id="cb36-17"><a aria-hidden="true" href="#cb36-17" tabindex="-1"></a><span class="dt">collection: {user}/</span><span class="kw">[^/]</span><span class="dt">+</span></span>
|
||||||
<span id="cb41-18"><a aria-hidden="true" href="#cb41-18" tabindex="-1"></a><span class="dt">permissions: rw</span></span></code></pre></div>
|
<span id="cb36-18"><a aria-hidden="true" href="#cb36-18" tabindex="-1"></a><span class="dt">permissions: rw</span></span></code></pre></div>
|
||||||
<p>The titles of the sections are ignored (but must be unique). The keys
|
<p>The titles of the sections are ignored (but must be unique). The keys
|
||||||
<code>user</code> and <code>collection</code> contain regular
|
<code>user</code> and <code>collection</code> contain regular
|
||||||
expressions, that are matched against the username and the path of the
|
expressions, that are matched against the username and the path of the
|
||||||
|
@ -1373,14 +1135,6 @@ expensive search requests)</li>
|
||||||
<li><strong>W:</strong> write collections (excluding address books and
|
<li><strong>W:</strong> write collections (excluding address books and
|
||||||
calendars)</li>
|
calendars)</li>
|
||||||
<li><strong>w:</strong> write address book and calendar collections</li>
|
<li><strong>w:</strong> write address book and calendar collections</li>
|
||||||
<li><strong>D:</strong> permit delete of collection in case
|
|
||||||
permit_delete_collection=False</li>
|
|
||||||
<li><strong>d:</strong> forbid delete of collection in case
|
|
||||||
permit_delete_collection=True</li>
|
|
||||||
<li><strong>O:</strong> permit overwrite of collection in case
|
|
||||||
permit_overwrite_collection=False</li>
|
|
||||||
<li><strong>o:</strong> forbid overwrite of collection in case
|
|
||||||
permit_overwrite_collection=True</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section class="level3" id="storage-2">
|
<section class="level3" id="storage-2">
|
||||||
|
@ -1431,10 +1185,10 @@ system. The storage is locked with exclusive access while the
|
||||||
<h5>Linux shell scripts <a class="headerlink" href="#linux-shell-scripts">¶</a></h5>
|
<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>
|
<p>Use the <a href="https://manpages.debian.org/unstable/util-linux/flock.1.en.html">flock</a>
|
||||||
utility.</p>
|
utility.</p>
|
||||||
<div class="sourceCode" id="cb42"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb42-1"><a aria-hidden="true" href="#cb42-1" tabindex="-1"></a><span class="co"># Exclusive</span></span>
|
<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="cb42-2"><a aria-hidden="true" href="#cb42-2" tabindex="-1"></a><span class="ex">$</span> flock <span class="at">--exclusive</span> /path/to/storage/.Radicale.lock COMMAND</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="cb42-3"><a aria-hidden="true" href="#cb42-3" tabindex="-1"></a><span class="co"># Shared</span></span>
|
<span id="cb37-3"><a aria-hidden="true" href="#cb37-3" tabindex="-1"></a><span class="co"># Shared</span></span>
|
||||||
<span id="cb42-4"><a aria-hidden="true" href="#cb42-4" tabindex="-1"></a><span class="ex">$</span> flock <span class="at">--shared</span> /path/to/storage/.Radicale.lock COMMAND</span></code></pre></div>
|
<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>
|
||||||
<section class="level5" id="linux-and-macos">
|
<section class="level5" id="linux-and-macos">
|
||||||
<h5>Linux and MacOS <a class="headerlink" href="#linux-and-macos">¶</a></h5>
|
<h5>Linux and MacOS <a class="headerlink" href="#linux-and-macos">¶</a></h5>
|
||||||
|
@ -1459,11 +1213,11 @@ folder in the file system storage (e.g.
|
||||||
clients that the collection is a calendar, you have to create the file
|
clients that the collection is a calendar, you have to create the file
|
||||||
<code>.Radicale.props</code> with the following content in the
|
<code>.Radicale.props</code> with the following content in the
|
||||||
folder:</p>
|
folder:</p>
|
||||||
<div class="sourceCode" id="cb43"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb43-1"><a aria-hidden="true" href="#cb43-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>
|
<div class="sourceCode" id="cb38"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb38-1"><a aria-hidden="true" href="#cb38-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
|
<p>The calendar is now available at the URL path
|
||||||
<code>/user/calendar</code>. For address books the file must
|
<code>/user/calendar</code>. For address books the file must
|
||||||
contain:</p>
|
contain:</p>
|
||||||
<div class="sourceCode" id="cb44"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb44-1"><a aria-hidden="true" href="#cb44-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>
|
<div class="sourceCode" id="cb39"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb39-1"><a aria-hidden="true" href="#cb39-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
|
<p>Calendar and address book collections must not have any child
|
||||||
collections. Clients with automatic discovery of collections will only
|
collections. Clients with automatic discovery of collections will only
|
||||||
show calendars and address books that are direct children of the path
|
show calendars and address books that are direct children of the path
|
||||||
|
@ -1594,49 +1348,49 @@ password.</p>
|
||||||
modules is <a href="https://docs.python.org/3/distutils/setupscript.html">Distutils</a>.
|
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
|
For a minimal setup create the file <code>setup.py</code> with the
|
||||||
following content in an empty folder:</p>
|
following content in an empty folder:</p>
|
||||||
<div class="sourceCode" id="cb45"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb45-1"><a aria-hidden="true" href="#cb45-1" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
|
<div class="sourceCode" id="cb40"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb40-1"><a aria-hidden="true" href="#cb40-1" tabindex="-1"></a><span class="co">#!/usr/bin/env python3</span></span>
|
||||||
<span id="cb45-2"><a aria-hidden="true" href="#cb45-2" tabindex="-1"></a></span>
|
<span id="cb40-2"><a aria-hidden="true" href="#cb40-2" tabindex="-1"></a></span>
|
||||||
<span id="cb45-3"><a aria-hidden="true" href="#cb45-3" tabindex="-1"></a><span class="im">from</span> distutils.core <span class="im">import</span> setup</span>
|
<span id="cb40-3"><a aria-hidden="true" href="#cb40-3" tabindex="-1"></a><span class="im">from</span> distutils.core <span class="im">import</span> setup</span>
|
||||||
<span id="cb45-4"><a aria-hidden="true" href="#cb45-4" tabindex="-1"></a></span>
|
<span id="cb40-4"><a aria-hidden="true" href="#cb40-4" tabindex="-1"></a></span>
|
||||||
<span id="cb45-5"><a aria-hidden="true" href="#cb45-5" tabindex="-1"></a>setup(name<span class="op">=</span><span class="st">"radicale_static_password_auth"</span>,</span>
|
<span id="cb40-5"><a aria-hidden="true" href="#cb40-5" tabindex="-1"></a>setup(name<span class="op">=</span><span class="st">"radicale_static_password_auth"</span>,</span>
|
||||||
<span id="cb45-6"><a aria-hidden="true" href="#cb45-6" tabindex="-1"></a> packages<span class="op">=</span>[<span class="st">"radicale_static_password_auth"</span>])</span></code></pre></div>
|
<span id="cb40-6"><a aria-hidden="true" href="#cb40-6" tabindex="-1"></a> packages<span class="op">=</span>[<span class="st">"radicale_static_password_auth"</span>])</span></code></pre></div>
|
||||||
<p>In the same folder create the sub-folder
|
<p>In the same folder create the sub-folder
|
||||||
<code>radicale_static_password_auth</code>. The folder must have the
|
<code>radicale_static_password_auth</code>. The folder must have the
|
||||||
same name as specified in <code>packages</code> above.</p>
|
same name as specified in <code>packages</code> above.</p>
|
||||||
<p>Create the file <code>__init__.py</code> in the
|
<p>Create the file <code>__init__.py</code> in the
|
||||||
<code>radicale_static_password_auth</code> folder with the following
|
<code>radicale_static_password_auth</code> folder with the following
|
||||||
content:</p>
|
content:</p>
|
||||||
<div class="sourceCode" id="cb46"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb46-1"><a aria-hidden="true" href="#cb46-1" tabindex="-1"></a><span class="im">from</span> radicale.auth <span class="im">import</span> BaseAuth</span>
|
<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="im">from</span> radicale.auth <span class="im">import</span> BaseAuth</span>
|
||||||
<span id="cb46-2"><a aria-hidden="true" href="#cb46-2" tabindex="-1"></a><span class="im">from</span> radicale.log <span class="im">import</span> logger</span>
|
<span id="cb41-2"><a aria-hidden="true" href="#cb41-2" tabindex="-1"></a><span class="im">from</span> radicale.log <span class="im">import</span> logger</span>
|
||||||
<span id="cb46-3"><a aria-hidden="true" href="#cb46-3" tabindex="-1"></a></span>
|
<span id="cb41-3"><a aria-hidden="true" href="#cb41-3" tabindex="-1"></a></span>
|
||||||
<span id="cb46-4"><a aria-hidden="true" href="#cb46-4" tabindex="-1"></a>PLUGIN_CONFIG_SCHEMA <span class="op">=</span> {<span class="st">"auth"</span>: {</span>
|
<span id="cb41-4"><a aria-hidden="true" href="#cb41-4" tabindex="-1"></a>PLUGIN_CONFIG_SCHEMA <span class="op">=</span> {<span class="st">"auth"</span>: {</span>
|
||||||
<span id="cb46-5"><a aria-hidden="true" href="#cb46-5" tabindex="-1"></a> <span class="st">"password"</span>: {<span class="st">"value"</span>: <span class="st">""</span>, <span class="st">"type"</span>: <span class="bu">str</span>}}}</span>
|
<span id="cb41-5"><a aria-hidden="true" href="#cb41-5" tabindex="-1"></a> <span class="st">"password"</span>: {<span class="st">"value"</span>: <span class="st">""</span>, <span class="st">"type"</span>: <span class="bu">str</span>}}}</span>
|
||||||
<span id="cb46-6"><a aria-hidden="true" href="#cb46-6" tabindex="-1"></a></span>
|
<span id="cb41-6"><a aria-hidden="true" href="#cb41-6" tabindex="-1"></a></span>
|
||||||
<span id="cb46-7"><a aria-hidden="true" href="#cb46-7" tabindex="-1"></a></span>
|
<span id="cb41-7"><a aria-hidden="true" href="#cb41-7" tabindex="-1"></a></span>
|
||||||
<span id="cb46-8"><a aria-hidden="true" href="#cb46-8" tabindex="-1"></a><span class="kw">class</span> Auth(BaseAuth):</span>
|
<span id="cb41-8"><a aria-hidden="true" href="#cb41-8" tabindex="-1"></a><span class="kw">class</span> Auth(BaseAuth):</span>
|
||||||
<span id="cb46-9"><a aria-hidden="true" href="#cb46-9" tabindex="-1"></a> <span class="kw">def</span> <span class="fu">__init__</span>(<span class="va">self</span>, configuration):</span>
|
<span id="cb41-9"><a aria-hidden="true" href="#cb41-9" tabindex="-1"></a> <span class="kw">def</span> <span class="fu">__init__</span>(<span class="va">self</span>, configuration):</span>
|
||||||
<span id="cb46-10"><a aria-hidden="true" href="#cb46-10" tabindex="-1"></a> <span class="bu">super</span>().<span class="fu">__init__</span>(configuration.copy(PLUGIN_CONFIG_SCHEMA))</span>
|
<span id="cb41-10"><a aria-hidden="true" href="#cb41-10" tabindex="-1"></a> <span class="bu">super</span>().<span class="fu">__init__</span>(configuration.copy(PLUGIN_CONFIG_SCHEMA))</span>
|
||||||
<span id="cb46-11"><a aria-hidden="true" href="#cb46-11" tabindex="-1"></a></span>
|
<span id="cb41-11"><a aria-hidden="true" href="#cb41-11" tabindex="-1"></a></span>
|
||||||
<span id="cb46-12"><a aria-hidden="true" href="#cb46-12" tabindex="-1"></a> <span class="kw">def</span> login(<span class="va">self</span>, login, password):</span>
|
<span id="cb41-12"><a aria-hidden="true" href="#cb41-12" tabindex="-1"></a> <span class="kw">def</span> login(<span class="va">self</span>, login, password):</span>
|
||||||
<span id="cb46-13"><a aria-hidden="true" href="#cb46-13" tabindex="-1"></a> <span class="co"># Get password from configuration option</span></span>
|
<span id="cb41-13"><a aria-hidden="true" href="#cb41-13" tabindex="-1"></a> <span class="co"># Get password from configuration option</span></span>
|
||||||
<span id="cb46-14"><a aria-hidden="true" href="#cb46-14" tabindex="-1"></a> static_password <span class="op">=</span> <span class="va">self</span>.configuration.get(<span class="st">"auth"</span>, <span class="st">"password"</span>)</span>
|
<span id="cb41-14"><a aria-hidden="true" href="#cb41-14" tabindex="-1"></a> static_password <span class="op">=</span> <span class="va">self</span>.configuration.get(<span class="st">"auth"</span>, <span class="st">"password"</span>)</span>
|
||||||
<span id="cb46-15"><a aria-hidden="true" href="#cb46-15" tabindex="-1"></a> <span class="co"># Check authentication</span></span>
|
<span id="cb41-15"><a aria-hidden="true" href="#cb41-15" tabindex="-1"></a> <span class="co"># Check authentication</span></span>
|
||||||
<span id="cb46-16"><a aria-hidden="true" href="#cb46-16" tabindex="-1"></a> 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="cb41-16"><a aria-hidden="true" href="#cb41-16" tabindex="-1"></a> 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="cb46-17"><a aria-hidden="true" href="#cb46-17" tabindex="-1"></a> login, password)</span>
|
<span id="cb41-17"><a aria-hidden="true" href="#cb41-17" tabindex="-1"></a> login, password)</span>
|
||||||
<span id="cb46-18"><a aria-hidden="true" href="#cb46-18" tabindex="-1"></a> <span class="cf">if</span> password <span class="op">==</span> static_password:</span>
|
<span id="cb41-18"><a aria-hidden="true" href="#cb41-18" tabindex="-1"></a> <span class="cf">if</span> password <span class="op">==</span> static_password:</span>
|
||||||
<span id="cb46-19"><a aria-hidden="true" href="#cb46-19" tabindex="-1"></a> <span class="cf">return</span> login</span>
|
<span id="cb41-19"><a aria-hidden="true" href="#cb41-19" tabindex="-1"></a> <span class="cf">return</span> login</span>
|
||||||
<span id="cb46-20"><a aria-hidden="true" href="#cb46-20" tabindex="-1"></a> <span class="cf">return</span> <span class="st">""</span></span></code></pre></div>
|
<span id="cb41-20"><a aria-hidden="true" href="#cb41-20" tabindex="-1"></a> <span class="cf">return</span> <span class="st">""</span></span></code></pre></div>
|
||||||
<p>Install the python module by running the following command in the
|
<p>Install the python module by running the following command in the
|
||||||
same folder as <code>setup.py</code>:</p>
|
same folder as <code>setup.py</code>:</p>
|
||||||
<div class="sourceCode" id="cb47"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb47-1"><a aria-hidden="true" href="#cb47-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip install .</span></code></pre></div>
|
<div class="sourceCode" id="cb42"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb42-1"><a aria-hidden="true" href="#cb42-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip install .</span></code></pre></div>
|
||||||
<p>To make use this great creation in Radicale, set the configuration
|
<p>To make use this great creation in Radicale, set the configuration
|
||||||
option <code>type</code> in the <code>auth</code> section to
|
option <code>type</code> in the <code>auth</code> section to
|
||||||
<code>radicale_static_password_auth</code>:</p>
|
<code>radicale_static_password_auth</code>:</p>
|
||||||
<div class="sourceCode" id="cb48"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb48-1"><a aria-hidden="true" href="#cb48-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
<div class="sourceCode" id="cb43"><pre class="sourceCode ini"><code class="sourceCode ini"><span id="cb43-1"><a aria-hidden="true" href="#cb43-1" tabindex="-1"></a><span class="kw">[auth]</span></span>
|
||||||
<span id="cb48-2"><a aria-hidden="true" href="#cb48-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> radicale_static_password_auth</span></span>
|
<span id="cb43-2"><a aria-hidden="true" href="#cb43-2" tabindex="-1"></a><span class="dt">type </span><span class="ot">=</span><span class="st"> radicale_static_password_auth</span></span>
|
||||||
<span id="cb48-3"><a aria-hidden="true" href="#cb48-3" tabindex="-1"></a><span class="dt">password </span><span class="ot">=</span><span class="st"> secret</span></span></code></pre></div>
|
<span id="cb43-3"><a aria-hidden="true" href="#cb43-3" tabindex="-1"></a><span class="dt">password </span><span class="ot">=</span><span class="st"> secret</span></span></code></pre></div>
|
||||||
<p>You can uninstall the module with:</p>
|
<p>You can uninstall the module with:</p>
|
||||||
<div class="sourceCode" id="cb49"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb49-1"><a aria-hidden="true" href="#cb49-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip uninstall radicale_static_password_auth</span></code></pre></div>
|
<div class="sourceCode" id="cb44"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb44-1"><a aria-hidden="true" href="#cb44-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip uninstall radicale_static_password_auth</span></code></pre></div>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="authentication-plugins">
|
<section class="level4" id="authentication-plugins">
|
||||||
<h4>Authentication plugins <a class="headerlink" href="#authentication-plugins">¶</a></h4>
|
<h4>Authentication plugins <a class="headerlink" href="#authentication-plugins">¶</a></h4>
|
||||||
|
@ -1674,6 +1428,11 @@ more information.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level2" id="contribute">
|
<section class="level2" id="contribute">
|
||||||
<h2>Contribute <a class="headerlink" href="#contribute">¶</a></h2>
|
<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">
|
<section class="level4" id="report-bugs">
|
||||||
<h4>Report Bugs <a class="headerlink" href="#report-bugs">¶</a></h4>
|
<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
|
<p>Found a bug? Want a new feature? Report a new issue on the <a href="https://github.com/Kozea/Radicale/issues">Radicale
|
||||||
|
@ -1686,7 +1445,7 @@ you want to add new features, fix bugs or update the documentation.</p>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="documentation-2">
|
<section class="level4" id="documentation-2">
|
||||||
<h4>Documentation <a class="headerlink" href="#documentation-2">¶</a></h4>
|
<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>
|
<p>To change or complement the documentation create a pull request to <a href="https://github.com/Kozea/Radicale/blob/v3/DOCUMENTATION.md">DOCUMENTATION.md</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
<section class="level2" id="download">
|
<section class="level2" id="download">
|
||||||
|
@ -1695,14 +1454,14 @@ you want to add new features, fix bugs or update the documentation.</p>
|
||||||
<h4>PyPI <a class="headerlink" href="#pypi">¶</a></h4>
|
<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
|
<p>Radicale is <a href="https://pypi.python.org/pypi/Radicale/">available on PyPI</a>. To
|
||||||
install, just type as superuser:</p>
|
install, just type as superuser:</p>
|
||||||
<div class="sourceCode" id="cb50"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb50-1"><a aria-hidden="true" href="#cb50-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> radicale</span></code></pre></div>
|
<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 install <span class="at">--upgrade</span> radicale</span></code></pre></div>
|
||||||
</section>
|
</section>
|
||||||
<section class="level4" id="git-repository">
|
<section class="level4" id="git-repository">
|
||||||
<h4>Git Repository <a class="headerlink" href="#git-repository">¶</a></h4>
|
<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
|
<p>If you want the development version of Radicale, take a look at the
|
||||||
<a href="https://github.com/Kozea/Radicale/">git repository on
|
<a href="https://github.com/Kozea/Radicale/">git repository on
|
||||||
GitHub</a>, or install it directly with:</p>
|
GitHub</a>, or install it directly with:</p>
|
||||||
<div class="sourceCode" id="cb51"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb51-1"><a aria-hidden="true" href="#cb51-1" tabindex="-1"></a><span class="ex">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> https://github.com/Kozea/Radicale/archive/master.tar.gz</span></code></pre></div>
|
<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">python3</span> <span class="at">-m</span> pip install <span class="at">--upgrade</span> https://github.com/Kozea/Radicale/archive/master.tar.gz</span></code></pre></div>
|
||||||
<p>You can also download the content of the repository as an <a href="https://github.com/Kozea/Radicale/tarball/master">archive</a>.</p>
|
<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>
|
||||||
<section class="level4" id="source-packages">
|
<section class="level4" id="source-packages">
|
||||||
|
@ -1719,7 +1478,7 @@ by David Runge</li>
|
||||||
Smedegaard</li>
|
Smedegaard</li>
|
||||||
<li><a href="https://packages.gentoo.org/packages/www-apps/radicale">Gentoo</a>
|
<li><a href="https://packages.gentoo.org/packages/www-apps/radicale">Gentoo</a>
|
||||||
by René Neumann, Maxim Koltsov and Manuel Rüger</li>
|
by René Neumann, Maxim Koltsov and Manuel Rüger</li>
|
||||||
<li><a href="https://src.fedoraproject.org/rpms/radicale">Fedora/EnterpriseLinux</a>
|
<li><a href="https://src.fedoraproject.org/rpms/radicale">Fedora/RHEL/CentOS</a>
|
||||||
by Jorti and Peter Bieringer</li>
|
by Jorti and Peter Bieringer</li>
|
||||||
<li><a href="http://madb.mageia.org/package/show/application/0/name/radicale">Mageia</a>
|
<li><a href="http://madb.mageia.org/package/show/application/0/name/radicale">Mageia</a>
|
||||||
by Jani Välimaa</li>
|
by Jani Välimaa</li>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue