User Tools

Site Tools


doc:appunti:calendar_contacts_private

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:calendar_contacts_private [2018/11/13 09:38] – [Impostazione del colore predefinito di un calendario] niccolodoc:appunti:calendar_contacts_private [2021/08/27 15:47] (current) – [Problema di sincronizzazione] niccolo
Line 3: Line 3:
 Su uno smartphone Android è possibile avere la rubrica dei contatti e dei calendari con gli eventi senza passare per i servizi Google? Sembra di sì, anche se è tutt'altro che semplice! Su uno smartphone Android è possibile avere la rubrica dei contatti e dei calendari con gli eventi senza passare per i servizi Google? Sembra di sì, anche se è tutt'altro che semplice!
  
 +In pratica è necessario installare un server che fornisca il servizio tramite i protocolli DAV, nel nostro caso abbiamo utilizzato **DAViCal** su Debian. Sul terminale Android si deve installare un client opportuno, la nostra scelta è caduta su **DAVdroid**. Infine è necessario adottare diversi accorgimenti per poter **esportare** i calendari e i contatti esistenti e verificare che la **sincronizzazione** col server remoto avvenga correttamente.
 ===== Installazione del server DAViCal ===== ===== Installazione del server DAViCal =====
  
-===== Creazione di un address book e di un calendar =====+In Debian 9 Stretch esiste il pacchetto **DAViCal** versione 1.1.5, per convenienza esiste anche il **[[https://packages.debian.org/stretch-backports/|backport]]** della **versione 1.1.7**, che abbiamo preferito. Per soddisfare le dipendenze è necessario prendere dai backports anche il pacchetto **libawl-php** versione **0.59**.
  
-===== Installazione di DAVdroid =====+È necessario un **database di supporto**, nel nostro caso abbiamo utilizzato **PostgreSQL**. La procedura di installazione è abbastanza //sui generis//, in quanto richiede che venga predisposto l'accesso al database senza password (per fortuna è possibile revocarlo al termine dell'installazione). Vedere gli appunti nel paragrafo **[[https://www.rigacci.org/wiki/doku.php/doc/appunti/linux/sa/davical?s[]=caldav#installazione_del_server_davical|Installazione del server DAViCal]]**.
  
-Esistono diverse app per Android per la **sincronizzazione** di **contatti** ed **eventi** calendario verso server **DAV**. Purtroppo si tratta spesso di app che offrono solo una delle due funzionalità e spesso le versioni free hanno limitazioni o problemi (ad esempio continui alert se la connessione con il server fallisce)Pare invece che l'app **[[https://play.google.com/store/apps/details?id=at.bitfire.davdroid|DAVdroid]]** abbia tutte le carte in regola per essere sceltasi tratta di **software open source** disponibile anche su **[[https://f-droid.org/en/packages/at.bitfire.davdroid/|F-Droid]]** e sembra sufficientemente stabile e maturo.+In **Apache 2.4** abbiamo definito un **VirtualHost** solo su HTTPSChi fa accesso usando HTTP viene rediretto per evitare che trasmetta password in chiaro sulla reteQuesta la configurazione da aggiungere:
  
-{{ .:davdroid:davdroid-account.png?direct&180|DAVdroid Account}}+<file> 
 +<Directory /usr/share/davical/htdocs> 
 +    DirectoryIndex index.php 
 +    AllowOverride None 
 +    Require all granted 
 +</Directory> 
 + 
 +<VirtualHost *:80> 
 +    ServerName dav.server.org 
 +    DocumentRoot /var/www/html/default 
 +    # Redirect everything to https, except /.well-known/ directory. 
 +    RedirectMatch permanent ^/((?!\.well-known).*)$ https://dav.server.org/$1 
 +</VirtualHost> 
 + 
 +<VirtualHost *:443> 
 +    SSLEngine on 
 +    ServerName dav.server.org 
 +    SSLCertificateFile    /etc/letsencrypt/live/dav.server.org/fullchain.pem 
 +    SSLCertificateKeyFile /etc/letsencrypt/live/dav.server.org/privkey.pem 
 +    DocumentRoot /var/www/html/default 
 +    ServerAdmin webmaster@server.org 
 +    ErrorLog ${APACHE_LOG_DIR}/dav.server.org/error.log 
 +    CustomLog ${APACHE_LOG_DIR}/dav.server.org/access.log combined 
 +    Alias /dav /usr/share/davical/htdocs 
 +    RewriteEngine On 
 +    # PT is important if you are using an alias, it implies L 
 +    # Redirect /.well-known URLs 
 +    RewriteRule ^/\.well-known/(.*)$ /dav/caldav.php/.well-known/$1 [NC,PT] 
 +    # Optionally: redirect /principals/users/ as well 
 +    RewriteRule ^/principals/users/(.*)$ /dav/caldav.php/$1 [NC,PT] 
 +    RewriteRule ^/principals/resources/(.*)$ /dav/caldav.php/$1 [NC,PT] 
 +    RewriteRule ^/calendars/__uids__/(.*)$ /dav/caldav.php/$1 [NC,PT] 
 +    RewriteRule ^/addressbooks/__uids__/(.*)$ /dav/caldav.php/$1 [NC,PT] 
 +    # Redirect / requests to web login page 
 +    RedirectMatch permanent ^/$ https://dav.server.org/dav/ 
 +</VirtualHost> 
 +</file> 
 + 
 +L'URL base del server sarà **%%https://dav.server.org/dav/%%** e sarà accessibile sia con il protocollo WebDAV che con il protocollo HTTPS. 
 + 
 +L'accesso in HTTPS presenta un'interfaccia minimale di amministrazione web: sarà possibile creare utenti (//principals//), creare address book e calendar (//collections//), ma per le normali operazioni di gestione contatti ed eventi si dovrà utilizzare un client dedicato. Nel nostro caso il client è rappresentato dalla app **DAVdroid** installata su uno smartphone Android, che darà accesso ai contatti e agli eventi di calendario a tutte le app relative. 
 +===== Creazione di un utente con address book e calendar ===== 
 + 
 +L'amministratore del server DAViCal si collega all'URL di gestione **%%https://dav.server.org/dav/%%**, quindi accede alla pagina **User Functions** => **Create Principal**. I parametri da inserire sono: 
 + 
 +^ Username       | È prassi abbastanza diffusa utilizzare l'indirizzo di posta elettronica come nome utente. 
 +^ Password       | Immettere una password. 
 +^ Fullname       | Normalmente si inserisce nome e cognome. Gli altri utenti del server DAViCal potranno vedere questa informazione. 
 +^ Email Address  | Informazione di base richiesta per la creazione di un account, di solito coincide con lo Username. Anche questa informazione sarà pubblica per tutti gli utenti del server DAViCal. 
 +^ Principal Type  | Selezionare **Person** per la creazione di un utente. 
 + 
 +Al termine dell'operazione sarà stato attivato un utente DAViCal; automaticamente sarà stato creato anche un **address book** (CardDAV) e un **calendario** (CalDAV) a lui assegnati. Se il nome di login è //%%user@server.org%%//, gli URL dei rispettivi oggetti saranno del tipo: 
 + 
 +^ Address book  | %%https://dav.server.org/dav/caldav.php/user@server.org/addresses/%% 
 +^ Calendar      | %%https://dav.server.org/dav/caldav.php/user@server.org/calendar/%%   | 
 + 
 +In generale non sarà necessario ricordare il percorso completo dei due oggetti, con l'**autodiscover** dovrebbe essere sempre sufficiente indicare solo l'**URL base del server** e gli oggetti disponibili dovrebbero essere automaticamente mostrati. 
 +===== Installazione di DAVx5 ===== 
 + 
 +Esistono diverse app per Android per la **sincronizzazione** di **contatti** ed **eventi** calendario verso server **DAV**. Purtroppo si tratta spesso di app che offrono solo una delle due funzionalità e spesso le versioni free hanno limitazioni o problemi (ad esempio continui alert se la connessione con il server fallisce). Pare invece che l'app **[[https://play.google.com/store/apps/details?id=at.bitfire.davdroid|DAVx5]]** (prima conosciuto come **DAVdroid**) abbia tutte le carte in regola per essere scelta: si tratta di **software open source** disponibile anche su **[[https://f-droid.org/en/packages/at.bitfire.davdroid/|F-Droid]]** e sembra sufficientemente stabile e maturo. 
 + 
 +{{ .:davdroid:davdroid-account.png?direct&180|DAVx5 Account}}
 Una volta scaricata e installata l'app, si deve **creare un nuovo account** sullo smartphone. Nel nostro caso si procede con l'opzione **Login with URL and user name**. Con l'installazione di DAViCal vista in precedenza si inserisce qualcosa del genere: Una volta scaricata e installata l'app, si deve **creare un nuovo account** sullo smartphone. Nel nostro caso si procede con l'opzione **Login with URL and user name**. Con l'installazione di DAViCal vista in precedenza si inserisce qualcosa del genere:
  
Line 18: Line 80:
 ^ Password   | %%******%%  | ^ Password   | %%******%%  |
  
-Lasciare attiva l'opzione predefinita **Groups are separate VCards**. Il server DAViCal support il formato [[wpit>VCard|vCard]] v.3.0 e quindi DAVdroid gestirà i gruppi come vCard separate (i gruppi sono usati ad esempio per creare le etichette da assegnare ai contatti). Vedere il paragrafo //Contact group method// nella [[https://www.davdroid.com/manual/accounts/|documentazione sugli Account]].+Lasciare attiva l'opzione predefinita **Groups are separate VCards**. Il server DAViCal support il formato [[wpit>VCard|vCard]] v.3.0 e quindi DAVx5 gestirà i gruppi come vCard separate (i gruppi sono usati ad esempio per creare le etichette da assegnare ai contatti). Vedere il paragrafo //Contact group method// nella [[https://www.davdroid.com/manual/accounts/|documentazione sugli Account]].
  
-DAVdroid si collega al server e tramite l'**autodiscovery** sul percorso **%%/.well-known/%%** si accorge che esistono già due //collection// collegate all'account: un **addressbook** e un **calendar**. Per impostazione predefinita infatti DAViCal crea queste due collection per ogni //principal// di tipo //person// (cioè per ogni account) che viene creato. Nella schermata che segue (vedi figura) bisogna attivare la sincronizzazione per queste due //collection//.+DAVx5 si collega al server e tramite l'**autodiscovery** sul percorso **%%/.well-known/%%** si accorge che esistono già due //collection// collegate all'account: un **addressbook** e un **calendar**. Per impostazione predefinita infatti DAViCal crea queste due collection per ogni //principal// di tipo //person// (cioè per ogni account) che viene creato. Nella schermata che segue (vedi figura) bisogna attivare la sincronizzazione per queste due //collection//.
  
 Questo è ciò che compare nello smartphone: Questo è ciò che compare nello smartphone:
  
   * Strumenti => **Utenti e account**   * Strumenti => **Utenti e account**
-    * Compare un nuovo account di tipo **DAVdroid**, identificato con l'indirizzo email. Da questo account dipendono tutti i calendari e le rubriche che verranno sincronizzate col server. +    * Compare un nuovo account di tipo **DAVx5**, identificato con l'indirizzo email. Da questo account dipendono tutti i calendari e le rubriche che verranno sincronizzate col server. 
-    * Compare anche un nuovo account di tipo **Rubrica DAVdroid**, identificato con il //Displayname// definito da DAViCal e l'indirizzo email più due lettere casuali. Questo account //figlio// è necessario per una **limitazione di Android**; la rubrica contatti infatti deve essere direttamente collegata ad uno specifico account, quindi l'account **DAVdroid** (padre) deve esporre un account **Rubrica DAVdroid** (figlio) per ogni rubrica contatti disponibile sul server. Questo non accade per i calendari: il singolo account padre è sufficiente per accederli tutti.+    * Compare anche un nuovo account di tipo **Rubrica DAVx5**, identificato con il //Displayname// definito da DAViCal e l'indirizzo email più due lettere casuali. Questo account //figlio// è necessario per una **limitazione di Android**; la rubrica contatti infatti deve essere direttamente collegata ad uno specifico account, quindi l'account **DAVx5** (padre) deve esporre un account **Rubrica DAVx5** (figlio) per ogni rubrica contatti disponibile sul server. Questo non accade per i calendari: il singolo account padre è sufficiente per accederli tutti.
  
 Maggiori dettagli nella pagina **[[https://www.davdroid.com/manual/accounts/|Accounts del manuale di DAVdroid]]**. Maggiori dettagli nella pagina **[[https://www.davdroid.com/manual/accounts/|Accounts del manuale di DAVdroid]]**.
Line 33: Line 95:
 Il sistema Android usa **tecniche aggressive per il risparmi di batteria**, questo affligge soprattutto le app non di sistema tipo DAVdroid. In pratica accade che **viene inibita la sincronizzazione** con il server: quando l'app è in background non viene mai svegliata. Il sistema Android usa **tecniche aggressive per il risparmi di batteria**, questo affligge soprattutto le app non di sistema tipo DAVdroid. In pratica accade che **viene inibita la sincronizzazione** con il server: quando l'app è in background non viene mai svegliata.
  
-Avviando l'app DAVdroid si viene avvisati di questo potenziale problema da tre pop-up:+Avviando l'app DAVx5 si viene avvisati di questo potenziale problema da tre pop-up:
  
   * Battery ... ?   * Battery ... ?
Line 44: Line 106:
 ===== Creazione di un calendario aggiuntivo ===== ===== Creazione di un calendario aggiuntivo =====
  
 +{{ .:davdroid:davdroid-multi-calendar.png?direct&200|DAVdroid: calendari}}
 In genere la via più comoda per aggiungere un calendario è utilizzare il client CalDAV preferito. Anche DAVdroid ha questa funzione  agendo dalla app **DAVdroid**, //Account// => //CalDAV// => //Hamburger menu// => **Crea nuovo calendario**. In genere la via più comoda per aggiungere un calendario è utilizzare il client CalDAV preferito. Anche DAVdroid ha questa funzione  agendo dalla app **DAVdroid**, //Account// => //CalDAV// => //Hamburger menu// => **Crea nuovo calendario**.
  
Line 71: Line 134:
 Per l'esportazione è necessario fare accesso con un PC e un browser alla pagina **[[https://calendar.google.com/]]**, ovviamente dopo aver effettuato il login ad esempio alla casella [[https://mail.google.com/|Gmail]]. Dall'icona **ingranaggio** si sceglie **Impostazioni** => //Importazione ed esportazione// => **Esporta**. Viene fatto scaricare un file zip che contiene un **file .ics** per ogni calendario esistente nell'account Google. Per l'esportazione è necessario fare accesso con un PC e un browser alla pagina **[[https://calendar.google.com/]]**, ovviamente dopo aver effettuato il login ad esempio alla casella [[https://mail.google.com/|Gmail]]. Dall'icona **ingranaggio** si sceglie **Impostazioni** => //Importazione ed esportazione// => **Esporta**. Viene fatto scaricare un file zip che contiene un **file .ics** per ogni calendario esistente nell'account Google.
  
-FIXME: Vedere la pagina [[https://wiki.davical.org/index.php/How_can_I_migrate_to_DAViCal_using_already_generated_.ics_files%3F|How can I migrate to DAViCal using already generated .ics files?]].+Nei file .ics esportati è opportuno modificare il tag **X-WR-CALNAME**, impostando la descrizione breve che identificherà il calendario nell'interfaccia di DAVdroid. 
 + 
 +È possibile caricare ogni singolo file .ics in un calendario DAViCal dall'interfaccia web. Dopo aver fatto login come utente proprietario del calendario, si clicca **View My Details** => //Principal Collections// => //ID// => **Load From File**. L'opzione //Append// consente di aggiungere gli eventi a quelli già esistenti, altrimenti il file caricato sostituisce del tutto il contenuto esistente. 
 + 
 +Per altri dettagli vedere la pagina [[https://wiki.davical.org/index.php/How_can_I_migrate_to_DAViCal_using_already_generated_.ics_files%3F|How can I migrate to DAViCal using already generated .ics files?]]. 
 ===== Impostazione del colore predefinito di un calendario ===== ===== Impostazione del colore predefinito di un calendario =====
  
Line 109: Line 177:
 Sullo smartphone è necessaria una sincronizzazione per vedere l'effetto: Sullo smartphone è necessaria una sincronizzazione per vedere l'effetto:
  
-  * Dalla app **DAVdroid** => Tap su account => CalDAV => [[wp>Hamburger button]] => **Refresh calendar list**.+  * Dalla app **DAVx5** => Tap su account => CalDAV => [[wp>Hamburger button]] => **Refresh calendar list**.
   * **Chiudere** l'app **Calendario**.   * **Chiudere** l'app **Calendario**.
-  * Da **Impostazioni** => //Utenti e account// => //DAVdroid// => //Sincronizzazione account// => **Sincronizza ora**.+  * Da **Impostazioni** => //Utenti e account// => //DAVx5// => //Sincronizzazione account// => **Sincronizza ora**.
  
  
Line 124: Line 192:
  
 Per effettuare la corretta esportazione dei calendari è stato necessario riattivare la App Google e forzare la sincronizzazione. Per effettuare la corretta esportazione dei calendari è stato necessario riattivare la App Google e forzare la sincronizzazione.
 +
 +===== Creazione di un calendario di gruppo =====
 +
 +Scenario: si vuole creare un calendario e condividerlo con due o più utenti.
 +
 +=== Creazione di un Principal di tipo Group ===
 +
 +Il //principal// di tipo //group// avrà il suo login e la sua password, ma le credenziali non verranno condivise con gli utenti che avranno accesso al calendario. Il calendario (in effetti una //collection//) sarà creato come appartenente a questo gruppo.
 +
 +  * User Functions => Create Principal
 +    * Username: caldavtest@domain.tld
 +    * Password: %%******%%
 +    * Fullname: Gruppo per calendario condiviso
 +    * Email Address: caldavtest@domain.tld
 +    * Principal Type: Group
 +
 +=== Aggiunta degli User al Group ===
 +
 +FIXME Serve davvero? Oppure è sufficiente creare il Ticket (vedi avanti)?
 +
 +  * User Functions => List Groups => (click su ID)
 +    * Group Members => (select the user) => Add
 +    * Group Members => (select the user) => Add
 +
 +=== Creazione di un Calendar Collection nel Group ===
 +
 +  * User Functions => List Groups => (click su ID)
 +    * Principal Collections => Create Collection
 +      * DAV Path: /dav/caldav.php/caldavtest@domain.tld/calendar/
 +      * Displayname: Calendario condiviso
 +      * Is a Calendar: [x]
 +      * Default Privileges: [x]
 +      * alendar Timezone: Europe/Rome
 +      * Collection Grants:
 +        * (select the user): ALL (FIXME Serve davvero? O basta il ticket?)
 +        * (select the user): ALL (FIXME Serve davvero? O basta il ticket?)
 +
 +L'URL completo del calendario è **%%https://dav.domain.tld/dav/caldav.php/caldavtest@domain.tld/calendar/%%**, ma non si userà questo per l'accesso. La risorsa verrà ricollocata (**bind**) come risorsa di ciascun utente.
 +
 +=== Creazione di un Access Ticket per la Collection ===
 +
 +  * User Functions => List Groups => (click su ID)
 +    * Access Tickets
 +      * Ticket ID: Nfe5wq0Y
 +      * Target: /caldavtest@domain.tld/calendar/
 +      * Expires: 2029-12-29
 +      * Privileges: ALL
 +
 +=== Binding della Calendar Collection allo User ===
 +
 +Con questa operazione, il calendario condiviso (che ha URL **%%/caldavtest@domain.tld/calendar/%%**) verrà mappato come risorsa dell'utente (con URL **%%/user1@domain.tld/boundcalendar/%%**):
 +
 +  * User Functions => List Users => (click su ID)
 +    * Bindings to other collections
 +      * ID Bounds As: /user1@domain.tld/boundcalendar/
 +      * Display Name: Calendario condiviso
 +      * To Collection: /caldavtest@domain.tld/calendar/
 +      * Ticket ID: Nfe5wq0Y
 +
 +L'URL completo del calendario diventa quindi **%%https://dav.domain.tld/dav/caldav.php/user1@domain.tld/boundcalendar/%%**. In generale non si dovrà indicare l'URL per esteso, perché il client (es DAVx5 su Android) elencherà il nuovo calendario nell'elenco di quelli disponibili, con l'etichetta impostata in //Displayname//.
 +
 +===== Aggiornamento del database di backend =====
 +
 +Dopo l'aggiornamento da Debian 9 Stretch a **Debian 10 Buster**, quando ci si collega all'interfaccia web di Davical (nella nostra installazione è qualcosa del tipo **%%https://dav.host.tld/dav/%%**), si legge il seguente warning:
 +
 +<code>
 +Database schema needs upgrading. Current: 1.3.2, Desired: 1.3.3
 +</code>
 +
 +Si è deciso di agire da riga di comando. Anzitutto si crea un file **/etc/davical/administration.yml** con le credenziali per accedere al database (proteggere il file con **mode 600**):
 +
 +<file>
 +admin_db_user: davical_dba
 +admin_db_pass: MySecret
 +admin_db_host: 127.0.0.1
 +</file>
 +
 +Quindi si esegue lo script **/usr/share/davical/dba/update-davical-database** che provvede ad applicare tutte le patch incrementali allo schema del database. Ovviamente si consiglia di fare un backup del database **prima** di eseguire la procedura.
 +
doc/appunti/calendar_contacts_private.1542098326.txt.gz · Last modified: 2018/11/13 09:38 by niccolo