Skip to content

Instantly share code, notes, and snippets.

@mqu
Last active December 17, 2015 01:48
Show Gist options
  • Save mqu/5530527 to your computer and use it in GitHub Desktop.
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.
<?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