From c9d116943fce4c39370be1d3df9d59cf05cb555f Mon Sep 17 00:00:00 2001 From: x2003bruneau Date: Sun, 22 Oct 2006 11:06:43 +0000 Subject: [PATCH] Fix #451: vCard RFC compliant git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1001 839d8a87-29fc-0310-9880-83ba4fa771e5 --- ChangeLog | 1 + modules/profile.php | 34 ++++++++++++++++++++++------------ templates/vcard.tpl | 40 +++++++++++++++++++++------------------- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index af7cbc8..9582d12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,7 @@ Bug/Wish: - #517: URL catcher update (www). -Car * Profile: + - #451: vCard are RFC compliant -FRU - #502: Use 'alias' instead of 'aka' to specify the nickname -FRU * Xnet/Events: diff --git a/modules/profile.php b/modules/profile.php index 6e027b4..f32a683 100644 --- a/modules/profile.php +++ b/modules/profile.php @@ -659,6 +659,11 @@ class ProfileModule extends PLModule } } + function vcard_escape($text) + { + return preg_replace('/[,;]/', '\\\\$0', $text); + } + function format_adr($params, &$smarty) { // $adr1, $adr2, $adr3, $postcode, $city, $region, $country @@ -666,15 +671,20 @@ class ProfileModule extends PLModule $adr = trim($adr1); $adr = trim("$adr\n$adr2"); $adr = trim("$adr\n$adr3"); - return $this->quoted_printable_encode(";;$adr;$city;$region;$postcode;$country"); + return $this->vcard_text_encode(';;' + . $this->vcard_escape($adr) . ';' + . $this->vcard_escape($city) . ';' + . $this->vcard_escape($region) . ';' + . $this->vcard_escape($postcode) . ';' + . $this->vcard_escape($country), false); } - function quoted_printable_encode($text) + function vcard_text_encode($text, $escape = true) { - return implode("\n", - array_map('trim', - explode("\n", - quoted_printable_encode($text)))); + if ($escape) { + $text = $this->vcard_escape($text); + } + return str_replace("\n", "\\n", $text); //implode('\n', explode("\n", $text)); } function handler_vcard(&$page, $x = null) @@ -693,7 +703,7 @@ class ProfileModule extends PLModule require_once 'xorg.misc.inc.php'; require_once 'user.func.inc.php'; - $page->register_modifier('qp_enc', array($this, 'quoted_printable_encode')); + $page->register_modifier('vcard_enc', array($this, 'vcard_text_encode')); $page->register_function('format_adr', array($this, 'format_adr')); $login = get_user_forlife($x); @@ -719,19 +729,19 @@ class ProfileModule extends PLModule // get photo $res = XDB::query( - "SELECT attach + "SELECT attach, attachmime FROM photo AS p INNER JOIN aliases AS a ON (a.id = p.uid AND a.type = 'a_vie') WHERE a.alias = {?}", $login); if ($res->numRows()) { - $user['photo'] = $res->fetchOneCell(); + $user['photo'] = $res->fetchOneAssoc(); } - $page->assign_by_ref('vcard', $user); + $page->assign('users', array($user)); header("Pragma: "); header("Cache-Control: "); - header("Content-type: text/x-vcard\n"); - header("Content-Transfer-Encoding: Quoted-Printable\n"); + header("Content-type: text/x-vcard; charset=iso-8859-15"); + header("Content-Transfer-Encoding: 8bit"); } function handler_admin_trombino(&$page, $uid = null, $action = null) { diff --git a/templates/vcard.tpl b/templates/vcard.tpl index 8f5b626..01935f4 100644 --- a/templates/vcard.tpl +++ b/templates/vcard.tpl @@ -19,18 +19,19 @@ {* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *} {* *} {**************************************************************************} +{foreach from="$users" item=vcard} BEGIN:VCARD VERSION:3.0 {if $vcard.nom_usage} -FN;ENCODING=QUOTED-PRINTABLE:{"`$vcard.prenom` `$vcard.nom_usage` (`$vcard.nom`)"|qp_enc} +FN:{$vcard.prenom|vcard_enc} {$vcard.nom_usage|vcard_enc} ({$vcard.nom|vcard_enc}) {else} -FN;ENCODING=QUOTED-PRINTABLE:{"`$vcard.prenom` `$vcard.nom`"|qp_enc} +FN:{$vcard.prenom|vcard_enc} {$vcard.nom|vcard_enc} {/if} -N;ENCODING=QUOTED-PRINTABLE:{$vcard.nom|qp_enc};{$vcard.prenom|qp_enc};{$vcard.nom_usage|qp_enc};; +N:{$vcard.nom|vcard_enc};{$vcard.prenom|vcard_enc};{$vcard.nom_usage|vcard_enc};; {if $vcard.nickname} -NICKNAME;ENCODING=QUOTED-PRINTABLE:{$vcard.nickname} +NICKNAME:{$vcard.nickname|vcard_enc} {/if} -EMAIL;TYPE=internet:{$vcard.bestalias}@{#globals.mail.domain#} +EMAIL;TYPE=internet,pref:{$vcard.bestalias}@{#globals.mail.domain#} {if $vcard.bestalias neq $vcard.forlife} EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain#} {/if} @@ -38,46 +39,47 @@ EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain#} EMAIL;TYPE=internet:{$vcard.virtualalias} {/if} {if $vcard.mobile} -TEL;TYPE=cell;ENCODING=QUOTED-PRINTABLE:{$vcard.mobile|qp_enc} +TEL;TYPE=cell:{$vcard.mobile|vcard_enc} {/if} {if $vcard.adr_pro} {if $vcard.adr_pro[0].entreprise} -ORG;ENCODING=QUOTED-PRINTABLE:{$vcard.adr_pro[0].entreprise|qp_enc} +ORG:{$vcard.adr_pro[0].entreprise|vcard_enc} {/if} {if $vcard.adr_pro[0].poste} -TITLE;ENCODING=QUOTED-PRINTABLE:{$vcard.adr_pro[0].poste|qp_enc} +TITLE:{$vcard.adr_pro[0].poste|vcard_enc} {/if} {if $vcard.adr_pro[0].fonction} -ROLE;ENCODING=QUOTED-PRINTABLE:{$vcard.adr_pro[0].fonction|qp_enc} +ROLE:{$vcard.adr_pro[0].fonction|vcard_enc} {/if} {if $vcard.adr_pro[0].tel} -TEL;TYPE=work;ENCODING=QUOTED-PRINTABLE:{$vcard.adr_pro[0].tel|qp_enc} +TEL;TYPE=work:{$vcard.adr_pro[0].tel|vcard_enc} {/if} {if $vcard.adr_pro[0].fax} -FAX;TYPE=work;ENCODING=QUOTED-PRINTABLE:{$vcard.adr_pro[0].fax|qp_enc} +FAX;TYPE=work:{$vcard.adr_pro[0].fax|vcard_enc} {/if} -ADR;TYPE=work;ENCODING=QUOTED-PRINTABLE:{format_adr adr=$vcard.adr_pro[0]} +ADR;TYPE=work:{format_adr adr=$vcard.adr_pro[0]} {/if} {foreach item=adr from=$vcard.adr} -ADR;TYPE=home{if $adr.courier},postal{/if};ENCODING=QUOTED-PRINTABLE:{format_adr adr=$adr} +ADR;TYPE=home{if $adr.courier},postal{/if}:{format_adr adr=$adr} {foreach item=tel from=$adr.tels} {if $tel.tel} -{if $tel.tel_type neq 'Fax'}TEL{else}FAX{/if};TYPE=home;ENCODING=QUOTED-PRINTABLE:{$tel.tel|qp_enc} +{if $tel.tel_type neq 'Fax'}TEL{else}FAX{/if};TYPE=home:{$tel.tel} {/if} {/foreach} {/foreach} {if $vcard.web} -URL;ENCODING=QUOTED-PRINTABLE:{$vcard.web|qp_enc} +URL:{$vcard.web} {/if} {if strlen(trim($vcard.freetext)) == 0} -NOTE;ENCODING=QUOTED-PRINTABLE:{"(X`$vcard.promo`)"|qp_enc} +NOTE:(X{$vcard.promo}) {else} -NOTE;ENCODING=QUOTED-PRINTABLE:{"(X`$vcard.promo`)\n`$vcard.freetext`"|qp_enc} +NOTE:(X{$vcard.promo})\n{$vcard.freetext|vcard_enc} {/if} {if $vcard.photo} -PHOTO;BASE64:{$vcard.photo|base64_encode} +PHOTO;ENCODING=b;TYPE={$vcard.photo.attachmime}:{$vcard.photo.attach|base64_encode} {/if} -SORT-STRING;ENCODING=QUOTED-PRINTABLE:{$vcard.nom|qp_enc} +SORT-STRING:{$vcard.nom|vcard_enc} REV:{$vcard.date|date_format:"%Y%m%dT000000Z"} END:VCARD +{/foreach} {* vim:set et sw=2 sts=2 sws=2: *} -- 2.1.4