X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=program%2Fsteps%2Fmail%2Faddcontact.inc;h=5b77b56e81ec68cea6c693cb20aaa751c91fb8e6;hb=76507f7c63a660742e76889ad6e3919f3dde3bb0;hp=d2a334e4111a41ef7eebbcb8ce25a386d565fa84;hpb=48e8459231a1efa3e97284d07a328776a5b7485b;p=roundcube.git diff --git a/program/steps/mail/addcontact.inc b/program/steps/mail/addcontact.inc index d2a334e..5b77b56 100644 --- a/program/steps/mail/addcontact.inc +++ b/program/steps/mail/addcontact.inc @@ -4,8 +4,8 @@ +-----------------------------------------------------------------------+ | program/steps/mail/addcontact.inc | | | - | This file is part of the RoundCube Webmail client | - | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2009, The Roundcube Dev Team | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -15,51 +15,80 @@ | Author: Thomas Bruederli | +-----------------------------------------------------------------------+ - $Id: addcontact.inc 1365 2008-05-08 08:22:18Z alec $ + $Id: addcontact.inc 5415 2011-11-11 15:04:45Z alec $ */ -$done = false; +// only process ajax requests +if (!$OUTPUT->ajax_call) + return; -if (!empty($_POST['_address'])) +$abook = $RCMAIL->config->get('default_addressbook'); + +// Get configured addressbook +$CONTACTS = $RCMAIL->get_address_book($abook, true); + +// Get first writeable addressbook if the configured doesn't exist +// This can happen when user deleted the addressbook (e.g. Kolab folder) +if ($abook == null || !is_object($CONTACTS)) { + $source = reset($RCMAIL->get_address_sources(true)); + $CONTACTS = $RCMAIL->get_address_book($source['id'], true); +} + +if (!empty($_POST['_address']) && is_object($CONTACTS)) { - $CONTACTS = array(); - if (strtolower($CONFIG['address_book_type']) == 'ldap') { - // Use the first writable LDAP address book. - foreach ($CONFIG["ldap_public"] as $id => $prop) { - if ($prop["writable"]) { - $CONTACTS = new rcube_ldap($prop); - break; - } // end if - } // end foreach - } // end if - else { - $CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']); - } // end else $contact_arr = $IMAP->decode_address_list(get_input_value('_address', RCUBE_INPUT_POST, true), 1, false); - - if (!empty($contact_arr[1]['mailto'])) - { + + if (!empty($contact_arr[1]['mailto'])) { $contact = array( 'email' => $contact_arr[1]['mailto'], 'name' => $contact_arr[1]['name'] ); - - // use email address part for name - if (empty($contact['name']) || $contact['name'] == $contact['email']) - $contact['name'] = ucfirst(preg_replace('/[\.\-]/', ' ', substr($contact['email'], 0, strpos($contact['email'], '@')))); + + // Validity checks + if (empty($contact['email'])) { + $OUTPUT->show_message('errorsavingcontact', 'error'); + $OUTPUT->send(); + } + + $email = rcube_idn_to_ascii($contact['email']); + if (!check_email($email, false)) { + $OUTPUT->show_message('emailformaterror', 'error', array('email' => $contact['email'])); + $OUTPUT->send(); + } + + $contact['email'] = rcube_idn_to_utf8($contact['email']); + $contact['name'] = rcube_addressbook::compose_display_name($contact); + + // validate contact record + if (!$CONTACTS->validate($contact, true)) { + $error = $CONTACTS->get_error(); + // TODO: show dialog to complete record + // if ($error['type'] == rcube_addressbook::ERROR_VALIDATE) { } + + $OUTPUT->show_message($error['message'] ? $error['message'] : 'errorsavingcontact', 'error'); + $OUTPUT->send(); + } // check for existing contacts - $existing = $CONTACTS->search('email', $contact['email'], true, false); + $existing = $CONTACTS->search('email', $contact['email'], 1, false); + if ($done = $existing->count) $OUTPUT->show_message('contactexists', 'warning'); - else if ($done = $CONTACTS->insert($contact)) - $OUTPUT->show_message('addedsuccessfully', 'confirmation'); + else { + $plugin = $RCMAIL->plugins->exec_hook('contact_create', array('record' => $contact, 'source' => null)); + $contact = $plugin['record']; + + $done = !$plugin['abort'] ? $CONTACTS->insert($contact) : $plugin['result']; + + if ($done) + $OUTPUT->show_message('addedsuccessfully', 'confirmation'); + } } } if (!$done) - $OUTPUT->show_message('errorsavingcontact', 'warning'); + $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsavingcontact', 'error'); $OUTPUT->send(); -?> +