- Support contact's email addresses up to 255 characters long (#1487095)
- Added email format checks when saving contacts data
| | |
| | | - Plugin API: add possibility to disable plugin in framed mode, 'noframe' property |
| | | - Improve performance of setting IMAP flags using .SILENT suffix |
| | | - Improve performance of message cache status checking with skip_disabled=true |
| | | - Support contact's email addresses up to 255 characters long (#1487095) |
| | | |
| | | RELEASE 0.4.2 |
| | | ------------- |
| | |
| | | [changed] [datetime] NOT NULL ,
|
| | | [del] [char] (1) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [name] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [email] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [email] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [firstname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [surname] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL ,
|
| | | [vcard] [text] COLLATE Latin1_General_CI_AI NULL
|
| | |
| | | ON DELETE CASCADE ON UPDATE CASCADE
|
| | | GO
|
| | |
|
| | | ALTER TABLE [dbo].[identities] add [changed] [datetime] NULL |
| | | ALTER TABLE [dbo].[identities] ADD [changed] [datetime] NULL |
| | | GO
|
| | |
|
| | | CREATE TABLE [dbo].[contactgroups] (
|
| | |
| | | GO
|
| | | CREATE UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY]
|
| | | GO
|
| | | ALTER TABLE [dbo].[contacts] ALTER COLUMN [email] [varchar] (255) COLLATE Latin1_General_CI_AI NOT NULL
|
| | | GO
|
| | | |
| | |
| | | `changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', |
| | | `del` tinyint(1) NOT NULL DEFAULT '0', |
| | | `name` varchar(128) NOT NULL DEFAULT '', |
| | | `email` varchar(128) NOT NULL, |
| | | `email` varchar(255) NOT NULL, |
| | | `firstname` varchar(128) NOT NULL DEFAULT '', |
| | | `surname` varchar(128) NOT NULL DEFAULT '', |
| | | `vcard` text NULL, |
| | |
| | | ALTER TABLE `users` DROP INDEX `username_index`; |
| | | ALTER TABLE `users` ADD UNIQUE `username` (`username`, `mail_host`); |
| | | |
| | | ALTER TABLE `contacts` MODIFY `email` varchar(255) NOT NULL; |
| | | |
| | |
| | | changed timestamp with time zone DEFAULT now() NOT NULL, |
| | | del smallint DEFAULT 0 NOT NULL, |
| | | name varchar(128) DEFAULT '' NOT NULL, |
| | | email varchar(128) DEFAULT '' NOT NULL, |
| | | email varchar(255) DEFAULT '' NOT NULL, |
| | | firstname varchar(128) DEFAULT '' NOT NULL, |
| | | surname varchar(128) DEFAULT '' NOT NULL, |
| | | vcard text |
| | |
| | | |
| | | DROP INDEX users_username_id_idx; |
| | | ALTER TABLE users ADD UNIQUE (username, mail_host); |
| | | ALTER TABLE contacts ALTER email TYPE varchar(255); |
| | | |
| | |
| | | changed datetime NOT NULL default '0000-00-00 00:00:00', |
| | | del tinyint NOT NULL default '0', |
| | | name varchar(128) NOT NULL default '', |
| | | email varchar(128) NOT NULL default '', |
| | | email varchar(255) NOT NULL default '', |
| | | firstname varchar(128) NOT NULL default '', |
| | | surname varchar(128) NOT NULL default '', |
| | | vcard text NOT NULL default '' |
| | |
| | | DROP INDEX ix_users_username; |
| | | CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host); |
| | | |
| | | CREATE TABLE contacts_tmp ( |
| | | contact_id integer NOT NULL PRIMARY KEY, |
| | | user_id integer NOT NULL default '0', |
| | | changed datetime NOT NULL default '0000-00-00 00:00:00', |
| | | del tinyint NOT NULL default '0', |
| | | name varchar(128) NOT NULL default '', |
| | | email varchar(255) NOT NULL default '', |
| | | firstname varchar(128) NOT NULL default '', |
| | | surname varchar(128) NOT NULL default '', |
| | | vcard text NOT NULL default '' |
| | | ); |
| | | |
| | | INSERT INTO contacts_tmp (contact_id, user_id, changed, del, name, email, firstname, surname, vcard) |
| | | SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts; |
| | | |
| | | DROP TABLE contacts; |
| | | CREATE TABLE contacts ( |
| | | contact_id integer NOT NULL PRIMARY KEY, |
| | | user_id integer NOT NULL default '0', |
| | | changed datetime NOT NULL default '0000-00-00 00:00:00', |
| | | del tinyint NOT NULL default '0', |
| | | name varchar(128) NOT NULL default '', |
| | | email varchar(255) NOT NULL default '', |
| | | firstname varchar(128) NOT NULL default '', |
| | | surname varchar(128) NOT NULL default '', |
| | | vcard text NOT NULL default '' |
| | | ); |
| | | |
| | | INSERT INTO contacts (contact_id, user_id, changed, del, name, email, firstname, surname, vcard) |
| | | SELECT contact_id, user_id, changed, del, name, email, firstname, surname, vcard FROM contacts_tmp; |
| | | |
| | | CREATE INDEX ix_contacts_user_id ON contacts(user_id, email); |
| | | DROP TABLE contacts_tmp; |
| | | |
| | |
| | | quoted_string = '\\x22('+qtext+'|'+quoted_pair+')*\\x22', |
| | | // Use simplified domain matching, because we need to allow Unicode characters here |
| | | // So, e-mail address should be validated also on server side after idn_to_ascii() use |
| | | sub_domain = '[^@]+', |
| | | //domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d', |
| | | //sub_domain = '('+atom+'|'+domain_literal+')', |
| | | domain = '([^@\\x2e]+\\x2e)+[a-z]{2,}', |
| | | word = '('+atom+'|'+quoted_string+')', |
| | | delim = '[,;\s\n]', |
| | | domain = sub_domain+'(\\x2e'+sub_domain+')*', |
| | | local_part = word+'(\\x2e'+word+')*', |
| | | addr_spec = local_part+'\\x40'+domain, |
| | | reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i'); |
| | |
| | | */ |
| | | |
| | | $cid = get_input_value('_cid', RCUBE_INPUT_POST); |
| | | $return_action = empty($cid) ? 'add' : 'show'; |
| | | $return_action = empty($cid) ? 'add' : 'edit'; |
| | | |
| | | // cannot edit record |
| | | if ($CONTACTS->readonly) |
| | | { |
| | | if ($CONTACTS->readonly) { |
| | | $OUTPUT->show_message('contactreadonly', 'error'); |
| | | 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($return_action); |
| | | return; |
| | |
| | | $a_record = array(); |
| | | |
| | | // 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)) |
| | | { |
| | |
| | | 'name' => $contact_arr[1]['name'] |
| | | ); |
| | | |
| | | // Validity checks |
| | | if (empty($contact['email'])) { |
| | | $OUTPUT->show_message('errorsavingcontact', 'error'); |
| | | $OUTPUT->send(); |
| | | } |
| | | else if (!check_email($contact['email'], false)) { |
| | | $OUTPUT->show_message('emailformaterror', 'error', array('email' => $contact['email'])); |
| | | $OUTPUT->send(); |
| | | } |
| | | |
| | | $contact['email'] = idn_to_utf8($contact['email']); |
| | | |
| | | // use email address part for name |
| | |
| | | } |
| | | |
| | | if (!$done) |
| | | $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsavingcontact', 'warning'); |
| | | $OUTPUT->show_message($plugin['message'] ? $plugin['message'] : 'errorsavingcontact', 'error'); |
| | | |
| | | $OUTPUT->send(); |
| | | |