diff --git a/CHANGELOG b/CHANGELOG index b265b1053..f2dcaded7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,11 +1,39 @@ CHANGELOG Roundcube Webmail =========================== +- Support contacts import in GMail CSV format +- Added namespace filter in Folder Manager +- Added folder searching in Folder Manager +- Added config option/user preference to disable saving messages in localStorage (#1489979) +- Added config option 'imap_log_session' to enable Roundcube <-> IMAP session ID logging +- Added config option 'log_session_id' to control the lengh of the session identifer in logs +- Implemented 'storage_connected' API hook after successful IMAP login (#1490025) +- Intergrate Net_LDAP3 and rcube_ldap_generic classes +- Add option (disabled_actions) to disable UI elements/actions (#1489638) +- Support password encryption using openssl extension (#1489989) +- Create/rename groups in UI dialogs (#1489951) +- Added 'contact_search_name' option to define autocompletion entry format +- Display quota information for current folder not INBOX only (#1487993) +- Support images in HTML signatures (#1488676) +- Display full quota information in popup (#1485769, #1486604) +- Mail compose: Selecting contact inserts recipient to previously focused input - to/cc/bcc accordingly (#1489684) +- Add option to set default message list mode - default_list_mode (#1487312) +- Close "no subject" prompt with Enter key (#1489580) +- Add config option to specify IMAP connection socket parameters - imap_conn_options (#1489948) +- Password: Add option to force new users to change their password (#1486884) +- Improve support for screen readers and assistive technology using WCAG 2.0 and WAI ARIA standards +- Enable basic keyboard navigation throughout the UI (#1487845) +- Select/scroll to previously selected message when returning from message page (#1489023) +- Display a warning if popup window was blocked (#1489618) +- Remove (was: ...) from message subject on reply (#1489375) +- Update to TinyMCE 4.1 (#1489057) +- Enable autolink plugin in TinyMCE (#1488845) - Support image operations with Imagick extension (#1489734) - Support upload progress with session.upload_progress and PECL uploadprogress module (#1488702) - Make identity name field optional (#1489510) - Utility script to remove user records from the local database - Plugin API: Added message_saved hook (#1489752) +- Plugin API: Added imap_search_before hook - Support messages import from zip archives - Zipdownload: Added mbox format support (#1486069) - Drop support for IE6, move IE7/IE8 support to legacy_browser plugin @@ -16,9 +44,51 @@ CHANGELOG Roundcube Webmail - Set In-Reply-To and References for forwarded messages (#1489593) - Removed redundant default_folders config option (#1489737) - Implemented IMAP SPECIAL-USE extension support [RFC6154] (#1487830) +- Optimize some framed pages content for better performance (#1489792) +- Improve text messages display and conversion to HTML (#1488937) +- Don't remove links when html signature is converted to text (#1489621) +- Fix mbox files import +- Fix some mime-type to extension mapping checks in Installer (#1489983) +- Fix errors when using localStorage in Safari's private browsing mode (#1489996) +- Fix bug where $Forwarded flag was being set even if server didn't support it (#1490000) +- Fix various iCloud vCard issues, added fallback for external photos (#1489993) +- Fix invalid Content-Type header when send_format_flowed=false (#1489992) +- Fix errors when adding/updating contacts in active search (#1490015) +- Fix incorrect thumbnail rotation with GD and exif orientation data (#1490029) +- Fix contacts list update after adding/deleting/moving a contact (#1490028, #1490033) +- Fix handling of email addresses with quoted domain part (#1490040) +- Fix comm_path update on task switch (#1490041) + +RELEASE 1.0.2 +------------- +- Fix storing unsaved drafts in localStorage (#1489818) +- Add configurable LDAP_OPT_DEREF option (#1489864) +- Fix so when switching editor mode original version of signature is used (#1488849) +- Fix unintentional draft autosave request if autosave is disabled (#1489882) +- Fix malformed References: header in send/saved mail (#1489891) +- Fix handling unicode characters in links (#1489898) +- Fix incorrect handling of HTML comments in messages sanitization code (#1489904) +- Fix so current page is reset on list-mode change (#1489907) +- Fix so responses menu hides on click in classic skin (#1489915) +- Fix unintentional line-height style modification in HTML messages (#1489917) +- Fix broken normalize_string(), add support for ISO-8859-2 (#1489918) +- Support csv contacts import in German localization (#1489920) +- Fix so message list and counters are updated when a message is opened in new window (#1489919) +- Fix malformed recipient name when composing a message by clicking on mailto link (#1489942) +- Fix list reload after sending message in another window (#1489931) +- Fix so address format errors are ignored when saving a draft (#1489954) +- Fix incorrect label translation in return receipt (#1489963) +- Fix security issue in delete-response action - allow only ajax request +- Fix Delete button state after deleting identity/response (#1489972) +- Fix bug where contacts with no email address were listed on compose addressbook (#1489970) +- Fix images import from various vCard formats (#1489977) +- Fix sorting messages by size on servers without SORT capability (#1489981) + +RELEASE 1.0.1 +------------- - Support 'error' and 'body_file' return attribs in 'message_before_send' hook (#1489595) - Apply user-specific replacements to group's base_dn property (#1489779) -- Fix mbox files import +- Fix missing email address when importing contacts from outlook csv (#1489830) - Fix bug where "With attachment" option in search filter wasn't selected after return from mail view (#1489774) - Fix "washing" of unicoded style attributes (#1489777) - Fix unintentional redirect from compose page in Webkit browsers (#1489789) diff --git a/INSTALL b/INSTALL index abb6bbd7d..9ab791112 100644 --- a/INSTALL +++ b/INSTALL @@ -15,7 +15,7 @@ REQUIREMENTS - PCRE, DOM, JSON, XML, Session, Sockets (required) - PHP Data Objects (PDO) with driver for either MySQL, PostgreSQL or SQLite (required) - Libiconv, Zip (recommended) - - Fileinfo, Mcrypt, mbstring (optional) + - OpenSSL, Fileinfo, Mcrypt, mbstring (optional) * PEAR packages distributed with Roundcube or external: - Mail_Mime 1.8.1 or newer - Mail_mimeDecode 1.5.5 or newer @@ -35,7 +35,7 @@ REQUIREMENTS - magic_quotes_runtime disabled - magic_quotes_sybase disabled - register_globals disabled (PHP < 5.4) -* PHP compiled with OpenSSL to connect to IMAPS and to use the spell checker +* PHP compiled with OpenSSL to use secure (tls/ssl) connections and to use the spell checker * A MySQL (4.0.8 or newer), PostgreSQL, MS SQL Server (2005 or newer) database engine or SQLite support in PHP * One of the above databases with permission to create tables diff --git a/README.md b/README.md index 04b4d8fd9..00ee0457d 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ an IMAP library derived from [IlohaMail][iloha] the [TinyMCE][tinymce] rich text editor, [Googiespell][googiespell] library for spell checking or the [WASHTML][washtml] sanitizer by Frederic Motte. -The current default skin uses icons designed by Stephen Horlander and [Kevin -Gerich][kmgerich] for Mozilla.org. +The current default skin 'Larry' was kindly created by FLINT / Büro für +Gestaltung, Berne, Switzerland. INSTALLATION diff --git a/bin/update.sh b/bin/update.sh index 91af6413d..f0c6d2f6c 100755 --- a/bin/update.sh +++ b/bin/update.sh @@ -157,7 +157,7 @@ if ($RCI->configured) { if ($RCI->config['db_dsnw']) { echo "Executing database schema update.\n"; system("php " . INSTALL_PATH . "bin/updatedb.sh --package=roundcube --version=" . $opts['version'] - . " --dir=" . INSTALL_PATH . DIRECTORY_SEPARATOR . "SQL", $res); + . " --dir=" . INSTALL_PATH . "SQL", $res); $success = !$res; } diff --git a/bin/updatedb.sh b/bin/updatedb.sh index daee6e835..964bc184c 100755 --- a/bin/updatedb.sh +++ b/bin/updatedb.sh @@ -116,7 +116,7 @@ if (empty($version)) { $version = 2012080700; } -$dir = $opts['dir'] . DIRECTORY_SEPARATOR . $DB->db_provider; +$dir = $opts['dir'] . '/' . $DB->db_provider; if (!file_exists($dir)) { rcube::raise_error("DDL Upgrade files for " . $DB->db_provider . " driver not found.", false, true); } @@ -133,7 +133,7 @@ sort($result, SORT_NUMERIC); foreach ($result as $v) { echo "Updating database schema ($v)... "; - $error = update_db_schema($opts['package'], $v, $dir . DIRECTORY_SEPARATOR . "$v.sql"); + $error = update_db_schema($opts['package'], $v, "$dir/$v.sql"); if ($error) { echo "[FAILED]\n"; diff --git a/composer.json-dist b/composer.json-dist index e7462038d..7791ca907 100644 --- a/composer.json-dist +++ b/composer.json-dist @@ -3,14 +3,51 @@ "description": "The Roundcube Webmail suite", "license": "GPL-3.0+", "repositories": [ + { + "type": "pear", + "url": "http://pear.php.net/" + }, { "type": "composer", "url": "http://plugins.roundcube.net/" + }, + { + "type": "vcs", + "url": "git@github.com:roundcube/sample-plugin.git" + }, + { + "type": "vcs", + "url": "git://git.kolab.org/git/pear/Net_LDAP3" + }, + { + "type": "package", + "package": { + "name": "Net_SMTP", + "version": "dev-master", + "source": { + "url": "http://github.com/pear/Net_SMTP", + "type": "git", + "reference": "master" + } + } } ], "require": { "php": ">=5.3.0", - "roundcube/plugin-installer": ">=0.1.3" + "roundcube/plugin-installer": ">=0.1.3", + "pear/mail_mime": ">=1.8.9", + "pear/mail_mime-decode": ">=1.5.5", + "pear/net_smtp": "dev-master", + "pear-pear.php.net/auth_sasl": ">=1.0.6", + "pear-pear.php.net/net_idna2": ">=0.1.1", + "pear-pear.php.net/net_sieve": ">=1.3.2", + "pear-pear.php.net/net_ldap2": ">=2.0.12", + "kolab/Net_LDAP3": "dev-master", + "patchwork/utf8": "1.2.x" + }, + "require-dev": { + "pear-pear.php.net/crypt_gpg": "*", + "phpunit/phpunit": "*" }, "minimum-stability": "dev" } diff --git a/config/defaults.inc.php b/config/defaults.inc.php index a76eec6dc..5e9a2bbdd 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -66,6 +66,10 @@ $config['log_driver'] = 'file'; // (read http://php.net/manual/en/function.date.php for all format characters) $config['log_date_format'] = 'd-M-Y H:i:s O'; +// length of the session ID to prepend each log line with +// set to 0 to avoid session IDs being logged. +$config['log_session_id'] = 8; + // Syslog ident string to use, if using the 'syslog' log driver. $config['syslog_id'] = 'roundcube'; @@ -123,6 +127,27 @@ $config['default_port'] = 143; // best server supported one) $config['imap_auth_type'] = null; +// IMAP socket context options +// See http://php.net/manual/en/context.ssl.php +// The example below enables server certificate validation +//$config['imap_conn_options'] = array( +// 'ssl' => array( +// 'verify_peer' => true, +// 'verify_depth' => 3, +// 'cafile' => '/etc/openssl/certs/ca.crt', +// ), +// ); +$config['imap_conn_options'] = null; + +// IMAP connection timeout, in seconds. Default: 0 (use default_socket_timeout) +$config['imap_timeout'] = 0; + +// Optional IMAP authentication identifier to be used as authorization proxy +$config['imap_auth_cid'] = null; + +// Optional IMAP authentication password to be used for imap_auth_cid +$config['imap_auth_pw'] = null; + // If you know your imap's folder delimiter, you can specify it here. // Otherwise it will be determined automatically $config['imap_delimiter'] = null; @@ -160,19 +185,17 @@ $config['imap_force_ns'] = false; // Note: Because the list is cached, re-login is required after change. $config['imap_disabled_caps'] = array(); -// IMAP connection timeout, in seconds. Default: 0 (use default_socket_timeout) -$config['imap_timeout'] = 0; - -// Optional IMAP authentication identifier to be used as authorization proxy -$config['imap_auth_cid'] = null; - -// Optional IMAP authentication password to be used for imap_auth_cid -$config['imap_auth_pw'] = null; +// Log IMAP session identifers after each IMAP login. +// This is used to relate IMAP session with Roundcube user sessions +$config['imap_log_session'] = false; // Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache'. $config['imap_cache'] = null; // Enables messages cache. Only 'db' cache is supported. +// This requires an IMAP server that supports QRESYNC and CONDSTORE +// extensions (RFC7162). See synchronize() in program/lib/Roundcube/rcube_imap_cache.php +// for further info, or if you experience syncing problems. $config['messages_cache'] = false; // Lifetime of IMAP indexes cache. Possible units: s, m, h, d, w @@ -241,13 +264,14 @@ $config['smtp_timeout'] = 0; // requires 'smtp_timeout' to be non zero. // $config['smtp_conn_options'] = array( // 'ssl' => array( -// 'verify_peer' => true, -// 'verify_depth => 3, -// 'cafile' => '/etc/openssl/certs/ca.crt', +// 'verify_peer' => true, +// 'verify_depth' => 3, +// 'cafile' => '/etc/openssl/certs/ca.crt', // ), // ); $config['smtp_conn_options'] = null; + // ---------------------------------- // LDAP // ---------------------------------- @@ -269,6 +293,9 @@ $config['enable_installer'] = false; // don't allow these settings to be overriden by the user $config['dont_override'] = array(); +// List of disabled UI elements/actions +$config['disabled_actions'] = array(); + // define which settings should be listed under the 'advanced' block // which is hidden by default $config['advanced_prefs'] = array(); @@ -465,6 +492,10 @@ $config['mdn_use_from'] = false; // 4 - one identity with possibility to edit only signature $config['identities_level'] = 0; +// Maximum size of uploaded image in kilobytes +// Images (in html signatures) are stored in database as data URIs +$config['identity_image_size'] = 64; + // Mimetypes supported by the browser. // attachments of these types will open in a preview window // either a comma-separated list or an array: 'text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/pdf' @@ -784,6 +815,8 @@ $config['ldap_public']['Verisign'] = array( 'sizelimit' => '0', // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. 'timelimit' => '0', // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. 'referrals' => false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups + 'dereference' => 0, // Sets the LDAP_OPT_DEREF option. One of: LDAP_DEREF_NEVER, LDAP_DEREF_SEARCHING, LDAP_DEREF_FINDING, LDAP_DEREF_ALWAYS + // Used where addressbook contains aliases to objects elsewhere in the LDAP tree. // definition for contact groups (uncomment if no groups are supported) // for the groups base_dn, the user replacements %fu, %u, $d and %dc work as for base_dn (see above) @@ -855,6 +888,11 @@ $config['address_template'] = '{street}
{locality} {zipcode}
{country} { // Note: For LDAP sources fuzzy_search must be enabled to use 'partial' or 'prefix' mode $config['addressbook_search_mode'] = 0; +// Template of contact entry on the autocompletion list. +// You can use contact fields as: name, email, organization, department, etc. +// See program/steps/addressbook/func.inc for a list +$config['contact_search_name'] = '{name} <{email}>'; + // ---------------------------------- // USER PREFERENCES // ---------------------------------- @@ -909,6 +947,10 @@ $config['compose_extwin'] = false; // 0 - never, 1 - always, 2 - on reply to HTML message, 3 - on forward or reply to HTML message $config['htmleditor'] = 0; +// save copies of compose messages in the browser's local storage +// for recovery in case of browser crashes and session timeout. +$config['compose_save_localstorage'] = true; + // show pretty dates as standard $config['prettydate'] = true; @@ -960,9 +1002,12 @@ $config['check_all_folders'] = false; // If true, after message delete/move, the next message will be displayed $config['display_next'] = true; -// 0 - Do not expand threads -// 1 - Expand all threads automatically -// 2 - Expand only threads with unread messages +// Default messages listing mode. One of 'threads' or 'list'. +$config['default_list_mode'] = 'list'; + +// 0 - Do not expand threads +// 1 - Expand all threads automatically +// 2 - Expand only threads with unread messages $config['autoexpand_threads'] = 0; // When replying: @@ -987,7 +1032,7 @@ $config['force_7bit'] = false; // Defaults of the search field configuration. // The array can contain a per-folder list of header fields which should be considered when searching // The entry with key '*' stands for all folders which do not have a specific list set. -// Please note that folder names should to be in sync with $config['default_folders'] +// Please note that folder names should to be in sync with $config['*_mbox'] options $config['search_mods'] = null; // Example: array('*' => array('subject'=>1, 'from'=>1), 'Sent' => array('subject'=>1, 'to'=>1)); // Defaults of the addressbook search field configuration. diff --git a/index.php b/index.php index 239dc004f..9c87f9a40 100644 --- a/index.php +++ b/index.php @@ -44,6 +44,7 @@ $RCMAIL = rcmail::get_instance($GLOBALS['env']); // Make the whole PHP output non-cacheable (#1487797) $RCMAIL->output->nocacheing_headers(); +$RCMAIL->output->common_headers(); // turn on output buffering ob_start(); @@ -188,7 +189,7 @@ else if ($RCMAIL->task == 'logout' && isset($_SESSION['user_id']) } // check session and auth cookie -else if ($RCMAIL->task != 'login' && $_SESSION['user_id'] && $RCMAIL->action != 'send') { +else if ($RCMAIL->task != 'login' && $_SESSION['user_id']) { if (!$RCMAIL->session->check_auth()) { $RCMAIL->kill_session(); $session_error = true; @@ -211,7 +212,7 @@ if (empty($RCMAIL->user->ID)) { $OUTPUT->show_message('sessionerror', 'error', null, true, -1); } - if ($OUTPUT->ajax_call || !empty($_REQUEST['_framed'])) { + if ($OUTPUT->ajax_call || $OUTPUT->get_env('framed')) { $OUTPUT->command('session_error', $RCMAIL->url(array('_err' => 'session'))); $OUTPUT->send('iframe'); } @@ -259,6 +260,14 @@ else { 'message' => "Referer check failed"), true, true); } } + + // check access to disabled actions + $disabled_actions = (array) $RCMAIL->config->get('disabled_actions'); + if (in_array($RCMAIL->task . '.' . ($RCMAIL->action ?: 'index'), $disabled_actions)) { + rcube::raise_error(array( + 'code' => 403, 'type' => 'php', + 'message' => "Action disabled"), true, true); + } } // we're ready, user is authenticated and the request is safe @@ -286,13 +295,14 @@ if (is_file($incfile = INSTALL_PATH . 'program/steps/'.$RCMAIL->task.'/func.inc' $redirects = 0; $incstep = null; while ($redirects < 5) { // execute a plugin action - if ($RCMAIL->plugins->is_plugin_task($RCMAIL->task)) { - if (!$RCMAIL->action) $RCMAIL->action = 'index'; - $RCMAIL->plugins->exec_action($RCMAIL->task.'.'.$RCMAIL->action); + if (preg_match('/^plugin\./', $RCMAIL->action)) { + $RCMAIL->plugins->exec_action($RCMAIL->action); break; } - else if (preg_match('/^plugin\./', $RCMAIL->action)) { - $RCMAIL->plugins->exec_action($RCMAIL->action); + // execute action registered to a plugin task + else if ($RCMAIL->plugins->is_plugin_task($RCMAIL->task)) { + if (!$RCMAIL->action) $RCMAIL->action = 'index'; + $RCMAIL->plugins->exec_action($RCMAIL->task.'.'.$RCMAIL->action); break; } // try to include the step file diff --git a/installer/check.php b/installer/check.php index 31b4c2955..6974d3720 100644 --- a/installer/check.php +++ b/installer/check.php @@ -28,10 +28,13 @@ $optional_php_exts = array( ); $required_libs = array( - 'PEAR' => 'PEAR.php', - 'Net_SMTP' => 'Net/SMTP.php', - 'Net_IDNA2' => 'Net/IDNA2.php', - 'Mail_mime' => 'Mail/mime.php', + 'PEAR' => 'pear.php.net', + 'Auth_SASL' => 'pear.php.net', + 'Net_SMTP' => 'pear.php.net', + 'Net_IDNA2' => 'pear.php.net', + 'Net_LDAP3' => 'git.kolab.org', + 'Mail_mime' => 'pear.php.net', + 'Mail_mimeDecode' => 'pear.php.net', ); $ini_checks = array( @@ -160,13 +163,13 @@ if (empty($found_db_driver)) { $file) { +foreach ($required_libs as $classname => $vendor) { @include_once $file; if (class_exists($classname)) { $RCI->pass($classname); } else { - $RCI->fail($classname, "Failed to load $file", $source_urls[$classname]); + $RCI->fail($classname, "Failed to load class $classname from $vendor", $source_urls[$classname]); } echo "
"; } diff --git a/installer/index.php b/installer/index.php index 044eb3f57..b93ad2f94 100644 --- a/installer/index.php +++ b/installer/index.php @@ -3,9 +3,9 @@ /* +-------------------------------------------------------------------------+ | Roundcube Webmail setup tool | - | Version 0.9-git | + | Version 1.1-git | | | - | Copyright (C) 2009-2013, The Roundcube Dev Team | + | Copyright (C) 2009-2014, The Roundcube Dev Team | | | | This program is free software: you can redistribute it and/or modify | | it under the terms of the GNU General Public License (with exceptions | @@ -49,6 +49,11 @@ $include_path .= ini_get('include_path'); set_include_path($include_path); +// include composer autoloader (if available) +if (@file_exists(INSTALL_PATH . 'vendor/autoload.php')) { + require INSTALL_PATH . 'vendor/autoload.php'; +} + require_once 'Roundcube/bootstrap.php'; // deprecated aliases (to be removed) require_once 'bc.php'; diff --git a/installer/test.php b/installer/test.php index b1b67e57d..72c7a1f76 100644 --- a/installer/test.php +++ b/installer/test.php @@ -210,7 +210,6 @@ if ($db_working) {

Test filetype detection

-

check_mime_detection()) { @@ -225,12 +224,9 @@ if ($errors = $RCI->check_mime_detection()) { } else { $RCI->pass('Fileinfo/mime_content_type configuration'); + echo "
"; } -?> -

-

-check_mime_extensions()) { $RCI->fail('Mimetype to file extension mapping'); @@ -239,6 +235,7 @@ if ($errors = $RCI->check_mime_extensions()) { } else { $RCI->pass('Mimetype to file extension mapping'); + echo "
"; } ?> diff --git a/plugins/acl/acl.js b/plugins/acl/acl.js index acea60a4c..e59ac72a2 100644 --- a/plugins/acl/acl.js +++ b/plugins/acl/acl.js @@ -24,11 +24,7 @@ if (window.rcmail) { if (e.field.id != 'acluser') return; - var value = e.insert; - // get UID from the entry value - if (value.match(/\s*\(([^)]+)\)[, ]*$/)) - value = RegExp.$1; - e.field.value = value; + e.field.value = e.insert.replace(/[ ,;]+$/, ''); }); } } @@ -140,15 +136,16 @@ rcube_webmail.prototype.acl_mode_switch = function(elem) rcube_webmail.prototype.acl_list_init = function() { var method = this.env.acl_advanced ? 'addClass' : 'removeClass'; + $('#acl-switch')[method]('selected'); $(this.gui_objects.acltable)[method]('advanced'); this.acl_list = new rcube_list_widget(this.gui_objects.acltable, - {multiselect:true, draggable:false, keyboard:true, toggleselect:true}); - this.acl_list.addEventListener('select', function(o) { rcmail.acl_list_select(o); }); - this.acl_list.addEventListener('dblclick', function(o) { rcmail.acl_list_dblclick(o); }); - this.acl_list.addEventListener('keypress', function(o) { rcmail.acl_list_keypress(o); }); - this.acl_list.init(); + {multiselect: true, draggable: false, keyboard: true}); + this.acl_list.addEventListener('select', function(o) { rcmail.acl_list_select(o); }) + .addEventListener('dblclick', function(o) { rcmail.acl_list_dblclick(o); }) + .addEventListener('keypress', function(o) { rcmail.acl_list_keypress(o); }) + .init(); } // ACL table row selection handler @@ -228,16 +225,23 @@ rcube_webmail.prototype.acl_add_row = function(o, sel) row = $('thead > tr', table).clone(); // Update new row - $('td', row).map(function() { - var r, cl = this.className.replace(/^acl/, ''); + $('th', row).map(function() { + var td = $(''), + title = $(this).attr('title'), + cl = this.className.replace(/^acl/, ''); + + if (title) + td.attr('title', title); if (items && items[cl]) cl = items[cl]; if (cl == 'user') - $(this).text(o.username); + td.addClass(cl).append($('').text(o.username)); else - $(this).addClass(rcmail.acl_class(o.acl, cl)).text(''); + td.addClass(this.className + ' ' + rcmail.acl_class(o.acl, cl)).text(''); + + $(this).replaceWith(td); }); row.attr('id', 'rcmrow'+id); @@ -281,10 +285,10 @@ rcube_webmail.prototype.acl_init_form = function(id) { var ul, row, td, val = '', type = 'user', li_elements, body = $('body'), adv_ul = $('#advancedrights'), sim_ul = $('#simplerights'), - name_input = $('#acluser'); + name_input = $('#acluser'), type_list = $('#usertype'); if (!this.acl_form) { - var fn = function () { $('input[value=user]').prop('checked', true); }; + var fn = function () { $('input[value="user"]').prop('checked', true); }; name_input.click(fn).keypress(fn); } @@ -329,23 +333,24 @@ rcube_webmail.prototype.acl_init_form = function(id) this.acl_id = id; - var me = this, inst = window.rcmail, body = document.body; - var buttons = {}; - buttons[rcmail.gettext('save')] = function(e) { inst.command('acl-save'); }; - buttons[rcmail.gettext('cancel')] = function(e) { inst.command('acl-cancel'); }; + var buttons = {}, me = this, body = document.body; + + buttons[this.gettext('save')] = function(e) { me.command('acl-save'); }; + buttons[this.gettext('cancel')] = function(e) { me.command('acl-cancel'); }; // display it as popup - this.acl_popup = rcmail.show_popup_dialog( + this.acl_popup = this.show_popup_dialog( '

 
', - id ? rcmail.gettext('acl.editperms') : rcmail.gettext('acl.newuser'), + id ? this.gettext('acl.editperms') : this.gettext('acl.newuser'), buttons, { modal: true, - closeOnEscape: false, + closeOnEscape: true, close: function(e, ui) { - (rcmail.is_framed() ? parent.rcmail : rcmail).ksearch_hide(); + (me.is_framed() ? parent.rcmail : me).ksearch_hide(); me.acl_form.appendTo(body).hide(); $(this).remove(); + window.focus(); // focus iframe } } ); @@ -354,9 +359,8 @@ rcube_webmail.prototype.acl_init_form = function(id) if (type == 'user') name_input.focus(); - - // unfocus the list, make backspace key in name input field working - this.acl_list.blur(); + else + $('input:checked', type_list).focus(); } // Returns class name according to ACL comparision result diff --git a/plugins/acl/acl.php b/plugins/acl/acl.php index d7e50f978..33bd91e22 100644 --- a/plugins/acl/acl.php +++ b/plugins/acl/acl.php @@ -88,6 +88,7 @@ class acl extends rcube_plugin $search = rcube_utils::get_input_value('_search', rcube_utils::INPUT_GPC, true); $reqid = rcube_utils::get_input_value('_reqid', rcube_utils::INPUT_GPC); $users = array(); + $keys = array(); if ($this->init_ldap()) { $max = (int) $this->rc->config->get('autocomplete_max', 15); @@ -105,15 +106,37 @@ class acl extends rcube_plugin } if ($user) { - if ($record['name']) - $user = $record['name'] . ' (' . $user . ')'; - + $display = rcube_addressbook::compose_search_name($record); + $user = array('name' => $user, 'display' => $display); $users[] = $user; + $keys[] = $display ?: $user['name']; + } + } + + if ($this->rc->config->get('acl_groups')) { + $prefix = $this->rc->config->get('acl_group_prefix'); + $result = $this->ldap->list_groups($search, $mode); + + foreach ($result as $record) { + $group = $record['name']; + + if ($group) { + $users[] = array('name' => ($prefix ? $prefix : '') . $group, 'display' => $group); + $keys[] = $group; + } } } } - sort($users, SORT_LOCALE_STRING); + if (count($users)) { + // sort users index + asort($keys, SORT_LOCALE_STRING); + // re-sort users according to index + foreach ($keys as $idx => $val) { + $keys[$idx] = $users[$idx]; + } + $users = array_values($keys); + } $this->rc->output->command('ksearch_query_results', $users, $search, $reqid); $this->rc->output->send(); @@ -286,7 +309,7 @@ class acl extends rcube_plugin $textfield = new html_inputfield($attrib); - $fields['user'] = html::label(array('for' => 'iduser'), $this->gettext('username')) + $fields['user'] = html::label(array('for' => $attrib['id']), $this->gettext('username')) . ' ' . $textfield->show(); // Add special entries @@ -401,7 +424,7 @@ class acl extends rcube_plugin } $table->add_row(array('id' => 'rcmrow'.$userid)); - $table->add('user', rcube::Q($user)); + $table->add('user', html::a(array('id' => 'rcmlinkrow'.$userid), rcube::Q($user))); foreach ($items as $key => $right) { $in = $this->acl_compare($userrights, $right); @@ -439,9 +462,13 @@ class acl extends rcube_plugin $result = 0; foreach ($users as $user) { - $user = trim($user); + $user = trim($user); + $prefix = $this->rc->config->get('acl_groups') ? $this->rc->config->get('acl_group_prefix') : ''; - if (!empty($this->specials) && in_array($user, $this->specials)) { + if ($prefix && strpos($user, $prefix) === 0) { + $username = $user; + } + else if (!empty($this->specials) && in_array($user, $this->specials)) { $username = $this->gettext($user); } else if (!empty($user)) { @@ -653,8 +680,9 @@ class acl extends rcube_plugin */ private function init_ldap() { - if ($this->ldap) + if ($this->ldap) { return $this->ldap->ready; + } // get LDAP config $config = $this->rc->config->get('acl_users_source'); @@ -666,7 +694,7 @@ class acl extends rcube_plugin // not an array, use configured ldap_public source if (!is_array($config)) { $ldap_config = (array) $this->rc->config->get('ldap_public'); - $config = $ldap_config[$config]; + $config = $ldap_config[$config]; } $uid_field = $this->rc->config->get('acl_users_field', 'mail'); @@ -686,18 +714,17 @@ class acl extends rcube_plugin } // add UID field to fieldmap, so it will be returned in a record with name - $config['fieldmap'] = array( - 'name' => $name_field, - 'uid' => $uid_field, - ); + $config['fieldmap']['name'] = $name_field; + $config['fieldmap']['uid'] = $uid_field; // search in UID and name fields - $config['search_fields'] = array_values($config['fieldmap']); + $config['search_fields'] = array_values($config['fieldmap']); $config['required_fields'] = array($uid_field); // set search filter - if ($filter) + if ($filter) { $config['filter'] = $filter; + } // disable vlv $config['vlv'] = false; diff --git a/plugins/acl/composer.json b/plugins/acl/composer.json index 923b0ae7e..20859eabf 100644 --- a/plugins/acl/composer.json +++ b/plugins/acl/composer.json @@ -3,7 +3,7 @@ "type": "roundcube-plugin", "description": "IMAP Folders Access Control Lists Management (RFC4314, RFC2086).", "license": "GNU GPLv3+", - "version": "1.3", + "version": "1.5", "authors": [ { "name": "Aleksander Machniak", diff --git a/plugins/acl/config.inc.php.dist b/plugins/acl/config.inc.php.dist index 3f0b1efb6..de1f8b5d2 100644 --- a/plugins/acl/config.inc.php.dist +++ b/plugins/acl/config.inc.php.dist @@ -16,10 +16,15 @@ $config['acl_users_field'] = 'mail'; // The LDAP search filter will be &'d with search queries $config['acl_users_filter'] = ''; +// Enable LDAP groups in user autocompletion. +// Note: LDAP addressbook defined in acl_users_source must include groups config +$config['acl_groups'] = false; + +// Prefix added to the group name to build IMAP ACL identifier +$config['acl_group_prefix'] = 'group:'; + // Include the following 'special' access control subjects in the ACL dialog; // Defaults to array('anyone', 'anonymous') (not when set to an empty array) // Example: array('anyone') to exclude 'anonymous'. // Set to an empty array to exclude all special aci subjects. $config['acl_specials'] = array('anyone', 'anonymous'); - -?> diff --git a/plugins/acl/localization/ast.inc b/plugins/acl/localization/ast.inc new file mode 100644 index 000000000..2932d3bd4 --- /dev/null +++ b/plugins/acl/localization/ast.inc @@ -0,0 +1,80 @@ +.inc | + | | + | Localization file of the Roundcube Webmail ACL plugin | + | Copyright (C) 2012-2013, The Roundcube Dev Team | + | | + | Licensed under the GNU General Public License version 3 or | + | any later version with exceptions for skins & plugins. | + | See the README file for a full license statement. | + | | + +-----------------------------------------------------------------------+ + + For translation see https://www.transifex.com/projects/p/roundcube-webmail/resource/plugin-acl/ +*/ +$labels['sharing'] = 'Compartición'; +$labels['myrights'] = 'Drechos d\'accesu'; +$labels['username'] = 'Usuariu:'; +$labels['advanced'] = 'Mou avanzáu'; +$labels['newuser'] = 'Amestar entrada'; +$labels['editperms'] = 'Editar permisos'; +$labels['actions'] = 'Aición de drechos d\'accesu...'; +$labels['anyone'] = 'Tolos usuarios (toos)'; +$labels['anonymous'] = 'Convidaos (anónimos)'; +$labels['identifier'] = 'Identificador'; +$labels['acll'] = 'Guetar'; +$labels['aclr'] = 'Lleer mensaxes'; +$labels['acls'] = 'Estáu Caltener Vistu'; +$labels['aclw'] = 'Escribir banderes'; +$labels['acli'] = 'Inxertar (copiar a)'; +$labels['aclc'] = 'Crear subcarpetes'; +$labels['aclk'] = 'Crear subcarpetes'; +$labels['acld'] = 'Desaniciar mensaxes'; +$labels['aclt'] = 'Desaniciar mensaxes'; +$labels['acle'] = 'Desanciar'; +$labels['aclx'] = 'Desaniciar carpeta'; +$labels['acla'] = 'Alministrar'; +$labels['aclfull'] = 'Control total'; +$labels['aclother'] = 'Otru'; +$labels['aclread'] = 'Lleer'; +$labels['aclwrite'] = 'Escribir'; +$labels['acldelete'] = 'Desaniciar'; +$labels['shortacll'] = 'Guetar'; +$labels['shortaclr'] = 'Lleer'; +$labels['shortacls'] = 'Caltener'; +$labels['shortaclw'] = 'Escribir'; +$labels['shortacli'] = 'Inxertar'; +$labels['shortaclc'] = 'Crear'; +$labels['shortaclk'] = 'Crear'; +$labels['shortacld'] = 'Desaniciar'; +$labels['shortaclt'] = 'Desaniciar'; +$labels['shortacle'] = 'Desaniciar'; +$labels['shortaclx'] = 'Desaniciu de carpeta'; +$labels['shortacla'] = 'Alministrar'; +$labels['shortaclother'] = 'Otru'; +$labels['shortaclread'] = 'Lleer'; +$labels['shortaclwrite'] = 'Escribir'; +$labels['shortacldelete'] = 'Desaniciar'; +$labels['longacll'] = 'La carpeta ye visible nes llistes y pue soscribise a'; +$labels['longaclr'] = 'La carpeta nun pue abrise pa leer'; +$labels['longaclx'] = 'La carpeta pue desaniciase o renomase'; +$labels['longacla'] = 'Puen camudase los drechos d\'accesu de la carpeta'; +$labels['longaclfull'] = 'Control completu incluyendo l\'alminitración de carpeta'; +$labels['longaclread'] = 'La carpeta pue abrise pa llectura'; +$labels['longaclwrite'] = 'Los mensaxes puen conseñase, escribise o copiase a la carpeta'; +$labels['longacldelete'] = 'Los mensaxes puen desaniciase'; +$labels['longaclother'] = 'Otros drechos d\'accesu'; +$labels['ariasummaryacltable'] = 'Llista de drechos d\'accesu'; +$messages['deleting'] = 'Desaniciando los drechos d\'accesu...'; +$messages['saving'] = 'Guardando los drechos d\'accesu...'; +$messages['updatesuccess'] = 'Camudaos con ésitu los drechos d\'accesu'; +$messages['deletesuccess'] = 'Desaniciaos con ésitu los drechos d\'accesu'; +$messages['createsuccess'] = 'Amestaos con ésitu los drechos d\'accesu'; +$messages['updateerror'] = 'Nun puen anovase los drechos d\'accesu'; +$messages['deleteerror'] = 'Nun puen desaniciase los drechos d\'accesu'; +$messages['createerror'] = 'Nun puen amestase los drechos d\'accesu'; +$messages['deleteconfirm'] = '¿De xuru quies desaniciar los drechos d\'accesu al(a los) usuariu(os) esbilláu(os)?'; +?> diff --git a/plugins/acl/localization/bs_BA.inc b/plugins/acl/localization/bs_BA.inc index 7cedc8c5c..371dd17af 100644 --- a/plugins/acl/localization/bs_BA.inc +++ b/plugins/acl/localization/bs_BA.inc @@ -18,8 +18,9 @@ $labels['sharing'] = 'Razmjena'; $labels['myrights'] = 'Prava pristupa'; $labels['username'] = 'Korisnik:'; -$labels['advanced'] = 'napredni mod'; +$labels['advanced'] = 'Napredni mod'; $labels['newuser'] = 'Dodaj unos'; +$labels['editperms'] = 'Uredi dozvole'; $labels['actions'] = 'Akcije za prava pristupa...'; $labels['anyone'] = 'Svi korisnici (bilo ko)'; $labels['anonymous'] = 'Gosti (anonimno)'; @@ -37,6 +38,7 @@ $labels['aclt'] = 'Obriši poruke'; $labels['acle'] = 'Izbriši'; $labels['aclx'] = 'Obriši folder'; $labels['acla'] = 'Administracija'; +$labels['acln'] = 'Obilježi poruke'; $labels['aclfull'] = 'Puna kontrola'; $labels['aclother'] = 'Ostalo'; $labels['aclread'] = 'Pročitano'; @@ -55,6 +57,7 @@ $labels['shortaclt'] = 'Obriši'; $labels['shortacle'] = 'Izbriši'; $labels['shortaclx'] = 'Brisanje foldera'; $labels['shortacla'] = 'Administracija'; +$labels['shortacln'] = 'Obilježli'; $labels['shortaclother'] = 'Ostalo'; $labels['shortaclread'] = 'Pročitano'; $labels['shortaclwrite'] = 'Piši'; @@ -72,10 +75,15 @@ $labels['longaclt'] = 'Oznaka za obrisane poruke se može mijenjati'; $labels['longacle'] = 'Poruke je moguće obrisati'; $labels['longaclx'] = 'Folder je moguće obrisati ili preimenovati'; $labels['longacla'] = 'Pristupna prava foldera je moguće promijeniti'; +$labels['longacln'] = 'Dijeljeni podaci (obilježavanja) poruka mogu se mijenjati'; $labels['longaclfull'] = 'Puna kontrola uključujući i administraciju foldera'; $labels['longaclread'] = 'Folder je moguće otvoriti radi čitanja'; $labels['longaclwrite'] = 'Moguće je označavati, zapisivati i kopirati poruke u folder'; $labels['longacldelete'] = 'Moguće je obrisati poruke'; +$labels['longaclother'] = 'Ostala prava pristupa'; +$labels['ariasummaryacltable'] = 'Lista prava pristupa'; +$labels['arialabelaclactions'] = 'Lista akcija'; +$labels['arialabelaclform'] = 'Obrazac za prava pristupa'; $messages['deleting'] = 'Brišem prava pristupa...'; $messages['saving'] = 'Snimam prava pristupa...'; $messages['updatesuccess'] = 'Prava pristupa su uspješno promijenjena'; diff --git a/plugins/acl/localization/en_CA.inc b/plugins/acl/localization/en_CA.inc index 53d14ff9a..ae9cb8bbe 100644 --- a/plugins/acl/localization/en_CA.inc +++ b/plugins/acl/localization/en_CA.inc @@ -18,7 +18,9 @@ $labels['sharing'] = 'Sharing'; $labels['myrights'] = 'Access Rights'; $labels['username'] = 'User:'; +$labels['advanced'] = 'Advanced mode'; $labels['newuser'] = 'Add entry'; +$labels['editperms'] = 'Edit permissions'; $labels['actions'] = 'Access right actions...'; $labels['anyone'] = 'All users (anyone)'; $labels['anonymous'] = 'Guests (anonymous)'; @@ -36,6 +38,7 @@ $labels['aclt'] = 'Delete messages'; $labels['acle'] = 'Expunge'; $labels['aclx'] = 'Delete folder'; $labels['acla'] = 'Administer'; +$labels['acln'] = 'Annotate messages'; $labels['aclfull'] = 'Full control'; $labels['aclother'] = 'Other'; $labels['aclread'] = 'Read'; @@ -54,6 +57,7 @@ $labels['shortaclt'] = 'Delete'; $labels['shortacle'] = 'Expunge'; $labels['shortaclx'] = 'Folder delete'; $labels['shortacla'] = 'Administer'; +$labels['shortacln'] = 'Annotate'; $labels['shortaclother'] = 'Other'; $labels['shortaclread'] = 'Read'; $labels['shortaclwrite'] = 'Write'; @@ -71,6 +75,7 @@ $labels['longaclt'] = 'Messages Delete flag can be changed'; $labels['longacle'] = 'Messages can be expunged'; $labels['longaclx'] = 'The folder can be deleted or renamed'; $labels['longacla'] = 'The folder access rights can be changed'; +$labels['longacln'] = 'Messages shared metadata (annotations) can be changed'; $labels['longaclfull'] = 'Full control including folder administration'; $labels['longaclread'] = 'The folder can be opened for reading'; $labels['longaclwrite'] = 'Messages can be marked, written or copied to the folder'; diff --git a/plugins/acl/localization/en_US.inc b/plugins/acl/localization/en_US.inc index 23501dafe..ff8dde76c 100644 --- a/plugins/acl/localization/en_US.inc +++ b/plugins/acl/localization/en_US.inc @@ -87,6 +87,11 @@ $labels['longaclfull'] = 'Full control including folder administration'; $labels['longaclread'] = 'The folder can be opened for reading'; $labels['longaclwrite'] = 'Messages can be marked, written or copied to the folder'; $labels['longacldelete'] = 'Messages can be deleted'; +$labels['longaclother'] = 'Other access rights'; + +$labels['ariasummaryacltable'] = 'List of access rights'; +$labels['arialabelaclactions'] = 'List actions'; +$labels['arialabelaclform'] = 'Access rights form'; $messages['deleting'] = 'Deleting access rights...'; $messages['saving'] = 'Saving access rights...'; diff --git a/plugins/acl/localization/et_EE.inc b/plugins/acl/localization/et_EE.inc index 4b6f437aa..ecd5f7e8f 100644 --- a/plugins/acl/localization/et_EE.inc +++ b/plugins/acl/localization/et_EE.inc @@ -18,12 +18,17 @@ $labels['sharing'] = 'Jagamine'; $labels['myrights'] = 'Ligipääsuõigused'; $labels['username'] = 'Kasutaja:'; +$labels['advanced'] = 'laiendatud režiim'; $labels['newuser'] = 'Lisa sissekanne'; +$labels['editperms'] = 'Muuda õigusi'; $labels['actions'] = 'Ligipääsuõiguste toimingud...'; $labels['anyone'] = 'Kõik kasutajad'; $labels['anonymous'] = 'Külalised (anonüümsed)'; $labels['identifier'] = 'Tuvastaja'; +$labels['acll'] = 'Ülevaade'; $labels['aclr'] = 'Lugeda kirju'; +$labels['acls'] = 'Hoia nähtud olekut'; +$labels['aclw'] = 'Salvesta lipud'; $labels['acli'] = 'Sisesta (kopeeri)'; $labels['aclp'] = 'Postita'; $labels['aclc'] = 'Luua alamkaustu'; @@ -33,11 +38,13 @@ $labels['aclt'] = 'Kustutada kirju'; $labels['acle'] = 'Eemalda'; $labels['aclx'] = 'Kustutada kausta'; $labels['acla'] = 'Administreerida'; +$labels['acln'] = 'Annoteeri kirja'; $labels['aclfull'] = 'Täis kontroll'; $labels['aclother'] = 'Muu'; $labels['aclread'] = 'Loe'; $labels['aclwrite'] = 'Kirjuta'; $labels['acldelete'] = 'Kustuta'; +$labels['shortacll'] = 'Ülevaade'; $labels['shortaclr'] = 'Loe'; $labels['shortacls'] = 'Säilita'; $labels['shortaclw'] = 'Kirjuta'; @@ -50,20 +57,33 @@ $labels['shortaclt'] = 'Kustuta'; $labels['shortacle'] = 'Eemalda'; $labels['shortaclx'] = 'Kausta kustutamine'; $labels['shortacla'] = 'Administreerida'; +$labels['shortacln'] = 'Annoteeri'; $labels['shortaclother'] = 'Muu'; $labels['shortaclread'] = 'Loe'; $labels['shortaclwrite'] = 'Kirjuta'; $labels['shortacldelete'] = 'Kustuta'; $labels['longacll'] = 'See kaust on nimekirjas nähtav ja seda saab tellida'; $labels['longaclr'] = 'Kausta saab lugemiseks avada'; +$labels['longacls'] = 'Kirja loetuse lippu saab muuta'; +$labels['longaclw'] = 'Kirja lippe ja otsingusõnu saab muuta, väljaarvatud loetud ja kustutatud'; +$labels['longacli'] = 'Kirju saab salvestada ja kopeerida antud kausta'; +$labels['longaclp'] = 'Kirju saab postitada antud kausta'; +$labels['longaclc'] = 'Kaustasi saab luua (või ümber nimetada) otse siia kausta alla.'; +$labels['longaclk'] = 'Kaustu saab luua (või ümber nimetada) otse siia kausta alla'; $labels['longacld'] = 'Kirja kustutamis lippu saab muuta'; $labels['longaclt'] = 'Kirja kustutamis lippu saab muuta'; $labels['longacle'] = 'Kirju saab eemaldada'; $labels['longaclx'] = 'Seda kausta ei saa kustutada ega ümber nimetada'; $labels['longacla'] = 'Selle kausta ligipääsuõigusi saab muuta'; +$labels['longacln'] = 'Kirja jagatud metainfot (annotatsioonid) saab muuta'; $labels['longaclfull'] = 'Täielik kontroll koos kaustade haldamisega'; $labels['longaclread'] = 'Kausta saab lugemiseks avada'; +$labels['longaclwrite'] = 'Kirju saab märgistada, salvestada või kopeerida kausta'; $labels['longacldelete'] = 'Kirju saab kustutada'; +$labels['longaclother'] = 'Muud ligipääsu õigused'; +$labels['ariasummaryacltable'] = 'Nimekir ligipääsu õigustest'; +$labels['arialabelaclactions'] = 'Näita tegevusi'; +$labels['arialabelaclform'] = 'Ligipääsu õiguste vorm'; $messages['deleting'] = 'Ligipääsuõiguste kustutamine...'; $messages['saving'] = 'Ligipääsuõiguste salvestamine...'; $messages['updatesuccess'] = 'Ligipääsuõigused on muudetud'; diff --git a/plugins/acl/localization/fi_FI.inc b/plugins/acl/localization/fi_FI.inc index eb69eda3a..27510e849 100644 --- a/plugins/acl/localization/fi_FI.inc +++ b/plugins/acl/localization/fi_FI.inc @@ -21,12 +21,24 @@ $labels['username'] = 'Käyttäjä:'; $labels['editperms'] = 'Muokkaa oikeuksia'; $labels['anyone'] = 'Kaikki käyttäjät (kuka tahansa)'; $labels['anonymous'] = 'Vieraat (anonyymit)'; +$labels['aclc'] = 'Luo alikansioita'; +$labels['aclk'] = 'Luo alikansioita'; +$labels['acld'] = 'Poista viestejä'; +$labels['aclt'] = 'Poista viestejä'; +$labels['aclx'] = 'Poista kansio'; +$labels['aclfull'] = 'Täydet käyttöoikeudet'; $labels['aclother'] = 'Muu'; +$labels['aclread'] = 'Luku'; +$labels['aclwrite'] = 'Kirjoitus'; +$labels['acldelete'] = 'Poisto'; $labels['shortaclc'] = 'Luo'; $labels['shortaclk'] = 'Luo'; $labels['shortacld'] = 'Poista'; $labels['shortaclt'] = 'Poista'; $labels['shortaclother'] = 'Muu'; +$labels['shortaclread'] = 'Luku'; +$labels['shortaclwrite'] = 'Kirjoitus'; +$labels['shortacldelete'] = 'Poisto'; $labels['longaclr'] = 'Kansion voi avata lukua varten'; $labels['longaclx'] = 'Kansio voidaan poistaa tai nimetä uudelleen'; $labels['longacla'] = 'Kansion käyttöoikeuksia voi muuttaa'; diff --git a/plugins/acl/localization/it_IT.inc b/plugins/acl/localization/it_IT.inc index 36c66cda5..1201c7ea1 100644 --- a/plugins/acl/localization/it_IT.inc +++ b/plugins/acl/localization/it_IT.inc @@ -80,6 +80,10 @@ $labels['longaclfull'] = 'Controllo completo incluso cartella di amministrazione $labels['longaclread'] = 'Questa cartella può essere aperta in lettura'; $labels['longaclwrite'] = 'I messaggi possono essere marcati, scritti o copiati nella cartella'; $labels['longacldelete'] = 'I messaggi possono essere eliminati'; +$labels['longaclother'] = 'Altri diritti di accesso'; +$labels['ariasummaryacltable'] = 'Elenco dei diritti di accesso'; +$labels['arialabelaclactions'] = 'Lista azioni'; +$labels['arialabelaclform'] = 'Modulo di accesso'; $messages['deleting'] = 'Sto eliminando i diritti di accesso...'; $messages['saving'] = 'Sto salvando i diritti di accesso...'; $messages['updatesuccess'] = 'I diritti d\'accesso sono stati cambiati'; diff --git a/plugins/acl/localization/pt_PT.inc b/plugins/acl/localization/pt_PT.inc index 77f831375..75735dd56 100644 --- a/plugins/acl/localization/pt_PT.inc +++ b/plugins/acl/localization/pt_PT.inc @@ -80,6 +80,10 @@ $labels['longaclfull'] = 'Controlo total incluindo administração de pastas'; $labels['longaclread'] = 'A pasta pode ser aberta para leitura'; $labels['longaclwrite'] = 'As mensagens podem ser marcadas, guardadas ou copiadas para a pasta'; $labels['longacldelete'] = 'As mensagens podem ser eliminadas'; +$labels['longaclother'] = 'Outros direitos de acesso'; +$labels['ariasummaryacltable'] = 'Lista de direitos de acesso'; +$labels['arialabelaclactions'] = 'Lista de acções'; +$labels['arialabelaclform'] = 'Formulário de direitos de acesso'; $messages['deleting'] = 'A eliminar permissões de acesso...'; $messages['saving'] = 'A guardar permissões de acesso...'; $messages['updatesuccess'] = 'Permissões de acesso alteradas com sucesso'; diff --git a/plugins/acl/package.xml b/plugins/acl/package.xml index a99ad4ffa..feec9cebe 100644 --- a/plugins/acl/package.xml +++ b/plugins/acl/package.xml @@ -13,9 +13,9 @@ alec@alec.pl yes - 2014-02-04 + 2014-08-11 - 1.3 + 1.5 1.0 diff --git a/plugins/acl/skins/larry/acl.css b/plugins/acl/skins/larry/acl.css index 96c1092a0..bd72b3c85 100644 --- a/plugins/acl/skins/larry/acl.css +++ b/plugins/acl/skins/larry/acl.css @@ -26,44 +26,39 @@ border: none; } +#acltable th, #acltable td { white-space: nowrap; text-align: center; } -#acltable thead tr td +#acltable thead tr th { - border-left: #BBD3DA dotted 1px; font-size: 11px; font-weight: bold; - width: auto; } #acltable tbody td { - border-bottom: #DDDDDD 1px solid; text-align: center; height: 16px; cursor: default; } -#acltable thead td.user +#acltable thead tr > .user { width: 30%; + border-left: none; } -#acltable.advanced thead td.user { - width: 25%; +#acltable.advanced thead tr > .user { + width: 25%; } #acltable tbody td.user { text-align: left; - overflow: hidden; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; - border-left: none; } #acltable tbody td.partial diff --git a/plugins/acl/skins/larry/templates/table.html b/plugins/acl/skins/larry/templates/table.html index c0b8329c6..16a97dfcb 100644 --- a/plugins/acl/skins/larry/templates/table.html +++ b/plugins/acl/skins/larry/templates/table.html @@ -1,23 +1,26 @@
- +

+
-
-