From 6f096812c9fd460fddd21ff1cef55542cb79a890 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Tue, 02 Nov 2010 05:27:03 -0400 Subject: [PATCH] - Support contact's email addresses up to 255 characters long (#1487095) - Added email format checks when saving contacts data --- program/steps/addressbook/save.inc | 98 ++++++++++++++++++++++++++++++------------------ 1 files changed, 61 insertions(+), 37 deletions(-) diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc index 07f7460..f074f18 100644 --- a/program/steps/addressbook/save.inc +++ b/program/steps/addressbook/save.inc @@ -4,8 +4,8 @@ +-----------------------------------------------------------------------+ | program/steps/addressbook/save.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, Roundcube Dev. - Switzerland | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -19,19 +19,20 @@ */ +$cid = get_input_value('_cid', RCUBE_INPUT_POST); +$return_action = empty($cid) ? 'add' : 'edit'; + // cannot edit record -if ($CONTACTS->readonly) -{ +if ($CONTACTS->readonly) { $OUTPUT->show_message('contactreadonly', 'error'); - rcmail_overwrite_action(empty($_POST['_cid']) ? 'add' : 'show'); + rcmail_overwrite_action($return_action); return; } -// check input -if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST))) -{ +// Basic input checks +if ((!get_input_value('_name', RCUBE_INPUT_POST) || !get_input_value('_email', RCUBE_INPUT_POST))) { $OUTPUT->show_message('formincomplete', 'warning'); - rcmail_overwrite_action(empty($_POST['_cid']) ? 'add' : 'show'); + rcmail_overwrite_action($return_action); return; } @@ -39,60 +40,87 @@ // setup some vars we need $a_save_cols = array('name', 'firstname', 'surname', 'email'); $a_record = array(); -$cid = get_input_value('_cid', RCUBE_INPUT_POST); // read POST values into hash array -foreach ($a_save_cols as $col) -{ +foreach ($a_save_cols as $col) { $fname = '_'.$col; if (isset($_POST[$fname])) $a_record[$col] = get_input_value($fname, RCUBE_INPUT_POST); } +// Validity checks +$_email = idn_to_ascii($a_record['email']); +if (!check_email($_email, false)) { + $OUTPUT->show_message('emailformaterror', 'warning', array('email' => $_email)); + rcmail_overwrite_action($return_action); + return; +} + // update an existing contact if (!empty($cid)) { - if ($CONTACTS->update($cid, $a_record)) - { + $plugin = $RCMAIL->plugins->exec_hook('contact_update', + array('id' => $cid, 'record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC))); + $a_record = $plugin['record']; + + if (!$plugin['abort']) + $result = $CONTACTS->update($cid, $a_record); + else + $result = $plugin['result']; + + if ($result) { + // LDAP DN change + if (is_string($result) && strlen($result)>1) { + $newcid = $result; + // change cid in POST for 'show' action + $_POST['_cid'] = $newcid; + } + // define list of cols to be displayed $a_js_cols = array(); - $record = $CONTACTS->get_record($cid, true); + $record = $CONTACTS->get_record($newcid ? $newcid : $cid, true); foreach (array('name', 'email') as $col) $a_js_cols[] = (string)$record[$col]; // update the changed col in list - $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols); - + $OUTPUT->command('parent.update_contact_row', $cid, $a_js_cols, $newcid); + // show confirmation - $OUTPUT->show_message('successfullysaved', 'confirmation'); + $OUTPUT->show_message('successfullysaved', 'confirmation', null, false); rcmail_overwrite_action('show'); } - else - { + else { // show error message - $OUTPUT->show_message('errorsaving', 'error'); + $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false); rcmail_overwrite_action('show'); } } // insert a new contact -else -{ +else { // check for existing contacts $existing = $CONTACTS->search('email', $a_record['email'], true, false); - + // show warning message - if ($existing->count) - { - $OUTPUT->show_message('contactexists', 'warning'); + if ($existing->count) { + $OUTPUT->show_message('contactexists', 'warning', null, false); rcmail_overwrite_action('add'); return; } + $plugin = $RCMAIL->plugins->exec_hook('contact_create', array( + 'record' => $a_record, 'source' => get_input_value('_source', RCUBE_INPUT_GPC))); + $a_record = $plugin['record']; + // insert record and send response - if ($insert_id = $CONTACTS->insert($a_record)) - { + if (!$plugin['abort']) + $insert_id = $CONTACTS->insert($a_record); + else + $insert_id = $plugin['result']; + + + if ($insert_id) { // add contact row or jump to the page where it should appear $CONTACTS->reset(); $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id); @@ -105,16 +133,12 @@ $OUTPUT->command('parent.set_rowcount', rcmail_get_rowcount_text()); // show confirmation - $OUTPUT->show_message('successfullysaved', 'confirmation'); - rcmail_overwrite_action('show'); - $_GET['_cid'] = $insert_id; + $OUTPUT->show_message('successfullysaved', 'confirmation', null, false); + $OUTPUT->send('iframe'); } - else - { + else { // show error message - $OUTPUT->show_message('errorsaving', 'error'); + $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsaving', 'error', null, false); rcmail_overwrite_action('add'); } } - -?> -- Gitblit v1.9.1