From 565c472918e7f9707cd8d7909ad5dbcc5a921fdf Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Mon, 06 Aug 2012 05:08:58 -0400 Subject: [PATCH] Removed users.alias column, added option ('user_aliases') to use email address from identities as username (#1488581) --- CHANGELOG | 2 + SQL/sqlite.update.sql | 32 ++++++++++++++++ SQL/postgres.update.sql | 3 + program/include/rcube_user.php | 19 ++++++--- SQL/mysql.update.sql | 4 + SQL/postgres.initial.sql | 4 - config/main.inc.php.dist | 3 + SQL/mysql.initial.sql | 7 +-- SQL/sqlite.initial.sql | 3 - SQL/mssql.initial.sql | 7 +-- SQL/mssql.upgrade.sql | 9 ++++ 11 files changed, 72 insertions(+), 21 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 9988d55..53bf30e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ CHANGELOG Roundcube Webmail =========================== +- Removed users.alias column, added option ('user_aliases') + to use email address from identities as username (#1488581) - Removed redundant cache.cache_id column (#1488528) - Fix order of attachments in sent mail (#1488423) - Don't show product version on login screen (can be enabled by config) diff --git a/SQL/mssql.initial.sql b/SQL/mssql.initial.sql index 9aa6e63..85b8e4e 100644 --- a/SQL/mssql.initial.sql +++ b/SQL/mssql.initial.sql @@ -92,7 +92,6 @@ [user_id] [int] IDENTITY (1, 1) NOT NULL , [username] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL , [mail_host] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL , - [alias] [varchar] (128) COLLATE Latin1_General_CI_AI NOT NULL , [created] [datetime] NOT NULL , [last_login] [datetime] NULL , [language] [varchar] (5) COLLATE Latin1_General_CI_AI NULL , @@ -274,6 +273,8 @@ CREATE INDEX [IX_identities_user_id] ON [dbo].[identities]([user_id]) ON [PRIMARY] GO +CREATE INDEX [IX_identities_email] ON [dbo].[identities]([email],[del]) ON [PRIMARY] +GO ALTER TABLE [dbo].[session] ADD CONSTRAINT [DF_session_sess_id] DEFAULT ('') FOR [sess_id], @@ -287,14 +288,10 @@ ALTER TABLE [dbo].[users] ADD CONSTRAINT [DF_users_username] DEFAULT ('') FOR [username], CONSTRAINT [DF_users_mail_host] DEFAULT ('') FOR [mail_host], - CONSTRAINT [DF_users_alias] DEFAULT ('') FOR [alias], CONSTRAINT [DF_users_created] DEFAULT (getdate()) FOR [created] GO CREATE UNIQUE INDEX [IX_users_username] ON [dbo].[users]([username],[mail_host]) ON [PRIMARY] -GO - -CREATE INDEX [IX_users_alias] ON [dbo].[users]([alias]) ON [PRIMARY] GO CREATE UNIQUE INDEX [IX_dictionary_user_language] ON [dbo].[dictionary]([user_id],[language]) ON [PRIMARY] diff --git a/SQL/mssql.upgrade.sql b/SQL/mssql.upgrade.sql index d111ef3..26001e7 100644 --- a/SQL/mssql.upgrade.sql +++ b/SQL/mssql.upgrade.sql @@ -261,4 +261,13 @@ GO ALTER TABLE [dbo].[contacts] ADD CONSTRAINT [DF_contacts_email] DEFAULT ('') FOR [email] GO + +-- Updates from version 0.8 + +ALTER TABLE [dbo].[cache] DROP COLUMN [cache_id] +GO +ALTER TABLE [dbo].[users] DROP COLUMN [alias] +GO +CREATE INDEX [IX_identities_email] ON [dbo].[identities]([email],[del]) ON [PRIMARY] +GO \ No newline at end of file diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql index 46fa2c3..47d9db4 100644 --- a/SQL/mysql.initial.sql +++ b/SQL/mysql.initial.sql @@ -22,14 +22,12 @@ `user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar(128) BINARY NOT NULL, `mail_host` varchar(128) NOT NULL, - `alias` varchar(128) BINARY NOT NULL, `created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00', `last_login` datetime DEFAULT NULL, `language` varchar(5), `preferences` text, PRIMARY KEY(`user_id`), - UNIQUE `username` (`username`, `mail_host`), - INDEX `alias_index` (`alias`) + UNIQUE `username` (`username`, `mail_host`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; @@ -156,7 +154,8 @@ PRIMARY KEY(`identity_id`), CONSTRAINT `user_id_fk_identities` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, - INDEX `user_identities_index` (`user_id`, `del`) + INDEX `user_identities_index` (`user_id`, `del`), + INDEX `email_identities_index` (`email`, `del`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; diff --git a/SQL/mysql.update.sql b/SQL/mysql.update.sql index 3be6589..237aa3e 100644 --- a/SQL/mysql.update.sql +++ b/SQL/mysql.update.sql @@ -242,4 +242,6 @@ -- Updates from version 0.8 -ALTER TABLE cache DROP COLUMN cache_id; +ALTER TABLE `cache` DROP COLUMN `cache_id`; +ALTER TABLE `users` DROP COLUMN `alias`; +ALTER TABLE `identities` ADD INDEX `email_identities_index` (`email`, `del`); diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index a47bec2..f7b2d96 100644 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -20,7 +20,6 @@ user_id integer DEFAULT nextval('user_ids'::text) PRIMARY KEY, username varchar(128) DEFAULT '' NOT NULL, mail_host varchar(128) DEFAULT '' NOT NULL, - alias varchar(128) DEFAULT '' NOT NULL, created timestamp with time zone DEFAULT now() NOT NULL, last_login timestamp with time zone DEFAULT NULL, "language" varchar(5), @@ -28,9 +27,7 @@ CONSTRAINT users_username_key UNIQUE (username, mail_host) ); -CREATE INDEX users_alias_id_idx ON users (alias); - -- -- Table "session" -- Name: session; Type: TABLE; Schema: public; Owner: postgres @@ -81,6 +78,7 @@ ); CREATE INDEX identities_user_id_idx ON identities (user_id, del); +CREATE INDEX identities_email_idx ON identities (email, del); -- diff --git a/SQL/postgres.update.sql b/SQL/postgres.update.sql index a8a9cdd..11ab93b 100644 --- a/SQL/postgres.update.sql +++ b/SQL/postgres.update.sql @@ -180,3 +180,6 @@ ALTER TABLE cache DROP COLUMN cache_id; DROP SEQUENCE cache_ids; + +ALTER TABLE users DROP COLUMN alias; +CREATE INDEX identities_email_idx ON identities (email, del); diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql index a3c38b9..f5b5615 100644 --- a/SQL/sqlite.initial.sql +++ b/SQL/sqlite.initial.sql @@ -80,6 +80,7 @@ ); CREATE INDEX ix_identities_user_id ON identities(user_id, del); +CREATE INDEX ix_identities_email ON identities(email, del); -- -------------------------------------------------------- @@ -92,7 +93,6 @@ user_id integer NOT NULL PRIMARY KEY, username varchar(128) NOT NULL default '', mail_host varchar(128) NOT NULL default '', - alias varchar(128) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', last_login datetime DEFAULT NULL, language varchar(5), @@ -100,7 +100,6 @@ ); CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host); -CREATE INDEX ix_users_alias ON users(alias); -- -------------------------------------------------------- diff --git a/SQL/sqlite.update.sql b/SQL/sqlite.update.sql index ddadde3..72a29e9 100644 --- a/SQL/sqlite.update.sql +++ b/SQL/sqlite.update.sql @@ -346,3 +346,35 @@ CREATE INDEX ix_cache_user_cache_key ON cache(user_id, cache_key); CREATE INDEX ix_cache_created ON cache(created); + +CREATE TABLE tmp_users ( + user_id integer NOT NULL PRIMARY KEY, + username varchar(128) NOT NULL default '', + mail_host varchar(128) NOT NULL default '', + created datetime NOT NULL default '0000-00-00 00:00:00', + last_login datetime DEFAULT NULL, + language varchar(5), + preferences text NOT NULL default '' +); + +INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, language, preferences) + SELECT user_id, username, mail_host, created, last_login, language, preferences FROM users; + +DROP TABLE users; + +CREATE TABLE users ( + user_id integer NOT NULL PRIMARY KEY, + username varchar(128) NOT NULL default '', + mail_host varchar(128) NOT NULL default '', + created datetime NOT NULL default '0000-00-00 00:00:00', + last_login datetime DEFAULT NULL, + language varchar(5), + preferences text NOT NULL default '' +); + +INSERT INTO users (user_id, username, mail_host, created, last_login, language, preferences) + SELECT user_id, username, mail_host, created, last_login, language, preferences FROM tmp_users; + +CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host); + +CREATE INDEX ix_identities_email ON identities(email, del); diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 8f69ca3..58e59ae 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -195,6 +195,9 @@ // set to false if only registered users can use this service $rcmail_config['auto_create_user'] = true; +// Enables possibility to log in using email address from user identities +$rcmail_config['user_aliases'] = false; + // use this folder to store log files (must be writeable for apache user) // This is used by the 'file' log driver. $rcmail_config['log_dir'] = 'logs/'; diff --git a/program/include/rcube_user.php b/program/include/rcube_user.php index 24ded3d..d542152 100644 --- a/program/include/rcube_user.php +++ b/program/include/rcube_user.php @@ -397,15 +397,22 @@ */ static function query($user, $host) { - $dbh = rcube::get_instance()->get_dbh(); + $dbh = rcube::get_instance()->get_dbh(); + $config = rcube::get_instance()->config; // query for matching user name - $query = "SELECT * FROM ".$dbh->table_name('users')." WHERE mail_host = ? AND %s = ?"; - $sql_result = $dbh->query(sprintf($query, 'username'), $host, $user); + $sql_result = $dbh->query("SELECT * FROM " . $dbh->table_name('users') + ." WHERE mail_host = ? AND username = ?", $host, $user); - // query for matching alias - if (!($sql_arr = $dbh->fetch_assoc($sql_result))) { - $sql_result = $dbh->query(sprintf($query, 'alias'), $host, $user); + $sql_arr = $dbh->fetch_assoc($sql_result); + + // username not found, try aliases from identities + if (empty($sql_arr) && $config->get('user_aliases') && strpos($user, '@')) { + $sql_result = $dbh->limitquery("SELECT u.*" + ." FROM " . $dbh->table_name('users') . " u" + ." JOIN " . $dbh->table_name('identities') . " i ON (i.user_id = u.user_id)" + ." WHERE email = ? AND del <> 1", 0, 1, $user); + $sql_arr = $dbh->fetch_assoc($sql_result); } -- Gitblit v1.9.1