diff --git a/install/dist/lib/debian60.lib.php b/install/dist/lib/debian60.lib.php index 981e6cff92a70216656435bddb10a393f01dca54..7889be30fa04490c6f8510cc8366669a2cf90260 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -204,6 +204,35 @@ class installer extends installer_base { chown($config_dir.'/'.$configfile, 'root'); chgrp($config_dir.'/'.$configfile, 'root'); + //* dovecot-sql-lastlogin.conf + $configfile = 'dovecot-sql-lastlogin.conf'; + if(is_file($config_dir.'/'.$configfile)){ + copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~'); + chmod($config_dir.'/'.$configfile.'~', 0400); + } + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot-sql-lastlogin.conf.master', 'tpl/debian6_dovecot-sql-lastlogin.conf.master'); + + if ($conf['mysql']['master_slave_setup'] == 'y') { // Master or single_server setup. + $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content); + $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content); + $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content); + $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content); + $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content); + } + else { // Slave server, push the last_login updates straight to the master. + $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content); + $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content); + $content = str_replace('{mysql_server_database}', $conf['mysql']['master_database'], $content); + $content = str_replace('{mysql_server_host}', $conf['mysql']['master_host'], $content); + $content = str_replace('{mysql_server_port}', $conf['mysql']['master_port'], $content); + } + + wf($config_dir.'/'.$configfile, $content); + + chmod($config_dir.'/'.$configfile, 0640); + chown($config_dir.'/'.$configfile, 'root'); + chgrp($config_dir.'/'.$configfile, 'dovecot'); + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/var/www/*' ignore > /dev/null 2> /dev/null"); diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..95217d2da4b225851964330451a1601a47d96f04 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -0,0 +1,2 @@ + +ALTER TABLE `mail_user` ADD `last_access` timestamp NULL DEFAULT NULL after `disabledoveadm`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 75529ab82b50735e6bd00e22f31d791d430514d4..c9fc8d6144837649b12fe6b49af867ac6aa325f0 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1096,6 +1096,7 @@ CREATE TABLE `mail_user` ( `disablelda` enum('n','y') NOT NULL default 'n', `disablelmtp` enum('n','y') NOT NULL default 'n', `disabledoveadm` enum('n','y') NOT NULL default 'n', + `last_access` itimestamp NULL DEFAULT NULL, `disablequota-status` enum('n','y') NOT NULL default 'n', `disableindexer-worker` enum('n','y') NOT NULL default 'n', `last_quota_notification` date NULL default NULL, diff --git a/install/tpl/debian6_dovecot-sql-lastlogin.conf.master b/install/tpl/debian6_dovecot-sql-lastlogin.conf.master new file mode 100644 index 0000000000000000000000000000000000000000..bf8657ad2a94a47e2b15310adad860840bf047f0 --- /dev/null +++ b/install/tpl/debian6_dovecot-sql-lastlogin.conf.master @@ -0,0 +1,13 @@ +connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} port={mysql_server_port} + +map { + pattern = shared/lastlogin/$email + table = mail_user + username_field = email + value_field = last_access + value_type = uint + + fields { + email = $email + } +} diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 36ae86fa6df7023218ba12d686fdb6a6c964ec38..215224186957b9a9f820a98522d2538630729441 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -38,6 +38,13 @@ plugin { sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 + + last_login_dict = proxy::lastlogin + last_login_key = lastlogin/%u +} + +dict { + lastlogin = mysql:/etc/dovecot/dovecot-sql-lastlogin.conf } service auth { unix_listener /var/spool/postfix/private/auth { @@ -68,12 +75,12 @@ service imap-login { process_limit = 512 } protocol imap { - mail_plugins = $mail_plugins quota imap_quota + mail_plugins = $mail_plugins quota imap_quota last_login auth_verbose = yes } protocol pop3 { pop3_uidl_format = %08Xu%08Xv - mail_plugins = $mail_plugins quota + mail_plugins = $mail_plugins quota last_login auth_verbose = yes } protocol lda { diff --git a/interface/lib/classes/quota_lib.inc.php b/interface/lib/classes/quota_lib.inc.php index 7c5b388536ec9d0a672d9a3e283d2a5d6b7adc97..bef6c151309d36b9bd1fdaecc6ebfcf9dfec67c1 100644 --- a/interface/lib/classes/quota_lib.inc.php +++ b/interface/lib/classes/quota_lib.inc.php @@ -244,6 +244,13 @@ class quota_lib { for($i=0;$ilng('never_accessed_txt'); + } + else { + $emails[$i]['last_access'] = date($app->lng('conf_format_datetime'), $emails[$i]['last_access']); + } + $emails[$i]['name'] = $app->functions->htmlentities($emails[$i]['name']); $emails[$i]['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0); diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index 6024cc69a74e74c977e80715f9e1e787c63e057b..73aea8652a5c72396e0ed86a1f2021f73a0567fa 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -175,4 +175,6 @@ $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be $wb['datalog_changes_close_txt'] = 'Close'; $wb['non_admin_error'] = 'Requires administrator level permissions'; $wb['copy_to_clipboard_txt'] = 'Copy to clipboard'; +$wb['last_accessed_txt'] = 'Last accessed'; +$wb['never_accessed_txt'] = 'Never or unknown'; ?> diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng index 582c5ffe53b222ce8bd434d025bef88826de011f..27a7e6cd01d3e445f4cbc9fa06a8c8130b6082fa 100644 --- a/interface/lib/lang/nl.lng +++ b/interface/lib/lang/nl.lng @@ -174,4 +174,6 @@ $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be $wb['datalog_changes_close_txt'] = 'Sluiten'; $wb['non_admin_error'] = 'Requires administrator level permissions'; $wb['copy_to_clipboard_txt'] = 'Kopieer naar klembord'; +$wb['last_accessed_txt'] = 'Laatst gebruikt'; +$wb['never_accessed_txt'] = 'Niet of onbekend'; ?> diff --git a/interface/web/dashboard/dashlets/mailquota.php b/interface/web/dashboard/dashlets/mailquota.php index a9434e58eaac846087c77738d9d131ebe4d51abe..337d06645992d65706de6b530dfbc76ea3bde8ed 100644 --- a/interface/web/dashboard/dashlets/mailquota.php +++ b/interface/web/dashboard/dashlets/mailquota.php @@ -14,6 +14,7 @@ class dashlet_mailquota { $wb = array(); $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dashlet_mailquota.lng'; if(is_file($lng_file)) include $lng_file; + $wb['last_accessed_txt'] = $app->lng('last_accessed_txt'); $tpl->setVar($wb); $emails = $app->quota_lib->get_mailquota_data( ($_SESSION["s"]["user"]["typ"] != 'admin') ? $_SESSION['s']['user']['client_id'] : null); @@ -27,6 +28,7 @@ class dashlet_mailquota { unset($email); // email username is quoted in quota.lib already, so no htmlentities here to prevent double encoding //$emails = $app->functions->htmlentities($emails); + $email['last_access'] = date($app->lng('conf_format_datetime'), $email['last_access']); $tpl->setloop('mailquota', $emails); $has_mailquota = isset($emails[0]['used']); } diff --git a/interface/web/dashboard/dashlets/templates/mailquota.htm b/interface/web/dashboard/dashlets/templates/mailquota.htm index b30815456dcaec4fd5d55d8d71b3baabb998b5c3..a01fd41910a0204544f2b2313e819a43f352a330 100644 --- a/interface/web/dashboard/dashlets/templates/mailquota.htm +++ b/interface/web/dashboard/dashlets/templates/mailquota.htm @@ -6,6 +6,7 @@ {tmpl_var name='email_txt'} {tmpl_var name='name_txt'} {tmpl_var name='used_txt'} + {tmpl_var name='last_accessed_txt'} {tmpl_var name='quota_txt'} @@ -15,6 +16,7 @@ {tmpl_var name='email'} {tmpl_var name='name'} {tmpl_var name='used'} + {tmpl_var name='last_access'} {tmpl_var name='quota'} {tmpl_if name="quota_raw" op="!=" value="-1"}
diff --git a/interface/web/mail/list/mail_user.list.php b/interface/web/mail/list/mail_user.list.php index 3e020ea603a9db377dbfacf1d467043db96a62a9..0ca521c2703ca0bee94b467dcc80e44a3779afd3 100644 --- a/interface/web/mail/list/mail_user.list.php +++ b/interface/web/mail/list/mail_user.list.php @@ -133,5 +133,13 @@ $liste["item"][] = array( 'field' => "disablepop3", 'suffix' => "", 'width' => "", 'value' => array('n' => $app->lng('yes_txt'), 'y' => $app->lng('no_txt'))); +$liste["item"][] = array( 'field' => "last_access", + 'datatype' => "DATE", + 'formtype' => "TEXT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => ""); ?> diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 975133fdc47037c50f2fe5a107341164ac40c1af..560cc7408a0c7d16127f136c818b6e05a404119b 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -136,6 +136,13 @@ class page_action extends tform_actions { $app->tpl->setVar("enable_custom_login", 0); } + if (!empty($this->dataRecord['last_access'])) { + $app->tpl->setVar("last_access", date($app->lng('conf_format_datetime'), $this->dataRecord['last_access'])); + } + else { + $app->tpl->setVar("last_access", $app->lng('never_accessed_txt')); + } + $csrf_token = $app->auth->csrf_token_get('mail_user_del'); $app->tpl->setVar('_csrf_id', $csrf_token['csrf_id']); $app->tpl->setVar('_csrf_key', $csrf_token['csrf_key']); diff --git a/interface/web/mail/templates/mail_user_list.htm b/interface/web/mail/templates/mail_user_list.htm index 12659260acf399c891acb726c32b0fbc28a8f7bc..e2ff3614a09efc798cd7bbbe47412ce9e195ac8a 100644 --- a/interface/web/mail/templates/mail_user_list.htm +++ b/interface/web/mail/templates/mail_user_list.htm @@ -61,7 +61,7 @@ - {tmpl_var name="email"} + {tmpl_var name='last_accessed_txt'}: {tmpl_var name='last_access'}">{tmpl_var name="email"} {tmpl_var name="login"} {tmpl_var name="name"} {tmpl_var name="autoresponder"} diff --git a/interface/web/mail/templates/mail_user_mailbox_edit.htm b/interface/web/mail/templates/mail_user_mailbox_edit.htm index 5dd5e50a90424e0e3b96b1305c905f497739bfe0..b22beda49c29fb6e45421751b85834a43ac2db89 100644 --- a/interface/web/mail/templates/mail_user_mailbox_edit.htm +++ b/interface/web/mail/templates/mail_user_mailbox_edit.htm @@ -44,7 +44,10 @@
-
+ + {tmpl_var name='last_accessed_txt'}: {tmpl_var name='last_access'} +
+