From 4c131c18668e222d6b5cc2355454e09fe44111ed Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Jun 2020 15:19:08 +0200 Subject: [PATCH] SAML/Shibboleth with multiple IdP or optional on regular login page --- api/js/login.js | 8 + api/setup/setup.inc.php | 1 + api/src/Auth.php | 69 ++++- api/src/Auth/Saml.php | 192 +++++++++----- api/src/Cache.php | 2 +- api/src/Db.php | 2 +- api/src/Framework/Login.php | 17 ++ api/src/Session.php | 6 +- logout.php | 4 +- pixelegg/css/pixelegg.css | 392 ++++++++++++++-------------- pixelegg/less/layout_loginPage.less | 5 +- pixelegg/login.tpl | 7 + pixelegg/login_mobile.tpl | 7 + saml/_egw_include.php | 13 +- setup/templates/default/config.tpl | 16 +- 15 files changed, 457 insertions(+), 284 deletions(-) diff --git a/api/js/login.js b/api/js/login.js index aaddb60fd3..f059254644 100644 --- a/api/js/login.js +++ b/api/js/login.js @@ -57,6 +57,14 @@ egw_LAB.wait(function() { "svg": egw_webserverUrl+"/api/templates/default/images/login_discourse.svg", "url": "https://help.egroupware.org" }, { "svg": egw_webserverUrl+"/api/templates/default/images/login_github.svg", "url": "https://github.com/EGroupware/egroupware" } ]); + + // automatic submit of SAML IdP selection + jQuery('select.onChangeSubmit').on('change', function() { + if (this.value) { + this.form.method = 'GET'; + this.form.submit(); + } + }); }); }); diff --git a/api/setup/setup.inc.php b/api/setup/setup.inc.php index 7f46aeac77..cda07d2193 100644 --- a/api/setup/setup.inc.php +++ b/api/setup/setup.inc.php @@ -70,6 +70,7 @@ $setup_info['api']['hooks']['vfs_rmdir'] = 'EGroupware\\Api\\Vfs\\Sharing::vfsUp // hook to update SimpleSAMLphp config $setup_info['api']['hooks']['setup_config'] = \EGroupware\Api\Auth\Saml::class.'::setupConfig'; +$setup_info['api']['hooks']['login_discovery'] = \EGroupware\Api\Auth\Saml::class.'::discovery'; // installation checks $setup_info['api']['check_install'] = array( diff --git a/api/src/Auth.php b/api/src/Auth.php index c074655aec..b1f1ab7ba6 100644 --- a/api/src/Auth.php +++ b/api/src/Auth.php @@ -53,20 +53,38 @@ class Auth /** * Constructor * + * @param Backend $type =null default is type from session / auth or login, or if not set config * @throws Exception\AssertionFailed if backend is not an Auth\Backend */ - function __construct() + function __construct($type=null) { - $this->backend = self::backend(); + $this->backend = self::backend($type); + } + + /** + * Get current backend + * + * @return string + */ + public function backendType() + { + return Cache::getSession(__CLASS__, 'backend'); } /** * Instanciate a backend * - * @param Backend $type =null + * Type will be stored in session, to automatic use the same type eg. for conditional use of SAML. + * + * @param Backend $type =null default is type from session / auth or login, or if not set config + * @return Auth\Backend|Auth\BackendSSO */ static function backend($type=null) { + if (is_null($type)) + { + $type = Cache::getSession(__CLASS__, 'backend') ?: null; + } // do we have a hostname specific auth type set if (is_null($type) && !empty($GLOBALS['egw_info']['server']['auth_type_host']) && Header\Http::host() === $GLOBALS['egw_info']['server']['auth_type_hostname']) @@ -88,18 +106,49 @@ class Auth { throw new Exception\AssertionFailed("Auth backend class $backend_class is NO EGroupware\\Api\Auth\\Backend!"); } + Cache::setSession(__CLASS__, 'backend', $type); + return $backend; } /** * Attempt a SSO login * + * A different then the default backend can be selected by setting request parameter auth to the backend or + * setting "auth=$backend" to an arbitrary value eg. with a submit button named like that. + * To secure this behavior the server config "${auth}_discovery" has to be set (to a non-empty value)! + * * @return string sessionid on successful login or null * @throws Exception\AssertionFailed */ static function login() { - $backend = self::backend(); + if (!empty($_REQUEST['auth'])) + { + $type = $_REQUEST['auth']; + } + elseif (($auth = array_filter($_REQUEST, function($key) + { + return substr($key, 0, 5) === 'auth='; + }, ARRAY_FILTER_USE_KEY))) + { + $type = substr(key($auth), 5); + } + // to not allow enabling all sort of auth plugins by simply calling login.php?auth=xyz we require the + // plugin to be enabled via "${auth}_discovery" server config + if (!empty($type) && empty($GLOBALS['egw_info']['server'][$type.'_discovery'])) + { + $type = null; + } + + // now we need a (not yet authenticated) session so SAML / auth source selected "survives" eg. the SAML redirects + if (!empty($type) && !Session::get_sessionid()) + { + session_start(); + Session::egw_setcookie(Session::EGW_SESSION_NAME, session_id()); + } + + $backend = self::backend($type ?? null); return $backend instanceof Auth\BackendSSO ? $backend->login() : null; } @@ -110,11 +159,9 @@ class Auth * @return null * @throws Exception\AssertionFailed */ - static function logout() + function logout() { - $backend = self::backend(); - - return $backend instanceof Auth\BackendSSO ? $backend->logout() : null; + return $this->backend instanceof Auth\BackendSSO ? $this->backend->logout() : null; } /** @@ -125,11 +172,9 @@ class Auth * * @return array of needed keys in session */ - static function needSession() + function needSession() { - $backend = self::backend(); - - return method_exists($backend, 'needSession') ? $backend->needSession() : []; + return method_exists($this->backend, 'needSession') ? $this->backend->needSession() : []; } /** diff --git a/api/src/Auth/Saml.php b/api/src/Auth/Saml.php index deaaa5dfa4..51c8c2668e 100644 --- a/api/src/Auth/Saml.php +++ b/api/src/Auth/Saml.php @@ -1,6 +1,6 @@ Configuration > SAML/Shibboleth * - * It will NOT work, before you configure at least one IdP (Identity Provider) for the default-sp (Service Provider) in saml/authsourcres.php: + * Storing setup configuration modifies the following files: + * a) $files_dir/saml/config.php + * b) $files_dir/saml/authsources.php (only "default-sp" is used currently) + * c) $files_dir/saml/metadata/* + * d) $files_dir/saml/cert/* + * Modification is only on certain values, everything else can be edited to suit your needs. * - * // An authentication source which can authenticate against both SAML 2.0 - * // and Shibboleth 1.3 IdPs. - * 'default-sp' => [ - * 'saml:SP', + * Initially also a key-pair is generated as $files_dir/saml/cert/saml.{pem,crt}. + * If you want or have to use a different certificate, best replace these with your files (they are referenced multiple times!). + * They must stay in the files directory and can NOT be symlinks to eg. /etc, as only files dir is mounted into the container! * - * // The entity ID of this SP. - * // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL. - * 'entityID' => null, + * Authentication / configuration can be tested independent of EGroupware by using https://example.org/egroupware/saml/ + * with the "admin" user and password stored in cleartext in $files_dir/saml/config.php under 'auth.adminpassword'. * - * // The entity ID of the IdP this SP should contact. - * // Can be NULL/unset, in which case the user will be shown a list of available IdPs. - * 'idp' => 'https://samltest.id/saml/idp', - * - * And the IdP's metadata in saml/metadata/saml20-idp-remote.php - * - * $metadata['https://samltest.id/saml/idp'] = [ - * 'SingleSignOnService' => 'https://samltest.id/idp/profile/SAML2/Redirect/SSO', - * 'SingleLogoutService' => 'https://samltest.id/idp/profile/Logout', - * 'certificate' => 'samltest.id.pem', - * ]; - * - * https://samltest.id/ is just a SAML / Shibboleth test side allowing AFTER uploading your metadata to test with a couple of static test-accounts. - * - * The metadata can be downloaded by via https://example.org/egroupware/saml/ under Federation, it also allows to test the authentication. - * The required (random) Admin password can be found in /var/lib/egrouwpare/default/saml/config.php searching for auth.adminpassword. - * - * Alternativly you can also modify the following metadata example by replacing https://example.org/ with your domain: - * - * - * - * - * - * - * - * - * - * - * - * Admin - * Name - * mailto:admin@example.org - * - * + * There are basically three possible scenarios currently supported: + * a) a single IdP and SAML configured as authentication method + * --> gives full SSO (login page is never displayed, it directly redirects to the IdP) + * b) one or multiple IdP, a discovery label and an other authentication type eg. SQL configured + * --> uses the login page for local accounts plus a button or selectbox (depending on number of IdPs) to start SAML login + * c) multiple IdP and SAML configured as authentication method + * --> SimpleSAML discovery/selection page with a checkbox to remember the selection (SSO after first selection) */ class Saml implements BackendSSO { + /** + * Which entry in authsources.php to use. + * + * Setup > configuration always modifies "default-sp" + * + * A different SP can be configured via header.inc.php by adding at the end: + * + * EGroupware\Api\Auth\Saml::$auth_source = "other-sp"; + */ + static public $auth_source = 'default-sp'; + /** * Constructor */ @@ -79,7 +66,7 @@ class Saml implements BackendSSO } /** - * authentication against SAML + * Authentication against SAML * * @param string $username username of account to authenticate * @param string $passwd corresponding password @@ -89,7 +76,7 @@ class Saml implements BackendSSO function authenticate($username, $passwd, $passwd_type='text') { // login (redirects to IdP) - $as = new SimpleSAML\Auth\Simple('default-sp'); + $as = new SimpleSAML\Auth\Simple(self::$auth_source); $as->requireAuth(); return true; @@ -125,12 +112,13 @@ class Saml implements BackendSSO function login() { // login (redirects to IdP) - $as = new SimpleSAML\Auth\Simple('default-sp'); - $as->requireAuth(); + $as = new SimpleSAML\Auth\Simple(self::$auth_source); + $as->requireAuth(preg_match('|^https://|', $_REQUEST['auth=saml']) ? + ['saml:idp' => $_REQUEST['auth=saml']] : []); - // cleanup session for EGroupware + /* cleanup session for EGroupware: currently NOT used as we share the session with SimpleSAMLphp $session = SimpleSAML\Session::getSessionFromRequest(); - $session->cleanup(); + $session->cleanup();*/ // get attributes for (automatic) account creation $attrs = $as->getAttributes(); @@ -159,8 +147,8 @@ class Saml implements BackendSSO */ function logout() { - $as = new SimpleSAML\Auth\Simple('default-sp'); - $as->logout(); + $as = new SimpleSAML\Auth\Simple(self::$auth_source); + if ($as->isAuthenticated()) $as->logout(); } /** @@ -173,7 +161,48 @@ class Saml implements BackendSSO */ function needSession() { - return ['SimpleSAMLphp_SESSION']; + return ['SimpleSAMLphp_SESSION', Api\Session::EGW_APPSESSION_VAR]; // Auth stores backend via Cache::setSession() + } + + const IDP_DISPLAY_NAME = 'OrganizationDisplayName'; + + /** + * Display a IdP selection / discovery + * + * Will be displayed if IdP(s) are added in setup and a discovery label is specified. + * + * @return string|null html to display in login page or null to disable the selection + */ + static public function discovery() + { + if (empty($GLOBALS['egw_info']['server']['saml_discovery']) || + !($metadata = self::metadata())) + { + return null; + } + //error_log(__METHOD__."() metadata=".json_encode($metadata)); + $lang = Api\Translation::$userlang; + $select = ['' => $GLOBALS['egw_info']['server']['saml_discovery']]; + foreach($metadata as $idp => $data) + { + $select[$idp] = $data[self::IDP_DISPLAY_NAME][$lang] ?: $data[self::IDP_DISPLAY_NAME]['en']; + } + return count($metadata) > 1 ? + Api\Html::select('auth=saml', '', $select, true, 'class="onChangeSubmit"') : + Api\Html::input('auth=saml', $GLOBALS['egw_info']['server']['saml_discovery'], 'submit', 'formmethod="get"'); + } + + /** + * @return array IdP => metadata pairs + */ + static public function metadata($files_dir=null) + { + $metadata = []; + if (file_exists($file = ($files_dir ?: $GLOBALS['egw_info']['server']['files_dir']).'/saml/metadata/saml20-idp-remote.php')) + { + include $file; + } + return $metadata; } const ASYNC_JOB_ID = 'saml_metadata_refresh'; @@ -190,11 +219,7 @@ class Saml implements BackendSSO { $config =& $location['newsettings']; - /*error_log(__METHOD__."() ".json_encode(array_filter($config, function($value, $key) { - return substr($key, 0, 5) === 'saml_' || $key === 'auth_type'; - }, ARRAY_FILTER_USE_BOTH), JSON_UNESCAPED_SLASHES));*/ - - if (empty($config['saml_idp'])) return; // nothing to do, if not idp defined + if (empty($config['saml_idp'])) return; // nothing to do, if no idp defined if (file_exists($config['files_dir'].'/saml/config.php')) { @@ -204,7 +229,6 @@ class Saml implements BackendSSO // install or remove async job to refresh metadata static $freq2times = [ - 'hourly' => ['min' => 4], // hourly at minute 4 'daily' => ['min' => 4, 'hour' => 4], // daily at 4:04am 'weekly' => ['min' => 4, 'hour' => 4, 'dow' => 5], // Saturdays as 4:04am ]; @@ -219,12 +243,37 @@ class Saml implements BackendSSO $async->cancel_timer(self::ASYNC_JOB_ID); } + // only refresh metadata if we have to, or request by user if ($config['saml_metadata_refresh'] !== 'no') { - self::refreshMetadata($config); + $metadata = self::metadata($config['files_dir']); + $idps = self::splitIdP($config['saml_idp']); + foreach($idps as $idp) + { + if (!isset($metadata[$idp])) + { + $metadata = []; + break; + } + } + if (count($metadata) !== count($idps) || $config['saml_metadata_refresh'] === 'now') + { + self::refreshMetadata($config); + } } } + /** + * Split multiple IdP + * + * @param string $config + * @return string[] + */ + private static function splitIdP($config) + { + return preg_split('/[\n\r ]+/', trim($config)) ?: []; + } + /** * Refresh metadata * @@ -241,7 +290,8 @@ class Saml implements BackendSSO $source = [ 'src' => $config['saml_metadata'], - 'whitelist' => [$config['saml_idp']], // only ready our idp, the whole thing can be huge + // only read/configure our idp(s), the whole thing can be huge + 'whitelist' => self::splitIdP($config['saml_idp']), ]; if (!empty($config['saml_certificate'])) { @@ -271,7 +321,15 @@ class Saml implements BackendSSO $GLOBALS['egw_info']['server']['usecookies'] = true; $config['baseurlpath'] = Api\Framework::getUrl(Api\Egw::link('/saml/')); $config['username_oid'] = [self::usernameOid($config)]; - + // if multiple IdP's are configured, do NOT specify one to let user select + if (count(self::splitIdP($config['saml_idp'])) > 1) + { + unset($config['saml_idp']); + } + else + { + $config['saml_idp'] = trim($config['saml_idp']); + } // update config.php and default-sp in authsources.php foreach([ 'authsources.php' => [ @@ -445,12 +503,18 @@ class Saml implements BackendSSO case 'authsources.php': $replacements = [ - "'idp' => null," => "'idp' => ".self::quote($config['saml_idp']).',', + "'idp' => null," => "'idp' => ".self::quote( + count(self::splitIdP($config['saml_idp'])) <= 1 ? trim($config['saml_idp']) : null).',', "'discoURL' => null," => "'discoURL' => null,\n\n". // add our private and public keys "\t'privatekey' => 'saml.pem',\n\n". "\t// to include certificate in metadata\n". "\t'certificate' => 'saml.crt',\n\n". + "\t// new certificates for rotation: add new, wait for IdP sync, swap old and new, wait, comment again\n". + "\t//'new_privatekey' => 'new-saml.pem',\n". + "\t//'new_certificate' => 'new-saml.crt',\n\n". + "\t// logout is NOT signed by default, but signature is required from the uni-kl.de IdP for logout\n". + "\t'sign.logout' => true,\n\n". "\t'name' => [\n". "\t\t'en' => ".self::quote($config['saml_sp'] ?: 'EGroupware').",\n". "\t],\n\n". diff --git a/api/src/Cache.php b/api/src/Cache.php index c859e0f6a5..be56de9312 100644 --- a/api/src/Cache.php +++ b/api/src/Cache.php @@ -402,7 +402,7 @@ class Cache */ static public function &getSession($app,$location,$callback=null,array $callback_params=array(),$expiration=0) { - if (isset($_SESSION[Session::EGW_SESSION_ENCRYPTED])) + if (!isset($_SESSION) || isset($_SESSION[Session::EGW_SESSION_ENCRYPTED])) { if (Session::ERROR_LOG_DEBUG) error_log(__METHOD__.' called after session was encrypted --> ignored!'); return null; // can no longer store something in the session, eg. because commit_session() was called diff --git a/api/src/Db.php b/api/src/Db.php index 74616531b1..edb6e529e6 100644 --- a/api/src/Db.php +++ b/api/src/Db.php @@ -585,7 +585,7 @@ class Db { foreach(get_included_files() as $file) { - if (strpos($file,'adodb') !== false && !in_array($file,(array)$_SESSION['egw_required_files'])) + if (strpos($file,'adodb') !== false && !in_array($file,(array)$_SESSION['egw_required_files']) && isset($_SESSION)) { $_SESSION['egw_required_files'][] = $file; //error_log(__METHOD__."() egw_required_files[] = $file"); diff --git a/api/src/Framework/Login.php b/api/src/Framework/Login.php index bade353db1..11168da3bd 100644 --- a/api/src/Framework/Login.php +++ b/api/src/Framework/Login.php @@ -81,6 +81,23 @@ class Login $tmpl->set_var('2fa_class', 'et2_required'); } } + + // check if we need some discovery (select login options eg. a SAML IdP), hide it if not + $discovery = ''; + foreach(Api\Hooks::process('login_discovery', [], true) as $app => $data) + { + if (!empty($data)) $discovery .= $data; + } + if (!empty($discovery)) + { + $tmpl->set_var('discovery', $discovery); + } + else + { + $tmpl->set_block('login_form','discovery_block'); + $tmpl->set_var('discovery_block', ''); + } + // hide change-password fields, if not requested if (!$change_passwd) { diff --git a/api/src/Session.php b/api/src/Session.php index 1df3e9593f..e415f3d262 100644 --- a/api/src/Session.php +++ b/api/src/Session.php @@ -1444,9 +1444,11 @@ class Session if (!$GLOBALS['egw_info']['user']['sessionid'] || $sessionid == $GLOBALS['egw_info']['user']['sessionid']) { // eg. SAML logout will fail, if there is no more session --> remove everything else - if (($needed = Auth::needSession()) && array_intersect($needed, array_keys($_SESSION))) + $auth = new Auth(); + if (($needed = $auth->needSession()) && array_intersect($needed, array_keys($_SESSION))) { - $_SESSION = array_intersect_key($_SESSION['SimpleSAMLphp_SESSION'], array_flip($needed)); + $_SESSION = array_intersect_key($_SESSION, array_flip($needed)); + Auth::backend($auth->backendType()); // backend is stored in session return true; } if (self::ERROR_LOG_DEBUG) error_log(__METHOD__." ********* about to call session_destroy!"); diff --git a/logout.php b/logout.php index 56f658a64a..d3f3a72f28 100755 --- a/logout.php +++ b/logout.php @@ -39,6 +39,8 @@ elseif(strpos($redirectTarget, '[?&]cd=') !== false) if ($verified) { + $auth = new Api\Auth(); + // remove remember me cookie on explicit logout, unless it is a second factor if ($GLOBALS['egw']->session->removeRememberMeTokenOnLogout()) { @@ -53,7 +55,7 @@ Api\Session::egw_setcookie('kp3'); Api\Session::egw_setcookie('domain'); // SSO Logout (does not return for SSO systems) -Api\Auth::logout(); +if (isset($auth)) $auth->logout(); // $GLOBALS['egw']->redirect($redirectTarget); ?> diff --git a/pixelegg/css/pixelegg.css b/pixelegg/css/pixelegg.css index 8d9f6bca81..92cadb819a 100644 --- a/pixelegg/css/pixelegg.css +++ b/pixelegg/css/pixelegg.css @@ -99,7 +99,7 @@ display: inline-block; /*border: 1px solid cornflowerblue;*/ border: 1px solid rgba(0, 0, 0, 0.15); - background-color: #e6e6e6; + background-color: #E6E6E6; } .et2_placeholder .et2_attr { color: #000000; @@ -108,7 +108,7 @@ * Label widget, and labels for other widgets */ .et2_label { - color: #1e1e1e; + color: #1E1E1E; white-space: pre-wrap; } /** @@ -155,7 +155,7 @@ -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; } .et2_button_icon { height: 16px; @@ -164,13 +164,13 @@ /* give the image a button lock and feel*/ img.et2_button_icon[src*="svg"] { background-color: #b4b4b4; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -ms-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b4b4b4), to(#b4b4b4)); - background-image: -webkit-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -o-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: linear-gradient(top, #b4b4b4, #b4b4b4); + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); + background-image: -moz-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -ms-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B4B4B4), to(#B4B4B4)); + background-image: -webkit-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -o-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: linear-gradient(top, #B4B4B4, #B4B4B4); background-repeat: repeat-x; } img.et2_button_icon[src*="svg"]:hover { @@ -214,7 +214,7 @@ min-width: 21.5ex; } span.et2_date span { - color: #ffffff; + color: #FFFFFF; } .ui-datepicker .ui-datepicker-buttonpane button[data-handler="today"] { background-image: url(../images/bullet.svg); @@ -247,20 +247,20 @@ background-image: url("../images/delete.svg"); } .et2_file .progress p { - background-color: #ffdd73; + background-color: #FFDD73; } span.et2_file_span { background-image: url(../images/attach.svg); } span.et2_file_span img[url*="svg"] { background-color: #b4b4b4 !important; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=) !important; - background-image: -moz-linear-gradient(top, #b4b4b4, #b4b4b4) !important; - background-image: -ms-linear-gradient(top, #b4b4b4, #b4b4b4) !important; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b4b4b4), to(#b4b4b4)) !important; - background-image: -webkit-linear-gradient(top, #b4b4b4, #b4b4b4) !important; - background-image: -o-linear-gradient(top, #b4b4b4, #b4b4b4) !important; - background-image: linear-gradient(top, #b4b4b4, #b4b4b4) !important; + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=) !important; + background-image: -moz-linear-gradient(top, #B4B4B4, #B4B4B4) !important; + background-image: -ms-linear-gradient(top, #B4B4B4, #B4B4B4) !important; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B4B4B4), to(#B4B4B4)) !important; + background-image: -webkit-linear-gradient(top, #B4B4B4, #B4B4B4) !important; + background-image: -o-linear-gradient(top, #B4B4B4, #B4B4B4) !important; + background-image: linear-gradient(top, #B4B4B4, #B4B4B4) !important; background-repeat: repeat-x !important; fill: red !important; } @@ -271,7 +271,7 @@ box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6) !important; } div.et2_file input.et2_file_upload { - background-color: #ffffff !important; + background-color: #FFFFFF !important; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; @@ -289,25 +289,25 @@ } /* Gantt widget */ .et2_gantt .gantt_task_line { - background-color: #679fd2; + background-color: #679FD2; } .et2_gantt .gantt_task_line .gantt_task_content { - color: #043a6b; + color: #043A6B; } .et2_gantt .gantt_task_line .gantt_selected { background-color: rgba(255, 194, 0, 0.01); } .et2_gantt .gantt_task_line .gantt_task_progress { - color: #043a6b; - background-color: #ffdd73; + color: #043A6B; + background-color: #FFDD73; /* outline progress in a complementary color */ - border: 1px solid #bf9d30; + border: 1px solid #BF9D30; border-right: none; margin: -1px; } .et2_gantt .gantt_task_line.gantt_milestone { background-color: #ffc200; - border-color: #bf9d30; + border-color: #BF9D30; } .et2_gantt .gantt_task_link .gantt_line_wrapper div { background-color: green; @@ -322,16 +322,16 @@ box-shadow: 0 0 5px 0 green; } .et2_gantt .gantt_task_link.invalid_constraint .gantt_line_wrapper div { - background-color: #ae1d00; + background-color: #AE1D00; } .et2_gantt .gantt_task_link.invalid_constraint .gantt_link_arrow_left { - border-right-color: #ae1d00; + border-right-color: #AE1D00; } .et2_gantt .gantt_task_link.invalid_constraint .gantt_link_arrow_right { - border-left-color: #ae1d00; + border-left-color: #AE1D00; } .et2_gantt .gantt_task_link.invalid_constraint:hover .gantt_line_wrapper div { - box-shadow: 0 0 5px 0 #ae1d00; + box-shadow: 0 0 5px 0 #AE1D00; } /* Link to / Selector Widget @@ -365,7 +365,7 @@ background-size: contain; } .et2_link { - color: #0c5da5; + color: #0C5DA5; } .et2_link_list tr { cursor: pointer; @@ -463,7 +463,7 @@ */ .et2_required, [required] { - background-color: #ffdd73; + background-color: #FFDD73; -webkit-border-top-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; -webkit-border-bottom-left-radius: 3px; @@ -482,7 +482,7 @@ * hrule widget */ hr { - border-top: 1px solid #e6e6e6; + border-top: 1px solid #E6E6E6; } /** * grid widget @@ -533,7 +533,7 @@ background-color: transparent; } .et2_nextmatch .egwGridView_outer thead tr > th:first-child { - border-left: 6px solid #b4b4b4; + border-left: 6px solid #B4B4B4; } .et2_nextmatch .nextmatch_header { padding: 0; @@ -552,7 +552,7 @@ ################################################################*/ .nextmatch_header_row .et2_label select { margin-left: 3px; - border-color: #cdcdcd; + border-color: #CDCDCD; } .nextmatch_header_row > .filters { /*width: 83%;*/ @@ -601,7 +601,7 @@ margin-right: 2ex; width: 15%; border: 1px solid rgba(0, 0, 0, 0.15); - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); @@ -620,7 +620,7 @@ outline: 0; border-width: 1px; border-style: solid; - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); @@ -709,7 +709,7 @@ vertical-align: middle; margin-right: -2px; padding: 0px 1ex; - background-color: #ffffff; + background-color: #FFFFFF; background-image: none; } .et2_dropdown button img { @@ -746,7 +746,7 @@ background-color: #b3e4a6; } .et2_dropdown button.ui-state-hover { - background-color: #e6e6e6; + background-color: #E6E6E6; } .sidebox-favorites ul.favorites { width: 99%; @@ -856,7 +856,7 @@ position: relative; } div.et2_progress > div { - background-color: #ffdd73; + background-color: #FFDD73; /*height: 5px;*/ } /** @@ -873,7 +873,7 @@ * et2_textbox */ textarea.et2_textbox { - border: 1px solid #e6e6e6; + border: 1px solid #E6E6E6; } textarea, textarea.description { @@ -1071,9 +1071,9 @@ option:checked { position: absolute; z-index: 9999; max-width: 300px; - -webkit-box-shadow: 0 0 5px #aaaaaa; - -moz-box-shadow: 0 0 5px #aaaaaa; - box-shadow: 0 0 5px #aaaaaa; + -webkit-box-shadow: 0 0 5px #aaa; + -moz-box-shadow: 0 0 5px #aaa; + box-shadow: 0 0 5px #aaa; } /* Component containers ----------------------------------*/ @@ -1106,7 +1106,7 @@ option:checked { border-right: solid 1px 0px !important; border-bottom: solid 1px 0px !important; /*.gradient_thead !important;*/ - background-color: #0c5da5; + background-color: #0C5DA5; /*border-color: @gray_10;*/ color: #000000; font-weight: bold; @@ -1125,7 +1125,7 @@ option:checked { border-left: solid 1px 1px; border-right: solid 1px 1px; border-bottom: solid 1px 1px; - border-color: #b4b4b4; + border-color: #B4B4B4; background: transparent; font-weight: normal; color: #1a1a1a; @@ -1152,14 +1152,14 @@ option:checked { .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-widget-content .ui-state-focus { - border-color: #e6e6e6; + border-color: #E6E6E6; background: rgba(102, 153, 204, 0.7); background-image: none; - color: #ffffff; + color: #FFFFFF; font-weight: normal; } .ui-state-focus.ui-menu-item a { - color: #e6e6e6; + color: #E6E6E6; } .ui-state-hover, .ui-widget-content .ui-state-hover, @@ -1168,7 +1168,7 @@ option:checked { border-left: solid 1px 1px; border-right: solid 1px 1px; border-bottom: solid 1px 1px; - border-color: #e6e6e6; + border-color: #E6E6E6; background: rgba(102, 153, 204, 0.7); background-image: none; color: #ffffff; @@ -1187,7 +1187,7 @@ option:checked { border-left: solid 1px 1px; border-right: solid 1px 1px; border-bottom: solid 1px 1px; - border-color: #cdcdcd; + border-color: #CDCDCD; background-image: none; font-weight: bold; color: #808080; @@ -1207,7 +1207,7 @@ option:checked { border-left: solid 1px 1px; border-right: solid 1px 1px; border-bottom: solid 1px 1px; - border-color: #b4b4b4; + border-color: #B4B4B4; color: #808080; } .ui-state-highlight a, @@ -1222,27 +1222,27 @@ option:checked { border-left: solid 1px 1px; border-right: solid 1px 1px; border-bottom: solid 1px 1px; - border-color: #e6e6e6; + border-color: #E6E6E6; color: #b3b3b3; } .ui-state-error a, .ui-widget-content .ui-state-error a { - color: #ff0000; + color: #FF0000; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { - color: #ff0000; + color: #FF0000; } .drop-hover { - background-color: #ffdd73; + background-color: #FFDD73; } .ui-icon-close { /*visibility: hidden;*/ /*background-image: url(../images/search.png);*/ background-image: url("../images/cancel.svg"); background-repeat: no-repeat; - background-color: #ffffff; + background-color: #FFFFFF; background-size: 12px 12px; width: 16px; height: 16px; @@ -1272,15 +1272,15 @@ span.ui-icon-close { .ui-icon-closethick { background-image: url(../images/close.svg) !important; background-repeat: no-repeat; - background-color: #ffffff; + background-color: #FFFFFF; background-size: contain; background-position: 0 0 !important; color: #ffffff; height: 16px; } .ui-icon-closethick:hover { - background-color: #e6e6e6; - color: #1e1e1e; + background-color: #E6E6E6; + color: #1E1E1E; -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); @@ -1316,7 +1316,7 @@ span.ui-icon-close { /*###########################################*/ /* col selection */ span.ui-multiselect-header { - color: #ffffff; + color: #FFFFFF; } span.ui-icon-search { background-image: url(../images/search.svg) !important; @@ -1355,11 +1355,11 @@ span.ui-icon-search { /*###########################################*/ /*Dialog: edit row*/ .ui-widget-overlay { - background: #cdcdcd; + background: #CDCDCD; } .ui-dialog { z-index: 1000; - box-shadow: -2px 1px 9px 3px #b4b4b4; + box-shadow: -2px 1px 9px 3px #B4B4B4; } .ui-dialog .ui-dialog-buttonpane { padding-left: .8em; @@ -1378,7 +1378,7 @@ span.ui-icon-search { right: .8em; } .ui-widget-content { - border: 1px solid #b4b4b4; + border: 1px solid #B4B4B4; } .ui-widget-content .et2_selectbox button.et2_button_text, .ui-widget-content .et2_selectbox select.et2_selectbox { @@ -1409,35 +1409,35 @@ button.ui-button { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; background-size: 20px auto; /*.Button_size_h32_auto;*/ height: 24px; - border-color: #b4b4b4; + border-color: #B4B4B4; outline: none; } button.ui-button:hover { - background-color: #b4b4b4; - color: #1e1e1e; + background-color: #B4B4B4; + color: #1E1E1E; } button.ui-button .ui-button-icon-primary:hover { - background-color: #b4b4b4; - color: #1e1e1e; + background-color: #B4B4B4; + color: #1E1E1E; box-shadow: none; } /*###########################################*/ /*Dialog: calendar edit series*/ .ui-dialog-buttonset button.ui-button-text-only { - background-color: #cdcdcd; + background-color: #CDCDCD; background: inherit; color: #000000 !important; font-weight: normal !important; } .ui-dialog-buttonset button.ui-button-text-only:hover { - background-color: #b4b4b4; + background-color: #B4B4B4; } .ui-dialog-buttonset button.ui-button { /*.border_normal;*/ @@ -1457,7 +1457,7 @@ button.ui-button .ui-button-icon-primary:hover { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -1466,8 +1466,8 @@ button.ui-button .ui-button-icon-primary:hover { height: 24px; } .ui-dialog-buttonset button.ui-button:hover { - background-color: #b4b4b4; - color: #1e1e1e; + background-color: #B4B4B4; + color: #1E1E1E; } /*###########################################*/ /*Dialog: calendar edit series*/ @@ -1475,7 +1475,7 @@ div#ui-datepicker-div { -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; - border: 1px solid #b4b4b4; + border: 1px solid #B4B4B4; -webkit-box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); -moz-box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); @@ -1496,8 +1496,8 @@ div#ui-datepicker-div { border: 1px solid #b4b4b4; } .ui-datepicker table.ui-datepicker-calendar .ui-state-active { - background-color: #0c5da5; - color: #ffffff; + background-color: #0C5DA5; + color: #FFFFFF; } .ui-datepicker div.ui-timepicker-div { padding: 3px; @@ -1519,13 +1519,13 @@ div#ui-datepicker-div { font-size: 0.9em; } .ui-datepicker div.ui-timepicker-div div.ui_tpicker_hour_slider span.ui-slider-handle { - background-color: #0c5da5; + background-color: #0C5DA5; } .ui-datepicker div.ui-timepicker-div div.ui_tpicker_minute_slider span.ui-slider-handle { - background-color: #0c5da5; + background-color: #0C5DA5; } .ui-datepicker div.ui-datepicker-buttonpane { - background-color: #679fd2; + background-color: #679FD2; } .ui-datepicker button.ui-datepicker-current .ui-state-hover { background-color: #b3e4a6 !important; @@ -1904,28 +1904,28 @@ div#loginMainDiv.stockLoginBackground div#centerBox form { } #loginMainDiv div#centerBox form table.divLoginbox div.LoginPasswordImage { background-color: #b3ad54; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjZmZjMjAwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDA4ZGQyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #ffc200, #408dd2); - background-image: -ms-linear-gradient(top, #ffc200, #408dd2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffc200), to(#408dd2)); - background-image: -webkit-linear-gradient(top, #ffc200, #408dd2); - background-image: -o-linear-gradient(top, #ffc200, #408dd2); - background-image: linear-gradient(top, #ffc200, #408dd2); + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjZmZjMjAwIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNDA4REQyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); + background-image: -moz-linear-gradient(top, #ffc200, #408DD2); + background-image: -ms-linear-gradient(top, #ffc200, #408DD2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffc200), to(#408DD2)); + background-image: -webkit-linear-gradient(top, #ffc200, #408DD2); + background-image: -o-linear-gradient(top, #ffc200, #408DD2); + background-image: linear-gradient(top, #ffc200, #408DD2); background-repeat: repeat-x; } #loginMainDiv div#centerBox form table.divLoginbox div.LoginPasswordImage img.passwordImage { margin: 0 auto; max-width: 400px; border-top: solid 1px 5px; - border-left: solid 1px #eeeeee; - border-right: solid 1px #eeeeee; - border-bottom: solid 1px #eeeeee; + border-left: solid 1px #EEE; + border-right: solid 1px #EEE; + border-bottom: solid 1px #EEE; } #loginMainDiv div#centerBox form table.divLoginbox div.LoginPasswordImage img.passwordImage[src$="svg"] { border-top: solid 1px 5px; - border-left: solid 1px #eeeeee; - border-right: solid 1px #eeeeee; - border-bottom: solid 1px #eeeeee; + border-left: solid 1px #EEE; + border-right: solid 1px #EEE; + border-bottom: solid 1px #EEE; width: 40px; height: 40px; } @@ -2006,7 +2006,8 @@ div#loginMainDiv.stockLoginBackground div#centerBox form { margin-top: 7px; width: auto; } -#loginMainDiv div#centerBox form table.divLoginbox input[type="submit"] { +#loginMainDiv div#centerBox form table.divLoginbox input[type="submit"], +#loginMainDiv div#centerBox form table.divLoginbox select.onChangeSubmit { background-color: #0a5ca5; color: #ffffff; font-size: 20px; @@ -2014,6 +2015,9 @@ div#loginMainDiv.stockLoginBackground div#centerBox form { width: 250px; margin-top: 25px; } +#loginMainDiv div#centerBox form table.divLoginbox select.onChangeSubmit { + padding-left: 25px; +} #loginMainDiv div#centerBox form table.divLoginbox .registration { font-size: 11px; } @@ -2031,13 +2035,13 @@ div#loginMainDiv.stockLoginBackground div#centerBox form { #wrap img[src$="svg"], #wrap background-image[url$="svg"] { background-color: #679fd2; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjNjc5ZmQyIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNjc5ZmQyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #679fd2, #679fd2); - background-image: -ms-linear-gradient(top, #679fd2, #679fd2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#679fd2), to(#679fd2)); - background-image: -webkit-linear-gradient(top, #679fd2, #679fd2); - background-image: -o-linear-gradient(top, #679fd2, #679fd2); - background-image: linear-gradient(top, #679fd2, #679fd2); + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjNjc5RkQyIiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjNjc5RkQyIiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); + background-image: -moz-linear-gradient(top, #679FD2, #679FD2); + background-image: -ms-linear-gradient(top, #679FD2, #679FD2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#679FD2), to(#679FD2)); + background-image: -webkit-linear-gradient(top, #679FD2, #679FD2); + background-image: -o-linear-gradient(top, #679FD2, #679FD2); + background-image: linear-gradient(top, #679FD2, #679FD2); background-repeat: repeat-x; } #img1, @@ -2191,13 +2195,13 @@ button:disabled, button.et2_button_text background-image[src$="svg"], input[type=button] background-image[src$="svg"] { background-color: #b4b4b4; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -ms-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b4b4b4), to(#b4b4b4)); - background-image: -webkit-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -o-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: linear-gradient(top, #b4b4b4, #b4b4b4); + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); + background-image: -moz-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -ms-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B4B4B4), to(#B4B4B4)); + background-image: -webkit-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -o-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: linear-gradient(top, #B4B4B4, #B4B4B4); background-repeat: repeat-x; } button.et2_button_text:hover, @@ -2246,17 +2250,17 @@ button.et2_button_with_image { background-repeat: no-repeat !important; background-position: center; background-size: 20px 20px; - background-color: #e6e6e6; + background-color: #E6E6E6; } button.et2_button_with_image background-color[url$="svg"] { background-color: #b4b4b4; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjYjRiNGI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -ms-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b4b4b4), to(#b4b4b4)); - background-image: -webkit-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: -o-linear-gradient(top, #b4b4b4, #b4b4b4); - background-image: linear-gradient(top, #b4b4b4, #b4b4b4); + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjQjRCNEI0IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); + background-image: -moz-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -ms-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#B4B4B4), to(#B4B4B4)); + background-image: -webkit-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: -o-linear-gradient(top, #B4B4B4, #B4B4B4); + background-image: linear-gradient(top, #B4B4B4, #B4B4B4); background-repeat: repeat-x; } button.et2_button_with_image.et2_button_text { @@ -2297,7 +2301,7 @@ button.et2_button_delete { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2332,7 +2336,7 @@ button.et2_button_delete:hover { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2367,7 +2371,7 @@ button.et2_button_delete:active { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2399,7 +2403,7 @@ button.et2_button_delete:active { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2446,7 +2450,7 @@ button#cancel { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2488,7 +2492,7 @@ button#cancel:active { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2551,7 +2555,7 @@ button[id="add"] { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; padding-left: 30px; background-position: 6px center; background-repeat: no-repeat; @@ -2604,7 +2608,7 @@ button[id="add"] { -webkit-overflow-scrolling: touch; } .chzn-container .chzn-results li { - color: #1e1e1e; + color: #1E1E1E; } .chzn-container .chzn-results li.highlighted { background: rgba(153, 204, 255, 0.4); @@ -2617,7 +2621,7 @@ button[id="add"] { .chzn-container-active .chzn-choices li.search-field input { color: #111 !important; border: 1px solid rgba(0, 0, 0, 0.15); - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); @@ -2636,7 +2640,7 @@ button[id="add"] { outline: 0; border-width: 1px; border-style: solid; - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); @@ -2773,7 +2777,7 @@ select:focus, outline: 0; border-width: 1px; border-style: solid; - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); @@ -2834,19 +2838,19 @@ button { padding-right: 0; border-width: 1px; border-style: solid; - border-color: #e6e6e6; + border-color: #E6E6E6; } a:link, a:visited, select, input, textarea { - color: #26537c; + color: #26537C; } a:link, a:visited { cursor: pointer; - color: #26537c; + color: #26537C; text-decoration: none; } a:hover, @@ -2970,7 +2974,7 @@ div.dhtmlxMenu_egw_SubLevelArea_Polygon table.dhtmlxMebu_SubLevelArea_Tbl div.su }*/ div#popupMainDiv { padding: 8px; - background-color: #ffffff; + background-color: #FFFFFF; background-repeat: repeat-x; } div#popupMainDiv > * { @@ -3005,8 +3009,8 @@ form.et2_container div table.et2_grid tbody tr td .et2_tabbox .et2_tabs table.et background-color: #ffffff; } .high { - border-top: 5px solid #e6e6e6; - border-bottom: 5px solid #e6e6e6 !important; + border-top: 5px solid #E6E6E6; + border-bottom: 5px solid #E6E6E6 !important; } /*Main div*/ table.dialog-main-view { @@ -3057,7 +3061,7 @@ table.dialog-main-view { border-top: none; } .dialogHeader table.et2_grid .th { - background-color: #0c5da5 !important; + background-color: #0C5DA5 !important; } .dialogHeader table.et2_grid tr { height: 30px; @@ -3082,8 +3086,8 @@ table.dialog-main-view { text-align: right; } .dialogHeader td.space span img { - background: #ffffff; - border: 2px solid #ffffff; + background: #FFFFFF; + border: 2px solid #FFFFFF; /*filter grey*/ filter: url("data:image/svg+xml;utf8,#grayscale"); /* Firefox 10+, Firefox on Android */ @@ -3117,7 +3121,7 @@ tr.dialogHeader4 .et2_label { padding-left: 0em; margin: 0; background-image: none; - background-color: #ffffff; + background-color: #FFFFFF; } .et2_tabheader :first-child { margin-left: 0px; @@ -3135,7 +3139,7 @@ tr.dialogHeader4 .et2_label { -moz-user-select: none; user-select: none; min-width: 73px; - border-bottom: 3px solid #e6e6e6; + border-bottom: 3px solid #E6E6E6; margin-bottom: -3px; } .et2_tabflag:hover, @@ -3166,10 +3170,10 @@ td.etemplate_tab_active.th { .et2_tabs, .tab_body { border: none; - border-bottom: 1px solid #e6e6e6; - border-top: 1px solid #e6e6e6; + border-bottom: 1px solid #E6E6E6; + border-top: 1px solid #E6E6E6; padding: 5px; - background-color: #ffffff; + background-color: #FFFFFF; margin-bottom: 11px; margin-top: 3px; padding-top: 15px; @@ -3202,8 +3206,8 @@ div#etemplate\.tab_widget { # dialogOperators # #############################################*/ .dialogOperators { - border-top: 0px solid #e6e6e6; - border-bottom: 0px solid #e6e6e6; + border-top: 0px solid #E6E6E6; + border-bottom: 0px solid #E6E6E6; } .dialogOperators td { padding: 2px 2px; @@ -3321,7 +3325,7 @@ div.admin-config form > table td b { * Message in popup */ body > div#egw_message { - background-color: #e6e6e6; + background-color: #E6E6E6; right: 33%; box-shadow: 2px 3px 13px #666666; -moz-box-shadow: 2px 3px 13px #666666; @@ -3335,7 +3339,7 @@ body > div#egw_message { margin: 0px auto; max-width: 90%; white-space: pre-wrap; - border-top: 6px solid #33cc66; + border-top: 6px solid #33CC66; } /** * Less-file for egroupware @@ -3467,7 +3471,7 @@ table.nextmatch_lettersearch { margin-bottom: 6px; } .lettersearch { - border: 1px solid #e6e6e6; + border: 1px solid #E6E6E6; background: #f8f8f8; text-align: center; cursor: pointer; @@ -3477,7 +3481,7 @@ table.nextmatch_lettersearch { color: #ffffff; } .lettersearch_active { - border: 1px solid #e6e6e6; + border: 1px solid #E6E6E6; background: #f8f8f8; text-align: center; cursor: pointer; @@ -3538,7 +3542,7 @@ td.lettersearch { -moz-transition-timing-function: linear; -o-transition-timing-function: linear; transition-timing-function: linear; - background-color: #e6e6e6; + background-color: #E6E6E6; height: 24px; padding: 0 5px; } @@ -3762,7 +3766,7 @@ td.lettersearch { } /*popup Messsage*/ div#egwpopup_message { - background-color: #ffffff; + background-color: #FFFFFF; padding: 1em; overflow-y: auto; } @@ -3770,7 +3774,7 @@ div#egwpopup_message { .message { color: red; font-style: italic; - background: #ffffff; + background: #FFFFFF; } .egw_fw_ui_app_header_container { height: auto; @@ -3795,15 +3799,15 @@ div#egwpopup_message { } /*Calendar ##############*/ td.message { - background-color: #e6e6e6 !important; + background-color: #E6E6E6 !important; height: 0px; padding: 0px; } td.message span.message { height: 35px; - border-bottom: 2px solid #e6e6e6; + border-bottom: 2px solid #E6E6E6; color: red; - background: #e6e6e6; + background: #E6E6E6; height: auto; width: 100%; } @@ -4074,13 +4078,13 @@ td.message span.message { /*print*/ } #egw_fw_header #egw_fw_topmenu #egw_fw_topmenu_items ul li { - color: #ffffff; + color: #FFFFFF; padding: 8px 10px; - border-top: #e6e6e6; + border-top: #E6E6E6; } #egw_fw_header #egw_fw_topmenu #egw_fw_topmenu_items ul li:hover { background: rgba(153, 204, 255, 0.4); - color: #ffffff; + color: #FFFFFF; } #egw_fw_header #egw_fw_topmenu #egw_fw_topmenu_items ul li a { color: #000000; @@ -4427,7 +4431,7 @@ td.message span.message { line-height: 17px; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_header object { - background-color: #ffffff; + background-color: #FFFFFF; width: 24px; height: 24px; } @@ -4486,7 +4490,7 @@ td.message span.message { #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content { display: block; background-image: none; - border-color: #b4b4b4; + border-color: #B4B4B4; border-style: solid; border-width: 1px; margin: 0 0 2em 0; @@ -4495,7 +4499,7 @@ td.message span.message { } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content:nth-last-of-type(-n+3) { background-color: #ffffff; - border-color: #b4b4b4; + border-color: #B4B4B4; border-right: 0px; margin-bottom: 10px; border-top-color: white; @@ -4505,8 +4509,8 @@ td.message span.message { margin: 4px 5px 5px 5px; padding: 2px 0 2px 0; cursor: pointer; - border-color: #b4b4b4; - background-color: #e6e6e6; + border-color: #B4B4B4; + background-color: #E6E6E6; /*background-color: @egw_color_2_d;*/ } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category h1 { @@ -4528,7 +4532,7 @@ td.message span.message { #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active { border-bottom-width: 0px; margin-top: 4px; - background-color: #0c5da5; + background-color: #0C5DA5; color: #f2f2f2; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h1 { @@ -4555,7 +4559,7 @@ td.message span.message { background-color: inherit; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_scrollarea_outerdiv .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active:hover { - background-color: #408dd2; + background-color: #408DD2; -webkit-transition: all 0.2s ease-out; -moz-transition: all 0.2s ease-out; -o-transition: all 0.2s ease-out; @@ -4590,7 +4594,7 @@ td.message span.message { right: 0px; } #egw_fw_sidebar #egw_fw_splitter:hover { - border-color: #e6e6e6; + border-color: #E6E6E6; } #egw_fw_basecontainer #egw_fw_toggler { display: block; @@ -4764,7 +4768,7 @@ td.message span.message { border-bottom-left-radius: 10px; border-top-left-radius: 0; /*.background-clip(padding-box);*/ - border-color: #b4b4b4; + border-color: #B4B4B4; margin-bottom: 5px; } .egw_fw_ui_category_content img { @@ -4791,7 +4795,7 @@ td.message span.message { margin: 0px 0 1px 0px; position: relative; min-height: 18px; - background-color: #ffffff; + background-color: #FFFFFF; overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; @@ -4863,7 +4867,7 @@ td.message span.message { width: 10px; } .egw_fw_ui_sidemenu_listitem div a:nth-child(2):hover { - background-color: #ff0000; + background-color: #FF0000; /*.background_color_20_gray;*/ -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); @@ -5186,7 +5190,7 @@ td.message span.message { #egw_fw_topmenu_info_items #topmenu_info_quick_add span#quick_add:before { content: " "; font-size: 2em; - color: #0c5da5; + color: #0C5DA5; line-height: 0.6em; background-color: white; } @@ -5197,7 +5201,7 @@ td.message span.message { top: 47px; min-width: 160px !important; width: 160px !important; - background: #ffffff; + background: #FFFFFF; } #egw_fw_topmenu_info_items #topmenu_info_quick_add .chzn-container:before { content: ''; @@ -5254,7 +5258,7 @@ td.message span.message { top: 6px; right: 112px; z-index: 200; - background-color: #ff0000; + background-color: #FF0000; -moz-transition: all 1s ease-in-out; -webkit-transition: all 1s ease-in-out; -o-transition: all 1s ease-in-out; @@ -5417,7 +5421,7 @@ button.image_button { outline: 0; border-width: 1px; border-style: solid; - border-color: #b4b4b4; + border-color: #B4B4B4; -webkit-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1); @@ -5485,11 +5489,11 @@ button.image_button { display: block; outline: none; padding: 7px 0 7px 3px; - color: #26537c; + color: #26537C; } .sbOptions a:link, .sbOptions a:visited { - color: #26537c; + color: #26537C; text-decoration: none; } .sbOptions a:hover, @@ -5564,7 +5568,7 @@ button.image_button { */ /* TABLE STYLE */ .th { - border-bottom: 1px solid #e6e6e6; + border-bottom: 1px solid #E6E6E6; } .th.thb { border-color: darkgray; @@ -5599,7 +5603,7 @@ table.egwGridView_outer thead tr th { background-position: -200px; font-weight: normal; padding: 3px 1px 3px 4px; - border: 1px solid #b4b4b4; + border: 1px solid #B4B4B4; border-top: transparent; vertical-align: middle; overflow: auto; @@ -5667,7 +5671,7 @@ table.egwGridView_outer > tbody > tr > td { } table.egwGridView_outer > tbody > tr > td .et2_link { margin-left: 0px; - color: #26537c; + color: #26537C; } table.egwGridView_outer > tbody > tr > td img { border: 1px solid transparent; @@ -5707,7 +5711,7 @@ table.egwGridView_grid tbody tr.selected { background-color: rgba(102, 153, 204, 0.7); } table.egwGridView_grid tbody td { - border-bottom: 1px solid #e6e6e6; + border-bottom: 1px solid #E6E6E6; color: #000000; } table.egwGridView_grid tbody td .innerContainer { @@ -5741,7 +5745,7 @@ table.egwGridView_grid > tr > td { border-right: 1px; padding: 0.3em 0 0.3em 0.3em; border-bottom: 1px solid; - color: #e6e6e6; + color: #E6E6E6; /*&:hover {background-color: @egw_color_2_e;} legacy*/ } table.egwGridView_grid > tr > td:active { @@ -5828,7 +5832,7 @@ table.nextmatch_header img { font-size: 1.5em; } .egwGridView_empty td { - color: #1e1e1e !important; + color: #1E1E1E !important; } /** * EGroupware: Stylite Pixelegg template @@ -6368,10 +6372,10 @@ div[id^="bookmarks-"] .search.nm-mob-header, form[id^="bookmarks-"] .search.nm-mob-header, div[id^="bookmarks-"] .dialogHeadbar, form[id^="bookmarks-"] .dialogHeadbar { - background-color: #cc6633; + background-color: #CC6633; } #bookmarks_sidebox_header { - border-left: 6px solid #cc6633 !important; + border-left: 6px solid #CC6633 !important; } div[id^="calendar-"] .nm_favorites_div .et2_dropdown button:nth-child(2), form[id^="calendar-"] .nm_favorites_div .et2_dropdown button:nth-child(2), @@ -6381,10 +6385,10 @@ div[id^="calendar-"] .search.nm-mob-header, form[id^="calendar-"] .search.nm-mob-header, div[id^="calendar-"] .dialogHeadbar, form[id^="calendar-"] .dialogHeadbar { - background-color: #cc0033; + background-color: #CC0033; } #calendar_sidebox_header { - border-left: 6px solid #cc0033 !important; + border-left: 6px solid #CC0033 !important; } div[id^="filemanager-"] .nm_favorites_div .et2_dropdown button:nth-child(2), form[id^="filemanager-"] .nm_favorites_div .et2_dropdown button:nth-child(2), @@ -6537,7 +6541,7 @@ form[id^="ranking-"] .dialogHeadbar { background-color: #006699 !important; } #egw_fw_sidebar #egw_fw_sidemenu #calendar_sidebox_content .egw_fw_ui_category_active { - background-color: #cc0033 !important; + background-color: #CC0033 !important; } #egw_fw_sidebar #egw_fw_sidemenu #tracker_sidebox_content .egw_fw_ui_category_active { background-color: #009966 !important; @@ -6555,7 +6559,7 @@ form[id^="ranking-"] .dialogHeadbar { background-color: #ff9933 !important; } #egw_fw_sidebar #egw_fw_sidemenu #bookmarks_sidebox_content .egw_fw_ui_category_active { - background-color: #cc6633 !important; + background-color: #CC6633 !important; } #egw_fw_sidebar #egw_fw_sidemenu #projectmanager_sidebox_content .egw_fw_ui_category_active { background-color: #669999 !important; @@ -6593,34 +6597,34 @@ form[id^="ranking-"] .dialogHeadbar { } #egw_fw_basecontainer.egw_fw_sidebar_toggleOn #bookmarks_sidebox_header.egw_fw_ui_sidemenu_entry_header_active { background-color: rgba(204, 102, 51, 0.3); - border-left: 4px solid #cc6633 !important; + border-left: 4px solid #CC6633 !important; } #bookmarks_sidebox_header.egw_fw_ui_sidemenu_entry_header_active { - border-top: 4px solid #cc6633 !important; + border-top: 4px solid #CC6633 !important; border-left: 0px !important; } #bookmarks_sidebox_header { - border-left: 4px solid #cc6633 !important; + border-left: 4px solid #CC6633 !important; } #egw_fw_main #egw_fw_tabs .egw_fw_ui_tabs_header #bookmarks-egw_fw_ui_tab_header.egw_fw_ui_tab_header_active { border-top: 4px solid; - border-top-color: #cc6633; + border-top-color: #CC6633; border-top-width: 4px !important; } #egw_fw_basecontainer.egw_fw_sidebar_toggleOn #calendar_sidebox_header.egw_fw_ui_sidemenu_entry_header_active { background-color: rgba(204, 0, 51, 0.3); - border-left: 4px solid #cc0033 !important; + border-left: 4px solid #CC0033 !important; } #calendar_sidebox_header.egw_fw_ui_sidemenu_entry_header_active { - border-top: 4px solid #cc0033 !important; + border-top: 4px solid #CC0033 !important; border-left: 0px !important; } #calendar_sidebox_header { - border-left: 4px solid #cc0033 !important; + border-left: 4px solid #CC0033 !important; } #egw_fw_main #egw_fw_tabs .egw_fw_ui_tabs_header #calendar-egw_fw_ui_tab_header.egw_fw_ui_tab_header_active { border-top: 4px solid; - border-top-color: #cc0033; + border-top-color: #CC0033; border-top-width: 4px !important; } #egw_fw_basecontainer.egw_fw_sidebar_toggleOn #filemanager_sidebox_header.egw_fw_ui_sidemenu_entry_header_active { diff --git a/pixelegg/less/layout_loginPage.less b/pixelegg/less/layout_loginPage.less index bdbcf7eab6..3b6a1e1559 100644 --- a/pixelegg/less/layout_loginPage.less +++ b/pixelegg/less/layout_loginPage.less @@ -265,7 +265,7 @@ div#loginMainDiv.stockLoginBackground { margin-top: 7px; width: auto; } - input[type="submit"] { + input[type="submit"], select.onChangeSubmit { background-color: #0a5ca5; .color_0_gray; .fontsize_xxl; @@ -275,6 +275,9 @@ div#loginMainDiv.stockLoginBackground { &:focus {} margin-top: 25px; } + select.onChangeSubmit { + padding-left: 25px; + } .registration { font-size: 11px; a:not(:first-child) { diff --git a/pixelegg/login.tpl b/pixelegg/login.tpl index 2f013d2142..d4dd9ef075 100644 --- a/pixelegg/login.tpl +++ b/pixelegg/login.tpl @@ -28,6 +28,13 @@ + + + + {discovery} + + + diff --git a/pixelegg/login_mobile.tpl b/pixelegg/login_mobile.tpl index 6d4c3f9eac..3faf5fe2c4 100644 --- a/pixelegg/login_mobile.tpl +++ b/pixelegg/login_mobile.tpl @@ -75,6 +75,13 @@ + + + + {discovery} + + + diff --git a/saml/_egw_include.php b/saml/_egw_include.php index 18e6f4cd3f..22aa08867a 100644 --- a/saml/_egw_include.php +++ b/saml/_egw_include.php @@ -9,21 +9,26 @@ * @subpackage authentication */ +use EGroupware\Api; + // we have to set session-cookie name used by EGroupware! ini_set('session.name', 'sessionid'); +require_once __DIR__.'/../api/src/autoload.php'; + $GLOBALS['egw_info'] = [ 'flags' => [ //'currentapp' => 'login', // db connection, no auth 'noapi' => true, // no db connection, but autoloader, files_dir MUST be set correct! ], 'server' => [ - 'files_dir' => '/var/lib/egroupware/default/files', - 'temp_dir' => '/tmp', + // default files and temp directories for name based instances (eg. our hosting) or container installation + 'files_dir' => file_exists('/var/lib/egroupware/'.Api\Header\Http::host().'/files') ? + '/var/lib/egroupware/'.Api\Header\Http::host().'/files' : '/var/lib/egroupware/default/files', + 'temp_dir' => file_exists('/var/lib/egroupware/'.Api\Header\Http::host().'/tmp') ? + '/var/lib/egroupware/'.Api\Header\Http::host().'/tmp' : '/tmp', ], ]; require_once __DIR__.'/../header.inc.php'; -use EGroupware\Api; - Api\Auth\Saml::checkDefaultConfig(); \ No newline at end of file diff --git a/setup/templates/default/config.tpl b/setup/templates/default/config.tpl index d52bc530ca..d1fcd6ee92 100644 --- a/setup/templates/default/config.tpl +++ b/setup/templates/default/config.tpl @@ -478,9 +478,14 @@ {lang_If_using_SAML_2.0 / Shibboleth / SimpleSAMLphp}: + + {lang_Label_to_display_as_option_on_login_page}:
{lang_or_leave_empty_and_select_SAML_as_authentication_type_above_for_single_sign_on} + + + - {lang_Identity_Provider}: - + {lang_Identity_Provider}:
{lang_You_can_specify_multiple_IdP_on_separate_lines.} + @@ -490,7 +495,6 @@ @@ -536,7 +540,11 @@ - {lang_The_used_SimpleSAMLphp_allows_a_lot_more_configuration_/_different_authentication_types_via_its_config_files in} {value_files_dir}/saml + + {lang_The_used_SimpleSAMLphp_allows_a_lot_more_configuration_/_different_authentication_types_via_its_config_files in} {value_files_dir}/saml
+ {lang_More_information}: + https://github.com/EGroupware/egroupware/blob/master/api/src/Auth/Saml.php +