Last active
December 17, 2015 01:48
-
-
Save mqu/5530527 to your computer and use it in GitHub Desktop.
synchro très basique : Amelia -> any-calendar :- 1 : installer ce script sur un serveur Web public, une URL de la forme : http://server/calendar/- 2 : pour obtenir sa clé d'accès, il suffit d'activer : URL/getkey/<compte>- 3 : configurer l'agenda avec l'URL obtenue.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
error_reporting(E_ALL); | |
ini_set('include_path', '.:lib:lib-extra:lib-wcap:modules:' . ini_get('include_path')); | |
# fichier de configuration du site Web. | |
# include_once('amelia-config.php'); | |
$config = array( | |
# configuration de l'agenda (serveur SunCalendar, protocole WCAP | |
'calendar/server/url' => 'https://calendar.....', | |
'calendar/server/user' => 'prenom.nom', | |
'calendar/server/passwd' => 'mot-de-passe', | |
'calendar/tzid' => 'Europe/Paris', # timezone : important pour la précision des heures. | |
); | |
# full wcap-client source code is now located here : https://github.com/mqu/php-wcap-client | |
require_once('WcapClient.php'); | |
# used to force ICAL output | |
class IcalWcapClient extends WcapClient { | |
public function fetchcomponents_by_range($calid, $dtstart, $dtend, $extra_args = array()){ | |
if(count($extra_args) == 0) | |
$extra_args=array( | |
'attrset' => 1 # attributes of return event : 0:minimum, 1:middle, 2:full-event | |
); | |
$args = array( | |
'calid' => $calid, | |
'dtstart' => $dtstart, | |
'dtend' => $dtend, | |
'fmt-out' => 'text/calendar', | |
'attrset' => $extra_args['attrset'], | |
# 'recurring ' => 1 # ne fonctionne pas comme attendu. | |
); | |
foreach($extra_args as $key=>$val) | |
$args[$key] = $val; | |
return $this->get('fetchcomponents_by_range', $args); | |
} | |
} | |
class CalendarKey { | |
static public $salt = "une clé permettant de perturber le hashage"; | |
static public function get_key($val){ | |
return md5(sprintf("%s-%s", $val, self::$salt)); | |
} | |
static public function check_key($val, $key){ | |
return $key == self::get_key($val); | |
} | |
} | |
$url = sprintf('http://%s%s', $_SERVER['HTTP_HOST'], $_SERVER['SCRIPT_NAME']); # ne gère pas HTTPS | |
$url = str_replace('/index.php', '', $url); | |
$conf['url'] = $url; | |
# FIXME | |
$wcap = new IcalWcapClient($config['calendar/server/url']); | |
$status = $wcap->login($config['calendar/server/user'], $config['calendar/server/passwd']); | |
# this week | |
$start = Date::week_number() - 10; | |
$end = Date::week_number() + 30; | |
$start = Ical::timestamp2ICal(Date::week_to_timestamp($start)); | |
$end = Ical::timestamp2ICal(Date::week_to_timestamp($end)); | |
# $end = 0; | |
$calid = null; | |
if(!isset($_REQUEST['q'])) | |
help(); | |
$q = $_REQUEST['q']; | |
if(preg_match('#getkey/(.*).ics$#', $q, $values) || preg_match('#getkey/(.*)$#', $q, $values)){ | |
$calid = $values[1]; | |
$key = CalendarKey::get_key($calid); | |
header('Content-Type: text/plain; charset=UTF-8'); | |
printf("votre clé est : %s\n", $key); | |
printf("URL de votre agenda : %s/%s/%s\n", $conf['url'], $key, $calid); | |
exit(0); | |
} | |
# acces : key/prenom.nom.ics | |
if(preg_match('#(.*?)/(.*?)\.ics#', $q, $values) || preg_match('#(.*)/(.*)#', $q, $values)){ | |
$key = $values[1]; | |
$calid = $values[2]; | |
header('Content-Type: text/calendar; charset=UTF-8'); | |
if(!CalendarKey::check_key($calid, $key)){ | |
echo calendar_error($calid, 'mauvaise cle : acces non authorise'); | |
exit(0); | |
} | |
} | |
if($calid == null) | |
help(); | |
$calid .= '@aviation-civile.gouv.fr'; | |
$ical = $wcap->fetchcomponents_by_range($calid, $start, $end); | |
header('Content-Type: text/calendar; charset=UTF-8'); | |
# header('Content-Disposition: attachment; filename="calendar.ics"'); | |
echo $ical; | |
function help(){ | |
global $conf; | |
$url = $conf['url']; | |
header('Content-Type: text/html; charset=UTF-8'); | |
echo <<<END | |
<h3>synchronisation agenda Amelia</h3> | |
<p>attention, cette application est un <b>PROTOTYPE</b>.</p> | |
<p>cette application permet de lire votre agenda Amelia et de l'exporter dans un format compatible avec les différents <a href="http://fr.wikipedia.org/wiki/Smartphone">Smartphones</a> du marché dont l'iphone, android, google-calendar, ipad ... | |
<p>la synthaxe d'accès à votre agenda est la suivante et sujete à changement : | |
<li><tt>$url/CLE/prenom.nom</tt> -> lecture de l'agenda de la personne portant l'identité : prenom.nom | |
<li><tt>$url/CLE/prenom.nom.ics</tt> -> même comportement (peut être nécessaire pour certains clients) | |
<p>pour disposer de votre clé, vous devez demander à Marc Quinton (58.34) qui vous la transmettra par mail, | |
<p><b>Précisions fonctionnelles</b> : | |
<li>l'agenda Amélia portant l'identité "prenom.nom" est lu par ce script et exporté au format <a href="http://fr.wikipedia.org/wiki/ICalendar"><tt>ICS</tt></a>, | |
<li>il s'agit d'une extraction portant sur un interval [-10, +30] semaines par rapport à la date courante (pourrait être paramêtrable), | |
<li>il s'agit d'une synchronisation unidirectionnelle en mode fichier. L'agenda est recopié plus ou moins globalement à chaque synchronisation et en mode bloc et non pas de manière granulaire et par évenement, | |
<li>la périodicité de synchnonisation dépend du client utilisé, | |
<li>cette application fait l'interface entre Amelia et les clients, | |
<li>les clients envisagés sont : l'Iphone, les téléphones Android, les agendas Google et plus généralement tous les Smartphone capables de lire une URL et le format ICAL. | |
<li>pour que l'agenda soit lisible, vous devez donner un accès en lecture au compte "marc.quinton" qui est l'agent lecteur dans ce logiciel; à terme ce sera un compte générique. | |
<li>cette configuration se réalise via le client léger Amélia, dans les fonctions Agenda / Propriétés des agendas. | |
<li>vos login et mot de passe Angélique ne sont pas enregistrés sur cette machine ; aucun mot de passe en clair lié à Amelia ne transite sur le réseau | |
<p><b>Précisions techniques</b> : | |
<li>les agendas sont extraits périodiquement du serveur via une <a href="http://code.google.com/p/php-wcap-client/">classe</a> PHP s'appuyant sur le protocole <a href="http://fr.wikipedia.org/wiki/Web_Calendar_Access_Protocol">WCAP</a>, | |
<li>les extractions sont déclenchées par l'appel à l'URL spécifiée ci-dessus ; c'est le client qui à la charge de réaliser ces requêtes, | |
<li>une clé d'accès générée localement permet de garantir un accès confidentiel aux agendas ; il n'y a pas de filtrage ou contrôle supplémentaire. Si la clé fournie ne coincide pas avec la clé calculée une erreur est retournée sous forme ICAL (évenement comportant un message d'erreur) | |
<p><b>à terme</b> : | |
<li>une clé générable et modifiable au grès de l'utilisateur permettra d'apporter un peu de souplesse dans la gestion des droits d'accès. Cette clé pourra être échangée par courrier électronique. | |
<li>cette application pourra être porté sur les serveurs de la DTI si la décision est prise de péréniser ce prototype et si les évaluations donnent satisfaction. | |
<li>une synchronisation plus complète et plus fine via <a href="http://fr.wikipedia.org/wiki/CalDAV"><tt>Caldav</tt></a> est envisageable mais nécessite un <a href="http://code.google.com/p/sabredav/wiki/CalDAV">effort de développement</a> plus important (écriture d'un backend WCAP pour le serveur caldav). Les avantages présumés seraient : synchronisation bi-directionnelle et gestion plus granulaire des évenements (optimisation des flux et des requêtes sur les serveurs), | |
<p><b>Liens</b> :</p> | |
<li>configuration de l'<a href="http://blog.fosketts.net/2009/06/17/subscribe-internet-calendars-iphone-30/">iphone</a> | |
<li><a href="http://www.google.com/support/calendar/bin/answer.py?hl=fr&answer=37100">ajouter</a> un agenda sur <a href="https://www.google.com/calendar">google calendar</a> | |
END; | |
exit(0); | |
} | |
function calendar_error($calid, $msg="error"){ | |
return <<<END | |
BEGIN:VCALENDAR | |
X-NSCP-CALPROPS-ERROR:${msg} | |
X-NSCP-CALPROPS-RELATIVE-CALID:${calid}@aviation-civile.gouv.fr | |
X-NSCP-CALPROPS-NAME:${calid}@aviation-civile.gouv.fr | |
X-NSCP-WCAP-ERRNO:28 | |
BEGIN:VEVENT | |
CREATED:20100906T134431Z | |
LAST-MODIFIED:20100906T134430Z | |
DTSTAMP:20100906T134430Z | |
UID:00000000000000000000000000000000c1ef844cfca37800de02000072780000 | |
SUMMARY:errreur | |
PRIORITY:0 | |
STATUS:CONFIRMED | |
CATEGORIES:Divers | |
DTSTART;VALUE=DATE;TZID=Europe/Paris:20100906 | |
DTEND;VALUE=DATE;TZID=Europe/Paris:20100907 | |
DESCRIPTION:${msg} | |
CLASS:PRIVATE | |
TRANSP:TRANSPARENT | |
REQUEST-STATUS:2.0;Success. | |
END:VEVENT | |
END:VCALENDAR | |
END; | |
} | |
?> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment