From a6ffdf9ad66939108b46ce7f0dd08a7383ca42f1 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 25 Apr 2012 14:12:09 +0200 Subject: [PATCH] Fix/improve crypto key handling in contact records --- .../kolab_addressbook/kolab_addressbook.php | 6 ++- .../lib/rcube_kolab_contacts.php | 4 +- .../kolab_addressbook/localization/de_CH.inc | 3 +- .../kolab_addressbook/localization/de_DE.inc | 3 +- .../kolab_addressbook/localization/en_US.inc | 3 +- plugins/libkolab/lib/kolab_format_contact.php | 52 ++++++++++--------- 6 files changed, 40 insertions(+), 31 deletions(-) diff --git a/plugins/kolab_addressbook/kolab_addressbook.php b/plugins/kolab_addressbook/kolab_addressbook.php index ef6d11a0..3e1d2000 100644 --- a/plugins/kolab_addressbook/kolab_addressbook.php +++ b/plugins/kolab_addressbook/kolab_addressbook.php @@ -292,7 +292,8 @@ class kolab_addressbook extends rcube_plugin $p['form']['personal']['content']['profession'] = array('size' => 40); $p['form']['personal']['content']['children'] = array('size' => 40); $p['form']['personal']['content']['freebusyurl'] = array('size' => 40); - $p['form']['personal']['content']['pgppublickey'] = array('size' => 40); + $p['form']['personal']['content']['pgppublickey'] = array('size' => 70); + $p['form']['personal']['content']['pkcs7publickey'] = array('size' => 70); // re-order fields according to the coltypes list $p['form']['contact']['content'] = $this->_sort_form_fields($p['form']['contact']['content']); @@ -302,8 +303,9 @@ class kolab_addressbook extends rcube_plugin $p['form']['settings'] = array( 'name' => $this->gettext('settings'), 'content' => array( - 'pgppublickey' => array('size' => 40, 'visible' => true), 'freebusyurl' => array('size' => 40, 'visible' => true), + 'pgppublickey' => array('size' => 70, 'visible' => true), + 'pkcs7publickey' => array('size' => 70, 'visible' => false), ) ); */ diff --git a/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php b/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php index 0c1a8211..ebfa29a7 100644 --- a/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php +++ b/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php @@ -63,9 +63,11 @@ class rcube_kolab_contacts extends rcube_addressbook 'label' => 'kolab_addressbook.freebusyurl'), 'pgppublickey' => array('type' => 'textarea', 'size' => 70, 'rows' => 10, 'limit' => 1, 'label' => 'kolab_addressbook.pgppublickey'), + 'pkcs7publickey' => array('type' => 'textarea', 'size' => 70, 'rows' => 10, 'limit' => 1, + 'label' => 'kolab_addressbook.pkcs7publickey'), 'notes' => array(), 'photo' => array(), - // TODO: define more Kolab-specific fields such as: language, latitude, longitude + // TODO: define more Kolab-specific fields such as: language, latitude, longitude, crypto settings ); /** diff --git a/plugins/kolab_addressbook/localization/de_CH.inc b/plugins/kolab_addressbook/localization/de_CH.inc index f91a24ba..34394482 100644 --- a/plugins/kolab_addressbook/localization/de_CH.inc +++ b/plugins/kolab_addressbook/localization/de_CH.inc @@ -5,7 +5,8 @@ $labels['initials'] = 'Initialen'; $labels['profession'] = 'Berufsbezeichnung'; $labels['officelocation'] = 'Büro Adresse'; $labels['children'] = 'Kinder'; -$labels['pgppublickey'] = 'Öffentlicher PGP-Schlüssel'; +$labels['pgppublickey'] = 'PGP-Schlüssel'; +$labels['pkcs7publickey'] = 'S/MIME-Schlüssel'; $labels['freebusyurl'] = 'Frei/Belegt URL'; $labels['typebusiness'] = 'Dienstlich'; $labels['typebusinessfax'] = 'Dienst'; diff --git a/plugins/kolab_addressbook/localization/de_DE.inc b/plugins/kolab_addressbook/localization/de_DE.inc index 5fd86b76..2c2a5d20 100644 --- a/plugins/kolab_addressbook/localization/de_DE.inc +++ b/plugins/kolab_addressbook/localization/de_DE.inc @@ -5,7 +5,8 @@ $labels['initials'] = 'Initialen'; $labels['profession'] = 'Berufsbezeichnung'; $labels['officelocation'] = 'Büro Adresse'; $labels['children'] = 'Kinder'; -$labels['pgppublickey'] = 'Öffentlicher PGP-Schlüssel'; +$labels['pgppublickey'] = 'PGP-Schlüssel'; +$labels['pkcs7publickey'] = 'S/MIME-Schlüssel'; $labels['freebusyurl'] = 'Frei/Belegt URL'; $labels['typebusiness'] = 'Dienstlich'; $labels['typebusinessfax'] = 'Dienst'; diff --git a/plugins/kolab_addressbook/localization/en_US.inc b/plugins/kolab_addressbook/localization/en_US.inc index 36f2139f..a66426f4 100644 --- a/plugins/kolab_addressbook/localization/en_US.inc +++ b/plugins/kolab_addressbook/localization/en_US.inc @@ -5,7 +5,8 @@ $labels['initials'] = 'Initials'; $labels['profession'] = 'Profession'; $labels['officelocation'] = 'Office location'; $labels['children'] = 'Children'; -$labels['pgppublickey'] = 'PGP publickey'; +$labels['pgppublickey'] = 'PGP public key'; +$labels['pkcs7publickey'] = 'S/MIME public key'; $labels['freebusyurl'] = 'Free-busy URL'; $labels['typebusiness'] = 'Business'; $labels['typebusinessfax'] = 'Business Fax'; diff --git a/plugins/libkolab/lib/kolab_format_contact.php b/plugins/libkolab/lib/kolab_format_contact.php index 6df3502a..69db2d15 100644 --- a/plugins/libkolab/lib/kolab_format_contact.php +++ b/plugins/libkolab/lib/kolab_format_contact.php @@ -270,30 +270,31 @@ class kolab_format_contact extends kolab_format } $this->obj->setRelateds($rels); - if (isset($object['pgppublickey'])) { - $replace = -1; - $keys = $this->obj->keys(); - if (!is_object($keys)) - $keys = new vectorkey; - - for ($i=0; $i < $keys->size(); $i++) { - $key = $keys->get($i); - if ($key->type() == Key::PGP) { - $replace = $i; - break; - } - } - - // insert/replace pgp key entry - $key = new Key($object['pgppublickey'], Key::PGP); - if ($replace >= 0) - $keys->set($replace, $key); - else - $keys->push($key); - - $this->obj->setKeys($keys); + // insert/replace crypto keys + $pgp_index = $pkcs7_index = -1; + $keys = $this->obj->keys(); + for ($i=0; $i < $keys->size(); $i++) { + $key = $keys->get($i); + if ($pgp_index < 0 && $key->type() == Key::PGP) + $pgp_index = $i; + else if ($pkcs7_index < 0 && $key->type() == Key::PKCS7_MIME) + $pkcs7_index = $i; } + $pgpkey = $object['pgppublickey'] ? new Key($object['pgppublickey'], Key::PGP) : new Key(); + $pkcs7key = $object['pkcs7publickey'] ? new Key($object['pkcs7publickey'], Key::PKCS7_MIME) : new Key(); + + if ($pgp_index >= 0) + $keys->set($pgp_index, $pgpkey); + else if (!empty($object['pgppublickey'])) + $keys->push($pgpkey); + if ($pkcs7_index >= 0) + $keys->set($pkcs7_index, $pkcs7key); + else if (!empty($object['pkcs7publickey'])) + $keys->push($pkcs7key); + + $this->obj->setKeys($keys); + // TODO: handle language, gpslocation, etc. @@ -389,13 +390,14 @@ class kolab_format_contact extends kolab_format // relateds -> spouse, children $this->read_relateds($this->obj->relateds(), $object); - // crypto settings: currently only pgpkey is supported + // crypto settings: currently only key values are supported $keys = $this->obj->keys(); for ($i=0; is_object($keys) && $i < $keys->size(); $i++) { $key = $keys->get($i); - if ($key->type() == Key::PGP) { + if ($key->type() == Key::PGP) $object['pgppublickey'] = $key->key(); - } + else if ($key->type() == Key::PKCS7_MIME) + $object['pkcs7publickey'] = $key->key(); } $this->data = $object;