diff --git a/inc/simplesamlphp/README.md b/inc/simplesamlphp/README.md new file mode 100644 index 0000000..4095f0c --- /dev/null +++ b/inc/simplesamlphp/README.md @@ -0,0 +1,7 @@ +SimpleSAMLphp +============= + +This is the official repository of the SimpleSAMLphp software. + +* [SimpleSAMLphp homepage](https://simplesamlphp.org) +* [SimpleSAMLphp Downloads](https://simplesamlphp.org/download) diff --git a/inc/simplesamlphp/attributemap/name2claim.php b/inc/simplesamlphp/attributemap/name2claim.php new file mode 100644 index 0000000..ba32920 --- /dev/null +++ b/inc/simplesamlphp/attributemap/name2claim.php @@ -0,0 +1,14 @@ + 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country', + 'givenName' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname', + 'mail' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress', + 'memberOf' => 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role', + 'postalcode' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode', + 'uid' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name', + 'sn' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname', + 'st' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince', + 'streetaddress' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress', + 'telephonenumber' => 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone', +); +?> diff --git a/inc/simplesamlphp/bin/build-release.sh b/inc/simplesamlphp/bin/build-release.sh index 3e77c88..179ca1c 100755 --- a/inc/simplesamlphp/bin/build-release.sh +++ b/inc/simplesamlphp/bin/build-release.sh @@ -15,8 +15,6 @@ fi cd /tmp -REPOPATH="http://simplesamlphp.googlecode.com/svn/tags/$TAG/" - if [ -a "$TAG" ]; then echo "$0: Destination already exists: $TAG" >&2 exit 1 @@ -24,7 +22,20 @@ fi umask 0022 +REPOPATH="http://simplesamlphp.googlecode.com/svn/tags/$TAG/" + svn export "$REPOPATH" + +# Use composer only on newer versions that have a composer.json +if [ -f "$TAG/composer.json" ]; then + if [ ! -x composer.phar ]; then + curl -sS https://getcomposer.org/installer | php + fi + + # Install dependencies (without vcs history or dev tools) + php composer.phar install --no-dev --prefer-dist -o -d "$TAG" +fi + mkdir -p "$TAG/config" "$TAG/metadata" cp -rv "$TAG/config-templates/"* "$TAG/config/" cp -rv "$TAG/metadata-templates/"* "$TAG/metadata/" diff --git a/inc/simplesamlphp/bin/pack.php b/inc/simplesamlphp/bin/pack.php index f69cafb..3328cf2 100755 --- a/inc/simplesamlphp/bin/pack.php +++ b/inc/simplesamlphp/bin/pack.php @@ -12,7 +12,7 @@ if (count($argv) < 1) { } // Needed in order to make session_start to be called before output is printed. -$session = SimpleSAML_Session::getInstance(); +$session = SimpleSAML_Session::getSessionFromRequest(); $config = SimpleSAML_Configuration::getConfig('config.php'); diff --git a/inc/simplesamlphp/bin/pwgen.php b/inc/simplesamlphp/bin/pwgen.php index 31a8eb9..83b4dfe 100755 --- a/inc/simplesamlphp/bin/pwgen.php +++ b/inc/simplesamlphp/bin/pwgen.php @@ -1,7 +1,6 @@ #!/usr/bin/env php getMessage()); + } break; case 'push': @@ -189,4 +195,4 @@ function json_format($data, $indentation = '') { return $ret; } -?> \ No newline at end of file +?> diff --git a/inc/simplesamlphp/composer.json b/inc/simplesamlphp/composer.json new file mode 100644 index 0000000..77ccb2b --- /dev/null +++ b/inc/simplesamlphp/composer.json @@ -0,0 +1,34 @@ +{ + "name": "simplesamlphp/simplesamlphp", + "description": "A PHP implementation of SAML 2.0 service provider and identity provider functionality. And is also compatible with Shibboleth 1.3 and 2.0.", + "type": "project", + "keywords": [ "saml2", "shibboleth","aselect","openid","oauth","ws-federation","sp","idp" ], + "homepage": "http://simplesamlphp.org", + "license": "LGPL-2.1", + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + }, + { + "name": "Olav Morken", + "email": "olav.morken@uninett.no" + } + ], + "autoload": { + "psr-0": { + "SimpleSAML_": "lib/" + }, + "files": ["lib/_autoload_modules.php"] + }, + "require": { + "php": "~5.3", + "simplesamlphp/saml2": "~0.3", + "simplesamlphp/xmlseclibs": "~1.3.2", + "openid/php-openid": "dev-master#ee669c6a9d4d95b58ecd9b6945627276807694fb as 2.2.2" + }, + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp" + } +} diff --git a/inc/simplesamlphp/composer.lock b/inc/simplesamlphp/composer.lock new file mode 100644 index 0000000..bf27fd6 --- /dev/null +++ b/inc/simplesamlphp/composer.lock @@ -0,0 +1,214 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "e609dc6172b06d1dd51be10f92c4d18b", + "packages": [ + { + "name": "openid/php-openid", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/openid/php-openid.git", + "reference": "ee669c6a9d4d95b58ecd9b6945627276807694fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openid/php-openid/zipball/fff9217fb1acda132702730b66b10981ea9d4cac", + "reference": "ee669c6a9d4d95b58ecd9b6945627276807694fb", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gmp": "*", + "php": ">=4.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Auth" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "." + ], + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "JanRain Inc.", + "homepage": "http://www.openidenabled.com" + } + ], + "description": "OpenID library for PHP5", + "homepage": "http://github.com/openid/php-openid", + "keywords": [ + "Authentication", + "OpenId", + "auth", + "yadis" + ], + "time": "2013-10-03 21:21:20" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "simplesamlphp/saml2", + "version": "v0.5.0", + "source": { + "type": "git", + "url": "https://github.com/simplesamlphp/saml2.git", + "reference": "497152245ec73c3f96c84306dcddf850017b84a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/497152245ec73c3f96c84306dcddf850017b84a8", + "reference": "497152245ec73c3f96c84306dcddf850017b84a8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mcrypt": "*", + "ext-openssl": "*", + "php": ">=5.3.3", + "psr/log": "1.0.0", + "simplesamlphp/xmlseclibs": "~1.3.1" + }, + "require-dev": { + "phpmd/phpmd": "~1.5", + "phpunit/phpunit": "~3.7", + "sebastian/phpcpd": "~1.4", + "sensiolabs/security-checker": "~1.1", + "squizlabs/php_codesniffer": "~1.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "SAML2_": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + } + ], + "description": "SAML2 PHP library from SimpleSAMLphp", + "time": "2014-10-07 13:40:34" + }, + { + "name": "simplesamlphp/xmlseclibs", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/simplesamlphp/xmlseclibs.git", + "reference": "734e80899ade295b979de08553161cad63c2dd98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplesamlphp/xmlseclibs/zipball/734e80899ade295b979de08553161cad63c2dd98", + "reference": "734e80899ade295b979de08553161cad63c2dd98", + "shasum": "" + }, + "replace": { + "cdatazone/xmlseclibs": "self.version", + "fr3d/xmlseclibs": "self.version", + "robrichards/xmlseclibs": "self.version" + }, + "suggest": { + "ext/mcrypt": "", + "ext/openssl": "" + }, + "type": "library", + "autoload": { + "files": [ + "xmlseclibs.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Rob Richards" + } + ], + "description": "A PHP library for XML Security", + "homepage": "http://code.google.com/p/xmlseclibs/", + "keywords": [ + "certificate", + "security", + "signature", + "signing", + "x.509", + "xml", + "xmlsec" + ], + "time": "2013-06-19 00:00:00" + } + ], + "packages-dev": [], + "aliases": [ + { + "alias": "2.2.2", + "alias_normalized": "2.2.2.0", + "version": "9999999-dev", + "package": "openid/php-openid" + } + ], + "minimum-stability": "stable", + "stability-flags": { + "openid/php-openid": 20 + }, + "prefer-stable": false, + "platform": { + "php": "~5.3" + }, + "platform-dev": [] +} diff --git a/inc/simplesamlphp/config-templates/authsources.php b/inc/simplesamlphp/config-templates/authsources.php index 87d1834..e077d2f 100644 --- a/inc/simplesamlphp/config-templates/authsources.php +++ b/inc/simplesamlphp/config-templates/authsources.php @@ -2,346 +2,387 @@ $config = array( - // This is a authentication source which handles admin authentication. - 'admin' => array( - // The default is to use core:AdminPassword, but it can be replaced with - // any authentication source. + // This is a authentication source which handles admin authentication. + 'admin' => array( + // The default is to use core:AdminPassword, but it can be replaced with + // any authentication source. - 'core:AdminPassword', - ), + 'core:AdminPassword', + ), - // An authentication source which can authenticate against both SAML 2.0 - // and Shibboleth 1.3 IdPs. - 'default-sp' => array( - 'saml:SP', + // An authentication source which can authenticate against both SAML 2.0 + // and Shibboleth 1.3 IdPs. + 'default-sp' => array( + 'saml:SP', - // 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, + // 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, - // The entity ID of the IdP this should SP should contact. - // Can be NULL/unset, in which case the user will be shown a list of available IdPs. - 'idp' => NULL, + // The entity ID of the IdP this should SP should contact. + // Can be NULL/unset, in which case the user will be shown a list of available IdPs. + 'idp' => null, - // The URL to the discovery service. - // Can be NULL/unset, in which case a builtin discovery service will be used. - 'discoURL' => NULL, - ), + // The URL to the discovery service. + // Can be NULL/unset, in which case a builtin discovery service will be used. + 'discoURL' => null, + + /* + * WARNING: SHA-1 is disallowed starting January the 1st, 2014. + * + * Uncomment the following option to start using SHA-256 for your signatures. + * Currently, simpleSAMLphp defaults to SHA-1, which has been deprecated since + * 2011, and will be disallowed by NIST as of 2014. Please refer to the following + * document for more information: + * + * http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf + * + * If you are uncertain about identity providers supporting SHA-256 or other + * algorithms of the SHA-2 family, you can configure it individually in the + * IdP-remote metadata set for those that support it. Once you are certain that + * all your configured IdPs support SHA-2, you can safely remove the configuration + * options in the IdP-remote metadata set and uncomment the following option. + * + * Please refer to the hosted SP configuration reference for more information. + */ + //'signature.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', + + /* + * The attributes parameter must contain an array of desired attributes by the SP. + * The attributes can be expressed as an array of names or as an associative array + * in the form of 'friendlyName' => 'name'. + * The metadata will then be created as follows: + * + */ + /*'attributes' => array( + 'attrname' => 'urn:oid:x.x.x.x', + ),*/ + /*'attributes.required' => array ( + 'urn:oid:x.x.x.x', + ),*/ + ), - /* - 'example-sql' => array( - 'sqlauth:SQL', - 'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml', - 'username' => 'simplesaml', - 'password' => 'secretpassword', - 'query' => 'SELECT "username", "name", "email" FROM "users" WHERE "username" = :username AND "password" = :password', - ), - */ + /* + 'example-sql' => array( + 'sqlauth:SQL', + 'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'secretpassword', + 'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);', + ), + */ - /* - 'example-static' => array( - 'exampleauth:Static', - 'uid' => array('testuser'), - 'eduPersonAffiliation' => array('member', 'employee'), - 'cn' => array('Test User'), - ), - */ + /* + 'example-static' => array( + 'exampleauth:Static', + 'uid' => array('testuser'), + 'eduPersonAffiliation' => array('member', 'employee'), + 'cn' => array('Test User'), + ), + */ - /* - 'example-userpass' => array( - 'exampleauth:UserPass', + /* + 'example-userpass' => array( + 'exampleauth:UserPass', - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - 'student:studentpass' => array( - 'uid' => array('test'), - 'eduPersonAffiliation' => array('member', 'student'), - ), - 'employee:employeepass' => array( - 'uid' => array('employee'), - 'eduPersonAffiliation' => array('member', 'employee'), - ), - ), - */ + 'student:studentpass' => array( + 'uid' => array('test'), + 'eduPersonAffiliation' => array('member', 'student'), + ), + 'employee:employeepass' => array( + 'uid' => array('employee'), + 'eduPersonAffiliation' => array('member', 'employee'), + ), + ), + */ - /* - 'crypto-hash' => array( - 'authcrypt:Hash', - // hashed version of 'verysecret', made with bin/pwgen.php - 'professor:{SSHA256}P6FDTEEIY2EnER9a6P2GwHhI5JDrwBgjQ913oVQjBngmCtrNBUMowA==' => array( - 'uid' => array('prof_a'), - 'eduPersonAffiliation' => array('member', 'employee', 'board'), - ), - ), - */ + /* + 'crypto-hash' => array( + 'authcrypt:Hash', + // hashed version of 'verysecret', made with bin/pwgen.php + 'professor:{SSHA256}P6FDTEEIY2EnER9a6P2GwHhI5JDrwBgjQ913oVQjBngmCtrNBUMowA==' => array( + 'uid' => array('prof_a'), + 'eduPersonAffiliation' => array('member', 'employee', 'board'), + ), + ), + */ - /* - 'htpasswd' => array( - 'authcrypt:Htpasswd', - 'htpasswd_file' => '/var/www/foo.edu/legacy_app/.htpasswd', - 'static_attributes' => array( - 'eduPersonAffiliation' => array('member', 'employee'), - 'Organization' => array('University of Foo'), - ), - ), - */ + /* + 'htpasswd' => array( + 'authcrypt:Htpasswd', + 'htpasswd_file' => '/var/www/foo.edu/legacy_app/.htpasswd', + 'static_attributes' => array( + 'eduPersonAffiliation' => array('member', 'employee'), + 'Organization' => array('University of Foo'), + ), + ), + */ - /* - // This authentication source serves as an example of integration with an - // external authentication engine. Take a look at the comment in the beginning - // of modules/exampleauth/lib/Auth/Source/External.php for a description of - // how to adjust it to your own site. - 'example-external' => array( - 'exampleauth:External', - ), - */ + /* + // This authentication source serves as an example of integration with an + // external authentication engine. Take a look at the comment in the beginning + // of modules/exampleauth/lib/Auth/Source/External.php for a description of + // how to adjust it to your own site. + 'example-external' => array( + 'exampleauth:External', + ), + */ - /* - 'yubikey' => array( - 'authYubiKey:YubiKey', - 'id' => '000', - // 'key' => '012345678', - ), - */ + /* + 'yubikey' => array( + 'authYubiKey:YubiKey', + 'id' => '000', + // 'key' => '012345678', + ), + */ - /* - 'openid' => array( - 'openid:OpenIDConsumer', - 'attributes.required' => array('nickname'), - 'attributes.optional' => array('fullname', 'email',), - // 'sreg.validate' => FALSE, - 'attributes.ax_required' => array('http://axschema.org/namePerson/friendly'), - 'attributes.ax_optional' => array('http://axschema.org/namePerson','http://axschema.org/contact/email'), - // Prefer HTTP redirect over POST - // 'prefer_http_redirect' => FALSE, - ), - */ + /* + 'openid' => array( + 'openid:OpenIDConsumer', + 'attributes.required' => array('nickname'), + 'attributes.optional' => array('fullname', 'email',), + // 'sreg.validate' => FALSE, + 'attributes.ax_required' => array('http://axschema.org/namePerson/friendly'), + 'attributes.ax_optional' => array('http://axschema.org/namePerson','http://axschema.org/contact/email'), + // Prefer HTTP redirect over POST + // 'prefer_http_redirect' => FALSE, + ), + */ - /* - // Example of an authsource that authenticates against Google. - // See: http://code.google.com/apis/accounts/docs/OpenID.html - 'google' => array( - 'openid:OpenIDConsumer', - // Googles OpenID endpoint. - 'target' => 'https://www.google.com/accounts/o8/id', - // Custom realm - // 'realm' => 'http://*.example.org', - // Attributes that google can supply. - 'attributes.ax_required' => array( - //'http://axschema.org/namePerson/first', - //'http://axschema.org/namePerson/last', - //'http://axschema.org/contact/email', - //'http://axschema.org/contact/country/home', - //'http://axschema.org/pref/language', - ), - // custom extension arguments - 'extension.args' => array( - //'http://specs.openid.net/extensions/ui/1.0' => array( - // 'mode' => 'popup', - // 'icon' => 'true', - //), - ), - ), - */ + /* + // Example of an authsource that authenticates against Google. + // See: http://code.google.com/apis/accounts/docs/OpenID.html + 'google' => array( + 'openid:OpenIDConsumer', + // Googles OpenID endpoint. + 'target' => 'https://www.google.com/accounts/o8/id', + // Custom realm + // 'realm' => 'http://*.example.org', + // Attributes that google can supply. + 'attributes.ax_required' => array( + //'http://axschema.org/namePerson/first', + //'http://axschema.org/namePerson/last', + //'http://axschema.org/contact/email', + //'http://axschema.org/contact/country/home', + //'http://axschema.org/pref/language', + ), + // custom extension arguments + 'extension.args' => array( + //'http://specs.openid.net/extensions/ui/1.0' => array( + // 'mode' => 'popup', + // 'icon' => 'true', + //), + ), + ), + */ - /* - 'papi' => array( - 'authpapi:PAPI', - ), - */ + /* + 'papi' => array( + 'authpapi:PAPI', + ), + */ - /* - 'facebook' => array( - 'authfacebook:Facebook', - // Register your Facebook application on http://www.facebook.com/developers - // App ID or API key (requests with App ID should be faster; https://github.com/facebook/php-sdk/issues/214) - 'api_key' => 'xxxxxxxxxxxxxxxx', - // App Secret - 'secret' => 'xxxxxxxxxxxxxxxx', - // which additional data permissions to request from user - // see http://developers.facebook.com/docs/authentication/permissions/ for the full list - // 'req_perms' => 'email,user_birthday', - ), - */ + /* + 'facebook' => array( + 'authfacebook:Facebook', + // Register your Facebook application on http://www.facebook.com/developers + // App ID or API key (requests with App ID should be faster; https://github.com/facebook/php-sdk/issues/214) + 'api_key' => 'xxxxxxxxxxxxxxxx', + // App Secret + 'secret' => 'xxxxxxxxxxxxxxxx', + // which additional data permissions to request from user + // see http://developers.facebook.com/docs/authentication/permissions/ for the full list + // 'req_perms' => 'email,user_birthday', + ), + */ - /* - // LinkedIn OAuth Authentication API. - // Register your application to get an API key here: - // https://www.linkedin.com/secure/developer - 'linkedin' => array( - 'authlinkedin:LinkedIn', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // LinkedIn OAuth Authentication API. + // Register your application to get an API key here: + // https://www.linkedin.com/secure/developer + 'linkedin' => array( + 'authlinkedin:LinkedIn', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - /* - // Twitter OAuth Authentication API. - // Register your application to get an API key here: - // http://twitter.com/oauth_clients - 'twitter' => array( - 'authtwitter:Twitter', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // Twitter OAuth Authentication API. + // Register your application to get an API key here: + // http://twitter.com/oauth_clients + 'twitter' => array( + 'authtwitter:Twitter', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', - /* - // MySpace OAuth Authentication API. - // Register your application to get an API key here: - // http://developer.myspace.com/ - 'myspace' => array( - 'authmyspace:MySpace', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + // Forces the user to enter their credentials to ensure the correct users account is authorized. + // Details: https://dev.twitter.com/docs/api/1/get/oauth/authenticate + 'force_login' => FALSE, + ), + */ - /* - // Windows Live ID Authentication API. - // Register your application to get an API key here: - // https://manage.dev.live.com - 'windowslive' => array( - 'authwindowslive:LiveID', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // MySpace OAuth Authentication API. + // Register your application to get an API key here: + // http://developer.myspace.com/ + 'myspace' => array( + 'authmyspace:MySpace', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - /* - // Example of a LDAP authentication source. - 'example-ldap' => array( - 'ldap:LDAP', + /* + // Windows Live ID Authentication API. + // Register your application to get an API key here: + // https://manage.dev.live.com + 'windowslive' => array( + 'authwindowslive:LiveID', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + /* + // Example of a LDAP authentication source. + 'example-ldap' => array( + 'ldap:LDAP', - // The hostname of the LDAP server. - 'hostname' => 'ldap.example.org', + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - // Whether SSL/TLS should be used when contacting the LDAP server. - 'enable_tls' => FALSE, + // The hostname of the LDAP server. + 'hostname' => 'ldap.example.org', - // Whether debug output from the LDAP library should be enabled. - // Default is FALSE. - 'debug' => FALSE, + // Whether SSL/TLS should be used when contacting the LDAP server. + 'enable_tls' => TRUE, - // The timeout for accessing the LDAP server, in seconds. - // The default is 0, which means no timeout. - 'timeout' => 0, + // Whether debug output from the LDAP library should be enabled. + // Default is FALSE. + 'debug' => FALSE, - // Which attributes should be retrieved from the LDAP server. - // This can be an array of attribute names, or NULL, in which case - // all attributes are fetched. - 'attributes' => NULL, + // The timeout for accessing the LDAP server, in seconds. + // The default is 0, which means no timeout. + 'timeout' => 0, - // The pattern which should be used to create the users DN given the username. - // %username% in this pattern will be replaced with the users username. - // - // This option is not used if the search.enable option is set to TRUE. - 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', + // Set whether to follow referrals. AD Controllers may require FALSE to function. + 'referrals' => TRUE, - // As an alternative to specifying a pattern for the users DN, it is possible to - // search for the username in a set of attributes. This is enabled by this option. - 'search.enable' => FALSE, + // Which attributes should be retrieved from the LDAP server. + // This can be an array of attribute names, or NULL, in which case + // all attributes are fetched. + 'attributes' => NULL, - // The DN which will be used as a base for the search. - // This can be a single string, in which case only that DN is searched, or an - // array of strings, in which case they will be searched in the order given. - 'search.base' => 'ou=people,dc=example,dc=org', + // The pattern which should be used to create the users DN given the username. + // %username% in this pattern will be replaced with the users username. + // + // This option is not used if the search.enable option is set to TRUE. + 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', - // The attribute(s) the username should match against. - // - // This is an array with one or more attribute names. Any of the attributes in - // the array may match the value the username. - 'search.attributes' => array('uid', 'mail'), + // As an alternative to specifying a pattern for the users DN, it is possible to + // search for the username in a set of attributes. This is enabled by this option. + 'search.enable' => FALSE, - // The username & password the simpleSAMLphp should bind to before searching. If - // this is left as NULL, no bind will be performed before searching. - 'search.username' => NULL, - 'search.password' => NULL, + // The DN which will be used as a base for the search. + // This can be a single string, in which case only that DN is searched, or an + // array of strings, in which case they will be searched in the order given. + 'search.base' => 'ou=people,dc=example,dc=org', - // If the directory uses privilege separation, - // the authenticated user may not be able to retrieve - // all required attribures, a privileged entity is required - // to get them. This is enabled with this option. - 'priv.read' => FALSE, + // The attribute(s) the username should match against. + // + // This is an array with one or more attribute names. Any of the attributes in + // the array may match the value the username. + 'search.attributes' => array('uid', 'mail'), - // The DN & password the simpleSAMLphp should bind to before - // retrieving attributes. These options are required if - // 'priv.read' is set to TRUE. - 'priv.username' => NULL, - 'priv.password' => NULL, + // The username & password the simpleSAMLphp should bind to before searching. If + // this is left as NULL, no bind will be performed before searching. + 'search.username' => NULL, + 'search.password' => NULL, - ), - */ + // If the directory uses privilege separation, + // the authenticated user may not be able to retrieve + // all required attribures, a privileged entity is required + // to get them. This is enabled with this option. + 'priv.read' => FALSE, - /* - // Example of an LDAPMulti authentication source. - 'example-ldapmulti' => array( - 'ldap:LDAPMulti', + // The DN & password the simpleSAMLphp should bind to before + // retrieving attributes. These options are required if + // 'priv.read' is set to TRUE. + 'priv.username' => NULL, + 'priv.password' => NULL, - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + ), + */ - // The way the organization as part of the username should be handled. - // Three possible values: - // - 'none': No handling of the organization. Allows '@' to be part - // of the username. - // - 'allow': Will allow users to type 'username@organization'. - // - 'force': Force users to type 'username@organization'. The dropdown - // list will be hidden. - // - // The default is 'none'. - 'username_organization_method' => 'none', + /* + // Example of an LDAPMulti authentication source. + 'example-ldapmulti' => array( + 'ldap:LDAPMulti', - // Whether the organization should be included as part of the username - // when authenticating. If this is set to TRUE, the username will be on - // the form @. If this is FALSE, the - // username will be used as the user enters it. - // - // The default is FALSE. - 'include_organization_in_username' => FALSE, + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - // A list of available LDAP servers. - // - // The index is an identifier for the organization/group. When - // 'username_organization_method' is set to something other than 'none', - // the organization-part of the username is matched against the index. - // - // The value of each element is an array in the same format as an LDAP - // authentication source. - 'employees' => array( - // A short name/description for this group. Will be shown in a dropdown list - // when the user logs on. - // - // This option can be a string or an array with language => text mappings. - 'description' => 'Employees', + // The way the organization as part of the username should be handled. + // Three possible values: + // - 'none': No handling of the organization. Allows '@' to be part + // of the username. + // - 'allow': Will allow users to type 'username@organization'. + // - 'force': Force users to type 'username@organization'. The dropdown + // list will be hidden. + // + // The default is 'none'. + 'username_organization_method' => 'none', - // The rest of the options are the same as those available for - // the LDAP authentication source. - 'hostname' => 'ldap.employees.example.org', - 'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org', - ), + // Whether the organization should be included as part of the username + // when authenticating. If this is set to TRUE, the username will be on + // the form @. If this is FALSE, the + // username will be used as the user enters it. + // + // The default is FALSE. + 'include_organization_in_username' => FALSE, - 'students' => array( - 'description' => 'Students', + // A list of available LDAP servers. + // + // The index is an identifier for the organization/group. When + // 'username_organization_method' is set to something other than 'none', + // the organization-part of the username is matched against the index. + // + // The value of each element is an array in the same format as an LDAP + // authentication source. + 'employees' => array( + // A short name/description for this group. Will be shown in a dropdown list + // when the user logs on. + // + // This option can be a string or an array with language => text mappings. + 'description' => 'Employees', - 'hostname' => 'ldap.students.example.org', - 'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org', - ), + // The rest of the options are the same as those available for + // the LDAP authentication source. + 'hostname' => 'ldap.employees.example.org', + 'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org', + ), - ), - */ + 'students' => array( + 'description' => 'Students', + + 'hostname' => 'ldap.students.example.org', + 'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org', + ), + + ), + */ ); diff --git a/inc/simplesamlphp/config-templates/cas-ldap.php b/inc/simplesamlphp/config-templates/cas-ldap.php index 0eba48a..b60c710 100644 --- a/inc/simplesamlphp/config-templates/cas-ldap.php +++ b/inc/simplesamlphp/config-templates/cas-ldap.php @@ -13,7 +13,7 @@ $casldapconfig = array ( ), 'ldap' => array( 'servers' => 'idpentityid.example.org', - 'enable_tls' => false, + 'enable_tls' => true, 'searchbase' => 'dc=example,dc=org', 'searchattributes' => 'uid', 'attributes' => array('cn', 'mail'), @@ -26,7 +26,7 @@ $casldapconfig = array ( ), 'ldap' => array( 'servers' => 'ldap://idpentityid2.example.org', - 'enable_tls' => false, + 'enable_tls' => true, 'searchbase' => 'ou=users,dc=example,dc=org', 'searchattributes' => array('uid', 'mail'), # array for being able to login with either uid or mail. 'attributes' => null, diff --git a/inc/simplesamlphp/config-templates/config-login-auto.php b/inc/simplesamlphp/config-templates/config-login-auto.php index 2fd0741..0248ba1 100644 --- a/inc/simplesamlphp/config-templates/config-login-auto.php +++ b/inc/simplesamlphp/config-templates/config-login-auto.php @@ -1,8 +1,6 @@ 'simplesaml/', - 'certdir' => 'cert/', - 'loggingdir' => 'log/', - 'datadir' => 'data/', + /** + * Setup the following parameters to match the directory of your installation. + * See the user manual for more details. + * + * Valid format for baseurlpath is: + * [(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/] + * (note that it must end with a '/') + * + * The full url format is useful if your simpleSAMLphp setup is hosted behind + * a reverse proxy. In that case you can specify the external url here. + * + * Please note that simpleSAMLphp will then redirect all queries to the + * external url, no matter where you come from (direct access or via the + * reverse proxy). + */ + 'baseurlpath' => 'simplesaml/', + 'certdir' => 'cert/', + 'loggingdir' => 'log/', + 'datadir' => 'data/', - /* - * A directory where simpleSAMLphp can save temporary files. - * - * SimpleSAMLphp will attempt to create this directory if it doesn't exist. - */ - 'tempdir' => '/tmp/simplesaml', - - - /* - * If you enable this option, simpleSAMLphp will log all sent and received messages - * to the log file. - * - * This option also enables logging of the messages that are encrypted and decrypted. - * - * Note: The messages are logged with the DEBUG log level, so you also need to set - * the 'logging.level' option to LOG_DEBUG. - */ - 'debug' => FALSE, + /* + * A directory where simpleSAMLphp can save temporary files. + * + * SimpleSAMLphp will attempt to create this directory if it doesn't exist. + */ + 'tempdir' => '/tmp/simplesaml', - 'showerrors' => TRUE, + /* + * If you enable this option, simpleSAMLphp will log all sent and received messages + * to the log file. + * + * This option also enables logging of the messages that are encrypted and decrypted. + * + * Note: The messages are logged with the DEBUG log level, so you also need to set + * the 'logging.level' option to LOG_DEBUG. + */ + 'debug' => false, - /** - * Custom error show function called from SimpleSAML_Error_Error::show. - * See docs/simplesamlphp-errorhandling.txt for function code example. - * - * Example: - * 'errors.show_function' => array('sspmod_example_Error_Show', 'show'), - */ + /* + * When showerrors is enabled, all error messages and stack traces will be output + * to the browser. + * + * When errorreporting is enabled, a form will be presented for the user to report + * the error to technicalcontact_email. + */ + 'showerrors' => true, + 'errorreporting' => true, - /** - * This option allows you to enable validation of XML data against its - * schemas. A warning will be written to the log if validation fails. - */ - 'debug.validatexml' => FALSE, + /** + * Custom error show function called from SimpleSAML_Error_Error::show. + * See docs/simplesamlphp-errorhandling.txt for function code example. + * + * Example: + * 'errors.show_function' => array('sspmod_example_Error_Show', 'show'), + */ - /** - * This password must be kept secret, and modified from the default value 123. - * This password will give access to the installation page of simpleSAMLphp with - * metadata listing and diagnostics pages. - * You can also put a hash here; run "bin/pwgen.php" to generate one. - */ - 'auth.adminpassword' => '123', - 'admin.protectindexpage' => false, - 'admin.protectmetadata' => false, + /** + * This option allows you to enable validation of XML data against its + * schemas. A warning will be written to the log if validation fails. + */ + 'debug.validatexml' => false, - /** - * This is a secret salt used by simpleSAMLphp when it needs to generate a secure hash - * of a value. It must be changed from its default value to a secret value. The value of - * 'secretsalt' can be any valid string of any length. - * - * A possible way to generate a random salt is by running the following command from a unix shell: - * tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo - */ - 'secretsalt' => 'defaultsecretsalt', - - /* - * Some information about the technical persons running this installation. - * The email address will be used as the recipient address for error reports, and - * also as the technical contact in generated metadata. - */ - 'technicalcontact_name' => 'Administrator', - 'technicalcontact_email' => 'na@example.org', + /** + * This password must be kept secret, and modified from the default value 123. + * This password will give access to the installation page of simpleSAMLphp with + * metadata listing and diagnostics pages. + * You can also put a hash here; run "bin/pwgen.php" to generate one. + */ + 'auth.adminpassword' => '123', + 'admin.protectindexpage' => false, + 'admin.protectmetadata' => false, - /* - * The timezone of the server. This option should be set to the timezone you want - * simpleSAMLphp to report the time in. The default is to guess the timezone based - * on your system timezone. - * - * See this page for a list of valid timezones: http://php.net/manual/en/timezones.php - */ - 'timezone' => NULL, + /** + * This is a secret salt used by simpleSAMLphp when it needs to generate a secure hash + * of a value. It must be changed from its default value to a secret value. The value of + * 'secretsalt' can be any valid string of any length. + * + * A possible way to generate a random salt is by running the following command from a unix shell: + * tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo + */ + 'secretsalt' => 'defaultsecretsalt', - /* - * Logging. - * - * define the minimum log level to log - * SimpleSAML_Logger::ERR No statistics, only errors - * SimpleSAML_Logger::WARNING No statistics, only warnings/errors - * SimpleSAML_Logger::NOTICE Statistics and errors - * SimpleSAML_Logger::INFO Verbose logs - * SimpleSAML_Logger::DEBUG Full debug logs - not reccomended for production - * - * Choose logging handler. - * - * Options: [syslog,file,errorlog] - * - */ - 'logging.level' => SimpleSAML_Logger::NOTICE, - 'logging.handler' => 'syslog', + /* + * Some information about the technical persons running this installation. + * The email address will be used as the recipient address for error reports, and + * also as the technical contact in generated metadata. + */ + 'technicalcontact_name' => 'Administrator', + 'technicalcontact_email' => 'na@example.org', - /* - * Choose which facility should be used when logging with syslog. - * - * These can be used for filtering the syslog output from simpleSAMLphp into its - * own file by configuring the syslog daemon. - * - * See the documentation for openlog (http://php.net/manual/en/function.openlog.php) for available - * facilities. Note that only LOG_USER is valid on windows. - * - * The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not. - */ - 'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER, + /* + * The timezone of the server. This option should be set to the timezone you want + * simpleSAMLphp to report the time in. The default is to guess the timezone based + * on your system timezone. + * + * See this page for a list of valid timezones: http://php.net/manual/en/timezones.php + */ + 'timezone' => null, - /* - * The process name that should be used when logging to syslog. - * The value is also written out by the other logging handlers. - */ - 'logging.processname' => 'simplesamlphp', + /* + * Logging. + * + * define the minimum log level to log + * SimpleSAML_Logger::ERR No statistics, only errors + * SimpleSAML_Logger::WARNING No statistics, only warnings/errors + * SimpleSAML_Logger::NOTICE Statistics and errors + * SimpleSAML_Logger::INFO Verbose logs + * SimpleSAML_Logger::DEBUG Full debug logs - not reccomended for production + * + * Choose logging handler. + * + * Options: [syslog,file,errorlog] + * + */ + 'logging.level' => SimpleSAML_Logger::NOTICE, + 'logging.handler' => 'syslog', - /* Logging: file - Logfilename in the loggingdir from above. - */ - 'logging.logfile' => 'simplesamlphp.log', + /* + * Specify the format of the logs. Its use varies depending on the log handler used (for instance, you cannot + * control here how dates are displayed when using the syslog or errorlog handlers), but in general the options + * are: + * + * - %date{}: the date and time, with its format specified inside the brackets. See the PHP documentation + * of the strftime() function for more information on the format. If the brackets are omitted, the standard + * format is applied. This can be useful if you just want to control the placement of the date, but don't care + * about the format. + * + * - %process: the name of the SimpleSAMLphp process. Remember you can configure this in the 'logging.processname' + * option below. + * + * - %level: the log level (name or number depending on the handler used). + * + * - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind + * the trailing space). + * + * - %trackid: the track ID, an identifier that allows you to track a single session. + * + * - %srcip: the IP address of the client. If you are behind a proxy, make sure to modify the + * $_SERVER['REMOTE_ADDR'] variable on your code accordingly to the X-Forwarded-For header. + * + * - %msg: the message to be logged. + * + */ + //'logging.format' => '%date{%b %d %H:%M:%S} %process %level %stat[%trackid] %msg', - /* (New) statistics output configuration. - * - * This is an array of outputs. Each output has at least a 'class' option, which - * selects the output. - */ - 'statistics.out' => array( - // Log statistics to the normal log. - /* - array( - 'class' => 'core:Log', - 'level' => 'notice', - ), - */ - // Log statistics to files in a directory. One file per day. - /* - array( - 'class' => 'core:File', - 'directory' => '/var/log/stats', - ), - */ - ), + /* + * Choose which facility should be used when logging with syslog. + * + * These can be used for filtering the syslog output from simpleSAMLphp into its + * own file by configuring the syslog daemon. + * + * See the documentation for openlog (http://php.net/manual/en/function.openlog.php) for available + * facilities. Note that only LOG_USER is valid on windows. + * + * The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not. + */ + 'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER, + + /* + * The process name that should be used when logging to syslog. + * The value is also written out by the other logging handlers. + */ + 'logging.processname' => 'simplesamlphp', + + /* Logging: file - Logfilename in the loggingdir from above. + */ + 'logging.logfile' => 'simplesamlphp.log', + + /* (New) statistics output configuration. + * + * This is an array of outputs. Each output has at least a 'class' option, which + * selects the output. + */ + 'statistics.out' => array(// Log statistics to the normal log. + /* + array( + 'class' => 'core:Log', + 'level' => 'notice', + ), + */ + // Log statistics to files in a directory. One file per day. + /* + array( + 'class' => 'core:File', + 'directory' => '/var/log/stats', + ), + */ + ), - /* - * Enable - * - * Which functionality in simpleSAMLphp do you want to enable. Normally you would enable only - * one of the functionalities below, but in some cases you could run multiple functionalities. - * In example when you are setting up a federation bridge. - */ - 'enable.saml20-idp' => false, - 'enable.shib13-idp' => false, - 'enable.adfs-idp' => false, - 'enable.wsfed-sp' => false, - 'enable.authmemcookie' => false, - - /* - * This value is the duration of the session in seconds. Make sure that the time duration of - * cookies both at the SP and the IdP exceeds this duration. - */ - 'session.duration' => 8 * (60*60), // 8 hours. - 'session.requestcache' => 4 * (60*60), // 4 hours - - /* - * Sets the duration, in seconds, data should be stored in the datastore. As the datastore is used for - * login and logout requests, thid option will control the maximum time these operations can take. - * The default is 4 hours (4*60*60) seconds, which should be more than enough for these operations. - */ - 'session.datastore.timeout' => (4*60*60), // 4 hours - - /* - * Sets the duration, in seconds, auth state should be stored. - */ - 'session.state.timeout' => (60*60), // 1 hour - - /* - * Option to override the default settings for the session cookie name - */ - 'session.cookie.name' => 'SimpleSAMLSessionID', - - /* - * Expiration time for the session cookie, in seconds. - * - * Defaults to 0, which means that the cookie expires when the browser is closed. - * - * Example: - * 'session.cookie.lifetime' => 30*60, - */ - 'session.cookie.lifetime' => 0, - - /* - * Limit the path of the cookies. - * - * Can be used to limit the path of the cookies to a specific subdirectory. - * - * Example: - * 'session.cookie.path' => '/simplesaml/', - */ - 'session.cookie.path' => '/', - - /* - * Cookie domain. - * - * Can be used to make the session cookie available to several domains. - * - * Example: - * 'session.cookie.domain' => '.example.org', - */ - 'session.cookie.domain' => NULL, - - /* - * Set the secure flag in the cookie. - * - * Set this to TRUE if the user only accesses your service - * through https. If the user can access the service through - * both http and https, this must be set to FALSE. - */ - 'session.cookie.secure' => FALSE, - - /* - * When set to FALSE fallback to transient session on session initialization - * failure, throw exception otherwise. - */ - 'session.disable_fallback' => FALSE, - - /* - * Enable secure POST from HTTPS to HTTP. - * - * If you have some SP's on HTTP and IdP is normally on HTTPS, this option - * enables secure POSTing to HTTP endpoint without warning from browser. - * - * For this to work, module.php/core/postredirect.php must be accessible - * also via HTTP on IdP, e.g. if your IdP is on - * https://idp.example.org/ssp/, then - * http://idp.example.org/ssp/module.php/core/postredirect.php must be accessible. - */ - 'enable.http_post' => FALSE, - - /* - * Options to override the default settings for php sessions. - */ - 'session.phpsession.cookiename' => null, - 'session.phpsession.savepath' => null, - 'session.phpsession.httponly' => FALSE, - - /* - * Option to override the default settings for the auth token cookie - */ - 'session.authtoken.cookiename' => 'SimpleSAMLAuthToken', - - /* - * Languages available, RTL languages, and what language is default - */ - 'language.available' => array('en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'fr', 'it', 'nl', 'lb', 'cs', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru', 'et', 'he', 'id', 'sr'), - 'language.rtl' => array('ar','dv','fa','ur','he'), - 'language.default' => 'en', - - /** - * Custom getLanguage function called from SimpleSAML_XHTML_Template::getLanguage(). - * Function should return language code of one of the available languages or NULL. - * See SimpleSAML_XHTML_Template::getLanguage() source code for more info. - * - * This option can be used to implement a custom function for determining - * the default language for the user. - * - * Example: - * 'language.get_language_function' => array('sspmod_example_Template', 'getLanguage'), - */ - - /* - * Extra dictionary for attribute names. - * This can be used to define local attributes. - * - * The format of the parameter is a string with :. - * - * Specifying this option will cause us to look for modules//dictionaries/.definition.json - * The dictionary should look something like: - * - * { - * "firstattribute": { - * "en": "English name", - * "no": "Norwegian name" - * }, - * "secondattribute": { - * "en": "English name", - * "no": "Norwegian name" - * } - * } - * - * Note that all attribute names in the dictionary must in lowercase. - * - * Example: 'attributes.extradictionary' => 'ourmodule:ourattributes', - */ - 'attributes.extradictionary' => NULL, - - /* - * Which theme directory should be used? - */ - 'theme.use' => 'default', - - - /* - * Default IdP for WS-Fed. - */ - 'default-wsfed-idp' => 'urn:federation:pingfederate:localhost', - - /* - * Whether the discovery service should allow the user to save his choice of IdP. - */ - 'idpdisco.enableremember' => TRUE, - 'idpdisco.rememberchecked' => TRUE, - - // Disco service only accepts entities it knows. - 'idpdisco.validate' => TRUE, - - 'idpdisco.extDiscoveryStorage' => NULL, - - /* - * IdP Discovery service look configuration. - * Wether to display a list of idp or to display a dropdown box. For many IdP' a dropdown box - * gives the best use experience. - * - * When using dropdown box a cookie is used to highlight the previously chosen IdP in the dropdown. - * This makes it easier for the user to choose the IdP - * - * Options: [links,dropdown] - * - */ - 'idpdisco.layout' => 'dropdown', - - /* - * Whether simpleSAMLphp should sign the response or the assertion in SAML 1.1 authentication - * responses. - * - * The default is to sign the assertion element, but that can be overridden by setting this - * option to TRUE. It can also be overridden on a pr. SP basis by adding an option with the - * same name to the metadata of the SP. - */ - 'shib13.signresponse' => TRUE, - - - - /* - * Authentication processing filters that will be executed for all IdPs - * Both Shibboleth and SAML 2.0 - */ - 'authproc.idp' => array( - /* Enable the authproc filter below to add URN Prefixces to all attributes - 10 => array( - 'class' => 'core:AttributeMap', 'addurnprefix' - ), */ - /* Enable the authproc filter below to automatically generated eduPersonTargetedID. - 20 => 'core:TargetedID', - */ - - // Adopts language from attribute to use in UI - 30 => 'core:LanguageAdaptor', - - /* Add a realm attribute from edupersonprincipalname - 40 => 'core:AttributeRealm', - */ - 45 => array( - 'class' => 'core:StatisticsWithAttribute', - 'attributename' => 'realm', - 'type' => 'saml20-idp-SSO', - ), - - /* When called without parameters, it will fallback to filter attributes ‹the old way› - * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. - */ - 50 => 'core:AttributeLimit', - - /* - * Search attribute "distinguishedName" for pattern and replaces if found - - 60 => array( - 'class' => 'core:AttributeAlter', - 'pattern' => '/OU=studerende/', - 'replacement' => 'Student', - 'subject' => 'distinguishedName', - '%replace', - ), - */ - - /* - * Consent module is enabled (with no permanent storage, using cookies). - - 90 => array( - 'class' => 'consent:Consent', - 'store' => 'consent:Cookie', - 'focus' => 'yes', - 'checked' => TRUE - ), - */ - // If language is set in Consent module it will be added as an attribute. - 99 => 'core:LanguageAdaptor', - ), - /* - * Authentication processing filters that will be executed for all SPs - * Both Shibboleth and SAML 2.0 - */ - 'authproc.sp' => array( - /* - 10 => array( - 'class' => 'core:AttributeMap', 'removeurnprefix' - ), - */ - - /* - * Generate the 'group' attribute populated from other variables, including eduPersonAffiliation. - */ - 60 => array('class' => 'core:GenerateGroups', 'eduPersonAffiliation'), - // All users will be members of 'users' and 'members' - 61 => array('class' => 'core:AttributeAdd', 'groups' => array('users', 'members')), - - // Adopts language from attribute to use in UI - 90 => 'core:LanguageAdaptor', - - ), - - - /* - * This option configures the metadata sources. The metadata sources is given as an array with - * different metadata sources. When searching for metadata, simpleSAMPphp will search through - * the array from start to end. - * - * Each element in the array is an associative array which configures the metadata source. - * The type of the metadata source is given by the 'type' element. For each type we have - * different configuration options. - * - * Flat file metadata handler: - * - 'type': This is always 'flatfile'. - * - 'directory': The directory we will load the metadata files from. The default value for - * this option is the value of the 'metadatadir' configuration option, or - * 'metadata/' if that option is unset. - * - * XML metadata handler: - * This metadata handler parses an XML file with either an EntityDescriptor element or an - * EntitiesDescriptor element. The XML file may be stored locally, or (for debugging) on a remote - * web server. - * The XML hetadata handler defines the following options: - * - 'type': This is always 'xml'. - * - 'file': Path to the XML file with the metadata. - * - 'url': The url to fetch metadata from. THIS IS ONLY FOR DEBUGGING - THERE IS NO CACHING OF THE RESPONSE. - * - * - * Examples: - * - * This example defines two flatfile sources. One is the default metadata directory, the other - * is a metadata directory with autogenerated metadata files. - * - * 'metadata.sources' => array( - * array('type' => 'flatfile'), - * array('type' => 'flatfile', 'directory' => 'metadata-generated'), - * ), - * - * This example defines a flatfile source and an XML source. - * 'metadata.sources' => array( - * array('type' => 'flatfile'), - * array('type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'), - * ), - * - * - * Default: - * 'metadata.sources' => array( - * array('type' => 'flatfile') - * ), - */ - 'metadata.sources' => array( - array('type' => 'flatfile'), - ), + /* + * Enable + * + * Which functionality in simpleSAMLphp do you want to enable. Normally you would enable only + * one of the functionalities below, but in some cases you could run multiple functionalities. + * In example when you are setting up a federation bridge. + */ + 'enable.saml20-idp' => false, + 'enable.shib13-idp' => false, + 'enable.adfs-idp' => false, + 'enable.wsfed-sp' => false, + 'enable.authmemcookie' => false, - /* - * Configure the datastore for simpleSAMLphp. - * - * - 'phpsession': Limited datastore, which uses the PHP session. - * - 'memcache': Key-value datastore, based on memcache. - * - 'sql': SQL datastore, using PDO. - * - * The default datastore is 'phpsession'. - * - * (This option replaces the old 'session.handler'-option.) - */ - 'store.type' => 'phpsession', + /* + * Module enable configuration + * + * Configuration to override module enabling/disabling. + * + * Example: + * + * 'module.enable' => array( + * // Setting to TRUE enables. + * 'exampleauth' => TRUE, + * // Setting to FALSE disables. + * 'saml' => FALSE, + * // Unset or NULL uses default. + * 'core' => NULL, + * ), + * + */ - /* - * The DSN the sql datastore should connect to. - * - * See http://www.php.net/manual/en/pdo.drivers.php for the various - * syntaxes. - */ - 'store.sql.dsn' => 'sqlite:/path/to/sqlitedatabase.sq3', + /* + * This value is the duration of the session in seconds. Make sure that the time duration of + * cookies both at the SP and the IdP exceeds this duration. + */ + 'session.duration' => 8 * (60 * 60), // 8 hours. - /* - * The username and password to use when connecting to the database. - */ - 'store.sql.username' => NULL, - 'store.sql.password' => NULL, + /* + * Sets the duration, in seconds, data should be stored in the datastore. As the datastore is used for + * login and logout requests, thid option will control the maximum time these operations can take. + * The default is 4 hours (4*60*60) seconds, which should be more than enough for these operations. + */ + 'session.datastore.timeout' => (4 * 60 * 60), // 4 hours - /* - * The prefix we should use on our tables. - */ - 'store.sql.prefix' => 'simpleSAMLphp', + /* + * Sets the duration, in seconds, auth state should be stored. + */ + 'session.state.timeout' => (60 * 60), // 1 hour + + /* + * Option to override the default settings for the session cookie name + */ + 'session.cookie.name' => 'SimpleSAMLSessionID', + + /* + * Expiration time for the session cookie, in seconds. + * + * Defaults to 0, which means that the cookie expires when the browser is closed. + * + * Example: + * 'session.cookie.lifetime' => 30*60, + */ + 'session.cookie.lifetime' => 0, + + /* + * Limit the path of the cookies. + * + * Can be used to limit the path of the cookies to a specific subdirectory. + * + * Example: + * 'session.cookie.path' => '/simplesaml/', + */ + 'session.cookie.path' => '/', + + /* + * Cookie domain. + * + * Can be used to make the session cookie available to several domains. + * + * Example: + * 'session.cookie.domain' => '.example.org', + */ + 'session.cookie.domain' => null, + + /* + * Set the secure flag in the cookie. + * + * Set this to TRUE if the user only accesses your service + * through https. If the user can access the service through + * both http and https, this must be set to FALSE. + */ + 'session.cookie.secure' => false, + + /* + * When set to FALSE fallback to transient session on session initialization + * failure, throw exception otherwise. + */ + 'session.disable_fallback' => false, + + /* + * Enable secure POST from HTTPS to HTTP. + * + * If you have some SP's on HTTP and IdP is normally on HTTPS, this option + * enables secure POSTing to HTTP endpoint without warning from browser. + * + * For this to work, module.php/core/postredirect.php must be accessible + * also via HTTP on IdP, e.g. if your IdP is on + * https://idp.example.org/ssp/, then + * http://idp.example.org/ssp/module.php/core/postredirect.php must be accessible. + */ + 'enable.http_post' => false, + + /* + * Options to override the default settings for php sessions. + */ + 'session.phpsession.cookiename' => null, + 'session.phpsession.savepath' => null, + 'session.phpsession.httponly' => false, + + /* + * Option to override the default settings for the auth token cookie + */ + 'session.authtoken.cookiename' => 'SimpleSAMLAuthToken', + + /* + * Options for remember me feature for IdP sessions. Remember me feature + * has to be also implemented in authentication source used. + * + * Option 'session.cookie.lifetime' should be set to zero (0), i.e. cookie + * expires on browser session if remember me is not checked. + * + * Session duration ('session.duration' option) should be set according to + * 'session.rememberme.lifetime' option. + * + * It's advised to use remember me feature with session checking function + * defined with 'session.check_function' option. + */ + 'session.rememberme.enable' => false, + 'session.rememberme.checked' => false, + 'session.rememberme.lifetime' => (14 * 86400), + + /** + * Custom function for session checking called on session init and loading. + * See docs/simplesamlphp-advancedfeatures.txt for function code example. + * + * Example: + * 'session.check_function' => array('sspmod_example_Util', 'checkSession'), + */ + + /* + * Languages available, RTL languages, and what language is default + */ + 'language.available' => array( + 'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'fr', 'it', 'nl', 'lb', 'cs', + 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru', 'et', + 'he', 'id', 'sr', 'lv', 'ro', 'eu' + ), + 'language.rtl' => array('ar', 'dv', 'fa', 'ur', 'he'), + 'language.default' => 'en', + + /* + * Options to override the default settings for the language parameter + */ + 'language.parameter.name' => 'language', + 'language.parameter.setcookie' => true, + + /* + * Options to override the default settings for the language cookie + */ + 'language.cookie.name' => 'language', + 'language.cookie.domain' => null, + 'language.cookie.path' => '/', + 'language.cookie.lifetime' => (60 * 60 * 24 * 900), + + /** + * Custom getLanguage function called from SimpleSAML_XHTML_Template::getLanguage(). + * Function should return language code of one of the available languages or NULL. + * See SimpleSAML_XHTML_Template::getLanguage() source code for more info. + * + * This option can be used to implement a custom function for determining + * the default language for the user. + * + * Example: + * 'language.get_language_function' => array('sspmod_example_Template', 'getLanguage'), + */ + + /* + * Extra dictionary for attribute names. + * This can be used to define local attributes. + * + * The format of the parameter is a string with :. + * + * Specifying this option will cause us to look for modules//dictionaries/.definition.json + * The dictionary should look something like: + * + * { + * "firstattribute": { + * "en": "English name", + * "no": "Norwegian name" + * }, + * "secondattribute": { + * "en": "English name", + * "no": "Norwegian name" + * } + * } + * + * Note that all attribute names in the dictionary must in lowercase. + * + * Example: 'attributes.extradictionary' => 'ourmodule:ourattributes', + */ + 'attributes.extradictionary' => null, + + /* + * Which theme directory should be used? + */ + 'theme.use' => 'default', - /* - * Configuration for the MemcacheStore class. This allows you to store - * multiple redudant copies of sessions on different memcache servers. - * - * 'memcache_store.servers' is an array of server groups. Every data - * item will be mirrored in every server group. - * - * Each server group is an array of servers. The data items will be - * load-balanced between all servers in each server group. - * - * Each server is an array of parameters for the server. The following - * options are available: - * - 'hostname': This is the hostname or ip address where the - * memcache server runs. This is the only required option. - * - 'port': This is the port number of the memcache server. If this - * option isn't set, then we will use the 'memcache.default_port' - * ini setting. This is 11211 by default. - * - 'weight': This sets the weight of this server in this server - * group. http://php.net/manual/en/function.Memcache-addServer.php - * contains more information about the weight option. - * - 'timeout': The timeout for this server. By default, the timeout - * is 3 seconds. - * - * Example of redudant configuration with load balancing: - * This configuration makes it possible to lose both servers in the - * a-group or both servers in the b-group without losing any sessions. - * Note that sessions will be lost if one server is lost from both the - * a-group and the b-group. - * - * 'memcache_store.servers' => array( - * array( - * array('hostname' => 'mc_a1'), - * array('hostname' => 'mc_a2'), - * ), - * array( - * array('hostname' => 'mc_b1'), - * array('hostname' => 'mc_b2'), - * ), - * ), - * - * Example of simple configuration with only one memcache server, - * running on the same computer as the web server: - * Note that all sessions will be lost if the memcache server crashes. - * - * 'memcache_store.servers' => array( - * array( - * array('hostname' => 'localhost'), - * ), - * ), - * - */ - 'memcache_store.servers' => array( - array( - array('hostname' => 'localhost'), - ), - ), + /* + * Default IdP for WS-Fed. + */ + 'default-wsfed-idp' => 'urn:federation:pingfederate:localhost', + + /* + * Whether the discovery service should allow the user to save his choice of IdP. + */ + 'idpdisco.enableremember' => true, + 'idpdisco.rememberchecked' => true, + + // Disco service only accepts entities it knows. + 'idpdisco.validate' => true, + + 'idpdisco.extDiscoveryStorage' => null, + + /* + * IdP Discovery service look configuration. + * Wether to display a list of idp or to display a dropdown box. For many IdP' a dropdown box + * gives the best use experience. + * + * When using dropdown box a cookie is used to highlight the previously chosen IdP in the dropdown. + * This makes it easier for the user to choose the IdP + * + * Options: [links,dropdown] + * + */ + 'idpdisco.layout' => 'dropdown', + + /* + * Whether simpleSAMLphp should sign the response or the assertion in SAML 1.1 authentication + * responses. + * + * The default is to sign the assertion element, but that can be overridden by setting this + * option to TRUE. It can also be overridden on a pr. SP basis by adding an option with the + * same name to the metadata of the SP. + */ + 'shib13.signresponse' => true, - /* - * This value is the duration data should be stored in memcache. Data - * will be dropped from the memcache servers when this time expires. - * The time will be reset every time the data is written to the - * memcache servers. - * - * This value should always be larger than the 'session.duration' - * option. Not doing this may result in the session being deleted from - * the memcache servers while it is still in use. - * - * Set this value to 0 if you don't want data to expire. - * - * Note: The oldest data will always be deleted if the memcache server - * runs out of storage space. - */ - 'memcache_store.expires' => 36 * (60*60), // 36 hours. + /* + * Authentication processing filters that will be executed for all IdPs + * Both Shibboleth and SAML 2.0 + */ + 'authproc.idp' => array( + /* Enable the authproc filter below to add URN Prefixces to all attributes + 10 => array( + 'class' => 'core:AttributeMap', 'addurnprefix' + ), */ + /* Enable the authproc filter below to automatically generated eduPersonTargetedID. + 20 => 'core:TargetedID', + */ + + // Adopts language from attribute to use in UI + 30 => 'core:LanguageAdaptor', + + /* Add a realm attribute from edupersonprincipalname + 40 => 'core:AttributeRealm', + */ + 45 => array( + 'class' => 'core:StatisticsWithAttribute', + 'attributename' => 'realm', + 'type' => 'saml20-idp-SSO', + ), + + /* When called without parameters, it will fallback to filter attributes ‹the old way› + * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. + */ + 50 => 'core:AttributeLimit', + + /* + * Search attribute "distinguishedName" for pattern and replaces if found + + 60 => array( + 'class' => 'core:AttributeAlter', + 'pattern' => '/OU=studerende/', + 'replacement' => 'Student', + 'subject' => 'distinguishedName', + '%replace', + ), + */ + + /* + * Consent module is enabled (with no permanent storage, using cookies). + + 90 => array( + 'class' => 'consent:Consent', + 'store' => 'consent:Cookie', + 'focus' => 'yes', + 'checked' => TRUE + ), + */ + // If language is set in Consent module it will be added as an attribute. + 99 => 'core:LanguageAdaptor', + ), + /* + * Authentication processing filters that will be executed for all SPs + * Both Shibboleth and SAML 2.0 + */ + 'authproc.sp' => array( + /* + 10 => array( + 'class' => 'core:AttributeMap', 'removeurnprefix' + ), + */ + + /* + * Generate the 'group' attribute populated from other variables, including eduPersonAffiliation. + 60 => array( + 'class' => 'core:GenerateGroups', 'eduPersonAffiliation' + ), + */ + /* + * All users will be members of 'users' and 'members' + 61 => array( + 'class' => 'core:AttributeAdd', 'groups' => array('users', 'members') + ), + */ + + // Adopts language from attribute to use in UI + 90 => 'core:LanguageAdaptor', + + ), - /* - * Should signing of generated metadata be enabled by default. - * - * Metadata signing can also be enabled for a individual SP or IdP by setting the - * same option in the metadata for the SP or IdP. - */ - 'metadata.sign.enable' => FALSE, - - /* - * The default key & certificate which should be used to sign generated metadata. These - * are files stored in the cert dir. - * These values can be overridden by the options with the same names in the SP or - * IdP metadata. - * - * If these aren't specified here or in the metadata for the SP or IdP, then - * the 'certificate' and 'privatekey' option in the metadata will be used. - * if those aren't set, signing of metadata will fail. - */ - 'metadata.sign.privatekey' => NULL, - 'metadata.sign.privatekey_pass' => NULL, - 'metadata.sign.certificate' => NULL, + /* + * This option configures the metadata sources. The metadata sources is given as an array with + * different metadata sources. When searching for metadata, simpleSAMPphp will search through + * the array from start to end. + * + * Each element in the array is an associative array which configures the metadata source. + * The type of the metadata source is given by the 'type' element. For each type we have + * different configuration options. + * + * Flat file metadata handler: + * - 'type': This is always 'flatfile'. + * - 'directory': The directory we will load the metadata files from. The default value for + * this option is the value of the 'metadatadir' configuration option, or + * 'metadata/' if that option is unset. + * + * XML metadata handler: + * This metadata handler parses an XML file with either an EntityDescriptor element or an + * EntitiesDescriptor element. The XML file may be stored locally, or (for debugging) on a remote + * web server. + * The XML hetadata handler defines the following options: + * - 'type': This is always 'xml'. + * - 'file': Path to the XML file with the metadata. + * - 'url': The URL to fetch metadata from. THIS IS ONLY FOR DEBUGGING - THERE IS NO CACHING OF THE RESPONSE. + * + * + * Examples: + * + * This example defines two flatfile sources. One is the default metadata directory, the other + * is a metadata directory with autogenerated metadata files. + * + * 'metadata.sources' => array( + * array('type' => 'flatfile'), + * array('type' => 'flatfile', 'directory' => 'metadata-generated'), + * ), + * + * This example defines a flatfile source and an XML source. + * 'metadata.sources' => array( + * array('type' => 'flatfile'), + * array('type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'), + * ), + * + * + * Default: + * 'metadata.sources' => array( + * array('type' => 'flatfile') + * ), + */ + 'metadata.sources' => array( + array('type' => 'flatfile'), + ), - /* - * Proxy to use for retrieving URLs. - * - * Example: - * 'proxy' => 'tcp://proxy.example.com:5100' - */ - 'proxy' => NULL, + /* + * Configure the datastore for simpleSAMLphp. + * + * - 'phpsession': Limited datastore, which uses the PHP session. + * - 'memcache': Key-value datastore, based on memcache. + * - 'sql': SQL datastore, using PDO. + * + * The default datastore is 'phpsession'. + * + * (This option replaces the old 'session.handler'-option.) + */ + 'store.type' => 'phpsession', + + + /* + * The DSN the sql datastore should connect to. + * + * See http://www.php.net/manual/en/pdo.drivers.php for the various + * syntaxes. + */ + 'store.sql.dsn' => 'sqlite:/path/to/sqlitedatabase.sq3', + + /* + * The username and password to use when connecting to the database. + */ + 'store.sql.username' => null, + 'store.sql.password' => null, + + /* + * The prefix we should use on our tables. + */ + 'store.sql.prefix' => 'simpleSAMLphp', + + + /* + * Configuration for the MemcacheStore class. This allows you to store + * multiple redudant copies of sessions on different memcache servers. + * + * 'memcache_store.servers' is an array of server groups. Every data + * item will be mirrored in every server group. + * + * Each server group is an array of servers. The data items will be + * load-balanced between all servers in each server group. + * + * Each server is an array of parameters for the server. The following + * options are available: + * - 'hostname': This is the hostname or ip address where the + * memcache server runs. This is the only required option. + * - 'port': This is the port number of the memcache server. If this + * option isn't set, then we will use the 'memcache.default_port' + * ini setting. This is 11211 by default. + * - 'weight': This sets the weight of this server in this server + * group. http://php.net/manual/en/function.Memcache-addServer.php + * contains more information about the weight option. + * - 'timeout': The timeout for this server. By default, the timeout + * is 3 seconds. + * + * Example of redudant configuration with load balancing: + * This configuration makes it possible to lose both servers in the + * a-group or both servers in the b-group without losing any sessions. + * Note that sessions will be lost if one server is lost from both the + * a-group and the b-group. + * + * 'memcache_store.servers' => array( + * array( + * array('hostname' => 'mc_a1'), + * array('hostname' => 'mc_a2'), + * ), + * array( + * array('hostname' => 'mc_b1'), + * array('hostname' => 'mc_b2'), + * ), + * ), + * + * Example of simple configuration with only one memcache server, + * running on the same computer as the web server: + * Note that all sessions will be lost if the memcache server crashes. + * + * 'memcache_store.servers' => array( + * array( + * array('hostname' => 'localhost'), + * ), + * ), + * + */ + 'memcache_store.servers' => array( + array( + array('hostname' => 'localhost'), + ), + ), + + + /* + * This value is the duration data should be stored in memcache. Data + * will be dropped from the memcache servers when this time expires. + * The time will be reset every time the data is written to the + * memcache servers. + * + * This value should always be larger than the 'session.duration' + * option. Not doing this may result in the session being deleted from + * the memcache servers while it is still in use. + * + * Set this value to 0 if you don't want data to expire. + * + * Note: The oldest data will always be deleted if the memcache server + * runs out of storage space. + */ + 'memcache_store.expires' => 36 * (60 * 60), // 36 hours. + + + /* + * Should signing of generated metadata be enabled by default. + * + * Metadata signing can also be enabled for a individual SP or IdP by setting the + * same option in the metadata for the SP or IdP. + */ + 'metadata.sign.enable' => false, + + /* + * The default key & certificate which should be used to sign generated metadata. These + * are files stored in the cert dir. + * These values can be overridden by the options with the same names in the SP or + * IdP metadata. + * + * If these aren't specified here or in the metadata for the SP or IdP, then + * the 'certificate' and 'privatekey' option in the metadata will be used. + * if those aren't set, signing of metadata will fail. + */ + 'metadata.sign.privatekey' => null, + 'metadata.sign.privatekey_pass' => null, + 'metadata.sign.certificate' => null, + + + /* + * Proxy to use for retrieving URLs. + * + * Example: + * 'proxy' => 'tcp://proxy.example.com:5100' + */ + 'proxy' => null, + + /* + * Array of domains that are allowed when generating links or redirections + * to URLs. simpleSAMLphp will use this option to determine whether to + * to consider a given URL valid or not, but you should always validate + * URLs obtained from the input on your own (i.e. ReturnTo or RelayState + * parameters obtained from the $_REQUEST array). + * + * Set to NULL to disable checking of URLs. + * + * simpleSAMLphp will automatically add your own domain (either by checking + * it dinamically, or by using the domain defined in the 'baseurlpath' + * directive, the latter having precedence) to the list of trusted domains, + * in case this option is NOT set to NULL. In that case, you are explicitly + * telling simpleSAMLphp to verify URLs. + * + * Set to an empty array to disallow ALL redirections or links pointing to + * an external URL other than your own domain. + * + * Example: + * 'trusted.url.domains' => array('sp.example.com', 'app.example.com'), + */ + 'trusted.url.domains' => null, ); diff --git a/inc/simplesamlphp/config-templates/ldap.php b/inc/simplesamlphp/config-templates/ldap.php index 192278e..3167312 100644 --- a/inc/simplesamlphp/config-templates/ldap.php +++ b/inc/simplesamlphp/config-templates/ldap.php @@ -1,8 +1,6 @@ 'uid=%username%,dc=feide,dc=no,ou=feide,dc=uninett,dc=no', 'auth.ldap.hostname' => 'ldap.uninett.no', 'auth.ldap.attributes' => null, - 'auth.ldap.enable_tls' => false, + 'auth.ldap.enable_tls' => true, /* * Searching the DN of the user. diff --git a/inc/simplesamlphp/config-templates/ldapmulti.php b/inc/simplesamlphp/config-templates/ldapmulti.php index 4042d64..fbd2e03 100644 --- a/inc/simplesamlphp/config-templates/ldapmulti.php +++ b/inc/simplesamlphp/config-templates/ldapmulti.php @@ -3,7 +3,6 @@ /* * Configuration for the multi-DN LDAP authentication module. * - * $Id: ldapmulti.php 826 2008-08-20 14:14:08Z hans.zandbelt $ */ $ldapmulti = array ( @@ -14,7 +13,7 @@ $ldapmulti = array ( 'dnpattern' => 'uid=%username%,dc=feide,dc=no,ou=feide,dc=uninett,dc=no', 'hostname' => 'ldap.uninett.no', 'attributes' => NULL, - 'enable_tls' => FALSE, + 'enable_tls' => TRUE, 'search.enable' => FALSE, 'search.base' => NULL, 'search.attributes' => NULL, diff --git a/inc/simplesamlphp/config-templates/translation.php b/inc/simplesamlphp/config-templates/translation.php index 9dcb1c4..97178e9 100644 --- a/inc/simplesamlphp/config-templates/translation.php +++ b/inc/simplesamlphp/config-templates/translation.php @@ -2,7 +2,6 @@ /* * Configuration * - * $Id: translation.php 2100 2010-01-12 11:33:22Z andreassolberg $ */ $config = array ( diff --git a/inc/simplesamlphp/config/authsources.php b/inc/simplesamlphp/config/authsources.php index f420ac8..3e00a68 100644 --- a/inc/simplesamlphp/config/authsources.php +++ b/inc/simplesamlphp/config/authsources.php @@ -2,358 +2,396 @@ $config = array( - // This is a authentication source which handles admin authentication. - 'admin' => array( - // The default is to use core:AdminPassword, but it can be replaced with - // any authentication source. + // This is a authentication source which handles admin authentication. + 'admin' => array( + // The default is to use core:AdminPassword, but it can be replaced with + // any authentication source. - 'core:AdminPassword', - ), + 'core:AdminPassword', + ), - // An authentication source which can authenticate against both SAML 2.0 - // and Shibboleth 1.3 IdPs. - 'default-sp' => array( - 'saml:SP', + // An authentication source which can authenticate against both SAML 2.0 + // and Shibboleth 1.3 IdPs. + 'default-sp' => array( + 'saml:SP', - // 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, + // 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, - // The entity ID of the IdP this should SP should contact. - // Can be NULL/unset, in which case the user will be shown a list of available IdPs. + // The entity ID of the IdP this should SP should contact. + // Can be NULL/unset, in which case the user will be shown a list of available IdPs. + 'idp' => null, // Production 'idp' => 'https://mon.meyzieu.fr/idp/saml2/metadata', // Recette - //'idp' => 'https://mon-meyzieu.recette.entrouvert.com/idp/saml2/metadata', + //'idp' => 'https://mon-meyzieu.recette.entrouvert.com/idp/saml2/metadata', // Dev - //'idp' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata', + //'idp' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/metadata', - // The URL to the discovery service. - // Can be NULL/unset, in which case a builtin discovery service will be used. - 'discoURL' => NULL, + // The URL to the discovery service. + // Can be NULL/unset, in which case a builtin discovery service will be used. + 'discoURL' => null, // Force persistent NameID 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', - 'ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact', - 'privatekey' => 'server.pem', - 'certificate' => 'server.crt', - ), + /* + * WARNING: SHA-1 is disallowed starting January the 1st, 2014. + * + * Uncomment the following option to start using SHA-256 for your signatures. + * Currently, simpleSAMLphp defaults to SHA-1, which has been deprecated since + * 2011, and will be disallowed by NIST as of 2014. Please refer to the following + * document for more information: + * + * http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf + * + * If you are uncertain about identity providers supporting SHA-256 or other + * algorithms of the SHA-2 family, you can configure it individually in the + * IdP-remote metadata set for those that support it. Once you are certain that + * all your configured IdPs support SHA-2, you can safely remove the configuration + * options in the IdP-remote metadata set and uncomment the following option. + * + * Please refer to the hosted SP configuration reference for more information. + */ + 'signature.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', + + /* + * The attributes parameter must contain an array of desired attributes by the SP. + * The attributes can be expressed as an array of names or as an associative array + * in the form of 'friendlyName' => 'name'. + * The metadata will then be created as follows: + * + */ + /*'attributes' => array( + 'attrname' => 'urn:oid:x.x.x.x', + ),*/ + /*'attributes.required' => array ( + 'urn:oid:x.x.x.x', + ),*/ + ), - /* - 'example-sql' => array( - 'sqlauth:SQL', - 'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml', - 'username' => 'simplesaml', - 'password' => 'secretpassword', - 'query' => 'SELECT "username", "name", "email" FROM "users" WHERE "username" = :username AND "password" = :password', - ), - */ + /* + 'example-sql' => array( + 'sqlauth:SQL', + 'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml', + 'username' => 'simplesaml', + 'password' => 'secretpassword', + 'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);', + ), + */ - /* - 'example-static' => array( - 'exampleauth:Static', - 'uid' => array('testuser'), - 'eduPersonAffiliation' => array('member', 'employee'), - 'cn' => array('Test User'), - ), - */ + /* + 'example-static' => array( + 'exampleauth:Static', + 'uid' => array('testuser'), + 'eduPersonAffiliation' => array('member', 'employee'), + 'cn' => array('Test User'), + ), + */ - /* - 'example-userpass' => array( - 'exampleauth:UserPass', + /* + 'example-userpass' => array( + 'exampleauth:UserPass', - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - 'student:studentpass' => array( - 'uid' => array('test'), - 'eduPersonAffiliation' => array('member', 'student'), - ), - 'employee:employeepass' => array( - 'uid' => array('employee'), - 'eduPersonAffiliation' => array('member', 'employee'), - ), - ), - */ + 'student:studentpass' => array( + 'uid' => array('test'), + 'eduPersonAffiliation' => array('member', 'student'), + ), + 'employee:employeepass' => array( + 'uid' => array('employee'), + 'eduPersonAffiliation' => array('member', 'employee'), + ), + ), + */ - /* - 'crypto-hash' => array( - 'authcrypt:Hash', - // hashed version of 'verysecret', made with bin/pwgen.php - 'professor:{SSHA256}P6FDTEEIY2EnER9a6P2GwHhI5JDrwBgjQ913oVQjBngmCtrNBUMowA==' => array( - 'uid' => array('prof_a'), - 'eduPersonAffiliation' => array('member', 'employee', 'board'), - ), - ), - */ + /* + 'crypto-hash' => array( + 'authcrypt:Hash', + // hashed version of 'verysecret', made with bin/pwgen.php + 'professor:{SSHA256}P6FDTEEIY2EnER9a6P2GwHhI5JDrwBgjQ913oVQjBngmCtrNBUMowA==' => array( + 'uid' => array('prof_a'), + 'eduPersonAffiliation' => array('member', 'employee', 'board'), + ), + ), + */ - /* - 'htpasswd' => array( - 'authcrypt:Htpasswd', - 'htpasswd_file' => '/var/www/foo.edu/legacy_app/.htpasswd', - 'static_attributes' => array( - 'eduPersonAffiliation' => array('member', 'employee'), - 'Organization' => array('University of Foo'), - ), - ), - */ + /* + 'htpasswd' => array( + 'authcrypt:Htpasswd', + 'htpasswd_file' => '/var/www/foo.edu/legacy_app/.htpasswd', + 'static_attributes' => array( + 'eduPersonAffiliation' => array('member', 'employee'), + 'Organization' => array('University of Foo'), + ), + ), + */ - /* - // This authentication source serves as an example of integration with an - // external authentication engine. Take a look at the comment in the beginning - // of modules/exampleauth/lib/Auth/Source/External.php for a description of - // how to adjust it to your own site. - 'example-external' => array( - 'exampleauth:External', - ), - */ + /* + // This authentication source serves as an example of integration with an + // external authentication engine. Take a look at the comment in the beginning + // of modules/exampleauth/lib/Auth/Source/External.php for a description of + // how to adjust it to your own site. + 'example-external' => array( + 'exampleauth:External', + ), + */ - /* - 'yubikey' => array( - 'authYubiKey:YubiKey', - 'id' => '000', - // 'key' => '012345678', - ), - */ + /* + 'yubikey' => array( + 'authYubiKey:YubiKey', + 'id' => '000', + // 'key' => '012345678', + ), + */ - /* - 'openid' => array( - 'openid:OpenIDConsumer', - 'attributes.required' => array('nickname'), - 'attributes.optional' => array('fullname', 'email',), - // 'sreg.validate' => FALSE, - 'attributes.ax_required' => array('http://axschema.org/namePerson/friendly'), - 'attributes.ax_optional' => array('http://axschema.org/namePerson','http://axschema.org/contact/email'), - // Prefer HTTP redirect over POST - // 'prefer_http_redirect' => FALSE, - ), - */ + /* + 'openid' => array( + 'openid:OpenIDConsumer', + 'attributes.required' => array('nickname'), + 'attributes.optional' => array('fullname', 'email',), + // 'sreg.validate' => FALSE, + 'attributes.ax_required' => array('http://axschema.org/namePerson/friendly'), + 'attributes.ax_optional' => array('http://axschema.org/namePerson','http://axschema.org/contact/email'), + // Prefer HTTP redirect over POST + // 'prefer_http_redirect' => FALSE, + ), + */ - /* - // Example of an authsource that authenticates against Google. - // See: http://code.google.com/apis/accounts/docs/OpenID.html - 'google' => array( - 'openid:OpenIDConsumer', - // Googles OpenID endpoint. - 'target' => 'https://www.google.com/accounts/o8/id', - // Custom realm - // 'realm' => 'http://*.example.org', - // Attributes that google can supply. - 'attributes.ax_required' => array( - //'http://axschema.org/namePerson/first', - //'http://axschema.org/namePerson/last', - //'http://axschema.org/contact/email', - //'http://axschema.org/contact/country/home', - //'http://axschema.org/pref/language', - ), - // custom extension arguments - 'extension.args' => array( - //'http://specs.openid.net/extensions/ui/1.0' => array( - // 'mode' => 'popup', - // 'icon' => 'true', - //), - ), - ), - */ + /* + // Example of an authsource that authenticates against Google. + // See: http://code.google.com/apis/accounts/docs/OpenID.html + 'google' => array( + 'openid:OpenIDConsumer', + // Googles OpenID endpoint. + 'target' => 'https://www.google.com/accounts/o8/id', + // Custom realm + // 'realm' => 'http://*.example.org', + // Attributes that google can supply. + 'attributes.ax_required' => array( + //'http://axschema.org/namePerson/first', + //'http://axschema.org/namePerson/last', + //'http://axschema.org/contact/email', + //'http://axschema.org/contact/country/home', + //'http://axschema.org/pref/language', + ), + // custom extension arguments + 'extension.args' => array( + //'http://specs.openid.net/extensions/ui/1.0' => array( + // 'mode' => 'popup', + // 'icon' => 'true', + //), + ), + ), + */ - /* - 'papi' => array( - 'authpapi:PAPI', - ), - */ + /* + 'papi' => array( + 'authpapi:PAPI', + ), + */ - /* - 'facebook' => array( - 'authfacebook:Facebook', - // Register your Facebook application on http://www.facebook.com/developers - // App ID or API key (requests with App ID should be faster; https://github.com/facebook/php-sdk/issues/214) - 'api_key' => 'xxxxxxxxxxxxxxxx', - // App Secret - 'secret' => 'xxxxxxxxxxxxxxxx', - // which additional data permissions to request from user - // see http://developers.facebook.com/docs/authentication/permissions/ for the full list - // 'req_perms' => 'email,user_birthday', - ), - */ + /* + 'facebook' => array( + 'authfacebook:Facebook', + // Register your Facebook application on http://www.facebook.com/developers + // App ID or API key (requests with App ID should be faster; https://github.com/facebook/php-sdk/issues/214) + 'api_key' => 'xxxxxxxxxxxxxxxx', + // App Secret + 'secret' => 'xxxxxxxxxxxxxxxx', + // which additional data permissions to request from user + // see http://developers.facebook.com/docs/authentication/permissions/ for the full list + // 'req_perms' => 'email,user_birthday', + ), + */ - /* - // LinkedIn OAuth Authentication API. - // Register your application to get an API key here: - // https://www.linkedin.com/secure/developer - 'linkedin' => array( - 'authlinkedin:LinkedIn', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // LinkedIn OAuth Authentication API. + // Register your application to get an API key here: + // https://www.linkedin.com/secure/developer + 'linkedin' => array( + 'authlinkedin:LinkedIn', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - /* - // Twitter OAuth Authentication API. - // Register your application to get an API key here: - // http://twitter.com/oauth_clients - 'twitter' => array( - 'authtwitter:Twitter', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // Twitter OAuth Authentication API. + // Register your application to get an API key here: + // http://twitter.com/oauth_clients + 'twitter' => array( + 'authtwitter:Twitter', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', - /* - // MySpace OAuth Authentication API. - // Register your application to get an API key here: - // http://developer.myspace.com/ - 'myspace' => array( - 'authmyspace:MySpace', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + // Forces the user to enter their credentials to ensure the correct users account is authorized. + // Details: https://dev.twitter.com/docs/api/1/get/oauth/authenticate + 'force_login' => FALSE, + ), + */ - /* - // Windows Live ID Authentication API. - // Register your application to get an API key here: - // https://manage.dev.live.com - 'windowslive' => array( - 'authwindowslive:LiveID', - 'key' => 'xxxxxxxxxxxxxxxx', - 'secret' => 'xxxxxxxxxxxxxxxx', - ), - */ + /* + // MySpace OAuth Authentication API. + // Register your application to get an API key here: + // http://developer.myspace.com/ + 'myspace' => array( + 'authmyspace:MySpace', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - /* - // Example of a LDAP authentication source. - 'example-ldap' => array( - 'ldap:LDAP', + /* + // Windows Live ID Authentication API. + // Register your application to get an API key here: + // https://manage.dev.live.com + 'windowslive' => array( + 'authwindowslive:LiveID', + 'key' => 'xxxxxxxxxxxxxxxx', + 'secret' => 'xxxxxxxxxxxxxxxx', + ), + */ - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + /* + // Example of a LDAP authentication source. + 'example-ldap' => array( + 'ldap:LDAP', - // The hostname of the LDAP server. - 'hostname' => 'ldap.example.org', + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - // Whether SSL/TLS should be used when contacting the LDAP server. - 'enable_tls' => FALSE, + // The hostname of the LDAP server. + 'hostname' => 'ldap.example.org', - // Whether debug output from the LDAP library should be enabled. - // Default is FALSE. - 'debug' => FALSE, + // Whether SSL/TLS should be used when contacting the LDAP server. + 'enable_tls' => TRUE, - // The timeout for accessing the LDAP server, in seconds. - // The default is 0, which means no timeout. - 'timeout' => 0, + // Whether debug output from the LDAP library should be enabled. + // Default is FALSE. + 'debug' => FALSE, - // Which attributes should be retrieved from the LDAP server. - // This can be an array of attribute names, or NULL, in which case - // all attributes are fetched. - 'attributes' => NULL, + // The timeout for accessing the LDAP server, in seconds. + // The default is 0, which means no timeout. + 'timeout' => 0, - // The pattern which should be used to create the users DN given the username. - // %username% in this pattern will be replaced with the users username. - // - // This option is not used if the search.enable option is set to TRUE. - 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', + // Set whether to follow referrals. AD Controllers may require FALSE to function. + 'referrals' => TRUE, - // As an alternative to specifying a pattern for the users DN, it is possible to - // search for the username in a set of attributes. This is enabled by this option. - 'search.enable' => FALSE, + // Which attributes should be retrieved from the LDAP server. + // This can be an array of attribute names, or NULL, in which case + // all attributes are fetched. + 'attributes' => NULL, - // The DN which will be used as a base for the search. - // This can be a single string, in which case only that DN is searched, or an - // array of strings, in which case they will be searched in the order given. - 'search.base' => 'ou=people,dc=example,dc=org', + // The pattern which should be used to create the users DN given the username. + // %username% in this pattern will be replaced with the users username. + // + // This option is not used if the search.enable option is set to TRUE. + 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org', - // The attribute(s) the username should match against. - // - // This is an array with one or more attribute names. Any of the attributes in - // the array may match the value the username. - 'search.attributes' => array('uid', 'mail'), + // As an alternative to specifying a pattern for the users DN, it is possible to + // search for the username in a set of attributes. This is enabled by this option. + 'search.enable' => FALSE, - // The username & password the simpleSAMLphp should bind to before searching. If - // this is left as NULL, no bind will be performed before searching. - 'search.username' => NULL, - 'search.password' => NULL, + // The DN which will be used as a base for the search. + // This can be a single string, in which case only that DN is searched, or an + // array of strings, in which case they will be searched in the order given. + 'search.base' => 'ou=people,dc=example,dc=org', - // If the directory uses privilege separation, - // the authenticated user may not be able to retrieve - // all required attribures, a privileged entity is required - // to get them. This is enabled with this option. - 'priv.read' => FALSE, + // The attribute(s) the username should match against. + // + // This is an array with one or more attribute names. Any of the attributes in + // the array may match the value the username. + 'search.attributes' => array('uid', 'mail'), - // The DN & password the simpleSAMLphp should bind to before - // retrieving attributes. These options are required if - // 'priv.read' is set to TRUE. - 'priv.username' => NULL, - 'priv.password' => NULL, + // The username & password the simpleSAMLphp should bind to before searching. If + // this is left as NULL, no bind will be performed before searching. + 'search.username' => NULL, + 'search.password' => NULL, - ), - */ + // If the directory uses privilege separation, + // the authenticated user may not be able to retrieve + // all required attribures, a privileged entity is required + // to get them. This is enabled with this option. + 'priv.read' => FALSE, - /* - // Example of an LDAPMulti authentication source. - 'example-ldapmulti' => array( - 'ldap:LDAPMulti', + // The DN & password the simpleSAMLphp should bind to before + // retrieving attributes. These options are required if + // 'priv.read' is set to TRUE. + 'priv.username' => NULL, + 'priv.password' => NULL, - // Give the user an option to save their username for future login attempts - // And when enabled, what should the default be, to save the username or not - //'remember.username.enabled' => FALSE, - //'remember.username.checked' => FALSE, + ), + */ - // The way the organization as part of the username should be handled. - // Three possible values: - // - 'none': No handling of the organization. Allows '@' to be part - // of the username. - // - 'allow': Will allow users to type 'username@organization'. - // - 'force': Force users to type 'username@organization'. The dropdown - // list will be hidden. - // - // The default is 'none'. - 'username_organization_method' => 'none', + /* + // Example of an LDAPMulti authentication source. + 'example-ldapmulti' => array( + 'ldap:LDAPMulti', - // Whether the organization should be included as part of the username - // when authenticating. If this is set to TRUE, the username will be on - // the form @. If this is FALSE, the - // username will be used as the user enters it. - // - // The default is FALSE. - 'include_organization_in_username' => FALSE, + // Give the user an option to save their username for future login attempts + // And when enabled, what should the default be, to save the username or not + //'remember.username.enabled' => FALSE, + //'remember.username.checked' => FALSE, - // A list of available LDAP servers. - // - // The index is an identifier for the organization/group. When - // 'username_organization_method' is set to something other than 'none', - // the organization-part of the username is matched against the index. - // - // The value of each element is an array in the same format as an LDAP - // authentication source. - 'employees' => array( - // A short name/description for this group. Will be shown in a dropdown list - // when the user logs on. - // - // This option can be a string or an array with language => text mappings. - 'description' => 'Employees', + // The way the organization as part of the username should be handled. + // Three possible values: + // - 'none': No handling of the organization. Allows '@' to be part + // of the username. + // - 'allow': Will allow users to type 'username@organization'. + // - 'force': Force users to type 'username@organization'. The dropdown + // list will be hidden. + // + // The default is 'none'. + 'username_organization_method' => 'none', - // The rest of the options are the same as those available for - // the LDAP authentication source. - 'hostname' => 'ldap.employees.example.org', - 'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org', - ), + // Whether the organization should be included as part of the username + // when authenticating. If this is set to TRUE, the username will be on + // the form @. If this is FALSE, the + // username will be used as the user enters it. + // + // The default is FALSE. + 'include_organization_in_username' => FALSE, - 'students' => array( - 'description' => 'Students', + // A list of available LDAP servers. + // + // The index is an identifier for the organization/group. When + // 'username_organization_method' is set to something other than 'none', + // the organization-part of the username is matched against the index. + // + // The value of each element is an array in the same format as an LDAP + // authentication source. + 'employees' => array( + // A short name/description for this group. Will be shown in a dropdown list + // when the user logs on. + // + // This option can be a string or an array with language => text mappings. + 'description' => 'Employees', - 'hostname' => 'ldap.students.example.org', - 'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org', - ), + // The rest of the options are the same as those available for + // the LDAP authentication source. + 'hostname' => 'ldap.employees.example.org', + 'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org', + ), - ), - */ + 'students' => array( + 'description' => 'Students', + + 'hostname' => 'ldap.students.example.org', + 'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org', + ), + + ), + */ ); diff --git a/inc/simplesamlphp/config/cas-ldap.php b/inc/simplesamlphp/config/cas-ldap.php index 0eba48a..b60c710 100644 --- a/inc/simplesamlphp/config/cas-ldap.php +++ b/inc/simplesamlphp/config/cas-ldap.php @@ -13,7 +13,7 @@ $casldapconfig = array ( ), 'ldap' => array( 'servers' => 'idpentityid.example.org', - 'enable_tls' => false, + 'enable_tls' => true, 'searchbase' => 'dc=example,dc=org', 'searchattributes' => 'uid', 'attributes' => array('cn', 'mail'), @@ -26,7 +26,7 @@ $casldapconfig = array ( ), 'ldap' => array( 'servers' => 'ldap://idpentityid2.example.org', - 'enable_tls' => false, + 'enable_tls' => true, 'searchbase' => 'ou=users,dc=example,dc=org', 'searchattributes' => array('uid', 'mail'), # array for being able to login with either uid or mail. 'attributes' => null, diff --git a/inc/simplesamlphp/config/config-login-auto.php b/inc/simplesamlphp/config/config-login-auto.php index 2fd0741..0248ba1 100644 --- a/inc/simplesamlphp/config/config-login-auto.php +++ b/inc/simplesamlphp/config/config-login-auto.php @@ -1,8 +1,6 @@ 'simplesaml/', - 'certdir' => 'cert/', - 'loggingdir' => 'log/', - 'datadir' => 'data/', + /** + * Setup the following parameters to match the directory of your installation. + * See the user manual for more details. + * + * Valid format for baseurlpath is: + * [(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/] + * (note that it must end with a '/') + * + * The full url format is useful if your simpleSAMLphp setup is hosted behind + * a reverse proxy. In that case you can specify the external url here. + * + * Please note that simpleSAMLphp will then redirect all queries to the + * external url, no matter where you come from (direct access or via the + * reverse proxy). + */ + 'baseurlpath' => 'simplesaml/', + 'certdir' => 'cert/', + 'loggingdir' => 'log/', + 'datadir' => 'data/', - /* - * A directory where simpleSAMLphp can save temporary files. - * - * SimpleSAMLphp will attempt to create this directory if it doesn't exist. - */ - 'tempdir' => '/tmp/simplesaml', - - - /* - * If you enable this option, simpleSAMLphp will log all sent and received messages - * to the log file. - * - * This option also enables logging of the messages that are encrypted and decrypted. - * - * Note: The messages are logged with the DEBUG log level, so you also need to set - * the 'logging.level' option to LOG_DEBUG. - */ - 'debug' => FALSE, + /* + * A directory where simpleSAMLphp can save temporary files. + * + * SimpleSAMLphp will attempt to create this directory if it doesn't exist. + */ + 'tempdir' => '/tmp/simplesaml', - 'showerrors' => TRUE, + /* + * If you enable this option, simpleSAMLphp will log all sent and received messages + * to the log file. + * + * This option also enables logging of the messages that are encrypted and decrypted. + * + * Note: The messages are logged with the DEBUG log level, so you also need to set + * the 'logging.level' option to LOG_DEBUG. + */ + 'debug' => false, - /** - * Custom error show function called from SimpleSAML_Error_Error::show. - * See docs/simplesamlphp-errorhandling.txt for function code example. - * - * Example: - * 'errors.show_function' => array('sspmod_example_Error_Show', 'show'), - */ + /* + * When showerrors is enabled, all error messages and stack traces will be output + * to the browser. + * + * When errorreporting is enabled, a form will be presented for the user to report + * the error to technicalcontact_email. + */ + 'showerrors' => true, + 'errorreporting' => true, - /** - * This option allows you to enable validation of XML data against its - * schemas. A warning will be written to the log if validation fails. - */ - 'debug.validatexml' => FALSE, + /** + * Custom error show function called from SimpleSAML_Error_Error::show. + * See docs/simplesamlphp-errorhandling.txt for function code example. + * + * Example: + * 'errors.show_function' => array('sspmod_example_Error_Show', 'show'), + */ - /** - * This password must be kept secret, and modified from the default value 123. - * This password will give access to the installation page of simpleSAMLphp with - * metadata listing and diagnostics pages. - * You can also put a hash here; run "bin/pwgen.php" to generate one. - */ - 'auth.adminpassword' => '123', - 'admin.protectindexpage' => false, - 'admin.protectmetadata' => false, + /** + * This option allows you to enable validation of XML data against its + * schemas. A warning will be written to the log if validation fails. + */ + 'debug.validatexml' => false, - /** - * This is a secret salt used by simpleSAMLphp when it needs to generate a secure hash - * of a value. It must be changed from its default value to a secret value. The value of - * 'secretsalt' can be any valid string of any length. - * - * A possible way to generate a random salt is by running the following command from a unix shell: - * tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo - */ - 'secretsalt' => '4eb6lrl7frtkyu6cq1enc45qfc4byiyf', - - /* - * Some information about the technical persons running this installation. - * The email address will be used as the recipient address for error reports, and - * also as the technical contact in generated metadata. - */ - 'technicalcontact_name' => 'EO Administrators', - 'technicalcontact_email' => 'admin@entrouvert.com', + /** + * This password must be kept secret, and modified from the default value 123. + * This password will give access to the installation page of simpleSAMLphp with + * metadata listing and diagnostics pages. + * You can also put a hash here; run "bin/pwgen.php" to generate one. + */ + 'auth.adminpassword' => 'Test4242', + 'admin.protectindexpage' => false, + 'admin.protectmetadata' => false, - /* - * The timezone of the server. This option should be set to the timezone you want - * simpleSAMLphp to report the time in. The default is to guess the timezone based - * on your system timezone. - * - * See this page for a list of valid timezones: http://php.net/manual/en/timezones.php - */ - 'timezone' => NULL, + /** + * This is a secret salt used by simpleSAMLphp when it needs to generate a secure hash + * of a value. It must be changed from its default value to a secret value. The value of + * 'secretsalt' can be any valid string of any length. + * + * A possible way to generate a random salt is by running the following command from a unix shell: + * tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo + */ + 'secretsalt' => 'gya9qh0iylrthjgz9jfnuy7dwdvywj8u', - /* - * Logging. - * - * define the minimum log level to log - * SimpleSAML_Logger::ERR No statistics, only errors - * SimpleSAML_Logger::WARNING No statistics, only warnings/errors - * SimpleSAML_Logger::NOTICE Statistics and errors - * SimpleSAML_Logger::INFO Verbose logs - * SimpleSAML_Logger::DEBUG Full debug logs - not reccomended for production - * - * Choose logging handler. - * - * Options: [syslog,file,errorlog] - * - */ - 'logging.level' => SimpleSAML_Logger::NOTICE, - 'logging.handler' => 'syslog', + /* + * Some information about the technical persons running this installation. + * The email address will be used as the recipient address for error reports, and + * also as the technical contact in generated metadata. + */ + 'technicalcontact_name' => 'EO Administrators', + 'technicalcontact_email' => 'admin@entrouvert.com', - /* - * Choose which facility should be used when logging with syslog. - * - * These can be used for filtering the syslog output from simpleSAMLphp into its - * own file by configuring the syslog daemon. - * - * See the documentation for openlog (http://php.net/manual/en/function.openlog.php) for available - * facilities. Note that only LOG_USER is valid on windows. - * - * The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not. - */ - 'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER, + /* + * The timezone of the server. This option should be set to the timezone you want + * simpleSAMLphp to report the time in. The default is to guess the timezone based + * on your system timezone. + * + * See this page for a list of valid timezones: http://php.net/manual/en/timezones.php + */ + 'timezone' => null, - /* - * The process name that should be used when logging to syslog. - * The value is also written out by the other logging handlers. - */ - 'logging.processname' => 'simplesamlphp', + /* + * Logging. + * + * define the minimum log level to log + * SimpleSAML_Logger::ERR No statistics, only errors + * SimpleSAML_Logger::WARNING No statistics, only warnings/errors + * SimpleSAML_Logger::NOTICE Statistics and errors + * SimpleSAML_Logger::INFO Verbose logs + * SimpleSAML_Logger::DEBUG Full debug logs - not reccomended for production + * + * Choose logging handler. + * + * Options: [syslog,file,errorlog] + * + */ + 'logging.level' => SimpleSAML_Logger::NOTICE, + 'logging.handler' => 'syslog', - /* Logging: file - Logfilename in the loggingdir from above. - */ - 'logging.logfile' => 'simplesamlphp.log', + /* + * Specify the format of the logs. Its use varies depending on the log handler used (for instance, you cannot + * control here how dates are displayed when using the syslog or errorlog handlers), but in general the options + * are: + * + * - %date{}: the date and time, with its format specified inside the brackets. See the PHP documentation + * of the strftime() function for more information on the format. If the brackets are omitted, the standard + * format is applied. This can be useful if you just want to control the placement of the date, but don't care + * about the format. + * + * - %process: the name of the SimpleSAMLphp process. Remember you can configure this in the 'logging.processname' + * option below. + * + * - %level: the log level (name or number depending on the handler used). + * + * - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind + * the trailing space). + * + * - %trackid: the track ID, an identifier that allows you to track a single session. + * + * - %srcip: the IP address of the client. If you are behind a proxy, make sure to modify the + * $_SERVER['REMOTE_ADDR'] variable on your code accordingly to the X-Forwarded-For header. + * + * - %msg: the message to be logged. + * + */ + //'logging.format' => '%date{%b %d %H:%M:%S} %process %level %stat[%trackid] %msg', - /* (New) statistics output configuration. - * - * This is an array of outputs. Each output has at least a 'class' option, which - * selects the output. - */ - 'statistics.out' => array( - // Log statistics to the normal log. - /* - array( - 'class' => 'core:Log', - 'level' => 'notice', - ), - */ - // Log statistics to files in a directory. One file per day. - /* - array( - 'class' => 'core:File', - 'directory' => '/var/log/stats', - ), - */ - ), + /* + * Choose which facility should be used when logging with syslog. + * + * These can be used for filtering the syslog output from simpleSAMLphp into its + * own file by configuring the syslog daemon. + * + * See the documentation for openlog (http://php.net/manual/en/function.openlog.php) for available + * facilities. Note that only LOG_USER is valid on windows. + * + * The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not. + */ + 'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER, + + /* + * The process name that should be used when logging to syslog. + * The value is also written out by the other logging handlers. + */ + 'logging.processname' => 'simplesamlphp', + + /* Logging: file - Logfilename in the loggingdir from above. + */ + 'logging.logfile' => 'simplesamlphp.log', + + /* (New) statistics output configuration. + * + * This is an array of outputs. Each output has at least a 'class' option, which + * selects the output. + */ + 'statistics.out' => array(// Log statistics to the normal log. + /* + array( + 'class' => 'core:Log', + 'level' => 'notice', + ), + */ + // Log statistics to files in a directory. One file per day. + /* + array( + 'class' => 'core:File', + 'directory' => '/var/log/stats', + ), + */ + ), - /* - * Enable - * - * Which functionality in simpleSAMLphp do you want to enable. Normally you would enable only - * one of the functionalities below, but in some cases you could run multiple functionalities. - * In example when you are setting up a federation bridge. - */ - 'enable.saml20-idp' => false, - 'enable.shib13-idp' => false, - 'enable.adfs-idp' => false, - 'enable.wsfed-sp' => false, - 'enable.authmemcookie' => false, + /* + * Enable + * + * Which functionality in simpleSAMLphp do you want to enable. Normally you would enable only + * one of the functionalities below, but in some cases you could run multiple functionalities. + * In example when you are setting up a federation bridge. + */ + 'enable.saml20-idp' => false, + 'enable.shib13-idp' => false, + 'enable.adfs-idp' => false, + 'enable.wsfed-sp' => false, + 'enable.authmemcookie' => false, - /* - * This value is the duration of the session in seconds. Make sure that the time duration of - * cookies both at the SP and the IdP exceeds this duration. - */ - 'session.duration' => 8 * (60*60), // 8 hours. - 'session.requestcache' => 4 * (60*60), // 4 hours - /* - * Sets the duration, in seconds, data should be stored in the datastore. As the datastore is used for - * login and logout requests, thid option will control the maximum time these operations can take. - * The default is 4 hours (4*60*60) seconds, which should be more than enough for these operations. - */ - 'session.datastore.timeout' => (4*60*60), // 4 hours - - /* - * Sets the duration, in seconds, auth state should be stored. - */ - 'session.state.timeout' => (60*60), // 1 hour + /* + * Module enable configuration + * + * Configuration to override module enabling/disabling. + * + * Example: + * + * 'module.enable' => array( + * // Setting to TRUE enables. + * 'exampleauth' => TRUE, + * // Setting to FALSE disables. + * 'saml' => FALSE, + * // Unset or NULL uses default. + * 'core' => NULL, + * ), + * + */ - /* - * Option to override the default settings for the session cookie name - */ - 'session.cookie.name' => 'SimpleSAMLSessionID', - /* - * Expiration time for the session cookie, in seconds. - * - * Defaults to 0, which means that the cookie expires when the browser is closed. - * - * Example: - * 'session.cookie.lifetime' => 30*60, - */ - 'session.cookie.lifetime' => 0, + /* + * This value is the duration of the session in seconds. Make sure that the time duration of + * cookies both at the SP and the IdP exceeds this duration. + */ + 'session.duration' => 8 * (60 * 60), // 8 hours. - /* - * Limit the path of the cookies. - * - * Can be used to limit the path of the cookies to a specific subdirectory. - * - * Example: - * 'session.cookie.path' => '/simplesaml/', - */ - 'session.cookie.path' => '/', + /* + * Sets the duration, in seconds, data should be stored in the datastore. As the datastore is used for + * login and logout requests, thid option will control the maximum time these operations can take. + * The default is 4 hours (4*60*60) seconds, which should be more than enough for these operations. + */ + 'session.datastore.timeout' => (4 * 60 * 60), // 4 hours - /* - * Cookie domain. - * - * Can be used to make the session cookie available to several domains. - * - * Example: - * 'session.cookie.domain' => '.example.org', - */ - 'session.cookie.domain' => NULL, + /* + * Sets the duration, in seconds, auth state should be stored. + */ + 'session.state.timeout' => (60 * 60), // 1 hour - /* - * Set the secure flag in the cookie. - * - * Set this to TRUE if the user only accesses your service - * through https. If the user can access the service through - * both http and https, this must be set to FALSE. - */ - 'session.cookie.secure' => FALSE, + /* + * Option to override the default settings for the session cookie name + */ + 'session.cookie.name' => 'SimpleSAMLSessionID', - /* - * When set to FALSE fallback to transient session on session initialization - * failure, throw exception otherwise. - */ - 'session.disable_fallback' => FALSE, + /* + * Expiration time for the session cookie, in seconds. + * + * Defaults to 0, which means that the cookie expires when the browser is closed. + * + * Example: + * 'session.cookie.lifetime' => 30*60, + */ + 'session.cookie.lifetime' => 0, - /* - * Enable secure POST from HTTPS to HTTP. - * - * If you have some SP's on HTTP and IdP is normally on HTTPS, this option - * enables secure POSTing to HTTP endpoint without warning from browser. - * - * For this to work, module.php/core/postredirect.php must be accessible - * also via HTTP on IdP, e.g. if your IdP is on - * https://idp.example.org/ssp/, then - * http://idp.example.org/ssp/module.php/core/postredirect.php must be accessible. - */ - 'enable.http_post' => FALSE, + /* + * Limit the path of the cookies. + * + * Can be used to limit the path of the cookies to a specific subdirectory. + * + * Example: + * 'session.cookie.path' => '/simplesaml/', + */ + 'session.cookie.path' => '/', - /* - * Options to override the default settings for php sessions. - */ - 'session.phpsession.cookiename' => null, - 'session.phpsession.savepath' => null, - 'session.phpsession.httponly' => FALSE, + /* + * Cookie domain. + * + * Can be used to make the session cookie available to several domains. + * + * Example: + * 'session.cookie.domain' => '.example.org', + */ + 'session.cookie.domain' => null, - /* - * Option to override the default settings for the auth token cookie - */ - 'session.authtoken.cookiename' => 'SimpleSAMLAuthToken', + /* + * Set the secure flag in the cookie. + * + * Set this to TRUE if the user only accesses your service + * through https. If the user can access the service through + * both http and https, this must be set to FALSE. + */ + 'session.cookie.secure' => false, - /* - * Languages available, RTL languages, and what language is default - */ - 'language.available' => array('en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'fr', 'it', 'nl', 'lb', 'cs', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru', 'et', 'he', 'id', 'sr'), - 'language.rtl' => array('ar','dv','fa','ur','he'), - 'language.default' => 'en', + /* + * When set to FALSE fallback to transient session on session initialization + * failure, throw exception otherwise. + */ + 'session.disable_fallback' => false, - /** - * Custom getLanguage function called from SimpleSAML_XHTML_Template::getLanguage(). - * Function should return language code of one of the available languages or NULL. - * See SimpleSAML_XHTML_Template::getLanguage() source code for more info. - * - * This option can be used to implement a custom function for determining - * the default language for the user. - * - * Example: - * 'language.get_language_function' => array('sspmod_example_Template', 'getLanguage'), - */ + /* + * Enable secure POST from HTTPS to HTTP. + * + * If you have some SP's on HTTP and IdP is normally on HTTPS, this option + * enables secure POSTing to HTTP endpoint without warning from browser. + * + * For this to work, module.php/core/postredirect.php must be accessible + * also via HTTP on IdP, e.g. if your IdP is on + * https://idp.example.org/ssp/, then + * http://idp.example.org/ssp/module.php/core/postredirect.php must be accessible. + */ + 'enable.http_post' => false, - /* - * Extra dictionary for attribute names. - * This can be used to define local attributes. - * - * The format of the parameter is a string with :. - * - * Specifying this option will cause us to look for modules//dictionaries/.definition.json - * The dictionary should look something like: - * - * { - * "firstattribute": { - * "en": "English name", - * "no": "Norwegian name" - * }, - * "secondattribute": { - * "en": "English name", - * "no": "Norwegian name" - * } - * } - * - * Note that all attribute names in the dictionary must in lowercase. - * - * Example: 'attributes.extradictionary' => 'ourmodule:ourattributes', - */ - 'attributes.extradictionary' => NULL, + /* + * Options to override the default settings for php sessions. + */ + 'session.phpsession.cookiename' => null, + 'session.phpsession.savepath' => null, + 'session.phpsession.httponly' => false, - /* - * Which theme directory should be used? - */ - 'theme.use' => 'default', + /* + * Option to override the default settings for the auth token cookie + */ + 'session.authtoken.cookiename' => 'SimpleSAMLAuthToken', - - /* - * Default IdP for WS-Fed. - */ - 'default-wsfed-idp' => 'urn:federation:pingfederate:localhost', + /* + * Options for remember me feature for IdP sessions. Remember me feature + * has to be also implemented in authentication source used. + * + * Option 'session.cookie.lifetime' should be set to zero (0), i.e. cookie + * expires on browser session if remember me is not checked. + * + * Session duration ('session.duration' option) should be set according to + * 'session.rememberme.lifetime' option. + * + * It's advised to use remember me feature with session checking function + * defined with 'session.check_function' option. + */ + 'session.rememberme.enable' => false, + 'session.rememberme.checked' => false, + 'session.rememberme.lifetime' => (14 * 86400), - /* - * Whether the discovery service should allow the user to save his choice of IdP. - */ - 'idpdisco.enableremember' => TRUE, - 'idpdisco.rememberchecked' => TRUE, - - // Disco service only accepts entities it knows. - 'idpdisco.validate' => TRUE, - - 'idpdisco.extDiscoveryStorage' => NULL, + /** + * Custom function for session checking called on session init and loading. + * See docs/simplesamlphp-advancedfeatures.txt for function code example. + * + * Example: + * 'session.check_function' => array('sspmod_example_Util', 'checkSession'), + */ - /* - * IdP Discovery service look configuration. - * Wether to display a list of idp or to display a dropdown box. For many IdP' a dropdown box - * gives the best use experience. - * - * When using dropdown box a cookie is used to highlight the previously chosen IdP in the dropdown. - * This makes it easier for the user to choose the IdP - * - * Options: [links,dropdown] - * - */ - 'idpdisco.layout' => 'dropdown', + /* + * Languages available, RTL languages, and what language is default + */ + 'language.available' => array( + 'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'fr', 'it', 'nl', 'lb', 'cs', + 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru', 'et', + 'he', 'id', 'sr', 'lv', 'ro', 'eu' + ), + 'language.rtl' => array('ar', 'dv', 'fa', 'ur', 'he'), + 'language.default' => 'en', - /* - * Whether simpleSAMLphp should sign the response or the assertion in SAML 1.1 authentication - * responses. - * - * The default is to sign the assertion element, but that can be overridden by setting this - * option to TRUE. It can also be overridden on a pr. SP basis by adding an option with the - * same name to the metadata of the SP. - */ - 'shib13.signresponse' => TRUE, - - - - /* - * Authentication processing filters that will be executed for all IdPs - * Both Shibboleth and SAML 2.0 - */ - 'authproc.idp' => array( - /* Enable the authproc filter below to add URN Prefixces to all attributes - 10 => array( - 'class' => 'core:AttributeMap', 'addurnprefix' - ), */ - /* Enable the authproc filter below to automatically generated eduPersonTargetedID. - 20 => 'core:TargetedID', - */ + /* + * Options to override the default settings for the language parameter + */ + 'language.parameter.name' => 'language', + 'language.parameter.setcookie' => true, - // Adopts language from attribute to use in UI - 30 => 'core:LanguageAdaptor', - - /* Add a realm attribute from edupersonprincipalname - 40 => 'core:AttributeRealm', - */ - 45 => array( - 'class' => 'core:StatisticsWithAttribute', - 'attributename' => 'realm', - 'type' => 'saml20-idp-SSO', - ), + /* + * Options to override the default settings for the language cookie + */ + 'language.cookie.name' => 'language', + 'language.cookie.domain' => null, + 'language.cookie.path' => '/', + 'language.cookie.lifetime' => (60 * 60 * 24 * 900), - /* When called without parameters, it will fallback to filter attributes ‹the old way› - * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. - */ - 50 => 'core:AttributeLimit', + /** + * Custom getLanguage function called from SimpleSAML_XHTML_Template::getLanguage(). + * Function should return language code of one of the available languages or NULL. + * See SimpleSAML_XHTML_Template::getLanguage() source code for more info. + * + * This option can be used to implement a custom function for determining + * the default language for the user. + * + * Example: + * 'language.get_language_function' => array('sspmod_example_Template', 'getLanguage'), + */ - /* - * Search attribute "distinguishedName" for pattern and replaces if found + /* + * Extra dictionary for attribute names. + * This can be used to define local attributes. + * + * The format of the parameter is a string with :. + * + * Specifying this option will cause us to look for modules//dictionaries/.definition.json + * The dictionary should look something like: + * + * { + * "firstattribute": { + * "en": "English name", + * "no": "Norwegian name" + * }, + * "secondattribute": { + * "en": "English name", + * "no": "Norwegian name" + * } + * } + * + * Note that all attribute names in the dictionary must in lowercase. + * + * Example: 'attributes.extradictionary' => 'ourmodule:ourattributes', + */ + 'attributes.extradictionary' => null, - 60 => array( - 'class' => 'core:AttributeAlter', - 'pattern' => '/OU=studerende/', - 'replacement' => 'Student', - 'subject' => 'distinguishedName', - '%replace', - ), - */ + /* + * Which theme directory should be used? + */ + 'theme.use' => 'default', - /* - * Consent module is enabled (with no permanent storage, using cookies). - 90 => array( - 'class' => 'consent:Consent', - 'store' => 'consent:Cookie', - 'focus' => 'yes', - 'checked' => TRUE - ), - */ - // If language is set in Consent module it will be added as an attribute. - 99 => 'core:LanguageAdaptor', - ), - /* - * Authentication processing filters that will be executed for all SPs - * Both Shibboleth and SAML 2.0 - */ - 'authproc.sp' => array( - /* - 10 => array( - 'class' => 'core:AttributeMap', 'removeurnprefix' - ), - */ + /* + * Default IdP for WS-Fed. + */ + 'default-wsfed-idp' => 'urn:federation:pingfederate:localhost', - /* Exposes nameid */ - 10 => array( - 'class' => 'saml:NameIDAttribute', - 'format' => '%V', - 'attribute' => 'NameID', + /* + * Whether the discovery service should allow the user to save his choice of IdP. + */ + 'idpdisco.enableremember' => true, + 'idpdisco.rememberchecked' => true, + + // Disco service only accepts entities it knows. + 'idpdisco.validate' => true, + + 'idpdisco.extDiscoveryStorage' => null, + + /* + * IdP Discovery service look configuration. + * Wether to display a list of idp or to display a dropdown box. For many IdP' a dropdown box + * gives the best use experience. + * + * When using dropdown box a cookie is used to highlight the previously chosen IdP in the dropdown. + * This makes it easier for the user to choose the IdP + * + * Options: [links,dropdown] + * + */ + 'idpdisco.layout' => 'dropdown', + + /* + * Whether simpleSAMLphp should sign the response or the assertion in SAML 1.1 authentication + * responses. + * + * The default is to sign the assertion element, but that can be overridden by setting this + * option to TRUE. It can also be overridden on a pr. SP basis by adding an option with the + * same name to the metadata of the SP. + */ + 'shib13.signresponse' => true, + + + /* + * Authentication processing filters that will be executed for all IdPs + * Both Shibboleth and SAML 2.0 + */ + 'authproc.idp' => array( + /* Enable the authproc filter below to add URN Prefixces to all attributes + 10 => array( + 'class' => 'core:AttributeMap', 'addurnprefix' + ), */ + /* Enable the authproc filter below to automatically generated eduPersonTargetedID. + 20 => 'core:TargetedID', + */ + + // Adopts language from attribute to use in UI + 30 => 'core:LanguageAdaptor', + + /* Add a realm attribute from edupersonprincipalname + 40 => 'core:AttributeRealm', + */ + 45 => array( + 'class' => 'core:StatisticsWithAttribute', + 'attributename' => 'realm', + 'type' => 'saml20-idp-SSO', ), - /* - * Generate the 'group' attribute populated from other variables, including eduPersonAffiliation. - */ - 60 => array('class' => 'core:GenerateGroups', 'eduPersonAffiliation'), - // All users will be members of 'users' and 'members' - 61 => array('class' => 'core:AttributeAdd', 'groups' => array('users', 'members')), - - // Adopts language from attribute to use in UI - 90 => 'core:LanguageAdaptor', + /* When called without parameters, it will fallback to filter attributes ‹the old way› + * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. + */ + 50 => 'core:AttributeLimit', - ), - + /* + * Search attribute "distinguishedName" for pattern and replaces if found - /* - * This option configures the metadata sources. The metadata sources is given as an array with - * different metadata sources. When searching for metadata, simpleSAMPphp will search through - * the array from start to end. - * - * Each element in the array is an associative array which configures the metadata source. - * The type of the metadata source is given by the 'type' element. For each type we have - * different configuration options. - * - * Flat file metadata handler: - * - 'type': This is always 'flatfile'. - * - 'directory': The directory we will load the metadata files from. The default value for - * this option is the value of the 'metadatadir' configuration option, or - * 'metadata/' if that option is unset. - * - * XML metadata handler: - * This metadata handler parses an XML file with either an EntityDescriptor element or an - * EntitiesDescriptor element. The XML file may be stored locally, or (for debugging) on a remote - * web server. - * The XML hetadata handler defines the following options: - * - 'type': This is always 'xml'. - * - 'file': Path to the XML file with the metadata. - * - 'url': The url to fetch metadata from. THIS IS ONLY FOR DEBUGGING - THERE IS NO CACHING OF THE RESPONSE. - * - * - * Examples: - * - * This example defines two flatfile sources. One is the default metadata directory, the other - * is a metadata directory with autogenerated metadata files. - * - * 'metadata.sources' => array( - * array('type' => 'flatfile'), - * array('type' => 'flatfile', 'directory' => 'metadata-generated'), - * ), - * - * This example defines a flatfile source and an XML source. - * 'metadata.sources' => array( - * array('type' => 'flatfile'), - * array('type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'), - * ), - * - * - * Default: - * 'metadata.sources' => array( - * array('type' => 'flatfile') - * ), - */ - 'metadata.sources' => array( - array('type' => 'flatfile'), - ), + 60 => array( + 'class' => 'core:AttributeAlter', + 'pattern' => '/OU=studerende/', + 'replacement' => 'Student', + 'subject' => 'distinguishedName', + '%replace', + ), + */ + + /* + * Consent module is enabled (with no permanent storage, using cookies). + + 90 => array( + 'class' => 'consent:Consent', + 'store' => 'consent:Cookie', + 'focus' => 'yes', + 'checked' => TRUE + ), + */ + // If language is set in Consent module it will be added as an attribute. + 99 => 'core:LanguageAdaptor', + ), + /* + * Authentication processing filters that will be executed for all SPs + * Both Shibboleth and SAML 2.0 + */ + 'authproc.sp' => array( + /* + 10 => array( + 'class' => 'core:AttributeMap', 'removeurnprefix' + ), + */ + + /* + * Generate the 'group' attribute populated from other variables, including eduPersonAffiliation. + 60 => array( + 'class' => 'core:GenerateGroups', 'eduPersonAffiliation' + ), + */ + /* + * All users will be members of 'users' and 'members' + 61 => array( + 'class' => 'core:AttributeAdd', 'groups' => array('users', 'members') + ), + */ + + // Adopts language from attribute to use in UI + 90 => 'core:LanguageAdaptor', + + ), - /* - * Configure the datastore for simpleSAMLphp. - * - * - 'phpsession': Limited datastore, which uses the PHP session. - * - 'memcache': Key-value datastore, based on memcache. - * - 'sql': SQL datastore, using PDO. - * - * The default datastore is 'phpsession'. - * - * (This option replaces the old 'session.handler'-option.) - */ - 'store.type' => 'phpsession', + /* + * This option configures the metadata sources. The metadata sources is given as an array with + * different metadata sources. When searching for metadata, simpleSAMPphp will search through + * the array from start to end. + * + * Each element in the array is an associative array which configures the metadata source. + * The type of the metadata source is given by the 'type' element. For each type we have + * different configuration options. + * + * Flat file metadata handler: + * - 'type': This is always 'flatfile'. + * - 'directory': The directory we will load the metadata files from. The default value for + * this option is the value of the 'metadatadir' configuration option, or + * 'metadata/' if that option is unset. + * + * XML metadata handler: + * This metadata handler parses an XML file with either an EntityDescriptor element or an + * EntitiesDescriptor element. The XML file may be stored locally, or (for debugging) on a remote + * web server. + * The XML hetadata handler defines the following options: + * - 'type': This is always 'xml'. + * - 'file': Path to the XML file with the metadata. + * - 'url': The URL to fetch metadata from. THIS IS ONLY FOR DEBUGGING - THERE IS NO CACHING OF THE RESPONSE. + * + * + * Examples: + * + * This example defines two flatfile sources. One is the default metadata directory, the other + * is a metadata directory with autogenerated metadata files. + * + * 'metadata.sources' => array( + * array('type' => 'flatfile'), + * array('type' => 'flatfile', 'directory' => 'metadata-generated'), + * ), + * + * This example defines a flatfile source and an XML source. + * 'metadata.sources' => array( + * array('type' => 'flatfile'), + * array('type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'), + * ), + * + * + * Default: + * 'metadata.sources' => array( + * array('type' => 'flatfile') + * ), + */ + 'metadata.sources' => array( + array('type' => 'flatfile'), + ), - /* - * The DSN the sql datastore should connect to. - * - * See http://www.php.net/manual/en/pdo.drivers.php for the various - * syntaxes. - */ - 'store.sql.dsn' => 'sqlite:/path/to/sqlitedatabase.sq3', - - /* - * The username and password to use when connecting to the database. - */ - 'store.sql.username' => NULL, - 'store.sql.password' => NULL, - - /* - * The prefix we should use on our tables. - */ - 'store.sql.prefix' => 'simpleSAMLphp', + /* + * Configure the datastore for simpleSAMLphp. + * + * - 'phpsession': Limited datastore, which uses the PHP session. + * - 'memcache': Key-value datastore, based on memcache. + * - 'sql': SQL datastore, using PDO. + * + * The default datastore is 'phpsession'. + * + * (This option replaces the old 'session.handler'-option.) + */ + 'store.type' => 'phpsession', - /* - * Configuration for the MemcacheStore class. This allows you to store - * multiple redudant copies of sessions on different memcache servers. - * - * 'memcache_store.servers' is an array of server groups. Every data - * item will be mirrored in every server group. - * - * Each server group is an array of servers. The data items will be - * load-balanced between all servers in each server group. - * - * Each server is an array of parameters for the server. The following - * options are available: - * - 'hostname': This is the hostname or ip address where the - * memcache server runs. This is the only required option. - * - 'port': This is the port number of the memcache server. If this - * option isn't set, then we will use the 'memcache.default_port' - * ini setting. This is 11211 by default. - * - 'weight': This sets the weight of this server in this server - * group. http://php.net/manual/en/function.Memcache-addServer.php - * contains more information about the weight option. - * - 'timeout': The timeout for this server. By default, the timeout - * is 3 seconds. - * - * Example of redudant configuration with load balancing: - * This configuration makes it possible to lose both servers in the - * a-group or both servers in the b-group without losing any sessions. - * Note that sessions will be lost if one server is lost from both the - * a-group and the b-group. - * - * 'memcache_store.servers' => array( - * array( - * array('hostname' => 'mc_a1'), - * array('hostname' => 'mc_a2'), - * ), - * array( - * array('hostname' => 'mc_b1'), - * array('hostname' => 'mc_b2'), - * ), - * ), - * - * Example of simple configuration with only one memcache server, - * running on the same computer as the web server: - * Note that all sessions will be lost if the memcache server crashes. - * - * 'memcache_store.servers' => array( - * array( - * array('hostname' => 'localhost'), - * ), - * ), - * - */ - 'memcache_store.servers' => array( - array( - array('hostname' => 'localhost'), - ), - ), + /* + * The DSN the sql datastore should connect to. + * + * See http://www.php.net/manual/en/pdo.drivers.php for the various + * syntaxes. + */ + 'store.sql.dsn' => 'sqlite:/path/to/sqlitedatabase.sq3', + + /* + * The username and password to use when connecting to the database. + */ + 'store.sql.username' => null, + 'store.sql.password' => null, + + /* + * The prefix we should use on our tables. + */ + 'store.sql.prefix' => 'simpleSAMLphp', - /* - * This value is the duration data should be stored in memcache. Data - * will be dropped from the memcache servers when this time expires. - * The time will be reset every time the data is written to the - * memcache servers. - * - * This value should always be larger than the 'session.duration' - * option. Not doing this may result in the session being deleted from - * the memcache servers while it is still in use. - * - * Set this value to 0 if you don't want data to expire. - * - * Note: The oldest data will always be deleted if the memcache server - * runs out of storage space. - */ - 'memcache_store.expires' => 36 * (60*60), // 36 hours. + /* + * Configuration for the MemcacheStore class. This allows you to store + * multiple redudant copies of sessions on different memcache servers. + * + * 'memcache_store.servers' is an array of server groups. Every data + * item will be mirrored in every server group. + * + * Each server group is an array of servers. The data items will be + * load-balanced between all servers in each server group. + * + * Each server is an array of parameters for the server. The following + * options are available: + * - 'hostname': This is the hostname or ip address where the + * memcache server runs. This is the only required option. + * - 'port': This is the port number of the memcache server. If this + * option isn't set, then we will use the 'memcache.default_port' + * ini setting. This is 11211 by default. + * - 'weight': This sets the weight of this server in this server + * group. http://php.net/manual/en/function.Memcache-addServer.php + * contains more information about the weight option. + * - 'timeout': The timeout for this server. By default, the timeout + * is 3 seconds. + * + * Example of redudant configuration with load balancing: + * This configuration makes it possible to lose both servers in the + * a-group or both servers in the b-group without losing any sessions. + * Note that sessions will be lost if one server is lost from both the + * a-group and the b-group. + * + * 'memcache_store.servers' => array( + * array( + * array('hostname' => 'mc_a1'), + * array('hostname' => 'mc_a2'), + * ), + * array( + * array('hostname' => 'mc_b1'), + * array('hostname' => 'mc_b2'), + * ), + * ), + * + * Example of simple configuration with only one memcache server, + * running on the same computer as the web server: + * Note that all sessions will be lost if the memcache server crashes. + * + * 'memcache_store.servers' => array( + * array( + * array('hostname' => 'localhost'), + * ), + * ), + * + */ + 'memcache_store.servers' => array( + array( + array('hostname' => 'localhost'), + ), + ), - /* - * Should signing of generated metadata be enabled by default. - * - * Metadata signing can also be enabled for a individual SP or IdP by setting the - * same option in the metadata for the SP or IdP. - */ - 'metadata.sign.enable' => FALSE, - - /* - * The default key & certificate which should be used to sign generated metadata. These - * are files stored in the cert dir. - * These values can be overridden by the options with the same names in the SP or - * IdP metadata. - * - * If these aren't specified here or in the metadata for the SP or IdP, then - * the 'certificate' and 'privatekey' option in the metadata will be used. - * if those aren't set, signing of metadata will fail. - */ - 'metadata.sign.privatekey' => NULL, - 'metadata.sign.privatekey_pass' => NULL, - 'metadata.sign.certificate' => NULL, + /* + * This value is the duration data should be stored in memcache. Data + * will be dropped from the memcache servers when this time expires. + * The time will be reset every time the data is written to the + * memcache servers. + * + * This value should always be larger than the 'session.duration' + * option. Not doing this may result in the session being deleted from + * the memcache servers while it is still in use. + * + * Set this value to 0 if you don't want data to expire. + * + * Note: The oldest data will always be deleted if the memcache server + * runs out of storage space. + */ + 'memcache_store.expires' => 36 * (60 * 60), // 36 hours. - /* - * Proxy to use for retrieving URLs. - * - * Example: - * 'proxy' => 'tcp://proxy.example.com:5100' - */ - 'proxy' => NULL, + /* + * Should signing of generated metadata be enabled by default. + * + * Metadata signing can also be enabled for a individual SP or IdP by setting the + * same option in the metadata for the SP or IdP. + */ + 'metadata.sign.enable' => false, + + /* + * The default key & certificate which should be used to sign generated metadata. These + * are files stored in the cert dir. + * These values can be overridden by the options with the same names in the SP or + * IdP metadata. + * + * If these aren't specified here or in the metadata for the SP or IdP, then + * the 'certificate' and 'privatekey' option in the metadata will be used. + * if those aren't set, signing of metadata will fail. + */ + 'metadata.sign.privatekey' => null, + 'metadata.sign.privatekey_pass' => null, + 'metadata.sign.certificate' => null, + + + /* + * Proxy to use for retrieving URLs. + * + * Example: + * 'proxy' => 'tcp://proxy.example.com:5100' + */ + 'proxy' => null, + + /* + * Array of domains that are allowed when generating links or redirections + * to URLs. simpleSAMLphp will use this option to determine whether to + * to consider a given URL valid or not, but you should always validate + * URLs obtained from the input on your own (i.e. ReturnTo or RelayState + * parameters obtained from the $_REQUEST array). + * + * Set to NULL to disable checking of URLs. + * + * simpleSAMLphp will automatically add your own domain (either by checking + * it dinamically, or by using the domain defined in the 'baseurlpath' + * directive, the latter having precedence) to the list of trusted domains, + * in case this option is NOT set to NULL. In that case, you are explicitly + * telling simpleSAMLphp to verify URLs. + * + * Set to an empty array to disallow ALL redirections or links pointing to + * an external URL other than your own domain. + * + * Example: + * 'trusted.url.domains' => array('sp.example.com', 'app.example.com'), + */ + 'trusted.url.domains' => null, ); diff --git a/inc/simplesamlphp/config/ldap.php b/inc/simplesamlphp/config/ldap.php index 192278e..3167312 100644 --- a/inc/simplesamlphp/config/ldap.php +++ b/inc/simplesamlphp/config/ldap.php @@ -1,8 +1,6 @@ 'uid=%username%,dc=feide,dc=no,ou=feide,dc=uninett,dc=no', 'auth.ldap.hostname' => 'ldap.uninett.no', 'auth.ldap.attributes' => null, - 'auth.ldap.enable_tls' => false, + 'auth.ldap.enable_tls' => true, /* * Searching the DN of the user. diff --git a/inc/simplesamlphp/config/ldapmulti.php b/inc/simplesamlphp/config/ldapmulti.php index 4042d64..fbd2e03 100644 --- a/inc/simplesamlphp/config/ldapmulti.php +++ b/inc/simplesamlphp/config/ldapmulti.php @@ -3,7 +3,6 @@ /* * Configuration for the multi-DN LDAP authentication module. * - * $Id: ldapmulti.php 826 2008-08-20 14:14:08Z hans.zandbelt $ */ $ldapmulti = array ( @@ -14,7 +13,7 @@ $ldapmulti = array ( 'dnpattern' => 'uid=%username%,dc=feide,dc=no,ou=feide,dc=uninett,dc=no', 'hostname' => 'ldap.uninett.no', 'attributes' => NULL, - 'enable_tls' => FALSE, + 'enable_tls' => TRUE, 'search.enable' => FALSE, 'search.base' => NULL, 'search.attributes' => NULL, diff --git a/inc/simplesamlphp/config/translation.php b/inc/simplesamlphp/config/translation.php index 9dcb1c4..97178e9 100644 --- a/inc/simplesamlphp/config/translation.php +++ b/inc/simplesamlphp/config/translation.php @@ -2,7 +2,6 @@ /* * Configuration * - * $Id: translation.php 2100 2010-01-12 11:33:22Z andreassolberg $ */ $config = array ( diff --git a/inc/simplesamlphp/dictionaries/admin.definition.json b/inc/simplesamlphp/dictionaries/admin.definition.json index fc9739f..f9e3b20 100644 --- a/inc/simplesamlphp/dictionaries/admin.definition.json +++ b/inc/simplesamlphp/dictionaries/admin.definition.json @@ -68,6 +68,12 @@ "metaover_group_metadata.shib13-idp-remote": { "en": "Shib 1.3 Identity Provider (Remote)" }, + "metaover_group_metadata.adfs-sp-remote": { + "en": "ADFS Service Provider (Remote)" + }, + "metaover_group_metadata.adfs-idp-hosted": { + "en": "ADFS Identity Provider (Hosted)" + }, "metaover_group_metadata.wsfed-sp-hosted": { "en": "WS-Federation Service Provider (Hosted)" }, @@ -95,6 +101,12 @@ "metadata_shib13-idp": { "en": "Shib 1.3 IdP Metadata" }, + "metadata_adfs-sp": { + "en": "ADFS SP Metadata" + }, + "metadata_adfs-idp": { + "en": "ADFS IdP Metadata" + }, "metadata_intro": { "en": "Here is the metadata that simpleSAMLphp has generated for you. You may send this metadata document to trusted partners to setup a trusted federation." }, diff --git a/inc/simplesamlphp/dictionaries/admin.translation.json b/inc/simplesamlphp/dictionaries/admin.translation.json index e399a26..087b6dd 100644 --- a/inc/simplesamlphp/dictionaries/admin.translation.json +++ b/inc/simplesamlphp/dictionaries/admin.translation.json @@ -13,6 +13,7 @@ "pt": "Verifica\u00e7\u00e3o da configura\u00e7\u00e3o", "pl": "Sprawdzenie konfiguracji", "cs": "Verifikace konfigurace", + "eu": "Konfigurazioa egiaztatu", "tr": "Konfig\u00fcrasyon kontrol\u00fc", "de": "Konfigurationscheck", "fr": "V\u00e9rification de la configuration", @@ -25,8 +26,10 @@ "ru": "\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", "zh": "\u914d\u7f6e\u68c0\u67e5", "ar": "\u0645\u0631\u0627\u062c\u0639\u0629 \u0627\u0644\u062a\u0631\u062a\u064a\u0628", + "lv": "Konfigur\u0101cijas p\u0101rbaude", "id": "Pemeriksaan konfigurasi", - "sr": "Provera pode\u0161avanja" + "sr": "Provera pode\u0161avanja", + "ro": "Verificarea configura\u021biei" }, "cfg_check_select_file": { "no": "Velg hvilken konfigurasjonfil som skal sjekkes", @@ -41,7 +44,7 @@ "pt-br": "Selecione o arquivo de configura\u00e7\u00e3o para verificar", "pt": "Escolha o ficheiro de configura\u00e7\u00e3o a verificar:", "pl": "Wybierz plik konfiguracyjny do sprawdzenia:", - "cs": "Vyber konfiguracniho souboru k verifikaci:", + "cs": "Vyber konfigura\u010dn\u00edho souboru k verifikaci:", "tr": "Kontrol edilecek konfig\u00fcrasyon dosyas\u0131n\u0131 se\u00e7:", "de": "W\u00e4hlen Sie die Konfigurationsdatei, die gecheckt werden soll:", "fr": "S\u00e9lectionnez le fichier de configuration \u00e0 v\u00e9rifier :", @@ -54,8 +57,11 @@ "ru": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:", "zh": "\u9009\u62e9\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u7528\u4e8e\u68c0\u6d4b", "ar": "\u0627\u062e\u062a\u0627\u0631\u0645\u0644\u0641 \u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0630\u064a \u062a\u0631\u063a\u0628 \u0628\u0645\u0631\u0627\u062c\u0639\u062a\u0647", + "lv": "Izv\u0113lieties p\u0101rbaud\u0101mos konfigur\u0101cijas failus:", "id": "Pilih file konfigurasi untuk diperiksa", - "sr": "Odaberite konfiguracionu fajl koji \u017eelite proveriti:" + "sr": "Odaberite konfiguracionu fajl koji \u017eelite proveriti:", + "ro": "Alege\u021bi fi\u0219ierul de configurare care dori\u021bi s\u0103-l verifica\u021bi:", + "eu": "Hautatu ezazu egiaztatu beharreko konfigurazio fitxategia:" }, "cfg_check_missing": { "no": "Mangler element i konfigurasjonsfilen", @@ -82,8 +88,12 @@ "he": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d7\u05e1\u05e8\u05d5\u05ea \u05de\u05e7\u05d5\u05d1\u05e5 \u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", "zh": "\u914d\u7f6e\u6587\u4ef6\u4e2d\u9009\u9879\u7f3a\u5931", "ar": "\u062e\u064a\u0627\u0631\u0627\u062a \u0645\u0641\u0642\u0648\u062f\u0629 \u0645\u0646 \u0645\u0644\u0641 \u0627\u0644\u062a\u0631\u062a\u064a\u0628", + "lv": "Konfigur\u0101cijas fail\u0101 tr\u016bkst opciju", "id": "Opsi-opsi uang hilang dari file konfigurasi", - "sr": "Paramentri koji nedostaju u konfiguracionom fajlu" + "sr": "Paramentri koji nedostaju u konfiguracionom fajlu", + "ro": "Op\u021biuni care nu apar \u00een fi\u0219ierul de configurare", + "ru": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", + "eu": "Konfigurazio fitxategian falta diren aukerak" }, "cfg_check_superfluous": { "no": "Overf\u00f8ldig element i konfigurasjonsfilen", @@ -110,8 +120,12 @@ "he": "\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05de\u05d9\u05d5\u05ea\u05e8\u05d5\u05ea \u05d1\u05e7\u05d5\u05d1\u05e5 \u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", "zh": "\u914d\u7f6e\u6587\u4ef6\u4e2d\u62e5\u6709\u8fc7\u591a\u7684\u9009\u9879", "ar": "\u062e\u064a\u0627\u0631\u0627\u062a \u0641\u0627\u0626\u0636\u0629 \u0628\u0645\u0644\u0641 \u0627\u0644\u062a\u0631\u062a\u064a\u0628", + "lv": "S\u012bkas (superfluous) opcijas konfigur\u0101cijas fail\u0101", "id": "Pilihan tak beguna di file konfigurasi", - "sr": "Suvi\u0161ni parametri u konfiguracionom fajlu" + "sr": "Suvi\u0161ni parametri u konfiguracionom fajlu", + "ro": "Op\u021biuni inutile \u00een fi\u0219ierul de configurare", + "ru": "\u0418\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", + "eu": "Konfigurazio fitxategian soberan dauden aukerak" }, "cfg_check_noerrors": { "no": "Ingen feil funnet", @@ -127,6 +141,7 @@ "pt": "N\u00e3o foram encontrados erros.", "pl": "Nie znaleziono b\u0142\u0119d\u00f3w.", "cs": "Nenalezeny \u017e\u00e1dn\u00e9 chyby", + "eu": "Ez da errorerik aurkitu", "tr": "Hata bulunmad\u0131.", "de": "Keine Fehler gefunden.", "fr": "Aucune erreur.", @@ -138,8 +153,11 @@ "he": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea.", "zh": "\u6ca1\u6709\u53d1\u73b0\u9519\u8bef", "ar": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u062e\u0637\u0627\u0621 ", + "lv": "K\u013c\u016bdas nav atrastas.", "id": "Tidak ada error yang ditemukan", - "sr": "Nije prona\u0111ena nijedna gre\u0161ka." + "sr": "Nije prona\u0111ena nijedna gre\u0161ka.", + "ro": "Nu au fost depistate erori.", + "ru": "\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e." }, "cfg_check_back": { "no": "G\u00e5 tilbake til fil-listen", @@ -155,6 +173,7 @@ "pt": "Voltar \u00e0 lista de ficheiros", "pl": "Powr\u00f3t do listy plik\u00f3w", "cs": "Zp\u00e1tky na seznam soubor\u016f", + "eu": "Itzuli fitxategien zerrendara", "tr": "Dosya listesine geri d\u00f6n", "de": "Gehe zur\u00fcck zur Dateiliste", "fr": "Retour \u00e0 la liste des fichiers", @@ -166,8 +185,11 @@ "he": "\u05d7\u05d6\u05d5\u05e8 \u05d0\u05dc \u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd", "zh": "\u8fd4\u56de\u81f3\u6587\u4ef6\u5217\u8868", "ar": "\u0639\u062f \u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062a", + "lv": "Iet atpaka\u013c uz sarakstu", "id": "Kembali ke daftar file", - "sr": "Vrati se natrag na listu fajlova" + "sr": "Vrati se natrag na listu fajlova", + "ro": "Merge\u021bi \u00eenapoi la lista de fi\u0219iere", + "ru": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0441\u043f\u0438\u0441\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432" }, "metaover_header": { "no": "Oversikt over metadata", @@ -194,8 +216,12 @@ "he": "\u05e1\u05e7\u05d9\u05e8\u05ea \u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2", "zh": "\u5143\u4fe1\u606f\u6d4f\u89c8", "ar": "\u0646\u0638\u0631\u0629 \u0639\u0627\u0645\u0629 \u0644\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629\/ \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627", + "lv": "Metadatu p\u0101rskats", "id": "Ikhtisar Metadata", - "sr": "Pregled metapodataka" + "sr": "Pregled metapodataka", + "ro": "Prezentare general\u0103 a metadatelor", + "ru": "\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", + "eu": "Ikusi metadatuak" }, "metaover_intro": { "no": "For \u00e5 se p\u00e5 detaljene i en SAML-entitet, klikk p\u00e5 SAML-entitet overskriften", @@ -222,8 +248,12 @@ "he": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e1\u05ea\u05db\u05dc \u05e2\u05dc \u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05dc \u05d9\u05e9\u05d5\u05ea SAML, \u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05d5\u05ea\u05e8\u05ea \u05d9\u05e9\u05d5\u05ea \u05d4SAML ", "zh": "\u60f3\u8981\u67e5\u770bSAML\u5b9e\u4f53\u7684\u8be6\u7ec6\u60c5\u51b5\uff0c\u8bf7\u70b9\u51fbSAML\u5b9e\u4f53\u8f7d\u5165\u5668", "ar": "\u0644\u0625\u0644\u063a\u0627\u0621 \u0646\u0638\u0631\u0629 \u0639\u0644\u064a \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u062d\u062f\u064a \u0648\u062d\u062f\u0627\u062a SAML, \u0627\u0636\u063a\u0637 \u0639\u0644\u064a \u062a\u0631\u0648\u064a\u0633\u0629 \u0627\u0644\u0648\u062d\u062f\u0629 ", + "lv": "Lai apl\u016bkotu SAML vienuma deta\u013cas, klik\u0161\u0137iniet uz vienuma galvenes.", "id": "Untuk melihat detail entiti SAML, klik pada bagian header entiti SAML", - "sr": "Da biste videli detalje o SAML entitetu, kliknite na njegovo zaglavlje." + "sr": "Da biste videli detalje o SAML entitetu, kliknite na njegovo zaglavlje.", + "ro": "Pentru a vizualiza detalii privind o entitate SAML, ap\u0103sa\u021bi pe antetul entit\u0103\u021bii SAML.", + "ru": "\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 SAML, \u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0438 SAML.", + "eu": "SAML entitate baten xehetasunak ikusteko, klikatu entitatearen goiburua." }, "metaover_errorentry": { "no": "Feil i metadataoppf\u00f8ringen", @@ -250,8 +280,12 @@ "he": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05e8\u05e9\u05d5\u05de\u05ea \u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05d6\u05d5", "zh": "\u8be5\u5143\u4fe1\u606f\u5b9e\u4f53\u5b58\u5728\u9519\u8bef", "ar": "\u062e\u0637\u0627 \u0628\u0647\u0630\u0627 \u0627\u0644\u0628\u064a\u0627\u0646 \u0627\u0644\u0648\u0635\u0641\u064a\/ \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627", + "lv": "K\u013c\u016bda \u0161aj\u0101 metadatu ierakst\u0101", "id": "Error pada entri metadata ini", - "sr": "Ovaj zapis metapodataka sadr\u017ei gre\u0161ku" + "sr": "Ovaj zapis metapodataka sadr\u017ei gre\u0161ku", + "ro": "Eroare \u00een aceast\u0103 metadat\u0103", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", + "eu": "Metadatu sarrera honetan errorea" }, "metaover_required_found": { "no": "Obligatorisk felt", @@ -278,8 +312,12 @@ "he": "\u05e9\u05d3\u05d5\u05ea \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd", "zh": "\u5fc5\u9700\u7684\u533a\u57df", "ar": "\u062d\u0642\u0644 \u0625\u062c\u0628\u0627\u0631\u064a", + "lv": "Oblig\u0101tie lauki", "id": "Field-field yang wajib diisi", - "sr": "Obavezna polja" + "sr": "Obavezna polja", + "ro": "C\u00e2mpuri obligatorii", + "ru": "\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f", + "eu": "Derrigorrezko eremuak" }, "metaover_required_not_found": { "no": "F\u00f8lgende obligatoriske felter ble ikke funnet", @@ -306,8 +344,12 @@ "he": "\u05d4\u05e9\u05d3\u05d5\u05ea \u05d4\u05d3\u05e8\u05d5\u05e9\u05d9\u05dd \u05d4\u05d1\u05d0\u05d9\u05dd \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5", "zh": "\u4e0b\u5217\u5fc5\u9700\u7684\u533a\u57df\u6ca1\u6709\u627e\u5230", "ar": "\u0627\u0644\u062d\u0642\u0648\u0644 \u0627\u0644\u0625\u062c\u0628\u0627\u0631\u064a\u0629 \u0623\u062f\u0646\u0627\u0647 \u0645\u0641\u0642\u0648\u062f\u0629", + "lv": "Nav atrasti oblig\u0101tie lauki", "id": "Field-field yang diperlukan wajib disisi berikut ini tidak ditemukan", - "sr": "Nisu prona\u0111ena slede\u0107a opciona polja" + "sr": "Nisu prona\u0111ena slede\u0107a opciona polja", + "ro": "Urm\u0103toarele c\u00e2mpuri obligatorii nu au fost g\u0103site", + "ru": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b", + "eu": "Derrigorrezko datu hauek ez dira aurkitu" }, "metaover_optional_found": { "no": "Valgbart felt", @@ -334,8 +376,12 @@ "he": "\u05e9\u05d3\u05d5\u05ea \u05e8\u05e9\u05d5\u05ea", "zh": "\u9009\u9879\u533a\u57df", "ar": "\u062d\u0642\u0644 \u0627\u062e\u062a\u064a\u0627\u0631\u064a", + "lv": "Neoblig\u0101tie lauki", "id": "Field-field opsional", - "sr": "Opciona polja" + "sr": "Opciona polja", + "ro": "C\u00e2mpuri op\u021bionale", + "ru": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f", + "eu": "Hautazko datuak" }, "metaover_optional_not_found": { "no": "F\u00f8lgende valgbare felt ble ikke funnet", @@ -351,7 +397,7 @@ "pt-br": "Os seguintes campos opcionais n\u00e3o foram encontrados", "pt": "Os seguintes campos opcionais n\u00e3o foram encontrados", "pl": "Nastepuj\u0105ce pola opcjonalne nie zosta\u0142y znalezione", - "cs": "asleduj\u00edc\u00ed voliteln\u00e1 pole nenalezena", + "cs": "Nasleduj\u00edc\u00ed voliteln\u00e1 pole nenalezena", "tr": "\u015eu iste\u011fe ba\u011fl\u0131 alanlar bulunamad\u0131", "fr": "Les champs optionnels suivants n'ont pas \u00e9t\u00e9 trouv\u00e9s", "it": "I seguenti campi, opzionali, non sono stati trovati", @@ -362,8 +408,12 @@ "he": "\u05e9\u05d3\u05d5\u05ea \u05d4\u05e8\u05e9\u05d5\u05ea \u05d4\u05d1\u05d0\u05d9\u05dd \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5", "zh": "\u4e0b\u5217\u5fc5\u9700\u7684\u9009\u9879\u533a\u57df\u6ca1\u6709\u627e\u5230", "ar": "\u0627\u0644\u062d\u0642\u0648\u0644 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631\u064a\u0629 \u0623\u062f\u0646\u0627\u0647 \u0645\u0641\u0642\u0648\u062f\u0629", + "lv": "Nav atrasti neoblig\u0101tie lauki", "id": "Field-field opsional berikut tidak dapat ditemukan", - "sr": "Nisu prona\u0111ena slede\u0107a opciona polja" + "sr": "Nisu prona\u0111ena slede\u0107a opciona polja", + "ro": "Urm\u0103toarele c\u00e2mpuri op\u021bionale nu au fost g\u0103site", + "ru": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b", + "eu": "Hautazko datu hauek ez dira aurkitu" }, "metaover_unknown_found": { "no": "F\u00f8lgende felt ble ikke gjenkjent", @@ -390,8 +440,12 @@ "he": "\u05d4\u05e9\u05d3\u05d5\u05ea \u05d4\u05d1\u05d0\u05d9\u05dd \u05dc\u05d0 \u05d6\u05d5\u05d4\u05d5", "zh": "\u4e0b\u5217\u533a\u57df\u65e0\u6cd5\u8bc6\u522b", "ar": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0639\u0631\u0641 \u0639\u0644\u064a \u0627\u0644\u0642\u0644 \u0623\u062f\u0646\u0627\u0647 ", + "lv": "Nav atpaz\u012bti \u0161\u0101di ievadlauki", "id": "Field-field berikut ini tidak dapat dikenali", - "sr": "Slede\u0107a polja nisu prepoznata" + "sr": "Slede\u0107a polja nisu prepoznata", + "ro": "Urm\u0103toarele c\u00e2mpuri nu au fost recunoscute", + "ru": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043d\u044b", + "eu": "Datu hauek ez dira antzeman" }, "metadata_metadata": { "no": "Metadata", @@ -418,14 +472,18 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2", "zh": "\u5143\u4fe1\u606f", "ar": "\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0635\u0641\u064a\u0629\/ \u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627", + "lv": "Metadati", "id": "Metadata", - "sr": "Metapodaci" + "sr": "Metapodaci", + "ro": "Metadate", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "eu": "Metadatuak" }, "metadata_xmlformat": { "no": "I SAML 2.0 Metadata XML Format:", "nn": "P\u00e5 SAML 2.0 metadata XML-format", "sv": "I SAML 2.0 Metadata XML-format:", - "es": "en formato xml de metadatos SAML 2.0:", + "es": "En formato xml de metadatos SAML 2.0:", "nl": "In SAML 2.0 Metadata XML formaat:", "sl": "V SAML 2.0 Metapodatkovni XML format:", "da": "I SAML 2.0 metadata xml-format:", @@ -446,8 +504,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e2\u05d1\u05d5\u05e8 SAML 2.0 \u05d1\u05ea\u05d1\u05e0\u05d9\u05ea XML:", "zh": "\u5728SAML 2.0 XML \u5143\u4fe1\u606f\u683c\u5f0f\u4e2d\uff1a", "ar": "\u0628\u064a\u0627\u0646\u0627\u062a SAML 2.0 \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0628\u0635\u064a\u063a\u0629 XML", + "lv": "SAML 2.0 metadatos XML form\u0101t\u0101:", "id": "Dalam format XML Metadata SAML 2.0", - "sr": "Metapodaci u SAML 2.0 XML formatu:" + "sr": "Metapodaci u SAML 2.0 XML formatu:", + "ro": "\u00cen format metadate XML SAML 2.0:", + "ru": "xml \u0444\u043e\u0440\u043c\u0430\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 SAML 2.0:", + "eu": "SAML 2.0 metadatuetako xml formatuan:" }, "debug_sending_message_text_link": { "no": "Du er i ferd med \u00e5 sende en melding. Trykk p\u00e5 send melding knappen for \u00e5 fortsette.", @@ -462,6 +524,7 @@ "pt-br": "Voc\u00ea est\u00e1 prestes a enviar uma mensagem. Clique no link enviar a mensagem para continuar.", "pt": "Est\u00e1 prestes a enviar uma mensagem. Carregue na liga\u00e7\u00e3o para continuar.", "cs": "M\u016f\u017eete poslat zpr\u00e1vu. Klikn\u011bte na odkaz pro pokra\u010dov\u00e1n\u00ed.", + "eu": "Mezu bat bidaltzeari ekingo zaio. Saka ezazu \"Mezua bidali\" lotura jarraitzeko.", "tr": "Mesaj g\u00f6ndermek \u00fczeresiniz. Devam etmek i\u00e7in mesaj g\u00f6nder linkine t\u0131klay\u0131n.", "de": "Sie sind dabei eine Nachricht zu senden. Klicken Sie auf den Nachricht senden Link um fortzufahren.", "fr": "Vous allez envoyer un message. Cliquez sur le lien d'envoi pour continuer.", @@ -473,8 +536,11 @@ "he": "\u05d0\u05ea\u05d4 \u05e2\u05d5\u05de\u05d3 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4. \u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05e9\u05dc\u05d9\u05d7\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05de\u05e9\u05d9\u05da.", "zh": "\u4f60\u51c6\u5907\u53d1\u9001\u4e00\u4e2a\u6d88\u606f\uff0c\u8bf7\u70b9\u51fb\u63d0\u4ea4\u94fe\u63a5\u4ee5\u7ee7\u7eed", "ar": "\u0627\u0646\u062a \u0639\u0644\u064a \u0648\u0634\u0643 \u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629. \u0627\u0636\u063a\u0637 \u0639\u0644\u064a \u0627\u0644\u0631\u0627\u0628\u0637 \u0644\u0644\u0645\u0648\u0627\u0635\u0644\u0629", + "lv": "J\u016bs gatavojaties s\u016bt\u012bt zi\u0146u. Spiediet saiti S\u016bt\u012bt zi\u0146u.", "id": "Anda baru saja akan mengirim sebuah pesan. Tekan link submit pesan untuk melanjutkan.", - "sr": "Kliknite na link \"Po\u0161alji poruku\" da biste poslali poruku." + "sr": "Kliknite na link \"Po\u0161alji poruku\" da biste poslali poruku.", + "ro": "Mesajul este preg\u0103tit pentru a fi trimis. Ap\u0103sa\u021bi link-ul de trimitere pentru a continua.", + "ru": "\u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f." }, "debug_sending_message_send": { "no": "Send melding", @@ -490,6 +556,7 @@ "pt": "Enviar mensagem", "pl": "Wy\u015blij wiadomo\u015b\u0107", "cs": "Poslat zpr\u00e1vu", + "eu": "Mezua bidali", "tr": "Mesaj g\u00f6nder", "de": "Nachricht senden", "fr": "Envoi du message", @@ -501,8 +568,11 @@ "he": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4", "zh": "\u63d0\u4ea4\u4fe1\u606f", "ar": "\u0633\u0644\u0645 \u0627\u0644\u0631\u0633\u0627\u0644\u0629", + "lv": "S\u016bt\u012bt zi\u0146u", "id": "Submit pesan", - "sr": "Po\u0161alji poruku" + "sr": "Po\u0161alji poruku", + "ro": "Trimite mesajul", + "ru": "\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435" }, "debug_sending_message_msg_title": { "no": "Melding", @@ -529,8 +599,12 @@ "he": "\u05d4\u05d5\u05d3\u05e2\u05d4", "zh": "\u4fe1\u606f", "ar": "\u0631\u0633\u0627\u0644\u0629", + "lv": "Zi\u0146a", "id": "Pesan", - "sr": "Poruka" + "sr": "Poruka", + "ro": "Mesaj", + "ru": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435", + "eu": "Mezua" }, "debug_sending_message_msg_text": { "no": "Siden du er i debug modus kan du se innholdet i meldingene du sender.", @@ -556,8 +630,12 @@ "he": "\u05db\u05d9\u05d5\u05d5\u05df \u05e9\u05d0\u05ea\u05d4 \u05d1\u05de\u05e6\u05d1 \u05de\u05d1\u05d3\u05d9\u05e7\u05ea \u05d1\u05d0\u05d2\u05d9\u05dd, \u05d0\u05ea\u05d4 \u05e8\u05d5\u05d0\u05d4 \u05d0\u05ea \u05ea\u05d5\u05db\u05df \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05d0\u05ea\u05d4 \u05e9\u05d5\u05dc\u05d7:", "zh": "\u5f53\u4f60\u5904\u5728\u8c03\u8bd5\u6a21\u5f0f\u4e2d\u65f6\uff0c\u4f60\u5c06\u770b\u5230\u4f60\u6b63\u5728\u53d1\u9001\u7684\u6d88\u606f\u7684\u5185\u5bb9", "ar": "\u064a\u0645\u0643\u0646\u0643 \u0631\u0624\u064a\u0629 \u0645\u062d\u062a\u0648\u064a \u0627\u0644\u0631\u0633\u0627\u0644\u0629 \u0637\u0627\u0644\u0645\u0627 \u0643\u0646\u062a \u0641\u064a \u062d\u0627\u0644\u0629 \u062a\u0635\u062d\u064a\u062d", + "lv": "T\u0101 k\u0101 \u0161is ir atk\u013c\u016bdo\u0161anas re\u017e\u012bms, J\u016bs varat redz\u0113t s\u016bt\u0101m\u0101s zi\u0146as saturu:", "id": "Karena anda berada pada mode debug, anda dapat melihat isi pesan yang anda kirim:", - "sr": "Obzirom da ste u debug modu, imate mogu\u0107nost videti sadr\u017eaj poruke koju \u0161aljete:" + "sr": "Obzirom da ste u debug modu, imate mogu\u0107nost videti sadr\u017eaj poruke koju \u0161aljete:", + "ro": "\u00centruc\u00e2t sunte\u021bi \u00een modul depanare, ve\u021bi vedea con\u021binutul mesajului care va fi trimis:", + "ru": "\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.", + "eu": "Arazketa moduan egonez gero, bidaltzera zoazen mezuaren edukia ikusiko duzu:" }, "metaover_group_metadata.saml20-sp-remote": { "no": "SAML 2.0 Tjenesteleverand\u00f8r (ekstern)", @@ -584,8 +662,12 @@ "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 SAML 2.0", "zh": "SAML 2.0 \u670d\u52a1\u63d0\u4f9b\u8005 (\u8fdc\u7a0b)", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 SAML 2.0 \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "SAML 2.0 servisa pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", "id": "Service Provider SAML 2.0 (Remote)", - "sr": "SAML 2.0 Davalac Servisa (udaljeni)" + "sr": "SAML 2.0 Davalac Servisa (udaljeni)", + "ro": "Furnizor de servicii SAML 2.0 (distant)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 SAML 2.0 (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "SAML 2.0 Zerbitzu hornitzailea (Urrunekoa)" }, "metaover_group_metadata.saml20-idp-hosted": { "no": "SAML 2.0 Identitetsleverand\u00f8r (ekstern)", @@ -612,8 +694,12 @@ "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 SAML 2.0", "zh": "SAML 2.0 \u8eab\u4efd\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", "ar": "\u0645\u0642\u062f\u0645 \u0647\u0648\u064a\u0629 SAML 2.0 \u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641", + "lv": "SAML 2.0 identit\u0101tes pieg\u0101d\u0101t\u0101js (host\u0113ts)", "id": "Identity Provider SAML 2.0 (Hosted)", - "sr": "SAML 2.0 Davalac Identiteta (lokalni)" + "sr": "SAML 2.0 Davalac Identiteta (lokalni)", + "ro": "Furnizor de identitate SAML 2.0 (g\u0103zduit)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 SAML 2.0 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "SAML 2.0 Identitate hornitzailea (Anfitrioia)" }, "metaover_group_metadata.saml20-idp-remote": { "no": "SAML 2.0 Identitetsleverand\u00f8r (ekstern)", @@ -640,8 +726,12 @@ "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 SAML 2.0", "zh": "SAML 2.0 \u8eab\u4efd\u63d0\u4f9b\u8005\uff08\u8fdc\u7a0b\uff09", "ar": "\u0645\u0642\u062f\u0645 \u0647\u0648\u064a\u0629 SAML 2.0 \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "SAML 2.0 identit\u0101tes pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", "id": "Identity Provider SAML 2.0 (Remote)", - "sr": "SAML 2.0 Davalac Identiteta (udaljeni)" + "sr": "SAML 2.0 Davalac Identiteta (udaljeni)", + "ro": "Furnizor de identitate SAML 2.0 (distant)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 SAML 2.0 (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "SAML 2.0 Identitate hornitzailea (Urrunekoa)" }, "metaover_group_metadata.shib13-sp-hosted": { "no": "Shib 1.3 Tjenesteleverand\u00f8r (intern)", @@ -668,8 +758,12 @@ "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 \u670d\u52a1\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 Shib 1.3 \u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641", + "lv": "Shib 1.3 servisa pieg\u0101d\u0101t\u0101js (host\u0113ts)", "id": "Service Provider Shib 1.3 (Hosted)", - "sr": "Shib 1.3 Davalac Servisa (lokalni)" + "sr": "Shib 1.3 Davalac Servisa (lokalni)", + "ro": "Furnizor de servicii Shib 1.3 (g\u0103zduit)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 Shib 1.3 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "Shib 1.3 Zerbitzu hornitzailea (Anfitrioia)" }, "metaover_group_metadata.shib13-sp-remote": { "no": "Shib 1.3 Tjenesteleverand\u00f8r (ekstern)", @@ -696,8 +790,12 @@ "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 \u670d\u52a1\u63d0\u4f9b\u8005\uff08\u8fdc\u7a0b\uff09", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 Shib 1.3 \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "Shib 1.3 servisa pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", "id": "Service Provider Shib 1.3 (Remote)", - "sr": "Shib 1.3 Davalac Servisa (udaljeni)" + "sr": "Shib 1.3 Davalac Servisa (udaljeni)", + "ro": "Furnizor de servicii Shib 1.3 (distant)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 Shib 1.3 (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "Shib 1.3 Zerbitzu hornitzailea (Urrunekoa)" }, "metaover_group_metadata.shib13-idp-hosted": { "no": "Shib 1.3 Identitetsleverand\u00f8r (ekstern)", @@ -724,8 +822,12 @@ "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 \u8ba4\u8bc1\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", "ar": "\u0645\u0642\u062f\u0645 \u0647\u0648\u064a\u0629 Shib 1.3 \u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641", + "lv": "Shib 1.3 identit\u0101tes pieg\u0101d\u0101t\u0101js (host\u0113ts)", "id": "Identity Provider Shib 1.3 (Hosted)", - "sr": "Shib 1.3 Davalac Identiteta(lokalni)" + "sr": "Shib 1.3 Davalac Identiteta(lokalni)", + "ro": "Furnizor de identitate Shib 1.3 (g\u0103zduit)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Shib 1.3 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "Shib 1.3 Identitate hornitzailea (Anfitrioia)" }, "metaover_group_metadata.shib13-idp-remote": { "no": "Shib 1.3 Identitetsleverand\u00f8r (ekstern) ", @@ -752,9 +854,75 @@ "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 \u8ba4\u8bc1\u63d0\u4f9b\u8005\uff08\u8fdc\u7a0b\uff09", "ar": "\u0645\u0642\u062f\u0645 \u0647\u0648\u064a\u0629 Shib 1.3 \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "Shib 1.3 identit\u0101tes pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", "id": "Identity Provider Shib 1.3 (Remote)", - "sr": "Shib 1.3 Davalac Identiteta (udaljeni)" + "sr": "Shib 1.3 Davalac Identiteta (udaljeni)", + "ro": "Furnizor de identitate Shib 1.3 (distant)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Shib 1.3 (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "Shib 1.3 Identitate hornitzailea (Urrunekoa)" }, + "metaover_group_metadata.adfs-sp-remote": { + "no": "ADFS Tjenesteleverand\u00f8r (ekstern)", + "nn": "ADFS Service Provider (Remote)", + "sv": "ADFS Service Provider (Fj\u00e4rr)", + "es": "Proveedor de Servicio ADFS (Remoto)", + "nl": "ADFS Service Provider (Remote)", + "sl": "ADFS SP (Oddaljeni)", + "da": "ADFS tjenesteudbyder (remote)", + "hr": "ADFS davatelj usluge (udaljeni)", + "hu": "ADFS alkalmaz\u00e1sszolg\u00e1ltat\u00f3 (t\u00e1voli)", + "pt-br": "ADFS Service Provider (Remoto)", + "pt": "Fornecedor de servi\u00e7o (SP) ADFS (Remoto)", + "pl": "ADFS Dostawca Serwisu (Zdalny)", + "cs": "SAML 2.O Service Provider (Remote - vzd\u00e1len\u00fd)", + "tr": "ADFS Servis Sa\u011flay\u0131c\u0131 (Uzak sistemde sunulan)", + "de": "ADFS Service Provider (entfernt)", + "fr": "Fournisseur de service ADFS distant", + "it": "ADFS Service Provider (Remoto)", + "ja": "ADFS\u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0(\u30ea\u30e2\u30fc\u30c8)", + "lt": "ADFS Paslaugos teik\u0117jas (nutol\u0119s)", + "zh-tw": "ADFS \u670d\u52d9\u63d0\u4f9b\u8005(\u9060\u7aef)", + "et": "ADFS teenusepakkuja (kaug)", + "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 ADFS", + "zh": "ADFS \u670d\u52a1\u63d0\u4f9b\u8005 (\u8fdc\u7a0b)", + "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 ADFS \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "ADFS servisa pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", + "id": "Service Provider ADFS (Remote)", + "sr": "ADFS Davalac Servisa (udaljeni)", + "ro": "Furnizor de servicii ADFS (distant)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 ADFS (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)" + }, + "metaover_group_metadata.adfs-idp-hosted": { + "no": "ADFS Identitetsleverand\u00f8r (ekstern)", + "nn": "ADFS Identity Provider (Hosted)", + "sv": "ADFS Identity Provider (V\u00e4rd)", + "es": "Proveedor de Identidad ADFS (Anfitri\u00f3n)", + "nl": "ADFS Identity Provider (Hosted)", + "sl": "ADFS IdP (Lokalni)", + "da": "ADFS identitetsudbyder (hosted)", + "hr": "ADFS autentifikacijski servis (lokalni)", + "hu": "ADFS szem\u00e9lyazonoss\u00e1g-szolg\u00e1ltat\u00f3 (helyi)", + "pt-br": "ADFS Identity Provider (Local)", + "pt": "Fornecedor de identidade (IdP) ADFS (Local)", + "pl": "ADFS Dostawca To\u017csamo\u015bci (Lokalny)", + "cs": "ADFS Identity Provider (Hosted - lok\u00e1ln\u00ed)", + "tr": "ADFS Kimlik Sa\u011flay\u0131c\u0131 (Bu sistemde sunulan)", + "de": "ADFS Identity Provider (gehosted)", + "fr": "Fournisseur d'identit\u00e9 ADFS local", + "it": "SAML 2.o Identity Provider (Hosted)", + "ja": "ADFS\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0(\u30db\u30b9\u30c8)", + "lt": "ADFS Tapatybi\u0173 teik\u0117jas (vietinis)", + "zh-tw": "ADFS \u9a57\u8b49\u63d0\u4f9b\u8005(\u4e3b\u6a5f)", + "et": "ADFS identiteedipakkuja (hostitud)", + "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 ADFS", + "zh": "ADFS \u8eab\u4efd\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", + "ar": "\u0645\u0642\u062f\u0645 \u0647\u0648\u064a\u0629 ADFS \u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641", + "lv": "ADFS identit\u0101tes pieg\u0101d\u0101t\u0101js (host\u0113ts)", + "id": "Identity Provider ADFS (Hosted)", + "sr": "ADFS Davalac Identiteta (lokalni)", + "ro": "Furnizor de identitate ADFS (g\u0103zduit)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 ADFS (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)" + }, "metaover_group_metadata.wsfed-sp-hosted": { "no": "WS-Federation tjenesteleverand\u00f8r (intern)", "nn": "WS-Federation Service Provider (Hosted)", @@ -780,8 +948,12 @@ "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 \u05d0\u05d9\u05d7\u05d5\u05d3-WS", "zh": "WS-Federation \u670d\u52a1\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 WS-\u0627\u0644\u0641\u062f\u0631\u0627\u0644\u064a\u0629 \u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641 ", + "lv": "WS-Federation servisa pieg\u0101d\u0101t\u0101js (host\u0113ts)", "id": "Servide Provider WS-Federation (Hosted)", - "sr": "WS-Federation Davalac Servisa (lokalni)" + "sr": "WS-Federation Davalac Servisa (lokalni)", + "ro": "Furnizor de servicii federa\u021bie WS (g\u0103zduit)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 WS-Federation (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "WS-Federation Zerbitzu hornitzailea (Anfitrioia)" }, "metaover_group_metadata.wsfed-idp-remote": { "no": "WS-Federation identitetsleverand\u00f8r (ekstern)", @@ -808,8 +980,12 @@ "he": "\u05e1\u05e4\u05e7 \u05d6\u05d4\u05d5\u05ea \u05de\u05e8\u05d5\u05d7\u05e7 \u05de\u05e1\u05d5\u05d2 \u05d0\u05d9\u05d7\u05d5\u05d3-WS", "zh": "WS-Federation \u8eab\u4efd\u63d0\u4f9b\u8005\uff08\u8fdc\u7a0b\uff09", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 WS-\u0627\u0644\u0641\u062f\u0631\u0627\u0644\u064a\u0629 \u0627\u0644\u0628\u0639\u064a\u062f", + "lv": "WS-Federation servisa pieg\u0101d\u0101t\u0101js (att\u0101lin\u0101ts)", "id": "Identity Provider WS-Federation (Remote)", - "sr": "WS-Federation Davalac Servisa (udaljeni)" + "sr": "WS-Federation Davalac Servisa (udaljeni)", + "ro": "Furnizor de servicii federa\u021bie WS (distant)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 WS-Federation (\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "WS-Federation Identitate hornitzailea (Urrunekoa)" }, "metaconv_title": { "no": "Metadata parser", @@ -836,8 +1012,12 @@ "he": "\u05de\u05e0\u05ea\u05d7 \u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2", "zh": "\u5143\u4fe1\u606f\u5206\u6790\u5668", "ar": "\u0645\u062d\u0644\u0644 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629\/\u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627", + "lv": "Metadatu pars\u0113t\u0101js", "id": "Parser metadata", - "sr": "Metadata analizator" + "sr": "Metadata analizator", + "ro": "Analizor de metadate", + "ru": "\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", + "eu": "Metadatuak aztertu" }, "metaconv_xmlmetadata": { "no": "XML metadata", @@ -864,8 +1044,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05d1\u05ea\u05d1\u05e0\u05d9\u05ea XML", "zh": "XML\u5143\u4fe1\u606f", "ar": "\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0635\u0641\u064a\u0629 \u0628\u0635\u064a\u063a\u0629 XML", + "lv": "XML metadati", "id": "metadata XML", - "sr": "Metapodaci u XML formatu" + "sr": "Metapodaci u XML formatu", + "ro": "Metadate XML", + "ru": "XML \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "eu": "XML metadatuak" }, "metaconv_parse": { "no": "Pars", @@ -892,8 +1076,12 @@ "he": "\u05e0\u05ea\u05d7", "zh": "\u5206\u6790\u5668", "ar": "\u062d\u0644\u0644", + "lv": "Pars\u0113t", "id": "Parse", - "sr": "Analiziraj" + "sr": "Analiziraj", + "ro": "Analizeaz\u0103", + "ru": "\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437", + "eu": "Aztertu" }, "metaconv_converted": { "no": "Konvertert metadata", @@ -920,8 +1108,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05de\u05d5\u05de\u05e8", "zh": "\u8f6c\u6362\u8fc7\u7684\u5143\u4fe1\u606f", "ar": "\u0628\u064a\u0627\u0646\u0627\u062a \u0648\u0635\u0641\u064a\u0629 \u0645\u062d\u0648\u0644\u0629", + "lv": "Konvert\u0113tie metadati", "id": "Metadata yang telah dikonvesi", - "sr": "Konvertovani metapodaci" + "sr": "Konvertovani metapodaci", + "ro": "Metadate convertite", + "ru": "\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435", + "eu": "Bihurtutako metadatuak" }, "metadata_saml20-sp": { "no": "SAML 2.0 SP metadata", @@ -948,8 +1140,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05e9 \u05de\u05e1\u05d5\u05d2 SAML 2.0 ", "zh": "SAML 2.0 SP \u5143\u4fe1\u606f", "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644 SAML 2.0 SP", + "lv": "SAML 2.0 SP metadati", "id": "Metadata SAML 2.0 SP", - "sr": "SAML 2.0 SP metapodaci" + "sr": "SAML 2.0 SP metapodaci", + "ro": "Metadate furnizor de servicii (SP) SAML 2.0", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 SAML 2.0 SP", + "eu": "SAML 2.0 SP Metadatuak" }, "metadata_saml20-idp": { "no": "SAML 2.0 IdP metadata", @@ -976,8 +1172,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05d6 \u05de\u05e1\u05d5\u05d2 SAML 2.0 ", "zh": "SAML 2.0 IdP \u5143\u4fe1\u606f", "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644 SAML 2.0 IdP", + "lv": "SAML 2.0 IdP metadati", "id": "Metadata SAML 2.0 IdP", - "sr": "SAML 2.0 IdP metapodaci" + "sr": "SAML 2.0 IdP metapodaci", + "ro": "Metadate furnizor de identitate (IdP) SAML 2.0", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 SAML 2.0 IdP", + "eu": "SAML 2.0 IdP Metadatuak" }, "metadata_shib13-sp": { "no": "Shib 1.3 SP metadata", @@ -1004,8 +1204,12 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05e9 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 SP \u5143\u4fe1\u606f", "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644Shib 1.3 SP", + "lv": "Shib 1.3 SP metadati", "id": "Metadata Shib 1.3 SP", - "sr": "Shib 1.3 SP metapodaci" + "sr": "Shib 1.3 SP metapodaci", + "ro": "Metadate furnizor de servicii (SP) Shib 1.3", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 Shib 1.3 SP", + "eu": "Shib 1.3 SP Metadatuak" }, "metadata_shib13-idp": { "no": "Shib 1.3 IdP metadata", @@ -1032,10 +1236,76 @@ "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05d6 \u05de\u05e1\u05d5\u05d2 Shib 1.3", "zh": "Shib 1.3 IdP \u5143\u4fe1\u606f", "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644Shib 1.3 IdP", + "lv": "Shib 1.3 IdP metadati", "id": "Metadata Shib 1.3 IdP", - "sr": "Shib 1.3 IdP metapodaci" + "sr": "Shib 1.3 IdP metapodaci", + "ro": "Metadate furnizor de identitate (IdP) Shib 1.3", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 Shib 1.3 IdP", + "eu": "Shib 1.3 IdP Metadatuak" }, - "metadata_intro": { + "metadata_adfs-sp": { + "no": "ADFS SP metadata", + "nn": "ADFS SP Metadata", + "sv": "ADFS SP Metadata", + "es": "Metadatos SP ADFS", + "nl": "ADFS SP Metadata", + "sl": "ADFS SP Metapodatki", + "da": "Shibboleth 1.3 tjenesteudbyders metadata", + "hr": "ADFS metapodaci o davatelju usluge", + "hu": "ADFS SP Metaadatok", + "pt-br": "ADFS SP Metadata", + "pt": "Metadados ADFS SP", + "pl": "ADFS SP - Metadane", + "cs": "ADFS SP Metadata", + "tr": "ADFS SP \u00dcstveri (Metadata)", + "de": "ADFS SP Metadaten", + "fr": "M\u00e9tadonn\u00e9es de SP ADFS", + "it": "Metadati ADFS SP", + "ja": "ADFS SP\u30e1\u30bf\u30c7\u30fc\u30bf", + "lt": "ADFS SP Metaduomenys", + "zh-tw": "ADFS SP \u8a6e\u91cb\u8cc7\u6599", + "et": "ADFS SP metaandmed", + "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05e9 \u05de\u05e1\u05d5\u05d2 ADFS", + "zh": "ADFS SP \u5143\u4fe1\u606f", + "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644ADFS SP", + "lv": "ADFS SP metadati", + "id": "Metadata ADFS SP", + "sr": "ADFS SP metapodaci", + "ro": "Metadate furnizor de servicii (SP) ADFS", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 ADFS SP" + }, + "metadata_adfs-idp": { + "no": "ADFS IdP metadata", + "nn": "ADFS IdP Metadata", + "sv": "ADFS IdP Metadata", + "es": "Metadatos IdP ADFS", + "nl": "ADFS IdP Metadata", + "sl": "ADFS IdP Metapodatki", + "da": "ADFS identitetsudbyders metadata", + "hr": "ADFS metapodaci o autentifikacijskom servisu", + "hu": "ADFS IdP Metaadatok", + "pt-br": "ADFS IdP Metadata", + "pt": "Metadados ADFS IdP", + "pl": "ADFS IdP - Metadane", + "cs": "ADFS IdP Metadata", + "tr": "ADFS IdP \u00dcstveri (Metadata)", + "de": "ADFS IdP Metadaten", + "fr": "M\u00e9tadonn\u00e9es d'IdP ADFS", + "it": "Metadati ADFS IdP", + "ja": "ADFS IdP\u30e1\u30bf\u30c7\u30fc\u30bf", + "lt": "ADFS IdP Metaduomenys", + "zh-tw": "ADFS IdP \u8a6e\u91cb\u8cc7\u6599", + "et": "ADFS IdP metaandmed", + "he": "\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9\u05dc \u05e1\u05d6 \u05de\u05e1\u05d5\u05d2 ADFS ", + "zh": "ADFS IdP \u5143\u4fe1\u606f", + "ar": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0644 ADFS IdP", + "lv": "ADFS IdP metadati", + "id": "Metadata ADFS IdP", + "sr": "ADFS IdP metapodaci", + "ro": "Metadate furnizor de identitate (IdP) ADFS", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 ADFS IdP" + }, + "metadata_intro": { "no": "Her er metadata som simpleSAMLphp har generert for deg. Du m\u00e5 utveksle metadata med de partene du stoler p\u00e5 for \u00e5 sette opp en f\u00f8derasjon.", "nn": "Her er metadata generert av simpleSAMLphp for deg. Du kan senda dette metadata-dokumentet til dine partnarar, slik at de kan setja opp ein tillitsf\u00f8derasjon.", "sv": "simpleSAMLphp har har genererat f\u00f6ljande metadata. F\u00f6r att s\u00e4tta upp en betrodd federation kan du skicka metadata till de parter du har f\u00f6rtroende f\u00f6r.", @@ -1060,8 +1330,12 @@ "he": "\u05d4\u05e0\u05d4 \u05d4\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05e9 simpleSAMLphp \u05d9\u05d9\u05e6\u05e8 \u05e2\u05d1\u05d5\u05e8\u05da. \u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05de\u05e1\u05de\u05da \u05d4\u05de\u05d8\u05d0-\u05de\u05d9\u05d3\u05e2 \u05dc\u05e9\u05d5\u05ea\u05e4\u05d9\u05dd \u05de\u05d4\u05d9\u05de\u05e0\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05d0\u05d9\u05d7\u05d5\u05d3 \u05de\u05d0\u05d5\u05d1\u05d8\u05d7. ", "zh": "\u8fd9\u91cc\u662fsimpleSAMLphp\u4e3a\u4f60\u751f\u6210\u7684\u5143\u4fe1\u606f\uff0c\u4f60\u5e94\u8be5\u53d1\u9001\u8fd9\u4e2a\u5143\u4fe1\u606f\u6587\u6863\u7ed9\u4f60\u7684\u4fe1\u4efb\u7684\u5408\u4f5c\u4f19\u4f34\u4ee5\u5efa\u7acb\u4fe1\u4efb\u7684\u8054\u76df", "ar": "\u0647\u0630\u0647 \u0647\u064a \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0627\u0644\u0645\u062c\u0647\u0632\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 SAMLphp. \u0644\u0644\u062a\u062c\u0647\u064a\u0632 \u0644\u0641\u062f\u0631\u0627\u0644\u064a\u0629 \u0645\u0648\u062b\u0648\u0642 \u0628\u0647\u0627 \u0642\u0645 \u0628\u0625\u0631\u0633\u0627\u0644 \u0647\u0630\u0647 \u0627\u0644\u0648\u062b\u064a\u0642\u0629 \u0644\u0634\u0631\u0643\u0627\u0621 \u0645\u0648\u062b\u0648\u0642 \u0628\u0647\u0645", + "lv": "\u0160eit ir simpleSAMLphp \u0123ener\u0113tie metadati. J\u016bs varat tos s\u016bt\u012bt partneriem, lai izveidotu uzticamu feder\u0101ciju.", "id": "Berikut ini adalah simpleSAMLphp metadata yang telah digenerate untuk Anda. Anda dapat mengirim dokumen metadata ini kepada rekan yang dipercayai untuk mensetup federasi terpercaya.", - "sr": "Ovo su metapodaci koje je simpleSAMLphp izgenerisao za vas. Te metapodatke mo\u017eete poslati davaocima servisa ili davaocima identiteta u koje imate poverenja i sa kojima \u017eelite uspostaviti federaciju." + "sr": "Ovo su metapodaci koje je simpleSAMLphp izgenerisao za vas. Te metapodatke mo\u017eete poslati davaocima servisa ili davaocima identiteta u koje imate poverenja i sa kojima \u017eelite uspostaviti federaciju.", + "ro": "Acestea sunt metadate generate de simpleSAMLphp. Metadatele pot fi trimise c\u0103tre parteneri de \u00eencredere pentru a configura o federa\u021bie de \u00eencredere.", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u0430\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e simpleSAMLphp. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0435\u0434\u0435\u0440\u0430\u0446\u0438\u0438.", + "eu": "Hona hemen simpleSAMLphp-ak zuretzat sortu dituen metadatuak. Metadatuen dokumentu hau konfidantzazko zure kideei bidal diezaiekezu federazio bat konfiguratzeko." }, "metadata_xmlurl": { "no": "Du kan n\u00e5 metadata i XML-format p\u00e5 en dedikert URL<\/a>:", @@ -1088,14 +1362,18 @@ "he": "\u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05e7\u05d1\u05dc \u05d0\u05ea \u05d4\u05de\u05d8\u05d0 \u05de\u05d9\u05d3\u05e2 \u05d1\u05db\u05ea\u05d5\u05d1\u05ea \u05e0\u05e4\u05e8\u05d3\u05ea<\/a>:", "zh": "\u4f60\u53ef\u4ee5\u5728 \u83b7\u53d6\u5143\u4fe1\u606fXML<\/a>", "ar": "\u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u064a \u0628\u064a\u0627\u0646\u0627\u062a\u0643 \u0627\u0644\u0648\u0635\u0641\u064a\u0629 \u0628\u0645\u0644\u0641 xml \u0628 URL \u0645\u062a\u062e\u0635\u0635 \u0628\u0625\u062f\u062e\u0627\u0644", + "lv": "J\u016bs varat sa\u0146emt metadatu xml \u0161aj\u0101 URL<\/a>:", "id": "Anda dapat mendapatkan xml metadata pada URL tersendiri<\/a>:", - "sr": "Metapodaci su dostupni na ovoj adresi<\/a>:" + "sr": "Metapodaci su dostupni na ovoj adresi<\/a>:", + "ro": "Pute\u021bi accesa metadatele xml de la un URL dedicat<\/a>:", + "ru": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c xml \u0444\u0430\u0439\u043b \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 URL<\/a>:", + "eu": "xml metadatuekin URL bat<\/a> eskura dezakezu:" }, "metadata_simplesamlformat": { "no": "I simpleSAMLphp format - bruk denne dersom du benytter simpleSAMLphp i den andre enden:", "nn": "P\u00e5 flat fil for simpleSAMLphp. Bruk denne dersom du bruker simpleSAMLphp p\u00e5 andre sida:", "sv": "I filformatet f\u00f6r simpleSAML, anv\u00e4nd detta detta format om simpleSAMLphp anv\u00e4nds i mottagende sida:", - "es": "en un fichero de formato simpleSAMLphp - utilice esta opci\u00f3n si est\u00e1 usando una entidad simpleSAMLphp en el otro extremo:", + "es": "En un fichero de formato simpleSAMLphp - utilice esta opci\u00f3n si est\u00e1 usando una entidad simpleSAMLphp en el otro extremo:", "nl": "In simpleSAMLphp flat file formaat - gebruik dit wanneer uw federatiepartner ook simpleSAMLphp gebruikt", "sl": "V simpleSAMLphp \"flat file\" formatu - ta format uporabite, \u010de uporabljate simpleSAMLphp entiteto na drugi strani:", "da": "I simpleSAMLphp flat-file format - brug dette hvis du ogs\u00e5 bruger simpleSAMLphp i den anden ende;", @@ -1115,8 +1393,12 @@ "he": "\u05d1\u05ea\u05d1\u05e0\u05d9\u05ea \u05e7\u05d5\u05d1\u05e5 simpleSAMLphp \u05e9\u05d8\u05d5\u05d7 - \u05dc\u05de\u05e7\u05e8\u05d9\u05dd \u05d1\u05d4\u05dd \u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05de\u05e9 \u05d1\u05d9\u05e9\u05d5\u05ea simpleSAMLphp \u05d1\u05e6\u05d3 \u05d4\u05e9\u05e0\u05d9: ", "zh": "\u5982\u679c\u4f60\u60f3\u5728\u5176\u4ed6\u7f51\u7ad9\u4f7f\u7528\u7684simpleSAMLphp\uff0c\u90a3\u4e48\u4f60\u5e94\u8be5\u4f7f\u7528simpleSAMLphp\u6241\u5e73\u7684\u6587\u4ef6\u683c\u5f0f", "ar": "\u0628\u0635\u064a\u063a\u0629 simpleSAMLphp- \u0627\u0633\u062a\u062e\u062f\u0645 \u0647\u0630\u0647 \u0627\u0644\u0635\u064a\u063a\u0629 \u0627\u0646 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 \u0648\u062d\u062f\u0629 simpleSAMLphp \u0628\u0627\u0644\u0627\u062a\u062c\u0627\u0647 \u0627\u0644\u0627\u062e\u0631 \u0627\u064a\u0636\u0627\u064b", + "lv": "SimpleSAMLphp parasta faila form\u0101t\u0101 - lietojiet \u0161o, ja izmantojat simpleSAMLphp ent\u012btiju otr\u0101 gal\u0101:", "id": "Dalam format file biasa simpleSAMLphp - gunakan ini jika Anda menggunakan entiti simpleSAMLphp pada sisi lain:", - "sr": "U simpleSAMLphp formatu - koristite ovu opciju ako se na drugoj strani tako\u0111e nalazi simpleSAMLphp entitet:" + "sr": "U simpleSAMLphp formatu - koristite ovu opciju ako se na drugoj strani tako\u0111e nalazi simpleSAMLphp entitet:", + "ro": "\u00cen format fi\u0219ier simplu simpleSAMLphp - utiliza\u021bi aceast\u0103 variant\u0103 dac\u0103 \u00een cap\u0103tul cel\u0103lalt folosi\u021bi o entitate simpleSAMLphp:", + "ru": "\u0424\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e simpleSAMLphp \u0444\u0430\u0439\u043b\u0430", + "eu": "simpleSAMLphp formatuko fitxategi batean - beste muturrean simpleSAMLphp entitate bat erabiltzen ariz gero, erabil ezazu aukera hau:" }, "debug_sending_message_title": { "no": "Sender melding", @@ -1132,6 +1414,7 @@ "pt": "A enviar a mensagem", "pl": "Wysy\u0142anie wiadomo\u015bci", "cs": "Pos\u00edl\u00e1m zpr\u00e1vu", + "eu": "Mezua bidaltzen", "tr": "Mesaj g\u00f6nderiliyor", "de": "Sende Nachricht", "fr": "Envoi du message", @@ -1143,8 +1426,11 @@ "he": "\u05e9\u05d5\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4", "zh": "\u6b63\u5728\u53d1\u9001\u6d88\u606f", "ar": "\u0627\u0631\u0633\u0644 \u0631\u0633\u0627\u0644\u0629", + "lv": "Zi\u0146as s\u016bt\u012b\u0161ana", "id": "Mengirimpan pesan", - "sr": "\u0160aljem poruku" + "sr": "\u0160aljem poruku", + "ro": "Se trimite mesajul", + "ru": "\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f" }, "debug_sending_message_text_button": { "no": "Du er i ferd med \u00e5 sende en melding. Trykk knappen \u00abSend melding\u00bb for \u00e5 fortsette.", @@ -1159,6 +1445,7 @@ "pt-br": "Voc\u00ea est\u00e1 prestes a enviar uma mensagem. Aperte o bot\u00e3o enviar mensagem para continuar.", "pt": "Est\u00e1 prestes a enviar uma mensagem. Carregue no bot\u00e3o para continuar.", "cs": "M\u016f\u017eete poslat zpr\u00e1vu. Po\u017eijte tla\u010d\u00edtko k pokra\u010dov\u00e1n\u00ed.", + "eu": "Mezu bat bidaltzeari ekingo zaio. Saka ezazu \"Mezua bidali\" botoia jarraitzeko.", "tr": "Mesaj g\u00f6ndermek \u00fczeresiniz. Devam etmek i\u00e7in mesaj g\u00f6nder butonuna t\u0131klay\u0131n.", "de": "Sie sind dabei eine Nachricht zu senden. Klicken Sie auf den Nachricht senden Knopf um fortzufahren.", "fr": "Vous allez envoyer un message. Cliquez sur le bouton d'envoi pour continuer.", @@ -1170,8 +1457,11 @@ "he": "\u05d0\u05ea\u05d4 \u05e2\u05d5\u05de\u05d3 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4. \u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05e9\u05dc\u05d9\u05d7\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05de\u05e9\u05d9\u05da.", "zh": "\u4f60\u51c6\u5907\u53d1\u9001\u4e00\u4e2a\u6d88\u606f\uff0c\u8bf7\u70b9\u51fb\u63d0\u4ea4\u6309\u94ae\u4ee5\u7ee7\u7eed", "ar": "\u0627\u0646\u062a \u0639\u0644\u064a \u0648\u0634\u0643 \u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629. \u0627\u0636\u063a\u0637 \u0639\u0644\u064a \u0627\u0644\u0632\u0631 \u0644\u0644\u0645\u0648\u0627\u0635\u0644\u0629", + "lv": "J\u016bs gatavojaties s\u016bt\u012bt zi\u0146u. Spiediet pogu S\u016bt\u012bt zi\u0146u.", "id": "Anda baru saja akan mengirim sebuah pesan. Tekan tombol submit pesan untuk melanjutkan.", - "sr": "Kliknite na dugme \"Po\u0161alji poruku\" da biste poslali poruku." + "sr": "Kliknite na dugme \"Po\u0161alji poruku\" da biste poslali poruku.", + "ro": "Mesajul este preg\u0103tit pentru a fi trimis. Ap\u0103sa\u021bi butonul de trimitere pentru a continua.", + "ru": "\u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f." }, "debug_disable_debug_mode": { "no": "Do kan skru av debug modus i den globale simpleSAMLphp konfigurasjonsfila config\/config.php<\/tt>.", @@ -1198,8 +1488,12 @@ "he": "\u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05db\u05d1\u05d5\u05ea \u05d0\u05ea \u05de\u05e6\u05d1 \u05d1\u05d3\u05d9\u05e7\u05ea \u05d4\u05d1\u05d0\u05d2\u05d9\u05dd \u05d1\u05e7\u05d5\u05d1\u05e5 \u05d1\u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05d2\u05dc\u05d5\u05d1\u05dc\u05d9 \u05e9\u05dc simpleSAMLphp config\/config.php<\/tt>.", "zh": "\u4f60\u53ef\u4ee5\u5173\u95ed\u8c03\u8bd5\u6a21\u5f0f\uff0c\u5728simpleSAMLphp\u5168\u5c40\u914d\u7f6e\u6587\u4ef6config\/config.php<\/tt>\u4e2d", "ar": "\u064a\u0645\u0643\u0646\u0643 \u0625\u063a\u0644\u0627\u0642 \u062d\u0627\u0644\u0629 \u0627\u0644\u062a\u0635\u062d\u064a\u062d \u0628\u0645\u0644\u0641 \u062a\u0631\u062a\u064a\u0628 simpleSAMLphpconfig\/config.php<\/tt>", + "lv": "J\u016bs varat izsl\u0113gt atk\u013c\u016bdo\u0161anas re\u017e\u012bmu glob\u0101laj\u0101 simpleSAMLphp konfigur\u0101cijas fail\u0101 config\/config.php<\/tt>.", "id": "Anda dapat menonaktifkan mode debuh pada file konfigurasi global simpleSAMLhphp config\/config.php<\/tt>.", - "sr": "Debug mod mo\u017eete isklju\u010diti u glavnom simpleSAMLphp konfiguracionom fajlu config\/config.php<\/tt>. " + "sr": "Debug mod mo\u017eete isklju\u010diti u glavnom simpleSAMLphp konfiguracionom fajlu config\/config.php<\/tt>. ", + "ro": "Se poate opri modul de depanare \u00een fi\u0219ierul de configurare simpleSAMLphp config\/config.php<\/tt>.", + "ru": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 global simpleSAMLphp -config\/config.php<\/tt>. ", + "eu": "Arazketa modua desaktibatu daiteke simpleSAMLphp config\/config.php<\/tt> konfigurazio orokorreko fitxategian." }, "metaover_group_metadata.saml20-sp-hosted": { "no": "SAML 2.0 tjenesteleverand\u00f8r (intern)", @@ -1226,8 +1520,12 @@ "he": "\u05e1\u05e4\u05e7 \u05e9\u05d9\u05e8\u05d5\u05ea \u05de\u05e7\u05d5\u05de\u05d9 \u05de\u05e1\u05d5\u05d2 SAML 2.0", "zh": "SAML 2.0 \u670d\u52a1\u63d0\u4f9b\u8005\uff08\u672c\u5730\uff09", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 SAML 2.0 (\u0627\u0644\u0645\u0633\u062a\u0636\u0627\u0641)", + "lv": "SAML 2.0 servisa pieg\u0101d\u0101t\u0101js (host\u0113ts)", "id": "Service Provider SAML 2.0 (Hosted)", - "sr": "SAML 2.0 Davalac Servisa (lokalni)" + "sr": "SAML 2.0 Davalac Servisa (lokalni)", + "ro": "Furnizor de servicii SAML 2.0 (g\u0103zduit)", + "ru": "\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 SAML 2.0 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435)", + "eu": "SAML 2.0 Zerbitzu hornitzailea (Anfitrioia)" }, "cfg_check_notices": { "no": "Notiser", @@ -1255,8 +1553,11 @@ "ru": "\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f", "zh": "\u901a\u544a", "ar": "\u0645\u0644\u062d\u0648\u0638\u0627\u062a", + "lv": "Br\u012bdin\u0101jumi", "id": "Pemberitahuan", - "sr": "Napomene" + "sr": "Napomene", + "ro": "Note\/Observa\u021bii", + "eu": "Oharrak" }, "metadata_cert": { "nl": "Certificaten", @@ -1271,10 +1572,18 @@ "hu": "Tan\u00fas\u00edtv\u00e1nyok.", "ar": "\u0627\u0644\u0634\u0647\u0627\u062f\u0627\u062a", "hr": "Certifikati", + "lv": "Sertifik\u0101ti", "id": "Sertifikat", "sr": "Sertifikati", "nn": "Sertifikat", - "fr": "Certificats" + "fr": "Certificats", + "cs": "Certifik\u00e1ty", + "it": "Certificati", + "es": "Certificados", + "ro": "Certificate", + "ru": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b", + "no": "Sertifikater", + "eu": "Ziurtagiriak" }, "metadata_cert_intro": { "nl": "Download de X509-certificaten in PEM-formaat.", @@ -1289,9 +1598,17 @@ "hu": "PEM form\u00e1tum\u00fa X509 tan\u00fas\u00edtv\u00e1ny let\u00f6lt\u00e9se.", "ar": "\u062d\u0645\u0644 \u0634\u0647\u0627\u062f\u0627\u062a X509 \u0643\u0645\u0644\u0641\u0627\u062a \u0628\u062a\u0631\u0645\u064a\u0632 PEM", "hr": "Preuzmite X509 certifikate u PEM formatu.", + "lv": "Lejupiel\u0101d\u0113t X509 sertifik\u0101tus k\u0101 PEM-kod\u0113tus failus.", "id": "Download sertifikat X509 sebagai file dikodekan-PEM.", "sr": "Preuzmite X509 sertifikate u PEM formatu.", "nn": "Last ned X509-sertifikat som PEM-koda filer", - "fr": "T\u00e9l\u00e9charger les certificats X509 en tant que fichiers encod\u00e9s PEM." + "fr": "T\u00e9l\u00e9charger les certificats X509 en tant que fichiers encod\u00e9s PEM.", + "cs": "St\u00e1hn\u011bte certifik\u00e1t X509 jako PEM-encoded soubor", + "it": "Scarica i certificati X509 come file PEM-encoded", + "es": "Descargar los certificados X509 en formato PEM.", + "ro": "Desc\u0103rca\u021bi certificatele X509 ca fi\u0219iere PEM.", + "ru": "\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b X509 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PEM \u0444\u0430\u0439\u043b\u043e\u0432.", + "no": "Last ned X509-sertifikatene som PEM-filer.", + "eu": "X509 ziurtagiriak PEM formatuan deskargatu." } } diff --git a/inc/simplesamlphp/dictionaries/attributes.definition.json b/inc/simplesamlphp/dictionaries/attributes.definition.json index 7728eaf..27d79a2 100644 --- a/inc/simplesamlphp/dictionaries/attributes.definition.json +++ b/inc/simplesamlphp/dictionaries/attributes.definition.json @@ -20,6 +20,9 @@ "attribute_mail": { "en": "Mail" }, + "attribute_ismemberof": { + "en": "Group membership" + }, "attribute_mobile": { "en": "Mobile" }, diff --git a/inc/simplesamlphp/dictionaries/attributes.translation.json b/inc/simplesamlphp/dictionaries/attributes.translation.json index a4226c0..2daeca4 100644 --- a/inc/simplesamlphp/dictionaries/attributes.translation.json +++ b/inc/simplesamlphp/dictionaries/attributes.translation.json @@ -10,7 +10,7 @@ "lb": "Zesummenschloss", "sl": "Vloga uporabnika", "da": "Brugerens tilknytning til hjemmeorganisationen", - "se": "Du doaibma organisašuvnnas", + "se": "Du doaibma organisa\u0161uvnnas", "hr": "Povezanost s ustanovom", "hu": "Viszony", "fi": "Suhde organisaatioon", @@ -29,7 +29,10 @@ "zh": "\u8054\u7edc\u65b9\u5f0f", "sr": "Povezanost sa institucijom", "ar": "\u062c\u0647\u0629 \u0627\u0644\u0639\u0645\u0644", - "id": "Afiliasi" + "id": "Afiliasi", + "lv": "Pieder\u012bba", + "ro": "Afiliere", + "eu": "Afiliazioa" }, "attribute_title": { "no": "Tittel", @@ -49,6 +52,7 @@ "pt": "T\u00edtulo", "pl": "Tytu\u0142 (Title)", "cs": "Nadpis", + "eu": "Tratamendua", "tr": "Ba\u015fl\u0131k", "it": "Titolo", "lt": "Pavadinimas", @@ -60,7 +64,9 @@ "zh": "\u6807\u9898", "sr": "Zvanje", "ar": "\u0627\u0644\u0644\u0642\u0628", - "id": "Gelar" + "id": "Gelar", + "lv": "Amats", + "ro": "Titlu\/titulatur\u0103" }, "attribute_uid": { "no": "Bruker-ID", @@ -81,6 +87,7 @@ "pt": "Identifica\u00e7\u00e3o de utilizador", "pl": "ID u\u017cytkownika (User ID)", "cs": "Identifik\u00e1tor (UID)", + "eu": "Erabiltzaile ID", "tr": "Kullan\u0131c\u0131 ID", "it": "Identificativo utente", "lt": "Naudotojo ID", @@ -92,7 +99,9 @@ "zh": "\u7528\u6237ID", "sr": "Korisni\u010dko ime", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641\u064a \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645", - "id": "User ID" + "id": "User ID", + "lv": "Lietot\u0101ja ID", + "ro": "ID utilizator" }, "attribute_sn": { "no": "Etternavn", @@ -113,6 +122,7 @@ "pt": "Nome de fam\u00edlia", "pl": "Nazwisko (Surname)", "cs": "P\u0159\u00edjmen\u00ed", + "eu": "Abizenak", "tr": "Soyad\u0131", "it": "Cognome", "lt": "Pavard\u0117", @@ -124,7 +134,9 @@ "zh": "\u59d3", "sr": "Prezime", "ar": "\u0627\u0633\u0645 \u0627\u0644\u0639\u0627\u0626\u0644\u0647", - "id": "Nama Keluaga" + "id": "Nama Keluaga", + "lv": "Uzv\u0101rds", + "ro": "Nume de familie" }, "attribute_givenname": { "no": "Fornavn", @@ -156,7 +168,10 @@ "zh": "\u540d", "sr": "Ime", "ar": "\u0627\u0644\u0627\u0633\u0645", - "id": "Nama" + "id": "Nama", + "lv": "V\u0101rds", + "ro": "Prenume", + "eu": "Izena" }, "attribute_cn": { "no": "Fullt navn", @@ -188,7 +203,10 @@ "zh": "\u5e38\u7528\u540d\u5b57", "sr": "Ime i Prezime", "ar": "\u0623\u0633\u0645\u0627\u0621 \u0627\u062e\u0631\u064a", - "id": "Common Name" + "id": "Common Name", + "lv": "V\u0101rds", + "ro": "Nume comun", + "eu": "Izen arrunta (CN)" }, "attribute_mail": { "no": "E-post", @@ -201,7 +219,7 @@ "lb": "E-mail", "sl": "Elektronski naslov", "da": "Emailadresse", - "se": "Elektrovnnalaš poastačijuhus", + "se": "Elektrovnnala\u0161 poasta\u010dijuhus", "hr": "Elektroni\u010dka adresa", "hu": "E-mail", "fi": "S\u00e4hk\u00f6posti", @@ -209,6 +227,7 @@ "pt": "E-mail", "pl": "E-mail", "cs": "Email", + "eu": "Posta", "tr": "Posta", "it": "Mail", "lt": "El.pa\u0161tas", @@ -220,7 +239,9 @@ "zh": "\u90ae\u7bb1", "sr": "Elektronska adresa", "ar": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064a\u062f\u064a", - "id": "Mail" + "id": "Mail", + "lv": "Pasts", + "ro": "Mail" }, "attribute_mobile": { "no": "Mobiltelefon", @@ -233,7 +254,7 @@ "lb": "GSM Nummer", "sl": "Mobilni telefon", "da": "Telefonnummer (mobil)", - "se": "Mátketelefovdna", + "se": "M\u00e1tketelefovdna", "hr": "Broj mobilnog telefona", "hu": "Mobil", "fi": "K\u00e4nnykk\u00e4", @@ -241,6 +262,7 @@ "pt": "Telem\u00f3vel", "pl": "Telefon kom\u00f3rkowy (Mobile)", "cs": "Mobil", + "eu": "Mugikorra", "tr": "Cep telefonu numaras\u0131", "it": "Cellulare", "lt": "Mobiliojo numeris", @@ -252,7 +274,9 @@ "zh": "\u624b\u673a", "sr": "Broj mobilnog telefona", "ar": "\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0633\u064a\u0627\u0631", - "id": "Handphone" + "id": "Handphone", + "lv": "Mobilais telefons", + "ro": "Mobil" }, "attribute_preferredlanguage": { "no": "Foretrukket spr\u00e5k", @@ -265,7 +289,7 @@ "lb": "Lieblingssprooch", "sl": "\u017delen jezik", "da": "Foretrukket sprog (evt. flere)", - "se": "Vuosttašválljejuvvon giella dehe giellahápmi", + "se": "Vuostta\u0161v\u00e1lljejuvvon giella dehe giellah\u00e1pmi", "hr": "Primarni jezik", "hu": "Els\u0151dleges nyelv", "fi": "Ensisijainen kieli", @@ -284,7 +308,10 @@ "zh": "\u9996\u9009\u8bed\u8a00", "sr": "Preferirani jezik", "ar": "\u0627\u0644\u0644\u063a\u0629 \u0627\u0644\u0645\u0641\u0636\u0644\u0629", - "id": "Pilihan Bahasa" + "id": "Pilihan Bahasa", + "lv": "V\u0113lam\u0101 valoda", + "ro": "Limba preferat\u0103", + "eu": "Hizkuntza lehenetsia" }, "attribute_noredupersonnin": { "no": "F\u00f8dselsnummer", @@ -316,7 +343,10 @@ "zh": "\u8eab\u4efd\u8bc1\u53f7\u7801", "sr": "Jedinstveni brojni identifikator osobe", "ar": "\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0639\u0631\u064a\u0641\u064a \u0627\u0644\u0645\u0639\u064a\u0646 \u0645\u0646 \u0642\u0628\u0644 \u0627\u0644\u0633\u0644\u0637\u0627\u062a \u0627\u0644\u0639\u0627\u0645\u0629 ", - "id": "Identity number assigned by public authorities" + "id": "Identity number assigned by public authorities", + "lv": "Publisko autorit\u0101\u0161u pie\u0161\u0137irtais identit\u0101tes numurs", + "ro": "Num\u0103r de identitate atribuit de autorit\u0103\u021bi publice", + "eu": "Gizarte-segurantzako zenbakia" }, "attribute_schachomeorganization": { "no": "Unik ID for organisasjon", @@ -347,7 +377,10 @@ "zh": "\u9996\u9875\u7ec4\u7ec7\u7684\u57df\u540d", "ar": "\u0627\u0633\u0645 \u0627\u0644\u0646\u0637\u0627\u0642 \u0627\u0644\u0645\u062e\u0635\u0635 \u0644\u0644\u0645\u0646\u0638\u0645\u0629\u0627\u0644\u0627\u0645\\\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0627\u0645 ", "id": "Home organization domain name", - "sr": "Domen mati\u010dne institucije" + "lv": "Organiz\u0101cijas domeins", + "sr": "Domen mati\u010dne institucije", + "ro": "Njumele de domeniu pentru institu\u021bia de origine", + "eu": "Jatorrizko erakundearen domeinu izena" }, "attribute_organisationname": { "no": "Navn p\u00e5 organisasjon", @@ -360,7 +393,7 @@ "lb": "Organisatiounsnumm", "sl": "Ime organizacije", "da": "Hjemmeorganisationens kaldenavn", - "se": "Organisašuvdna", + "se": "Organisa\u0161uvdna", "hr": "Naziv ustanove", "hu": "Szervezet neve", "fi": "Organisaation nimi", @@ -368,6 +401,7 @@ "pt": "Nome da Organiza\u00e7\u00e3o", "pl": "Nazwa organizacji (Organization name)", "cs": "Jm\u00e9no organizace", + "eu": "Erakundearen izena", "tr": "Kurulu\u015f ad\u0131", "it": "Nome dell'organizzazione", "lt": "Organizacijos pavadinimas", @@ -379,7 +413,9 @@ "zh": "\u7ec4\u7ec7\u540d\u79f0", "sr": "Naziv mati\u010dne institucije", "ar": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0646\u0638\u0645\u0629\u0627\u0644\u0627\u0645\\\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0627\u0645", - "id": "Organization name" + "id": "Organization name", + "lv": "Organiz\u0101cijas nosaukums", + "ro": "Denumirea institu\u021biei" }, "attribute_edupersonentitlement": { "no": "Rettighet", @@ -392,7 +428,7 @@ "lb": "Berechtegung", "sl": "Upravi\u010denost do storitve", "da": "Specifik rolle i forhold til tjenesten", - "se": "URI mii čilge dihto vuoigatvuođa dihto ressurssaide", + "se": "URI mii \u010dilge dihto vuoigatvuo\u0111a dihto ressurssaide", "hr": "Pripadnost grupi", "hu": "Ezekre a szolg\u00e1ltat\u00e1sokra jogosult", "fi": "Organisaationoikeudet", @@ -411,7 +447,10 @@ "zh": "\u5173\u4e8e\u670d\u52a1\u7684\u6743\u5229", "sr": "Prava i privilegije korisnika na sistemu", "ar": "\u0627\u0633\u062a\u062d\u0642\u0627\u0642\u0627\u062a \u0627\u0644\u062e\u062f\u0645\u0629", - "id": "Hak mengenai layanan ini" + "lv": "Pilnvaras attiec\u012bb\u0101 uz servisu", + "id": "Hak mengenai layanan ini", + "ro": "Drepturi relativ la acest serviciu", + "eu": "Zerbitzuari dagokion eskubidea" }, "attribute_edupersonscopedaffiliation": { "no": "Gruppetilh\u00f8righet", @@ -424,7 +463,7 @@ "lb": "Gruppen Zougeh\u00e9iregket", "sl": "Vloga v organizaciji", "da": "Gruppemedlemskab", - "se": "Rolla diehto organisašuvnnas, dehe dihto domenas.", + "se": "Rolla diehto organisa\u0161uvnnas, dehe dihto domenas.", "hr": "Povezanost s mati\u010dnom ustanovom", "hu": "Saj\u00e1t int\u00e9zm\u00e9nyhez val\u00f3 viszony", "fi": "Henkil\u00f6n rooli kotiorganisaatiossa", @@ -443,7 +482,10 @@ "zh": "\u5bb6\u5ead\u8054\u7edc\u5730\u5740", "sr": "Povezanost sa institucijom sa domenom", "ar": "\u0627\u0644\u0648\u0636\u0639 \u0623\u0648 \u0627\u0644\u0648\u0638\u064a\u0641\u0629 \u0628\u0627\u0644\u0645\u0646\u0638\u0645\u0629\u0627\u0644\u0627\u0645\\\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0627\u0645", - "id": "Afiliasi di organisasi asal" + "lv": "Amats organiz\u0101cij\u0101", + "id": "Afiliasi di organisasi asal", + "ro": "Afiliere \u00een cadrul institu\u021biei de origine", + "eu": "Afiliazioa jatorrizko erakundean" }, "attribute_edupersontargetedid": { "no": "Persistent anonym ID", @@ -474,7 +516,10 @@ "sr": "Trajni anonimni identifikator", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0639\u0627\u0631 ", "pl": "Trwa\u0142y anonimowy identyfikator", - "id": "Persistent pseudonymous ID" + "lv": "Past\u0101v\u012bgs pseidon\u012bma ID", + "id": "Persistent pseudonymous ID", + "ro": "ID pseudonim persistent", + "eu": "Goitizen ID etengabea" }, "attribute_edupersonprincipalname": { "no": "Personlig ID hos organisasjonen", @@ -506,7 +551,10 @@ "sr": "Jedinstveni identifikator osobe", "ar": "\u0623\u0644\u0627\u0633\u0645 \u0628\u0627\u0644\u0645\u0646\u0638\u0645\u0629 \u0627\u0644\u0627\u0645\\\u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0627\u0645 ", "pl": "G\u0142\u00f3wna nazwa u\u017cytkownika w instytucji macierzystej", - "id": "Nama kepala pada organisasi asal" + "lv": "Priek\u0161nieka v\u0101rds", + "id": "Nama kepala pada organisasi asal", + "ro": "Numele de identificare a persoanei la institu\u021bia de origine (de forma nume_utilizator@domeniu.ro)", + "eu": "Jatorrizko erakundean pertsonak duen izen nagusia" }, "attribute_o": { "no": "Navn p\u00e5 organisasjon", @@ -526,6 +574,7 @@ "pt": "Nome da organiza\u00e7\u00e3o", "pl": "Nazwa organizacji (Organization name)", "cs": "Jm\u00e9no organizace", + "eu": "Erakundearen izena", "tr": "Organizasyon ad\u0131", "it": "Nome dell'organizzazione", "lt": "Organizacijos pavadinimas", @@ -537,7 +586,9 @@ "zh": "\u7ec4\u7ec7\u540d\u79f0", "sr": "Naziv mati\u010dne institucije", "ar": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0646\u0638\u0645\u0629", - "id": "Nama organisasi" + "lv": "Organiz\u0101cijas nosaukums", + "id": "Nama organisasi", + "ro": "Denumirea institu\u021biei" }, "attribute_dc": { "no": "Navneledd (DC)", @@ -568,7 +619,10 @@ "zh": "Opened the web browser with tabs saved from the previous session.\u57df\u7ec4\u4ef6\uff08DC\uff09", "sr": "Domenska komponenta (DC)", "ar": "\u0645\u0643\u0648\u0646\u0627\u062a \u0627\u0644\u0646\u0637\u0627\u0642", - "id": "Domain component(DC)" + "lv": "Dom\u0113ns (DC)", + "id": "Domain component(DC)", + "ro": "Componenta de domeniu (DC)", + "eu": "Domeinuaren osagaia (DC)" }, "attribute_displayname": { "no": "Navn som normalt vises", @@ -598,8 +652,11 @@ "ru": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f", "zh": "\u663e\u793a\u540d\u79f0", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 ", + "lv": "Par\u0101d\u0101mais v\u0101rds", "id": "Nama yang ditampilkan", - "sr": "Ime za prikaz" + "sr": "Ime za prikaz", + "ro": "Nume afi\u0219at", + "eu": "Bistaratzeko izena" }, "attribute_facsimiletelephonenumber": { "no": "Faksnummer", @@ -618,6 +675,7 @@ "pt": "N\u00famero de Fax", "pl": "Numer Faksu (Fax number)", "cs": "Fax", + "eu": "Fax-zenbakia", "tr": "Faks numaras\u0131", "fr": "Num\u00e9ro de fax", "it": "Numero di fax", @@ -630,7 +688,9 @@ "zh": "\u4f20\u771f\u53f7\u7801", "sr": "Fax broj", "ar": "\u0631\u0642\u0645 \u0627\u0644\u0641\u0627\u0643\u0633", - "id": "No Fax" + "lv": "Fakss", + "id": "No Fax", + "ro": "Num\u0103r de fax" }, "attribute_homephone": { "no": "Hjemmetelefon", @@ -649,6 +709,7 @@ "pt": "Telefone de resid\u00eancia", "pl": "Telefon domowy (Home telephone)", "cs": "Telefon dom\u016f", + "eu": "Etxeko telefonoa", "tr": "Ev telefonu", "fr": "T\u00e9l\u00e9phone personnel", "it": "Telefono", @@ -661,7 +722,9 @@ "zh": "\u5bb6\u5ead\u7535\u8bdd", "sr": "Ku\u0107ni telefonski broj", "ar": "\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0646\u0632\u0644\u064a", - "id": "Telepon rumah" + "lv": "Telefons", + "id": "Telepon rumah", + "ro": "Telefon acas\u0103" }, "attribute_homepostaladdress": { "no": "Postadresse hjemme", @@ -692,7 +755,10 @@ "zh": "\u5bb6\u5ead\u90ae\u653f\u5730\u5740", "sr": "Ku\u0107na po\u0161tanska adresa", "ar": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064a\u062f\u064a", - "id": "Alamat pos rumah" + "lv": "Pasta adrese", + "id": "Alamat pos rumah", + "ro": "Adresa po\u0219tal\u0103 de acas\u0103", + "eu": "Etxeko helbidea" }, "attribute_jpegphoto": { "no": "JPEG-foto", @@ -711,6 +777,7 @@ "pt": "Foto JPEG", "pl": "Fotografia JPEG", "cs": "Foto JPEG", + "eu": "JPEG argazkia", "tr": "JPEG foto\u011fraf", "fr": "Photo JPEG", "it": "Foto JPEG", @@ -723,7 +790,9 @@ "zh": "JPEG\u56fe\u7247", "sr": "Slika osobe", "ar": "\u0635\u0648\u0631\u0629 (JPEG)", - "id": "Foto JPEG" + "lv": "JPEG fotogr\u0101fija", + "id": "Foto JPEG", + "ro": "Fotografie JPEG" }, "attribute_l": { "no": "Sted", @@ -754,7 +823,10 @@ "zh": "\u4f4d\u7f6e", "sr": "Lokacija(Mesto)", "ar": "\u0627\u0644\u0645\u062d\u0644\u064a\u0629", - "id": "Lokalitas" + "lv": "Atra\u0161an\u0101s vieta", + "id": "Lokalitas", + "ro": "Localitate", + "eu": "Herria" }, "attribute_labeleduri": { "no": "URI med valgfri tilleggskommentar", @@ -785,7 +857,10 @@ "zh": "\u6807\u7b7eURI", "sr": "URI adresa", "ar": "URI \u0623\u0633\u0645 ", - "id": "Berlabel URL" + "lv": "URI nosaukums", + "id": "Berlabel URL", + "ro": "URI etichetat", + "eu": "URI etiketatua" }, "attribute_ou": { "no": "Organisasjonsenhet", @@ -816,7 +891,10 @@ "zh": "\u7ec4\u7ec7\u5355\u4f4d", "sr": "Organizaciona jedinica", "ar": "\u0627\u0644\u0648\u062d\u062f\u0629", - "id": "Organizational unit" + "lv": "Organiz\u0101cijas vien\u012bba", + "id": "Organizational unit", + "ro": "Unitate organiza\u021bional\u0103", + "eu": "Antolamendu-unitatea" }, "attribute_postaladdress": { "no": "Postadresse", @@ -835,6 +913,7 @@ "pt": "Morada", "pl": "Adres pocztowy (Postal address)", "cs": "Po\u0161tovn\u00ed adresa", + "eu": "Posta-helbidea", "tr": "Posta adresi", "fr": "Adresse postale", "it": "Indirizzo postale", @@ -847,7 +926,9 @@ "zh": "\u90ae\u653f\u5730\u5740", "sr": "Po\u0161tanska adresa", "ar": "\u0627\u0644\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0628\u0631\u064a\u062f\u064a \u0644\u0644\u0645\u0646\u0638\u0645\u0629", - "id": "Alamat pos" + "lv": "Pasta adrese", + "id": "Alamat pos", + "ro": "Adresa po\u0219tal\u0103" }, "attribute_postalcode": { "no": "Postnummer", @@ -865,7 +946,8 @@ "pt-br": "CEP", "pt": "C\u00f3digo Postal", "pl": "Kod pocztowy", - "cs": "Po\u0161tovn\u00ed k\u00f3d PSC", + "cs": "Po\u0161tovn\u00ed k\u00f3d PS\u010c", + "eu": "Posta-kodea", "tr": "Posta kodu", "fr": "Code postal", "it": "CAP", @@ -878,7 +960,9 @@ "zh": "\u90ae\u653f\u7f16\u7801", "sr": "Po\u0161tanski broj", "ar": "\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064a\u062f\u064a", - "id": "Kode pos" + "lv": "Pasta kods", + "id": "Kode pos", + "ro": "Cod po\u0219tal" }, "attribute_postofficebox": { "no": "Postboks", @@ -897,6 +981,7 @@ "pt": "Apartado", "pl": "Skrzynka pocztowa (Post office box)", "cs": "Postbox", + "eu": "Posta-bulegoko ontzia", "tr": "Posta kutusu", "fr": "Boite postale", "it": "Casella postale", @@ -909,7 +994,9 @@ "zh": "\u90ae\u653f\u4fe1\u7bb1", "sr": "Broj po\u0161tanskog sandu\u010deta", "ar": "\u0627\u0644\u0635\u0646\u062f\u0648\u0642 \u0627\u0644\u0628\u0631\u064a\u062f\u064a", - "id": "PO Box" + "lv": "Pasta kaste", + "id": "PO Box", + "ro": "Cutie po\u0219tal\u0103" }, "attribute_street": { "no": "Gate", @@ -928,6 +1015,7 @@ "pt": "Rua", "pl": "Ulica (Street)", "cs": "Ulice", + "eu": "Kalea", "tr": "Sokak", "fr": "Rue", "it": "Via", @@ -940,7 +1028,9 @@ "zh": "\u8857\u9053", "sr": "Ulica i broj", "ar": "\u0627\u0644\u0634\u0627\u0631\u0639", - "id": "Jalan" + "lv": "Iela", + "id": "Jalan", + "ro": "Strada" }, "attribute_telephonenumber": { "no": "Telefon", @@ -959,6 +1049,7 @@ "pt": "Telefone", "pl": "Numer telefonu (Telephone number)", "cs": "Telefon", + "eu": "Telefono zenbakia", "tr": "Telefon numaras\u0131", "fr": "Num\u00e9ro de t\u00e9l\u00e9phone", "it": "Numero di telefono", @@ -971,7 +1062,9 @@ "zh": "\u7535\u8bdd\u53f7\u7801", "sr": "Telefonski broj", "ar": "\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641", - "id": "No Telepon" + "lv": "Telefons", + "id": "No Telepon", + "ro": "Num\u0103r de telefon" }, "attribute_eduorghomepageuri": { "no": "Organisasjonens hjemmeside", @@ -1002,7 +1095,10 @@ "zh": "\u7ec4\u7ec7\u7684\u9996\u9875", "sr": "URL adresa institucije", "ar": " \u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u0627\u0644\u0643\u062a\u0631\u0648\u0646\u064a\u0629 \u0644\u0644\u0645\u0646\u0638\u0645\u0629", - "id": "Homepage organisasi" + "lv": "Organiz\u0101cijas m\u0101jas lapa", + "id": "Homepage organisasi", + "ro": "Pagina web a institutu\u021biei", + "eu": "Erakundearen hasiera-orria" }, "attribute_eduorglegalname": { "no": "Foretaksnavn", @@ -1033,7 +1129,10 @@ "zh": "\u7ec4\u7ec7\u7684\u6cd5\u5b9a\u540d\u79f0", "sr": "Zvani\u010dni naziv institucije", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0642\u0627\u0646\u0648\u0646\u064a \u0644\u0644\u0645\u0646\u0638\u0645\u0629", - "id": "Nama legal Organisasi" + "lv": "Organiz\u0101cijas juridiskais nosaukums", + "id": "Nama legal Organisasi", + "ro": "Denumirea legal\u0103 a institu\u021biei", + "eu": "Erakundearen izen legala" }, "attribute_edupersonnickname": { "no": "Kallenavn", @@ -1051,7 +1150,8 @@ "pt-br": "Apelido", "pt": "Alcunha", "pl": "Ksywka (Nickname)", - "cs": "Alias", + "cs": "P\u0159ezd\u00edvka", + "eu": "Ezizena", "tr": "Takma ad", "fr": "Pseudonyme", "it": "Soprannome (nick)", @@ -1064,7 +1164,9 @@ "zh": "\u6635\u79f0", "sr": "Nadimak", "ar": "\u0627\u0644\u0643\u0646\u064a\u0629", - "id": "Nama panggilan" + "lv": "Niks", + "id": "Nama panggilan", + "ro": "Porecl\u0103" }, "attribute_edupersonorgdn": { "no": "Entydig navn (DN) for brukerens vertsorganisasjon", @@ -1082,7 +1184,7 @@ "pt-br": "Nome distinto (DN) da sua organiza\u00e7\u00e3o principal", "pt": "DN da organiza\u00e7\u00e3o de origem", "pl": "Distinguished name (DN) macierzystej organizacji osoby", - "cs": "Jm\u00e9no (DN) organizace", + "cs": "U\u017eivatelsk\u00e9 jm\u00e9no p\u0159id\u011blen\u00e9 organizac\u00ed", "tr": "Ki\u015finin ba\u011fl\u0131 oldu\u011fu kurulu\u015fun belirgin ad\u0131", "fr": "Nom unique (DN) de l'institution d'origine", "it": "Distinguished name (DN) dell'organizzazione ", @@ -1095,7 +1197,10 @@ "sr": "Jedinstveni naziv (DN) korisnikove mati\u010dne institucije", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0645\u0645\u064a\u0632 \u0644\u0644\u0645\u0646\u0638\u0645\u0629 \u0631\u0628 \u0627\u0644\u0639\u0645\u0644", "et": "Koduorganisatsiooni unikaalne nimi (DN)", - "id": "Distinguished name (DN) of person's home organization" + "lv": "Organiz\u0101cijas v\u0101rds (DN)", + "id": "Distinguished name (DN) of person's home organization", + "ro": "Nume distincitv (DN) al institu\u021bie de origine a persoanei", + "eu": "Pertsonaren jatorrizko erakundearen izen osatua (DN)" }, "attribute_edupersonorgunitdn": { "no": "Entydig navn (DN) for brukerens organisasjonsenhet", @@ -1113,11 +1218,11 @@ "pt-br": "Nome distinto (DN) da sua unidade organizacional principal", "pt": "DN da unidade org\u00e2nica na organiza\u00e7\u00e3o de origem", "pl": "Distinguished name (DN) macierzystej jednostki organizacyjnej osoby", - "cs": "Jm\u00e9no (DN) organiza\u010dn\u00ed jednotky", + "cs": "U\u017eivatelsk\u00e9 jm\u00e9no p\u0159id\u011blen\u00e9 organiza\u010dn\u00ed jednotkou", "tr": "Ki\u015finin ba\u011fl\u0131 oldu\u011fu birimin belirgin ad\u0131", "fr": "Nom unique (DN) de la section d'origine", "it": "Distinguished name (DN) dell'unit\u00e0 organizzativa della persona", - "lt": "Asmens organizacijos skyriaus atpa\u017einomo vardas", + "lt": "Asmens organizacijos skyriaus atpa\u017einimo vardas", "ja": "\u7d44\u7e54\u5358\u4f4d\u8b58\u5225\u540d", "zh-tw": "Distinguished name (DN) \u500b\u4eba\u9810\u8a2d\u7d44\u7e54\u55ae\u4f4d", "he": "\u05e9\u05dd \u05de\u05d6\u05d4\u05d4 (DN) \u05e9\u05dc \u05d4\u05d9\u05d7\u05d9\u05d3\u05d4 \u05d1\u05d0\u05d9\u05e8\u05d2\u05d5\u05df \u05d4\u05d1\u05d9\u05ea", @@ -1126,7 +1231,10 @@ "sr": "Jedinstveni naziv (DN) korisnikove organizacione jedinice", "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0645\u0645\u064a\u0632 \u0644\u0644\u0648\u062d\u062f\u0629 \u0628\u0627\u0644\u0645\u0646\u0638\u0645\u0629 \u0631\u0628 \u0627\u0644\u0639\u0645\u0644", "et": "Koduorganisatsiooni all\u00fcksuse unikaalne nimi (DN)", - "id": "Distinguished name (DN) of the person's home organizational unit" + "lv": "Organiz\u0101cijas vien\u012bbas v\u0101rds (DN)", + "id": "Distinguished name (DN) of the person's home organizational unit", + "ro": "Nume distincitv (DN) al unit\u0103\u021bii organiza\u021bionale de origine a persoanei", + "eu": "Pertsonaren jatorrizko erakundeko antolamendu-unitatearen izen osatua (DN)" }, "attribute_edupersonprimaryaffiliation": { "no": "Prim\u00e6r tilknytning til organisasjon", @@ -1144,7 +1252,7 @@ "pt-br": "Filia\u00e7\u00e3o Prim\u00e1ria", "pt": "Afilia\u00e7\u00e3o principal com a organiza\u00e7\u00e3o de origem", "pl": "G\u0142\u00f3wna przynale\u017cno\u015b\u0107 (Primary affiliation)", - "cs": "Hlavn\u00ed vztah", + "cs": "Hlavn\u00ed p\u0159\u00edslu\u0161nost", "tr": "\u00d6ncelikli ba\u011flant\u0131", "fr": "Affiliation primaire", "it": "Affiliazione primaria", @@ -1157,7 +1265,10 @@ "zh": "\u4e3b\u8981\u7684\u8054\u7cfb\u65b9\u5f0f", "sr": "Primarna povezanost sa institucijom", "ar": "\u0627\u0644\u0648\u0638\u064a\u0641\u0629 \u0627\u0644\u0627\u0633\u0627\u0633\u064a\u0629", - "id": "Afiliasi utama" + "lv": "Pamatdarba amats", + "id": "Afiliasi utama", + "ro": "Afiliere primar\u0103", + "eu": "Lehen afiliazioa" }, "attribute_noreduorgnin": { "no": "Organisasjonsnummer", @@ -1187,8 +1298,11 @@ "zh": "\u7ec4\u7ec7\u53f7\u7801", "sr": "Jedinstveni brojni identifikator institucije", "ar": "\u0627\u0644\u0631\u0642\u0645 \u0628\u0627\u0644\u0645\u0646\u0638\u0645\u0629", + "lv": "Organiz\u0101cijas re\u0123istr\u0101cijas numurs", "id": "Nomor Organisasi", - "et": "Registrikood" + "et": "Registrikood", + "ro": "Num\u0103r organiza\u021bional", + "eu": "Erakundearen zenbakia" }, "attribute_noredupersonbirthdate": { "no": "F\u00f8dselsdato", @@ -1207,6 +1321,7 @@ "pt": "Data de nascimento", "pl": "Data urodzenia (Date of birth)", "cs": "Datum narozeni", + "eu": "Jaioteguna", "tr": "Do\u011fum tarihi", "fr": "Date de naissance", "it": "Data di nascita", @@ -1219,7 +1334,9 @@ "zh": "\u751f\u65e5", "sr": "Datum ro\u0111enja", "ar": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0645\u064a\u0644\u0627\u062f", - "id": "Tanggal lahir" + "lv": "Dzim\u0161anas datums", + "id": "Tanggal lahir", + "ro": "Data na\u0219terii" }, "attribute_noredupersonlin": { "no": "Lokalt ID-nummer", @@ -1250,7 +1367,10 @@ "zh": "\u672c\u5730\u8eab\u4efd\u53f7\u7801", "sr": "Lokalni brojni identifikator osobe", "ar": "\u0631\u0642\u0645 \u0627\u0644\u0647\u0648\u064a\u0629 \u0627\u0644\u0645\u062d\u0644\u064a", - "id": "Nomor identitas lokal" + "lv": "Personas kods", + "id": "Nomor identitas lokal", + "ro": "Num\u0103r de identificare local", + "eu": "Tokiko zenbaki identifikatzailea" }, "attribute_manager": { "no": "Overordnet", @@ -1268,7 +1388,7 @@ "pt-br": "Administrador", "pt": "Respons\u00e1vel hier\u00e1rquico", "pl": "Menad\u017cer (Manager)", - "cs": "Manager", + "cs": "Mana\u017eer", "tr": "Y\u00f6netici", "fr": "Gestionnaire", "it": "Manager", @@ -1281,7 +1401,10 @@ "zh": "\u7ba1\u7406\u5458", "sr": "Rukovodilac", "ar": "\u0627\u0644\u0645\u062f\u064a\u0631", - "id": "Manager" + "lv": "Priek\u0161nieks", + "id": "Manager", + "ro": "Director\/Manager", + "eu": "Kudeatzailea" }, "attribute_userpassword": { "no": "Hash av brukerens passord", @@ -1311,7 +1434,10 @@ "zh": "\u7528\u6237\u5bc6\u7801\u7684HASH\u503c", "sr": "He\u0161 vrednost korisnikove lozinke", "ar": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631", - "id": "Hash password user" + "lv": "Paroles jauc\u0113jsumma (hash)", + "id": "Hash password user", + "ro": "Parola utilizatorului \u00een format hash<\/i>", + "eu": "Erabiltzailearen pasahitzaren hash-a" }, "attribute_edupersonprimaryorgunitdn": { "no": "Entydig navn for organisasjonsenheten som brukeren prim\u00e6rt er tilknyttet", @@ -1325,7 +1451,7 @@ "hr": "Jedinstveni naziv (DN) korisnikove primarne organizacijske jedinice", "hu": "A szem\u00e9ly els\u0151dleges szervezeti egys\u00e9g\u00e9nek azonos\u00edt\u00f3 neve (DN-je)", "pt": "DN da unidade org\u00e2nica", - "cs": "Jm\u00e9no (DN) hlavn\u00ed organiza\u010dn\u00e1 jednotky", + "cs": "Jm\u00e9no hlavn\u00ed organiza\u010dn\u00ed jednotky", "tr": "Ki\u015finin \u00f6ncelikli Kurumsal Birimi'nin belirgin ad\u0131", "fr": "Nom unique (DN) de la section d'origine", "it": "Distinguished name (DN) dell'unit\u00e0 organizzativa della persona", @@ -1339,7 +1465,10 @@ "ar": "\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0645\u0645\u064a\u0632 \u0644\u0644\u0648\u062d\u062f\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 \u0628\u0627\u0644\u0645\u0646\u0638\u0645\u0629 \u0631\u0628 \u0627\u0644\u0639\u0645\u0644", "pl": "Nazwa osoby w jednostce organizacyjnej", "et": "Peamise all\u00fcksuse unikaalne nimi (DN)", - "id": "Distinguished name (DN) of person's primary Organizational Unit" + "lv": "Personas pamata organiz\u0101cijas vien\u012bbas v\u0101rds (DN)", + "id": "Distinguished name (DN) of person's primary Organizational Unit", + "ro": "Nume distincitv (DN) al unit\u0103\u021bii organiza\u021bionale primare a persoanei", + "eu": "Pertsonaren antolamendu-unitatearen izen osatua (DN)" }, "attribute_schacuserprivateattribute": { "no": "Private informasjonselement", @@ -1353,7 +1482,7 @@ "hu": "V\u00e9dett adatokat tartalmaz\u00f3 attrib\u00fatumok", "pt": "Elementos privados de informa\u00e7\u00e3o", "pl": "Poufne atrybuty", - "cs": "Priv\u00e1tn\u00ed informa\u010dn\u00ed element", + "cs": "Priv\u00e1tn\u00ed informa\u010dn\u00ed elementy", "tr": "\u00d6zel bilgi elemanlar\u0131", "fr": "\u00c9l\u00e9ments d'informations priv\u00e9es", "hr": "Postavke privatnosti", @@ -1367,7 +1496,10 @@ "zh": "\u4e2a\u4eba\u8d44\u6599", "sr": "Privatni atribut", "ar": "\u0648\u062d\u062f\u0627\u062a \u0627\u0644\u062a\u0639\u0631\u064a\u0641 \u0627\u0644\u062e\u0627\u0635\u0629", - "id": "Elemen-elemen informasi personal" + "lv": "Priv\u0101t\u0101s inform\u0101cijas elementi", + "id": "Elemen-elemen informasi personal", + "ro": "Informa\u021bii private", + "eu": "Informazio pribatuaren elementuak" }, "attribute_noredupersonlegalname": { "no": "Folkeregistrert navn", @@ -1391,8 +1523,12 @@ "pl": "Formalna nazwa u\u017cytkownika", "et": "Ametlik nimi", "hu": "Hivatalos n\u00e9v (noreduperson)", + "lv": "Juridiskais nosaukums", "id": "Nama legal", - "sr": "Pravno ime" + "sr": "Pravno ime", + "cs": "Pr\u00e1vn\u00ed jm\u00e9no", + "ro": "Nume legal", + "eu": "Izen legala" }, "attribute_edupersonassurance": { "no": "Tillitsniv\u00e5 for autentisering", @@ -1415,6 +1551,10 @@ "zh": "\u53ef\u9760\u9a8c\u8bc1\u914d\u7f6e\u6587\u4ef6", "sr": "Visina pouzdanosti davaoca digitalnih identiteta", "ar": "\u0647\u0648\u064a\u0629 \u0627\u0644\u0636\u0645\u0627\u0646", - "id": "Profil penjamin identitas" + "lv": "Apraksts, k\u0101 at\u0161\u0137irt cilv\u0113ku no robota", + "id": "Profil penjamin identitas", + "cs": "Poskytovatel identifika\u010dn\u00edho profilu", + "ro": "Profilul de asigurare a identit\u0103\u021bii", + "eu": "Bermearen profilaren identifikatzailea" } } diff --git a/inc/simplesamlphp/dictionaries/disco.translation.json b/inc/simplesamlphp/dictionaries/disco.translation.json index 63b0515..ee4316d 100644 --- a/inc/simplesamlphp/dictionaries/disco.translation.json +++ b/inc/simplesamlphp/dictionaries/disco.translation.json @@ -11,11 +11,12 @@ "da": "V\u00e6lg institution (identitetsudbyder)", "hr": "Odaberite autentifikacijski servis", "hu": "V\u00e1lasszon szem\u00e9lyazonoss\u00e1g-szolg\u00e1ltat\u00f3t (IdP)", - "fi": "Valitse identiteettill\u00e4hteeis", + "fi": "Valitse identiteettill\u00e4hteesi", "pt-br": "Selecione seu provedor de identidade", "pt": "Escolha o seu fornecedor de identidade (IdP)", "pl": "wybierz swojego Dostawc\u0119 To\u017csamo\u015bci.", "cs": "Zvol sv\u00e9ho poskytovatele identity (IdP)", + "eu": "Hauta ezazu zure identitate hornitzailea", "tr": "Kimlik sa\u011flay\u0131c\u0131n\u0131z\u0131 se\u00e7iniz.", "lt": "Pasirinkite savo tapatybi\u0173 tiek\u0117j\u0105", "it": "Selezionare il proprio identity provider", @@ -27,7 +28,9 @@ "zh": "\u9009\u62e9\u4f60\u7684\u8eab\u4efd\u63d0\u4f9b\u8005", "ar": "\u0627\u062e\u062a\u0627\u0631 \u0645\u0648\u0642\u0639 \u0647\u0648\u064a\u062a\u0643", "id": "Pilih identity provider anda", - "sr": "Odaberite va\u0161eg davaoca identiteta" + "lv": "Izv\u0113lieties identit\u0101tes pieg\u0101d\u0101t\u0101ju", + "sr": "Odaberite va\u0161eg davaoca identiteta", + "ro": "Alege\u021bi furnizorul de identitate" }, "selectidp_full": { "no": "Vennligst velg hvilken identitetsleverand\u00f8r du vil bruke for \u00e5 logge inn:", @@ -35,7 +38,7 @@ "sv": "V\u00e4lj vilken identitetsleverant\u00f6r du vill logga in med:", "es": "Por favor, seleccione el proveedor de identidad donde desea autenticarse", "fr": "S\u00e9lectionnez le fournisseur d'identit\u00e9 aupr\u00e8s duquel vous souhaitez vous authentifier :", - "de": "Bitte w\u00e4hlen Sie den Identity Provider, bei dem Sie Sich authentifizieren m\u00f6chten:", + "de": "Bitte w\u00e4hlen Sie den Identity Provider, bei dem Sie sich authentifizieren m\u00f6chten:", "nl": "Selecteer de Identity Provider waar je wil authenticeren:", "sl": "Izberite IdP, na katerem se boste avtenticirali:", "da": "V\u00e6lg institutionen (identitetsudbyderen) hvor du vil logge ind", @@ -46,6 +49,7 @@ "pt": "Por favor, escolha o fornecedor de identidade (IdP) que ir\u00e1 usar para se autenticar:", "pl": "Prosz\u0119 wybra\u0107 Dostawc\u0119 To\u017csamo\u015bci, przez kt\u00f3rego chcesz si\u0119 uwierzytelni\u0107:", "cs": "Pros\u00edm zvolte sve\u00e9ho poskytovatele identity, kter\u00fd v\u00e1m dovol\u00ed se p\u0159ihl\u00e1sit", + "eu": "Mesedez, non kautotu nahi duzun identifikazio hornitzailea hauta ezazu ", "tr": "L\u00fctfen, kimlik do\u011frulamas\u0131 yapaca\u011f\u0131n\u0131z kimlik sa\u011flay\u0131c\u0131y\u0131 se\u00e7iniz: ", "lt": "Pra\u0161ome pasirinkite tapatybi\u0173 tiek\u0117j\u0105, kuriame norite autentikuotis:", "it": "Si prega di selezionare l'identity provider con il quale autenticarsi:", @@ -57,7 +61,9 @@ "zh": "\u9009\u62e9\u4f60\u8981\u8ba4\u8bc1\u7684\u8eab\u4efd\u63d0\u4f9b\u8005", "ar": "\u0627\u062e\u062a\u0631 \u0645\u0648\u0642\u0639 \u0627\u0644\u0647\u0648\u064a\u0629 \u0627\u0644\u0630\u064a \u062a\u0631\u063a\u0628 \u0628\u062f\u062e\u0648\u0644\u0647", "id": "Silahkan pilih identity provider tempat anda ingin melakukan autentifikasi", - "sr": "Molimo vas odaberite davaoca identiteta kod koga se \u017eelite autentifikovati:" + "lv": "L\u016bdzu izv\u0113lieties identit\u0101tes pieg\u0101d\u0101t\u0101ju, pie kura v\u0113laties autentific\u0113ties:", + "sr": "Molimo vas odaberite davaoca identiteta kod koga se \u017eelite autentifikovati:", + "ro": "V\u0103 rug\u0103m s\u0103 alege\u021bi furnizorul de identitate pe care dori\u021bi s\u0103-l folosi\u021bi pentru autentificarea dumneavoastr\u0103:" }, "select": { "no": "Velg", @@ -76,6 +82,7 @@ "pt": "Escolher", "pl": "Wybierz", "cs": "Zvol", + "eu": "Hautatu", "tr": "Se\u00e7", "lt": "Pasirinkite", "it": "Selezionare", @@ -87,7 +94,9 @@ "zh": "\u9009\u62e9", "ar": "\u0627\u062e\u062a\u0627\u0631", "id": "Pilih", - "sr": "Odaberi" + "lv": "Izv\u0113l\u0113ties", + "sr": "Odaberi", + "ro": "Selecta\u021bi" }, "remember": { "no": "Husk mitt valg", @@ -106,6 +115,7 @@ "pt": "Lembrar esta escolha", "pl": "Zapami\u0119taj m\u00f3j wyb\u00f3r", "cs": "Zapamatuj moji volbu", + "eu": "Nire hautaketa gogoratu", "tr": "Se\u00e7imimi hat\u0131rla", "lt": "Prisiminti pasirinkim\u0105", "it": "Ricorda la mia scelta", @@ -117,7 +127,9 @@ "zh": "\u8bb0\u4f4f\u6211\u7684\u9009\u62e9", "ar": "\u062a\u0630\u0643\u0631 \u062e\u064a\u0627\u0631\u0627\u062a\u064a", "id": "Ingat pilihan saya", - "sr": "Zapamti moj izbor" + "lv": "Atcer\u0113ties manu izv\u0113li", + "sr": "Zapamti moj izbor", + "ro": "Memoreaz\u0103 alegerea f\u0103cut\u0103" }, "icon_prefered_idp": { "no": "[Foretrukket valg]", @@ -146,7 +158,11 @@ "zh": "\u9996\u9009\u9009\u9879", "ar": "\u0627\u062e\u062a\u064a\u0627\u0631\u064a \u0627\u0644\u0645\u0641\u0636\u0644", "id": "Pilihan yang disukai", - "sr": "[Preferirani izbor]" + "lv": "(Mana lab\u0101k\u0101 izv\u0113le)", + "sr": "[Preferirani izbor]", + "ro": "[Varianta preferat\u0103]", + "cs": "[Preferovan\u00e1 volba]", + "eu": "[Aukera gogokoena]" }, "previous_auth": { "no": "Du har tidligere valg \u00e5 autentisere deg hos", @@ -174,7 +190,11 @@ "zh": "\u4f60\u5148\u524d\u9009\u62e9\u7684\u8ba4\u8bc1", "ar": "\u0642\u0645\u062a \u0633\u0627\u0628\u0642\u0627 \u0628\u0627\u0644\u062a\u0635\u062f\u064a\u0642 \u0641\u064a", "id": "Sebelumnya anda telah memilih untuk melakukan autentifikasi di ", - "sr": "Prethodno ste izabrali da se autentifikujete kroz" + "lv": "Iepriek\u0161 J\u016bs autentific\u0113j\u0101ties pie", + "sr": "Prethodno ste izabrali da se autentifikujete kroz", + "ro": "Anterior a\u021bi ales s\u0103 v\u0103 autentifica\u021bi la", + "cs": "D\u0159\u00edve jste zvolil(a) ov\u011b\u0159en\u00ed u", + "eu": "Lehenago, hemen kautotzea hautatu duzu" }, "login_at": { "no": "Logg inn hos", @@ -202,6 +222,10 @@ "zh": "\u767b\u5f55\u4e8e", "ar": "\u0633\u062c\u0644 \u062f\u062e\u0648\u0644\u064a \u0639\u0644\u064a", "id": "Login di", - "sr": "Prijavi se kroz" + "lv": "Piesl\u0113gties pie", + "sr": "Prijavi se kroz", + "ro": "Autentificare la", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed k", + "eu": "Non identifikatu" } } diff --git a/inc/simplesamlphp/dictionaries/errors.translation.json b/inc/simplesamlphp/dictionaries/errors.translation.json index 75438d7..f53442c 100644 --- a/inc/simplesamlphp/dictionaries/errors.translation.json +++ b/inc/simplesamlphp/dictionaries/errors.translation.json @@ -17,6 +17,7 @@ "pt": "Erro no simpleSAMLphp", "pl": "b\u0142\u0105d simpleSAMLphp", "cs": "simpleSAMLphp chyba", + "eu": "simpleSAMLphp-en errorea", "tr": "simpleSAMLphp hatas\u0131", "it": "Errore di simpleSAMLphp", "lt": "simpleSAMLphp klaida", @@ -27,8 +28,10 @@ "zh": "simpleSAMLphp\u9519\u8bef", "sr": "simpleSAMLphp gre\u0161ka", "ar": "\u062e\u0637\u0627 \u0628 simpleSAMLphp", + "lv": "simpleSAMLphp k\u013c\u016bda", "id": "Error simpelSAMLphp", - "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 simpleSAMLphp" + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 simpleSAMLphp", + "ro": "Eroare simpleSAMLphp" }, "report_trackid": { "no": "Hvis vil rapportere denne feilen, send ogs\u00e5 med dette sporingsnummeret. Det gj\u00f8r det enklere for systemadministratorene \u00e5 finne ut hva som gikk galt:", @@ -36,7 +39,7 @@ "sv": "Om du rapporterar felet b\u00f6r du ocks\u00e5 skicka med detta sp\u00e5rnings-ID. Det g\u00f6r det enklare f\u00f6r den som sk\u00f6ter systemet att fels\u00f6ka problemet:", "es": "Por favor, si informa de este error, mantenga el tracking ID<\/emph> que permite encontrar su sesión en los registros de que dispone el administrador del sistema:", "fr": "Si vous signalez cette erreur, veuillez aussi signaler l'identifiant de suivi qui permet de trouver votre session dans les logs accessibles \u00e0 l'administrateur syst\u00e8me :", - "de": "Falls sie diesen Fehler melden, teilen sie bitte ebenfalls diese Tracking ID mit, dadurch ist es dem Administrator m\u00f6glich ihre Sitzung in den Logs zu finden:", + "de": "Falls Sie diesen Fehler melden, teilen Sie bitte ebenfalls diese Tracking ID mit, dadurch ist es dem Administrator m\u00f6glich ihre Sitzung in den Logs zu finden:", "nl": "Wanneer je deze fout rapporteert, geef dan AUB ook de volgende tracking ID door, waarmee het mogelijk is om jouw sessie in de logs terug te vinden:", "lb": "Wann dir ons d\u00ebsen Fehler matdeelt, dann sch\u00e9ckt w.e.g och d Tracking ID mat. Dei ennerst\u00ebtzt den System Administrator aer Session an den Logs er\u00ebmzefannen:", "sl": "\u010ce boste prijavili to napako, prilo\u017eite tudi ID seje, preko katere bo la\u017eje najti va\u0161e zapise v dnevni\u0161kih datotekah, ki so na voljo skrbniku sistema.", @@ -47,7 +50,7 @@ "pt-br": "Se informar sobre esse erro, por favor, tamb\u00e9m informe este ID do relat\u00f3rio de monitoramento que torna poss\u00edvel localizar a sua sess\u00e3o nos registros dispon\u00edveis para o administrador do sistema:", "pt": "Se comunicar este erro ao administrador de sistemas inclua o seguinte identificador que possibilita a localiza\u00e7\u00e3o da sua sess\u00e3o nos registos do servi\u00e7o:", "pl": "Je\u015bli zg\u0142aszasz ten bl\u0105d, podaj tak\u017ce ID zdarzenia, kt\u00f3ry umo\u017cliwi administratorowi zlokalizowa\u0107 Twoj\u0105 sesje w logach:", - "cs": "Pokud budete reportovat tuto chybu, pros\u00edm za\u0161lete toto ID, kter\u00e9 umo\u017en\u00ed naj\u00edt va\u0161e sezen\u00ed v loz\u00edch: ", + "cs": "Pokud budete reportovat tuto chybu, pros\u00edm za\u0161lete tak\u00e9 toto ID, toto umo\u017en\u00ed naj\u00edt va\u0161\u00ed session v logu, kter\u00fd je dostupn\u00fd systmov\u00fdm administr\u00e1torem\uff1a ", "tr": "Bu hatay\u0131 bildirirseniz, l\u00fctfen, sistem y\u00f6neticisi taraf\u0131ndan incelebilen kay\u0131tlardan oturumunuzun belirlenebilmesini sa\u011flayan izleme ID'sini de bildirin.", "it": "Se inoltri questo errore, per favore riporta anche questo tracking ID, esso renderà possibile all'amministratore del sistema il tracciamento della tua sessione nei log:", "lt": "Jei prane\u0161ate apie \u0161i\u0105 klaid\u0105, neu\u017emir\u0161kite pateikti \u0161ios klaidos ID, kurio d\u0117ka sistemos administratorius gal\u0117s surasti J\u016bs\u0173 sesijos metu atliktus veiksmus atlikt\u0173 veiksm\u0173 istorijoje:", @@ -58,8 +61,11 @@ "zh": "\u5982\u679c\u4f60\u62a5\u544a\u4e86\u8fd9\u4e2a\u9519\u8bef\uff0c\u90a3\u4e48\u8bf7\u4f60\u4e5f\u62a5\u544a\u8fd9\u4e2a\u8ffd\u8e2a\u53f7\u7801\uff0c\u7cfb\u7edf\u7ba1\u7406\u5458\u6709\u53ef\u80fd\u6839\u636e\u8fd9\u4e2a\u53f7\u7801\u5728\u65e5\u5fd7\u4e2d\u5b9a\u4f4d\u4f60\u7684SESSION", "sr": "Ako prijavite ovu gre\u0161ku, molimo Vas da tako\u0111e po\u0161aljete i ovaj identifikator koji \u0107e omogu\u0107iti da se Va\u0161a sesija locira u logovima dostupnim adminstratoru sistema:", "ar": "\u0627\u0630\u0627 \u0642\u0645\u062a \u0628\u0631\u0641\u0639 \u062a\u0642\u0631\u064a\u0631 \u0639\u0646 \u0647\u0630\u0627 \u0627\u0644\u062e\u0637\u0623 \u0642\u0645 \u0631\u062c\u0627\u0621\u0627\u064b \u0628\u0625\u062f\u0631\u0627\u062c \u0631\u0642\u0645 \u0627\u0644\u0645\u062a\u0627\u0628\u0639\u0629 \u0623\u062f\u0646\u0627\u0647 \u0643\u064a\u0645\u0627 \u0646\u0633\u062a\u0637\u064a\u0639 \u062a\u062d\u062f\u064a\u062f \u0641\u062a\u0631\u0629 \u062f\u062e\u0648\u0644\u0643 \u0628\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0634\u0631\u0641 \u0639\u0644\u064a \u0627\u0644\u0645\u0648\u0642\u0639", + "lv": "Kad zi\u0146ojat par k\u013c\u016bdu, l\u016bdzu nor\u0101diet \u0161o atseko\u0161anas numuru, kas administratoram pal\u012bdz atrast \u0161o sesiju sist\u0113mas ierakstos.", "id": "Jika Anda melaporkan error ini, tolong laporkan juga nomor pelacakan sehingga memungkinkan untuk lokasi session anda pada log tersedia untuk system administrator:", - "ru": "\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 (\u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043b\u043e\u0433\u0430\u0445):" + "ru": "\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 (\u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043b\u043e\u0433\u0430\u0445):", + "ro": "Dac\u0103 raporta\u021bi aceast\u0103 eroare, v\u0103 rug\u0103m s\u0103 include\u021bi urm\u0103torul num\u0103r de \u00eenregistrare care va permite localizarea sesiunii dumneavoastr\u0103 \u00een jurnalele de sistem:", + "eu": "Mesedez, errore honen berri ematen baduzu, mantendu ezazu jarraipen zenbaki hau, honek sistemaren administratzaileak dituen erregistroetan zure saioa aurkitzea ahalbidetzen baitu:" }, "debuginfo_header": { "no": "Detaljer for feils\u00f8king", @@ -78,7 +84,8 @@ "pt-br": "Informa\u00e7\u00e3o do Debug", "pt": "Informa\u00e7\u00e3o de debug", "pl": "Informacja debugger'a", - "cs": "Debug", + "cs": "Ladic\u00ed informace", + "eu": "Arazketa informazioa", "tr": "Hata ay\u0131klama bilgisi", "it": "Informazioni di debug", "lt": "Detali informacija", @@ -89,8 +96,10 @@ "zh": "\u8c03\u8bd5\u4fe1\u606f", "sr": "Informacije o gre\u0161ki", "ar": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0635\u062d\u064a\u062d", + "lv": "Atk\u013c\u016bdo\u0161anas infom\u0101cija", "id": "Informasi debug", - "ru": "\u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f" + "ru": "\u041e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f", + "ro": "Informa\u021bii de depanare" }, "debuginfo_text": { "no": "Detaljene nedenfor kan v\u00e6re av interesse for administratoren \/ brukerst\u00f8tte:", @@ -109,7 +118,8 @@ "pt-br": "A informa\u00e7\u00e3o a seguir \u00e9 importante para seu administrador \/ Central de D\u00favidas", "pt": "A informa\u00e7\u00e3o de debug abaixo pode ter interesse para o administrador \/ apoio ao utilizador:", "pl": "Poni\u017csza informacja debugger'a mo\u017ce by\u0107 przydatna dla administara \/ helpdesk:", - "cs": "Debug m\u016f\u017ee zaj\u00edmat administr\u00e1tora (helpdesk)", + "cs": "N\u00e1sleduj\u00edc\u00ed ladic\u00ed informace m\u016f\u017ee zaj\u00edmat administr\u00e1tora (helpdesk)", + "eu": "Arazketa informazio hau erabilgarria izan daiteke sistemaren administratzailea edo erabiltzailearen arreta zentroarentzat:", "tr": "A\u015fa\u011f\u0131daki hata ay\u0131klama bilgisi y\u00f6neticinin\/yard\u0131m masas\u0131n\u0131n ilgisini \u00e7ekebilir:", "it": "Le seguenti informazioni di debug possono interessare l'amministratore di sistema o il supporto utenti:", "lt": "\u0160i detali informacija gali b\u016bti \u012fdomi administratoriui:", @@ -120,8 +130,10 @@ "zh": "\u7ba1\u7406\u5458\u6216\u8005\u670d\u52a1\u53f0\u53ef\u80fd\u5bf9\u4e0b\u9762\u7684\u8c03\u8bd5\u4fe1\u606f\u5f88\u611f\u5174\u8da3", "sr": "Informacije o gre\u0161ci koje se nalaze ispod mogu biti od interesa administratoru ili slu\u017ebi za podr\u0161ku korisnicima.", "ar": " \u0642\u062f \u062a\u0643\u0648\u0646 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0635\u062d\u064a\u062d \u0623\u062f\u0646\u0627\u0647 \u0645\u0641\u064a\u062f\u0629 \u0644\u0645\u0634\u0631\u0641 \u0627\u0644\u0645\u0648\u0642\u0639\/ \u0627\u0648 \u0645\u0648\u0638\u0641 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629", + "lv": "Zem\u0101k eso\u0161\u0101 atk\u013c\u016bdo\u0161anas inform\u0101cija var interes\u0113t administratoru un pal\u012bdz\u012bbas dienestu:", "id": "Informasi debug dibawah ini mungkin menarik bagi administrator\/help desk:", - "ru": "\u041d\u0438\u0436\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:" + "ru": "\u041d\u0438\u0436\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:", + "ro": "Informa\u021biile de depanare de mai jos pot fi importante pentru administratorul de sistem:" }, "report_header": { "no": "Rapporter feil", @@ -140,7 +152,8 @@ "pt-br": "Reportar erros", "pt": "Reportar um erro", "pl": "Raport b\u0142\u0119d\u00f3w", - "cs": "Chybov\u00fd report", + "cs": "Ozn\u00e1mit chyby", + "eu": "Erroreen berri eman", "tr": "Hatalar\u0131 bildir", "lt": "Prane\u0161ti apie klaidas", "it": "Riporta gli errori", @@ -151,8 +164,10 @@ "zh": "\u62a5\u544a\u9519\u8bef", "sr": "Prijavi gre\u0161ku", "ar": "\u0627\u0631\u0641\u0639 \u062a\u0642\u0631\u064a\u0631\u0627\u064b \u0639\u0646 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 ", + "lv": "Zi\u0146ot par k\u013c\u016bd\u0101m", "id": "Laporakan error", - "ru": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445" + "ru": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445", + "ro": "Raporta\u021bi erorile" }, "report_text": { "no": "Hvis du \u00f8nsker at brukerst\u00f8tte skal kunne kontakte deg igjen i forbindelse med denne feilen, m\u00e5 du oppgi e-postadressen din nedenfor:", @@ -160,7 +175,7 @@ "sv": "Om du anger din e-postadress kan den som sk\u00f6ter systemet kontakta dig f\u00f6r fler fr\u00e5gor om ditt problem:", "es": "Si lo desea, indique su direcci\u00f3n electr\u00f3nica, para que los administradores puedan ponerse en contacto con usted y obtener datos adicionales de su problema", "fr": "De mani\u00e8re optionnelle, vous pouvez entrer votre courriel, afin que les administrateurs puissent vous contacter par la suite \u00e0 propos de votre probl\u00e8me :", - "de": "Geben sie optional eine E-Mail-Adresse an, so dass der Administrator sie bei etwaigen R\u00fcckfragen kontaktieren kann:", + "de": "Geben Sie optional eine E-Mail-Adresse an, so dass der Administrator Sie bei etwaigen R\u00fcckfragen kontaktieren kann:", "nl": "Voeg desgewenst je e-mailadres toe, zodat de beheerders contact kunnen zoeken voor verder informatie over dit probleem:", "lb": "Optionnal kennt dir aer E-mail Adress angin, fir dass den Administrator aerch fir weider Froen kontakt\u00e9ieren kann:", "sl": "\u010ce \u017eelite, vnesite elektronski naslov, na katerem boste dosegljivi v primeru dodatnih vpra\u0161anj za skrbnika sistema :", @@ -172,6 +187,7 @@ "pt": "Opcionalmente, pode introduzir o seu email para o administrador de sistemas entrar em contacto consigo, caso tenha alguma quest\u00e3o relativamente ao seu problema.", "pl": "Mo\u017cesz poda\u0107 sw\u00f3j adres email, je\u015bli chcesz umo\u017cliwi\u0107 administratorowi skontaktowa\u0107 si\u0119 z Tob\u0105 w razie dalszych pyta\u0144 zwi\u0105zanych z Twoim problemem.", "cs": "M\u016f\u017eete uv\u00e9st svou emailovou adresu, aby v\u00e1s mohl administr\u00e1tor kontaktovat:", + "eu": "Nahi izanez gero, zure helbide elektronikoa adierazi ezazu, administratzaileak zurekin harremanetan jar daitezen, eta zure arazoaren datu gehigarriak eskura ditzaten:", "tr": "Durumunuz hakk\u0131nda ileride ortaya \u00e7\u0131kabilecek sorularla ilgili y\u00f6neticilerin ileti\u015fim kurabilmesi i\u00e7in, iste\u011fe ba\u011fl\u0131 olarak e-posta adresinizi girin.", "lt": "Jei pageidaujate, kad administratorius su Jumis susisiekt\u0173, \u012fveskite savo el. pa\u0161to adres\u0105:", "it": "Puoi inserire il tuo indirizzo di email, per consentire agli amministratori di contattarti per analizzare il problema:", @@ -182,7 +198,10 @@ "zh": "\u4f60\u53ef\u4ee5\u586b\u5165\u4f60\u7684Email\u5730\u5740\uff08\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u9009\u62e9\u4e0d\u586b\uff09\uff0c\u8fd9\u6837\u7ba1\u7406\u5458\u5c31\u80fd\u591f\u901a\u8fc7\u8054\u7cfb\u60a8\u6765\u8fdb\u4e00\u6b65\u7684\u4e86\u89e3\u4f60\u7684\u95ee\u9898\u4e86", "sr": "Opciono, unesite Va\u0161u e-mail adresu kako bi administratori mogli da Vas kontaktiraju ukoliko im budu trebale dodantne informacije:", "ar": "\u0627\u062f\u0631\u062c \u0639\u0646\u0648\u0627\u0646 \u0627\u064a\u0645\u064a\u0644\u0643 \u0627\u062e\u062a\u064a\u0627\u0631\u064a\u0627\u064b \u0644\u0644\u0645\u0634\u0631\u0641 \u0644\u064a\u0633\u062a\u0637\u064a\u0639 \u0627\u0644\u062a\u0648\u0627\u0635\u0644 \u0645\u0639\u0643 \u0644\u062d\u0644 \u0627\u0644\u0645\u0634\u0643\u0644\u0629", - "id": "Opsional, masukkan alamat email Anda, agar administrator dapat menghubungi Anda untuk pertanyaan lebih lanjut tentang masalah Anda:" + "lv": "Nor\u0101diet savu e-pastu, lai administrators var ar Jums sazin\u0101ties un preciz\u0113t notiku\u0161o:", + "id": "Opsional, masukkan alamat email Anda, agar administrator dapat menghubungi Anda untuk pertanyaan lebih lanjut tentang masalah Anda:", + "ro": "Op\u021bional, trece\u021bi adresa dumneavoastr\u0103 de e-mail. Administratorii de sistem vor putea s\u0103 v\u0103 contacteze pentru eventuale informa\u021bii suplimentare despre problema dumneavoastra:", + "ru": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0433 \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e):" }, "report_email": { "no": "E-postadresse:", @@ -195,7 +214,7 @@ "lb": "E-mail Adress", "sl": "Elektronski naslov:", "da": "E-mailadresse:", - "se": "Elektrovnnalaš poastačijuhus", + "se": "Elektrovnnala\u0161 poasta\u010dijuhus", "hr": "E-mail adresa:", "hu": "E-mail c\u00edmek:", "fi": "s\u00e4hk\u00f6postiosoite:", @@ -203,6 +222,7 @@ "pt": "Endere\u00e7o de email:", "pl": "Adres e-mail", "cs": "Email", + "eu": "E-posta:", "tr": "E-posta adresi:", "lt": "El. pa\u0161to adresas:", "it": "Indirizzo di e-mail:", @@ -213,7 +233,10 @@ "zh": "E-mail\u5730\u5740", "sr": "e-mail adresa:", "ar": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0623\u0645\u064a\u0644", - "id": "Alamat E-mail:" + "lv": "E-pasta adrese:", + "id": "Alamat E-mail:", + "ro": "Adresa e-mail:", + "ru": "\u0410\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b:" }, "report_explain": { "no": "Forklar hva du gjorde da feilen oppsto...", @@ -221,7 +244,7 @@ "sv": "F\u00f6rklara hur felet uppstod...", "es": "Explique lo que ha hecho para llegar a este error...", "fr": "Expliquez ce que vous faisiez lorsque cette erreur est apparue...", - "de": "Erl\u00e4utern sie, wodurch der Fehler auftrat...", + "de": "Erl\u00e4utern Sie, wodurch der Fehler auftrat...", "nl": "Leg uit wat je deed toen deze foutmelding optrad...", "lb": "Erklaert w.e.g genau waat dir gemaacht hud fir den Fehler auszel\u00e9isen...", "sl": "Opi\u0161ite, kako je pri\u0161lo do napake...", @@ -233,6 +256,7 @@ "pt": "Introduza uma breve explica\u00e7\u00e3o do sucedido...", "pl": "Opisz, co zrobi\u0142e\u015b kiedy wyst\u0105pi\u0142 b\u0142\u0105d...", "cs": "Vysv\u011btlete jak do\u0161lo k t\u00e9to chyb\u011b ...", + "eu": "Azal ezazu zer egin duzun errore honetara iristeko...", "tr": "Bu hatan\u0131n neden olu\u015ftu\u011funu a\u00e7\u0131klay\u0131n...", "lt": "Apra\u0161ykite kokius veiksmus atlikote, kuomet pasirod\u0117 \u0161i klaida...", "it": "Descrivi cosa stavi facendo al momento dell'errore", @@ -243,7 +267,10 @@ "zh": "\u8bf4\u660e\u4e00\u4e0b\uff0c\u4f60\u6b63\u5728\u505a\u4ec0\u4e48\u7684\u65f6\u5019\u53d1\u751f\u4e86\u8fd9\u4e2a\u9519\u8bef", "sr": "Opi\u0161ite \u0161ta ste radili kada se ova gre\u0161ka desila...", "ar": "\u0627\u0634\u0631\u062d \u0645\u0627 \u0641\u0639\u0644\u062a\u0647 \u0639\u0646\u062f \u062d\u062f\u0648\u062b \u0627\u0644\u062e\u0637\u0623 ", - "id": "Jelaskan apa yang Anda lakukan ketika error ini terjadi..." + "lv": "Aprakstiet, ko J\u016bs dar\u012bj\u0101t, kad notika k\u013c\u016bda.", + "id": "Jelaskan apa yang Anda lakukan ketika error ini terjadi...", + "ro": "Descrie\u021bi ce opera\u021biuini executa\u021bi c\u00e2nd a ap\u0103rut aceast\u0103 eroare ...", + "ru": "\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u0435 \u0432\u0430\u0448\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438... " }, "report_submit": { "no": "Send feilrapport", @@ -263,6 +290,7 @@ "pt": "Enviar o relat\u00f3rio de erro", "pl": "Wy\u015blij raport o b\u0142\u0119dzie", "cs": "Zaslat chybov\u00fd report", + "eu": "Bidal ezazu errorearen txostena", "tr": "Hata raporu g\u00f6nder", "lt": "Si\u0173sti prane\u0161im\u0105 apie klaid\u0105", "it": "Invia un rapporto di errore", @@ -273,7 +301,10 @@ "zh": "\u53d1\u9001\u9519\u8bef\u62a5\u544a", "sr": "Po\u0161alji prijavu gre\u0161ke", "ar": "\u0627\u0631\u0633\u0644 \u062a\u0642\u0631\u064a\u0631\u0627\u064b \u0639\u0646 \u0627\u0644\u062e\u0637\u0623 ", - "id": "Kirim laporan error" + "lv": "S\u016bt\u012bt zi\u0146ojumu par k\u013c\u016bdu", + "id": "Kirim laporan error", + "ro": "Trimite\u021bi raportul cu erorile observate", + "ru": "\u0412\u044b\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 " }, "howto_header": { "no": "Hvordan f\u00e5 hjelp", @@ -293,6 +324,7 @@ "pt": "Como obter ajuda", "pl": "Jak otrzyma\u0107 pomoc.", "cs": "Jak z\u00edskat pomoc", + "eu": "Laguntza nola eskuratu", "tr": "Nas\u0131l yard\u0131m al\u0131n\u0131r", "lt": "Kaip pasiekti pagalb\u0105", "it": "Come ottenere aiuto", @@ -303,7 +335,10 @@ "zh": "\u5982\u4f55\u83b7\u53d6\u5e2e\u52a9", "sr": "Kome se obratiti za pomo\u0107", "ar": "\u0644\u0644\u0645\u0633\u0627\u0639\u062f\u0629", - "id": "Bagaimana mendapatkan pertolongan" + "lv": "K\u0101 atrast pal\u012bdz\u012bbu", + "id": "Bagaimana mendapatkan pertolongan", + "ro": "Cum ob\u021bine\u021bi ajutor\/asisten\u021b\u0103", + "ru": "\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043c\u043e\u0449\u044c" }, "howto_text": { "no": "Denne feilen skyldes sannsynligvis feil i oppsettet av simpleSAMLphp eller den er en f\u00f8lge av en uforutsett hendelse. Kontakt administratoren av denne tjenesten og rapporter s\u00e5 mye som mulig ang\u00e5ende feilen.", @@ -311,7 +346,7 @@ "sv": "Detta fel beror troligtvis p\u00e5 att ov\u00e4ntat beteende eller felkonfigurering av simpleSAMLphp. Kontakta den som sk\u00f6ter inloggningtj\u00e4nsten f\u00f6r att meddela dem ovanst\u00e5ende felmeddelande.", "es": "Este error se debe probablemente a un comportamiento inesperado o a una configuraci\u00f3n incorrecta de simpleSAMLphp. P\u00f3ngase en contacto con el administrador de este servicio de conexi\u00f3n y env\u00edele el mensaje de error anterior.", "fr": "Cette erreur est probablement caus\u00e9e par un comportement impr\u00e9vu ou une mauvaise configuration de simpleSAMLphp. Contactez l'administrateur de ce service d'identification et envoyez lui le message d'erreur.", - "de": "Dieser Fehler ist wahrscheinlich auf Grund eines unvorhergesehenen Verhaltens oder einer Fehlkonfiguration von simpleSAMLphp aufgetreten. Kontaktieren sie bitte den Administrator dieses Dienstes und teilen die obige Fehlermeldung mit.", + "de": "Dieser Fehler ist wahrscheinlich auf Grund eines unvorhergesehenen Verhaltens oder einer Fehlkonfiguration von simpleSAMLphp aufgetreten. Kontaktieren Sie bitte den Administrator dieses Dienstes und teilen die obige Fehlermeldung mit.", "nl": "Deze foutmelding is waarschijnlijk ontstaan door onverwacht gedrag of door verkeerde configuratie van simpleSAMLphp. Meld dit bij de beheerder van deze authenticatiedienst, en geef bovenstaande melding door.", "lb": "D\u00ebsen Fehler gouf wahrscheinlech duerch eng falsch Konfiguratioun vun simpleSAMLphp ausgel\u00e9ist. Kontakt\u00e9iert am beschten den Administrator vun d\u00ebsem Login Service an sch\u00e9ckt him den Fehlerbericht", "sl": "Ta napaka je verjetno posledica nepravilne konfiguracije simpleSAMLphp-ja. Obrnite se na skrbnika in mu posredujte to napako.", @@ -333,7 +368,11 @@ "zh": "\u8fd9\u4e2a\u9519\u8bef\u53ef\u80fd\u662f\u7531\u4e8e\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u884c\u4e3a\u6216\u8005\u662fsimpleSAMLphp\u7684\u914d\u7f6e\u9519\u8bef\u5bfc\u81f4\u7684\uff0c\u8bf7\u8054\u7cfb\u8fd9\u4e2a\u767b\u5f55\u670d\u52a1\u5668\u7684\u7ba1\u7406\u5458\u5e76\u628a\u4e0a\u9762\u7684\u9519\u8bef\u6d88\u606f\u53d1\u9001\u7ed9\u4ed6\u4eec", "sr": "Ova gre\u0161ka se verovatno desila zbog neo\u010dekivanog pona\u0161anja, ili pogre\u0161nih pode\u0161avanja simpleSAMLphp-a. Kontaktirajte administratora ovog servisa i po\u0161aljite mu poruku o gre\u0161ci prikazanu iznad.", "ar": "\u0647\u0630\u0627 \u0627\u0644\u062e\u0637\u0623 \u0646\u0627\u062a\u062c \u063a\u0627\u0644\u0628\u0627\u064b \u0639\u0646 \u0633\u0644\u0648\u0643 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639 \u0627\u0648 \u0639\u0646 \u062e\u0637\u0627 \u0641\u064a \u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c. \u0627\u062a\u0635\u0644 \u0628\u0627\u0644\u0645\u0634\u0631\u0641 \u0639\u0644\u064a \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0647\u0630\u0647 \u0627\u0644\u062e\u062f\u0645\u0629 \u0648 \u0642\u0645 \u0628\u0625\u0631\u0633\u0627\u0644 \u062a\u0642\u0631\u064a\u0631 \u0627\u0644\u062e\u0637\u0623 \u0623\u0639\u0644\u0627\u0647 \u0644\u0647\u0645 \u0623\u064a\u0636\u0627\u064b ", - "id": "Error ini mungkin karena perilaku yang tidak diharapakan atau konfigurasi yang salah di simpleSAMLphp. Hubungi administrator dari layanan login ini, dan kirimkan kepada mereka pesan error diatas." + "lv": "Iesp\u0113jams, k\u013c\u016bda radusies no neparedz\u0113tas darb\u012bbas vai nepareizas simpleSAMLphp konfigur\u0101cijas. Nos\u016btiet administratoram k\u013c\u016bdas zi\u0146ojumu.", + "id": "Error ini mungkin karena perilaku yang tidak diharapakan atau konfigurasi yang salah di simpleSAMLphp. Hubungi administrator dari layanan login ini, dan kirimkan kepada mereka pesan error diatas.", + "ro": "Aceast\u0103 eroare a ap\u0103rut probabil din cauza unui comportament nea\u0219teptat sau a erorilor de configurare a simpleSAMLphp. V\u0103 rug\u0103m s\u0103 contacta\u021bi administratorul acestui serviciu \u0219i s\u0103-i furniza\u021bi mesajul de eroare de mai sus.", + "ru": "\u042d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 simpleSAMLphp. \u0421\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0435\u043c\u0443 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.", + "eu": "Errore hau jazo izana simpleSAMLphp-en ezusteko jokaera edo konfigurazio okerra izan da. Jar zaitez harremanetan identifikazio zerbitzu honen administratzailearekin eta bidal iezaiozu lehenagoko errore mezua. " }, "title_CREATEREQUEST": { "no": "Feil i laging av foresp\u00f8rselen", @@ -353,6 +392,7 @@ "pt": "Erro ao criar o pedido", "pl": "B\u0142\u0105d podczas wykonywania \u017c\u0105dania.", "cs": "Chyba p\u0159i vytv\u00e1\u0159en\u00ed po\u017eadavku", + "eu": "Errorea eskaera sortzean", "tr": "\u0130stek olu\u015fturmada hata", "lt": "Klaida kuriant u\u017eklaus\u0105", "it": "Errore durante la generazione della richiesta", @@ -363,7 +403,10 @@ "zh": "\u521b\u5efa\u8bf7\u6c42\u51fa\u9519", "sr": "Gre\u0161ka pri kreiranju zahteva", "ar": "\u062e\u0637\u0627 \u0628\u0637\u0644\u0628 \u0627\u0644\u062a\u0643\u0648\u064a\u0646", - "id": "Error membuat request." + "lv": "Piepras\u012bjuma veido\u0161anas k\u013c\u016bda", + "id": "Error membuat request.", + "ro": "Eroare la crearea cererii", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430" }, "descr_CREATEREQUEST": { "no": "En feil oppstod da SAML-foresp\u00f8rselen skulle lages.", @@ -383,6 +426,7 @@ "pt": "Ocorreu um erro ao tentar criar o pedido SAML", "pl": "Wyst\u0105pi\u0142 b\u0142\u0105d podczas pr\u00f3by budowania \u017c\u0105dania SAML", "cs": "Chyba vznikla p\u0159i vytv\u00e1\u0159en\u00ed SAML po\u017eadavku.", + "eu": "Errore bat jazo da SAML eskaera sortzen saiatzean.", "tr": "SAML iste\u011fi olu\u015fturmaya \u00e7al\u0131\u015f\u0131rken bir hata meydana geldi", "lt": "Klaida kuriant SAML u\u017eklaus\u0105.", "it": "Si \u00e8 verificato un errore durante la creazione della richiesta SAML.", @@ -393,7 +437,10 @@ "zh": "\u5728\u521b\u5efaSAML\u8bf7\u6c42\u4e2d\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef", "sr": "Desila se gre\u0161ka prilikom poku\u0161aja kreiranja SAML zahteva.", "ar": "\u062d\u062f\u062b \u062e\u0637\u0627 \u0639\u0646\u062f \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u0643\u0648\u064a\u0646 \u0637\u0644\u0628 SAML", - "id": "Sebuah error telah terjadi ketika membuat request SAML." + "lv": "Veidojot SAML piepras\u012bjumu rad\u0101s k\u013c\u016bda.", + "id": "Sebuah error telah terjadi ketika membuat request SAML.", + "ro": "A ap\u0103rut o eroare la crearea cererii SAML.", + "ru": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c SAML \u0437\u0430\u043f\u0440\u043e\u0441." }, "title_DISCOPARAMS": { "no": "Ugyldig foresp\u00f8rsel til SAML 2.0 Discovery-tjenesten", @@ -414,7 +461,7 @@ "pl": "nieprawid\u0142owe \u017cadanie do listy serwisow", "cs": "\u0160patn\u00fd po\u017eadavek pro prohled\u00e1vac\u00ed slu\u017ebu", "tr": "Tan\u0131ma servisine giden hatal\u0131 istek", - "lt": "Neteisinga u\u017eklaus\u0105 kreipiantis \u012f \"discovery\" servis\u0105", + "lt": "Neteisinga u\u017eklausa kreipiantis \u012f \"discovery\" servis\u0105", "it": "Richiesta errata al discovery service", "ja": "\u30b5\u30fc\u30d3\u30b9\u30c7\u30a3\u30b9\u30ab\u30d0\u30ea\u4e2d\u306e\u4e0d\u6b63\u306a\u30ea\u30af\u30a8\u30b9\u30c8", "zh-tw": "\u7121\u6548\u7684\u8acb\u6c42\u65bc\u641c\u5c0b\u670d\u52d9", @@ -422,8 +469,12 @@ "he": "\u05d1\u05e7\u05e9\u05d4 \u05e9\u05d2\u05d5\u05d9\u05d4 \u05dc\u05e9\u05d9\u05e8\u05d5\u05ea \u05d2\u05d9\u05dc\u05d5\u05d9", "zh": "\u9519\u8bef\u7684\u641c\u5bfb\u670d\u52a1\u8bf7\u6c42", "ar": "\u0637\u0644\u0628 \u0633\u064a\u0621 \u0644\u062e\u062f\u0645\u0629 \u0627\u0633\u062a\u0643\u0634\u0627\u0641\u064a\u0629", + "lv": "Nepareizs piepras\u012bjums discovery servisam", "id": "Request yang buruk ke layanan penemuan", - "sr": "Servisu za lociranje poslat je neispravan zahtev" + "sr": "Servisu za lociranje poslat je neispravan zahtev", + "ro": "Cerere eronat\u0103 c\u0103tre serviciul de c\u0103utare", + "ru": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u043b\u0443\u0436\u0431\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f", + "eu": "Eskaera okerra aurkikuntza zerbitzuari" }, "descr_DISCOPARAMS": { "no": "Parametere sendt til discovery-tjenesten var ikke i korrekt format.", @@ -452,8 +503,12 @@ "zh": "\u53d1\u9001\u7ed9\u641c\u5bfb\u670d\u52a1\u7684\u53c2\u6570\u4e0d\u7b26\u5408\u89c4\u8303", "pl": "Parametry wys\u0142ane do us\u0142ugi wyszukiwania nie s\u0105 zgodne ze specyfikacj\u0105", "ar": "\u0627\u0644\u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0645\u0631\u0641\u0642\u0629 \u0644\u0627 \u062a\u0637\u0627\u0628\u0642 \u0627\u0644\u0645\u0648\u0627\u0635\u0641\u0627\u062a", + "lv": "Discovery servisam nos\u016bt\u012btie parametri neatbilst specifik\u0101cij\u0101m.", "id": "Parameter-parameter yang dikirimkan ke layanan penemuan tidak sesuai dengan spesifikasi", - "sr": "Parametri poslati servisu za lociranje nisu u ispravnom formatu." + "sr": "Parametri poslati servisu za lociranje nisu u ispravnom formatu.", + "ro": "Parametrii trimi\u0219i c\u0103tre serviciul de c\u0103utare nu sunt \u00een conformitate cu specifica\u021biile.", + "ru": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0443\u0436\u0431\u0443 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "eu": "Aurkikuntza zerbitzuari bidalitako prametroak ez dira zehaztapenera doitzen." }, "title_GENERATEAUTHNRESPONSE": { "no": "Fikk ikke svart p\u00e5 autentiserings-foresp\u00f8rsel", @@ -483,7 +538,11 @@ "zh": "\u65e0\u6cd5\u521b\u5efa\u8ba4\u8bc1\u5e94\u7b54", "sr": "Autentifikacioni odgovor nije mogao biti kreiran", "ar": "\u0644\u0627 \u064a\u0645\u0643\u0646\u0646\u0627 \u0627\u062c\u0631\u0627\u0621 \u0627\u0644\u062a\u0648\u062b\u064a\u0642", - "id": "Tidak dapat membuat respon autentifikasi" + "lv": "Neizdev\u0101s izveidot autentifik\u0101cijas atbildi", + "id": "Tidak dapat membuat respon autentifikasi", + "ro": "Nu a fost posibil\u0103 crearea r\u0103spunsului de autentificare", + "ru": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438", + "eu": "Ezin izan da kautotze erantzuna sortu" }, "descr_GENERATEAUTHNRESPONSE": { "no": "En feil oppsto da innloggingstjenesten pr\u00f8vde \u00e5 lage et svar p\u00e5 autentiserings-foresp\u00f8rselen.", @@ -504,7 +563,7 @@ "pl": "Wystapi\u0142 b\u0142ad podczas pr\u00f3by utworzenia przez Dostawc\u0119 To\u017csamo\u015bci odpowiedzi uwierzytelniania .", "cs": "P\u0159i vytv\u00e1\u0159en\u00ed p\u0159ihla\u0161ovac\u00ed odpov\u011bdi t\u00edmto poskytovatelem identity, vznikla chyba.", "tr": "Bu kimlik sa\u011flay\u0131c\u0131 bir kimlik do\u011frulama cevab\u0131 olu\u015fturuken hata olu\u015ftu.", - "lt": "\u0160iam tapatybi\u0173 tiek\u0117jui bandant sukurti autentikacijos atsakym\u0105 \u012fvyko klaida.", + "lt": "\u0160iam tapatybi\u0173 teik\u0117jui bandant sukurti autentikacijos atsakym\u0105 \u012fvyko klaida.", "it": "Si \u00e8 verificato un errore durante la fase di creazione della risposta di autenticazione da parte dell'Identity Provider.", "zh-tw": "\u7576\u9019\u500b\u9a57\u8b49\u63d0\u4f9b\u8005\u5617\u8a66\u5efa\u7acb\u4e00\u500b\u9a57\u8b49\u56de\u61c9\u6642\uff0c\u6709\u500b\u932f\u8aa4\u767c\u751f\u3002", "ja": "\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0\u306e\u8a8d\u8a3c\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u751f\u6210\u6642\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", @@ -513,7 +572,11 @@ "zh": "\u5728\u8fd9\u4e2a\u8eab\u4efd\u63d0\u4f9b\u8005\u521b\u5efa\u8ba4\u8bc1\u5e94\u7b54\u7684\u65f6\u5019\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef", "sr": "Desila se gre\u0161ka prilikom kreiranja autentifikacionog odgovora od strane ovog davaoca identiteta.", "ar": " \u062d\u062f\u062b \u062e\u0637\u0627 \u0639\u0646\u062f \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u062c\u0631\u0627\u0621 \u0627\u0644\u062a\u0648\u062b\u064a\u0642", - "id": "Ketika identity provider ini mencoba untuk membuat response autentifikasi, error terjadi." + "lv": "Kad identit\u0101tes pieg\u0101d\u0101t\u0101js m\u0113\u0123in\u0101ja izveigot autentifik\u0101cijas atbildi, rad\u0101s k\u013c\u016bda.", + "id": "Ketika identity provider ini mencoba untuk membuat response autentifikasi, error terjadi.", + "ro": "A ap\u0103rut o eroare c\u00e2nd furnizorul de identitate \u00eencerca s\u0103 creeze un r\u0103spuns de autentificare.", + "ru": "\u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043f\u043e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.", + "eu": "Identitatearen hornitzaileak errore bat antzeman du kautotze erantzuna sortzean." }, "title_LDAPERROR": { "no": "LDAP-feil", @@ -533,6 +596,7 @@ "pt": "Erro de LDAP", "pl": "B\u0142ad LDAP'a", "cs": "LDAP chyba", + "eu": "LDAP Errorea", "tr": "LDAP hatas\u0131", "lt": "LDAP klaida", "it": "Errore LDAP", @@ -543,7 +607,10 @@ "zh": "LDAP\u9519\u8bef", "sr": "LDAP gre\u0161ka", "ar": "\u062e\u0637\u0627 LDAP", - "id": "Error LDAP" + "lv": "LDAP k\u013c\u016bda", + "id": "Error LDAP", + "ro": "Eroare LDAP", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 LDAP" }, "descr_LDAPERROR": { "no": "LDAP er brukerkatalogen, og n\u00e5r du fors\u00f8ker \u00e5 logge inn pr\u00f8ver vi \u00e5 kontakten en LDAP-katalog. Da vi fors\u00f8kte det denne gangen, oppsto en feil.", @@ -551,7 +618,7 @@ "sv": "LDAP anv\u00e4nds som anv\u00e4ndardatabas och n\u00e4r du f\u00f6rs\u00f6ker logga m\u00e5ste LDAP-servern kontaktas. Vid f\u00f6rs\u00f6ket att kontakta LDAP-servern uppstod ett fel.", "es": "LDAP es la base de datos de usuarios, es necesario contactar con ella cuando usted decide entrar. Se ha producido un error en dicho acceso", "fr": "La base de donn\u00e9es utilisateur est un annuaire LDAP, et quand vous essayez de vous connecter, nous avons besoin de prendre contact avec cet annuaire LDAP. Lorsque nous avons essay\u00e9 cette fois une erreur s'est produite.", - "de": "LDAP ist die gew\u00e4hlte Nutzerdatenbank. Wenn sie versuchen sich anzumelden, muss auf diese LDAP-Datenbank zugegriffen werden, dabei ist dieses mal ein Fehler aufgetreten.", + "de": "LDAP ist die gew\u00e4hlte Nutzerdatenbank. Wenn Sie versuchen sich anzumelden, muss auf diese LDAP-Datenbank zugegriffen werden, dabei ist dieses mal ein Fehler aufgetreten.", "nl": "De account database is in LDAP opgeslagen en bij het inloggen moet er worden gecommuniceerd met een LDAP backend. Daarbij is een fout opgetreden.", "lb": "LDAP as eng Benotzerdatenbank an wann een anloggen well g\u00ebt se kontakt\u00e9iert. Dobai as des K\u00e9ier een Fehler geschitt.", "sl": "LDAP je zbirka uporabnikov. Ko se \u017eelite prijaviti, je potrebno prijavo preveriti v LDAPu. Pri trenutnem preverjanju je pri\u0161lo do napake.", @@ -564,7 +631,7 @@ "pl": "LDAP jest baz\u0105 uzytkownik\u00f3w i kiedy Ty pr\u00f3bujesz si\u0119 zalogowa\u0107, to my musimy nawi\u0105za\u0107 po\u0142\u0105czenie z baz\u0105 LDAP. I w\u0142a\u015bnie w tym momencie wyst\u0105pi\u0142 b\u0142\u0105d.", "cs": "LDAP je datab\u00e1ze u\u017eivatel\u016f, a kdy\u017e se chcete p\u0159ihl\u00e1sit, je pot\u0159eba se p\u0159ihl\u00e1sit do LDAP datab\u00e1ze. Chyba nastala b\u011bhem p\u0159ipojov\u00e1n\u00ed.", "tr": "LDAP kullan\u0131c\u0131 veritaban\u0131 ve siz giri\u015f yapmaya \u00e7al\u0131\u015f\u0131rken, LDAP veritaban\u0131na ba\u011flanmam\u0131z gerekiyor. Bu seferlik denerken bir sorun olu\u015ftu.", - "lt": "LDAP yra vartotoj\u0173 duomen\u0173 baz\u0117. Jums jungiantis, mums reikalinga prie jos prisijungti. Bandant tai padaryti \u012fvyko klaida.", + "lt": "LDAP yra naudotoj\u0173 duomen\u0173 baz\u0117. Jums jungiantis, mums reikalinga prie jos prisijungti. Bandant tai padaryti \u012fvyko klaida.", "it": "Gli utenti sono memorizzati nel server LDAP, che viene quindi contattato in fase di connessione dell'utente. Si \u00e8 verificato un errore proprio in questa fase.", "ja": "\u3042\u306a\u305f\u304c\u30ed\u30b0\u30a4\u30f3\u3092\u884c\u3046\u6642\u3001LDAP\u3068\u3044\u3046\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u30fc\u30d9\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u3053\u306e\u6642\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", "zh-tw": "LDAP \u662f\u4f7f\u7528\u9019\u8cc7\u6599\u5eab\uff0c\u7576\u60a8\u5617\u8a66\u767b\u5165\u6642\uff0c\u6211\u5011\u5fc5\u9808\u9023\u7d50\u81f3\u4e00\u500b LDAP \u8cc7\u6599\u5eab\u3002\u800c\u5728\u5617\u8a66\u6642\u6709\u500b\u932f\u8aa4\u767c\u751f\u3002", @@ -573,7 +640,11 @@ "zh": "LDAP\u662f\u4e00\u4e2a\u7528\u6237\u6570\u636e\u5e93\uff0c\u5f53\u4f60\u8bd5\u56fe\u767b\u5f55\u65f6\uff0c\u6211\u4eec\u9700\u8981\u8fde\u63a5\u5230LDAP\u6570\u636e\u5e93\uff0c\u7136\u800c\u8fd9\u6b21\u6211\u4eec\u8bd5\u56fe\u94fe\u63a5\u65f6\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef", "sr": "Podaci o korisni\u010dkim nalozima \u010duvaju se u LDAP bazi, a kada poku\u0161ate da se ulogujete vr\u0161i se provera da li Va\u0161e korisni\u010dko ime i lozinka postoje u LDAP bazi. Prilikom pristupa LDAP bazi, do\u0161lo je do gre\u0161ke.", "ar": "LDAP \u0647\u0648 \u0633\u062c\u0644 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645. \u0639\u0646\u062f\u0645\u0627 \u062a\u0633\u062c\u0644 \u062f\u062e\u0648\u0644\u0643 \u064a\u0646\u0628\u063a\u064a \u0639\u0644\u064a\u0646\u0627 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0633\u062c\u0644 LDAP. \u062d\u062f\u062b \u062e\u0637\u0627 \u0645\u0627 \u0639\u0646\u062f\u0645\u0627 \u062d\u0627\u0648\u0644\u0646\u0627 \u0630\u0644\u0643 \u0647\u0630\u0647 \u0627\u0644\u0645\u0631\u0629", - "id": "LDAP adalah database user, dan ketika Anda mencoba login, Kami perlu menghubungi database LDAP. Sebuah error terjadi ketika Kami mencobanya saat ini. " + "lv": "LDAP ir lietot\u0101ju datu b\u0101ze. Piesl\u0113dzoties pie t\u0101s ir j\u0101sp\u0113j piek\u013c\u016bt. \u0160oreiz tas neizdev\u0101s un rad\u0101s k\u013c\u016bda.", + "id": "LDAP adalah database user, dan ketika Anda mencoba login, Kami perlu menghubungi database LDAP. Sebuah error terjadi ketika Kami mencobanya saat ini. ", + "ro": "LDAP reprezint\u0103 o baz\u0103 de date cu utilizatori. C\u00e2nd \u00eencerca\u021bi s\u0103 v\u0103 autentifica\u021bi, trebuie contactat\u0103 o baz\u0103 de date LDAP. A ap\u0103rut o eroare c\u00e2nd s-a \u00eencercat aceast\u0103 opera\u021biune.", + "ru": "LDAP - \u044d\u0442\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u0440\u0438 \u0432\u0430\u0448\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 LDAP. \u041f\u0440\u0438 \u044d\u0442\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 LDAP \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. ", + "eu": "LDAP erabiltzaileen datu basea da, eta sartzea erabakitzen duzunean beharrezkoa da harekin harremanetan jartzea. Sartze ekintza horretan errore bat jazo da." }, "title_LOGOUTREQUEST": { "no": "Feil i behandling av logout-foresp\u00f8rselen", @@ -593,6 +664,7 @@ "pt": "Erro ao processar o pedido de logout", "pl": "B\u0142\u0105d przetwarzania \u017c\u0105dania wylogowania", "cs": "Chyba zpracov\u00e1n\u00ed odhla\u0161ovac\u00edho po\u017eadavku", + "eu": "Errorea saioa ixteko eskaera prozesatzean ", "tr": "\u00c7\u0131k\u0131\u015f \u0130ste\u011fini i\u015flerken hata olu\u015ftu", "lt": "Klaida vykdant atsijungimo u\u017eklaus\u0105", "it": "Errore nell'elaborazione della richiesta di disconnessione (Logout Request).", @@ -603,7 +675,10 @@ "zh": "\u5904\u7406\u9000\u51fa\u8bf7\u6c42\u65f6\u53d1\u751f\u9519\u8bef", "sr": "Gre\u0161ka pri obradi zahteva za odjavu", "ar": "\u062e\u0637\u0627 \u0639\u0646\u062f \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c", - "id": "Error memproses Request Logout" + "lv": "Atsl\u0113g\u0161an\u0101s piepras\u012bjuma apstr\u0101des k\u013c\u016bda", + "id": "Error memproses Request Logout", + "ro": "Eroare la procesarea cererii de deautentificare", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b " }, "descr_LOGOUTREQUEST": { "no": "En feil oppsto i behandlingen av logout-foresp\u00f8rselen.", @@ -623,6 +698,7 @@ "pt": "Ocorreu um erro ao processar o pedido de logout.", "pl": "Wyst\u0105pi\u0142 b\u0142ad podczas pr\u00f3by wylogowania.", "cs": "P\u0159i procesu odhl\u00e1\u0161en\u00ed vznikla chyba.", + "eu": "Errore bat jazo da saioa ixteko eskaera prozesatzean.", "tr": "\u00c7\u0131k\u0131\u015f \u0130ste\u011fini i\u015flemeye \u00e7al\u0131\u015f\u0131rken bir hata olu\u015ftu", "lt": "Klaida \u012fvyko bandant \u012fvykdyti atsijungimo u\u017eklaus\u0105.", "it": "Si \u00e8 verificato un errore quando si \u00e8 tentato di elaborare la richiesta di disconnessione (Logout Request).", @@ -633,7 +709,10 @@ "zh": "\u8bd5\u56fe\u5904\u7406\u9000\u51fa\u8bf7\u6c42\u65f6\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef", "sr": "Do\u0161lo je do gre\u0161ke prilikom poku\u0161aja obrade zahteva za odjavom.", "ar": "\u062e\u0637\u0627 \u0639\u0646\u062f \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c", - "id": "Sebuah error telah terjadi ketika memproses Request Logout." + "lv": "Apstr\u0101d\u0101jot atsl\u0113g\u0161an\u0101s piepras\u012bjumu, rad\u0101s k\u013c\u016bda.", + "id": "Sebuah error telah terjadi ketika memproses Request Logout.", + "ro": "A ap\u0103rut o eroare la procesarea cererii de deautentificare.", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b" }, "title_METADATA": { "no": "Feil ved lasting av metadata", @@ -663,7 +742,11 @@ "zh": "\u8f7d\u5165\u5143\u4fe1\u606f\u65f6\u53d1\u751f\u9519\u8bef", "sr": "Gre\u0161ka prilikom u\u010ditavanja metapodataka", "ar": "\u062e\u0637\u0627 \u0628\u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629\/ \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627 ", - "id": "Error meload metadata" + "lv": "Metadatu iel\u0101des k\u013c\u016bda", + "id": "Error meload metadata", + "ro": "Eroare la \u00eenc\u0103rcarea metadatelor", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", + "eu": "Errorea metadatuak kargatzean" }, "descr_METADATA": { "no": "Det er en feil i oppsettet for din simpleSAMLphp-installasjon. Hvis du er administrator for tjenesten, b\u00f8r du kontrollere at metadata er satt opp riktig.", @@ -671,7 +754,7 @@ "sv": "Det finns n\u00e5got fel i konfigurationen i installation av simpleSAMLphp. Om du \u00e4r adminstrat\u00f6r av tj\u00e4nsten ska du kontrollera om konfigurationen av metadata \u00e4r r\u00e4tt konfigurerad.", "es": "Hay errores de configuración en su instalación de simpleSAMLphp. Si es usted el administrador del servicio, cerciórese de que la configuración de los metadatos es correcta.", "fr": "Quelque chose n'est pas configur\u00e9 correctement dans votre installation de simpleSAMLphp. Si vous \u00eates l'administrateur de ce service, vous devez vous assurer que votre configuration des m\u00e9tadonn\u00e9es est correctement r\u00e9alis\u00e9e.", - "de": "Diese Installation von simpleSAMLphp ist falsch konfiguriert. Falls sie der Administrator dieses Dienstes sind, sollten sie sicherstellen das die Metadatenkonfiguration korrekt ist.", + "de": "Diese Installation von simpleSAMLphp ist falsch konfiguriert. Falls Sie der Administrator dieses Dienstes sind, sollten Sie sicherstellen, dass die Metadatenkonfiguration korrekt ist.", "nl": "SimplSAMLphp is niet goed geconfigureerd. De beheerder van deze dienst dient de metadata configuratie te controleren.", "lb": "Des simpleSAMLphp Installatioun sch\u00e9int falsch konfigur\u00e9iert ze sin. Wann dir den Administrator vun d\u00ebsem Service sid, dann stellt s\u00ebcher dass d Meta Donn\u00e9es richteg angeriicht sin.", "sl": "V konfiguraciji simpleSAMLphp-ja je napaka. \u010ce ste skrbnik te storitve, preverite, da je konfiguracija metapodatkov pravilna.", @@ -693,7 +776,11 @@ "sr": "Postoji gre\u0161ka u pode\u0161avanjima simpleSAMLphp-a. Ukoliko ste administrator ovog servisa, trebalo bi da proverite da li su metapodaci ispravno pode\u0161eni.", "pl": "Wykryto b\u0142\u0105d w konfiguracji simpleSAMLphp. Je\u015bli jeste\u015b administratorem tej us\u0142ugi, to sprawd\u017a, czy prawid\u0142owo zosta\u0142y skonfigurowane metadane.", "ar": "\u0647\u0646\u0627\u0643 \u062e\u0637\u0627 \u0628\u062a\u0631\u062a\u064a\u0628 simpleSAMLphp \u0627\u0644\u062e\u0627\u0635 \u0628\u0643. \u0627\u0646 \u0643\u0646\u062a \u0627\u0644\u0645\u0634\u0631\u0641 \u0639\u0644\u064a \u0627\u0644\u0645\u0648\u0642\u0639\u060c \u062a\u0623\u0643\u062f \u0631\u062c\u0627\u0621\u0627\u064b \u0645\u0646 \u0627\u0646 \u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627 \u0635\u062d\u064a\u062d", - "id": "Ada beberapa kesalahan konfigurasi pada instalasi simpleSAMLphp Anda. Jika Anda adalah administrator dari layanan ini, Anda harus memastikan konfigurasi metdata Anda telah disetup dengan benar. " + "lv": "J\u016bsu simpleSAMLphp instal\u0101cijas konfigur\u0101cij\u0101 ir k\u013c\u016bda. P\u0101rliecinieties, lai metadatu konfigur\u0101cija b\u016btu korekta.", + "id": "Ada beberapa kesalahan konfigurasi pada instalasi simpleSAMLphp Anda. Jika Anda adalah administrator dari layanan ini, Anda harus memastikan konfigurasi metdata Anda telah disetup dengan benar. ", + "ro": "Exist\u0103 o eroare \u00een configurarea simpleSAMLphp. Dac\u0103 sunte\u021bi administratorul acestui serviciu, verifica\u021bi configurarea metadatelor.", + "ru": "\u0412\u0430\u0448 simpleSAMLphp \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445.", + "eu": "Konfigurazio erroreak daude zure simpleSAMLphp-ren instalazioan. Zerbitzuaren administratzailea bazara, ziurta ezazu metadatuen konfigurazioa zuzena dela." }, "title_NOACCESS": { "no": "Ingen tilgang", @@ -723,7 +810,11 @@ "zh": "\u7981\u6b62\u8bbf\u95ee", "sr": "Pristup nije dozvoljen", "ar": "\u0645\u0645\u0646\u0648\u0639 \u0627\u0644\u062f\u062e\u0648\u0644", - "id": "Tiaak ada akses" + "lv": "Nav pieejas", + "id": "Tiaak ada akses", + "ro": "Accesul este interzis", + "ru": "\u041e\u0442\u043a\u0430\u0437 \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435", + "eu": "Sarrera zehaztu gabe" }, "descr_NOACCESS": { "no": "Dette endepunktet er ikke aktivert. Sjekk aktiveringsopsjonene i ditt simpleSAMLphp-oppsett.", @@ -741,7 +832,7 @@ "fi": "T\u00e4m\u00e4 p\u00e4\u00e4te ei ole otettu k\u00e4ytt\u00f6\u00f6n. Tarkasta enable-optiot simpleSAMLphp:n asetuksissa.", "pt-br": "Este par\u00e2metro n\u00e3o est\u00e1 ativado. Marque a op\u00e7\u00e3o habilitar na configura\u00e7\u00e3o do simpleSAMLphp.", "pt": "Este ponto de acesso (endpoint) n\u00e3o est\u00e1 dispon\u00edvel. Verifique as op\u00e7\u00f5es relevantes na configura\u00e7\u00e3o do simpleSAMLphp.", - "cs": "Tento koncov\u00fd bod nen\u00ed povolen. Zkontrolujte konfiguraci (enable options).", + "cs": "Tento koncov\u00fd bod nen\u00ed povolen. Zkontrolujte konfiguraci (zapn\u011bte volby).", "tr": "Bu k\u0131s\u0131m kullan\u0131mda de\u011fil. simpleSAMLphp ayarlar\u0131n\u0131z\u0131n etkinle\u015ftirme se\u00e7eneklerini kontrol edin.", "lt": "Baigties ta\u0161kas ne\u012fjungtas. Patikrinkite savo simpleSAMLphp konfig\u016bracij\u0105.", "it": "Questo endpoint non \u00e8 abilitato. Verifica le opzioni di attivazione nella configurazione di simpleSAMLphp.", @@ -753,7 +844,11 @@ "sr": "Pristup ovoj odredi\u0161noj adresa nije omogu\u0107en. Proverite pode\u0161avanja dozvola u simpleSAMLphp-u.", "pl": "Brak uprawnie\u0144. Sprawd\u017a opcj\u0119 enable w konfiguracji simpleSAMLphp.", "ar": "\u0647\u0630\u0647 \u0627\u0644\u0646\u0642\u0637\u0629 \u063a\u064a\u0631 \u0645\u0646\u0634\u0637\u0629. \u0631\u0627\u062c\u0639 \u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u0646\u0634\u064a\u0637 \u0628\u062a\u0631\u062a\u064a\u0628 simpleSAMLphp", - "id": "Endpoint ini tidak diaktifkan. Periksalah opsi enable pada konfigurasi simpleSAMLphp Anda." + "lv": "\u0160is beigu punkts nav iesp\u0113jots. P\u0101rbaudiet iesp\u0113jo\u0161anas opcijas simpleSAMLphp konfigur\u0101cij\u0101.", + "id": "Endpoint ini tidak diaktifkan. Periksalah opsi enable pada konfigurasi simpleSAMLphp Anda.", + "ro": "Acest cap\u0103t\/obiectiv nu este activat. Verifica\u021bi op\u021biunile de activare \u00een configurarea simpleSAMLphp.", + "ru": "\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043e\u043f\u0446\u0438\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u0430\u0448\u0435\u0433\u043e simpleSAMLphp.", + "eu": "Sarbide puntu hau ez dago gaituta. Egiazta itzazu simpleSAMLphp-aren konfigurazioan gaitze aukerak." }, "title_NORELAYSTATE": { "no": "Spesifikasjon av RelayState mangler", @@ -771,7 +866,7 @@ "fi": "Ei RelayState ", "pt-br": "Sem RelayState", "pt": "RelayState n\u00e3o definido", - "cs": "Nenalezen RelayState", + "cs": "Nenalezen RelayState.", "tr": "RelayState verilmemi\u015f.", "lt": "N\u0117ra perdavimo statuso", "it": "Nessun RelayState", @@ -783,7 +878,11 @@ "pl": "Brak RelayState", "zh": "\u65e0\u4f9d\u8d56\u72b6\u6001", "ar": "\u0627\u0646\u0639\u062f\u0627\u0645 \u0627\u0644\u062a\u0642\u0648\u064a\u0629", - "id": "Tidak ada RelayState" + "lv": "Nav RelayState", + "id": "Tidak ada RelayState", + "ro": "Nu exist\u0103 RelayState<\/i>", + "ru": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 RelayState", + "eu": "RelayState zehaztu gabe" }, "descr_NORELAYSTATE": { "no": "Kilden til denne foresp\u00f8rselen har ikke angitt noen RelayState-parameter som angir hvor vi skal fortsette etterp\u00e5.", @@ -813,7 +912,11 @@ "sr": "Servis koji je inicirao ovaj zahtjev nije poslao RelayState parametar koji sadr\u017ei adresu na koju treba preusmeriti korisnikov web pretra\u017eiva\u010d nakon uspe\u0161ne autentifikacije.", "pl": "Inicjator zlecenia nie dostarczy\u0142 parametru RelayState, wskazuj\u0105cego, gdzie przekaza\u0107 zlecenie.", "ar": "\u0644\u0645 \u064a\u0648\u0641\u0631 \u0637\u0627\u0644\u0628 \u0627\u0644\u062e\u062f\u0645\u0629 \u062e\u0635\u0627\u0626\u0635 \u062a\u0642\u0648\u064a\u0629 \u062a\u0642\u0648\u062f \u0644\u0644\u062e\u0637\u0648\u0629 \u0627\u0644\u062a\u0627\u0644\u064a\u0629", - "id": "Inisiator dari request ini tidak menyediakan parameter RelayState yang mengindikasikan kemana selanjutnya pergi." + "lv": "Piepras\u012bjuma veidot\u0101js nav nor\u0101d\u012bjis RelayState parametru, kas par\u0101d\u012btu, kurp iet t\u0101l\u0101k.", + "id": "Inisiator dari request ini tidak menyediakan parameter RelayState yang mengindikasikan kemana selanjutnya pergi.", + "ro": "Ini\u021biatorul acestei cereri nu a furnizat parametrul RelayState<\/i> care indic\u0103 urm\u0103torul pas.", + "ru": "\u0418\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 RelayState \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.", + "eu": "Eskaera honen abiarazleak ez du ematen ondoren nora joan adierazten duen RelayState parametroa" }, "title_PROCESSASSERTION": { "no": "Feil i behandling av svar fra innloggingstjenesten", @@ -834,7 +937,7 @@ "pl": "B\u0142\u0105d przetwarzania odpowiedzi od Dostawcy To\u017csamo\u015bci", "cs": "Chyba zpracov\u00e1n\u00ed odpov\u011bdi od poskytovatele identity", "tr": "Kimlik sa\u011flay\u0131c\u0131dan gelen cevab\u0131 i\u015flerken hata", - "lt": "Klaida apdorojant u\u017eklaus\u0105 i\u0161 tapatybi\u0173 tiek\u0117jo", + "lt": "Klaida apdorojant u\u017eklaus\u0105 i\u0161 tapatybi\u0173 teik\u0117jo", "it": "Errore nell'elaborazione della risposta ricevuta dall'Identity Provider.", "ja": "\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0\u304b\u3089\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", "zh-tw": "\u5f9e\u9a57\u8b49\u63d0\u4f9b\u8005\u53d6\u5f97\u932f\u8aa4\u57f7\u884c\u56de\u61c9", @@ -843,7 +946,11 @@ "zh": "\u5904\u7406\u6765\u81ea\u8eab\u4efd\u63d0\u4f9b\u8005\u7684\u5e94\u7b54\u65f6\u51fa\u9519", "sr": "Gre\u0161ka pri obradi odgovora koji je poslao Davalac Identeteta", "ar": "\u062e\u0637\u0627 \u0628\u0625\u062c\u0631\u0627\u0621\u0627\u062a \u0645\u0639\u0627\u0645\u0644\u0629 \u0625\u062c\u0627\u0628\u0627\u062a \u0645\u0642\u062f\u0645 \u0627\u0644\u0647\u0648\u064a\u0629", - "id": "Error memproses response dari Identity Provider." + "lv": "Identit\u0101tes pieg\u0101d\u0101t\u0101ja atbildes apstr\u0101des k\u013c\u016bda", + "id": "Error memproses response dari Identity Provider.", + "ro": "Eroare la procesarea r\u0103spunsului primit de la furnizorul de identitate", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0442\u043a\u043b\u0438\u043a\u0430 \u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438", + "eu": "Errorea IdP-tik datorren erantzuna prozesatzean" }, "descr_PROCESSASSERTION": { "no": "Svaret mottatt fra innloggingstjenesten kan ikke aksepteres.", @@ -864,7 +971,7 @@ "pl": "Nie zakceptowali\u015bmy odpowiedzi wys\u0142anej przez Dostawc\u0119 To\u017csamo\u015bci.", "cs": "Neakceptujeme odpov\u011b\u010f zaslanou poskytovatelem identity.", "tr": "Kimlik Sa\u011flay\u0131c\u0131'dan gelen cevab\u0131 kabul etmedik.", - "lt": "Mes nepriimame u\u017eklausos, si\u0173stos i\u0161 tapatybi\u0173 tiek\u0117jo.", + "lt": "Mes nepriimame u\u017eklausos, si\u0173stos i\u0161 tapatybi\u0173 teik\u0117jo.", "it": "Non \u00e8 stata accettata una risposta proveniente dall'Identity Provider.", "ja": "\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0\u304b\u3089\u9001\u4fe1\u3055\u308c\u305f\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u53d7\u3051\u4ed8\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002", "zh-tw": "\u6211\u5011\u7121\u6cd5\u65bc\u9a57\u8b49\u63d0\u4f9b\u8005\u5b8c\u6210\u56de\u61c9\u50b3\u9001\u3002", @@ -873,7 +980,11 @@ "zh": "\u6211\u4eec\u4e0d\u63a5\u53d7\u6765\u81ea\u8eab\u4efd\u63d0\u4f9b\u8005\u7684\u5e94\u7b54", "sr": "Odgovor koji je poslao Davalac Identiteta nije prihva\u0107en.", "ar": "\u0644\u0645 \u0646\u0642\u0628\u0644 \u0625\u062c\u0627\u0628\u0627\u062a \u0645\u0642\u062f\u0645 \u0627\u0644\u0647\u0648\u064a\u0629", - "id": "Kami tidak menerima response yang dikirimlan dari Identity Provider." + "lv": "Netiek akcept\u0113ta atbilde no identit\u0101tes pieg\u0101d\u0101t\u0101ja.", + "id": "Kami tidak menerima response yang dikirimlan dari Identity Provider.", + "ro": "R\u0103spunsul de la acest furnizor de identitate nu a fost acceptat.", + "ru": "\u041e\u0442\u043a\u043b\u0438\u043a \u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d.", + "eu": "Ezin izan da identitatearen hornitzaileak bidalitako erantzuna onartu." }, "title_PROCESSAUTHNREQUEST": { "no": "Feil ved behandling av foresp\u00f8rsel fra SP", @@ -892,9 +1003,9 @@ "pt-br": "Erro processando o pedido do Provedor de Servi\u00e7os.", "pt": "Erro ao processar o pedido do fornecedor de servi\u00e7o (SP)", "pl": "B\u0142\u0105d przetwarzania \u017c\u0105dania od Dostawcy Serwisu", - "cs": "'Chyba prov\u00e1d\u011bn\u00ed \u017e\u00e1dosti poskytovatele slu\u017eby", + "cs": "Chyba prov\u00e1d\u011bn\u00ed \u017e\u00e1dosti poskytovatele slu\u017eby", "tr": "Servis Sa\u011flay\u0131c\u0131'dan gelen iste\u011fi i\u015flerken hata", - "lt": "Klaida siun\u010diant u\u017eklaus\u0105 i\u0161 paslaug\u0173 tiek\u0117jo", + "lt": "Klaida siun\u010diant u\u017eklaus\u0105 i\u0161 paslaug\u0173 teik\u0117jo", "it": "Errore nell'elaborazione della richiesta dal Service Provider", "ja": "\u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0\u304b\u3089\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", "zh-tw": "\u5f9e\u9a57\u8b49\u63d0\u4f9b\u8005\u5f97\u5230\u932f\u8aa4\u57f7\u884c\u8acb\u6c42", @@ -903,7 +1014,11 @@ "zh": "\u5904\u7406\u6765\u81ea\u670d\u52a1\u63d0\u4f9b\u8005\u7684\u8bf7\u6c42\u65f6\u51fa\u9519", "sr": "Gre\u0161ka prilikom obrade zahteva koji je poslao Davalac Servisa", "ar": "\u062e\u0637\u0627 \u0628\u0645\u0639\u0627\u0645\u0644\u0629 \u0637\u0644\u0628 \u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629", - "id": "Error memproses request dari Service Provider" + "lv": "Servisa pieg\u0101d\u0101t\u0101ja piepras\u012bjuma apstr\u0101des k\u013c\u016bda", + "id": "Error memproses request dari Service Provider", + "ro": "Eroare la procesarea r\u0103spunsului primit de la furnizorul de servicii", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430", + "eu": "Errorea zerbitzu hornitzailearen eskaera prozesatean " }, "descr_PROCESSAUTHNREQUEST": { "no": "Innloggingstjenesten mottok en autentiserings-foresp\u00f8rsel fra en tjeneste, men en feil oppsto i behandling av foresp\u00f8rselen.", @@ -921,9 +1036,9 @@ "fi": "Identiteetintarjoaja sai tunnistautumispyynn\u00f6n palveluntarjoajalta, mutta pyynnin k\u00e4sittelyss\u00e4 tapahtui virhe.", "pt-br": "Este Provedor de Identidade recebeu um Pedido de Autentica\u00e7\u00e3o de um Provedor de Servi\u00e7os, mas um erro ocorreu ao tentar processar o pedido.", "pt": "Ocorreu um erro ao processar o pedido de autentica\u00e7\u00e3o emitido pelo fornecedor de servi\u00e7o.", - "cs": "Tento poskytovatel identity p\u0159ijak po\u017eadavek od poskytovatele slu\u017eby, ale p\u0159i jeho prov\u00e1den\u00ed vznikla chyba.", + "cs": "Tento poskytovatel identity p\u0159ijal po\u017eadavek od poskytovatele slu\u017eby, ale p\u0159i jeho prov\u00e1den\u00ed vznikla chyba.", "tr": "Bu Kimlik Sa\u011flay\u0131c\u0131 bir Servis Sa\u011flay\u0131c\u0131'dan kimlik do\u011frulama iste\u011fi ald\u0131, ancak bu iste\u011fi i\u015flemeye \u00e7al\u0131\u015f\u0131rken bir hata olu\u015ftu.", - "lt": "\u0160is tapatybi\u0173 tiek\u0117jas gavo autentikacijos pra\u0161ymo u\u017eklaus\u0105 i\u0161 paslaugos tiek\u0117jo, ta\u010diau apdorojant prane\u0161im\u0105 \u012fvyko klaida.", + "lt": "\u0160is tapatybi\u0173 tiek\u0117jas gavo autentikacijos pra\u0161ymo u\u017eklaus\u0105 i\u0161 paslaugos teik\u0117jo, ta\u010diau apdorojant prane\u0161im\u0105 \u012fvyko klaida.", "it": "Questo Identity Provider ha ricevuto una richiesta di autenticazione da parte di un Service Provider, ma si \u00e8 verificato un errore durante l'elaborazione di quest'ultima", "ja": "\u3053\u306e\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0\u306f\u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0\u304b\u3089\u306e\u8a8d\u8a3c\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u4ed8\u3051\u307e\u3057\u305f\u304c\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002", "zh-tw": "\u9019\u500b\u9a57\u8b49\u63d0\u4f9b\u8005\u6536\u5230\u4e00\u500b\u670d\u52d9\u63d0\u4f9b\u8005\u7684\u8a8d\u8b49\u8acb\u6c42\uff0c\u4f46\u5728\u6e96\u5099\u57f7\u884c\u9019\u500b\u8acb\u6c42\u6642\u767c\u751f\u932f\u8aa4\u3002", @@ -933,7 +1048,11 @@ "sr": "Davalac Identiteta je primio zahtev za autentikacijom od strane Davaoca Servisa, ali se javila gre\u0161ka prilikom poku\u0161aja obrade ovog zahteva.", "pl": "Dostawca to\u017csamo\u015bci otrzyma\u0142 od dostawcy us\u0142ugi zlecenie uwierzytelnienia, ale wyst\u0105pi\u0142 b\u0142\u0105d podczas przetwarzania zlecenia.", "ar": "\u062d\u0635\u0644 \u0645\u0642\u062f\u0645 \u0627\u0644\u0647\u0648\u064a\u0629 \u0647\u0630\u0627 \u0639\u0644\u064a \u0637\u0644\u0628 \u062a\u0648\u062b\u064a\u0642 \u0645\u0646 \u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629 \u0644\u0643\u0646 \u062d\u062f\u062b \u062e\u0637\u0627 \u0628\u0627\u0644\u0625\u062c\u0631\u0627\u0621\u0627\u062a ", - "id": "Identity Provider ini menerima Request Autentifikasi dari sebuah Service Provider, tetapi error terjadi ketika memproses request." + "lv": "Identit\u0101tes pieg\u0101d\u0101t\u0101js ir sa\u0146\u0113mis autentifik\u0101cijas piepras\u012bjumu no servisa pieg\u0101d\u0101t\u0101ja, bet to apstr\u0101d\u0101jot rad\u0101s k\u013c\u016bda.", + "id": "Identity Provider ini menerima Request Autentifikasi dari sebuah Service Provider, tetapi error terjadi ketika memproses request.", + "ro": "Acest furnizor de identitate a primit o cerere de autentificare de la un furnizor de servicii, dar a ap\u0103rut o eroare la procesarea cererii.", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430, \u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.", + "eu": "IdP honek zerbitzu hornitzaile baten kautotze eskaera jaso du baina errore bat jazo da hau prozesatzen saiatzean." }, "title_SLOSERVICEPARAMS": { "no": "Ingen SAML-melding angitt", @@ -963,7 +1082,11 @@ "sr": "Nije dostavljena SAML poruka", "pl": "Nie dostarczono komunikatu SAML", "ar": "\u0644\u0645 \u064a\u062a\u0645 \u062a\u0642\u062f\u064a\u0645 \u0631\u0633\u0627\u0644\u0629 SAML", - "id": "Tidak pesan SAML yang disediakan" + "lv": "Nav SAML zi\u0146ojuma", + "id": "Tidak pesan SAML yang disediakan", + "ro": "Nu a fost furnizat mesajul SAML", + "ru": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 SAML ", + "eu": "SAML mezua falta da" }, "descr_SLOSERVICEPARAMS": { "no": "Du brukte SingleLogoutService-grensesnittet uten \u00e5 angi enten en SAML LogoutRequest eller en LogoutResponse.", @@ -993,7 +1116,11 @@ "sr": "Pristupili ste interfejsu za jedinstvenu odjavu sa sistema, ali niste poslali SAML LogoutRequest<\/i> ili LogoutResponse<\/i> poruku.", "pl": "Zosta\u0142a wywo\u0142ana us\u0142uga SingleLogoutService, ale nie dostarczono komunikatu SAML LogoutRequest lub LogoutResponse.", "ar": "\u0644\u0642\u062f \u0648\u0635\u0644\u062a \u0644\u0646\u0642\u0637\u0629 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0627\u0644\u0645\u0648\u062d\u062f \u0644\u0643\u0646\u0643 \u0644\u0645 \u062a\u0648\u0641\u0631 \u0637\u0644\u0628 \u062a\u0633\u062c\u064a\u0644 \u062e\u0631\u0648\u062c SAML \u0627\u0648 \u0627\u0633\u062a\u062c\u0627\u0628\u0629 \u0644\u0637\u0644\u0628 \u0627\u0644\u062e\u0631\u0648\u062c", - "id": "Anda mengakses antarmuka SingleLogout, tetapi tidak menyediakan LogoutRequest SAML atau LogoutResponse." + "lv": "J\u016bs izmantojat SingleLogoutService interfeisu, bet neesat devis SAML atsl\u0113g\u0161an\u0101s piepras\u012bjumu vai atsl\u0113g\u0161an\u0101s atbildi.", + "id": "Anda mengakses antarmuka SingleLogout, tetapi tidak menyediakan LogoutRequest SAML atau LogoutResponse.", + "ro": "A\u021bi accesat interfa\u021ba SingleLogoutService<\/i>, dar nu a\u021bi furnizat o cerere de deautentificare sau un r\u0103spuns de deautentificare SAML.", + "ru": "\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 SingleLogoutService, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 SAML LogoutRequest \u0438\u043b\u0438 LogoutResponse \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.", + "eu": "SingleLogoutService interfazera sartu zara baina ez duzu erantsi SAML LogoutRequest edo LogoutResponse mezurik" }, "title_ACSPARAMS": { "no": "Ingen SAML-respons angitt", @@ -1023,7 +1150,11 @@ "sr": "Nije dostavljen SAML odgovor", "pl": "Nie dostarczo odpowiedzi SAML", "ar": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0627\u0633\u062a\u062c\u0627\u0628\u0629 SAML", - "id": "Tidak ada response SAML yang disediakan" + "lv": "Nav SAML atbildes", + "id": "Tidak ada response SAML yang disediakan", + "ro": "Nu a fost furnizat r\u0103spunsul SAML", + "ru": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 SAML \u043e\u0442\u043a\u043b\u0438\u043a", + "eu": "SAML erantzuna falta da" }, "descr_ACSPARAMS": { "no": "Du brukte AssertionConsumerService-grensesnittet uten \u00e5 angi en SAML AuthenticationResponse.", @@ -1041,7 +1172,7 @@ "fi": "Yritit Assertion Consumer Service-liittym\u00e4\u00e4n, mutta et tarjonnut SAML tunnistautumisvastausta.", "pt-br": "Voc\u00ea acessou a interface do Assertion Consumer Service, mas n\u00e3o forneceu uma SAML Authentication Response.", "pt": "Na interface Assertion Consumer Service deve fornecer uma mensagem SAML do tipo Authentication Response.", - "cs": "P\u0159istupujete k Assertion Consumer Service rozhran\u00ed, ale nepos\u00ed\u00e1late SAML Authentication Response.", + "cs": "P\u0159istupujete k Assertion Consumer Service rozhran\u00ed, ale nepos\u00edl\u00e1late SAML Authentication Response.", "tr": "Onay Al\u0131c\u0131 Servis (Assertion Consumer Service) aray\u00fcz\u00fcne giri\u015f yapt\u0131n\u0131z, ancak SAML Kimlik Do\u011frulama Cevab\u0131 sa\u011flamad\u0131n\u0131z.", "lt": "J\u016bs pasiek\u0117te vartotoj\u0173 aptarnavimo servis\u0105, ta\u010diau nepateik\u0117te SAML autentikacijos atsakymo.", "it": "Hai acceduto all'interfaccia di Assertion Consumer Service, ma senza fornire un messaggio SAML di Authentication Response.", @@ -1053,7 +1184,11 @@ "sr": "Pristupili ste sistemu za obradu SAML potvrda, ali niste dostavili SAML autentikacioni odgovor.", "pl": "Zosta\u0142a wywo\u0142ana us\u0142uga Assertion Consumer Service, ale nie dostarczono komunikatu SAML 'Authentication Response'", "ar": "\u0644\u0642\u062f \u0648\u0635\u0644\u062a \u0644\u0646\u0637\u0627\u0642 \u062a\u0623\u0643\u064a\u062f \u062e\u062f\u0645\u0629 \u0632\u0628\u0648\u0646 \u0644\u0643\u0646\u0643 \u0644\u0645 \u062a\u0648\u0641\u0631 \u0627\u0633\u062a\u062c\u0627\u0628\u0629 \u062a\u0648\u062b\u064a\u0642 SAML", - "id": "Anda mengakses antarnyka Assertion Consumer Service, tetapi tidak menyediakan Response Autentifikasi SAML. " + "lv": "J\u016bs izmantojat Assertion Consumer Service interfeisu, bet neesat devis SAML autentifik\u0101cijas atbildi.", + "id": "Anda mengakses antarnyka Assertion Consumer Service, tetapi tidak menyediakan Response Autentifikasi SAML. ", + "ro": "A\u021bi accesat interfa\u021ba Assertion Consumer Service<\/i> dar nu a\u021bi furnizat r\u0103spunsul de autentificare SAML.", + "ru": "\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 Assertion Consumer Service, \u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u0438\u043a SAML \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.", + "eu": "Baieztapen kontsumitzailearen interfazera sartu zara baina ez duzu SAML kautotze erantzun bat erantsi." }, "title_CASERROR": { "no": "CAS-feil", @@ -1072,7 +1207,7 @@ "pt-br": "Erro CAS", "pt": "Erro de CAS", "pl": "B\u0142\u0105d CAS", - "cs": "CAS Chyba", + "cs": "CAS chyba", "tr": "CAS Hatas\u0131", "lt": "CAS klaida", "it": "Errore CAS", @@ -1083,7 +1218,11 @@ "zh": "CAS\u9519\u8bef", "sr": "CAS gre\u0161ka", "ar": "\u062e\u0637\u0627 CAS", - "id": "Error CAS" + "lv": "CAS k\u013c\u016bda", + "id": "Error CAS", + "ro": "Eroare CAS", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 CAS", + "eu": "CAS Errorea" }, "descr_CASERROR": { "no": "Feil i kommunikasjonen med CAS-tjeneren.", @@ -1113,7 +1252,11 @@ "sr": "Gre\u0161ka prilikom komunikacije sa CAS serverom.", "pl": "B\u0142\u0105d podczas komunikacji z serwerem CAS", "ar": "\u062e\u0637\u0627 \u0639\u0646\u062f \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 CAS", - "id": "Error ketika berkomunikasi dengans server CAS." + "lv": "K\u013c\u016bda komunic\u0113jot ar CAS serveri.", + "id": "Error ketika berkomunikasi dengans server CAS.", + "ro": "Eroare de comunicare cu serverul CAS.", + "ru": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u043c\u0435\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c CAS.", + "eu": "Errorea CAS zerbitzariarekin komunikatzen saiatzean" }, "title_CONFIG": { "no": "Feil i oppsettet", @@ -1143,7 +1286,11 @@ "zh": "\u914d\u7f6e\u9519\u8bef", "sr": "Gre\u0161ka u pode\u0161avanjima", "ar": "\u062e\u0637\u0627 \u0628\u0627\u0644\u062a\u0631\u062a\u064a\u0628", - "id": "Error konfigurasi" + "lv": "Konfigur\u0101cijas k\u013c\u016bda", + "id": "Error konfigurasi", + "ro": "Eroare de configurare", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438", + "eu": "Konfigurazio errorea" }, "descr_CONFIG": { "no": "Det virker som det er en feil i oppsettet av simpleSAMLphp.", @@ -1173,7 +1320,11 @@ "zh": "simpleSAMLphp\u51fa\u73b0\u914d\u7f6e\u9519\u8bef", "sr": "Izgleda da postoji gre\u0161ka u pode\u0161avanjima simpleSAMLphp-a.", "ar": "\u064a\u0628\u062f\u0648 \u0627\u0646 \u062a\u0631\u062a\u064a\u0628 simpleSAMLphp \u063a\u064a\u0631 \u0635\u062d\u064a\u062d", - "id": "simpleSAMLphp sepertinya telah salah dikonfigurasi" + "lv": "simpleSAMLphp nav pareizi nokonfigur\u0113ts.", + "id": "simpleSAMLphp sepertinya telah salah dikonfigurasi", + "ro": "Probleme la configurarea simpleSAMLphp.", + "ru": "\u0412\u0438\u0434\u0438\u043c\u043e, simpleSAMLphp \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.", + "eu": "Badirudi errore bat jazo dela simpleSAMLphp-en konfigurazioan" }, "title_NOTSET": { "no": "Passordet er ikke satt", @@ -1203,7 +1354,11 @@ "zh": "\u6ca1\u6709\u8bbe\u7f6e\u5bc6\u7801", "sr": "Lozinka nije postavljena", "ar": "\u0644\u0645 \u062a\u0642\u0645 \u0628\u062a\u062d\u062f\u064a\u062f \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631", - "id": "Password tidak diset" + "lv": "Parole nav uzst\u0101d\u012bta", + "id": "Password tidak diset", + "ro": "Parola nu este configurat\u0103", + "ru": "\u041f\u0430\u0440\u043e\u043b\u044c \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d", + "eu": "Pasahitzik ez da ezarrii" }, "descr_NOTSET": { "no": "Admin passordet i konfigurasjonen (auth.adminpassword) er ikke satt til noe annet enn default verdien. Bytt passord i config.php.", @@ -1211,7 +1366,7 @@ "sv": "Konfigurationsl\u00f6senordet (auth.adminpassword) \u00e4r inte \u00e4ndrat fr\u00e5n standardv\u00e4rdet. Uppdatera kongiruationen med ett nytt l\u00f6senord!", "es": "La clave de acceso del fichero de configuraci\u00f3n (auth.adminpassword) no ha sido cambiada de su valor por defecto. Por favor, edite dicho fichero", "fr": "Le mot de passe dans la configuration (auth.adminpassword) n'a pas \u00e9t\u00e9 chang\u00e9 par rapport \u00e0 la valeur par d\u00e9faut. Veuillez modifier la configuration.", - "de": "Sie benutzen noch immer das Standardpasswort, bitte \u00e4ndern sie die Konfiguration (auth.adminpassword).", + "de": "Sie benutzen noch immer das Standardpasswort, bitte \u00e4ndern Sie die Konfiguration (auth.adminpassword).", "nl": "Het default wachtwoord in de configuratie (auth.adminpassword) is niet aangepast; pas de configuratie aan aub.", "lb": "D'Passwuert an der Konfiguration (auth.adminpassword) as bis elo net ge\u00e4nnertgin. W.e.g aennert daat an der Konfiguratioun.", "sl": "V nastavitvah je geslo skrbnika (auth.adminpassword) \u0161e vedno nastavljeno na za\u010detno vrednost. Spremenite ga!", @@ -1233,7 +1388,11 @@ "sr": "Administratorska lozinka u pode\u0161avanjima(parametar auth.adminpassword<\/i>) i dalje ima izvornu vrednost. Molimo Vas izmenite konfiguracioni fajl.", "pl": "Has\u0142o w konfiguracji (auth.adminpassword) ma domy\u015bln\u0105 warto\u015b\u0107. Prosz\u0119 poprawi\u0107 konfiguracj\u0119.", "ar": "\u0644\u0645 \u062a\u0642\u0645 \u0628\u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0628\u0627\u0644\u062a\u0631\u062a\u064a\u0628 (auth.adminpassword). \u0631\u062c\u0627\u0621\u0627\u064b \u0642\u0645 \u0628\u062a\u062d\u0631\u064a\u0631 \u0645\u0644\u0641 \u0627\u0644\u062a\u0631\u062a\u064a\u0628", - "id": "Password di konfigurasi (auth.adminspassword) tidak berubah dari nilai default. Silahkan edit file konfigurasi." + "lv": "Konfigur\u0101cij\u0101 auth.adminpassword parolei ir noklus\u0113t\u0101 v\u0113rt\u012bba, t\u0101 nav main\u012bta. L\u016bdzu nomainiet to, labojot failu.", + "id": "Password di konfigurasi (auth.adminspassword) tidak berubah dari nilai default. Silahkan edit file konfigurasi.", + "ro": "Parola din configurare (auth.adminpassword<\/i>) este cea implicit\u0103, v\u0103 rug\u0103m s\u0103 o modifica\u021bi.", + "ru": "\u041f\u0430\u0440\u043e\u043b\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (auth.adminpassword) \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.", + "eu": "Ez da aldatu konfigurazio fitxategiaren pasahitzaren (auth.adminpassword) balio lehenetsia. Mesedez, edita ezazu fitxategia" }, "title_NOTVALIDCERT": { "no": "Ugyldig sertifikat", @@ -1263,7 +1422,11 @@ "zh": "\u65e0\u6548\u7684\u8bc1\u4e66", "sr": "Neispravan sertifikat", "ar": "\u0634\u0647\u0627\u062f\u0629 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u0629", - "id": "Sertifikat invalid" + "lv": "Neder\u012bgs sertifik\u0101ts", + "id": "Sertifikat invalid", + "ro": "Certificat nevalid", + "ru": "\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Ziurtagiri balio gabea" }, "descr_NOTVALIDCERT": { "no": "Du presenterte ikke et gyldig sertifikat", @@ -1282,7 +1445,7 @@ "pt-br": "Voc\u00ea n\u00e3o possui um certificado v\u00e1lido", "pt": "N\u00e3o foi apresentado um certificado v\u00e1lido.", "pl": "Nie przedstawi\u0142e\u015b prawid\u0142owego certyfikaty", - "cs": "Nep\u0159edlo\u017e\u00edl jste validn\u00ed certifik\u00e1t.", + "cs": "Nep\u0159edlo\u017eil jste validn\u00ed certifik\u00e1t.", "tr": "Ge\u00e7erli bir sertifika sa\u011flamad\u0131n\u0131z. ", "lt": "J\u016bs nepateik\u0117te teisingo sertifikato.", "it": "Non hai fornito un certificato valido.", @@ -1293,7 +1456,11 @@ "zh": "\u4f60\u6ca1\u6709\u63d0\u4ea4\u4e00\u4e2a\u6709\u6548\u7684\u8bc1\u4e66", "sr": "Niste dostavili validan setifikat.", "ar": "\u0644\u0645 \u062a\u0642\u062f\u0645 \u0634\u0647\u0627\u062f\u0629 \u0635\u062d\u064a\u062d\u0629", - "id": "Anda tidak menyediakan sertifikat yang valid." + "lv": "J\u016bs neesat nor\u0101d\u012bjis der\u012bgu sertifik\u0101tu.", + "id": "Anda tidak menyediakan sertifikat yang valid.", + "ro": "Nu a\u021bi oferit un certificat valid.", + "ru": "\u0412\u044b \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442.", + "eu": "Ez duzu baliozko ziurtagiririk aurkeztu " }, "errorreport_header": { "no": "Feilrapport sent", @@ -1312,6 +1479,7 @@ "pt": "Relat\u00f3rio de erro enviado", "pl": "Raport o b\u0142\u0119dzie wys\u0142any", "cs": "Chybov\u00fd report zasl\u00e1n", + "eu": "Errore txostena bidalita", "tr": "Hata raporu g\u00f6nderildi", "lt": "Prane\u0161imas apie klaid\u0105 i\u0161si\u0173stas", "it": "Rapporto dell'errore inviato", @@ -1321,8 +1489,11 @@ "he": "\u05e0\u05e9\u05dc\u05d7 \u05d3\u05d5\u05d7 \u05e9\u05d2\u05d9\u05d0\u05d4", "zh": "\u53d1\u9001\u9519\u8bef\u62a5\u544a", "ar": "\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062a\u0642\u0631\u064a\u0631 \u0639\u0646 \u0627\u0644\u062e\u0637\u0623 ", + "lv": "K\u013c\u016bdas zi\u0146ojums nos\u016bt\u012bts", "id": "Laporan error dikirimkan", - "sr": "Prijava gre\u0161ke poslata" + "sr": "Prijava gre\u0161ke poslata", + "ro": "Raportul cu erori a fost trimis", + "ru": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e" }, "errorreport_text": { "no": "Feilrapport er sent til administrator.", @@ -1341,6 +1512,7 @@ "pt": "O relat\u00f3rio de erro foi enviado aos administradores", "pl": "Raport o b\u0142\u0119dzie zosta\u0142 wys\u0142any do administrator\u00f3w.", "cs": "Chybov\u00fd report byl zasl\u00e1n administr\u00e1tor\u016fm.", + "eu": "Errore txostena administratzaileei bidali zaie.", "tr": "Hata raporu y\u00f6neticilere g\u00f6nderildi", "lt": "Prane\u0161imas apie klaid\u0105 i\u0161si\u0173stas administratoriams.", "it": "Il rapporto dell'errore \u00e8 stato inviato agli amministratori.", @@ -1350,8 +1522,11 @@ "he": "\u05d3\u05d5\u05d7 \u05d4\u05e9\u05d2\u05d9\u05d0\u05d4 \u05e0\u05e9\u05dc\u05d7 \u05dc\u05de\u05e0\u05d4\u05dc \u05d4\u05de\u05e2\u05e8\u05db\u05ea.", "zh": "\u9519\u8bef\u62a5\u544a\u5df2\u7ecf\u53d1\u9001\u7ed9\u7ba1\u7406\u5458", "ar": "\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062a\u0642\u0631\u064a\u0631 \u0639\u0646 \u0627\u0644\u062e\u0637\u0623 \u0644\u0644\u0645\u0634\u0631\u0641", + "lv": "K\u013c\u016bdas zi\u0146ojums administratoriem ir nos\u016bt\u012bts.", "id": "Laporan error telah dikirimkan ke administrator", - "sr": "Prijava gre\u0161ke poslata je administratorima." + "sr": "Prijava gre\u0161ke poslata je administratorima.", + "ro": "Raportul cu erori a fost trimis c\u0103tre administratori.", + "ru": "\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c." }, "title_LOGOUTINFOLOST": { "no": "Informasjon om utlogging er tapt", @@ -1379,8 +1554,12 @@ "zh": "\u4e22\u5931\u4e86\u9000\u51fa\u6d88\u606f", "pl": "Utracono informacj\u0119 o wylogowaniu", "ar": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0641\u0642\u0648\u062f\u0629", + "lv": "Atsl\u0113g\u0161an\u0101s inform\u0101cija zaud\u0113ta", "id": "Informasi logout hilang", - "sr": "Informacija o odjavljivanju je izgubljena" + "sr": "Informacija o odjavljivanju je izgubljena", + "ro": "Informa\u021bia de deautentificare a fost pierdut\u0103", + "ru": "\u041f\u043e\u0442\u0435\u0440\u044f\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u044b\u0445\u043e\u0434\u0435.", + "eu": "Saioa ixteko informazioa galdu da" }, "descr_LOGOUTINFOLOST": { "no": "Informasjonen om den n\u00e5v\u00e6rende utloggingen har g\u00e5tt tapt. Du b\u00f8r g\u00e5 tilbake til den opprinnelige tjesesten og pr\u00f8ve \u00e5 logge ut p\u00e5 nytt. Informasjon om utloggingsoperasjoner er kun lagret i en begrenset tid - vanligvis noen timer. Dette er lengere tid enn en vanlig utlogging skal ta, s\u00e5 denne feilen kan tyde p\u00e5 at noe er galt med oppsettet. Ta kontakt med tjenesteyteren hvis problemet gjentar seg.", @@ -1388,7 +1567,7 @@ "sv": "Informationen om aktuell utloggning har f\u00f6rsvunnit. Du b\u00f6r \u00e5terv\u00e4nda till tj\u00e4nsten som du f\u00f6rs\u00f6kte logga ut fr\u00e5n och f\u00f6rs\u00f6ka logga ut p\u00e5 nytt. Detta fel kan intr\u00e4ffa om informationen om utloggningen \u00e4r f\u00f6r gammal. Utloggningsinformationen sparas en begr\u00e4nsad tid, oftas n\u00e5gra timmar. Det \u00e4r l\u00e4ngre \u00e4n vad utloggning b\u00f6r ta s\u00e5 felet kan indikera n\u00e5got fel med konfigurationen. Om problemet kvarst\u00e5r kontakta leverant\u00f6ren f\u00f6r den tj\u00e4nst du f\u00f6rs\u00f6kte logga ut fr\u00e5n.", "es": "La informaci\u00f3n sobre la operaci\u00f3n de cierre de sesi\u00f3n se ha perdido. Deber\u00eda volver al servicio del que intenta salir e intentar cerrar la sesi\u00f3n de nuevo. La informaci\u00f3n para cerrar la sesi\u00f3n se almacena durante un tiempo limitado, generalmente mucho m\u00e1s tiempo del que deber\u00eda tardar la operaci\u00f3n de cierre de sesi\u00f3n, de modo que este error puede deberse a algun error en la configuraci\u00f3n. Si el problema persiste, contacte con el proveedor del servicio.", "fr": "Information de d\u00e9connexion perdue. Les informations aff\u00e9rentes \u00e0 la proc\u00e9dure de d\u00e9connexion en cours ont \u00e9t\u00e9 perdues. Tentez de retourner au service depuis lequel vous avez tent\u00e9 de lancer la d\u00e9connexion, et essayez encore. Cette erreur peut \u00eatre caus\u00e9e par un probl\u00e8me d'obsolescence des information de d\u00e9connexion, qui ne sont conserv\u00e9es que durant un temps limit\u00e9, de l'ordre de quelques heures. Cette dur\u00e9e est bien plus longue qu'une op\u00e9ration de d\u00e9connexion typique, ce qui sugg\u00e8re une autre erreur dans la configuration. Si le probl\u00e8me persiste, contactez l'administrateur du fournisseur de service.", - "de": "Die Information des aktuellen Abmeldevorgangs ist verloren gegangen. Bitte rufen sie den Dienst auf, vom dem sie sich abmelden wollten, und versuchen sie dort das Abmelden nochmal. Dieser Fehler tritt auf, wenn die Abmeldeanfrage abl\u00e4uft, da diese nur eine gewisse Zeit (\u00fcblicherweise ein paar Stunden) zwischengespeichert wird. Das sollte im normalen Betrieb ausreichend sein, da ein Abmeldevorgang nicht so lange dauert. Dieser Fehler kann also auch ein Anzeichen sein, da\u00df ein Konfigurationsfehler vorliegt. Tritt dieser Fehler wiederholt auf, wenden sie sich bitte an den benutzen Dienst (Service Provider), vom dem sie sich abmelden wollen.", + "de": "Die Information des aktuellen Abmeldevorgangs ist verloren gegangen. Bitte rufen Sie den Dienst auf, vom dem Sie sich abmelden wollten, und versuchen Sie dort das Abmelden nochmal. Dieser Fehler tritt auf, wenn die Abmeldeanfrage abl\u00e4uft, da diese nur eine gewisse Zeit (\u00fcblicherweise ein paar Stunden) zwischengespeichert wird. Das sollte im normalen Betrieb ausreichend sein, da ein Abmeldevorgang nicht so lange dauert. Dieser Fehler kann also auch ein Anzeichen sein, dass ein Konfigurationsfehler vorliegt. Tritt dieser Fehler wiederholt auf, wenden sie sich bitte an den benutzen Dienst (Service Provider), vom dem sie sich abmelden wollen.", "nl": "De informatie over de huidige logout operatie is verloren gegaan. Je zou nu moeten terugkeren naar de dienst waar je probeerde uit te loggen, om het nogmaals te proberen. Deze fout kan optreden wanneer de logout informatie is verlopen. De logout informatie wordt gedurende een beperkte tijdsduur bewaard, normaal gesproken een aantal uren. Dit is langer dan een normale logout operatie zou moeten duren, dus deze fout kan er op wijzen dat er een configuratie probleem is. Als het probleem zich blijft voordoen kun u contact opnemen met de Service Provider.", "sl": "Odjavni (Logout) parametri niso na voljo. Vrnite se na storitev, ki ste jo pravkar uporabljali in se ponovno poskusite odjaviti. Napaka je posledica poteka veljavnosti seje.", "da": "Oplysningerne om logout er tabt. Du b\u00f8r g\u00e5 tilbage til tjenesten du \u00f8nskede at logge ud af og pr\u00f8ve igen. Fejlen kan skyldes at oplysningerne blev for\u00e6ldet, da de kun gemmes i kort tid, typisk et par timer. Dette er dog l\u00e6ngere end hvad det burde tage at logge ud, s\u00e5 denne fejl kan indikere en konfigurationsfejl. Hvis fejlen genopst\u00e5r, bedes du kontakte tjenesteudbyderen.", @@ -1399,7 +1578,7 @@ "pt": "A informa\u00e7\u00e3o acerca da opera\u00e7\u00e3o de logout foi perdida. Por favor, volte ao servi\u00e7o de onde efectuou o logout e tente de novo esta opera\u00e7\u00e3o. A informa\u00e7\u00e3o de logout possui um tempo de expira\u00e7\u00e3o que \u00e9 normalmente muito superior ao tempo normal de processamento desta opera\u00e7\u00e3o. Se o problema persistir pode ser um erro de configura\u00e7\u00e3o e dever\u00e1 ser comunicado.", "cs": "Informace o odhla\u0161ovac\u00ed operaci byla ztracena. M\u016f\u017eete se vr\u00e1tit do aplikace, ze kter\u00e9 jste se odhla\u0161ovali a zkusit to znova. Tato chyba byla zp\u016fsobena vypr\u0161en\u00edm odhla\u0161ovac\u00edh informac\u00ed. Ty jsou ulo\u017eeny omezen\u00fd \u010das (jednotky hodin). To by m\u011blo sta\u010di na norm\u00e1ln\u00ed odhla\u0161en\u00ed a tato chyba m\u016f\u017ee ukazovat na chyby v konfiguraci. Pokud probl\u00e9m p\u0159etrv\u00e1v\u00e1, kontaktujte administr\u00e1tora.", "tr": "Y\u00fcr\u00fcrl\u00fckteki \u00e7\u0131k\u0131\u015f i\u015flemi ile ilgili bilgi kayboldu. \u00c7\u0131kmak istedi\u011finiz servise geri d\u00f6n\u00fcn ve yeniden \u00e7\u0131kmay\u0131 denyin. Bu hata, \u00e7\u0131k\u0131\u015f bilgisinin s\u00fcresi doldu\u011fu i\u00e7in olu\u015fmu\u015f olabilir. \u00c7\u0131k\u0131\u015f bilgisi belirli bir s\u00fcre i\u00e7in tutulur - genellikle birka\u00e7 saat. Bu s\u00fcre normal bir \u00e7\u0131k\u0131\u015f i\u015fleminin tutaca\u011f\u0131ndan daha fazla bir s\u00fcredir; bu hata yap\u0131land\u0131rma ile ilgili ba\u015fka bir hatay\u0131 i\u015faret ediyor olabilir. E\u011fer sorun devam ederse, servis sa\u011flay\u0131c\u0131n\u0131zla ileti\u015fime ge\u00e7iniz.", - "lt": "Informacija apie atsijungimo operacij\u0105 prarasta. J\u016bs tur\u0117tum\u0117te sugr\u012f\u017eti \u012f t\u0105 paslaug\u0105, i\u0161 kurios band\u0117te atsijungti ir pabandyti atlikti tai dar kart\u0105. \u0160i klaida gal\u0117jo b\u016bti sukelta, nes baig\u0117si atsijungimo informacijos galiojimo laikas. Informacija apie atsijungim\u0105 yra saugoma ribot\u0105 laiko tarp\u0105 - da\u017eniausiai kelias valandas. Tai yra daugiau nei bet kokia normali atsijungimo informacija gali u\u017etrukti, taigi \u0161i klaida gali b\u016bti sukelta kitos klaidos, kuri \u012fvyko d\u0117l konfig\u016bracijos. Jei problema t\u0119siasi, susisiekite su savo paslaugos tiek\u0117ju.", + "lt": "Informacija apie atsijungimo operacij\u0105 prarasta. J\u016bs tur\u0117tum\u0117te sugr\u012f\u017eti \u012f t\u0105 paslaug\u0105, i\u0161 kurios band\u0117te atsijungti ir pabandyti atlikti tai dar kart\u0105. \u0160i klaida gal\u0117jo b\u016bti sukelta, nes baig\u0117si atsijungimo informacijos galiojimo laikas. Informacija apie atsijungim\u0105 yra saugoma ribot\u0105 laiko tarp\u0105 - da\u017eniausiai kelias valandas. Tai yra daugiau nei bet kokia normali atsijungimo informacija gali u\u017etrukti, taigi \u0161i klaida gali b\u016bti sukelta kitos klaidos, kuri \u012fvyko d\u0117l konfig\u016bracijos. Jei problema t\u0119siasi, susisiekite su savo paslaugos teik\u0117ju.", "it": "Le informazioni riguardo all'attuale operazione di disconnessione sono andate perse. Si dovrebbe tornare al servizio da cui si cercava di disconnettersi e provare di nuovo. Questo errore pu\u00f2 essere causato dal termine della validit\u00e0 delle informazioni di disconnessione. Le informazioni per la disconnessione sono conservate per un breve arco temporale, in genere alcune ore. Questo \u00e8 un tempo superiore a quello che una operazione di disconnessione dovrebbe richiedere, quindi questo errore pu\u00f2 indicare un problema di configurazione di qualche altro tipo. Se il problema persiste, consultare il fornitore del service provider.", "zh-tw": "\u907a\u5931\u6b63\u5728\u767b\u51fa\u7684\u76f8\u95dc\u64cd\u4f5c\u8cc7\u8a0a\uff0c\u60a8\u53ef\u80fd\u8981\u56de\u5230\u60a8\u6e96\u5099\u767b\u51fa\u7684\u670d\u52d9\u518d\u767b\u51fa\u4e00\u6b21\u3002\u9019\u500b\u932f\u8aa4\u53ef\u80fd\u662f\u56e0\u70ba\u767b\u51fa\u8cc7\u8a0a\u903e\u6642\u3002\u767b\u51fa\u8cc7\u8a0a\u50c5\u80fd\u5728\u6709\u9650\u7684\u6642\u9593\u88e1\u6709\u6548 - \u901a\u5e38\u662f\u5e7e\u5c0f\u6642\u3002\u9019\u5df2\u7d93\u5927\u65bc\u6b63\u5e38\u7684\u767b\u51fa\u64cd\u4f5c\u6240\u9700\u7684\u6642\u9593\uff0c\u6240\u4ee5\u9019\u500b\u932f\u8aa4\u4e5f\u8a31\u8aaa\u660e\u6709\u4e9b\u5176\u4ed6\u7684\u932f\u8aa4\u88ab\u8a2d\u5b9a\u3002\u5982\u679c\u9019\u500b\u932f\u8aa4\u6301\u7e8c\u5b58\u5728\uff0c\u8acb\u9023\u7d61\u60a8\u7684\u670d\u52d9\u63d0\u4f9b\u8005\u3002", "ja": "The information about the current logout operation has been lost. You should return to the service you were trying to log out from and try to log out again. This error can be caused by the logout information expiring. The logout information is stored for a limited amout of time - usually a number of hours. This is longer than any normal logout operation should take, so this error may indicate some other error with the configuration. If the problem persists, contact your service provider.", @@ -1408,8 +1587,12 @@ "zh": "\u5173\u4e8e\u5f53\u524d\u9000\u51fa\u64cd\u4f5c\u7684\u76f8\u5173\u4fe1\u606f\u4e22\u5931\u4e86\uff0c\u4f60\u5e94\u8be5\u8fd4\u56de\u670d\u52a1\u4e2d\uff0c\u91cd\u65b0\u5c1d\u8bd5\u9000\u51fa\uff0c\u8fd9\u4e2a\u9519\u8bef\u53ef\u80fd\u662f\u9000\u51fa\u4fe1\u606f\u8d85\u65f6\u5f15\u8d77\u7684\u3002\u9000\u51fa\u6d88\u606f\u5728\u6709\u9650\u7684\u65f6\u95f4\u5185\u5b58\u50a8\uff0c\u901a\u5e38\u662f\u51e0\u4e2a\u5c0f\u65f6\uff0c\u8fd9\u6bd4\u4efb\u4f55\u5e38\u89c4\u7684\u9000\u51fa\u65f6\u95f4\u6240\u9700\u7684\u65f6\u95f4\u8981\u957f\u591a\u4e86\uff0c\u6240\u4ee5\u8fd9\u79cd\u9519\u8bef\u53ef\u80fd\u662f\u914d\u7f6e\u9519\u8bef\uff0c\u5982\u679c\u95ee\u9898\u4f9d\u65e7\u5b58\u5728\uff0c\u8054\u7cfb\u4f60\u7684\u670d\u52a1\u63d0\u4f9b\u5546", "pl": "Utracono informacj\u0119 o przebiegu operacji wylogowania. Powr\u00f3\u0107 do us\u0142ugi, z kt\u00f3rej pr\u00f3bowa\u0142e\u015b si\u0119 wylogowa\u0107 i pon\u00f3w pr\u00f3b\u0119. Ten b\u0142\u0105d mo\u017ce by\u0107 spowodowany przeterminowaniem informacji o wylogowaniu. Informacja o wylogowaniu jest przechowywana przez okre\u015blony czas, zwykle kilka godzin. Jest to d\u0142u\u017cej ni\u017c mo\u017ce zaj\u0105\u0107 operacja wylogowania, wi\u0119c b\u0142\u0105d mo\u017ce mie\u0107 inn\u0105 przyczyn\u0119, np. mo\u017ce oznacza\u0107 b\u0142\u0119dn\u0105 konfiguracj\u0119. Je\u015bli problem utrzymuje si\u0119, skontaktuj si\u0119 z dostawc\u0105 us\u0142ugi.", "ar": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0627\u0644\u062d\u0627\u0644\u064a \u0645\u0641\u0642\u0648\u062f\u0629. \u0639\u062f \u0644\u0635\u0641\u062d\u0629 \u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629 \u0648 \u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0631\u0629 \u0627\u062e\u0631\u064a. \u064a\u062d\u062f\u062b \u0647\u0630\u0627 \u0627\u0644\u062e\u0637\u0623 \u0646\u062a\u064a\u062c\u0629 \u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0635\u0644\u0627\u062d\u064a\u0629 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0627\u0644\u062a\u064a \u062a\u062d\u0641\u0638 \u0644\u0641\u062a\u0631\u0629 \u0645\u062d\u062f\u062f\u0629- \u0639\u062f\u0629 \u0633\u0627\u0639\u0627\u062a \u0639\u0627\u062f\u0629. \u0641\u062a\u0631\u0629 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0647\u0630\u0647 \u0623\u0637\u0648\u0644 \u0645\u0646 \u0627\u0644\u0645\u0639\u062a\u0627\u062f \u0645\u0645\u0627 \u064a\u062f\u0644 \u0639\u0644\u064a \u0648\u062c\u0648\u062f \u0623\u062e\u0637\u0627\u0621 \u0627\u062e\u0631\u064a \u0628\u0627\u0644\u062a\u0631\u062a\u064a\u0628. \u0627\u0630\u0627 \u0648\u0627\u062c\u0647\u062a\u0643 \u0647\u0630\u0647 \u0627\u0644\u0645\u0634\u0643\u0644\u0629 \u0645\u0631\u0629 \u0627\u062e\u0631\u064a \u0642\u0645 \u0631\u062c\u0627\u0621\u0627\u064b \u0628\u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629", + "lv": "Inform\u0101cija par atsl\u0113g\u0161an\u0101s oper\u0101ciju ir pazaud\u0113ta. Jums j\u0101atgrie\u017eas pie servisa, no kura m\u0113\u0123in\u0101j\u0101t atsl\u0113gties, un j\u0101m\u0113\u0123ina atsl\u0113gties v\u0113lreiz. K\u013c\u016bda var rasties, ja atsl\u0113g\u0161an\u0101s norit p\u0101r\u0101k ilgi. Inform\u0101cija par atsl\u0113g\u0161anos tiek glab\u0101ta vair\u0101kas stundas. Tas ir ilg\u0101k nek\u0101 parasti norit atsl\u0113g\u0161an\u0101s proced\u016bra, t\u0101d\u0113\u013c \u0161\u012b k\u013c\u016bda var nor\u0101d\u012bt uz k\u013c\u016bdu konfigur\u0101cij\u0101. Ja probl\u0113ma turpin\u0101s, sazinieties ar servisa pieg\u0101d\u0101t\u0101ju.", "id": "Informasi tentang operasi logout saat ini telah hilang. Anda harus kembali ke layanan tempat Anda mencoba logout dan mencoba melakukan proses logout kembali. Error ini dapat disebabakan oleh informasi logout yang telah kadaluarsa. Informasi logout disimpan untuk waktu yang terbatas - biasanya dalam bilangan jam. Waktu ini lebih lama dari operasi logout normal umumnya, jadi error ini mungkin mengindikasikan beberapa erro lain pada konfigurasi. Jika masalah tetap terjadi, hubungi service provider Anda.", - "sr": "Informacija o aktuelnom zahtevu za odjavljivanjem se izgubila. Preporu\u010dujemo da se vratite u aplikaciju iz koje ste se hteli odjaviti i poku\u0161ate da se odjavite ponovo. Ova gre\u0161ka mo\u017ee biti uzrokovana istekom validnosti zahteva za odjavom. Zahtev se skladi\u0161ti odre\u0111eno vreme - po pravilu nekoliko sati. Obzirom da je to du\u017ee nego \u0161to bi bilo koja operacija odjavljivanja trebala trajati, gre\u0161ka koja se pojavila mo\u017ee upu\u0107ivati na gre\u0161ku u pode\u0161avanjima. Ukoliko se problem nastavi, kontaktirajte administratora aplikacije." + "sr": "Informacija o aktuelnom zahtevu za odjavljivanjem se izgubila. Preporu\u010dujemo da se vratite u aplikaciju iz koje ste se hteli odjaviti i poku\u0161ate da se odjavite ponovo. Ova gre\u0161ka mo\u017ee biti uzrokovana istekom validnosti zahteva za odjavom. Zahtev se skladi\u0161ti odre\u0111eno vreme - po pravilu nekoliko sati. Obzirom da je to du\u017ee nego \u0161to bi bilo koja operacija odjavljivanja trebala trajati, gre\u0161ka koja se pojavila mo\u017ee upu\u0107ivati na gre\u0161ku u pode\u0161avanjima. Ukoliko se problem nastavi, kontaktirajte administratora aplikacije.", + "ro": "Informa\u021bia de deautentificare pentru aceast\u0103 opera\u021biune a fost pierdut\u0103. V\u0103 rug\u0103m s\u0103 v\u0103 \u00eentoarce\u021bi la serviciul din care a\u021bi \u00eencercat s\u0103 v\u0103 deautentifica\u021bi \u0219i s\u0103 \u00eencerca\u021bi din nou. Aceast\u0103 eroare poate fi cauzat\u0103 de expirarea informa\u021biei de deautentificare. Informa\u021bia de deautentificare este stocat\u0103 pentru un timp limitat, dar de obicei c\u00e2teva ore, ceea ce eate mai mult dec\u00e2t poate dura \u00een mod obi\u0219nuit o opera\u021biune de deautentificare. Prin urmare, mesajul poate indica o alt\u0103 eroare de configurare. Dac\u0103 problema persist\u0103, v\u0103 rug\u0103m s\u0103 contacta\u021bi furnizorul de servicii.", + "ru": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u0430. \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0443, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c \u0432\u044b\u0439\u0442\u0438 \u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0439\u0442\u0438 \u0441\u043d\u043e\u0432\u0430. \u042d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u044b\u0445\u043e\u0434\u0435. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u044b\u0445\u043e\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0437\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 - \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e\u0438\u0445 \u0447\u0430\u0441\u043e\u0432. \u042d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0430, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443.", + "eu": "Saioa ixteko eragiketari buruzko informazioa galdu da. Irten nahi duzun zerbitzura itzuli eta saioa berriz ixten saitu behar duzu. Saioa ixteko informazioa denbora mugatu batean gordetzen da, orokorrean saio ixteko eragiketak iraun beharko lukeen denbora baino gehiago, beraz errore hau konfigurazioan erroreren bat jazo delako gerta liteke. Errorea etengabea bada, jar zaitez harremanetan zerbitzuaren hornitzailearekin." }, "title_UNHANDLEDEXCEPTION": { "no": "Uh\u00e5ndtert feil", @@ -1436,8 +1619,12 @@ "zh": "\u672a\u5904\u7406\u7684\u5f02\u5e38", "pl": "Nieobs\u0142ugiwany b\u0142\u0105d", "ar": "\u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u063a\u064a\u0631 \u0645\u0639\u0627\u0644\u062c", + "lv": "Nezin\u0101ma k\u013c\u016bda", "id": "Exception yang tidak tertangani", - "sr": "Neobra\u0111ena gre\u0161ka" + "sr": "Neobra\u0111ena gre\u0161ka", + "ro": "Excep\u021bie netratat\u0103", + "ru": "\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435", + "eu": "Kudeatu gabeko salbuespena" }, "descr_UNHANDLEDEXCEPTION": { "no": "En uventet feilsituasjon oppstod", @@ -1453,7 +1640,7 @@ "hu": "Kezeletlen kiv\u00e9tel (exception) keletkezett.", "pt-br": "Uma exce\u00e7\u00e3o n\u00e3o tratada foi descartada.", "pt": "Foi despoletada um excep\u00e7\u00e3o que n\u00e3o foi tratada.", - "cs": "Neo\u010dek\u00e1van\u00e1 v\u00fdj\u00edmka vznikla.", + "cs": "Neo\u010dek\u00e1van\u00e1 vyj\u00edmka vznikla.", "tr": "Bir beklenmeyen durum g\u00f6nderildi.", "lt": "Ne\u017einoma klaida.", "it": "E' stata generata un'eccezione che non \u00e8 stata gestita.", @@ -1464,8 +1651,12 @@ "zh": "\u629b\u51fa\u4e00\u4e2a\u672a\u5904\u7406\u7684\u5f02\u5e38", "pl": "Zosta\u0142 zwr\u00f3cony b\u0142\u0105d, kt\u00f3ry nie mo\u017ce by\u0107 obs\u0142u\u017cony", "ar": "\u062a\u0645 \u0627\u0644\u062a\u062e\u0644\u0635 \u0645\u0646 \u0627\u0633\u062a\u062b\u0646\u0627\u0621 \u063a\u064a\u0631 \u0645\u0639\u0627\u0644\u062c", + "lv": "Noticis nezin\u0101ms iz\u0146\u0113muma gad\u012bjums.", "id": "Exception yang tidak tertangani telah di-thrown", - "sr": "Pojavila se gre\u0161ka koja ne mo\u017ee do kraja biti obra\u0111ena." + "sr": "Pojavila se gre\u0161ka koja ne mo\u017ee do kraja biti obra\u0111ena.", + "ro": "A ap\u0103rut o excep\u021bie netratat\u0103.", + "ru": "\u0412\u044b\u0434\u0430\u043d\u043e \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.", + "eu": "Kudeatu gabeko salbuespen bat abiarazi da" }, "title_NOTFOUND": { "no": "Kan ikke finne siden", @@ -1493,8 +1684,12 @@ "he": "\u05d3\u05e3 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0", "zh": "\u9875\u9762\u6ca1\u6709\u627e\u5230", "ar": "\u0627\u0644\u0635\u0641\u062d\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f\u0629", + "lv": "Lapa nav atrasta", "id": "Halaman tidak ditemukan", - "sr": "Stranica nije prona\u0111ena" + "sr": "Stranica nije prona\u0111ena", + "ro": "Pagina nu a fost g\u0103sit\u0103", + "ru": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", + "eu": "Ez da orria aurkitu" }, "descr_NOTFOUND": { "no": "Den angitte siden finnes ike. URLen var: %URL%", @@ -1522,8 +1717,12 @@ "he": "\u05d4\u05d3\u05e3 \u05d4\u05d4\u05de\u05d1\u05d5\u05e7\u05e9 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0. \u05d4\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d9\u05d9\u05ea: %URL%", "zh": "\u6ca1\u6709\u627e\u5230\u7ed9\u5b9a\u7684URL\uff1a%URL%", "ar": "\u0627\u0644\u0635\u0641\u062d\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f\u0629. \u0627\u0644\u0639\u0646\u0648\u0627\u0646 %URL%", + "lv": "Nor\u0101d\u012bt\u0101 lapa nav atrasta. Saite: %URL%", "id": "Halaman yang diminta tidak dapat ditemukan. URL nya adalah %URL%", - "sr": "Tra\u017eena stranica nije prona\u0111ena. Adresa stranice je: %URL%" + "sr": "Tra\u017eena stranica nije prona\u0111ena. Adresa stranice je: %URL%", + "ro": "Pagina nu a fost g\u0103sit\u0103, URL-ul a fost urm\u0103torul: %URL%", + "ru": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430. \u0421\u0441\u044b\u043b\u043a\u0430 \u0431\u044b\u043b\u0430: %URL%", + "eu": "Ez da aurkitu adierazi duzun orria. URLa hau da: %URL%" }, "title_NOTFOUNDREASON": { "no": "Kan ikke finne siden", @@ -1551,8 +1750,12 @@ "he": "\u05d3\u05e3 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0", "zh": "\u9875\u9762\u6ca1\u6709\u627e\u5230", "ar": "\u0627\u0644\u0635\u0641\u062d\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f\u0629", + "lv": "Lapa nav atrasta", "id": "Halaman tidak ditemukan", - "sr": "Stranica nije prona\u0111ena" + "sr": "Stranica nije prona\u0111ena", + "ro": "Pagina nu a fost g\u0103sit\u0103", + "ru": "\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430", + "eu": "Ez da orria aurkitu" }, "descr_NOTFOUNDREASON": { "no": "Den angitte siden finnes ikke. Grunnen er: %REASON%. URLen var: %URL%", @@ -1580,8 +1783,12 @@ "he": "\u05d4\u05d3\u05e3 \u05d4\u05e0\u05d9\u05ea\u05df \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0. \u05d4\u05e1\u05d9\u05d1\u05d4 \u05d4\u05d9\u05d9\u05ea\u05d4 %REASON% \u05d5\u05d4\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d9\u05d9\u05ea\u05d4 %URL%", "zh": "\u7ed9\u5b9a\u7684\u9875\u9762\u6ca1\u6709\u627e\u5230\uff0c\u539f\u56e0: %REASON%; URL: %URL%", "ar": "\u0627\u0644\u0635\u0641\u062d\u0629 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f\u0629. \u0627\u0644\u0633\u0628\u0628 %REASON% \u0648 \u0627\u0644\u0639\u0646\u0648\u0627\u0646 %URL%", + "lv": "Nor\u0101d\u012bt\u0101 lapa nav atrasta. Iemesls: %REASON% Saite: %URL%", "id": "Halaman yang diminta tidak ditemykan, Error-nya adalah: %REASON% URL-nya adalah: %URL%", - "sr": "Tra\u017eena stranica nije prona\u0111ena. Razlog: %REASON% Adresa stranice je: %URL%" + "sr": "Tra\u017eena stranica nije prona\u0111ena. Razlog: %REASON% Adresa stranice je: %URL%", + "ro": "Pagina nu a fost g\u0103sit\u0103, motivul a fost urm\u0103torul: %REASON%, URL-ul a fost: %URL%", + "ru": "\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430: %REASON% \u0421\u0441\u044b\u043b\u043a\u0430: %URL%", + "eu": "Ez da aurkitu adierazi duzun orria. Arrazoia hau da: %REASON% URL hau da: %URL%" }, "title_BADREQUEST": { "no": "Feil foresp\u00f8rsel motatt", @@ -1609,8 +1816,12 @@ "he": "\u05d4\u05ea\u05e7\u05d1\u05dc\u05d4 \u05d1\u05e7\u05e9\u05d4 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9\u05ea", "zh": "\u6536\u5230\u4e86\u9519\u8bef\u7684\u8bf7\u6c42", "ar": "\u0627\u0633\u062a\u0642\u0628\u0627\u0644 \u0637\u0644\u0628 \u0633\u064a\u0621", + "lv": "Sa\u0146emts nepareizs piepras\u012bjums", "id": "Request buruk diterima", - "sr": "Dobijeni zahtev nije ispravan" + "sr": "Dobijeni zahtev nije ispravan", + "ro": "S-a primit o cerere incorect\u0103", + "ru": "\u041f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u043a\u043b\u0438\u043a", + "eu": "Eskaera oker bat jaso da." }, "descr_BADREQUEST": { "no": "En feil oppsto i foresp\u00f8rselen til denne siden. Grunnen var: %REASON%", @@ -1637,8 +1848,12 @@ "zh": "\u8bf7\u6c42\u8be5\u9875\u7684\u8bf7\u6c42\u5b58\u5728\u9519\u8bef\uff0c\u539f\u56e0\uff1a%REASON%", "pl": "Wyst\u0105pi\u0142 nast\u0119puj\u0105cy b\u0142\u0105d w zleceniu: %REASON%", "ar": "\u062e\u0637\u0627 \u0628\u0637\u0644\u0628 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629. \u0627\u0644\u0633\u0628\u0628 %REASON%", + "lv": "K\u013c\u016bdains piepras\u012bjums \u0161ai lapai. Iemesls: %REASON%", "id": "Terjadi error pada request ke halaman ini. Alasannya adalah: %REASON%", - "sr": "Dogodila se gre\u0161ka prilikom dohvatanja ove stranice. Razlog: %REASON%" + "sr": "Dogodila se gre\u0161ka prilikom dohvatanja ove stranice. Razlog: %REASON%", + "ro": "Exist\u0103 o eroare \u00een cererea c\u0103tre aceast\u0103 pagin\u0103. Motivul este: %REASON%", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u041f\u0440\u0438\u0447\u0438\u043d\u0430: %REASON%", + "eu": "Errore bat dago orri honen eskaeran. Arrazoia hau da: %REASON%" }, "title_WRONGUSERPASS": { "no": "Feil brukernavn og passord", @@ -1666,8 +1881,12 @@ "he": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9 \u05d0\u05d5 \u05e1\u05d9\u05e1\u05de\u05d4 \u05dc\u05d0 \u05e0\u05db\u05d5\u05e0\u05d9\u05dd", "zh": "\u4e0d\u6b63\u786e\u7684\u7528\u6237\u540d\u6216\u5bc6\u7801", "ar": "\u0627\u0633\u0645 \u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0648 \u0643\u0644\u0645\u0629 \u0633\u0631 \u062e\u0637\u0627 ", + "lv": "Nekorekts lietot\u0101ja v\u0101rds vai parole", "id": "Username atau password salah", - "sr": "Neispravno korisni\u010dko ime ili lozinka" + "sr": "Neispravno korisni\u010dko ime ili lozinka", + "ro": "Nume de utilizator incorect sau parol\u0103 incorect\u0103", + "ru": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c", + "eu": "Erabiltzaile-izena edo pasahitz okerra" }, "descr_WRONGUSERPASS": { "no": "Enten var brukernavnet, eller kombinasjonen med brukernavn og passord feil. Sjekk brukernavn og passord og pr\u00f8v igjen.", @@ -1675,7 +1894,7 @@ "sv": "Antingen finns det ingen anv\u00e4ndare med angiven anv\u00e4ndaridentitet eller s\u00e5 har du angivit fel l\u00f6senord. F\u00f6rs\u00f6k igen.", "es": "No existe un usuario con el identificador indicado, o la contrase\u00f1a indicada es incorrecta. Por favor revise el identificador de usuario e int\u00e9ntelo de nuevo.", "fr": "Utilisateur inexistant, ou mot de passe incorrect. V\u00e9rifiez le nom d'utilisateur, et r\u00e9-essayez.", - "de": "Entweder es konnte kein Nutzer mit dem angegebenen Nutzernamen gefunden werden oder das Passwort ist falsch. \u00dcberpr\u00fcfen sie die Zugangsdaten und probieren sie es nochmal.", + "de": "Entweder es konnte kein Nutzer mit dem angegebenen Nutzernamen gefunden werden oder das Passwort ist falsch. \u00dcberpr\u00fcfen Sie die Zugangsdaten und probieren Sie es nochmal.", "nl": "De opgegeven gebruikersnaam bestaat niet, of het wachtwoord is ongeldig. Verifieer de gebruikersnaam en probeer het nogmaals.", "sl": "Uporabnika s tem uporabni\u0161kim imenom ni bilo mogo\u010de najti ali pa je vpisano geslo napa\u010dno. Preverite svoje uporabni\u0161ko ime in poskusite znova.", "da": "Enten kunne brugeren ikke findes eller ogs\u00e5 var kodeordet forkert. Pr\u00f8v igen.", @@ -1685,7 +1904,7 @@ "pt": "O utilizador ou senha fornecidos s\u00e3o incorrectos. Por favor tente de novo.", "cs": "U\u017eivatel bu\u010f nebyl nalezen, nebo jste zadal \u0161patn\u00e9 heslo. Pros\u00edm zkontrolujte login a zkuste se p\u0159ihl\u00e1sit znovu.", "tr": "Ya bu kullan\u0131c\u0131 ad\u0131nda bir kullan\u0131c\u0131 bulunamad\u0131, yada \u015fifreniz yanl\u0131\u015f. L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 kontrol edin ve yeniden deneyin.", - "lt": "Vartotojas su tokiu prisijungimo vardu nerastas, arba neteisingai \u012fved\u0117te slapta\u017eod\u012f. Pasitikrinkite prisijungimo vard\u0105 ir bandykite dar kart\u0105.", + "lt": "Naudotojas su tokiu prisijungimo vardu nerastas, arba neteisingai \u012fved\u0117te slapta\u017eod\u012f. Pasitikrinkite prisijungimo vard\u0105 ir bandykite dar kart\u0105.", "it": "L'utente fornito non \u00e8 stato trovato, oppure la password fornita era sbagliata. Si prega di verificare il nome utente e provare di nuovo", "zh-tw": "\u627e\u4e0d\u5230\u60a8\u6240\u63d0\u4f9b\u7684\u4f7f\u7528\u8005\u540d\u7a31\u4e4b\u4f7f\u7528\u8005\uff0c\u6216\u60a8\u7d66\u4e86\u932f\u8aa4\u5bc6\u78bc\u3002\u8acb\u6aa2\u67e5\u4f7f\u7528\u8005\u4e26\u518d\u8a66\u4e00\u6b21\u3002", "ja": "\u30e6\u30fc\u30b6\u30fc\u540d\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f\u304b\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u9593\u9055\u3063\u3066\u3044\u308b\u304b\u306e\u4f55\u65b9\u304b\u3067\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u78ba\u8a8d\u3057\u3066\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002", @@ -1694,8 +1913,12 @@ "zh": "\u5982\u679c\u4e0d\u662f\u7ed9\u5b9a\u7684\u7528\u6237\u540d\u6ca1\u6709\u627e\u5230\u5c31\u662f\u7ed9\u5b9a\u7684\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u518d\u6b21\u68c0\u67e5\u7528\u6237\u540d\u548c\u5bc6\u7801", "pl": "Nie istnieje u\u017cytkownik o tej nazwie, lub podano z\u0142e has\u0142o. Sprawd\u017a nazw\u0119 u\u017cytkownika i pon\u00f3w pr\u00f3b\u0119.", "ar": "\u0627\u0645\u0627 \u0627\u0646\u0647 \u0644\u0645 \u0646\u062a\u0645\u0643\u0646 \u0645\u0646 \u0627\u0644\u062a\u0639\u0631\u0641 \u0639\u0644\u064a \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0648 \u0627\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u062e\u0637\u0627. \u0631\u0627\u062c\u0639 \u0627\u0633\u0645 \u0627\u0644\u062f\u062e\u0648\u0644 \u0648 \u062d\u0627\u0648\u0644 \u0645\u0631\u0629 \u0627\u062e\u0631\u064a", + "lv": "Vai nu nav lietot\u0101ja ar nor\u0101d\u012bto lietot\u0101ja v\u0101rdu, vai parole nor\u0101d\u012bta k\u013c\u016bdaini. L\u016bdzu m\u0113\u0123iniet v\u0113lreiz.", "id": "Username yang diberikan tidak dapat ditemukan, atau password yang Anda berikan salah. Silahkan periksa username dan coba lagi.", - "sr": "Korisnik s navedenim korisni\u010dkim imenom ne mo\u017ee biti prona\u0111en ili je lozinka koju ste uneli neispravna. Molimo proverite korisni\u010dko ime i poku\u0161ajte ponovo." + "sr": "Korisnik s navedenim korisni\u010dkim imenom ne mo\u017ee biti prona\u0111en ili je lozinka koju ste uneli neispravna. Molimo proverite korisni\u010dko ime i poku\u0161ajte ponovo.", + "ro": "Nu a fost g\u0103sit niciun utilizator cu numele de utilizator specificat, sau parola introdus\u0103 este gre\u0219it\u0103. V\u0103 rug\u0103m s\u0103 \u00eencerca\u021bi din nou.", + "ru": "\u041b\u0438\u0431\u043e \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u043b\u0438\u0431\u043e \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c.\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043d\u043e\u0432\u0430.", + "eu": "Ez dago erabiltzailerik adierazitako identifikadorearekin, edo adierazitako pasahitza okerra da. Mesedez, berrikusi ezazu erabiltzaile-identifikadorea eta saia zaiztez berriro." }, "title_RESPONSESTATUSNOSUCCESS": { "no": "Feilmelding mottatt fra innloggingstjenesten", @@ -1711,7 +1934,7 @@ "fr": "Erreur lev\u00e9e par le fournisseur d'identit\u00e9", "hr": "Autentifikacijski servis je prijavio gre\u0161ku", "nn": "Feil fr\u00e5 vertsorganisasjonen (IdP)", - "lt": "Gautas klaidos prane\u0161imas i\u0161 tapatybi\u0173 tiek\u0117jo", + "lt": "Gautas klaidos prane\u0161imas i\u0161 tapatybi\u0173 teik\u0117jo", "it": "E' stato ricevuto un errore dall'Identity Provider", "hu": "Hiba t\u00f6rt\u00e9nt az azonos\u00edt\u00f3 szervezet (IdP) oldal\u00e1n", "ja": "\u30a2\u30a4\u30c7\u30f3\u30c6\u30a3\u30c6\u30a3\u30d7\u30ed\u30d0\u30a4\u30c0\u304b\u3089\u30a8\u30e9\u30fc\u3092\u53d7\u4fe1\u3057\u307e\u3057\u305f", @@ -1722,8 +1945,13 @@ "zh": "\u4ece\u8eab\u4efd\u63d0\u4f9b\u8005\u6536\u5230\u4e00\u4e2a\u9519\u8bef", "pl": "Dostawca to\u017csamo\u015bci przes\u0142a\u0142 b\u0142\u0105d", "ar": "\u062e\u0637\u0627 \u062a\u0645 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u064a\u0647 \u0645\u0646 \u0645\u0642\u062f\u0645 \u0627\u0644\u0647\u0648\u064a\u0629", + "lv": "K\u013c\u016bda no identit\u0101tes pieg\u0101d\u0101t\u0101ja", "id": "Error diterima dari Identity Provider", - "sr": "Davalac Identiteta je prijavio gre\u0161ku" + "sr": "Davalac Identiteta je prijavio gre\u0161ku", + "cs": "Chyba p\u0159ijat\u00e1 od poskytovatele identity", + "ro": "Eroare primit\u0103 de la furnizorul de identitate", + "ru": "\u041e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430", + "eu": "Errore bat jazo da IdP-aren aldetik" }, "descr_RESPONSESTATUSNOSUCCESS": { "no": "Innloggingstjenesten svarte med en feilmelding. (Statuskoden i SAML-svaret var noe annet enn OK)", @@ -1739,7 +1967,7 @@ "fr": "Le fournisseur d'identit\u00e9 a renvoy\u00e9 une erreur (le code de statut de la r\u00e9ponse SAML n'indiquait pas le succ\u00e8s)", "hr": "Autentifikacijski servis je poslao odgovor koji sadr\u017ei informaciju o pojavi gre\u0161ke. (\u0160ifra statusa dostavljena u SAML odgovoru ne odgovara \u0161ifri uspje\u0161no obra\u0111enog zahtjeva)", "nn": "Vertsorganisasjonen din (IdP) gav feilmelding (SAML-svaret hadde statuskode som varsla om feil)", - "lt": "Tapatybi\u0173 tiek\u0117jas atsak\u0117 klaidos prane\u0161imu. (Statuso kodas SAML atsakyme buvo nes\u0117kmingas)", + "lt": "Tapatybi\u0173 teik\u0117jas atsak\u0117 klaidos prane\u0161imu. (Statuso kodas SAML atsakyme buvo nes\u0117kmingas)", "it": "L'Identity Provider ha risposto con un errore. (Il codice di stato nel messaggio SAML Response non indicava un successo)", "hu": "Hiba t\u00f6rt\u00e9nt az azonos\u00edt\u00f3 szervezet (IdP) oldal\u00e1n. Ismeretlen \u00e1llapotk\u00f3d.", "zh-tw": "\u9a57\u8b49\u63d0\u4f9b\u8005\u56de\u61c9\u4e00\u500b\u932f\u8aa4\u3002(\u5728 SAML \u56de\u61c9\u88e1\u7684\u72c0\u614b\u78bc\u70ba\u4e0d\u6210\u529f)", @@ -1750,8 +1978,13 @@ "zh": "\u8eab\u4efd\u63d0\u4f9b\u8005\u7684\u5e94\u7b54\u5b58\u5728\u9519\u8bef\uff08SAML\u5e94\u7b54\u72b6\u6001\u7801\u5e76\u6ca1\u6709\u6210\u529f\uff09", "pl": "Odpowied\u017a dostawcy to\u017csamo\u015bci oznacza b\u0142\u0105d (kod stanu w odpowiedzi SAML nie oznacza sukcesu)", "ar": "\u0645\u0642\u062f\u0645 \u0627\u0644\u0647\u0648\u064a\u0629 \u0627\u0633\u062a\u062c\u0627\u0628 \u0628\u062e\u0637\u0623. (\u0631\u0645\u0632 \u0627\u0644\u062d\u0627\u0644\u0629 \u0628\u0627\u0633\u062a\u062c\u0627\u0628\u0629 SAML \u0641\u0627\u0634\u0644)", + "lv": "Identit\u0101tes pieg\u0101d\u0101t\u0101js atbild\u0113jis ar k\u013c\u016bdu. Statusa kods SAML atbild\u0113 at\u0161\u0137iras no veiksm\u012bga", "id": "Identity Provider merespon dengan error. (Kode status di Response SAML adalah tidak berhasil)", - "sr": "Davalac Identiteta je poslao odgovor koji sadr\u017ei informaciju o pojavi gre\u0161ke(\u0160ifra statusa dostavljena u SAML odgovoru ne odgovara \u0161ifri uspe\u0161no obra\u0111enog zahteva)." + "sr": "Davalac Identiteta je poslao odgovor koji sadr\u017ei informaciju o pojavi gre\u0161ke(\u0160ifra statusa dostavljena u SAML odgovoru ne odgovara \u0161ifri uspe\u0161no obra\u0111enog zahteva).", + "cs": "Poskytovatel identity odpov\u011bd\u011bl chybou. (Stavov\u00fd k\u00f3d v SAML nebyl \u00fasp\u011b\u0161n\u00fd)", + "ro": "Furnizorul de identitate a r\u0103spuns cu o eroare. (Codul de stare in r\u0103spunsul SAML a fost \u00eencercare nereu\u0219it\u0103)", + "ru": "\u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. (\u041a\u043e\u0434 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432 \u043e\u0442\u043a\u043b\u0438\u043a\u0435 SAML \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435)", + "eu": "Idp-ak errore batekin erantzun dio eskaerari. (SAML erantzunean egoera kodea ez da arrakastatsua izan)" }, "title_NOCERT": { "fr": "Aucun certificat pr\u00e9sent\u00e9", @@ -1775,8 +2008,13 @@ "zh": "\u65e0\u8bc1\u4e66", "pl": "Brak certyfikatu", "ar": "\u0627\u0644\u0634\u0647\u0627\u062f\u0627\u062a \u0645\u0641\u0642\u0648\u062f\u0629", + "lv": "Nav sertifik\u0101ta", "id": "Tidak ada sertifikat", - "sr": "Nema digitalnog sertifikata" + "sr": "Nema digitalnog sertifikata", + "cs": "Chyb\u00ed certiifik\u00e1t", + "ro": "Lipse\u0219te certificatul", + "ru": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442", + "eu": "Ziurtagiri gabe" }, "descr_NOCERT": { "fr": "\u00c9chec de l'authentification : votre navigateur n'a pas pr\u00e9sent\u00e9 de certificat", @@ -1800,8 +2038,13 @@ "zh": "\u8ba4\u8bc1\u5931\u8d25\uff0c\u4f60\u7684\u6d4f\u89c8\u5668\u6ca1\u6709\u53d1\u9001\u4efb\u4f55\u8bc1\u4e66", "pl": "Nie powiod\u0142o si\u0119 uwierzytelnienie: przegl\u0105darka nie przes\u0142a\u0142a certyfikatu", "ar": "\u0641\u0634\u0644 \u0627\u0644\u062a\u0648\u062b\u064a\u0642 \u0644\u0627\u0646 \u0645\u062a\u0635\u0641\u062d\u0643 \u0644\u0645 \u064a\u0631\u0633\u0644 \u0634\u0647\u0627\u062f\u0627\u062a", + "lv": "Autentifik\u0101cija neizdev\u0101s, jo J\u016bsu interneta p\u0101rl\u016bks nav ats\u016bt\u012bjis nevienu sertifik\u0101tu", "id": "Autentifikasi gagal: Browser anada tidak mengirim sertifikat", - "sr": "Neuspe\u0161na autentifikacija: va\u0161 web pretra\u017eiva\u010d nije poslao digitalni sertifikat" + "sr": "Neuspe\u0161na autentifikacija: va\u0161 web pretra\u017eiva\u010d nije poslao digitalni sertifikat", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed neprob\u011bhlo: V\u00e1\u0161 prohl\u00ed\u017ee\u010d neodeslal \u017e\u00e1dn\u00fd certifik\u00e1t", + "ro": "Autentificare e\u0219uat\u0103: browser-ul dumneavoastr\u0103 nu a trimis niciun certificat", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438: \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u0432\u044b\u0441\u043b\u0430\u043b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Kautotze okerra: zure nabigatzaileak ez du bidali ziurtagiririk " }, "title_INVALIDCERT": { "fr": "Certificat invalide", @@ -1825,8 +2068,13 @@ "zh": "\u65e0\u6548\u7684\u8bc1\u4e66", "pl": "Niepoprawny certyfikat", "ar": "\u0634\u0647\u0627\u062f\u0629 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u0629", + "lv": "Neder\u012bgs sertifik\u0101ts", "id": "Sertifikat invalid", - "sr": "Neispravan digitalni sertifikat" + "sr": "Neispravan digitalni sertifikat", + "cs": "\u0160patn\u00fd certifik\u00e1t", + "ro": "Certificat nevalid", + "ru": "\u041d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Ziurtagiri baliogabea" }, "descr_INVALIDCERT": { "fr": "\u00c9chec de l'authentification : le certificat pr\u00e9sent\u00e9 par votre navigateur est invalide ou illisible", @@ -1850,8 +2098,13 @@ "zh": "\u8ba4\u8bc1\u5931\u8d25\uff1a\u4f60\u7684\u6d4f\u89c8\u5668\u53d1\u9001\u7684\u8bc1\u4e66\u65e0\u6548\u6216\u8005\u4e0d\u80fd\u8bfb\u53d6", "pl": "Nie powiod\u0142o si\u0119 uwierzytelnienie: certyfikat przes\u0142any przez przegl\u0105dark\u0119 jest niepoprawny lub nie mo\u017ce zosta\u0107 przeczytany", "ar": "\u0641\u0634\u0644 \u0627\u0644\u062a\u0648\u062b\u064a\u0642 \u0644\u0627\u0646 \u0645\u062a\u0635\u0641\u062d\u0643 \u0627\u0631\u0633\u0644 \u0634\u0647\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0635\u062d\u064a\u062d\u0629 \u0627\u0648 \u0644\u0627 \u064a\u0645\u0643\u0646 \u0642\u0631\u0627\u0621\u062a\u0647\u0627 ", + "lv": "Autentifik\u0101cija neizdev\u0101s, jo J\u016bsu interneta p\u0101rl\u016bks ats\u016bt\u012bjis neder\u012bgu vai nelas\u0101mu sertifik\u0101tu", "id": "Autentifikasi gagal: Sertifikat yang browser Anda kirimkan invalid atau tidak dapat dibaca", - "sr": "Neuspe\u0161na autentifikacija: digitalni sertifikat koji je poslao va\u0161 web pretra\u017eiva\u010d nije ispravan ili se ne mo\u017ee pro\u010ditati" + "sr": "Neuspe\u0161na autentifikacija: digitalni sertifikat koji je poslao va\u0161 web pretra\u017eiva\u010d nije ispravan ili se ne mo\u017ee pro\u010ditati", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed neprob\u011bhlo: certifik\u00e1t kter\u00fd odeslal V\u00e1\u0161 rohl\u00ed\u017ee\u010d nemohl b\u00fdt p\u0159e\u010dten", + "ro": "Autentificare e\u0219uat\u0103: certificatul trimis de browser-ul dumneavoastr\u0103 nu este valid sau nu poate fi citit", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438: \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u044b\u0441\u043b\u0430\u043b \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043b\u0438 \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Kautotze okerra: Zure nabigatzaileak bidalitako ziurtagiria baliogabea da edo ezin da irakurri" }, "title_UNKNOWNCERT": { "fr": "Certificat inconnu", @@ -1875,8 +2128,13 @@ "zh": "\u672a\u77e5\u7684\u8bc1\u4e66", "pl": "Nieznany certyfikat", "ar": "\u0634\u0647\u0627\u062f\u0629 \u063a\u064a\u0631 \u0645\u0639\u0644\u0648\u0645\u0629", + "lv": "Nepaz\u012bstams sertifik\u0101ts", "id": "Sertifikat tidak dikenal", - "sr": "Nepoznat digitalni sertifikat" + "sr": "Nepoznat digitalni sertifikat", + "cs": "Nezn\u00e1m\u00fd certifik\u00e1t", + "ro": "Certificat necunoscut", + "ru": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Ziurtagiri ezezaguna" }, "descr_UNKNOWNCERT": { "fr": "\u00c9chec de l'authentification : le certificat pr\u00e9sent\u00e9 par votre navigateur n'est pas connu", @@ -1900,8 +2158,13 @@ "zh": "\u8ba4\u8bc1\u5931\u8d25\uff1a\u4f60\u7684\u6d4f\u89c8\u5668\u53d1\u9001\u7684\u662f\u672a\u77e5\u7684\u8bc1\u4e66", "pl": "Nie powiod\u0142o si\u0119 uwierzytelnienie: certyfikat przes\u0142any przez przegl\u0105dark\u0119 jest nieznany", "ar": "\u0641\u0634\u0644 \u0627\u0644\u062a\u0648\u062b\u064a\u0642 \u0644\u0627\u0646 \u0645\u062a\u0635\u0641\u062d\u0643 \u0627\u0631\u0633\u0644 \u0634\u0647\u0627\u062f\u0647 \u063a\u064a\u0631 \u0645\u0639\u0644\u0648\u0645\u0629", + "lv": "Autentifik\u0101cija neizdev\u0101s, jo J\u016bsu interneta p\u0101rl\u016bks ats\u016bt\u012bjis nepaz\u012bstamu sertifik\u0101tu", "id": "Autentifikasi gagal: sertifikat yang browser anda kirimkan tidak dikenal", - "sr": "Neuspe\u0161na autentifikacija: digitalni sertifikat koji je poslao va\u0161 web pretra\u017eiva\u010d je nepoznat" + "sr": "Neuspe\u0161na autentifikacija: digitalni sertifikat koji je poslao va\u0161 web pretra\u017eiva\u010d je nepoznat", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed neprob\u011bhlo: certifik\u00e1t kter\u00fd odeslal V\u00e1\u0161 prohl\u00ed\u017ee\u010d je nezn\u00e1m\u00fd", + "ro": "Autentificare e\u0219uat\u0103: certificatul trimis de browser-ul dumneavoastr\u0103 nu este recunoscut", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438: \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432\u044b\u0441\u043b\u0430\u043b \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442", + "eu": "Kautotze okerra: zure nabigatzaileak bidalitako ziurtagiria ezezaguna da" }, "title_USERABORTED": { "da": "Autentificering aubrudt", @@ -1921,12 +2184,17 @@ "es": "Autenticacion abortada", "pl": "Przerwane uwierzytelnienie", "ar": "\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062a\u0648\u062b\u064a\u0642", + "lv": "Autentifik\u0101cija p\u0101rtraukta", "id": "Autentifikasi dibatalkan", "sr": "Proces autentifikacije je prekinut", "nl": "Authenticatie afgebroken", "hu": "Azonos\u00edt\u00e1s megszak\u00edtva", "nn": "Avbroten innlogging", - "fr": "Authentification abandonn\u00e9e" + "fr": "Authentification abandonn\u00e9e", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed odm\u00edtnuto", + "ro": "Autentificare \u00eentrerupt\u0103", + "ru": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430", + "eu": "Kautotzea bertan behera utzia" }, "descr_USERABORTED": { "da": "Autentificering blev afbrudt af brugeren", @@ -1942,15 +2210,21 @@ "de": "Die Authentifizierung wurde durch den Benutzer abgebrochen", "pt-br": "A autentica\u00e7\u00e3o foi abortada pelo usu\u00e1rio", "zh": "\u8ba4\u8bc1\u88ab\u7528\u6237\u4e2d\u6b62", - "lt": "Autentikacija nutrauk\u0117 vartotojas", + "lt": "Autentikacija nutrauk\u0117 naudotojas", "es": "La Autenticacion fue abortada por el usuario", "pl": "Uwierzytelnienie zosta\u0142o przerwane przez u\u017cytkownika", "ar": "\u062a\u0645 \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062a\u0648\u062b\u064a\u0642 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "lv": "Autentifik\u0101ciju p\u0101rtraucis lietot\u0101js", "id": "Autentifikasi dibatalkan oleh user", "sr": "Korisnik je prekinuo proces autentifikacie", "hu": "Az azonos\u00edt\u00e1st a felhaszn\u00e1l\u00f3 megszak\u00edtotta", "nn": "Innlogging blei avbroten av sluttbrukaren", - "fr": "L'authentification a \u00e9t\u00e9 abandonn\u00e9e par l'usager" + "fr": "L'authentification a \u00e9t\u00e9 abandonn\u00e9e par l'usager", + "cs": "P\u0159ihl\u00e1\u0161en\u00ed bylo p\u0159eru\u0161eno u\u017eivatelem", + "nl": "De authenticatie is afgebroken door de gebruiker", + "ro": "Autentificarea a fost \u00eentrerupt\u0103 de utilizator", + "ru": "\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c", + "eu": "Kautotzea bertan behera utzi du erabiltzaileak" }, "title_NOSTATE": { "da": "State information tabt", @@ -1970,10 +2244,16 @@ "pl": "Utracono informacje o stanie", "ar": "\u0641\u0642\u062f\u0627\u0646 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062d\u0627\u0644\u0629", "hu": "Elveszett az \u00e1llapotinform\u00e1ci\u00f3", + "lv": "St\u0101vok\u013ca inform\u0101cija pazaud\u0113ta", "id": "Informasi state hilang", "sr": "Podaci o stanju su izgubljeni", "nn": "Mista tilstandsinformasjon", - "fr": "Information d'\u00e9tat perdue" + "fr": "Information d'\u00e9tat perdue", + "cs": "Stavov\u00e1 informace ztracena", + "nl": "Toestandsinformatie verloren", + "ro": "Informa\u021bia de stare a fost pierdut\u0103", + "ru": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0443\u0442\u0435\u0440\u044f\u043d\u0430", + "eu": "Egoera informazioa galdua" }, "descr_NOSTATE": { "da": "State information er tabt og der er ikke muligt at gentage forsp\u00f8rgelsen", @@ -1992,11 +2272,17 @@ "es": "Informaci\u00f3n de estado perdida y no hay manera de restablecer la petici\u00f3n", "pl": "Utracono informacje o stanie i nie ma mo\u017cliwo\u015bci ponowienia zlecenia", "ar": "\u0641\u0642\u062f\u0627\u0646 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062d\u0627\u0644\u0629 \u0648 \u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0639\u0627\u062f\u0629 \u0627\u0644\u0628\u062f\u0621 \u0644\u0644\u0637\u0644\u0628", + "lv": "St\u0101vok\u013ca inform\u0101cija pazaud\u0113ta un nav iesp\u0113jams atk\u0101rtot piepras\u012bjumu", "id": "Informasi state hilang, dan tidak ada cara untuk me-restat request", "sr": "Podaci o stanju su izgubljeni i zahtev se ne mo\u017ee reprodukovati", "hu": "\u00c1llapotinform\u00e1ci\u00f3 elveszett, a k\u00e9r\u00e9st nem lehet \u00fajraind\u00edtani", "nn": "Mista tilstandsinformasjon, og klarer ikkje \u00e5 gjera omstart", - "fr": "Information d'\u00e9tat perdue, et aucun moyen de relancer la requ\u00eate" + "fr": "Information d'\u00e9tat perdue, et aucun moyen de relancer la requ\u00eate", + "cs": "Stavov\u00e1 informace ", + "nl": "Informatie over de toestand is verloren, en het verzoek kan niet herstart worden", + "ro": "Informa\u021bia de stare a fost pierdut\u0103, cererea nu poate fi reluat\u0103", + "ru": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0443\u0442\u0435\u0440\u044f\u043d\u0430, \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u043d\u043e\u0432\u043e", + "eu": "Egoera informazioa galdua eta ez dago modurik eskaera berrabiarazteko" }, "title_METADATANOTFOUND": { "da": "Metadata ikke fundet", @@ -2015,11 +2301,17 @@ "es": "Metadatos no econtrados", "pl": "Nie znaleziono metadanych", "ar": "\u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627 \u0645\u0641\u0642\u0648\u062f\u0629", + "lv": "Metadati nav atrasti", "id": "Metadata tidak ditemukan", "sr": "Metapodaci nisu prona\u0111eni", "hu": "Metadata nem tal\u00e1lhat\u00f3", "nn": "Finn ikkje metadata", - "fr": "M\u00e9tadonn\u00e9es non trouv\u00e9es" + "fr": "M\u00e9tadonn\u00e9es non trouv\u00e9es", + "nl": "Metadata niet gevonden", + "ro": "Metadatele nu au fost g\u0103site", + "ru": "\u041c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b", + "cs": "Metadata nenalezena", + "eu": "Ez dira metadatuak aurkitu" }, "descr_METADATANOTFOUND": { "da": "Kan ikke finde metadata for %ENTITYID%", @@ -2038,11 +2330,17 @@ "es": "No se puede localizar los metadatos en %ENTITYID%", "pl": "Nie mo\u017cna zlokalizowa\u0107 metadanych dotycz\u0105cych %ENTITYID%", "ar": "\u0644\u0627 \u064a\u0645\u0643\u0646 \u062a\u062d\u062f\u064a\u062f \u0645\u0648\u0642\u0639 \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627 \u0644 %ENTITYID%", + "lv": "Nav iesp\u0113jams atrast metadatus priek\u0161 %ENTITYID%", "id": "Tidak dapat menemukan metadata untuk %ENTITYID%", "sr": "Metapodaci za %ENTITYID% nisu prona\u0111eni", "hu": "%ENTITYID% entit\u00e1shoz nem tal\u00e1lhat\u00f3 metadataA", "nn": "Klarer ikkje \u00e5 finna metadata for %ENTITYID%", - "fr": "Impossible de localiser les m\u00e9tadonn\u00e9es pour %ENTITYID%" + "fr": "Impossible de localiser les m\u00e9tadonn\u00e9es pour %ENTITYID%", + "nl": "Kan geen metadata vinden voor %ENTITYID%", + "ro": "Nu pot fi localizate metadatele pentru %ENTITYID%", + "ru": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f %ENTITYID%", + "cs": "Nebyly nalezeny metadata pro %ENTITYID%", + "eu": "Ezin da aurkitu metadaturik %ENTITYID%-(a)rentzat" }, "title_AUTHSOURCEERROR": { "hr": "Gre\u0161ka u autentifikacijskom modulu", @@ -2059,11 +2357,19 @@ "es": "Error en la Autenticacion de origen", "pl": "B\u0142\u0105d \u017ar\u00f3d\u0142a uwierzytelnienia", "ar": "\u062e\u0637\u0627 \u0628\u0645\u0635\u062f\u0631 \u0627\u0644\u062a\u0648\u062b\u064a\u0642", + "lv": "Autentifik\u0101cijas avota k\u013c\u016bda", "id": "Error sumber autentifikasi", "sr": "Gre\u0161ka u autentifikacionom modulu", "hu": "Azonos\u00edt\u00e1si forr\u00e1s hiba", "nn": "Innloggingsfeil: autentisering", - "fr": "Erreur sur la source d'authentification" + "fr": "Erreur sur la source d'authentification", + "it": "Errore di sorgente di autenticazione", + "nl": "Fout in authenticatiebron", + "ro": "Eroare surs\u0103 de autentificare", + "no": "Autentiseringskildefeil", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438", + "cs": "Chyba autentiza\u010dn\u00edho zdroje", + "eu": "Errorea kautotze jatorrian" }, "descr_AUTHSOURCEERROR": { "hr": "Do\u0161lo je do gre\u0161ke u autentifikacijskom modulu %AUTHSOURCE%. Razlog: %REASON%", @@ -2080,10 +2386,18 @@ "es": "Error en la Autenticacion en el origen %AUTHSOURCE%. La razon fue: %REASON%", "pl": "B\u0142\u0105d uwierzytelnienia dla \u017ar\u00f3d\u0142a %AUTHSOURCE%. Przyczyn\u0105 jest: %REASON%", "ar": "\u062e\u0637\u0627 \u0628\u0645\u0635\u062f\u0631 \u0627\u0644\u062a\u0648\u062b\u064a\u0642 %AUTHSOURCE% \u0646\u062a\u064a\u062c\u0629 \u0644 %REASON%", + "lv": "Autentifik\u0101cijas k\u013c\u016bda avot\u0101 %AUTHSOURCE%. Iemesls: %REASON%", "id": "Error autentifikasi di sumber %AUTHSOURCE%. Alasannya adalah: %REASON%", "sr": "Do\u0161lo je do gre\u0161ke u autentifikacionom modulu %AUTHSOURCE%. Razlog: %REASON%", "hu": "A(z) %AUTHSOURCE% azonos\u00edt\u00e1si forr\u00e1sban hiba van. A ok: %REASON%", "nn": "Innloggingsfeil knytta til %AUTHSOURCE% p\u00e5 grunn av %REASON%", - "fr": "Erreur d'authentification pour la source %AUTHSOURCE%. La raison \u00e9tait %REASON%" + "fr": "Erreur d'authentification pour la source %AUTHSOURCE%. La raison \u00e9tait %REASON%", + "it": "Errore di autenticazione in sorgente %AUTHSOURCE%. La ragione \u00e8 $REASON%", + "nl": "Fout in authenticatiebron %AUTHSOURCE%. Als reden werd gegeven: %REASON%.", + "ro": "Eroare de autentificare la sursa %AUTHSOURCE%. Motivul a fost: %REASON%", + "no": "Feil i autentiseringskilden %AUTHSOURCE%. Feilen var: %REASON%", + "ru": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 %AUTHSOURCE%. \u041f\u0440\u0438\u0447\u0438\u043d\u0430: %REASON%", + "cs": "Autentiza\u010dn\u00ed chyba ve zdroji %AUTHSOURCE%. D\u016fvodem bylo: %REASON%", + "eu": "Errorea kautotze jatorrian %AUTHSOURCE%. Arrazoia hau da: %REASON%" } } diff --git a/inc/simplesamlphp/dictionaries/login.definition.json b/inc/simplesamlphp/dictionaries/login.definition.json index 1acb64e..6399256 100644 --- a/inc/simplesamlphp/dictionaries/login.definition.json +++ b/inc/simplesamlphp/dictionaries/login.definition.json @@ -24,7 +24,7 @@ "en": "Help! I don't remember my password." }, "help_text": { - "en": "Too bad! - Without your username and password you cannot authenticate yourself for access to the service. There may be someone that can help you. Consult the help desk at your university!" + "en": "Too bad! - Without your username and password you cannot authenticate yourself for access to the service. There may be someone that can help you. Consult the help desk at your organization!" }, "error_nopassword": { "en": "You sent something to the login page, but for some reason the password was not sent. Try again please." @@ -58,5 +58,8 @@ }, "remember_username": { "en": "Remember my username" - } + }, + "remember_me": { + "en": "Remember me" + } } diff --git a/inc/simplesamlphp/dictionaries/login.translation.json b/inc/simplesamlphp/dictionaries/login.translation.json index 8bd5775..b52b65c 100644 --- a/inc/simplesamlphp/dictionaries/login.translation.json +++ b/inc/simplesamlphp/dictionaries/login.translation.json @@ -17,6 +17,7 @@ "pt": "Erro", "pl": "B\u0142\u0105d", "cs": "Chyba", + "eu": "Eman dituzun datuak okerrak dira", "tr": "Hata", "lt": "Klaida", "it": "Errore", @@ -28,7 +29,9 @@ "zh": "\u9519\u8bef", "ar": "\u062e\u0637\u0627", "id": "Error", - "sr": "Gre\u0161ka" + "lv": "K\u013c\u016bda", + "sr": "Gre\u0161ka", + "ro": "Eroare" }, "user_pass_header": { "no": "Skriv inn brukernavn og passord", @@ -36,7 +39,7 @@ "sv": "Ange ditt anv\u00e4ndarnamn och l\u00f6senord", "es": "Indique su nombre de usuario y clave de acceso", "fr": "Entrez votre identifiant et votre mot de passe", - "de": "Bitten geben sie ihren Nutzernamen und Passwort ein", + "de": "Bitten geben Sie ihren Nutzernamen und Passwort ein", "nl": "Geef je gebruikersnaam en wachtwoord", "lb": "Gid w.e.g Aeren Benotzernumm an d Passwuert an", "sl": "Vnesite svoje uporabni\u0161ko ime in geslo", @@ -47,7 +50,8 @@ "pt-br": "Digite seu usu\u00e1rio e senha", "pt": "Introduza o seu nome de utilizador e senha", "pl": "Wprowad\u017a nazw\u0119 uzytkownika i has\u0142o", - "cs": "lo\u017ete sv\u00e9 jm\u00e9no a heslo", + "cs": "Vlo\u017ete sv\u00e9 jm\u00e9no a heslo", + "eu": "Sartu erabiltzaile-izena eta pasahitza", "tr": "Kullan\u0131c\u0131 ad\u0131 ve \u015fifrenizi giriniz", "lt": "\u012eveskite savo prisijungimo vard\u0105 ir slapta\u017eod\u012f", "it": "Inserire nome utente e password", @@ -59,7 +63,9 @@ "zh": "\u8f93\u5165\u4f60\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801", "ar": "\u0627\u062f\u062e\u0644 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0648 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631", "id": "Masukkan username dan password Anda", - "sr": "Unesite va\u0161e korisni\u010dko ime i lozinku" + "lv": "Ievadiet savu lietot\u0101ja v\u0101rdu un paroli", + "sr": "Unesite va\u0161e korisni\u010dko ime i lozinku", + "ro": "V\u0103 rug\u0103m s\u0103 completa\u021bi numele de utilizator \u0219i parola" }, "user_pass_text": { "no": "En tjeneste har bedt om bekreftelse p\u00e5 din identitet. Skriv inn ditt brukernavn og passord for \u00e5 autentisere deg.", @@ -67,7 +73,7 @@ "sv": "En webbtj\u00e4nst har beg\u00e4rt att du ska logga in. Detta betyder att du beh\u00f6ver ange ditt anv\u00e4ndarnamn och ditt l\u00f6senord i formul\u00e4ret nedan.", "es": "Un servicio solicita que se autentique. Esto significa que debe indicar su nombre de usuario y su clave de acceso en el siguiente formulario.", "fr": "Un service a demand\u00e9 \u00e0 ce que vous vous authentifiez. Cela signifie que vous devez entrer votre identifiant et votre mot de passe dans le formulaire ci-dessous.", - "de": "Um diesen Dienst zu nutzen, m\u00fcssen sie sich authentifizieren. Bitte geben sie daher unten Nutzernamen und Passwort ein.", + "de": "Um diesen Dienst zu nutzen, m\u00fcssen Sie sich authentifizieren. Bitte geben sie daher unten Nutzernamen und Passwort ein.", "nl": "Voor deze dienst is authenticatie vereist. Geef je gebruikersnaam en wachtwoord in onderstaand formulier.", "lb": "En Service huet ungefrot aerch ze authentifiz\u00e9iren. Daat heescht daer musst aeren Benotzernumm an d'Passwuert an de Formulairen heidr\u00ebnner angin.", "sl": "Storitev zahteva, da se prijavite. To pomeni, da je potreben vnos uporabni\u0161kega imena in gesla v spodnji polji.", @@ -90,7 +96,10 @@ "zh": "\u4e00\u4e2a\u670d\u52a1\u9700\u8981\u4f60\u7684\u8ba4\u8bc1\uff0c\u8bf7\u5728\u4e0b\u9762\u8f93\u5165\u4f60\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801", "ar": "\u0637\u0644\u0628\u062a \u0627\u062d\u062f\u064a \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0646 \u062a\u0648\u062b\u0642 \u0627\u0646\u0643 \u0627\u0646\u062a. \u0631\u062c\u0627\u0621\u0627\u064b \u0642\u0645 \u0628\u0625\u062f\u0631\u0627\u062c \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0648 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u062e\u0627\u0635\u062a\u0643 \u0628\u0627\u0644\u0627\u0633\u062a\u0645\u0627\u0631\u0629 \u0623\u062f\u0646\u0627\u0647", "id": "Sebuah layanan telah meminta Anda untuk melakukan autentifikasi. Silahkan masukkan username dan password Anda pada form dibawah", - "sr": "Servis zahteva od vas da se autentifikujete. Unesite va\u0161e korisni\u010dko ime i lozinku u dole navedena polja." + "lv": "Serviss pieprasa autentifik\u0101ciju. L\u016bdzu ievadiet savu lietot\u0101ja v\u0101rdu un paroli.", + "sr": "Servis zahteva od vas da se autentifikujete. Unesite va\u0161e korisni\u010dko ime i lozinku u dole navedena polja.", + "ro": "Un serviciu a solicitat autentificarea dumneavoastr\u0103. V\u0103 rug\u0103m s\u0103 completa\u021bi numele de utilizator \u0219i parola \u00een c\u00e2mpurile de mai jos.", + "eu": "Zerbitzu batek kautotu zaitezen eskatzen du. Mesedez, zure erabiltzaile-izena eta pasahitza honako formulario honetan sartu itzazu." }, "login_button": { "no": "Logg inn", @@ -111,6 +120,7 @@ "pt": "Entrar", "pl": "Login", "cs": "P\u0159ihl\u00e1sit", + "eu": "Saioa hasi", "tr": "Giri\u015f", "lt": "Prisijungti", "it": "Login", @@ -122,7 +132,9 @@ "zh": "\u767b\u5f55", "ar": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644", "id": "Login", - "sr": "Prijavi se" + "lv": "Piesl\u0113gties", + "sr": "Prijavi se", + "ro": "Autentificare" }, "username": { "no": "Brukernavn", @@ -143,6 +155,7 @@ "pt": "Nome de utilizador", "pl": "Nazwa u\u017cytkownika", "cs": "U\u017eivatel", + "eu": "Erabiltzaile-izena", "tr": "Kullan\u0131c\u0131 ad\u0131", "lt": "Prisijungimo vardas", "it": "Nome utente", @@ -154,7 +167,9 @@ "zh": "\u7528\u6237\u540d", "ar": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", "id": "Username", - "sr": "Korisni\u010dko ime" + "lv": "Lietot\u0101ja v\u0101rds", + "sr": "Korisni\u010dko ime", + "ro": "Nume de utilizator" }, "organization": { "no": "Organisasjon", @@ -167,7 +182,7 @@ "lb": "Organisatioun", "sl": "Organizacija", "da": "Organistationsnavn", - "se": "Organisašuvdna", + "se": "Organisa\u0161uvdna", "hr": "Ustanova", "hu": "Szervezet", "fi": "Organisaatio", @@ -175,6 +190,7 @@ "pt": "Organiza\u00e7\u00e3o", "pl": "Organizacja", "cs": "Organizace", + "eu": "Erakundea", "tr": "Organizasyon", "lt": "Organizacija", "it": "Organizzazione", @@ -186,7 +202,9 @@ "zh": "\u7ec4\u7ec7", "ar": "\u0627\u0644\u062c\u0647\u0629 ", "id": "Organisasi", - "sr": "Institucija" + "lv": "Organiz\u0101cija", + "sr": "Institucija", + "ro": "Institu\u021bie" }, "password": { "no": "Passord", @@ -199,7 +217,7 @@ "lb": "Passwuert", "sl": "Geslo", "da": "Kodeord", - "se": "Beassansátni", + "se": "Beassans\u00e1tni", "hr": "Zaporka", "hu": "Jelsz\u00f3", "fi": "Salasana", @@ -207,6 +225,7 @@ "pt": "Senha", "pl": "Has\u0142o", "cs": "Heslo", + "eu": "Pasahitza", "tr": "\u015eifre", "lt": "Slapta\u017eodis", "it": "Password", @@ -218,7 +237,9 @@ "zh": "\u5bc6\u7801", "ar": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631", "id": "Password", - "sr": "Lozinka" + "lv": "Parole", + "sr": "Lozinka", + "ro": "Parola" }, "help_header": { "no": "Hjelp! Jeg har glemt passordet mitt.", @@ -238,6 +259,7 @@ "pt": "N\u00e3o me lembro da minha senha", "pl": "Pomocy! Nie pami\u0119tam has\u0142a.", "cs": "Chci pomoci. Zapomn\u011bl jsem heslo.", + "eu": "Lagundu! Ez dut nire pasahitza gogoratzen.", "tr": "Yard\u0131m! \u015eifremi hat\u0131rlam\u0131yorum.", "lt": "Pagalbos! Nepamenu savo slapta\u017eod\u017eio.", "it": "Aiuto! Non ricordo la mia password.", @@ -249,7 +271,9 @@ "zh": "\u5e2e\u52a9\uff01\u6211\u5fd8\u8bb0\u6211\u7684\u5bc6\u7801\u4e86\uff01", "ar": "\u0633\u0627\u0639\u062f\u0646\u064a! \u0644\u0627 \u0627\u0630\u0643\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631", "id": "Tolong! Saya tidak ingat password saya", - "sr": "Upomo\u0107! Zaboravio\/la sam svoju lozinku." + "lv": "Pal\u012bdziet! Es neatceros paroli.", + "sr": "Upomo\u0107! Zaboravio\/la sam svoju lozinku.", + "ro": "Nu mai \u0219tiu parola." }, "help_text": { "no": "Synd! - Uten riktig brukernavn og passord kan du ikke autentisere deg. Det kan v\u00e6re noen som kan hjelpe deg. Fors\u00f8k \u00e5 kontakt brukerst\u00f8tte ved din vertsorganisasjon.", @@ -257,7 +281,7 @@ "sv": "Tyv\u00e4rr kan du inte logga in i tj\u00e4nsten om du inte har ditt anv\u00e4ndarnamn och ditt l\u00f6senord. Ta kontakt med din organisations support eller helpdesk f\u00f6r att f\u00e5 hj\u00e4lp.", "es": "¡Muy mal! - Sin su nombre de usuario y su clave de acceso usted no se puede identificar y acceder al servicio. A lo mejor hay alguien que puede ayudarle. ¡Póngase en contacto con el centro de ayuda de su universidad!", "fr": "Pas de chance! Sans votre identifiant et votre mot de passe vous ne pouvez pas vous authentifier et acc\u00e9der au service. Il y a peut-\u00eatre quelqu'un pour vous aider. Contactez le help desk de votre universit\u00e9!", - "de": "Pech! - Ohne Nutzername und Passwort k\u00f6nnen sie sich nicht authentifizieren und somit den Dienst nicht nutzen. M\u00f6glicherweise kann ihnen jemand helfen, kontaktieren sie dazu den Helpdesk ihrer Einrichtung.", + "de": "Pech! - Ohne Nutzername und Passwort k\u00f6nnen Sie sich nicht authentifizieren und somit den Dienst nicht nutzen. M\u00f6glicherweise kann ihnen jemand helfen, kontaktieren Sie dazu den Helpdesk ihrer Einrichtung.", "nl": "Vette pech! - Zonder je gebruikersnaam en wachtwoord kun je je niet authenticeren en dus niet gebruikmaken van deze dienst.", "lb": "Pesch gehaat! - Ouni aeren Benotzernumm an d'Passwuert k\u00ebnn der aerch net authentifiz\u00e9iren an op den Service zougraiffen.", "sl": "\u017dal se brez uporabni\u0161kega imena in gesla ne morete prijaviti in uporabljati storitev.", @@ -280,7 +304,10 @@ "zh": "\u592a\u7cdf\u7cd5\u4e86\uff01-\u6ca1\u6709\u4f60\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u4f60\u5c06\u4e0d\u80fd\u8bbf\u95ee\u8be5\u670d\u52a1\uff0c\u4e5f\u8bb8\u6709\u4eba\u80fd\u591f\u5e2e\u52a9\u4f60\uff0c\u8bf7\u54a8\u8be2\u4f60\u6240\u5728\u5927\u5b66\u7684\u670d\u52a1\u53f0", "ar": "\u0644\u0633\u0648\u0621 \u0627\u0644\u062d\u0638 \u0644\u0627 \u064a\u0645\u0643\u0646\u0646\u0627 \u0627\u0644\u062a\u0648\u062b\u0642 \u0645\u0646 \u0647\u0648\u064a\u062a\u0643 \u0628\u062f\u0648\u0646 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0648 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u0648\u0628\u0627\u0644\u062a\u0627\u0644\u064a \u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u062e\u062f\u0645\u0629. \u0644\u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0627\u062a\u0635\u0644 \u0628\u0627\u0644\u0645\u0648\u0638\u0641 \u0627\u0644\u0645\u0633\u0624\u0648\u0644 \u0628\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0628\u062c\u0627\u0645\u0639\u062a\u0643", "id": "Sayang sekali! - Tanpa username dan password Anda tidak dapat melakukan autentifikasi agar dapat mengakses layanan. Mungkin ada seseorang yang dapat menolong Anda. Hubungi help desk pada universitas Anda.", - "sr": "\u0160teta! - Bez ispravnog korisni\u010dkog imena i lozinke ne mo\u017eete pristupiti servisu. Da biste saznali va\u0161e korisni\u010dko ime i lozinku obratite se va\u0161oj mati\u010dnoj instituciji." + "lv": "Bez lietot\u0101ja v\u0101rda un paroles J\u016bs nevarat autentific\u0113ties un nevarat izmantot servisu. Iesp\u0113jams, ir k\u0101ds, kas var Jums pal\u012bdz\u0113t. Vaic\u0101jiet savas universit\u0101tes pal\u012bdz\u012bbas dienestam.", + "sr": "\u0160teta! - Bez ispravnog korisni\u010dkog imena i lozinke ne mo\u017eete pristupiti servisu. Da biste saznali va\u0161e korisni\u010dko ime i lozinku obratite se va\u0161oj mati\u010dnoj instituciji.", + "ro": "Din p\u0103cate f\u0103r\u0103 nume de utilizator \u0219i parol\u0103 nu v\u0103 pute\u021bi autentifica pentru accesul la acest serviciu. Contacta\u021bi echipa de suport tehnic de la universitatea dumneavoastr\u0103.", + "eu": "Zeinen txarto! - Zure erabiltziale-izena eta pasahitza gabe ezin zara identifikatu ezta zerbitzuan sartu ere. Agian bada norbait lagun diezazukeena. Jar zaitez harremanetan erakundeko laguntza zentroarekin!" }, "error_nopassword": { "no": "Du kontaktet loginsiden, men passordet ble ikke sendt med. Fors\u00f8k igjen.", @@ -311,7 +338,10 @@ "zh": "\u4f60\u786e\u5b9e\u53d1\u9001\u4e86\u4e00\u4e9b\u4fe1\u606f\u7ed9\u767b\u5f55\u9875\u9762\uff0c\u4f46\u7531\u4e8e\u67d0\u4e9b\u539f\u56e0\uff0c\u4f60\u6ca1\u6709\u53d1\u9001\u5bc6\u7801\uff0c\u8bf7\u518d\u8bd5\u4e00\u6b21", "ar": "\u0644\u0642\u062f \u0642\u0645\u062a \u0628\u0625\u0631\u0633\u0627\u0644 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0643\u0646 \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631 \u063a\u064a\u0631 \u0645\u0631\u0641\u0642\u0629. \u0631\u062c\u0627\u0621\u0627\u064b \u0627\u0639\u062f \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629", "id": "Anda mengirimkan sesuatu ke halaman login, tetapi karena suatu alasan tertentu password tidak terkirimkan, Silahkan coba lagi.", - "sr": "Iz nekog razloga autentifikacionom servisu nije prosle\u0111ena va\u0161a lozinka. Molimo poku\u0161ajte ponovo." + "lv": "Kaut k\u0101du iemeslu d\u0113\u013c parole nav nos\u016bt\u012bta. L\u016bdzu m\u0113\u0123iniet v\u0113lreiz.", + "sr": "Iz nekog razloga autentifikacionom servisu nije prosle\u0111ena va\u0161a lozinka. Molimo poku\u0161ajte ponovo.", + "ro": "A\u021bi trimis informa\u021bii c\u0103tre pagina de autentificare dar din motive necunoscute parola nu a fost trimis\u0103. V\u0103 rug\u0103m s\u0103 \u00eencerca\u021bi din nou.", + "eu": "Sarrera orrira zerbait bidali duzu baina, arrazoiren bategatik, pasahitza ez da bidali.Saia zaitez berriro, mesedez." }, "error_wrongpassword": { "no": "Feil brukernavn eller passord.", @@ -324,7 +354,7 @@ "lb": "Falschen Benotzernumm oder Passwuert", "sl": "Napa\u010dno uporabni\u0161ko ime ali geslo!", "da": "Forkert brugernavn eller kodeord", - "se": "Boastu geavahusnamma, beassansátni dehe organisašuvdna.", + "se": "Boastu geavahusnamma, beassans\u00e1tni dehe organisa\u0161uvdna.", "hr": "Neispravna korisni\u010dka oznaka ili zaporka.", "hu": "Hib\u00e1s felhaszn\u00e1l\u00f3i n\u00e9v vagy jelsz\u00f3!", "fi": "V\u00e4\u00e4r\u00e4 tunnus tai salasana.", @@ -332,6 +362,7 @@ "pt": "Nome de utilizador ou senha incorrecta.", "pl": "Nieprawid\u0142owa nazwa u\u017cytkownika lub has\u0142o.", "cs": "Nekorektn\u00ed jmeno nebo heslo.", + "eu": "Erabiltzaile-izena edo pasahitza okerra", "tr": "Kullan\u0131c\u0131 ad\u0131 ve\/veya \u015fifre yanl\u0131\u015f.", "lt": "Neteisingas prisijungimo vardas arba slapta\u017eodis.", "it": "Nome utente o password errati.", @@ -343,7 +374,9 @@ "zh": "\u9519\u8bef\u7684\u7528\u6237\u540d\u6216\u8005\u5bc6\u7801", "ar": " \u0627\u0633\u0645 \u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0648 \u0643\u0644\u0645\u0629 \u0633\u0631 \u062e\u0637\u0627", "id": "Username atau password salah", - "sr": "Neispravno korisni\u010dko ime ili lozinka." + "lv": "Nekorekts lietot\u0101ja v\u0101rds vai parole.", + "sr": "Neispravno korisni\u010dko ime ili lozinka.", + "ro": "Nume de utilizator incorect sau parola incorect\u0103." }, "contact_info": { "no": "Kontaktinformasjon:", @@ -362,6 +395,7 @@ "pt": "Contactos:", "pl": "Informacje kontaktowe:", "cs": "Kontaktn\u00ed informace", + "eu": "Harremanetarako informazioa:", "tr": "\u0130leti\u015fim bilgileri:", "lt": "Kontaktai:", "it": "Informazioni di contatto:", @@ -373,7 +407,9 @@ "zh": "\u8054\u7cfb\u65b9\u5f0f", "ar": "\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u062a\u0635\u0627\u0644", "id": "Informasi Kontak", - "sr": "Kontakt podaci:" + "lv": "Kontaktinform\u0101cija", + "sr": "Kontakt podaci:", + "ro": "Informa\u021bii de contact:" }, "select_home_org": { "no": "Velg vertsorganisasjon", @@ -381,7 +417,7 @@ "sv": "V\u00e4lj vilken organisation du kommer ifr\u00e5n", "es": "Seleccione su organizaci\u00f3n origen", "fr": "Choisissez votre fournisseur.", - "de": "W\u00e4hlen sie die Einrichtung, von der sie ihre Zugangsdaten beziehen", + "de": "W\u00e4hlen sie die Einrichtung, von der Sie ihre Zugangsdaten beziehen", "nl": "Kies je organisatie", "sl": "Izberite va\u0161o doma\u010do organizacijo", "da": "V\u00e6lg din hjemmeinstitution", @@ -403,7 +439,10 @@ "zh": "\u9009\u62e9\u4f60\u7684\u7ec4\u7ec7", "ar": "\u0627\u062e\u062a\u0627\u0631 \u062c\u0647\u062a\u0643 \u0627\u0644\u0627\u0645", "id": "Pilih Basis Organisasi Anda", - "sr": "Izaberite va\u0161u mati\u010dnu instituciju" + "lv": "Izv\u0113lieties organiz\u0101ciju", + "sr": "Izaberite va\u0161u mati\u010dnu instituciju", + "ro": "Alege\u021bi institu\u021bia de origine", + "eu": "Hautatu zure jatorrizko erakundea" }, "change_home_org_title": { "no": "Endre din vertsorganisasjon", @@ -411,7 +450,7 @@ "sv": "\u00c4ndra vilken organisation du kommer ifr\u00e5n", "es": "Cambiar su organizaci\u00f3n origen", "fr": "Changez votre fournisseur", - "de": "Eine andere Einrichtung, von der sie Zugangsdaten erhalten, ausw\u00e4hlen", + "de": "Eine andere Einrichtung, von der Sie Zugangsdaten erhalten, ausw\u00e4hlen", "nl": "Verander je organisatie", "sl": "Izberite va\u0161o doma\u010do organizacijo.", "da": "Skift hjemmeinstitution", @@ -433,7 +472,10 @@ "zh": "\u6539\u53d8\u4f60\u7684\u5bb6\u5ead\u7ec4\u7ec7", "ar": "\u063a\u064a\u0631\u0627\u0644\u062c\u0647\u0629 \u0627\u0644\u0627\u0645", "id": "Ubah basis organisasi anda", - "sr": "Promenite izbor za va\u0161u mati\u010dnu instituciju" + "lv": "Main\u012bt organiz\u0101ciju", + "sr": "Promenite izbor za va\u0161u mati\u010dnu instituciju", + "ro": "Modifica\u021bi institu\u021bia de origine", + "eu": "Zure jatorrizko erakundea aldatu" }, "change_home_org_text": { "no": "Du har valgt %HOMEORG%<\/b> som din vertsorganisasjon. Dersom dette er feil kan du velge en annen.", @@ -463,7 +505,10 @@ "zh": "\u4f60\u9009\u62e9\u4e86%HOMEORG%<\/b>\u4f5c\u4e3a\u4f60\u7684\u5bb6\u5ead\u7ec4\u7ec7\u3002\u5982\u679c\u9519\u4e86\u8bf7\u9009\u62e9\u5176\u4ed6\u7684", "ar": "\u0644\u0642\u062f \u0642\u0645\u062a \u0628\u0627\u062e\u062a\u064a\u0627\u0631 %HOMEORG%<\/b> \u0643\u062c\u0647\u062a\u0643 \u0627\u0644\u0627\u0645. \u0627\u0646 \u0643\u0627\u0646 \u0647\u0630\u0627 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d \u064a\u0645\u0643\u0646\u0643 \u062a\u063a\u064a\u064a\u0631\u0647", "id": "Anda telah memilih %HOMEORG%<\/b> sebagai basis organisasi anda. Jika ini salah anda dapat memilih yang lain.", - "sr": "Odabrali ste %HOMEORG%<\/b> kao va\u0161u mati\u010dnu instituciju. Ako to nije ta\u010dno mo\u017eete odabrati drugu instituciju." + "lv": "J\u016bs izv\u0113l\u0113j\u0101ties %HOMEORG%<\/b>. ja tas nav pareizi, izv\u0113lieties citu.", + "sr": "Odabrali ste %HOMEORG%<\/b> kao va\u0161u mati\u010dnu instituciju. Ako to nije ta\u010dno mo\u017eete odabrati drugu instituciju.", + "ro": "A\u021bi ales ca institu\u021bie de origine%HOMEORG%<\/b>. Dac\u0103 nu este corect v\u0103 rug\u0103m s\u0103 alege\u021bi alt\u0103 institu\u021bie.", + "eu": "%HOMEORG%<\/b> hautatu duzu zure jatorrizko erakunde bezala. Informazio hau okerra bada beste bat hautatu dezakezu." }, "change_home_org_button": { "no": "Velg vertsorganisasjon", @@ -493,7 +538,10 @@ "zh": "\u9009\u62e9\u4f60\u7684\u5bb6\u5ead\u7ec4\u7ec7", "ar": "\u0627\u062e\u062a\u0627\u0631 \u062c\u0647\u062a\u0643 \u0627\u0644\u0627\u0645", "id": "Pilih basis organisasi", - "sr": "Izaberite mati\u010dnu instituciju" + "lv": "Izv\u0113l\u0113ties organiz\u0101ciju", + "sr": "Izaberite mati\u010dnu instituciju", + "ro": "Alege\u021bi institu\u021bia de origine", + "eu": "Jatorrizko erakundea hautatu" }, "help_desk_link": { "no": "Hjemmesiden til brukerst\u00f8tte", @@ -513,7 +561,7 @@ "pl": "Strona domowa pomocy technicznej (Helpdesk)", "cs": "Help desk", "tr": "Yard\u0131m anasayfas\u0131", - "lt": "Vartotoj\u0173 aptarnavimo puslapis", + "lt": "Naudotoj\u0173 aptarnavimo puslapis", "it": "Homepage del servizio di assistenza", "ja": "\u30d8\u30eb\u30d7\u30c7\u30b9\u30af\u30da\u30fc\u30b8", "zh-tw": "\u5354\u52a9\u9801\u9762", @@ -523,7 +571,10 @@ "zh": "\u670d\u52a1\u53f0\u7684\u4e3b\u9875", "ar": "\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629", "id": "Homepage Help desk", - "sr": "Stranice slu\u017ebe za podr\u0161ku korisnicima" + "lv": "Pal\u012bdz\u012bbas dienesta interneta lapa", + "sr": "Stranice slu\u017ebe za podr\u0161ku korisnicima", + "ro": "Pagina echipei de suport tehnic", + "eu": "Laguntza teknikoaren orria " }, "help_desk_email": { "no": "Send e-post til brukerst\u00f8tte", @@ -543,7 +594,7 @@ "pl": "wy\u015blij e-mail do helpdesku", "cs": "Email helpdesku zasl\u00e1n.", "tr": "Yard\u0131m'a e-posta g\u00f6nderin", - "lt": "Si\u0173sti el. lai\u0161k\u0105 vartotoj\u0173 aptarnavimo specialistams", + "lt": "Si\u0173sti el. lai\u0161k\u0105 naudotoj\u0173 aptarnavimo specialistams", "it": "Invia una mail al servizio di assistenza", "ja": "\u30d8\u30eb\u30d7\u30c7\u30b9\u30af\u306b\u30e1\u30fc\u30eb\u3059\u308b", "zh-tw": "\u50b3\u9001 e-mail \u5c0b\u6c42\u5354\u52a9", @@ -553,7 +604,10 @@ "zh": "\u53d1\u9001Email\u7ed9\u670d\u52a1\u53f0", "ar": "\u0627\u0631\u0633\u0644 \u0625\u064a\u0645\u064a\u0644 \u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629", "id": "Kirim e-mail ke help dek", - "sr": "Po\u0161alji e-mail slu\u017ebi za podr\u0161ku korisnicima" + "lv": "S\u016bt\u012bt e-pastu pal\u012bdz\u012bbas dienestam", + "sr": "Po\u0161alji e-mail slu\u017ebi za podr\u0161ku korisnicima", + "ro": "Trimite\u021bi un mesaj la echipa de suport tehnic", + "eu": "Bidali posta laguntza teknikoari" }, "next": { "no": "Fortsett", @@ -583,6 +637,9 @@ "zh": "\u4e0b\u4e00\u6b65", "ar": "\u0627\u0644\u062a\u0627\u0644\u064a", "id": "Selanjutnya", - "sr": "Dalje" + "lv": "T\u0101l\u0101k", + "sr": "Dalje", + "ro": "Urm\u0103torul pas", + "eu": "Hurrengoa" } } diff --git a/inc/simplesamlphp/dictionaries/logout.translation.json b/inc/simplesamlphp/dictionaries/logout.translation.json index 31e474d..3f4a03d 100644 --- a/inc/simplesamlphp/dictionaries/logout.translation.json +++ b/inc/simplesamlphp/dictionaries/logout.translation.json @@ -16,6 +16,7 @@ "pt": "Sa\u00edda efectuada com sucesso", "pl": "Wylogowano", "cs": "Odhl\u00e1\u0161en", + "eu": "Saioa itxita.", "tr": "\u00c7\u0131kt\u0131n\u0131z", "it": "Disconnesso", "lt": "Atsijungta", @@ -25,15 +26,18 @@ "he": "\u05d4\u05ea\u05e0\u05ea\u05e7\u05d5\u05ea \u05de\u05d4\u05de\u05e2\u05e8\u05db\u05ea", "zh": "\u9000\u51fa", "ar": "\u062e\u0631\u0648\u062c", + "lv": "Atsl\u0113dzies", "id": "Log out", - "sr": "Odjavljeni ste" + "sr": "Odjavljeni ste", + "ro": "Ie\u0219ire din sistem (deautentificare)", + "ru": "\u0423\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434" }, "logged_out_text": { "no": "Du er n\u00e5 utlogget.", "nn": "Du har blitt logga ut. Takk for at du brukte denne tenesta.", "sv": "Du har blivit uloggad. Tack f\u00f6r att du anv\u00e4nde denna tj\u00e4nst.", "es": "Ha sido desconectado. Gracias por usar este servicio.", - "fr": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9. Merci d'utiliser ce service.", + "fr": "Vous avez \u00e9t\u00e9 d\u00e9connect\u00e9. Merci d'avoir utilis\u00e9 ce service.", "de": "Sie wurden abgemeldet. Danke, dass Sie diesen Dienst verwendet haben.", "nl": "U bent uitgelogd. Dank u voor het gebruiken van deze dienst.", "sl": "Odjava je bila uspe\u0161na. Hvala, ker uporabljate to storitev.", @@ -45,6 +49,7 @@ "pt": "Sa\u00edda efectuada com sucesso. Obrigado por ter usado este servi\u00e7o.", "pl": "Zosta\u0142e\u015b wylogowany. Dzi\u0119kuj\u0119 za skorzystanie z serwisu.", "cs": "Jste odhl\u00e1\u0161en. D\u011bkujeme za pou\u017eit\u00ed t\u00e9to slu\u017eby.", + "eu": "Saioa itxi da.", "tr": "\u00c7\u0131kt\u0131n\u0131z", "it": "Sei stato disconnesso", "lt": "J\u016bs buvote atjungtas nuo sistemos.", @@ -54,8 +59,11 @@ "he": "\u05d4\u05ea\u05e0\u05ea\u05e7\u05ea \u05de\u05df \u05d4\u05de\u05e2\u05e8\u05db\u05ea", "zh": "\u4f60\u5df2\u7ecf\u9000\u51fa\u4e86", "ar": "\u0644\u0642\u062f\u062e\u0631\u0648\u062c \u0644\u0642\u062f \u0642\u0645\u062a \u0628\u0627\u0644\u062e\u0631\u0648\u062c", + "lv": "J\u016bs esat izg\u0101jis no sist\u0113mas.", "id": "Anda telah log out.", - "sr": "Uspe\u0161no ste se odjavili." + "sr": "Uspe\u0161no ste se odjavili.", + "ro": "A\u021bi fost deautentificat", + "ru": "\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b" }, "default_link_text": { "no": "G\u00e5 tilbake til simpleSAMLphp installasjonen sin startside.", @@ -83,8 +91,12 @@ "he": "\u05d7\u05d6\u05d5\u05e8 \u05dc\u05d3\u05e3 \u05d4\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e9\u05dc simpleSAMLphp", "zh": "\u8fd4\u56desimpleSAMLphp\u5b89\u88c5\u9875\u9762", "ar": "\u0639\u062f \u0644\u0635\u0641\u062d\u0629 \u0625\u0646\u0632\u0627\u0644 simpleSAMLphp", + "lv": "Iet atpaka\u013c uz simpleSAMLphp instal\u0101cijas lapu", "id": "Kembali ke halaman instalasi simpleSAMLphp", - "sr": "Natrag na po\u010detnu stranicu simpleSAMLphp instalacije" + "sr": "Natrag na po\u010detnu stranicu simpleSAMLphp instalacije", + "ro": "Merge\u021bi \u00eenapoi la pagina de instalare a simpleSAMLphp", + "ru": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 simpleSAMLphp", + "eu": "Itzuli simpleSAMLphp instalazio orrira " }, "hold": { "no": "P\u00e5 vent", @@ -112,8 +124,12 @@ "pt-br": "Aguardando", "zh": "\u4fdd\u6301", "ar": "\u0628\u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 ", + "lv": "Aptur\u0113ts", "id": "Ditahan", - "sr": "Na \u010dekanju" + "sr": "Na \u010dekanju", + "ro": "\u00cen a\u0219teptare", + "ru": "\u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f", + "eu": "Itxaroten" }, "completed": { "no": "Fullf\u00f8rt", @@ -141,8 +157,12 @@ "pt-br": "Completado", "zh": "\u5b8c\u6210", "ar": "\u0627\u0643\u062a\u0645\u0644", + "lv": "Pabeigts", "id": "Selesai", - "sr": "Zavr\u0161eno" + "sr": "Zavr\u0161eno", + "ro": "Terminat", + "ru": "\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e", + "eu": "Amaitua" }, "progress": { "no": "Logger ut...", @@ -160,6 +180,7 @@ "pt": "A sair...", "pl": "Wylogowywanie...", "cs": "Odhla\u0161uji...", + "eu": "Saioa ixten...", "tr": "\u00c7\u0131k\u0131yor", "lt": "Atjungiama...", "it": "Disconnessione...", @@ -170,8 +191,11 @@ "pt-br": "Saindo do servi\u00e7o...", "zh": "\u6b63\u5728\u9000\u51fa", "ar": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c", + "lv": "Atsl\u0113g\u0161an\u0101s...", "id": "Log out...", - "sr": "Odjava u toku..." + "sr": "Odjava u toku...", + "ro": "Deautentificare ...", + "ru": "\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b..." }, "failed": { "no": "Utlogging feilet", @@ -199,8 +223,12 @@ "pt-br": "Falha ao sair do servi\u00e7o", "zh": "\u9000\u51fa\u5931\u8d25", "ar": "\u062a\u0633\u062c\u064a\u0644 \u062e\u0631\u0648\u062c \u0641\u0627\u0634\u0644", + "lv": "Atsl\u0113g\u0161an\u0101s neizdev\u0101s", "id": "Log out gagal", - "sr": "Odjava nije uspela" + "sr": "Odjava nije uspela", + "ro": "Deautentificarea a e\u0219uat", + "ru": "\u0412\u044b\u0445\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e", + "eu": "Saioa ixteko prozesuak huts egin du" }, "return": { "no": "Tilbake til tjenesten", @@ -218,6 +246,7 @@ "pt": "Regressar ao servi\u00e7o", "pl": "Powr\u00f3t do serwisu", "cs": "Zp\u00e1tky na slu\u017ebu", + "eu": "Itzuli zerbitzura", "tr": "Servise geri d\u00f6n", "lt": "Gr\u012f\u017eti \u012f paslaug\u0105", "it": "Ritornare al servizio", @@ -228,8 +257,11 @@ "pt-br": "Retornar ao servi\u00e7o", "zh": "\u8fd4\u56de\u81f3\u670d\u52a1", "ar": "\u0639\u062f \u0644\u0644\u062e\u062f\u0645\u0629", + "lv": "Atgriezties pie servisa", "id": "Kembali ke layanan", - "sr": "Povratak u aplikaciju" + "sr": "Povratak u aplikaciju", + "ro": "\u00centoarcere la serviciu", + "ru": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0441\u043b\u0443\u0436\u0431\u0435" }, "success": { "no": "Du har nå logget ut fra alle tjenestene listet ovenfor.", @@ -257,8 +289,12 @@ "pt-br": "Voc\u00ea saiu com sucesso de todos os servi\u00e7os listados acima.", "zh": "\u4f60\u6210\u529f\u7684\u9000\u51fa\u4e86\u4e0a\u9762\u5217\u8868\u4e2d\u7684\u670d\u52a1", "ar": "\u062a\u0633\u062c\u064a\u0644 \u062e\u0631\u0648\u062c \u0646\u0627\u062c\u062d \u0645\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0623\u0639\u0644\u0627\u0647 ", + "lv": "J\u016bs esat sekm\u012bgi atsl\u0113dzies un augst\u0101k uzskait\u012btajiem servisiem.", "id": "Anda telah berhasil log out dari semua layanan yang tercantuh diatas.", - "sr": "Uspe\u0161no ste se odjavili iz svih gore navedenih servisa." + "sr": "Uspe\u0161no ste se odjavili iz svih gore navedenih servisa.", + "ro": "A\u021bi fost deautentificat de la toate serviciile enumerate mai sus.", + "ru": "\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0436\u0431 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435.", + "eu": "Hemen adierazten den zerrendako zerbitzu guztietako saioak zuzen itxi dira" }, "loggedoutfrom": { "no": "Du er n\u00e5 logget ut fra %SP%.", @@ -286,8 +322,12 @@ "pt-br": "Voc\u00ea est\u00e1 saiu com sucesso de %SP%.", "zh": "\u4f60\u5df2\u6210\u529f\u4ece%SP%\u9000\u51fa", "ar": "\u0644\u0642\u062f \u062e\u0631\u062c\u062a \u0628\u0646\u062c\u0627\u062d \u0645\u0646 %SP%", + "lv": "J\u016bs esat sekm\u012bgi atsl\u0113dzies no %SP%.", "id": "Sekarang anda telah sukses log out dari %SP%.", - "sr": "Uspe\u0161no ste odjavljeni iz %SP%." + "sr": "Uspe\u0161no ste odjavljeni iz %SP%.", + "ro": "A\u021bi fost deautentificat din %SP%.", + "ru": "\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u0441\u043b\u0443\u0436\u0431\u044b %SP%.", + "eu": "%SP% saioa zuzen itxi da." }, "also_from": { "no": "Du er ogs\u00e5 logget inn p\u00e5 disse tjenestene:", @@ -315,8 +355,12 @@ "pt-br": "Voc\u00ea tamb\u00e9m est\u00e1 logado nestes servi\u00e7os:", "zh": "\u4f60\u540c\u65f6\u767b\u5f55\u8fd9\u4ee5\u4e0b\u8fd9\u4e9b\u670d\u52a1", "ar": "\u0644\u0642\u062f \u0642\u0645\u062a \u0628\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0644\u062e\u062f\u0645\u0627\u062a ", + "lv": "J\u016bs esat piesl\u0113dzies ar\u012b pie \u0161iem servisiem:", "id": "Anda juga telah log out dari layanan berikut: ", - "sr": "Tako\u0111e ste prijavljeni u slede\u0107im servisima:" + "sr": "Tako\u0111e ste prijavljeni u slede\u0107im servisima:", + "ro": "Sunte\u021bi autentificat \u0219i la urm\u0103toarele servicii:", + "ru": "\u0412\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043b\u0443\u0436\u0431\u0430\u043c:", + "eu": "Zerbitzu hauetan ere kautotuta zaude:" }, "logout_all_question": { "no": "Vil du logge ut fra alle tjenestene ovenfor?", @@ -332,6 +376,7 @@ "pt": "Deseja sair de todos os servi\u00e7os listados em cima?", "pl": "Czy chcesz zosta\u0107 wylogowany z powy\u017cszych serwis\u00f3w?", "cs": "Chcete se odhl\u00e1sit ze v\u0161ech t\u011bchto slu\u017eeb?", + "eu": "Goian agertzen diren zerbitzu guztietako saioak itxi nahi al dituzu?", "tr": "Yukar\u0131daki t\u00fcm servislerden \u00e7\u0131kmak istiyor musunuz?", "it": "Vuoi disconnetterti da tutti i servizi qui sopra riportati?", "fi": "Haluatko uloskirjautua edell\u00e4mainituista palveluista?", @@ -344,8 +389,11 @@ "pt-br": "Voc\u00ea quer sair de todos os servi\u00e7os acima?", "zh": "\u4f60\u60f3\u540c\u65f6\u4ece\u4e0a\u9762\u7684\u8fd9\u4e9b\u670d\u52a1\u4e2d\u9000\u51fa\u5417\uff1f", "ar": "\u0647\u0644 \u062a\u0631\u063a\u0628 \u0628\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0623\u0639\u0644\u0627\u061f", + "lv": "Vai v\u0113laties atsl\u0113gties no visiem uzskait\u012btajiem servisiem?", "id": "Apakah anda ingin logout dari semua layanan diatas ?", - "sr": "\u017delite li se odjaviti iz svih gore navedenih servisa?" + "sr": "\u017delite li se odjaviti iz svih gore navedenih servisa?", + "ro": "Dori\u021bi s\u0103 v\u0103 deautentifica\u021bi de la toate serviciile de mai sus ?", + "ru": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0436\u0431, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435?" }, "logout_all": { "no": "Ja, alle tjenestene over", @@ -362,6 +410,7 @@ "pt": "Sim, todos os servi\u00e7os", "pl": "Tak, wszystkie serwisy", "cs": "Ano, v\u0161echny slu\u017eby", + "eu": "Bai, zerbitzu guztiak", "tr": "Evet, t\u00fcm servisler.", "it": "Si, da tutti i servizi", "hr": "Da, iz svih servisa", @@ -373,14 +422,17 @@ "pt-br": "Sim, todos os servi\u00e7os", "zh": "\u662f\u7684\uff0c\u6240\u6709\u7684\u670d\u52a1", "ar": "\u0646\u0639\u0645 \u0645\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u062e\u062f\u0645\u0627\u062a", + "lv": "J\u0101, no visiem", "id": "Ya, semua layanan", - "sr": "Da, iz svih servisa" + "sr": "Da, iz svih servisa", + "ro": "Da, toate serviciile", + "ru": "\u0414\u0430, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0436\u0431" }, "logout_only": { "no": "Nei, bare %SP%", "nn": "Nei, logg berre ut fr\u00e5 %SP%", "sv": "Nej, endast %SP%", - "es": "No, s\u00f3lo %SPS", + "es": "No, s\u00f3lo %SP%", "fr": "Non, seulement de %SP%", "de": "Nein, nur %SP%", "nl": "Nee, alleen %SP%", @@ -391,6 +443,7 @@ "pt": "N\u00e3o, apenas %SP%", "pl": "Nie, tylko %SP%", "cs": "Ne, jen %SP%", + "eu": "Ez, %SP% bakarrik", "tr": "Hay\u0131r, sadece %SP%", "it": "No, solo da %SP%", "hr": "Ne, samo iz %SP%", @@ -402,8 +455,11 @@ "pt-br": "N\u00e3o, apenas de %SP%", "zh": "\u4e0d\uff0c\u4ec5%SP%", "ar": "\u0644\u0627 \u0645\u0646 %SP% \u0641\u0642\u0637", + "lv": "N\u0113, tikai %SP%", "id": "Tidak, hanya %SP%", - "sr": "Ne, samo iz %SP%" + "sr": "Ne, samo iz %SP%", + "ro": "Nu, doar %SP%", + "ru": "\u041d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0431\u044b %SP%" }, "incapablesps": { "no": "En eller flere av tjenestene du er logget inn p\u00e5 st\u00f8tter ikke logout<\/i>. Lukk nettleseren, dersom du \u00f8nsker \u00e5 logge ut fra disse tjenestene.", @@ -431,8 +487,12 @@ "pt-br": "Um ou mais dos servi\u00e7os que voc\u00ea est\u00e1 conectado n\u00e3o suportam logout.<\/i> Para garantir que todas as suas sess\u00f5es ser\u00e3o fechadas, incentivamos voc\u00ea a fechar seu navegador<\/i>.", "zh": "\u4e00\u4e2a\u6216\u591a\u4e2a\u4f60\u5df2\u767b\u5f55\u7684\u670d\u52a1\u4e0d\u652f\u6301\u9000\u51fa<\/i>\uff0c\u8bf7\u786e\u8ba4\u4f60\u6240\u6709sessions\u5df2\u5173\u95ed\uff0c\u6211\u4eec\u9f13\u52b1\u4f60 \u5173\u95ed\u6d4f\u89c8\u5668<\/i>", "ar": "\u0648\u0627\u062d\u062f\u0629 \u0627\u0648 \u0627\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u062a\u064a \u0642\u0645\u062a \u0628\u062a\u0633\u062c\u064a\u0644 \u062f\u062e\u0648\u0644\u0643 \u0628\u0647\u0627 \u0644\u0627 \u062a\u062f\u0639\u0645 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c. \u0644\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0646 \u062c\u0645\u064a\u0639 \u0635\u0641\u062d\u0627\u062a\u0643 \u0642\u062f \u062a\u0645 \u0625\u063a\u0644\u0627\u0642\u0647\u0627 \u0642\u0645 \u0628\u0625\u063a\u0644\u0627\u0642 \u0645\u062a\u0635\u0641\u062d\u0643", + "lv": "Viens vai vair\u0101ki J\u016bsu izmantotie servisi neatbalsta atsl\u0113g\u0161anos<\/i>. Lai aizv\u0113rtu visas sesijas, aizveriet savu interneta p\u0101rl\u016bku<\/i>.", "id": "Satu atau beberapa layanan yang anda telah login tidak mendukung logout<\/i>.Untuk meyakinkan semua session anda ditutup, anda disarankan untuk menutup web browser anda<\/i>.", - "sr": "Jedan ili vi\u0161e servisa na koje ste prijavljeni ne podr\u017eava odjavljivanje<\/i>. Da biste bili sigurni da su sve va\u0161e sesije zavr\u0161ene, preporu\u010dujemo da zatvorite web pretra\u017eiva\u010d<\/i>." + "sr": "Jedan ili vi\u0161e servisa na koje ste prijavljeni ne podr\u017eava odjavljivanje<\/i>. Da biste bili sigurni da su sve va\u0161e sesije zavr\u0161ene, preporu\u010dujemo da zatvorite web pretra\u017eiva\u010d<\/i>.", + "ro": "Unul sau mai multe servicii \u00een care sunte\u021bi autentificat nu suport\u0103 deautentificare<\/i>. Pentru a fi sigur c\u0103 toate sesiunile sunt \u00eenchise, v\u0103 rug\u0103m s\u0103 \u00eenchide\u021bi browser-ul<\/i>.", + "ru": "\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/i>. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0441\u0441\u0438\u0439, \u0437\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440<\/i>.", + "eu": "Kautotuta zauden zerbitzu bat edo batzuk ez dute uzten saioa ixten<\/i>. Zure saio guztiak ixten direla ziurtatzeko, zure nabigatzaileko leiho guztiak ixtea<\/i> gomendatzen da." }, "no": { "no": "Nei", @@ -449,6 +509,7 @@ "pt": "N\u00e3o", "pl": "Nie", "cs": "Ne", + "eu": "Ez", "tr": "Hay\u0131r", "it": "No", "hr": "Ne", @@ -460,8 +521,11 @@ "pt-br": "N\u00e3o", "zh": "\u4e0d", "ar": "\u0644\u0627", + "lv": "N\u0113", "id": "Tidak", - "sr": "Ne" + "sr": "Ne", + "ro": "Nu", + "ru": "\u041d\u0435\u0442" }, "logging_out_from": { "sl": "Odjava iz naslednjih storitev:", @@ -486,8 +550,13 @@ "pt-br": "Saindo dos seguintes servi\u00e7os:", "zh": "\u4ece\u4e0b\u5217\u670d\u52a1\u4e2d\u9000\u51fa", "ar": "\u062a\u0633\u062c\u064a\u0644 \u062e\u0631\u0648\u062c \u0645\u0646 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0623\u062f\u0646\u0627\u0647 ", + "lv": "Atsl\u0113g\u0161an\u0101s no \u0161iem servisiem:", "id": "Log out dari layanan-layanan berikut:", - "sr": "Odjavljujete se iz slede\u0107ih servisa" + "sr": "Odjavljujete se iz slede\u0107ih servisa", + "cs": "Odhl\u00e1\u0161en\u00ed z n\u00e1sleduj\u00edc\u00edch slu\u017eeb:", + "ro": "Deautentificare din urm\u0103toarele servicii:", + "ru": "\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043b\u0443\u0436\u0431:", + "eu": "Honako zerbitzu hauen saioak itxi:" }, "failedsps": { "sl": "Odjava z ene ali ve\u010d storitev ni uspela. Odjavo dokon\u010dajte tako, da zaprete spletni brskalnik<\/i>.", @@ -511,7 +580,12 @@ "pt-br": "Incapaz de sair de um ou mais servi\u00e7os. Para garantir que todas as suas sess\u00f5es ser\u00e3o fechadas, incentivamos voc\u00ea a fechar seu navegador<\/i>.", "zh": "\u65e0\u6cd5\u4ece\u4e00\u4e2a\u6216\u8005\u591a\u4e2a\u670d\u52a1\u4e2d\u9000\u51fa\uff0c\u8bf7\u786e\u8ba4\u4f60\u6240\u6709sessions\u5df2\u5173\u95ed\uff0c\u6211\u4eec\u9f13\u52b1\u4f60 \u5173\u95ed\u6d4f\u89c8\u5668<\/i>", "ar": "\u0644\u0645 \u0627\u0633\u062a\u0637\u0639 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c \u0645\u0646 \u0648\u0627\u062d\u062f\u0629 \u0627\u0648 \u0627\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u062e\u062f\u0645\u0627\u062a. \u0644\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0646 \u062c\u0645\u064a\u0639 \u0635\u0641\u062d\u0627\u062a\u0643 \u0642\u062f \u0623\u063a\u0644\u0642\u062a \u0642\u0645 \u0628\u0625\u063a\u0644\u0627\u0642 \u0645\u062a\u0635\u0641\u062d\u0643", + "lv": "Nav iesp\u0113jams atsl\u0113gties no viena vai vair\u0101kiem servisiem. Lai aizv\u0113rtu visas sesijas, aizveriet savu interneta p\u0101rl\u016bku<\/i>.", "id": "Tidak dapat log out dari satu atau beberapa layanan. Untuk memastikan semua session anda ditutup, anda disaranakan untuk menutup web browser anda<\/i>.", - "sr": "Odjavljivanje iz jednog ili vi\u0161e servisa nije uspelo. Da biste bili sigurni da su sve va\u0161e sesija zavr\u0161ene, preporu\u010dujemo da zatvorite web pretra\u017eiva\u010d<\/i>." + "sr": "Odjavljivanje iz jednog ili vi\u0161e servisa nije uspelo. Da biste bili sigurni da su sve va\u0161e sesija zavr\u0161ene, preporu\u010dujemo da zatvorite web pretra\u017eiva\u010d<\/i>.", + "cs": "Odhl\u00e1\u0161en\u00ed z jedn\u00e9 nebo z v\u00edce slu\u017eeb se nezda\u0159ilo. Aby bylo zaji\u0161t\u011bno, \u017ee v\u0161echny va\u0161e relace budou uzav\u0159eny, doporu\u010dujeme ukon\u010dit v\u00e1\u0161 webov\u00fd prohl\u00ed\u017ee\u010d<\/i>.", + "ro": "Nu a fost posibil\u0103 deautentificarea pentru unul sau mai multe servicii. Pentru a fi sigur c\u0103 toate sesiunile sunt \u00eenchise, v\u0103 rug\u0103m s\u0103 \u00eenchide\u021bi browser-ul<\/i>.", + "ru": "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0436\u0431. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0435\u0441\u0441\u0438\u0439, \u0437\u0430\u043a\u0440\u043e\u0439\u0442\u0435 \u0432\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440<\/i>. ", + "eu": "Ezinezkoa da zerbitzu bat edo batzuen saioak ixtea. Zure saio guztiak itxi direla ziurtatzeko, zure web nabigatzailea ixtea<\/i> gomendatzen da. " } } diff --git a/inc/simplesamlphp/dictionaries/status.translation.json b/inc/simplesamlphp/dictionaries/status.translation.json index 1b218e7..58d68b0 100644 --- a/inc/simplesamlphp/dictionaries/status.translation.json +++ b/inc/simplesamlphp/dictionaries/status.translation.json @@ -16,6 +16,7 @@ "pt": "Exemplo de demonstra\u00e7\u00e3o do SP SAML 2.0", "pl": "Przyk\u0142adowe Demo SAML 2.0 SP", "cs": "SAML 2.0 SP Demo", + "eu": "SAML 2.0 SP Adibidea", "tr": "SAML 2.0 SP Demo \u00d6rne\u011fi", "it": "Demo di SAML 2.0 SP", "lt": "SAML 2.0 SP Demonstracin\u0117s versijos Pavyzdys", @@ -25,8 +26,11 @@ "he": "\u05d4\u05d3\u05d2\u05de\u05ea \u05d3\u05d5\u05d2\u05de\u05d4 \u05dc\u05e1\"\u05e9 \u05de\u05e1\u05d5\u05d2 SAML 2.0", "zh": "SAML 2.0 SP\u6f14\u793a\u6848\u4f8b", "ar": "\u0627\u0633\u062a\u0639\u0631\u0627\u0636 \u0645\u062b\u0627\u0644 \u0644 SAML 2.0 SP", + "lv": "SAML 2.0 SP demonstr\u0101cijas piem\u0113rs", "id": "Contoh Demo SAML 2.0 SP", - "sr": "SAML 2.0 SP Demo Primer" + "sr": "SAML 2.0 SP Demo Primer", + "ro": "Exemplu demonstrativ de furnizor de servicii SAML 2.0", + "ru": "\u0414\u0435\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 SAML 2.0 SP" }, "header_shib": { "no": "Shibboleth Demo", @@ -45,6 +49,7 @@ "pt": "Exemplo de demonstra\u00e7\u00e3o do SP Shibboleth 1.3", "pl": "Demo Shibboleth", "cs": "Shibboleth demo", + "eu": "Shibboleth Adibidea", "tr": "Shibboleth demo", "it": "Demo di Shibboleth", "lt": "Shibboleth demonstracin\u0117 versija", @@ -54,8 +59,11 @@ "he": "\u05d4\u05d3\u05d2\u05de\u05d4 \u05dc- Shibboleth", "zh": "Shibboleth\u6f14\u793a", "ar": "\u0627\u0633\u062a\u0639\u0631\u0627\u0636 Shibboleth", + "lv": "Shibboleth demo", "id": "Demo Shibboleth", - "sr": "Shibboleth Demo" + "sr": "Shibboleth Demo", + "ro": "Demo Shibboleth", + "ru": "Shibboleth \u0434\u0435\u043c\u043e" }, "header_wsfed": { "no": "WS-Fed SP Demo Eksempel", @@ -74,6 +82,7 @@ "pt": "Exemplo de demonstra\u00e7\u00e3o do SP WS-Fed", "pl": "Przyk\u0142adowe Demo WS-Fed SP", "cs": "WS-Fed SP Demo", + "eu": "WS-Fed SP Adibidea", "tr": "WS-Fed SP Demo \u00d6rne\u011fi", "it": "Demo di WS-Fed SP", "lt": "WS-Fed SP Demonstracin\u0117s versijos Pavyzdys", @@ -83,8 +92,11 @@ "he": "\u05d4\u05d3\u05d2\u05de\u05ea \u05d3\u05d5\u05d2\u05de\u05d4 \u05dc\u05e1\"\u05e9 \u05de\u05e1\u05d5\u05d2 WS-Fed", "zh": "WS-Fed SP \u6f14\u793a\u6848\u4f8b", "ar": "\u0627\u0633\u062a\u0639\u0631\u0627\u0636 \u0645\u062b\u0627\u0644 \u0644 WS-Fed", + "lv": "WS-Fed SP demonstr\u0101cijas piem\u0113rs", "id": "Contoh Demo WS-Fed SP", - "sr": "WS-Fed SP Demo Primer" + "sr": "WS-Fed SP Demo Primer", + "ro": "Exemplu demonstrativ de WS-Fed", + "ru": "\u0414\u0435\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 WS-Fed SP" }, "header_diagnostics": { "no": "SimpleSAMLphp diagnostikk", @@ -103,6 +115,7 @@ "pt": "Diagn\u00f3sticos do simpleSAMLphp", "pl": "Diagnostyka SimpleSAMLphp", "cs": "SimpleSAMLphp diagnostika", + "eu": "simpleSAMLphp Diagnostikoa", "tr": "SimpleSAMLphp Kontroller", "it": "Diagnostici di SimpleSAMLphp", "lt": "SimpleSAMLphp Diagnostika", @@ -112,8 +125,11 @@ "he": "\u05d0\u05d9\u05d1\u05d7\u05d5\u05df SimpleSAMLphp", "zh": "SimpleSAMLphp \u8bca\u65ad", "ar": "\u062a\u0634\u062e\u064a\u0635 SimpleSAMLphp", + "lv": "SimpleSAMLphp diagnostika", "id": "Diagnostik SimpleSAMLphp", - "sr": "SimpleSAMLphp Dijagnostika" + "sr": "SimpleSAMLphp Dijagnostika", + "ro": "Diagnostic simpleSAMLphp", + "ru": "\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 SimpleSAMLphp" }, "some_error_occurred": { "no": "En feil har oppst\u00e5tt", @@ -132,6 +148,7 @@ "pt": "Ocorreu um erro", "pl": "Wystapi\u0142 jaki\u015b b\u0142\u0105d", "cs": "Nalezena chyba", + "eu": "Errore bat jazo da", "tr": "Hata olu\u015ftu", "it": "Si \u00e8 verificato un errore", "lt": "\u012evyko tam tikra klaida", @@ -141,8 +158,11 @@ "he": "\u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4", "zh": "\u67d0\u4e9b\u9519\u8bef\u53d1\u751f\u4e86", "ar": "\u0644\u0642\u062f \u062d\u062f\u062b \u062e\u0637\u0627 \u0645\u0627", + "lv": "Notikusi k\u013c\u016bda", "id": "Beberapa error telah terjadi", - "sr": "Desila se gre\u0161ka" + "sr": "Desila se gre\u0161ka", + "ro": "A ap\u0103rut o eroare", + "ru": "\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430" }, "intro": { "no": "Hei, dette er en statusside p\u00e5 simpleSAMLphp. Her kan du se om sesjonen din er timet ut, hvor lenge det er til den timer ut og attributter som er knyttet til din sesjon.", @@ -170,8 +190,12 @@ "he": "\u05e9\u05dc\u05d5\u05dd, \u05d6\u05d4\u05d5 \u05d3\u05e3 \u05d4\u05de\u05e6\u05d1 \u05e9\u05dc simpleSAMLphp. \u05db\u05d0\u05df \u05d0\u05e4\u05e9\u05e8 \u05dc\u05e8\u05d0\u05d5\u05ea \u05d0\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4, \u05db\u05de\u05d4 \u05d6\u05de\u05df \u05d4\u05d9\u05d0 \u05ea\u05de\u05e9\u05d9\u05da \u05e2\u05d3 \u05dc\u05d4\u05e4\u05e1\u05e7\u05ea\u05d4 \u05d5\u05db\u05dc \u05d4\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05d4\u05de\u05e6\u05d5\u05e8\u05e4\u05d5\u05ea \u05dc\u05e9\u05d9\u05d7\u05d4.", "zh": "\u55e8\uff0c\u8fd9\u662fsimpleSAMLphp\u72b6\u6001\u9875\u3002\u8fd9\u91cc\u4f60\u53ef\u4ee5\u770b\u5230\uff0c\u5982\u679c\u60a8\u7684\u4f1a\u8bdd\u8d85\u65f6\uff0c\u5b83\u6301\u7eed\u591a\u4e45\uff0c\u76f4\u5230\u8d85\u65f6\u548c\u8fde\u63a5\u5230\u60a8\u7684\u4f1a\u8bdd\u7684\u6240\u6709\u5c5e\u6027\u3002", "ar": "\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643\u0645 \u0641\u064a \u0635\u0641\u062d\u0629 \u062d\u0627\u0644\u0629 SimpleSAMLphp. \u064a\u0645\u0643\u0646\u0643 \u0647\u0646\u0627 \u0645\u0631\u0627\u0642\u0628\u0629 \u0648\u0642\u062a \u0627\u0646\u062a\u0647\u0627\u0621 \u062c\u0644\u0633\u062a\u0643\u060c \u0641\u062a\u0631\u0629 \u0627\u0633\u062a\u0645\u0631\u0627\u0631\u0647\u0627\u060c \u0645\u062a\u064a \u0633\u062a\u0646\u062a\u0647\u064a \u0648 \u062c\u0645\u064a\u0639 \u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u0645\u0631\u062a\u0628\u0637\u0629 \u0628\u0627\u0644\u062c\u0644\u0633\u0629", + "lv": "\u0160\u012b ir SimpleSAMLphp statusa lapa. Te J\u016bs varat redz\u0113t vai J\u016bsu sesija ir p\u0101rtraukta, cik ilgi t\u0101 bijusi akt\u012bva un visus ar to saist\u012btos atrib\u016btus.", "id": "Hai, ini adalah halaman status dari simpleSAMLphp. Disini anda dapat melihat jika session anda telah time out, berapa lama ia berlaku sampai time out dan semua attribut yang menempel pada session anda.", - "sr": "Ovo je stranica s prikazom aktuelnog stanja va\u0161e sesije. Na ovoj stranici mo\u017eete videti je li vam je istekla sesija, koliko \u0107e jo\u0161 dugo va\u0161a sesija trajati i sve atribute koji su vezani uz va\u0161u sesiju." + "sr": "Ovo je stranica s prikazom aktuelnog stanja va\u0161e sesije. Na ovoj stranici mo\u017eete videti je li vam je istekla sesija, koliko \u0107e jo\u0161 dugo va\u0161a sesija trajati i sve atribute koji su vezani uz va\u0161u sesiju.", + "ro": "Aceasta este pagina de stare pentru simpleSAMLphp. Aici pute\u021bi verifica dac\u0103 sesiunea dumneavoastr\u0103 a expirat, c\u00e2t timp mai este p\u00e2n\u0103 la expirarea sesiunii precum \u0219i toate atributele ata\u0219ate sesiunii dumneavoastr\u0103.", + "ru": "\u042d\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c SimpleSAMLphp. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u043e\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438.", + "eu": "Kaixo, hau simpleSAMLphp-ren egoera orria da. Hemendik ikus dezakezu zure saioa iraungi den, zenbat denbora geratzen den hau gerta dadin eta zure saioan dauden atributu guztiak." }, "validfor": { "no": "Din sesjon er gyldig i %SECONDS% sekunder fra n\u00e5.", @@ -199,8 +223,12 @@ "he": "\u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05dc\u05da \u05d1\u05e8\u05ea-\u05ea\u05d5\u05e7\u05e3 \u05dc\u05e2\u05d5\u05d3 %SECONDS% \u05e9\u05e0\u05d9\u05d5\u05ea \u05de\u05e2\u05db\u05e9\u05d9\u05d5.", "zh": "\u4f60\u7684\u4f1a\u8bdd\u5728%SECONDS%\u79d2\u5185\u6709\u6548", "ar": "\u0633\u062a\u0633\u062a\u0645\u0631 \u062c\u0644\u0633\u062a\u0643 \u0644\u066a\u0639\u062f\u062f \u062b\u0648\u0627\u0646\u064a\u066a \u062b\u0627\u0646\u064a\u0629 \u062a\u0628\u062f\u0623 \u0627\u0644\u0627\u0646", + "lv": "Sesija ir der\u012bga %SECONDS% sekundes no \u0161\u012b br\u012b\u017ea.", "id": "Session anda valid untuk %SECONDS% detik dari sekarang.", - "sr": "Va\u0161a sesija \u0107e biti validna jo\u0161 %SECONDS% sekundi." + "sr": "Va\u0161a sesija \u0107e biti validna jo\u0161 %SECONDS% sekundi.", + "ro": "Sesiunea dumneavoastr\u0103 mai este valid\u0103 \u00eenc\u0103 %SECONDS%.", + "ru": "\u0412\u0430\u0448\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 %SECONDS% \u0441\u0435\u043a\u0443\u043d\u0434.", + "eu": "Zure saioa %SECONDS% segundoz izango da baliagarri." }, "sessionsize": { "no": "Sesjons st\u00f8rrelse: %SIZE%", @@ -219,6 +247,7 @@ "pt": "Tamanho da sess\u00e3o: %SIZE%", "pl": "Rozmiar sesji: %SIZE%", "cs": "Velikost sezeni: %SIZE%", + "eu": "Saioaren tamaina: %SIZE%", "tr": "Oturum b\u00fcy\u00fckl\u00fc\u011f\u00fc: %SIZE%", "it": "Dimensione della session: %SIZE%", "lt": "Sesijos trukm\u0117: %SIZE%", @@ -229,8 +258,10 @@ "ru": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0441\u0441\u0438\u0438: %SIZE%", "zh": "Session \u5927\u5c0f: %SIZE%", "ar": "\u062d\u062c\u0645 \u0627\u0644\u062c\u0644\u0633\u0629 \u066a\u062d\u062c\u0645\u066a", + "lv": "Sesijas izm\u0113rs: %SIZE%", "id": "Ukuran session: %SIZE%", - "sr": "Veli\u010dina sesije: %SIZE%" + "sr": "Veli\u010dina sesije: %SIZE%", + "ro": "Dimensiunea sesiunii: %SIZE%" }, "attributes_header": { "no": "Dine attributter", @@ -249,6 +280,7 @@ "pt": "Os seus atributos", "pl": "Twoje atrybuty", "cs": "Va\u0161e atributy", + "eu": "Atributuak", "tr": "Bilgileriniz", "it": "I tuoi attributi", "lt": "J\u016bs\u0173 atributai", @@ -259,8 +291,10 @@ "ru": "\u0412\u0430\u0448\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b", "zh": "\u4f60\u7684\u5c5e\u6027", "ar": "\u0627\u0644\u0633\u0645\u0627\u062a", + "lv": "Atrib\u016bti", "id": "Attribut Anda", - "sr": "Va\u0161i atributi" + "sr": "Va\u0161i atributi", + "ro": "Atributele dumneavoastr\u0103" }, "logout": { "no": "Logg ut", @@ -279,6 +313,7 @@ "pt": "Sair", "pl": "Wyloguj", "cs": "Odhl\u00e1\u0161en\u00ed", + "eu": "Irten", "tr": "\u00c7\u0131k\u0131\u015f", "it": "Disconnessione", "lt": "Atsijungti", @@ -289,7 +324,9 @@ "ru": "\u0412\u044b\u0439\u0442\u0438", "zh": "\u9000\u51fa", "ar": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c", + "lv": "Atsl\u0113gties", "id": "Logout", - "sr": "Odjava" + "sr": "Odjava", + "ro": "Deautentificare" } } diff --git a/inc/simplesamlphp/docs/README b/inc/simplesamlphp/docs/README index 8f2f58e..acfa46b 100644 --- a/inc/simplesamlphp/docs/README +++ b/inc/simplesamlphp/docs/README @@ -2,13 +2,13 @@ Updated: December 19th, 2007 All you need to know to install and configure simpleSAMLphp is available at: -http://simplesamlphp.org/docs/ +https://simplesamlphp.org/docs/ simpleSAMLphp homepage: -http://rnd.feide.no/simplesamlphp +https://simplesamlphp.org/ simpleSAMLphp mailinglist (for support): -http://rnd.feide.no/content/simplesamlphp-users-mailinglist +https://simplesamlphp.org/lists To contact the author team: diff --git a/inc/simplesamlphp/docs/index.txt b/inc/simplesamlphp/docs/index.txt index effe463..89d85a1 100644 --- a/inc/simplesamlphp/docs/index.txt +++ b/inc/simplesamlphp/docs/index.txt @@ -2,18 +2,20 @@ SimpleSAMLphp Documentation =========================== * [Installing simpleSAMLphp](simplesamlphp-install) + * [Upgrade notes for version 1.13](simplesamlphp-upgrade-notes-1.13) + * [Upgrade notes for version 1.12](simplesamlphp-upgrade-notes-1.12) + * [Upgrade notes for version 1.11](simplesamlphp-upgrade-notes-1.11) * [Upgrade notes for version 1.10](simplesamlphp-upgrade-notes-1.10) * [Upgrade notes for version 1.9](simplesamlphp-upgrade-notes-1.9) * [Upgrade notes for version 1.8](simplesamlphp-upgrade-notes-1.8) * [Upgrade notes for version 1.7](simplesamlphp-upgrade-notes-1.7) * [Upgrade notes for version 1.6](simplesamlphp-upgrade-notes-1.6) * [Upgrade notes for version 1.5](simplesamlphp-upgrade-notes-1.5) - * [Installation from Subversion](simplesamlphp-subversion) + * [Installation from the repository](simplesamlphp-install-repo) * [Changelog](simplesamlphp-changelog) * [Using simpleSAMLphp as a SAML Service Provider](simplesamlphp-sp) * [Hosted SP Configuration Reference](./saml:sp) * [IdP remote reference](simplesamlphp-reference-idp-remote) - * [Connecting SimpleSAMLphp as a SP to UK Access Federation or InCommon](simplesamlphp-ukaccess) * [Upgrading - migration to use the SAML authentication source](simplesamlphp-sp-migration) * [Configuring HTTP-Artifact](./simplesamlphp-artifact-sp) * [Using scoping](./simplesamlphp-scoping) diff --git a/inc/simplesamlphp/docs/simplesamlphp-advancedfeatures.txt b/inc/simplesamlphp/docs/simplesamlphp-advancedfeatures.txt index ec5c275..79b9e45 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-advancedfeatures.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-advancedfeatures.txt @@ -7,7 +7,6 @@ simpleSAMLphp Advanced Features http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-advancedfeatures.txt 2943 2011-10-11 08:18:53Z olavmrk $` @@ -171,6 +170,56 @@ There is also an additional fallback for the private key and the certificate. If +Session checking function +------------------------- + +Optional session checking function, called on session init and loading, defined with 'session.check_function' in config.php. + +Example code for the function with GeoIP country check: + + + public static function checkSession($session, $init = FALSE) { + $data_type = 'example:check_session'; + $data_key = 'remote_addr'; + + $remote_addr = NULL; + if (!empty($_SERVER['REMOTE_ADDR'])) { + $remote_addr = (string)$_SERVER['REMOTE_ADDR']; + } + + if ($init) { + $session->setData($data_type, $data_key, $remote_addr, SimpleSAML_Session::DATA_TIMEOUT_SESSION_END); + return; + } + + if (!function_exists('geoip_country_code_by_name')) { + SimpleSAML_Logger::warning('geoip php module required.'); + return TRUE; + } + + $stored_remote_addr = $session->getData($data_type, $data_key); + if ($stored_remote_addr === NULL) { + SimpleSAML_Logger::warning('Stored data not found.'); + return FALSE; + } + + $country_a = geoip_country_code_by_name($remote_addr); + $country_b = geoip_country_code_by_name($stored_remote_addr); + + if ($country_a === $country_b) { + if ($stored_remote_addr !== $remote_addr) { + $session->setData($data_type, $data_key, $remote_addr, SimpleSAML_Session::DATA_TIMEOUT_SESSION_END); + } + + return TRUE; + } + + return FALSE; + } + + + + Support ------- @@ -181,7 +230,7 @@ you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-authproc.txt b/inc/simplesamlphp/docs/simplesamlphp-authproc.txt index 865a8de..51fae63 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-authproc.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-authproc.txt @@ -7,21 +7,20 @@ Authentication Processing Filters in SimpleSAMLphp http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-authproc.txt 3031 2012-02-13 12:50:35Z olavmrk $` -In SimpleSAMLphp, there is an API where you can *do stuff* at the IdP after authentication is complete, and just before you are sent back to the SP. The same API is available on the SP, after you have received a successfull Authentication Response from the IdP and before you are sent back to the SP application. +In SimpleSAMLphp, there is an API where you can *do stuff* at the IdP after authentication is complete, and just before you are sent back to the SP. The same API is available on the SP, after you have received a successful Authentication Response from the IdP and before you are sent back to the SP application. -Authentication processing filters postprocesses authentication information received from authentication sources. It is possible to use this for additional authentication checks, requesting the users consent before delivering attributes to the user, modifying the users attributes, and other things which should be performed before returning the user to the service provider he came from. +Authentication processing filters postprocess authentication information received from authentication sources. It is possible to use this for additional authentication checks, requesting the user's consent before delivering attributes about the user, modifying the user's attributes, and other things which should be performed before returning the user to the service provider he came from. Examples of neat things to do using Authentication Processing Filters: * Filter out a subset of available attributes that are sent to a SP. - * Mofify the name of attributes - * Generate new attributes that are composed of others. In example eduPersonTargetedID. - * Ask the user for consent, before the user is sent back to a service + * Modify the name of attributes. + * Generate new attributes that are composed of others, for example eduPersonTargetedID. + * Ask the user for consent, before the user is sent back to a service. * Implement basic Access Control on the IdP (not neccessarily a good idea), limiting access for some users to some SPs. Be aware that Authentication Proccessing Filters do replace some of the preivous features in simpleSAMLphp, named: @@ -35,7 +34,7 @@ Later in this document, we will desribe in detail the alternative Authentication How to configure Auth Proc Filters ---------------------------------- -*Auth Proc Filters* can be set globally, or to be specific for only one SP or one IdP. That means there is three locations where you can configure *Auth Proc Filters*: +*Auth Proc Filters* can be set globally, or to be specific for only one SP or one IdP. That means there are five locations where you can configure *Auth Proc Filters*: * Globally in `config.php` * On the SP: Specific for only the SP in `authsources.php` @@ -65,15 +64,15 @@ This configuration will execute *Auth Proc Filters* one by one, with the priorit The most important parameter of each item on the list is the *class* of the *Auth Proc Filter*. The syntax of the class is `modulename:classname`. As an example the class definition `core:AttributeLimit` will be expanded to look for the class `sspmod_core_Auth_Process_AttributeLimit`. The location of this class file *must* then be: `modules/core/lib/Auth/Process/AttributeLimit.php`. -You will see that a bunch of useful filters is included in the `core` module. In addition the `consent` module that is included in the simpleSAMLphp distribution implements a filter. Beyond that, you are encourage to create your own filters and share with the community. If you have created a cool *Auth Proc Filter* that do something useful, let us know, and we may share it from the [simpleSAMLphp web site][]. +You will see that a bunch of useful filters is included in the `core` module. In addition the `consent` module that is included in the simpleSAMLphp distribution implements a filter. Beyond that, you are encouraged to create your own filters and share with the community. If you have created a cool *Auth Proc Filter* that does something useful, let us know, and we may share it on the [simpleSAMLphp web site][]. -[simpleSAMLphp web site]: http://rnd.feide.no/simplesamlphp +[simpleSAMLphp web site]: http://simplesamlphp.org When you know the class definition of a filter, and the priority, the simple way to configure the filter is: 20 => 'core:TargetedID', -This is analogue to: +This is analogous to: 20 => array( 'class' => 'core:TargetedID' @@ -91,9 +90,9 @@ Some *Auth Proc Filters* have optional or required *parameters*. To send paramet ### Filters in `config.php` -Global *Auth Proc Filters* is configured in the `config.php` file. You will see that the config template already includes an example configuration. +Global *Auth Proc Filters* are configured in the `config.php` file. You will see that the config template already includes an example configuration. -There is two config parameters: +There are two config parameters: * `authproc.idp` and * `authproc.sp` @@ -109,8 +108,8 @@ Filters can be added both in `hosted` and `remote` metadata. Here is an example '__DYNAMIC:1__' => array( 'host' => '__DEFAULT_', - 'privatekey' => 'server.pem', - 'certificate' => 'server.crt', + 'privatekey' => 'example.org.pem', + 'certificate' => 'example.org.crt', 'auth' => 'feide', 'authproc' => array( 40 => 'core:AttributeRealm', @@ -132,7 +131,7 @@ The following filters are included in the simpleSAMLphp distribution: - [`core:AttributeAlter`](./core:authproc_attributealter): Do search-and-replace on attributevalues. - [`core:AttributeLimit`](./core:authproc_attributelimit): Limit the attributes in the response. - [`core:AttributeMap`](./core:authproc_attributemap): Change the name of the attributes. -- [`core:AttributeRealm`](./core:authproc_attributerealm): Create a attribute with the realm of the user. +- [`core:AttributeRealm`](./core:authproc_attributerealm): Create an attribute with the realm of the user. - [`core:GenerateGroups`](./core:authproc_generategroups): Generate a `group` attribute for the user. - [`core:LanguageAdaptor`](./core:authproc_languageadaptor): Transfering language setting from IdP to SP. - [`core:PHP`](./core:authproc_php): Modify attributes with custom PHP code. @@ -141,13 +140,15 @@ The following filters are included in the simpleSAMLphp distribution: - [`core:StatisticsWithAttribute`](./core:authproc_statisticswithattribute): Create a statistics logentry. - [`core:TargetedID`](./core:authproc_targetedid): Generate the `eduPersonTargetedID` attribute. - [`core:WarnShortSSOInterval`](./core:authproc_warnshortssointerval): Give a warning if the user logs into the same SP twice within a few seconds. -- ['expirycheck:ExpiryDate`](./expirycheck:expirycheck): Block access to accounts that have expired. +- [`expirycheck:ExpiryDate`](./expirycheck:expirycheck): Block access to accounts that have expired. - [`preprodwarning:Warning`](./preprodwarning:warning): Warn the user about accessing a test IdP. - [`saml:AttributeNameID`](./saml:nameid): Generate custom NameID with the value of an attribute. -- [`saml:ExpectedAuthnContextClassRef`](./saml:authproc_expectedauthncontextclassref): Verify the user's authnentication context. +- [`saml:ExpectedAuthnContextClassRef`](./saml:authproc_expectedauthncontextclassref): Verify the user's authentication context. - [`saml:NameIDAttribute`](./saml:nameidattribute): Create an attribute based on the NameID we receive from the IdP. - [`saml:PersistentNameID`](./saml:nameid): Generate persistent NameID from an attribute. +- [`saml:PersistentNameID2TargetedID`](./saml:nameid): Store persistent NameID as eduPersonTargetedID. - [`saml:TransientNameID`](./saml:nameid): Generate transient NameID. +- [`smartattributes:SmartID`](./smartattributes:smartattributes): Generate user ID attribute based on several attributes. @@ -156,7 +157,7 @@ Writing your own Auth Proc Filter Look at the included *Auth Proc Filters* as examples. Copy the classes into your own module and start playing around. -Authentication processing filters are created by creating a class under `Auth/Process/` in a module. This class is expected to subclass `SimpleSAML_Auth_ProcessingFilter`. A filter must implement at lease one function - the `process(&$request)`-function. This function can access the `$request`-array add, delete and modify attributes, and can also do more advanced processing based on the SP/IdP metadata (which is also included in the `$request`-array). When this function returns, it is assumed that the filter has finished processing. +Authentication processing filters are created by creating a class under `Auth/Process/` in a module. This class is expected to subclass `SimpleSAML_Auth_ProcessingFilter`. A filter must implement at least one function - the `process(&$request)`-function. This function can access the `$request`-array to add, delete and modify attributes, and can also do more advanced processing based on the SP/IdP metadata (which is also included in the `$request`-array). When this function returns, it is assumed that the filter has finished processing. If a filter for some reason needs to redirect the user, for example to show a web page, it should save the current request. Upon completion it should retrieve the request, update it with the changes it is going to make, and call `SimpleSAML_Auth_ProcessingChain::resumeProcessing`. This function will continue processing the next configured filter. diff --git a/inc/simplesamlphp/docs/simplesamlphp-automated_metadata.txt b/inc/simplesamlphp/docs/simplesamlphp-automated_metadata.txt index 1add631..05d65fc 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-automated_metadata.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-automated_metadata.txt @@ -7,18 +7,17 @@ Automated Metadata Management http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-automated_metadata.txt 3034 2012-02-16 07:30:11Z olavmrk $` Introduction ------------ -If you want to connect an Identity Provider, or a Service Provider to a **federation**, you need to setup metadata for the entries that you trust. In many federation, in particular federations based upon the Shibboleth software, it is normal to setup automated distributed metadata using the SAML 2.0 Metadata XML Format. +If you want to connect an Identity Provider, or a Service Provider to a **federation**, you need to setup metadata for the entries that you trust. In many federations, in particular federations based upon the Shibboleth software, it is normal to setup automated distribution of metadata using the SAML 2.0 Metadata XML Format. Some central administration or authority, provides a URL with a SAML 2.0 document including metadata for all entities in the federation. -This document explains how to setup automated downloading and parsing of a metadata document on a specific URL. +The present document explains how to setup automated downloading and parsing of a metadata document on a specific URL. @@ -30,11 +29,11 @@ You need to enable the following modules: 1. cron 2. metarefresh -The cron module allows you to do tasks regularly, by setting up a cronjob that calls a hook in simpleSAMLphp. +The cron module allows you to do tasks regularly, by setting up a cron job that calls a hook in simpleSAMLphp. -The metarefresh module will download and parse the metadata document and store it in cached local metadata files. +The metarefresh module will download and parse the metadata document and store it in metadata files cached locally. -You also need to copy the `config-templates` files from the two modules above, into the global `config/` directory. +First, you will need to copy the `config-templates` files of the two modules above into the global `config/` directory. [root@simplesamlphp] cd /var/simplesamlphp [root@simplesamlphp simplesamlphp] touch modules/cron/enable @@ -44,89 +43,17 @@ You also need to copy the `config-templates` files from the two modules above, i -Testing to parse the metadata document --------------------------------------- +Testing it manually +------------------- -We'll use the SWITCH AAI Test Federation as an example in this document. This federation provides metadata on this URL: - - http://metadata.aai.switch.ch/metadata.aaitest.xml - -I reccomend to first test on the command line to parse the metadata URL. +It is often useful to verify that the metadata sources we want to use can be parsed and verified by metarefresh, before actually +configuring it. We can do so in the command line, by invoking metarefresh with the URL of the metadata set we want to check. For +instance, if we want to configure the metadata of the SWITCH AAI Test Federation: cd modules/metarefresh/bin ./metarefresh.php -s http://metadata.aai.switch.ch/metadata.aaitest.xml -We use the `-s` option to send output to console (for testing purposes). If the output makes sense, continue. If you get a lot of error messages, send an e-mail to the simpleSAMLphp list and ask for advice. - - -Below is the documentation provided by Nuno Gonçalves - - - - -Configuring the cron module ---------------------------- - - -At `/var/simplesamlphp/config` - - [root@simplesamlphp-teste config]# vi module_cron.php - -edit: - - $config = array ( -        'key' => 'kb10fu2sao', -        'allowed_tags' => array('daily', 'hourly', 'frequent'), -        'debug_message' => TRUE, -        'sendemail' => TRUE, - - ); - -Then: With your browser go to => https://simplesamlphp_machine/simplesaml/module.php/cron/croninfo.php - -And copy the cron's sugestion: - - ------------------------------------------------------------------------------------------------------------------- - Cron is a way to run things regularly on unix systems. - - Here is a suggestion for a crontab file: - - # Run cron [daily] - 02 0 * * * curl --silent "https://simplesamlphp-teste.fccn.pt/simplesaml/module.php/cron/cron.php?key=kb10fu2sao&tag=daily" > /dev/null 2>&1 - # Run cron [hourly] - 01 * * * * curl --silent "https://simplesamlphp-teste.fccn.pt/simplesaml/module.php/cron/cron.php?key=kb10fu2sao&tag=hourly" > /dev/null 2>&1 - # Run cron [frequent] - XXXXXXXXXX curl --silent "https://simplesamlphp-teste.fccn.pt/simplesaml/module.php/cron/cron.php?key=kb10fu2sao&tag=frequent" > /dev/null 2>&1 - Click here to run the cron jobs: - - Run cron [daily] - Run cron [hourly] - Run cron [frequent] - ------------------------------------------------------------------------------------------------------------------- - -Add to CRON with - - [root@simplesamlphp config]# crontab -e - - - -Errors ------- - -Problem with sanitycheck module - -When executing [Run cron [daily]] ==> an error shows up - -Cause : module sanitycheck  ==> It is active by default (`/var/simplesamlphp/modules/sanitycheck/default-enable`) - - * When executing Cron daily It will search all active modules and it executes the hook_cron.php for each one of them in : - `/var/simplesamlphp/modules//hooks/hooks_cron.php` - -Meanwhile it is waiting that each module conf file exists in the folder: `/var/simplesamlphp/config/config-.php` - -It should exist one for the sanitycheck module => `config-sanitycheck.php` but it wasn't there and therefore the error showed up. - -Giving an error at this modules it aborted execution for the next active modules. +The `-s` option sends the output to the console (for testing purposes). If the output makes sense, continue. If you get a lot of error messages, try to read them and fix the problems that might be causing them. If you are having problems and you can't figure out the cause, you can always send an e-mail to the simpleSAMLphp mailing list and ask for advice. @@ -134,53 +61,62 @@ Configuring the metarefresh module ---------------------------------- -At `/var/simplesamlphp/config/` +Now we are going to proceed to configure the metarefresh module. First, edit the appropriate configuration file: - [root@simplesamlphp config]# vi config-metarefresh.php + [root@simplesamlphp simplesamlphp]# vi config/config-metarefresh.php -edit: +Here's an example of a possible configuration for both the Kalmar Federation and UK Access Management Federation: - $config = array( 'sets' => array( - - 'kalmar' => array( - 'cron' => array('hourly'), - 'sources' => array( - array( - 'src' => 'https://kalmar.feide.no/simplesaml/module.php/aggregator/?id=kalmarcentral&mimetype=text/plain&exclude=norway', - 'validateFingerprint' => '591d4b4670463eeda91fcc816dc0af2a092aa801', - 'template' => array( - 'tags' => array('kalmar'), - 'authproc' => array( - 51 => array('class' => 'core:AttributeMap', 'oid2name'), + $config = array( + 'sets' => array( + 'kalmar' => array( + 'cron' => array('hourly'), + 'sources' => array( + array( + 'src' => 'https://kalmar.feide.no/simplesaml/module.php/aggregator/?id=kalmarcentral&mimetype=text/plain&exclude=norway', + 'validateFingerprint' => '591d4b4670463eeda91fcc816dc0af2a092aa801', + 'template' => array( + 'tags' => array('kalmar'), + 'authproc' => array( + 51 => array('class' => 'core:AttributeMap', 'oid2name'), + ), ), ), ), + 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. + 'outputDir' => 'metadata/metarefresh-kalmar/', + 'outputFormat' => 'flatfile', ), - 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. - 'outputDir' => 'metadata/federation/', - - /* - * Which output format the metadata should be saved as. - * Can be 'flatfile' or 'serialize'. 'flatfile' is the default. - */ - 'outputFormat' => 'flatfile', - ), - )); - - TEMPLATE FILE : /var/simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php + 'uk' => array( + 'cron' => array('hourly'), + 'sources' => array( + array( + 'src' => 'http://metadata.ukfederation.org.uk/ukfederation-metadata.xml', + 'validateFingerprint' => 'D0:E8:40:25:F0:B1:2A:CC:74:22:ED:C3:87:04:BC:29:BB:7B:9A:40', + ), + ), + 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. + 'outputDir' => 'metadata/metarefresh-ukaccess/', + 'outputFormat' => 'serialize', + ), + ) + ); -The configuration consists of one or more metadata sets. Each metadata -set has its own configuration. The following options are available: +The configuration consists of one or more metadata sets. Each metadata set has its own configuration, representing a metadata set of sources. +Some federations will provide you with detailed instructions on how to configure metarefresh to fetch their metadata automatically, like, +for instance, [the InCommon federation in the US](https://spaces.internet2.edu/x/eYHFAg). Whenever a federation provides you with specific +instructions to configure metarefresh, be sure to use them from the authoritative source. + +The metarefresh module supports the following configuration options: `cron` -: Which of the cron tags will refresh this metadata set. +: Which cron tags will refresh this metadata set. `sources` -: An array of metadata sources which will be included in this - metadata set. The contents of this option will be described in more - detail later. +: An array of metadata sources that will be included in this + metadata set. The contents of this option will be described later in more detail. `expireAfter` : The maximum number of seconds a metadata entry will be valid. @@ -204,28 +140,76 @@ Each metadata source has the following options: on the metadata. `template` -: This is an array which will be combined with the fetched metadata to +: This is an array which will be combined with the metadata fetched to generate the final metadata array. -After you have configured the metadata source, you need to give the -web-server write access to the output directory. Depending on the -platform, this may be done by a command similar to: +After you have configured the metadata sources, you need to give the +web-server write access to the output directories. Following the previous example: - chown www-data /var/simplesamlphp/metadata/metadata-federation/ + chown www-data /var/simplesamlphp/metadata/metarefresh-kalmar/ + chown www-data /var/simplesamlphp/metadata/metarefresh-ukaccess/ -Then configure your simpleSAMLphp installation to use the generated metadata: - -In config.php: +Now you can configure simpleSAMLphp to use the metadata fetched by metarefresh. Edit the main +config.php file, and modify the `metadata.sources` directive accordingly: 'metadata.sources' => array( array('type' => 'flatfile'), - array('type' => 'flatfile', 'directory' => 'metadata/federation'), + array('type' => 'flatfile', 'directory' => 'metadata/metarefresh-kalmar'), + array('type' => 'serialize', 'directory' => 'metadata/metarefresh-ukaccess'), ), +Remember that the `type` parameter here must match the `outputFormat` in the configuration of the module. -Metadata cacheDuration ----------------------- -SAML metadata may supply a cacheDuration attribute which indicates the maxium time to cache metadata. Because this module is run from cron, it cannot influence how often it is run and enfore this attribute by itself. Take care that you run metarefresh from cron at least as often as the shortest cacheDuration in your metadata sources. + +Configuring the cron module +--------------------------- + + +Once we have configured metarefresh, we can edit the configuration file for the cron module: + + [root@simplesamlphp simplesamlphp]# vi config/module_cron.php + +The configuration should look similar to this: + + $config = array ( +        'key' => 'RANDOM_KEY', +        'allowed_tags' => array('daily', 'hourly', 'frequent'), +        'debug_message' => TRUE, +        'sendemail' => TRUE, + + ); + +Bear in mind that the key is used as a security feature, to restrict access to your cron. Therefore, you need to make sure that the string here is a random key available to no one but you. Additionally, make sure that you include here the appropriate tags that you previously told metarefresh +to use in the `cron` directive. + +Next, use your web browser to go to `https://YOUR_SERVER/simplesaml/module.php/cron/croninfo.php`. Make sure to properly set your server's address, as well as use HTTP or HTTPS accordingly, and also to specify the correct path to the root of your simpleSAMLphp installation. + +Now, copy the cron configuration suggested: + + # Run cron [daily] + 02 0 * * * curl --silent "https://YOUR_SERVER/simplesaml/module.php/cron/cron.php?key=RANDOM_KEY&tag=daily" > /dev/null 2>&1 + # Run cron [hourly] + 01 * * * * curl --silent "https://YOUR_SERVER/simplesaml/module.php/cron/cron.php?key=RANDOM_KEY&tag=hourly" > /dev/null 2>&1 + +Finally, add it to your crontab by going back to the terminal, and editing with: + + [root@simplesamlphp config]# crontab -e + +This will open up your favourite editor. If an editor different than the one you use normally appears, exit, and configure the `EDITOR` variable +to tell the command line which editor it should use: + + [root@simplesamlphp config]# export EDITOR=emacs + +If you want to force the metadata to be refreshed manually, you can do so by going back to the cron page in the web interface. Then, just follow +the appropriate links to execute the cron jobs you want. The page will take a while loading, and eventually show a blank page. It is so because +the commands are intended to be run from cron, and therefore they produce no output. If this operation seems to run fine, navigate to the **SimpleSAMLphp Front page** › **Federation**. Here you will see a list of all the Identity Providers trusted. They will be listed with information about the maximum duration of their cached version, such as *(expires in 96.0 hours)*. + + + +Metadata duration +----------------- + +SAML metadata may supply a `cacheDuration` attribute which indicates the maximum time to keep metadata cached. Because this module is run from cron, it cannot decide how often it is run and enforce this duration on its own. Make sure to run metarefresh from cron at least as often as the shortest `cacheDuration` in your metadata sources. diff --git a/inc/simplesamlphp/docs/simplesamlphp-changelog.txt b/inc/simplesamlphp/docs/simplesamlphp-changelog.txt index 2ed3b7c..0344fa7 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-changelog.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-changelog.txt @@ -6,6 +6,292 @@ simpleSAMLphp changelog This document lists the changes between versions of simpleSAMLphp. See the upgrade notes for specific information about upgrading. +## Version 1.13.2 + +Released 2014-11-04 + + * Solved performance issues when processing large metadata sets. + * Fix an issue in the web interface when only one language is enabled. + +## Version 1.13.1 + +Released 2014-10-27 + + * Solved an issue with empty fields in metadata to cause SimpleSAMLphp to fail with a translation error. Issues #97 and #114. + * Added Basque language to the list of known languages. Issue #117. + * Optimized the execution of redirections by removing an additional, unnecessary function call. + * Solved an issue that caused SimpleSAMLphp to fail when the RelayState parameter was empty or missing on an IdP-initiated authentication. Issues #99 and # 104. + * Fixed a certificate check for SubjectConfirmations with Holder of Key methods. + +## Version 1.13 + +Released 2014-09-25. + + * Added the 'remember me' option to the default login page. + * Improved error reporting. + * Added a new 'logging.format' option to control the formatting of the logs. + * Added support for the 'objectguid' binary attribute in LDAP modules. + * Added support for custom search and private attributes read credentials in all LDAP modules. + * Added support for the WantAuthnRequestsSigned option in generated SAML metadata. + * Tracking identifiers are no longer generated based on MD5. + * Several functions, classes and interfaces marked as deprecated. + * Bug fixes and documentation enhancements. + * Updated translations. + * New language: Basque. + +### `adfs` + + * Honour the 'wreply' parameter when redirecting. + +### `aggregator` + + * Fixed an issue when regenerating metadata from certain metadata sources. + +### `aselect` + + * Bug fixes. + +### `discopower` + + * Bug fix. + +### `expirycheck` + + * Translations are now possible for this module. + +### `metarefresh` + + * Use cached metadata if something goes wrong when refreshing feeds. + +### `oauth` + + * Bug fix. + +### `openidProvider` + + * Fix for compatibility with versions of PHP greater or equal to 5.4. + +### `saml` + + * Make it possible to add friendly names to attributes in SP metadata. + * The RSA_1.5 (RSA with PKCS#1 v1.5 padding) encryption algorithm is now blacklisted by default for security reasons. + * Stop checking the 'IDPList' parameter in IdPs. + * Solved an issue that allowed bypassing authentication status checks when presenting an 'IDPList' parameter. + * The 'Destination' attribute is now always sent in logout responses issued by an SP. + +### `sqlauth` + + * Updated documentation to remove bad practice with regard to password storage. + +## Version 1.12 + +Released 2014-03-24. + + * Removed example authproc filters from configuration template. + * Stopped using the 'target-densitydpi' option removed from WebKit. + * The SimpleSAML_Utilities::generateRandomBytesMTrand() function is now deprecated. + * Removed code for compatibility with PHP versions older than 5.3. + * Removed the old interface of SimpleSAML_Session. + * Fixed a memory leak in SimpleSAML_Session regarding serialization and unserialization. + * Support for RegistrationInfo (MDRPI) elements in the metadata of identity and service providers. + * Renamed SimpleSAML_Utilities::parseSAML2Time() function to xsDateTimeToTimestamp(). + * New SimpleSAML_Utilities::redirectTrustedURL() and redirectUntrustedURL() functions. + * Deprecated the SimpleSAML_Utilities::redirect() function. + * Improved Russian translation. + * Added Czech translation. + * New 'errorreporting' option to enable or disable error reporting feature. + * Example certificate removed. + * New SimpleSAML_Configuration::getEndpointPrioritizedByBinding() function. + * PHP 5.3 or newer required. + * Started using Composer as dependency manager. + * Detached the basic SAML2 library and moved to a standalone library in github. + * Added support for exporting shibmd:Scope metadata with regular expressions. + * Remember me option in the IdP. + * New SimpleSAML_Utilities::setCookie wrapper. + * Custom HTTP codes on error. + * Added Romanian translation. + * Bug fixes and documentation enhancements. + +### `adfs` + + * Support for exporting metadata. + +### `aggregator` + + * Support for RegistrationInfo (MDRPI) elements in the metadata. + * Fix for HTTP header injection vulnerability. + * Fix for directory traversal vulnerability. + +### `aggregator2` + + * Support for RegistrationInfo (MDRPI) elements in the metadata. + +### `aselect` + + * License changed to LGPL 2.1. + +### `authfacebook` + + * Updated extlibinc to 3.2.2. + +### `authtwitter` + + * Added 'force_login' configuration option. + +### `cdc` + + * Bugfix related to request validation. + +### `core` + + * The AttributeAlter filter no longer throws an exception if the attribute was not found. + * Support for removal of values in the AttributeAlter filter, with '%remove' flag. + * Support for empty strings and NULL values as a replacement in the AttributeAlter filter. + * Bugfixes in the AttributeAlter filter. + * Support for NULL attribute values. + * Support for limiting values and not only attributes in the AttributeLimit filter. + * Log a message when a user authenticates successfully. + * Added %duplicate flag to AttributeMap, to leave original names in place when using map file. + * Fix infinite loop when overwriting attributes with AttributeMap. + +### `discopower` + + * Bugfix for incorrect handling of the 'idpdisco.extDiscoveryStorage' option. + +### `ldap` + + * Support for configuring the duplicate attribute handling policy in AttributeAddFromLDAP, 'attribute.policy' option. + * Support for binary attributes in the AttributeAddFromLDAP filter. + * Support for multiple attributes in the AttributeAddFromLDAP filter. + +### `metarefresh` + + * Support for specifying permissions of the resulting files. + +### `negotiate` + + * Added support for "attributes"-parameter. + +### `oauth` + + * Bugfix related to authorize URL building. + +### `openidProvider` + + * Support for SReg and AX requests. + +### `saml` + + * Send 'isPassive' in passive discovery requests. + * Support for generating NameIDFormat in service providers with NameIDPolicy set. + * Support for AttributeConsumingService and AssertionConsumingServiceIndex. + * Support for the HTTP-POST binding in WebSSO profile. + * Fix for entity ID validation problems when using the IDPList configuration option. + +### `smartattributes` + + * New 'add_candidate' option to allow the user to decide whether to prepend or not the candidate attribute name to the resulting value. + +### `statistics` + + * Bugfix in statistics aggregator. + +## Version 1.11 + +Released 2013-06-05. + + * Support for RSA_SHA256, RSA_SHA384 and RSA_SHA512 in HTTP Redirect binding. + * Support for RegistrationInfo element in SAML 2.0 metadata. + * Support for AuthnRequestsSigned and WantAssertionsSigned when generating metadata. + * Third party OpenID library updated with a bugfix. + * Added the Name attribute to EntitiesDescriptor. + * Removed deprecated option 'session.requestcache' from config-template. + * Workaround for SSL SNI extension not being correctly set. + * New language cookie and parameter config options. + * Add 'module.enable' configuration option for enabling/disabling modules. + * Check for existence of memcache extension. + * Initial support for limiting redirects to trusted hosts. + * Demo example now shows both friendly and canonical name of the attributes. + * Other minor fixes for bugs and typos. + * Several translations updated. + * Added Latvian translation. + +### `authorize` + + * Added a logout link to the 403 error page. + +### `authtwitter` + + * Updated API endpoint for version 1.1. + * Fix for oauth_verifier parameter. + +### `authX509` + + * ldapusercert validation made optional. + +### `consent` + + * Added support for SQLite databases. + +### `core` + + * Fix error propagation in UserPass(Org)Base authentication sources. + * MCrypt module marked as required. + +### `discopower` + + * Get the name of an IdP from mdui:DisplayName. + +### `expirycheck` + + * PHP 5.4 compatibility fixes. + +### `InfoCard` + + * PHP 5.4 compatibility fixes. + +### `ldap` + + * Added an option to disable following referrals. + +### `metarefresh` + + * Improved help message. + +### `oauth` + + * PHP 5.4 compatibility fixes. + +### `saml` + + * Verify that the issuer of an AuthnResponse is the same entity ID we sent a request to. + * Added separate option to enable Holder of Key support on SP. + * Fix for HoK profile metadata. + * New filter for storing persistent NameID in eduPersonTargetedID attribute. + * Support for UIInfo elements. + * Bugfix for SAML SP metadata signing. + * Ignore default technical contact. + * Support for MDUI elements in SP metadata. + * Support for more contact types in SP metadata. + * New information in statistics with the time it took for a login to happen. + +### `sanitycheck` + + * Configuration file made optional. + +### `smartattributes` + + * New filter: smartattributes:SmartID. + * New filter: smartattributes:SmartName. + +### `smartnameattribute` + + * Deprecated. + +### `wsfed` + + * Support for SLO in WS-Fed. + ## Version 1.10 Released 2012-09-25. @@ -58,7 +344,7 @@ Released 2012-06-13. * Warnings about URL length limits from Suhosin PHP extension. * New base class for errors from authentication sources. * Support for overriding URL generation when behind a reverse proxy. - * New lanugages: Russian, Estonian, Hebrew, Chinese, Indonesian + * New languages: Russian, Estonian, Hebrew, Chinese, Indonesian * Add getAuthSource()-function to SimpleSAML_Auth_Simple. * Add reauthenticate()-function to SimpleSAML_Auth_Source. (Is called when the IdP receives a new authentication request.) * iframe logout: Make it possible to skip the "question-page" for code on the IdP. diff --git a/inc/simplesamlphp/docs/simplesamlphp-errorhandling.txt b/inc/simplesamlphp/docs/simplesamlphp-errorhandling.txt index 1c6a265..8469f32 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-errorhandling.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-errorhandling.txt @@ -7,7 +7,6 @@ Exception and error handling in simpleSAMLphp http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id$` diff --git a/inc/simplesamlphp/docs/simplesamlphp-features.txt b/inc/simplesamlphp/docs/simplesamlphp-features.txt index ba4a781..687067f 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-features.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-features.txt @@ -7,7 +7,6 @@ SimpleSAMLphp Features http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id` @@ -71,7 +70,7 @@ An example of a usability problem, is when you are editing a wiki, and are about ## Dynamic SAML -SimpleSAMLphp has experimental support for dynamically downloading the metadata of an Service Provider or Identity Provider when receiving a new incomming message where the entityId is unknown. Dynamic SAML requires the EntityID to be an URL pointing to the metadata of the entity. +SimpleSAMLphp has experimental support for dynamically downloading the metadata of an Service Provider or Identity Provider when receiving a new incomming message where the entityId is unknown. Dynamic SAML requires the EntityID to be a URL pointing to the metadata of the entity. diff --git a/inc/simplesamlphp/docs/simplesamlphp-googleapps.txt b/inc/simplesamlphp/docs/simplesamlphp-googleapps.txt index 4096afb..c75e149 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-googleapps.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-googleapps.txt @@ -7,7 +7,6 @@ Setting up a simpleSAMLphp SAML 2.0 IdP to use with Google Apps for Education http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-googleapps.txt 2835 2011-05-11 06:11:51Z olavmrk $` @@ -19,7 +18,7 @@ This document is part of the simpleSAMLphp documentation suite. * [List of all simpleSAMLphp documentation](http://simplesamlphp.org/docs) * [Latest news about simpleSAMLphp](http://rnd.feide.no/taxonomy/term/4). (Also conatins an RSS feed) - * [simpleSAMLphp homepage](http://rnd.feide.no/simplesamlphp) + * [simpleSAMLphp homepage](https://simplesamlphp.org) ## Introduction @@ -163,7 +162,7 @@ In the (`saml20-sp-remote.php`) file we will configure an entry for Google Apps */ 'google.com' => array( 'AssertionConsumerService' => 'https://www.google.com/a/g.feide.no/acs', - 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:email', + 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'simplesaml.nameidattribute' => 'uid', 'simplesaml.attributes' => false ); @@ -211,7 +210,7 @@ You must also configure the IdP initiated Single LogOut endpoint of your server. again, using the host name of your IdP server. -The Sign-out page or change password url can be static pages on your server. +The Sign-out page or change password URL can be static pages on your server. The network mask determines which IP addresses will be asked for SSO login. IP addresses not matching this mask will be presented with the normal Google Apps login page. I think you can leave this field empty to enable authentication for all URLs. @@ -242,7 +241,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-hok-sp.txt b/inc/simplesamlphp/docs/simplesamlphp-hok-sp.txt index 8bf604b..7734f79 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-hok-sp.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-hok-sp.txt @@ -27,12 +27,14 @@ environment variable `SSL_CLIENT_CERT` of the webserver. Enable HoK on SP ---------------- -Which binding/profile the Identity Provider (IdP) should use when sending authentication responses to the SP is controlled by the `ProtocolBinding` option in the SP configuration. -To make your SP request that the response from the IdP is send using the HoK SSO Profile, this option must be set accordingly: +To enable support for the HoK SSO Profile in the SP, the `saml20.hok.assertion` option must be set to TRUE in the SP configuration. +This option can also be enabled in the `saml20-idp-remote` metadata file, but in that case the endpoint will not be added to the SP metadata. +You must also send authentication requests specifying the Holder-of-Key profile to the IdP. This is controlled by the `ProtocolBinding` option in the SP configuration. 'hok-sp' => array( 'saml:SP', - 'ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser', + 'saml20.hok.assertion' => TRUE, + 'ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser', ), When this is done, you can add the metadata of your SP to the IdP and test the authentication. diff --git a/inc/simplesamlphp/docs/simplesamlphp-idp-more.txt b/inc/simplesamlphp/docs/simplesamlphp-idp-more.txt index 71634e4..3c91458 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-idp-more.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-idp-more.txt @@ -7,7 +7,6 @@ SimpleSAMLphp Identity Provider Advanced Topics http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-idp-more.txt 2884 2011-08-09 06:25:34Z olavmrk $` @@ -22,29 +21,27 @@ If you have read about the AJAX iFrame Single Log-Out approach at Andreas' blog Attribute Release Consent ------------------------- -The attribute release consent is documented in a separate document. - - * [Documentation on the consent module](./consent:consent) +The attribute release consent is documented in a [separate document](./consent:consent). Support for bookmarking the login page -------------------------------------- -Most SAML software crash fatally when users bookmarks the login page and returns later when the cached session information is lost. This is natural as the login page happens in the middle of a SAML transaction, and the SAML software needs some references to the request in order to be able to produce the SAML Response. +Most SAML software crash fatally when users bookmark the login page and return later on when the cached session information is lost. This is natural as the login page happens in the middle of a SAML transaction, and the SAML software needs some references to the original request in order to be able to produce the SAML Response. -SimpleSAMLphp has implemented a graceful fallback to tackle this situation. When simpleSAMLphp is not able to lookup a session in the login process, it fall-backs to the *IdP-first flow*, described in next section, where the reference to the request is not needed. +SimpleSAMLphp has implemented a graceful fallback to tackle this situation. When simpleSAMLphp is not able to lookup a session during the login process, it falls back to the *IdP-first flow*, described in the next section, where the reference to the request is not needed. -What happens in the IdP-first flow is that an *SAML unsolicited response* is sent back to the SP. An *unsolicited response* is a SAML Response with no reference to a SAML Request (no `InReplyTo` field). +What happens in the IdP-first flow is that a *SAML unsolicited response* is sent directly to the SP. An *unsolicited response* is a SAML Response with no reference to a SAML Request (no `InReplyTo` field). -When an SimpleSAMLphp IdP fall-back to IdP-first flow, the `RelayState` parameter sent from the SP in the SAML request is also lost. The RelayState information contain a reference key for the SP to lookup where to send the user after successfull authentication. The SimpleSAMLphp Service Provider supports configuring a static URL to redirect the user after a unsolicited response is received. See more information about the `RelayState` parameter in the next section: *IdP-first flow*. +When a SimpleSAMLphp IdP falls back to IdP-first flow, the `RelayState` parameter sent by the SP in the SAML request is also lost. The RelayState information contain a reference key for the SP to lookup where to send the user after successfull authentication. The SimpleSAMLphp Service Provider supports configuring a static URL to redirect the user after a unsolicited response is received. See more information about the `RelayState` parameter in the next section: *IdP-first flow*. IdP-first flow -------------- -If you do not want to start the SSO flow at the SP, you may use the IdP-first setup. To do this, redirect the user to the SSOService endpoint on the IdP with one parameter `spentityid` that match the SP EntityId that the user should be logged into. +If you do not want to start the SSO flow at the SP, you may use the IdP-first setup. To do this, redirect the user to the SSOService endpoint on the IdP with a `spentityid` parameter that matches the SP EntityID that the user should be authenticated for. -Here is an example of such an url: +Here is an example of such a URL: https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=urn:mace:feide.no:someservice @@ -75,7 +72,7 @@ The parameters are as follows: `target` : The target parameter the SP should receive with the authentication response. This is often the page the user should be sent to after authentication. - This parameter is optional for the IdP, but must be specified if the SP you are targeting is running simpleSAMLphp SP. + This parameter is optional for the IdP, but must be specified if the SP you are targeting is running simpleSAMLphp. : *Note*: This parameter must be sent as `target` (with lowercase letters) when starting the authentication, while it is sent as `TARGET` (with uppercase letters) in the authentication response. @@ -87,4 +84,4 @@ IdP-initiated logout can be initiated by visiting the URL: https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo= -It will send a logout request to each SP, and afterwards return the user to the URL specified in the `ReturnTo` parameter. +It will send a logout request to each SP, and afterwards return the user to the URL specified in the `ReturnTo` parameter. Bear in mind that IdPs might disallow redirecting to URLs other than those of their own for security reasons, so in order to get the redirection to work, it might be necessary to ask the IdP to whitelist the URL we are planning to redirect to. diff --git a/inc/simplesamlphp/docs/simplesamlphp-idp.txt b/inc/simplesamlphp/docs/simplesamlphp-idp.txt index 0a79b8a..a2edf63 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-idp.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-idp.txt @@ -7,7 +7,6 @@ SimpleSAMLphp Identity Provider QuickStart http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-idp.txt 3175 2012-09-25 09:21:35Z jaimepc@gmail.com $` @@ -122,6 +121,23 @@ This configuration creates two users - `student` and `employee`, with the passwo The attributes will be returned by the IdP when the user logs on. +Creating a SSL self signed certificate +-------------------------------------- + +Here is an example of an `openssl`-command which can be used to generate a new private key key and the corresponding self-signed certificate. + +This key and certificate can be used to sign SAML messages: + + openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out example.org.crt -keyout example.org.pem + +The certificate above will be valid for 10 years. + + +### Note ### + +simpleSAMLphp will only work with RSA certificates. DSA certificates are not supported. + + Configuring the IdP ------------------- @@ -142,8 +158,8 @@ This is a minimal configuration of a SAML 2.0 IdP: * The private key and certificate to use when signing responses. * These are stored in the cert-directory. */ - 'privatekey' => 'server.pem', - 'certificate' => 'server.crt', + 'privatekey' => 'example.org.pem', + 'certificate' => 'example.org.crt', /* * The authentication source which should be used to authenticate the @@ -189,30 +205,6 @@ If you have the metadata of the remote SP as an XML file, you can use the built- For more information about available options in the sp-remote metadata files, see the [SP remote reference](simplesamlphp-reference-sp-remote). -Creating a SSL self signed certificate --------------------------------------- - -For test purposes, you can skip this section, and use the certificate included in the simpleSAMLphp distribution. - -Here is an example of an `openssl`-command which can be used to generate a new private key key and the corresponding self-signed certificate. - -This key and certificate can be used to sign SAML messages: - - openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out example.org.crt -keyout example.org.pem - -The certificate above will be valid for 10 years. - - -### Note ### - -simpleSAMLphp will only work with RSA certificates. DSA certificates are not supported. - - -### Warning ### - -The certificate that is included in the simpleSAMLphp distribution must **NEVER** be used in production, as the private key is also included in the package and can be downloaded by anyone. - - Adding this IdP to other SPs ---------------------------- @@ -237,7 +229,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) @@ -249,12 +241,12 @@ A. IdP-first setup If you do not want to start the SSO flow at the SP, you may use the IdP-first setup. To do this, redirect the user to the SSOService endpoint on the IdP with one parameter `spentityid` that match the SP EntityId that the user should be logged into. -Here is an example of such an url: +Here is an example of such a URL: https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=sp.example.org If the SP is a simpleSAMLphp SP, you must also specify a `RelayState` parameter for the SP. -This must be set to an URL the user should be redirected to after authentication. +This must be set to a URL the user should be redirected to after authentication. The `RelayState` parameter can be specified in the [SP configuration](saml:sp), or it can be sent from the IdP. To send the RelayState parameter from a simpleSAMLphp IdP, specify it in the query string to SSOService.php: diff --git a/inc/simplesamlphp/docs/simplesamlphp-install-repo.txt b/inc/simplesamlphp/docs/simplesamlphp-install-repo.txt new file mode 100644 index 0000000..c8376f0 --- /dev/null +++ b/inc/simplesamlphp/docs/simplesamlphp-install-repo.txt @@ -0,0 +1,58 @@ +Installing SimpleSAMLphp from the repository +============================================ + +These are some notes about running SimpleSAMLphp from the repository. + +Installing from github +---------------------- + +Go to the directory where you want to install SimpleSAMLphp: + + cd /var + +Then do a git clone: + + git clone git@github.com:simplesamlphp/simplesamlphp.git simplesamlphp + +Initialize configuration and metadata: + + cd /var/simplesamlphp + cp -r config-templates/* config/ + cp -r metadata-templates/* metadata/ + +Install the external dependencies with Composer (you can refer to [getcomposer.org](http://getcomposer.org/) to get detailed +instructions on how to install Composer itself): + + php composer.phar install + + +Upgrading +--------- + +Go to the root directory of your simpleSAMLphp installation: + + cd /var/simplesamlphp + +Ask git to update to the latest version: + + git fetch origin + git pull origin master + +Install or upgrade the external dependencies with Composer ([get composer](http://getcomposer.org/)): + + php composer.phar install + + +Migrating from Subversion +------------------------- + +If you installed SimpleSAMLphp from subversion, and want to keep updated on the development, you will have to migrate +your installation to git. First, follow the steps to get a fresh install from github in a different directory. Skip the +steps regarding configuration and metadata initialization, and copy all the files you might have modified instead (not +only configuration and metadata, but also any custom modules or templates). Finally, proceed to install Composer and +install all the dependencies with it. You may want to add all your custom files to the '.gitignore' file. + +If you really want to use subversion instead of git, or it is impossible for you to migrate (you cannot install git, for +example), you might want to do a fresh install like the one described here, but using github's subversion interface. +Refer to [github's documentation](https://help.github.com/articles/support-for-subversion-clients) for detailed +instructions on how to do that. diff --git a/inc/simplesamlphp/docs/simplesamlphp-install.txt b/inc/simplesamlphp/docs/simplesamlphp-install.txt index 6115268..64560c1 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-install.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-install.txt @@ -7,7 +7,6 @@ simpleSAMLphp Installation and Configuration http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-install.txt 3075 2012-04-24 05:41:03Z olavmrk $` @@ -19,24 +18,23 @@ This document is part of the simpleSAMLphp documentation suite. * [List of all simpleSAMLphp documentation](http://simplesamlphp.org/docs) * [Latest news about simpleSAMLphp](http://rnd.feide.no/taxonomy/term/4). (Also conatins an RSS feed) - * [simpleSAMLphp homepage](http://rnd.feide.no/simplesamlphp) + * [simpleSAMLphp homepage](https://simplesamlphp.org) Development version -------------------- This document is about the latest stable version of simpleSAMLphp. -If you want to install the development version, look at the instructions for [installing simpleSAMLphp from Subversion](simplesamlphp-subversion). +If you want to install the development version, look at the instructions for [installing simpleSAMLphp from the repository](simplesamlphp-install-repo). Prerequisites ------------- * Some webserver capable of executing PHP scripts. - * PHP version >= 5.2.0. - * Suppoort for the following PHP extensions: - * Always required: `date`, `dom`, `hash`, `libxml`, `openssl`, `pcre`, `SPL`, `zlib` - * When encrypting assertions: `mcrypt` + * PHP version >= 5.3.0. + * Support for the following PHP extensions: + * Always required: `date`, `dom`, `hash`, `libxml`, `openssl`, `pcre`, `SPL`, `zlib`, `mcrypt` * When authenticating against LDAP server: `ldap` * When authenticating against RADIUS server: `radius` * When saving session information to memcache-server: `memcache` @@ -50,8 +48,7 @@ What actual packages are required for the various extensions varies between diff Download and install simpleSAMLphp ---------------------------------- -The most recent relase of simpleSAMLphp is found at [code.google.com/p/simplesamlphp/](http://code.google.com/p/simplesamlphp/). -To obtain the latest stable version, download the archive file listed under Featured Dowloads. +The most recent relase of simpleSAMLphp is found at [https://simplesamlphp.org/download](https://simplesamlphp.org/download). Go to the directory where you want to install simpleSAMLphp, and extract the archive file you just downloaded: @@ -190,7 +187,7 @@ to `disable`. The simpleSAMLphp installation webpage -------------------------------------- -After installing simpleSAMLphp, you can access the homepage of your installation, which contains some information and a few links to the test services. The url of an installation can be e.g.: +After installing simpleSAMLphp, you can access the homepage of your installation, which contains some information and a few links to the test services. The URL of an installation can be e.g.: https://service.example.org/simplesaml/ @@ -233,7 +230,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-maintenance.txt b/inc/simplesamlphp/docs/simplesamlphp-maintenance.txt index d8ebda4..8a885c2 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-maintenance.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-maintenance.txt @@ -7,7 +7,6 @@ simpleSAMLphp Maintenance http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-maintenance.txt 3110 2012-05-31 08:25:14Z olavmrk $` @@ -18,7 +17,7 @@ This document is part of the simpleSAMLphp documentation suite. * [List of all simpleSAMLphp documentation](http://simplesamlphp.org/docs) * [Latest news about simpleSAMLphp](http://rnd.feide.no/taxonomy/term/4). (Also conatins an RSS feed) - * [simpleSAMLphp homepage](http://rnd.feide.no/simplesamlphp) + * [simpleSAMLphp homepage](https://simplesamlphp.org) @@ -205,7 +204,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage (at Feide RnD)](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-attributes.txt b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-attributes.txt index fb9dad6..7e3c1c0 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-attributes.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-attributes.txt @@ -7,7 +7,6 @@ SAML V2.0 Metadata Extensions for Login and Discovery User Interface http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id:$` * Author: Timothy Ace [tace@synacor.com](mailto:tace@synacor.com) @@ -79,8 +78,8 @@ If given the following configuration... $metadata['https://www.example.com/saml/saml2/idp/metadata.php'] = array( 'host' => 'www.example.com', - 'certificate' => 'server.crt', - 'privatekey' => 'server.pem', + 'certificate' => 'example.com.crt', + 'privatekey' => 'example.com.pem', 'auth' => 'example-userpass', 'EntityAttributes' => array( diff --git a/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-rpi.txt b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-rpi.txt new file mode 100644 index 0000000..53478e0 --- /dev/null +++ b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-rpi.txt @@ -0,0 +1,112 @@ +SAML V2.0 Metadata Extensions for Registration and Publication Information +============================= + + + + * Author: Jaime Perez [jaime.perez@uninett.no](mailto:jaime.perez@uninett.no) + + + +This is a reference for the SimpleSAMLphp implementation of the [SAML +V2.0 Metadata Extensions for Registration and Publication Information](http://docs.oasis-open.org/security/saml/Post2.0/saml-metadata-rpi/v1.0/saml-metadata-rpi-v1.0.html) +defined by OASIS. + +This extension aims to provide information about the registrars and publishers of the metadata themselves, and it is therefore +available throught different endpoints and modules that provide metadata all along simpleSAMLphp. More specifically, this +extension can be used for: + +- metadata published for a [hosted service provider](./saml:sp). +- metadata published for a [hosted identity provider](./simplesamlphp-reference-idp-hosted). +- metadata collected and published by means of the [`aggregator`](./aggregator:aggregator) or [`aggregator2`](./aggregator2:aggregator2) modules. + +Currently, only the `` element is supported. + +Depending on the metadata set you want to add this extension to, you will have to configure it on the corresponding +configuration file: + +- `metadata/saml20-idp-hosted.php` for hosted identity providers. +- `config/authsources.php` for hosted service providers. +- `config/module_aggregator.php` for the `aggregator` module. +- `config/module_aggregator2.php` for the `aggregator2` module. + +RegistrationInfo Items +---------------------- + +The configuration is the same for all the different files, and consists of a single directive called `RegistrationInfo`, which +**must** be an indexed array with the following options: + +`authority` +: A string containing an identifier of the authority who has registered this metadata. This parameter is **mandatory**. + +`instant` +: A string containing the instant when the entity or entities where registered by the authority. This parameter is + optional, and must be expressed in the UTC timezone with the *zulu* (`Z`) timezone identifier. If omitted, there will be no + `registrationInstant` in the resulting metadata, except in the `aggregator2` module, which will use the instant when the metadata + was generated. + +`policies` +: An indexed array containing URLs pointing to the policy under which the entity or entities where registered. Each + index must be the language code corresponding to the language of the URL. This parameter is optional, and will be omitted in the + resulting metadata if not configured. + + +Examples +-------- + +Service Provider: + + 'default-sp' => array( + 'saml:SP', + 'entityID' => NULL, + ... + 'RegistrationInfo' => array( + 'authority' => 'urn:mace:sp.example.org', + 'instant' => '2008-01-17T11:28:03.577Z', + 'policies' => array('en' => 'http://sp.example.org/policy', 'es' => 'http://sp.example.org/politica'), + ), + ), + +Identity Provider: + + $metadata['__DYNAMIC:1__'] = array( + 'host' => '__DEFAULT__', + ... + 'RegistrationInfo' => array( + 'authority' => 'urn:mace:idp.example.org', + 'instant' => '2008-01-17T11:28:03.577Z', + ), + ); + +`aggregator` module: + + $config = array( + 'aggregators' => array( + ... + ), + 'maxDuration' => 60*60*24*5, + 'reconstruct' => FALSE, + ... + 'RegistrationInfo' => array( + 'authority' => 'urn:mace:example.federation', + 'instant' => '2008-01-17T11:28:03Z', + 'policies' => array('en' => 'http://example.org/federation_policy', 'es' => 'https://example.org/politica_federacion'), + ), + ); + +`aggregator2` module: + + $config = array( + 'example.org' => array( + 'sources' => array( + ... + ), + 'RegistrationInfo' => array( + 'authority' => 'urn:mace:example.federation', + 'policies' => array('en' => 'http://example.org/federation_policy', 'es' => 'https://example.org/politica_federacion'), + ), + ), + ); diff --git a/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-ui.txt b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-ui.txt index 7585a32..f016afb 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-ui.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-metadata-extensions-ui.txt @@ -7,17 +7,20 @@ SAML V2.0 Metadata Extensions for Login and Discovery User Interface http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id:$` * Author: Timothy Ace [tace@synacor.com](mailto:tace@synacor.com) -This is a reference for the SimpleSAMLphp implemenation of the [SAML +This is a reference for the simpleSAMLphp implementation of the [SAML V2.0 Metadata Extensions for Login and Discovery User Interface](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-metadata-ui/v1.0/sstc-saml-metadata-ui-v1.0.pdf) defined by OASIS. -The `metadata/saml20-idp-hosted.php` entries are used to define the -metadata extension items. An example of this is: +The metadata extensions are available to both IdP and SP usage of +simpleSAMLphp. For an IdP, the entries are placed in +`metadata/saml20-idp-hosted.php`, for an SP, they are put inside +the relevant entry in `authsources.php`. + +An example for an IdP: array( + 'saml:SP', + + 'UIInfo' => array( + 'DisplayName' => array( + 'en' => 'English name', + 'es' => 'Nombre en Español' + ), + 'Description' => array( + 'en' => 'English description', + 'es' => 'Descripción en Español + ), + ), + /* ... */ + ), + ); + +The OASIS specification primarily defines how an entity can communicate +metadata related to IdP or service discovery and identification. There +are two different types of extensions defined. There are the ``elements that define -how an IdP should be displayed and there are the `` -elements that define when an IdP should be choosen/displayed. +how an IdP or SP should be displayed and there are the `` +elements that define when an IdP should be chosen/displayed. UIInfo Items -------------- -These elements are used for IdP discovery to determine what to display -about an IdP. These properties are all children of the `UIInfo` key. +These elements are used for IdP and SP discovery to determine what to display +about an IdP or SP. These properties are all children of the `UIInfo` key. *Note*: Most elements are localized strings that specify the language using the array key as the language-code: @@ -86,7 +112,7 @@ using the array key as the language-code: ), `DisplayName` -: The localized list of names for this IdP +: The localized list of names for this entity 'DisplayName' => array( 'en' => 'English name', @@ -94,7 +120,7 @@ using the array key as the language-code: ), `Description` -: The localized list of statements used to decribe this IdP +: The localized list of statements used to describe this entity 'Description' => array( 'en' => 'English description', @@ -102,7 +128,7 @@ using the array key as the language-code: ), `InformationURL` -: A localized list of URLs where more information about the IdP is +: A localized list of URLs where more information about the entity is located. 'InformationURL' => array( @@ -111,7 +137,7 @@ using the array key as the language-code: ), `PrivacyStatementURL` -: A localized list of URLs where the IdP's privacy statement is +: A localized list of URLs where the entity's privacy statement is located. 'PrivacyStatementURL' => array( @@ -120,7 +146,7 @@ using the array key as the language-code: ), `Keywords` -: A localized list of keywords used to describe the IdP +: A localized list of keywords used to describe the entity 'Keywords' => array( 'en' => array('communication', 'federated session'), @@ -131,7 +157,7 @@ using the array key as the language-code: being part of a Keyword. `Logo` -: The logos used to represent the IdP +: The logos used to represent the entity 'Logo' => array( array( @@ -148,12 +174,13 @@ using the array key as the language-code: ), : An optional `lang` key containing a language-code is supported for - localized Logos. + localized logos. DiscoHints Items -------------- -These elements are used for IdP discovery to determine when to choose or +These elements are only relevant when operating in the IdP role; they +assist IdP discovery to determine when to choose or present an IdP. These properties are all children of the `DiscoHints` key. @@ -184,8 +211,8 @@ If given the following configuration... $metadata['https://www.example.com/saml/saml2/idp/metadata.php'] = array( 'host' => 'www.example.com', - 'certificate' => 'server.crt', - 'privatekey' => 'server.pem', + 'certificate' => 'example.com.crt', + 'privatekey' => 'example.com.pem', 'auth' => 'example-userpass', 'UIInfo' => array( diff --git a/inc/simplesamlphp/docs/simplesamlphp-modules.txt b/inc/simplesamlphp/docs/simplesamlphp-modules.txt index 31e02af..ccc5f66 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-modules.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-modules.txt @@ -7,7 +7,6 @@ simpleSAMLphp modules http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-modules.txt 2209 2010-03-08 12:41:15Z andreassolberg $` @@ -113,7 +112,7 @@ www : To retrieve this URL, the `SimpleSAML_Module::getModuleURL($resource)`-function can be used. This function takes in a resource on the form `/`. - This function will then return an URL to the given file in the + This function will then return a URL to the given file in the `www`-directory of `module`. @@ -140,8 +139,8 @@ To use this authentication source in a SAML 2.0 IdP, set the '__DYNAMIC:1__' => array( 'host' => '__DEFAULT__', - 'privatekey' => 'server.pem', - 'certificate' => 'server.crt', + 'privatekey' => 'example.org.pem', + 'certificate' => 'example.org.crt', 'auth' => 'example-static', ), diff --git a/inc/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.txt b/inc/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.txt index b2d14ba..e82ceba 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-reference-idp-hosted.txt @@ -81,7 +81,7 @@ Common options : *Note*: If you specify this option, you must also specify the `OrganizationName` option. `OrganizationURL` -: An URL the end user can access for more information about the organization. +: A URL the end user can access for more information about the organization. : This option can be translated into multiple languages by specifying the value as an array of language-code to translated URL. @@ -108,6 +108,8 @@ Common options `scope` : An array with scopes for this IdP. The scopes will be added to the generated XML metadata. + A scope can either be a domain name or a regular expression + matching a number of domains. `userid.attribute` : The attribute name of an attribute which uniquely identifies @@ -170,6 +172,12 @@ The following SAML 2.0 options are available: : Note that this option can be set for each SP in the [SP-remote metadata](./simplesamlphp-reference-sp-remote). +: The RSA encryption algorithm with PKCS#1 v1.5 padding is blacklisted by default for security reasons. Any assertions + encrypted with this algorithm will therefore fail to decrypt. You can override this limitation by defining an empty + array in this option (or blacklisting any other algorithms not including that one). However, it is strongly + discouraged to do so. For your own safety, please include the string 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' if + you make use of this option. + `https.certificate` : The certificate used by the webserver when handling connections. This certificate will be added to the generated metadata of the IdP, @@ -181,25 +189,34 @@ The following SAML 2.0 options are available: : Note that this option can be set for each SP in the [SP-remote metadata](./simplesamlphp-reference-sp-remote). -`SingleSignOnService` -: Override the default URL for the SingleSignOnService for this - IdP. This is an absolute URL. The default value is - `/saml2/idp/SSOService.php` +`NameIDFormat` +: The format of the NameID supported by this IdP. Defaults to the `transient` format if unspecified. + This parameter can be configured in multiple places, and the actual value used is fetched from metadata with + the following priority: -: Note that this only changes the values in the generated - metadata and in the messages sent to others. You must also - configure your webserver to deliver this URL to the correct PHP - page. +: 1. SP Remote Metadata -`SingleLogoutService` -: Override the default URL for the SingleLogoutService for this - IdP. This is an absolute URL. The default value is - `/saml2/idp/SingleLogoutService.php` + 2. IdP Hosted Metadata -: Note that this only changes the values in the generated - metadata and in the messages sent to others. You must also - configure your webserver to deliver this URL to the correct PHP - page. +: The three most commonly used values are: + +: 1. `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` + 2. `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent` + 3. `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` + +: The `transient` format will generate a new unique ID every time + the user logs in. + +: To properly support the `persistent` and `emailAddress` formats, + you should configure [NameID generation filters](./saml:nameid) + on your IdP. + +: Note that the value set here will be added to the metadata generated for this IdP, + in the `NameIDFormat` element. + +`RegistrationInfo` +: Allows to specify information about the registrar of this SP. Please refer to the + [MDRPI extension](./simplesamlphp-metadata-extensions-rpi) document for further information. `saml20.sendartifact` : Set to `TRUE` to enable the IdP to send responses with the HTTP-Artifact binding. @@ -234,6 +251,58 @@ The following SAML 2.0 options are available: any value in the SP-remote metadata overrides the one configured in the IdP metadata. +`SingleSignOnService` +: Override the default URL for the SingleSignOnService for this + IdP. This is an absolute URL. The default value is + `/saml2/idp/SSOService.php` + +: Note that this only changes the values in the generated + metadata and in the messages sent to others. You must also + configure your webserver to deliver this URL to the correct PHP + page. + +`SingleSignOnServiceBinding` +: List of SingleSignOnService bindings that the IdP will claim support for. +: Possible values: + + * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect` + * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST` + +: Defaults to HTTP-Redirect binding. Please note that the order + specified will be kept in the metadata, making the first binding + the default one. + +`SingleLogoutService` +: Override the default URL for the SingleLogoutService for this + IdP. This is an absolute URL. The default value is + `/saml2/idp/SingleLogoutService.php` + +: Note that this only changes the values in the generated + metadata and in the messages sent to others. You must also + configure your webserver to deliver this URL to the correct PHP + page. + +`SingleLogoutServiceBinding` +: List of SingleLogoutService bindings the IdP will claim support for. +: Possible values: + + * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect` + * `urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST` + +: Defaults to HTTP-Redirect binding. Please note that the order + specified will be kept in the metadata, making the first binding + the default one. + +`signature.algorithm` +: The algorithm to use when signing any message generated by this identity provider. Defaults to RSA-SHA1. +: Possible values: + + * `http://www.w3.org/2000/09/xmldsig#rsa-sha1` + *Note*: the use of SHA1 is **deprecated** and will be disallowed in the future. + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha256` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha384` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha512` + `validate.authnrequest` : Whether we require signatures on authentication requests sent to this IdP. @@ -301,10 +370,11 @@ The following options for Shibboleth 1.3 IdP's are avaiblable: Metadata extensions ------------------- -SimpleSAMLphp supports generating metadata with the MDUI and EntityAttributes metadata extensions. +SimpleSAMLphp supports generating metadata with the MDUI, MDRPI and EntityAttributes metadata extensions. See the documentation for those extensions for more details: * [MDUI extension](./simplesamlphp-metadata-extensions-ui) + * [MDRPI extension](./simplesamlphp-metadata-extensions-rpi) * [EntityAttributes](./simplesamlphp-metadata-extensions-attributes) @@ -328,8 +398,8 @@ These are some examples of IdP metadata 'host' => '__DEFAULT__', /* The private key and certificate used by this IdP. */ - 'certificate' => 'server.crt', - 'privatekey' => 'server.pem', + 'certificate' => 'example.org.crt', + 'privatekey' => 'example.org.pem', /* * The authentication source for this IdP. Must be one diff --git a/inc/simplesamlphp/docs/simplesamlphp-reference-idp-remote.txt b/inc/simplesamlphp/docs/simplesamlphp-reference-idp-remote.txt index e8af410..dce7498 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-reference-idp-remote.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-reference-idp-remote.txt @@ -69,7 +69,7 @@ The following options are common between both the SAML 2.0 protocol and Shibbole : *Note*: If you specify this option, you must also specify the `OrganizationName` option. `OrganizationURL` -: An URL the end user can access for more information about the organization. +: A URL the end user can access for more information about the organization. : This option can be translated into multiple languages by specifying the value as an array of language-code to translated URL. @@ -105,6 +105,12 @@ The following SAML 2.0 options are available: entry in the IdP-remote metadata overrides the option in the [SP configuration](./saml:sp). +: The RSA encryption algorithm with PKCS#1 v1.5 padding is blacklisted by default for security reasons. Any assertions + encrypted with this algorithm will therefore fail to decrypt. You can override this limitation by defining an empty + array in this option (or blacklisting any other algorithms not including that one). However, it is strongly + discouraged to do so. For your own safety, please include the string 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' if + you make use of this option. + `nameid.encryption` : Whether NameIDs sent to this IdP should be encrypted. The default value is `FALSE`. @@ -113,15 +119,6 @@ The following SAML 2.0 options are available: entry in the IdP-remote metadata overrides the option in the [SP configuration](./saml:sp). -`saml2.relaxvalidation` -: Can be used to relax some parts of the validation of assertions received from this IdP. This is an array, and can include one or more of the following flags: - - - `unknowncondition` - Disables errors when encountering unknown <Condition> nodes. - - `nosubject` - Ignore missing <Subject> in <Assertion>. - - `noconditions` - Ignore missing <Conditions> in <Assertion>. - - `noauthnstatement` - Ignore missing <AuthnStatement> in <Assertion>. - - `noattributestatement` - Ignore missing <AttributeStatement> in <Assertion>. - `sign.authnrequest` : Whether to sign authentication requests sent to this IdP. @@ -142,6 +139,18 @@ The following SAML 2.0 options are available: `SingleLogoutServiceResponse` : Endpoint URL for logout responses. Overrides the `SingleLogoutService`-option for responses. +`signature.algorithm` +: The algorithm to use when signing any message sent to this specific identity provider. Defaults to RSA-SHA1. +: Note that this option also exists in the SP configuration. + This value in the IdP remote metadata overrides the value in the SP configuration. +: Possible values: + + * `http://www.w3.org/2000/09/xmldsig#rsa-sha1` + *Note*: the use of SHA1 is **deprecated** and will be disallowed in the future. + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha256` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha384` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha512` + `SPNameQualifier` : This corresponds to the SPNameQualifier in the SAML 2.0 specification. It allows to give subjects a SP specific namespace. This option is rarely used, so if you don't need it, leave it out. When left out, simpleSAMLphp assumes the entityID of your SP as the SPNameQualifier. @@ -184,7 +193,7 @@ These options overrides the options set in `saml20-sp-hosted`. **Example: Configuration for validating messages** 'redirect.validate' => TRUE, - 'certificate' => 'server.crt', + 'certificate' => 'example.org.crt', Shibboleth 1.3 options @@ -226,7 +235,7 @@ Calculating the fingerprint of a certificate If you have obtained a certificate file, and want to calculate the fingerprint of the file, you can use the `openssl` command: - $ openssl x509 -noout -fingerprint -in "server.crt" + $ openssl x509 -noout -fingerprint -in "example.org.crt" SHA1 Fingerprint=AF:E7:1C:28:EF:74:0B:C8:74:25:BE:13:A2:26:3D:37:97:1D:A1:F9 In this case, the certFingerprint option should be set to `AF:E7:1C:28:EF:74:0B:C8:74:25:BE:13:A2:26:3D:37:97:1D:A1:F9`. diff --git a/inc/simplesamlphp/docs/simplesamlphp-reference-sp-hosted.txt b/inc/simplesamlphp/docs/simplesamlphp-reference-sp-hosted.txt index 1082261..1ffaab9 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-reference-sp-hosted.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-reference-sp-hosted.txt @@ -92,7 +92,7 @@ Common options : *Note*: If you specify this option, you must also specify the `OrganizationName` option. `OrganizationURL` -: An URL the end user can access for more information about the organization. +: A URL the end user can access for more information about the organization. : This option can be translated into multiple languages by specifying the value as an array of language-code to translated URL. diff --git a/inc/simplesamlphp/docs/simplesamlphp-reference-sp-remote.txt b/inc/simplesamlphp/docs/simplesamlphp-reference-sp-remote.txt index 73eca20..bb01207 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-reference-sp-remote.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-reference-sp-remote.txt @@ -82,7 +82,7 @@ and Shibboleth 1.3 protocol: : *Note*: If you specify this option, you must also specify the `OrganizationName` option. `OrganizationURL` -: An URL the end user can access for more information about the organization. +: A URL the end user can access for more information about the organization. : This option can be translated into multiple languages by specifying the value as an array of language-code to translated URL. @@ -162,25 +162,31 @@ The following SAML 2.0 options are available: entry in the SP-remote metadata overrides the option in the [IdP-hosted metadata](./simplesamlphp-reference-idp-hosted). +: The RSA encryption algorithm with PKCS#1 v1.5 padding is blacklisted by default for security reasons. Any assertions + encrypted with this algorithm will therefore fail to decrypt. You can override this limitation by defining an empty + array in this option (or blacklisting any other algorithms not including that one). However, it is strongly + discouraged to do so. For your own safety, please include the string 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' if + you make use of this option. + `ForceAuthn` : Set this `TRUE` to force the user to reauthenticate when the IdP receives authentication requests from this SP. The default is `FALSE`. `NameIDFormat` -: The `NameIDFormat` this SP should receive. There are three values - for NameIDFormat which is supported by simpleSAMLphp: +: The `NameIDFormat` this SP should receive. The three most commonly + used values are: : 1. `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` 2. `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent` - 3. `urn:oasis:names:tc:SAML:2.0:nameid-format:email` + 3. `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress` : The `transient` format will generate a new unique ID every time the SP logs in. -: The `persistent` and `email` formats will use the attribute - specified in the `simplesaml.nameidattribute`-option as the value - of the ID. +: To properly support the `persistent` and `emailAddress` formats, + you should configure [NameID generation filters](./saml:nameid) + on your IdP. `nameid.encryption` : Whether NameIDs sent to this SP should be encrypted. The default @@ -231,6 +237,18 @@ The following SAML 2.0 options are available: : Note that this option also exists in the IdP-hosted metadata. The value in the SP-remote metadata overrides the value in the IdP-hosted metadata. +`signature.algorithm` +: The algorithm to use when signing any message sent to this specific service provider. Defaults to RSA-SHA1. +: Note that this option also exists in the IdP-hosted metadata. + The value in the SP-remote metadata overrides the value in the IdP-hosted metadata. +: Possible values: + + * `http://www.w3.org/2000/09/xmldsig#rsa-sha1` + *Note*: the use of SHA1 is **deprecated** and will be disallowed in the future. + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha256` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha384` + * `http://www.w3.org/2001/04/xmldsig-more#rsa-sha512` + `simplesaml.nameidattribute` : When the value of the `NameIDFormat`-option is set to either `email` or `persistent`, this is the name of the attribute which @@ -327,7 +345,7 @@ These options overrides the options set in `saml20-idp-hosted`. **Example: Configuration for validating messages** 'redirect.validate' => TRUE, - 'certificate' => 'server.crt', + 'certificate' => 'example.org.crt', ### Fields for scoping diff --git a/inc/simplesamlphp/docs/simplesamlphp-scoping.txt b/inc/simplesamlphp/docs/simplesamlphp-scoping.txt index 90ac54c..1f58695 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-scoping.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-scoping.txt @@ -7,7 +7,6 @@ Scoping http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-scoping.txt 2651 2010-11-16 14:32:43Z olavmrk $` @@ -18,9 +17,9 @@ providers specified. A common use is for a service provider in a hub-and-spoke architecture to manage its own discovery service and being able to tell the hub/proxy-IdP which -(backend-end) identity provider to use. The standart discovery service in +(backend-end) identity provider to use. The standard discovery service in SimpleSAMLphp will show the intersection of all the known IdPs and the IdPs -specified in the scoping element. If this intersection only contains on IdP, +specified in the scoping element. If this intersection only contains one IdP, then the request is automatically forwarded to that IdP. Scoping is a SAML 2.0 specific option. @@ -37,7 +36,7 @@ who ultimately authenticates the user. A count of zero permits no proxying. If ProxyCount is unspecified the number of proxy indirections is not limited. `IDPList` -: The list of trusted idps ie. the list of entityIDs for identity providers +: The list of trusted IdPs ie. the list of entityIDs for identity providers that are relevant for a service provider in an authnRequest. ### Note ### @@ -67,11 +66,11 @@ RequesterID element ------------------- To allow an identity provider to identify the original requester and the -proxying identity providers, SimpleSAMLphp addes the RequesterID element to +proxying identity providers, SimpleSAMLphp adds the RequesterID element to the request and if necessary the scoping element even if explicit scoping is not used. -The RequesterId elements are avaliable from the state array as an array, for +The RequesterId elements are available from the state array as an array, for instance the authenticate method in an authentication source $requesterIDs = $state['saml:RequesterID']; @@ -80,11 +79,11 @@ AuthenticatingAuthority element ------------------------------- To allow a service provider to identify the authentication authorities that -were involved in the authentication of the user, SimpleSAMLphp addes the +were involved in the authentication of the user, SimpleSAMLphp adds the AuthenticatingAuthority elements. The list of authenticating authorities (the AuthenticatingAuthority element) -can be retrived as an array from the authentication data. +can be retrieved as an array from the authentication data. # Get the authentication source. $as = new SimpleSAML_Auth_Simple(); @@ -97,7 +96,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-sp-api.txt b/inc/simplesamlphp/docs/simplesamlphp-sp-api.txt index d867b38..fae473d 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-sp-api.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-sp-api.txt @@ -86,7 +86,7 @@ The following global parameters are supported: `ErrorURL` (`string`) -: An URL to a page which will receive errors that may occur during authentication. +: A URL to a page which will receive errors that may occur during authentication. `KeepPost` (`bool`) @@ -217,7 +217,7 @@ See the [`saml:SP`](./saml:sp) reference for information about available SAML au string getLoginURL(string $returnTo = NULL) -Retrieve an URL that can be used to start authentication. +Retrieve a URL that can be used to start authentication. ### Parameters @@ -246,7 +246,7 @@ The URL should be: string getLogoutURL(string $returnTo = NULL) -Retrieve an URL that can be used to trigger logout. +Retrieve a URL that can be used to trigger logout. ### Parameters diff --git a/inc/simplesamlphp/docs/simplesamlphp-sp-migration.txt b/inc/simplesamlphp/docs/simplesamlphp-sp-migration.txt index 72a165e..0e4481b 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-sp-migration.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-sp-migration.txt @@ -155,7 +155,7 @@ This is a quick overview of the API: Generally, if you have: $config = SimpleSAML_Configuration::getInstance(); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); you should replace it with this single line: @@ -209,6 +209,9 @@ If you want to return to a specific URL after logging out, you should include th $as->logout('https://example.org/'); +Please make sure the URL is trusted. If you obtain the URL from the user input, make sure it is trusted before +calling $as->logout(), by using the SimpleSAML_Utilities::checkURLAllowed() method. + #### Login link diff --git a/inc/simplesamlphp/docs/simplesamlphp-sp.txt b/inc/simplesamlphp/docs/simplesamlphp-sp.txt index c56f138..641e776 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-sp.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-sp.txt @@ -7,7 +7,6 @@ SimpleSAMLphp Service Provider QuickStart http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-sp.txt 2711 2011-01-12 14:25:46Z olavmrk $` @@ -130,11 +129,15 @@ The textfields for AssertionConsumerService and SingleLogoutService should conta After checking your metadata, give your SP a proper name and description and click 'save'. +The procedure for managing trust in federations differ, but the common part is that you would need to provide the *SAML 2.0 metadata +of your SP*, and register that with the federation administration. + + Test the SP ----------------------------- -After the metadata is is configured on the IdP, you should be able to test the configuration. +After the metadata is configured on the IdP, you should be able to test the configuration. The installation page of simpleSAMLphp has a link to test authentication sources. When you click the link, you should receive a list of authentication sources, including the one you have created for the SP. @@ -144,6 +147,11 @@ The test page should contain a list of your attributes: ![Screenshot of the status page after an user have succesfully authenticated](http://rnd.feide.no/files/screenshot-example.png) +For a better looking, more advanced Discovery Service with tabs and live search, you may want to use the `discopower` module +in simpleSAMLphp. Take a look at the following blog entry for more information: + + * [Blog entry about the DiscoPower module](https://rnd.feide.no/content/improved-discovery-service-live-search) + Integrating authentication with your own application ---------------------------------------------------- @@ -196,7 +204,7 @@ Support If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) +- [simpleSAMLphp homepage](https://simplesamlphp.org) - [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) - [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) - [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) diff --git a/inc/simplesamlphp/docs/simplesamlphp-subversion.txt b/inc/simplesamlphp/docs/simplesamlphp-subversion.txt index 395e814..840677d 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-subversion.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-subversion.txt @@ -20,6 +20,10 @@ Initialize configuration and metadata: cp -r config-templates/* config/ cp -r metadata-templates/* metadata/ +Install the external dependencies with Composer (http://getcomposer.org/): + + php composer.phar install + Upgrading --------- @@ -29,3 +33,6 @@ Go to the root directory of your simpleSAMLphp installation: Ask subversion to update to the latest version: svn update + +Install the external dependencies with Composer (http://getcomposer.org/): + php composer.phar install diff --git a/inc/simplesamlphp/docs/simplesamlphp-theming.txt b/inc/simplesamlphp/docs/simplesamlphp-theming.txt index 3a0a506..69a6b4e 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-theming.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-theming.txt @@ -7,7 +7,6 @@ Theming the user interface in SimpleSAMLphp http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-theming.txt 2206 2010-03-08 10:14:12Z andreassolberg $` diff --git a/inc/simplesamlphp/docs/simplesamlphp-translation.txt b/inc/simplesamlphp/docs/simplesamlphp-translation.txt index 161fcb9..794fa52 100644 --- a/inc/simplesamlphp/docs/simplesamlphp-translation.txt +++ b/inc/simplesamlphp/docs/simplesamlphp-translation.txt @@ -7,7 +7,6 @@ SimpleSAMLphp Translation Portal http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: simplesamlphp-translation.txt 2206 2010-03-08 10:14:12Z andreassolberg $` diff --git a/inc/simplesamlphp/docs/simplesamlphp-ukaccess.txt b/inc/simplesamlphp/docs/simplesamlphp-ukaccess.txt deleted file mode 100644 index cdf638b..0000000 --- a/inc/simplesamlphp/docs/simplesamlphp-ukaccess.txt +++ /dev/null @@ -1,195 +0,0 @@ -Connecting SimpleSAMLphp SP to UK Access Federation and InCommon -================================================================ - - - - * Version: `$Id: simplesamlphp-ukaccess.txt 3126 2012-06-28 08:39:33Z olavmrk $` - - - -This guide will describe how to configure simpleSAMLphp as a service provider (SP) supporting SAML 1.1 (shib1.3) and SAML 2.0 connecting it to a federation such as **UK Access Federation** or **InCommon**. - -You should previously have installed simpleSAMLphp as described in [the simpleSAMLphp installation instructions](simplesamlphp-install). - - -Configuring the SP ------------------- - -The SP is configured by an entry in `config/authsources.php`. If you copy the `authsources.php` configuration from `config-templates`, it contains a decent default setup. - -Further details on configuring an SP: - - * [Service Provider QuickStart](simplesamlphp-sp) - * [Configuration Reference](./saml:sp) - -### Enabling a certificate for your Service Provider - -UK Access Federation and InCommon probably requires that you enable a certificate for your SP. Other federations do not always require that you do. - -If you enable a certificate for your Service Provider, it may be able to sign requests and response sent to the Identity Provider, as well as receiving encrypted responses. - -Create a self-signed certificate in the `cert/` directory. - - cd cert - openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out saml.crt -keyout saml.pem - - -Then edit your `authsources.php` entry, and add references to your certificate: - - 'default-sp' => array( - 'saml:SP', - 'privatekey' => 'saml.pem', - 'certificate' => 'saml.crt', - ), - - - -Consuming Federation Metadata ------------------------------ - -In order to enable the functionality to automatically download and parse metadata from a remote URL, enable the `metarefresh` and `cron` modules: - - touch modules/metarefresh/enable - cp modules/metarefresh/config-templates/*.php config/ - touch modules/cron/enable - cp modules/cron/config-templates/*.php config/ - -Create a directory to cache the downloaded federation metadata: - - mkdir metadata/metarefresh-ukaccess - chmod go+rw metadata/metarefresh-ukaccess - -The module `metarefresh` is responsible for getting metadata from a preconfigured URL, and then parse and validate it and cache it for use with the SAML SP module. - -Edit the `config/config-metarefresh.php`: - - - array( - 'uk' => array( - 'cron' => array('hourly'), - 'sources' => array( - array( - 'src' => 'http://metadata.ukfederation.org.uk/ukfederation-metadata.xml', - 'validateFingerprint' => 'D0:E8:40:25:F0:B1:2A:CC:74:22:ED:C3:87:04:BC:29:BB:7B:9A:40', - ), - ), - 'expireAfter' => 60*60*24*4, // Maximum 4 days cache time. - 'outputDir' => 'metadata/metarefresh-ukaccess/', - 'outputFormat' => 'serialize', - ), - ), - ); - -The example above is from **UK Access Federation**. If you instead would like to get metadata from **InCommon**, use the following URL and fingerprint: - - 'src' => 'http://wayf.incommonfederation.org/InCommon/InCommon-metadata.xml', - 'validateFingerprint' => '74278f967cf1bfcaaa1b41afb6336448a2150eb4', - - -* [Updated information about access endpoints and trust anchors for InCommon](http://www.incommonfederation.org/metadata.html) - - -Notice that the configuration points the `outputDir` to the directory we created earlier. Now, we configure the SAML SP to use the cached `outputDir` as one of its metadata sources. Edit `config.php`: - - 'metadata.sources' => array( - array('type' => 'flatfile'), - array('type' => 'serialize', 'directory' => 'metadata/metarefresh-ukaccess'), - ), - -Now, go to the frontpage of your simpleSAMLphp installation, and: - -1. **Configuration** › **Cron module information page**. -2. You then would need to enter that admin password that you did set in `config.php` during installation. -3. **Run cron [hourly]** - -Then the page should load for a while and show no errors, only a white page. (These URLs are meant to run from *cron*, hence no output). If this operation seems to run fine, navigate to the **SimpleSAMLphp Front page** › **Federation**. Here you should see a list of all trusted Identity Providers. The Identity Providers that are downloaded are listed with information about the valid cache duration, such as *(expires in 96.0 hours)*. - -For more details on how to configure automated metadata: - - * [Automated Metadata Management](simplesamlphp-automated_metadata) - -For information on how to configure *remote metadata* manually (possibly in combination with automated metadata as described here): - - * [Service Provider QuickStart](simplesamlphp-sp) - - - - - -Exchange metadata with the Federation -------------------------------------- - -In order to connect your Service Provider to the IdPs of the federations, the IdPs will need to trust your Service Provider. The prodecure for managing trust in federations differ, but the common part is that you would need to prepare *SAML 2.0 metadata for your SP*, and register that with the federation administration. - -SimpleSAMLphp will automatically suggest metadata for your SP. Go to the **SimpleSAMLphp Front page** › **Federation**. Here you will see an entry with *SAML 2.0 SP Metadata*. If you follow the link **[ Show metadata ]**, you will see a page listing metadata for your entity. You may copy and paste the SAML 2.0 metadata document, or send a link to this page to the federation administration. - - - -Test the SP ------------ - -After the metadata is is configured on the IdP, you should be able to test your SP. - -Go to the **SimpleSAMLphp Front Page** › **Authentication** › **Test configured authentication sources**. You will then see a list of authentication sources that you may test. Select the authentication source ID for your SAML 2.0 SP. If you have not modified the `authsources.php` template, the ID is `default-sp`. When you click that link you should see a discovery service list of all Identity Providers. - -For a better looking more advanced Discovery Service with tabs and live search, you should use the `discopower` module in simpleSAMLphp that is part of the official simpleSAMLphp release. - - * [Blog entry about the DiscoPower module](https://rnd.feide.no/content/improved-discovery-service-live-search) - * Dedicated documentation for DiscoPower module, TBD. - - -Integrating authentication with your own application ----------------------------------------------------- - - - * [Service Provider QuickStart](simplesamlphp-sp) - - -Caveat ------- - -In federations like UK Access Federations different aspects of the SAML protocol is in use, and here follows some information about what should work with SimpleSAMLphp and what will not work. - -SimpleSAMLphp SP supports *SAML 1.1*, compatible with Shibboleth 1.3: - - * SimpleSAMLphp supports Shibboleth Binding for authentication request. - * SimpleSAMLphp does not support SAML 1.1 Attribute Queries, but it supports attribute push (embedded attributes in Response). - * SimpleSAMLphp supports SAML 1.1 Artifact Binding for Response. - -SimpleSAMLphp SP supports *SAML 2.0*, compatible with Shibboleth 2.X: - - * SimpleSAMLphp uses the SAML 2.0 HTTP-REDIRECT binding for authentication request. - * SimpleSAMLphp by default sends unsigned authentication request, may be enabled by configuring a certificate. - * SimpleSAMLphp supports the SAML 2.0 HTTP-POST binding for Response. - * SimpleSAMLphp does not support the SAML 2.0 Artifact binding for Response. Estimated to be available in SimpleSAMLphp 1.6. - * SimpleSAMLphp supports SAML 2.0 Attribute Queries, but these are not sent automatically during SSO. - * SimpleSAMLphp supports receiving and decrypting EncryptedAssertions. - * SimpleSAMLphp supports receiving and decrypting NameID, as enabled by default by Shibboleth 2.0 - 2.1. - * SimpleSAMLphp supports SAML 2.0 Single Logout Profile using HTTP-REDIRECT binding. Warning: not yet supported by Shibboleth 2.x IdP. - -**Important about certificates**: SimpleSAMLphp as an SP requires that Identity Providers have embedded certificates in metadata. Most federations use emebedded certificates, and others are migrating to use embedded certificates. Some federations though are using PKI, relying on a list of trusted CAs and no embedded certificates in metadata - this setup is *not* supported by simpleSAMLphp. - - -Support -------- - -If you need help to make this work, or want to discuss simpleSAMLphp with other users of the software, you are fortunate: Around simpleSAMLphp there is a great Open source community, and you are welcome to join! The forums are open for you to ask questions, contribute answers other further questions, request improvements or contribute with code or plugins of your own. - -- [simpleSAMLphp homepage (at Feide RnD)](http://rnd.feide.no/simplesamlphp) -- [List of all available simpleSAMLphp documentation](http://simplesamlphp.org/docs/) -- [Join the simpleSAMLphp user's mailing list](http://rnd.feide.no/content/simplesamlphp-users-mailinglist) -- [Visit and contribute to the simpleSAMLphp wiki](https://ow.feide.no/simplesamlphp:start) - -More information about the federations: - -- [UK Access Federation](http://www.ukfederation.org.uk/) -- [InCommon](http://www.incommonfederation.org/) - -If your questions are not related to simpleSAMLphp, but instead procedures on how to deal with a specific federation, visit the support channels specific for that federation. - diff --git a/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.11.txt b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.11.txt new file mode 100644 index 0000000..89f3491 --- /dev/null +++ b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.11.txt @@ -0,0 +1,6 @@ +Upgrade notes for simpleSAMLphp 1.11 +==================================== + + * Support for the Holder-of-Key profile in the SAML 2.0 SP has been disabled by default. + To enable it, set `saml20.hok.assertion` to `TRUE` in `config/authsources.php`. + diff --git a/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.12.txt b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.12.txt new file mode 100644 index 0000000..760a7a1 --- /dev/null +++ b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.12.txt @@ -0,0 +1,4 @@ +Upgrade notes for simpleSAMLphp 1.12 +==================================== + + * PHP version 5.3 is now required. diff --git a/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.13.txt b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.13.txt new file mode 100644 index 0000000..07ed99b --- /dev/null +++ b/inc/simplesamlphp/docs/simplesamlphp-upgrade-notes-1.13.txt @@ -0,0 +1,7 @@ +Upgrade notes for simpleSAMLphp 1.13 +==================================== + + * The RSA_1.5 (RSA with PKCS#1 v1.5 padding) algorithm is now longer allowed by default. This means messages received + that use this algorithm will fail to decrypt. + * Several functions, classes and interfaces are now deprecated. Please check your code if you are using the API. + * A workaround related to performance issues when processing large metadata sets was included in **1.13.2**. **This workaround is experimental and could have unexpected side effects**. \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/ArtifactResolve.php b/inc/simplesamlphp/lib/SAML2/ArtifactResolve.php deleted file mode 100644 index b0e1006..0000000 --- a/inc/simplesamlphp/lib/SAML2/ArtifactResolve.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @package simpleSAMLphp - * @version $Id$ - */ -class SAML2_ArtifactResolve extends SAML2_Request { - - - private $artifact; - - - - public function __construct(DOMElement $xml = NULL) { - parent::__construct('ArtifactResolve', $xml); - - if(!is_null($xml)){ - $results = SAML2_Utils::xpQuery($xml, './saml_protocol:Artifact'); - $this->artifact = $results[0]->textContent; - } - - } - - - /** - * Retrieve the Artifact in this response. - * - * @return string artifact. - */ - public function getArtifact() { - return $this->artifact; - } - - - /** - * Set the artifact that should be included in this response. - * - * @param String The $artifact. - */ - public function setArtifact($artifact) { - assert('is_string($artifact)'); - $this->artifact = $artifact; - } - - /** - * Convert the response message to an XML element. - * - * @return DOMElement This response. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - $artifactelement = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'Artifact', $this->artifact); - $root->appendChild($artifactelement); - return $root; - } - - - - -} diff --git a/inc/simplesamlphp/lib/SAML2/ArtifactResponse.php b/inc/simplesamlphp/lib/SAML2/ArtifactResponse.php deleted file mode 100644 index e818682..0000000 --- a/inc/simplesamlphp/lib/SAML2/ArtifactResponse.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @package simpleSAMLphp - * @version $Id$ - */ -class SAML2_ArtifactResponse extends SAML2_StatusResponse { - - - /** - * The DOMElement with the message the artifact refers - * to, or NULL if we don't refer to any artifact. - * - * @var DOMElement|NULL - */ - private $any; - - - public function __construct(DOMElement $xml = NULL) { - parent::__construct('ArtifactResponse', $xml); - - if(!is_null($xml)){ - - $status = SAML2_Utils::xpQuery($xml, './saml_protocol:Status'); - assert('!empty($status)'); /* Will have failed during StatusResponse parsing. */ - - $status = $status[0]; - - for ($any = $status->nextSibling; $any !== NULL; $any = $any->nextSibling) { - if ($any instanceof DOMElement) { - $this->any = $any; - break; - } - /* Ignore comments and text nodes. */ - } - } - - } - - - public function setAny(DOMElement $any = NULL) { - $this->any = $any; - } - - - public function getAny() { - return $this->any; - } - - - /** - * Convert the response message to an XML element. - * - * @return DOMElement This response. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - if (isset($this->any)) { - $node = $root->ownerDocument->importNode($this->any, TRUE); - $root->appendChild($node); - - } - - return $root; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/Assertion.php b/inc/simplesamlphp/lib/SAML2/Assertion.php deleted file mode 100644 index 571a74d..0000000 --- a/inc/simplesamlphp/lib/SAML2/Assertion.php +++ /dev/null @@ -1,1322 +0,0 @@ -id = SimpleSAML_Utilities::generateID(); - $this->issueInstant = time(); - $this->issuer = ''; - $this->authnInstant = time(); - $this->attributes = array(); - $this->nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - $this->certificates = array(); - $this->AuthenticatingAuthority = array(); - $this->SubjectConfirmation = array(); - - if ($xml === NULL) { - return; - } - - if (!$xml->hasAttribute('ID')) { - throw new Exception('Missing ID attribute on SAML assertion.'); - } - $this->id = $xml->getAttribute('ID'); - - if ($xml->getAttribute('Version') !== '2.0') { - /* Currently a very strict check. */ - throw new Exception('Unsupported version: ' . $xml->getAttribute('Version')); - } - - $this->issueInstant = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('IssueInstant')); - - $issuer = SAML2_Utils::xpQuery($xml, './saml_assertion:Issuer'); - if (empty($issuer)) { - throw new Exception('Missing in assertion.'); - } - $this->issuer = trim($issuer[0]->textContent); - - $this->parseSubject($xml); - $this->parseConditions($xml); - $this->parseAuthnStatement($xml); - $this->parseAttributes($xml); - $this->parseEncryptedAttributes($xml); - $this->parseSignature($xml); - } - - - /** - * Parse subject in assertion. - * - * @param DOMElement $xml The assertion XML element. - */ - private function parseSubject(DOMElement $xml) { - - $subject = SAML2_Utils::xpQuery($xml, './saml_assertion:Subject'); - if (empty($subject)) { - /* No Subject node. */ - return; - } elseif (count($subject) > 1) { - throw new Exception('More than one in .'); - } - $subject = $subject[0]; - - $nameId = SAML2_Utils::xpQuery($subject, './saml_assertion:NameID | ./saml_assertion:EncryptedID/xenc:EncryptedData'); - if (empty($nameId)) { - throw new Exception('Missing or in .'); - } elseif (count($nameId) > 1) { - throw new Exception('More than one or in .'); - } - $nameId = $nameId[0]; - if ($nameId->localName === 'EncryptedData') { - /* The NameID element is encrypted. */ - $this->encryptedNameId = $nameId; - } else { - $this->nameId = SAML2_Utils::parseNameId($nameId); - } - - $subjectConfirmation = SAML2_Utils::xpQuery($subject, './saml_assertion:SubjectConfirmation'); - if (empty($subjectConfirmation)) { - throw new Exception('Missing in .'); - } - - foreach ($subjectConfirmation as $sc) { - $this->SubjectConfirmation[] = new SAML2_XML_saml_SubjectConfirmation($sc); - } - } - - - /** - * Parse conditions in assertion. - * - * @param DOMElement $xml The assertion XML element. - */ - private function parseConditions(DOMElement $xml) { - - $conditions = SAML2_Utils::xpQuery($xml, './saml_assertion:Conditions'); - if (empty($conditions)) { - /* No node. */ - return; - } elseif (count($conditions) > 1) { - throw new Exception('More than one in .'); - } - $conditions = $conditions[0]; - - if ($conditions->hasAttribute('NotBefore')) { - $notBefore = SimpleSAML_Utilities::parseSAML2Time($conditions->getAttribute('NotBefore')); - if ($this->notBefore === NULL || $this->notBefore < $notBefore) { - $this->notBefore = $notBefore; - } - } - if ($conditions->hasAttribute('NotOnOrAfter')) { - $notOnOrAfter = SimpleSAML_Utilities::parseSAML2Time($conditions->getAttribute('NotOnOrAfter')); - if ($this->notOnOrAfter === NULL || $this->notOnOrAfter > $notOnOrAfter) { - $this->notOnOrAfter = $notOnOrAfter; - } - } - - - for ($node = $conditions->firstChild; $node !== NULL; $node = $node->nextSibling) { - if ($node instanceof DOMText) { - continue; - } - if ($node->namespaceURI !== SAML2_Const::NS_SAML) { - throw new Exception('Unknown namespace of condition: ' . var_export($node->namespaceURI, TRUE)); - } - switch ($node->localName) { - case 'AudienceRestriction': - $audiences = SAML2_Utils::extractStrings($node, SAML2_Const::NS_SAML, 'Audience'); - if ($this->validAudiences === NULL) { - /* The first (and probably last) AudienceRestriction element. */ - $this->validAudiences = $audiences; - - } else { - /* - * The set of AudienceRestriction are ANDed together, so we need - * the subset that are present in all of them. - */ - $this->validAudiences = array_intersect($this->validAudiences, $audiences); - } - break; - case 'OneTimeUse': - /* Currently ignored. */ - break; - case 'ProxyRestriction': - /* Currently ignored. */ - break; - default: - throw new Exception('Unknown condition: ' . var_export($node->localName, TRUE)); - } - } - - } - - - /** - * Parse AuthnStatement in assertion. - * - * @param DOMElement $xml The assertion XML element. - */ - private function parseAuthnStatement(DOMElement $xml) { - - $as = SAML2_Utils::xpQuery($xml, './saml_assertion:AuthnStatement'); - if (empty($as)) { - $this->authnInstant = NULL; - return; - } elseif (count($as) > 1) { - throw new Exception('More that one in not supported.'); - } - $as = $as[0]; - $this->authnStatement = array(); - - if (!$as->hasAttribute('AuthnInstant')) { - throw new Exception('Missing required AuthnInstant attribute on .'); - } - $this->authnInstant = SimpleSAML_Utilities::parseSAML2Time($as->getAttribute('AuthnInstant')); - - if ($as->hasAttribute('SessionNotOnOrAfter')) { - $this->sessionNotOnOrAfter = SimpleSAML_Utilities::parseSAML2Time($as->getAttribute('SessionNotOnOrAfter')); - } - - if ($as->hasAttribute('SessionIndex')) { - $this->sessionIndex = $as->getAttribute('SessionIndex'); - } - - $ac = SAML2_Utils::xpQuery($as, './saml_assertion:AuthnContext'); - if (empty($ac)) { - throw new Exception('Missing required in .'); - } elseif (count($ac) > 1) { - throw new Exception('More than one in .'); - } - $ac = $ac[0]; - - $accr = SAML2_Utils::xpQuery($ac, './saml_assertion:AuthnContextClassRef'); - if (empty($accr)) { - $acdr = SAML2_Utils::xpQuery($ac, './saml_assertion:AuthnContextDeclRef'); - if (empty($acdr)) { - throw new Exception('Neither nor found in .'); - } elseif (count($accr) > 1) { - throw new Exception('More than one in .'); - } - $this->authnContext = trim($acdr[0]->textContent); - } elseif (count($accr) > 1) { - throw new Exception('More than one in .'); - } else { - $this->authnContext = trim($accr[0]->textContent); - } - - $this->AuthenticatingAuthority = SAML2_Utils::extractStrings($ac, SAML2_Const::NS_SAML, 'AuthenticatingAuthority'); - } - - - /** - * Parse attribute statements in assertion. - * - * @param DOMElement $xml The XML element with the assertion. - */ - private function parseAttributes(DOMElement $xml) { - - $firstAttribute = TRUE; - $attributes = SAML2_Utils::xpQuery($xml, './saml_assertion:AttributeStatement/saml_assertion:Attribute'); - foreach ($attributes as $attribute) { - if (!$attribute->hasAttribute('Name')) { - throw new Exception('Missing name on element.'); - } - $name = $attribute->getAttribute('Name'); - - if ($attribute->hasAttribute('NameFormat')) { - $nameFormat = $attribute->getAttribute('NameFormat'); - } else { - $nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - - if ($firstAttribute) { - $this->nameFormat = $nameFormat; - $firstAttribute = FALSE; - } else { - if ($this->nameFormat !== $nameFormat) { - $this->nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - } - - if (!array_key_exists($name, $this->attributes)) { - $this->attributes[$name] = array(); - } - - $values = SAML2_Utils::xpQuery($attribute, './saml_assertion:AttributeValue'); - foreach ($values as $value) { - $this->attributes[$name][] = trim($value->textContent); - } - } - } - - - /** - * Parse encrypted attribute statements in assertion. - * - * @param DOMElement $xml The XML element with the assertion. - */ - private function parseEncryptedAttributes(DOMElement $xml) { - - $this->encryptedAttribute = SAML2_Utils::xpQuery($xml, './saml_assertion:AttributeStatement/saml_assertion:EncryptedAttribute'); - } - - - /** - * Parse signature on assertion. - * - * @param DOMElement $xml The assertion XML element. - */ - private function parseSignature(DOMElement $xml) { - - /* Validate the signature element of the message. */ - $sig = SAML2_Utils::validateElement($xml); - if ($sig !== FALSE) { - $this->certificates = $sig['Certificates']; - $this->signatureData = $sig; - } - } - - - /** - * Validate this assertion against a public key. - * - * If no signature was present on the assertion, we will return FALSE. - * Otherwise, TRUE will be returned. An exception is thrown if the - * signature validation fails. - * - * @param XMLSecurityKey $key The key we should check against. - * @return boolean TRUE if successful, FALSE if it is unsigned. - */ - public function validate(XMLSecurityKey $key) { - assert('$key->type === XMLSecurityKey::RSA_SHA1'); - - if ($this->signatureData === NULL) { - return FALSE; - } - - SAML2_Utils::validateSignature($this->signatureData, $key); - - return TRUE; - } - - - /** - * Retrieve the identifier of this assertion. - * - * @return string The identifier of this assertion. - */ - public function getId() { - return $this->id; - } - - - /** - * Set the identifier of this assertion. - * - * @param string $id The new identifier of this assertion. - */ - public function setId($id) { - assert('is_string($id)'); - - $this->id = $id; - } - - - /** - * Retrieve the issue timestamp of this assertion. - * - * @return int The issue timestamp of this assertion, as an UNIX timestamp. - */ - public function getIssueInstant() { - return $this->issueInstant; - } - - - /** - * Set the issue timestamp of this assertion. - * - * @param int $issueInstant The new issue timestamp of this assertion, as an UNIX timestamp. - */ - public function setIssueInstant($issueInstant) { - assert('is_int($issueInstant)'); - - $this->issueInstant = $issueInstant; - } - - - /** - * Retrieve the issuer if this assertion. - * - * @return string The issuer of this assertion. - */ - public function getIssuer() { - return $this->issuer; - } - - - /** - * Set the issuer of this message. - * - * @param string $issuer The new issuer of this assertion. - */ - public function setIssuer($issuer) { - assert('is_string($issuer)'); - - $this->issuer = $issuer; - } - - - /** - * Retrieve the NameId of the subject in the assertion. - * - * The returned NameId is in the format used by SAML2_Utils::addNameId(). - * - * @see SAML2_Utils::addNameId() - * @return array|NULL The name identifier of the assertion. - */ - public function getNameId() { - - if ($this->encryptedNameId !== NULL) { - throw new Exception('Attempted to retrieve encrypted NameID without decrypting it first.'); - } - - return $this->nameId; - } - - - /** - * Set the NameId of the subject in the assertion. - * - * The NameId must be in the format accepted by SAML2_Utils::addNameId(). - * - * @see SAML2_Utils::addNameId() - * @param array|NULL $nameId The name identifier of the assertion. - */ - public function setNameId($nameId) { - assert('is_array($nameId) || is_null($nameId)'); - - $this->nameId = $nameId; - } - - - /** - * Check whether the NameId is encrypted. - * - * @return TRUE if the NameId is encrypted, FALSE if not. - */ - public function isNameIdEncrypted() { - - if ($this->encryptedNameId !== NULL) { - return TRUE; - } - - return FALSE; - } - - - /** - * Encrypt the NameID in the Assertion. - * - * @param XMLSecurityKey $key The encryption key. - */ - public function encryptNameId(XMLSecurityKey $key) { - - /* First create a XML representation of the NameID. */ - $doc = new DOMDocument(); - $root = $doc->createElement('root'); - $doc->appendChild($root); - SAML2_Utils::addNameId($root, $this->nameId); - $nameId = $root->firstChild; - - SimpleSAML_Utilities::debugMessage($nameId, 'encrypt'); - - /* Encrypt the NameID. */ - $enc = new XMLSecEnc(); - $enc->setNode($nameId); - $enc->type = XMLSecEnc::Element; - - $symmetricKey = new XMLSecurityKey(XMLSecurityKey::AES128_CBC); - $symmetricKey->generateSessionKey(); - $enc->encryptKey($key, $symmetricKey); - - $this->encryptedNameId = $enc->encryptNode($symmetricKey); - $this->nameId = NULL; - } - - - /** - * Decrypt the NameId of the subject in the assertion. - * - * @param XMLSecurityKey $key The decryption key. - * @param array $blacklist Blacklisted decryption algorithms. - */ - public function decryptNameId(XMLSecurityKey $key, array $blacklist = array()) { - - if ($this->encryptedNameId === NULL) { - /* No NameID to decrypt. */ - return; - } - - $nameId = SAML2_Utils::decryptElement($this->encryptedNameId, $key, $blacklist); - SimpleSAML_Utilities::debugMessage($nameId, 'decrypt'); - $this->nameId = SAML2_Utils::parseNameId($nameId); - - $this->encryptedNameId = NULL; - } - - - public function decryptAttributes($key, array $blacklist = array()){ - if($this->encryptedAttribute === null){ - return; - } - $attributes = $this->encryptedAttribute; - foreach ($attributes as $attributeEnc) { - /*Decrypt node */ - $attribute = SAML2_Utils::decryptElement($attributeEnc->getElementsByTagName('EncryptedData')->item(0), $key, $blacklist); - - if (!$attribute->hasAttribute('Name')) { - throw new Exception('Missing name on element.'); - } - $name = $attribute->getAttribute('Name'); - - if ($attribute->hasAttribute('NameFormat')) { - $nameFormat = $attribute->getAttribute('NameFormat'); - } else { - $nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - - if ($firstAttribute) { - $this->nameFormat = $nameFormat; - $firstAttribute = FALSE; - } else { - if ($this->nameFormat !== $nameFormat) { - $this->nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - } - - if (!array_key_exists($name, $this->attributes)) { - $this->attributes[$name] = array(); - } - - $values = SAML2_Utils::xpQuery($attribute, './saml_assertion:AttributeValue'); - foreach ($values as $value) { - $this->attributes[$name][] = trim($value->textContent); - } - } - } - - - /** - * Retrieve the earliest timestamp this assertion is valid. - * - * This function returns NULL if there are no restrictions on how early the - * assertion can be used. - * - * @return int|NULL The earliest timestamp this assertion is valid. - */ - public function getNotBefore() { - - return $this->notBefore; - } - - - /** - * Set the earliest timestamp this assertion can be used. - * - * Set this to NULL if no limit is required. - * - * @param int|NULL $notBefore The earliest timestamp this assertion is valid. - */ - public function setNotBefore($notBefore) { - assert('is_int($notBefore) || is_null($notBefore)'); - - $this->notBefore = $notBefore; - } - - - /** - * Retrieve the expiration timestamp of this assertion. - * - * This function returns NULL if there are no restrictions on how - * late the assertion can be used. - * - * @return int|NULL The latest timestamp this assertion is valid. - */ - public function getNotOnOrAfter() { - - return $this->notOnOrAfter; - } - - - /** - * Set the expiration timestamp of this assertion. - * - * Set this to NULL if no limit is required. - * - * @param int|NULL $notOnOrAfter The latest timestamp this assertion is valid. - */ - public function setNotOnOrAfter($notOnOrAfter) { - assert('is_int($notOnOrAfter) || is_null($notOnOrAfter)'); - - $this->notOnOrAfter = $notOnOrAfter; - } - - - /** - * Set $EncryptedAttributes if attributes will send encrypted - * - * @param boolean $ea TRUE to encrypt attributes in the assertion. - */ - public function setEncryptedAttributes($ea) { - $this->requiredEncAttributes = $ea; - } - - - /** - * Retrieve the audiences that are allowed to receive this assertion. - * - * This may be NULL, in which case all audiences are allowed. - * - * @return array|NULL The allowed audiences. - */ - public function getValidAudiences() { - - return $this->validAudiences; - } - - - /** - * Set the audiences that are allowed to receive this assertion. - * - * This may be NULL, in which case all audiences are allowed. - * - * @param array|NULL $validAudiences The allowed audiences. - */ - public function setValidAudiences(array $validAudiences = NULL) { - - $this->validAudiences = $validAudiences; - } - - - /** - * Retrieve the AuthnInstant of the assertion. - * - * @return int|NULL The timestamp the user was authenticated, or NULL if the user isn't authenticated. - */ - public function getAuthnInstant() { - - return $this->authnInstant; - } - - - /** - * Set the AuthnInstant of the assertion. - * - * @param int|NULL $authnInstant The timestamp the user was authenticated, or NULL if we don't want an AuthnStatement. - */ - public function setAuthnInstant($authnInstant) { - assert('is_int($authnInstant) || is_null($authnInstant)'); - - $this->authnInstant = $authnInstant; - } - - - /** - * Retrieve the session expiration timestamp. - * - * This function returns NULL if there are no restrictions on the - * session lifetime. - * - * @return int|NULL The latest timestamp this session is valid. - */ - public function getSessionNotOnOrAfter() { - - return $this->sessionNotOnOrAfter; - } - - - /** - * Set the session expiration timestamp. - * - * Set this to NULL if no limit is required. - * - * @param int|NULL $sessionLifetime The latest timestamp this session is valid. - */ - public function setSessionNotOnOrAfter($sessionNotOnOrAfter) { - assert('is_int($sessionNotOnOrAfter) || is_null($sessionNotOnOrAfter)'); - - $this->sessionNotOnOrAfter = $sessionNotOnOrAfter; - } - - - /** - * Retrieve the session index of the user at the IdP. - * - * @return string|NULL The session index of the user at the IdP. - */ - public function getSessionIndex() { - - return $this->sessionIndex; - } - - - /** - * Set the session index of the user at the IdP. - * - * Note that the authentication context must be set before the - * session index can be inluded in the assertion. - * - * @param string|NULL $sessionIndex The session index of the user at the IdP. - */ - public function setSessionIndex($sessionIndex) { - assert('is_string($sessionIndex) || is_null($sessionIndex)'); - - $this->sessionIndex = $sessionIndex; - } - - - /** - * Retrieve the authentication method used to authenticate the user. - * - * This will return NULL if no authentication statement was - * included in the assertion. - * - * @return string|NULL The authentication method. - */ - public function getAuthnContext() { - - return $this->authnContext; - } - - - /** - * Set the authentication method used to authenticate the user. - * - * If this is set to NULL, no authentication statement will be - * included in the assertion. The default is NULL. - * - * @param string|NULL $authnContext The authentication method. - */ - public function setAuthnContext($authnContext) { - assert('is_string($authnContext) || is_null($authnContext)'); - - $this->authnContext = $authnContext; - } - - - /** - * Retrieve the AuthenticatingAuthority. - * - * - * @return array - */ - public function getAuthenticatingAuthority() { - - return $this->AuthenticatingAuthority; - } - - - /** - * Set the AuthenticatingAuthority - * - * - * @param array. - */ - public function setAuthenticatingAuthority($AuthenticatingAuthority) { - $this->AuthenticatingAuthority = $AuthenticatingAuthority; - } - - - /** - * Retrieve all attributes. - * - * @return array All attributes, as an associative array. - */ - public function getAttributes() { - - return $this->attributes; - } - - - /** - * Replace all attributes. - * - * @param array $attributes All new attributes, as an associative array. - */ - public function setAttributes(array $attributes) { - - $this->attributes = $attributes; - } - - - /** - * Retrieve the NameFormat used on all attributes. - * - * If more than one NameFormat is used in the received attributes, this - * returns the unspecified NameFormat. - * - * @return string The NameFormat used on all attributes. - */ - public function getAttributeNameFormat() { - return $this->nameFormat; - } - - - /** - * Set the NameFormat used on all attributes. - * - * @param string $nameFormat The NameFormat used on all attributes. - */ - public function setAttributeNameFormat($nameFormat) { - assert('is_string($nameFormat)'); - - $this->nameFormat = $nameFormat; - } - - - /** - * Retrieve the SubjectConfirmation elements we have in our Subject element. - * - * @return array Array of SAML2_XML_saml_SubjectConfirmation elements. - */ - public function getSubjectConfirmation() { - return $this->SubjectConfirmation; - } - - - /** - * Set the SubjectConfirmation elements that should be included in the assertion. - * - * @param array $SubjectConfirmation Array of SAML2_XML_saml_SubjectConfirmation elements. - */ - public function setSubjectConfirmation(array $SubjectConfirmation) { - - $this->SubjectConfirmation = $SubjectConfirmation; - } - - - /** - * Retrieve the private key we should use to sign the assertion. - * - * @return XMLSecurityKey|NULL The key, or NULL if no key is specified. - */ - public function getSignatureKey() { - return $this->signatureKey; - } - - - /** - * Set the private key we should use to sign the assertion. - * - * If the key is NULL, the assertion will be sent unsigned. - * - * @param XMLSecurityKey|NULL $key - */ - public function setSignatureKey(XMLsecurityKey $signatureKey = NULL) { - $this->signatureKey = $signatureKey; - } - - - /** - * Return the key we should use to encrypt the assertion. - * - * @return XMLSecurityKey|NULL The key, or NULL if no key is specified.. - * - */ - - - public function getEncryptionKey() { - return $this->encryptionKey; - } - - - /** - * Set the private key we should use to encrypt the attributes. - * - * @param XMLSecurityKey|NULL $key - */ - public function setEncryptionKey(XMLSecurityKey $Key = NULL) { - $this->encryptionKey = $Key; - } - - /** - * Set the certificates that should be included in the assertion. - * - * The certificates should be strings with the PEM encoded data. - * - * @param array $certificates An array of certificates. - */ - public function setCertificates(array $certificates) { - $this->certificates = $certificates; - } - - - /** - * Retrieve the certificates that are included in the assertion. - * - * @return array An array of certificates. - */ - public function getCertificates() { - return $this->certificates; - } - - - /** - * Convert this assertion to an XML element. - * - * @param DOMNode|NULL $parentElement The DOM node the assertion should be created in. - * @return DOMElement This assertion. - */ - public function toXML(DOMNode $parentElement = NULL) { - - if ($parentElement === NULL) { - $document = new DOMDocument(); - $parentElement = $document; - } else { - $document = $parentElement->ownerDocument; - } - - $root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'Assertion'); - $parentElement->appendChild($root); - - /* Ugly hack to add another namespace declaration to the root element. */ - $root->setAttributeNS(SAML2_Const::NS_SAMLP, 'samlp:tmp', 'tmp'); - $root->removeAttributeNS(SAML2_Const::NS_SAMLP, 'tmp'); - $root->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:tmp', 'tmp'); - $root->removeAttributeNS(SAML2_Const::NS_XSI, 'tmp'); - $root->setAttributeNS(SAML2_Const::NS_XS, 'xs:tmp', 'tmp'); - $root->removeAttributeNS(SAML2_Const::NS_XS, 'tmp'); - - $root->setAttribute('ID', $this->id); - $root->setAttribute('Version', '2.0'); - $root->setAttribute('IssueInstant', gmdate('Y-m-d\TH:i:s\Z', $this->issueInstant)); - - $issuer = SAML2_Utils::addString($root, SAML2_Const::NS_SAML, 'saml:Issuer', $this->issuer); - - $this->addSubject($root); - $this->addConditions($root); - $this->addAuthnStatement($root); - if($this->requiredEncAttributes == false) - $this->addAttributeStatement($root); - else - $this->addEncryptedAttributeStatement($root); - - if ($this->signatureKey !== NULL) { - SAML2_Utils::insertSignature($this->signatureKey, $this->certificates, $root, $issuer->nextSibling); - } - - return $root; - } - - - /** - * Add a Subject-node to the assertion. - * - * @param DOMElement $root The assertion element we should add the subject to. - */ - private function addSubject(DOMElement $root) { - - if ($this->nameId === NULL && $this->encryptedNameId === NULL) { - /* We don't have anything to create a Subject node for. */ - return; - } - - $subject = $root->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:Subject'); - $root->appendChild($subject); - - if ($this->encryptedNameId === NULL) { - SAML2_Utils::addNameId($subject, $this->nameId); - } else { - $eid = $subject->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'EncryptedID'); - $subject->appendChild($eid); - $eid->appendChild($subject->ownerDocument->importNode($this->encryptedNameId, TRUE)); - } - - foreach ($this->SubjectConfirmation as $sc) { - $sc->toXML($subject); - } - } - - - /** - * Add a Conditions-node to the assertion. - * - * @param DOMElement $root The assertion element we should add the conditions to. - */ - private function addConditions(DOMElement $root) { - - $document = $root->ownerDocument; - - $conditions = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:Conditions'); - $root->appendChild($conditions); - - if ($this->notBefore !== NULL) { - $conditions->setAttribute('NotBefore', gmdate('Y-m-d\TH:i:s\Z', $this->notBefore)); - } - if ($this->notOnOrAfter !== NULL) { - $conditions->setAttribute('NotOnOrAfter', gmdate('Y-m-d\TH:i:s\Z', $this->notOnOrAfter)); - } - - if ($this->validAudiences !== NULL) { - $ar = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AudienceRestriction'); - $conditions->appendChild($ar); - - SAML2_Utils::addStrings($ar, SAML2_Const::NS_SAML, 'saml:Audience', FALSE, $this->validAudiences); - } - } - - - /** - * Add a AuthnStatement-node to the assertion. - * - * @param DOMElement $root The assertion element we should add the authentication statement to. - */ - private function addAuthnStatement(DOMElement $root) { - - if ($this->authnContext === NULL || $this->authnInstant === NULL) { - /* No authentication context or AuthnInstant => no authentication statement. */ - return; - } - - $document = $root->ownerDocument; - - $as = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AuthnStatement'); - $root->appendChild($as); - - $as->setAttribute('AuthnInstant', gmdate('Y-m-d\TH:i:s\Z', $this->authnInstant)); - - if ($this->sessionNotOnOrAfter !== NULL) { - $as->setAttribute('SessionNotOnOrAfter', gmdate('Y-m-d\TH:i:s\Z', $this->sessionNotOnOrAfter)); - } - if ($this->sessionIndex !== NULL) { - $as->setAttribute('SessionIndex', $this->sessionIndex); - } - - $ac = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AuthnContext'); - $as->appendChild($ac); - - SAML2_Utils::addString($ac, SAML2_Const::NS_SAML, 'saml:AuthnContextClassRef', $this->authnContext); - SAML2_Utils::addStrings($ac, SAML2_Const::NS_SAML, 'saml:AuthenticatingAuthority', false, $this->AuthenticatingAuthority); - } - - - /** - * Add an AttributeStatement-node to the assertion. - * - * @param DOMElement $root The assertion element we should add the subject to. - */ - private function addAttributeStatement(DOMElement $root) { - - if (empty($this->attributes)) { - return; - } - - $document = $root->ownerDocument; - - $attributeStatement = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeStatement'); - $root->appendChild($attributeStatement); - - foreach ($this->attributes as $name => $values) { - $attribute = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:Attribute'); - $attributeStatement->appendChild($attribute); - $attribute->setAttribute('Name', $name); - - if ($this->nameFormat !== SAML2_Const::NAMEFORMAT_UNSPECIFIED) { - $attribute->setAttribute('NameFormat', $this->nameFormat); - } - - foreach ($values as $value) { - if (is_string($value)) { - $type = 'xs:string'; - } elseif (is_int($value)) { - $type = 'xs:integer'; - } else { - $type = NULL; - } - - $attributeValue = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeValue'); - $attribute->appendChild($attributeValue); - if ($type !== NULL) { - $attributeValue->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:type', $type); - } - - if ($value instanceof DOMNodeList) { - for ($i = 0; $i < $value->length; $i++) { - $node = $document->importNode($value->item($i), TRUE); - $attributeValue->appendChild($node); - } - } else { - $attributeValue->appendChild($document->createTextNode($value)); - } - } - } - } - - - /** - * Add an EncryptedAttribute Statement-node to the assertion. - * - * @param DOMElement $root The assertion element we should add the Encrypted Attribute Statement to. - */ - private function addEncryptedAttributeStatement(DOMElement $root) { - - if ($this->requiredEncAttributes == FALSE) - return; - - $document = $root->ownerDocument; - - $attributeStatement = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeStatement'); - $root->appendChild($attributeStatement); - - foreach ($this->attributes as $name => $values) { - $document2 = new DOMDocument(); - $attribute = $document2->createElementNS(SAML2_Const::NS_SAML, 'saml:Attribute'); - $attribute->setAttribute('Name', $name); - $document2->appendChild($attribute); - - if ($this->nameFormat !== SAML2_Const::NAMEFORMAT_UNSPECIFIED) { - $attribute->setAttribute('NameFormat', $this->nameFormat); - } - - foreach ($values as $value) { - if (is_string($value)) { - $type = 'xs:string'; - } elseif (is_int($value)) { - $type = 'xs:integer'; - } else { - $type = NULL; - } - - $attributeValue = $document2->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeValue'); - $attribute->appendChild($attributeValue); - if ($type !== NULL) { - $attributeValue->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:type', $type); - } - - if ($value instanceof DOMNodeList) { - for ($i = 0; $i < $value->length; $i++) { - $node = $document2->importNode($value->item($i), TRUE); - $attributeValue->appendChild($node); - } - } else { - $attributeValue->appendChild($document2->createTextNode($value)); - } - } - /*Once the attribute nodes are built, the are encrypted*/ - $EncAssert = new XMLSecEnc(); - $EncAssert->setNode($document2->documentElement); - $EncAssert->type = 'http://www.w3.org/2001/04/xmlenc#Element'; - /* - * Attributes are encrypted with a session key and this one with - * $EncryptionKey - */ - $symmetricKey = new XMLSecurityKey(XMLSecurityKey::AES256_CBC); - $symmetricKey->generateSessionKey(); - $EncAssert->encryptKey($this->encryptionKey, $symmetricKey); - $EncrNode = $EncAssert->encryptNode($symmetricKey); - - $EncAttribute = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:EncryptedAttribute'); - $attributeStatement->appendChild($EncAttribute); - $n = $document->importNode($EncrNode,true); - $EncAttribute->appendChild($n); - } - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/AttributeQuery.php b/inc/simplesamlphp/lib/SAML2/AttributeQuery.php deleted file mode 100644 index 09b70b7..0000000 --- a/inc/simplesamlphp/lib/SAML2/AttributeQuery.php +++ /dev/null @@ -1,176 +0,0 @@ -attributes = array(); - $this->nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - - if ($xml === NULL) { - return; - } - - $firstAttribute = TRUE; - $attributes = SAML2_Utils::xpQuery($xml, './saml_assertion:Attribute'); - foreach ($attributes as $attribute) { - if (!$attribute->hasAttribute('Name')) { - throw new Exception('Missing name on element.'); - } - $name = $attribute->getAttribute('Name'); - - if ($attribute->hasAttribute('NameFormat')) { - $nameFormat = $attribute->getAttribute('NameFormat'); - } else { - $nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - - if ($firstAttribute) { - $this->nameFormat = $nameFormat; - $firstAttribute = FALSE; - } else { - if ($this->nameFormat !== $nameFormat) { - $this->nameFormat = SAML2_Const::NAMEFORMAT_UNSPECIFIED; - } - } - - if (!array_key_exists($name, $this->attributes)) { - $this->attributes[$name] = array(); - } - - $values = SAML2_Utils::xpQuery($attribute, './saml_assertion:AttributeValue'); - foreach ($values as $value) { - $this->attributes[$name][] = trim($value->textContent); - } - } - } - - - /** - * Retrieve all requested attributes. - * - * @return array All requested attributes, as an associative array. - */ - public function getAttributes() { - - return $this->attributes; - } - - - /** - * Set all requested attributes. - * - * @param array $attributes All requested attributes, as an associative array. - */ - public function setAttributes(array $attributes) { - - $this->attributes = $attributes; - } - - - /** - * Retrieve the NameFormat used on all attributes. - * - * If more than one NameFormat is used in the received attributes, this - * returns the unspecified NameFormat. - * - * @return string The NameFormat used on all attributes. - */ - public function getAttributeNameFormat() { - return $this->nameFormat; - } - - - /** - * Set the NameFormat used on all attributes. - * - * @param string $nameFormat The NameFormat used on all attributes. - */ - public function setAttributeNameFormat($nameFormat) { - assert('is_string($nameFormat)'); - - $this->nameFormat = $nameFormat; - } - - - /** - * Convert the attribute query message to an XML element. - * - * @return DOMElement This attribute query. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - foreach ($this->attributes as $name => $values) { - $attribute = $root->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:Attribute'); - $root->appendChild($attribute); - $attribute->setAttribute('Name', $name); - - if ($this->nameFormat !== SAML2_Const::NAMEFORMAT_UNSPECIFIED) { - $attribute->setAttribute('NameFormat', $this->nameFormat); - } - - foreach ($values as $value) { - if (is_string($value)) { - $type = 'xs:string'; - } elseif (is_int($value)) { - $type = 'xs:integer'; - } else { - $type = NULL; - } - - $attributeValue = SAML2_Utils::addString($attribute, SAML2_Const::NS_SAML, 'saml:AttributeValue', $value); - if ($type !== NULL) { - $attributeValue->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:type', $type); - } - } - } - - return $root; - } - - -} diff --git a/inc/simplesamlphp/lib/SAML2/AuthnRequest.php b/inc/simplesamlphp/lib/SAML2/AuthnRequest.php deleted file mode 100644 index f945cdd..0000000 --- a/inc/simplesamlphp/lib/SAML2/AuthnRequest.php +++ /dev/null @@ -1,494 +0,0 @@ -nameIdPolicy = array(); - $this->forceAuthn = FALSE; - $this->isPassive = FALSE; - - if ($xml === NULL) { - return; - } - - $this->forceAuthn = SAML2_Utils::parseBoolean($xml, 'ForceAuthn', FALSE); - $this->isPassive = SAML2_Utils::parseBoolean($xml, 'IsPassive', FALSE); - - if ($xml->hasAttribute('AssertionConsumerServiceURL')) { - $this->assertionConsumerServiceURL = $xml->getAttribute('AssertionConsumerServiceURL'); - } - - if ($xml->hasAttribute('ProtocolBinding')) { - $this->protocolBinding = $xml->getAttribute('ProtocolBinding'); - } - - if ($xml->hasAttribute('AssertionConsumerServiceIndex')) { - $this->assertionConsumerServiceIndex = (int)$xml->getAttribute('AssertionConsumerServiceIndex'); - } - - $nameIdPolicy = SAML2_Utils::xpQuery($xml, './saml_protocol:NameIDPolicy'); - - if (!empty($nameIdPolicy)) { - $nameIdPolicy = $nameIdPolicy[0]; - if ($nameIdPolicy->hasAttribute('Format')) { - $this->nameIdPolicy['Format'] = $nameIdPolicy->getAttribute('Format'); - } - if ($nameIdPolicy->hasAttribute('SPNameQualifier')) { - $this->nameIdPolicy['SPNameQualifier'] = $nameIdPolicy->getAttribute('SPNameQualifier'); - } - if ($nameIdPolicy->hasAttribute('AllowCreate')) { - $this->nameIdPolicy['AllowCreate'] = SAML2_Utils::parseBoolean($nameIdPolicy, 'AllowCreate', FALSE); - } - } - - $requestedAuthnContext = SAML2_Utils::xpQuery($xml, './saml_protocol:RequestedAuthnContext'); - if (!empty($requestedAuthnContext)) { - $requestedAuthnContext = $requestedAuthnContext[0]; - - $rac = array( - 'AuthnContextClassRef' => array(), - 'Comparison' => 'exact', - ); - - $accr = SAML2_Utils::xpQuery($requestedAuthnContext, './saml_assertion:AuthnContextClassRef'); - foreach ($accr as $i) { - $rac['AuthnContextClassRef'][] = trim($i->textContent); - } - - if ($requestedAuthnContext->hasAttribute('Comparison')) { - $rac['Comparison'] = $requestedAuthnContext->getAttribute('Comparison'); - } - - $this->requestedAuthnContext = $rac; - } - - $scoping = SAML2_Utils::xpQuery($xml, './saml_protocol:Scoping'); - if (!empty($scoping)) { - $scoping =$scoping[0]; - - if ($scoping->hasAttribute('ProxyCount')) { - $this->ProxyCount = (int)$scoping->getAttribute('ProxyCount'); - } - $idpEntries = SAML2_Utils::xpQuery($scoping, './saml_protocol:IDPList/saml_protocol:IDPEntry'); - - foreach($idpEntries as $idpEntry) { - if (!$idpEntry->hasAttribute('ProviderID')) { - throw new Exception("Could not get ProviderID from Scoping/IDPEntry element in AuthnRequest object"); - } - $this->IDPList[] = $idpEntry->getAttribute('ProviderID'); - } - - $requesterIDs = SAML2_Utils::xpQuery($scoping, './saml_protocol:RequesterID'); - foreach ($requesterIDs as $requesterID) { - $this->RequesterID[] = trim($requesterID->textContent); - } - - } - - $this->extensions = SAML2_XML_samlp_Extensions::getList($xml); - } - - - /** - * Retrieve the NameIdPolicy. - * - * @see SAML2_AuthnRequest::setNameIdPolicy() - * @return array The NameIdPolicy. - */ - public function getNameIdPolicy() { - return $this->nameIdPolicy; - } - - - /** - * Set the NameIDPolicy. - * - * This function accepts an array with the following options: - * - 'Format' - * - 'SPNameQualifier' - * - 'AllowCreate' - * - * @param array $nameIdPolicy The NameIDPolicy. - */ - public function setNameIdPolicy(array $nameIdPolicy) { - - $this->nameIdPolicy = $nameIdPolicy; - } - - - /** - * Retrieve the value of the ForceAuthn attribute. - * - * @return bool The ForceAuthn attribute. - */ - public function getForceAuthn() { - return $this->forceAuthn; - } - - - /** - * Set the value of the ForceAuthn attribute. - * - * @param bool $forceAuthn The ForceAuthn attribute. - */ - public function setForceAuthn($forceAuthn) { - assert('is_bool($forceAuthn)'); - - $this->forceAuthn = $forceAuthn; - } - - - /** - * Retrieve the value of the IsPassive attribute. - * - * @return bool The IsPassive attribute. - */ - public function getIsPassive() { - return $this->isPassive; - } - - - /** - * Set the value of the IsPassive attribute. - * - * @param bool $isPassive The IsPassive attribute. - */ - public function setIsPassive($isPassive) { - assert('is_bool($isPassive)'); - - $this->isPassive = $isPassive; - } - - - /** - * This function sets the scoping for the request - * See Core 3.4.1.2 for the definition of scoping - * Currently we only support an IDPList of idpEntries - * and only the required ProviderID in an IDPEntry - * $providerIDs is an array of Entity Identifiers - * - */ - public function setIDPList($IDPList) { - assert('is_array($IDPList)'); - $this->IDPList = $IDPList; - } - - - /** - * This function retrieves the list of providerIDs from this authentication request. - * Currently we only support a list of ipd ientity id's. - * @return The list of idpidentityids from the request - */ - - public function getIDPList() { - return $this->IDPList; - } - - public function setProxyCount($ProxyCount) { - assert('is_int($ProxyCount)'); - $this->ProxyCount = $ProxyCount; - } - - public function getProxyCount() { - return $this->ProxyCount; - } - - public function setRequesterID(array $RequesterID) { - $this->RequesterID = $RequesterID; - } - - public function getRequesterID() { - return $this->RequesterID; - } - - /** - * Retrieve the value of the AssertionConsumerServiceURL attribute. - * - * @return string|NULL The AssertionConsumerServiceURL attribute. - */ - public function getAssertionConsumerServiceURL() { - return $this->assertionConsumerServiceURL; - } - - - /** - * Set the value of the AssertionConsumerServiceURL attribute. - * - * @param string|NULL $assertionConsumerServiceURL The AssertionConsumerServiceURL attribute. - */ - public function setAssertionConsumerServiceURL($assertionConsumerServiceURL) { - assert('is_string($assertionConsumerServiceURL) || is_null($assertionConsumerServiceURL)'); - - $this->assertionConsumerServiceURL = $assertionConsumerServiceURL; - } - - - /** - * Retrieve the value of the ProtocolBinding attribute. - * - * @return string|NULL The ProtocolBinding attribute. - */ - public function getProtocolBinding() { - return $this->protocolBinding; - } - - - /** - * Set the value of the ProtocolBinding attribute. - * - * @param string $protocolBinding The ProtocolBinding attribute. - */ - public function setProtocolBinding($protocolBinding) { - assert('is_string($protocolBinding) || is_null($protocolBinding)'); - - $this->protocolBinding = $protocolBinding; - } - - - /** - * Retrieve the value of the AssertionConsumerServiceIndex attribute. - * - * @return int|NULL The AssertionConsumerServiceIndex attribute. - */ - public function getAssertionConsumerServiceIndex() { - return $this->assertionConsumerServiceIndex; - } - - - /** - * Set the value of the AssertionConsumerServiceIndex attribute. - * - * @param string|NULL $assertionConsumerServiceIndex The AssertionConsumerServiceIndex attribute. - */ - public function setAssertionConsumerServiceIndex($assertionConsumerServiceIndex) { - assert('is_int($assertionConsumerServiceIndex) || is_null($assertionConsumerServiceIndex)'); - - $this->assertionConsumerServiceIndex = $assertionConsumerServiceIndex; - } - - - /** - * Retrieve the RequestedAuthnContext. - * - * @return array|NULL The RequestedAuthnContext. - */ - public function getRequestedAuthnContext() { - return $this->requestedAuthnContext; - } - - - /** - * Set the RequestedAuthnContext. - * - * @param array|NULL $requestedAuthnContext The RequestedAuthnContext. - */ - public function setRequestedAuthnContext($requestedAuthnContext) { - assert('is_array($requestedAuthnContext) || is_null($requestedAuthnContext)'); - - $this->requestedAuthnContext = $requestedAuthnContext; - } - - - /** - * Retrieve the Extensions. - * - * @return SAML2_XML_samlp_Extensions. - */ - public function getExtensions() { - return $this->extensions; - } - - - /** - * Set the Extensions. - * - * @param array|NULL $extensions The Extensions. - */ - public function setExtensions($extensions) { - assert('is_array($extensions) || is_null($extensions)'); - - $this->extensions = $extensions; - } - - - /** - * Convert this authentication request to an XML element. - * - * @return DOMElement This authentication request. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - if ($this->forceAuthn) { - $root->setAttribute('ForceAuthn', 'true'); - } - - if ($this->isPassive) { - $root->setAttribute('IsPassive', 'true'); - } - - if ($this->assertionConsumerServiceURL !== NULL) { - $root->setAttribute('AssertionConsumerServiceURL', $this->assertionConsumerServiceURL); - } - - if ($this->protocolBinding !== NULL) { - $root->setAttribute('ProtocolBinding', $this->protocolBinding); - } - - if (!empty($this->nameIdPolicy)) { - $nameIdPolicy = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'NameIDPolicy'); - if (array_key_exists('Format', $this->nameIdPolicy)) { - $nameIdPolicy->setAttribute('Format', $this->nameIdPolicy['Format']); - } - if (array_key_exists('SPNameQualifier', $this->nameIdPolicy)) { - $nameIdPolicy->setAttribute('SPNameQualifier', $this->nameIdPolicy['SPNameQualifier']); - } - if (array_key_exists('AllowCreate', $this->nameIdPolicy) && $this->nameIdPolicy['AllowCreate']) { - $nameIdPolicy->setAttribute('AllowCreate', 'true'); - } - $root->appendChild($nameIdPolicy); - } - - $rac = $this->requestedAuthnContext; - if (!empty($rac) && !empty($rac['AuthnContextClassRef'])) { - $e = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'RequestedAuthnContext'); - $root->appendChild($e); - if (isset($rac['Comparison']) && $rac['Comparison'] !== 'exact') { - $e->setAttribute('Comparison', $rac['Comparison']); - } - foreach ($rac['AuthnContextClassRef'] as $accr) { - SAML2_Utils::addString($e, SAML2_Const::NS_SAML, 'AuthnContextClassRef', $accr); - } - } - - if (!empty($this->extensions)) { - SAML2_XML_samlp_Extensions::addList($root, $this->extensions); - } - - if ($this->ProxyCount !== null || count($this->IDPList) > 0 || count($this->RequesterID) > 0) { - $scoping = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'Scoping'); - if ($this->ProxyCount !== null) { - $scoping->setAttribute('ProxyCount', $this->ProxyCount); - } - if (count($this->IDPList) > 0) { - $idplist = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'IDPList'); - foreach ($this->IDPList as $provider) { - $idpEntry = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'IDPEntry'); - $idpEntry->setAttribute('ProviderID', $provider); - $idplist->appendChild($idpEntry); - } - $scoping->appendChild($idplist); - $root->appendChild($scoping); - } - if (count($this->RequesterID) > 0) { - SAML2_Utils::addStrings($scoping, SAML2_Const::NS_SAMLP, 'RequesterID', FALSE, $this->RequesterID); - } - } - - return $root; - } - -} - - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/Binding.php b/inc/simplesamlphp/lib/SAML2/Binding.php deleted file mode 100644 index cc5f1cc..0000000 --- a/inc/simplesamlphp/lib/SAML2/Binding.php +++ /dev/null @@ -1,147 +0,0 @@ -destination; - } - - - /** - * Override the destination of a message. - * - * Set to NULL to use the destination set in the message. - * - * @param string|NULL $destination The destination the message should be delivered to. - */ - public function setDestination($destination) { - assert('is_string($destination) || is_null($destination)'); - - $this->destination = $destination; - } - - - /** - * Send a SAML 2 message. - * - * This function will send a message using the specified binding. - * The message will be delivered to the destination set in the message. - * - * @param SAML2_Message $message The message which should be sent. - */ - abstract public function send(SAML2_Message $message); - - - /** - * Receive a SAML 2 message. - * - * This function will extract the message from the current request. - * An exception will be thrown if we are unable to process the message. - * - * @return SAML2_Message The received message. - */ - abstract public function receive(); - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/Const.php b/inc/simplesamlphp/lib/SAML2/Const.php deleted file mode 100644 index c536186..0000000 --- a/inc/simplesamlphp/lib/SAML2/Const.php +++ /dev/null @@ -1,160 +0,0 @@ - \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/EncryptedAssertion.php b/inc/simplesamlphp/lib/SAML2/EncryptedAssertion.php deleted file mode 100644 index dc83178..0000000 --- a/inc/simplesamlphp/lib/SAML2/EncryptedAssertion.php +++ /dev/null @@ -1,120 +0,0 @@ -.'); - } elseif (count($data) > 1) { - throw new Exception('More than one encrypted data element in .'); - } - $this->encryptedData = $data[0]; - } - - - /** - * Set the assertion. - * - * @param SAML2_Assertion $assertion The assertion. - * @param XMLSecurityKey $key The key we should use to encrypt the assertion. - */ - public function setAssertion(SAML2_Assertion $assertion, XMLSecurityKey $key) { - - $xml = $assertion->toXML(); - - SimpleSAML_Utilities::debugMessage($xml, 'encrypt'); - - $enc = new XMLSecEnc(); - $enc->setNode($xml); - $enc->type = XMLSecEnc::Element; - - switch ($key->type) { - case XMLSecurityKey::TRIPLEDES_CBC: - case XMLSecurityKey::AES128_CBC: - case XMLSecurityKey::AES192_CBC: - case XMLSecurityKey::AES256_CBC: - $symmetricKey = $key; - break; - - case XMLSecurityKey::RSA_1_5: - case XMLSecurityKey::RSA_OAEP_MGF1P: - $symmetricKey = new XMLSecurityKey(XMLSecurityKey::AES128_CBC); - $symmetricKey->generateSessionKey(); - - $enc->encryptKey($key, $symmetricKey); - - break; - - default: - throw new Exception('Unknown key type for encryption: ' . $key->type); - } - - $this->encryptedData = $enc->encryptNode($symmetricKey); - } - - - /** - * Retrieve the assertion. - * - * @param XMLSecurityKey $key The key we should use to decrypt the assertion. - * @param array $blacklist Blacklisted decryption algorithms. - * @return SAML2_Assertion The decrypted assertion. - */ - public function getAssertion(XMLSecurityKey $inputKey, array $blacklist = array()) { - - $assertionXML = SAML2_Utils::decryptElement($this->encryptedData, $inputKey, $blacklist); - - SimpleSAML_Utilities::debugMessage($assertionXML, 'decrypt'); - - return new SAML2_Assertion($assertionXML); - } - - - /** - * Convert this encrypted assertion to an XML element. - * - * @param DOMNode|NULL $parentElement The DOM node the assertion should be created in. - * @return DOMElement This encrypted assertion. - */ - public function toXML(DOMNode $parentElement = NULL) { - - if ($parentElement === NULL) { - $document = new DOMDocument(); - $parentElement = $document; - } else { - $document = $parentElement->ownerDocument; - } - - $root = $document->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'EncryptedAssertion'); - $parentElement->appendChild($root); - - $root->appendChild($document->importNode($this->encryptedData, TRUE)); - - return $root; - } - -} \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/HTTPArtifact.php b/inc/simplesamlphp/lib/SAML2/HTTPArtifact.php deleted file mode 100644 index d572742..0000000 --- a/inc/simplesamlphp/lib/SAML2/HTTPArtifact.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @package simpleSAMLphp - * @version $Id$ - */ -class SAML2_HTTPArtifact extends SAML2_Binding { - - private $spMetadata; - - /** - * Create the redirect URL for a message. - * - * @param SAML2_Message $message The message. - * @return string The URL the user should be redirected to in order to send a message. - */ - public function getRedirectURL(SAML2_Message $message) { - - $store = SimpleSAML_Store::getInstance(); - if ($store === FALSE) { - throw new Exception('Unable to send artifact without a datastore configured.'); - } - - $generatedId = pack('H*', ((string) SimpleSAML_Utilities::stringToHex(SimpleSAML_Utilities::generateRandomBytes(20)))); - $artifact = base64_encode("\x00\x04\x00\x00" . sha1($message->getIssuer(), TRUE) . $generatedId) ; - $artifactData = $message->toUnsignedXML(); - $artifactDataString = $artifactData->ownerDocument->saveXML($artifactData); - - $store->set('artifact', $artifact, $artifactDataString, time() + 15*60); - - $params = array( - 'SAMLart' => $artifact, - ); - $relayState = $message->getRelayState(); - if ($relayState !== NULL) { - $params['RelayState'] = $relayState; - } - - return SimpleSAML_Utilities::addURLparameter($message->getDestination(), $params); - } - - - /** - * Send a SAML 2 message using the HTTP-Redirect binding. - * - * Note: This function never returns. - * - * @param SAML2_Message $message The message we should send. - */ - public function send(SAML2_Message $message) { - - $destination = $this->getRedirectURL($message); - SimpleSAML_Utilities::redirect($destination); - } - - - /** - * Receive a SAML 2 message sent using the HTTP-Artifact binding. - * - * Throws an exception if it is unable receive the message. - * - * @return SAML2_Message The received message. - */ - public function receive() { - - if (array_key_exists('SAMLart', $_REQUEST)) { - $artifact = base64_decode($_REQUEST['SAMLart']); - $endpointIndex = bin2hex(substr($artifact,2,2)); - $sourceId = bin2hex(substr($artifact,4,20)); - - }else{ - throw new Execption('Missing SAMLArt parameter.'); - } - - $metadataHandler = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); - - $idpmetadata = $metadataHandler->getMetaDataConfigForSha1($sourceId, 'saml20-idp-remote'); - - if ($idpmetadata === NULL) { - throw new Exception('No metadata found for remote provider with SHA1 ID: ' . var_export($sourceId, TRUE)); - } - - $endpoint = NULL; - foreach ($idpmetadata->getEndpoints('ArtifactResolutionService') as $ep) { - if ($ep['index'] === hexdec($endpointIndex)) { - $endpoint = $ep; - break; - } - } - - if ($endpoint === NULL) { - throw new Exception('No ArtifactResolutionService with the correct index.'); - } - - SimpleSAML_Logger::debug("ArtifactResolutionService endpoint being used is := " . $endpoint['Location']); - - //Construct the ArtifactResolve Request - $ar = new SAML2_ArtifactResolve(); - - /* Set the request attributes */ - - $ar->setIssuer($this->spMetadata->getString('entityid')); - $ar->setArtifact($_REQUEST['SAMLart']); - $ar->setDestination($endpoint['Location']); - - /* Sign the request */ - sspmod_saml_Message::addSign($this->spMetadata, $idpmetadata, $ar); // Shoaib - moved from the SOAPClient. - - $soap = new SAML2_SOAPClient(); - - // Send message through SoapClient - $artifactResponse = $soap->send($ar, $this->spMetadata); - - if (!$artifactResponse->isSuccess()) { - throw new Exception('Received error from ArtifactResolutionService.'); - } - - $xml = $artifactResponse->getAny(); - if ($xml === NULL) { - /* Empty ArtifactResponse - possibly because of Artifact replay? */ - return NULL; - } - - $samlresponse = SAML2_Message::fromXML($xml); - $samlresponse->addValidator(array(get_class($this), 'validateSignature'), $artifactResponse); - - - if (isset($_REQUEST['RelayState'])) { - $samlresponse->setRelayState($_REQUEST['RelayState']); - } - - return $samlresponse; - } - - - public function setSPMetadata($sp){ - $this->spMetadata = $sp; - } - - - /** - * A validator which returns TRUE if the ArtifactResponse was signed with the given key - * - * @return TRUE - */ - public static function validateSignature(SAML2_ArtifactResponse $message, XMLSecurityKey $key) { - - return $message->validate($key); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/HTTPPost.php b/inc/simplesamlphp/lib/SAML2/HTTPPost.php deleted file mode 100644 index 951a88a..0000000 --- a/inc/simplesamlphp/lib/SAML2/HTTPPost.php +++ /dev/null @@ -1,87 +0,0 @@ -destination === NULL) { - $destination = $message->getDestination(); - } else { - $destination = $this->destination; - } - $relayState = $message->getRelayState(); - - $msgStr = $message->toSignedXML(); - $msgStr = $msgStr->ownerDocument->saveXML($msgStr); - - SimpleSAML_Utilities::debugMessage($msgStr, 'out'); - - $msgStr = base64_encode($msgStr); - - if ($message instanceof SAML2_Request) { - $msgType = 'SAMLRequest'; - } else { - $msgType = 'SAMLResponse'; - } - - $post = array(); - $post[$msgType] = $msgStr; - - if ($relayState !== NULL) { - $post['RelayState'] = $relayState; - } - - SimpleSAML_Utilities::postRedirect($destination, $post); - } - - - /** - * Receive a SAML 2 message sent using the HTTP-POST binding. - * - * Throws an exception if it is unable receive the message. - * - * @return SAML2_Message The received message. - */ - public function receive() { - - if (array_key_exists('SAMLRequest', $_POST)) { - $msg = $_POST['SAMLRequest']; - } elseif (array_key_exists('SAMLResponse', $_POST)) { - $msg = $_POST['SAMLResponse']; - } else { - throw new Exception('Missing SAMLRequest or SAMLResponse parameter.'); - } - - $msg = base64_decode($msg); - - SimpleSAML_Utilities::debugMessage($msg, 'in'); - - $document = new DOMDocument(); - $document->loadXML($msg); - $xml = $document->firstChild; - - $msg = SAML2_Message::fromXML($xml); - - if (array_key_exists('RelayState', $_POST)) { - $msg->setRelayState($_POST['RelayState']); - } - - return $msg; - } - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/HTTPRedirect.php b/inc/simplesamlphp/lib/SAML2/HTTPRedirect.php deleted file mode 100644 index 6b001de..0000000 --- a/inc/simplesamlphp/lib/SAML2/HTTPRedirect.php +++ /dev/null @@ -1,235 +0,0 @@ -destination === NULL) { - $destination = $message->getDestination(); - } else { - $destination = $this->destination; - } - - $relayState = $message->getRelayState(); - - $key = $message->getSignatureKey(); - - $msgStr = $message->toUnsignedXML(); - $msgStr = $msgStr->ownerDocument->saveXML($msgStr); - - SimpleSAML_Utilities::debugMessage($msgStr, 'out'); - - $msgStr = gzdeflate($msgStr); - $msgStr = base64_encode($msgStr); - - /* Build the query string. */ - - if ($message instanceof SAML2_Request) { - $msg = 'SAMLRequest='; - } else { - $msg = 'SAMLResponse='; - } - $msg .= urlencode($msgStr); - - if ($relayState !== NULL) { - $msg .= '&RelayState=' . urlencode($relayState); - } - - if ($key !== NULL) { - /* Add the signature. */ - $msg .= '&SigAlg=' . urlencode(XMLSecurityKey::RSA_SHA1); - - $signature = $key->signData($msg); - $msg .= '&Signature=' . urlencode(base64_encode($signature)); - } - - if (strpos($destination, '?') === FALSE) { - $destination .= '?' . $msg; - } else { - $destination .= '&' . $msg; - } - - return $destination; - } - - - /** - * Send a SAML 2 message using the HTTP-Redirect binding. - * - * Note: This function never returns. - * - * @param SAML2_Message $message The message we should send. - */ - public function send(SAML2_Message $message) { - - $destination = $this->getRedirectURL($message); - SimpleSAML_Logger::debug('Redirect to ' . strlen($destination) . ' byte URL: ' . $destination); - SimpleSAML_Utilities::redirect($destination); - } - - - /** - * Receive a SAML 2 message sent using the HTTP-Redirect binding. - * - * Throws an exception if it is unable receive the message. - * - * @return SAML2_Message The received message. - */ - public function receive() { - - $data = self::parseQuery(); - - if (array_key_exists('SAMLRequest', $data)) { - $msg = $data['SAMLRequest']; - } elseif (array_key_exists('SAMLResponse', $data)) { - $msg = $data['SAMLResponse']; - } else { - throw new Exception('Missing SAMLRequest or SAMLResponse parameter.'); - } - - if (array_key_exists('SAMLEncoding', $data)) { - $encoding = $data['SAMLEncoding']; - } else { - $encoding = self::DEFLATE; - } - - $msg = base64_decode($msg); - switch ($encoding) { - case self::DEFLATE: - $msg = gzinflate($msg); - break; - default: - throw new Exception('Unknown SAMLEncoding: ' . var_export($encoding, TRUE)); - } - - SimpleSAML_Utilities::debugMessage($msg, 'in'); - - $document = new DOMDocument(); - $document->loadXML($msg); - $xml = $document->firstChild; - - $msg = SAML2_Message::fromXML($xml); - - if (array_key_exists('Signature', $data)) { - /* Save the signature validation data until we need it. */ - $signatureValidationData = array( - 'Signature' => $data['Signature'], - 'Query' => $data['SignedQuery'], - ); - } - - - if (array_key_exists('RelayState', $data)) { - $msg->setRelayState($data['RelayState']); - } - - if (array_key_exists('Signature', $data)) { - if (!array_key_exists('SigAlg', $data)) { - throw new Exception('Missing signature algorithm.'); - } - - $signData = array( - 'Signature' => $data['Signature'], - 'SigAlg' => $data['SigAlg'], - 'Query' => $data['SignedQuery'], - ); - $msg->addValidator(array(get_class($this), 'validateSignature'), $signData); - } - - return $msg; - } - - - /** - * Helper function to parse query data. - * - * This function returns the query string split into key=>value pairs. - * It also adds a new parameter, SignedQuery, which contains the data that is - * signed. - * - * @return string The query data that is signed. - */ - private static function parseQuery() { - /* - * Parse the query string. We need to do this ourself, so that we get access - * to the raw (urlencoded) values. This is required because different software - * can urlencode to different values. - */ - $data = array(); - $relayState = ''; - $sigAlg = ''; - foreach (explode('&', $_SERVER['QUERY_STRING']) as $e) { - list($name, $value) = explode('=', $e, 2); - $name = urldecode($name); - $data[$name] = urldecode($value); - - switch ($name) { - case 'SAMLRequest': - case 'SAMLResponse': - $sigQuery = $name . '=' . $value; - break; - case 'RelayState': - $relayState = '&RelayState=' . $value; - break; - case 'SigAlg': - $sigAlg = '&SigAlg=' . $value; - break; - } - } - - $data['SignedQuery'] = $sigQuery . $relayState . $sigAlg; - - return $data; - } - - - /** - * Validate the signature on a HTTP-Redirect message. - * - * Throws an exception if we are unable to validate the signature. - * - * @param array $data The data we need to validate the query string. - * @param XMLSecurityKey $key The key we should validate the query against. - */ - public static function validateSignature(array $data, XMLSecurityKey $key) { - assert('array_key_exists("Query", $data)'); - assert('array_key_exists("SigAlg", $data)'); - assert('array_key_exists("Signature", $data)'); - - $query = $data['Query']; - $sigAlg = $data['SigAlg']; - $signature = $data['Signature']; - - $signature = base64_decode($signature); - - switch ($sigAlg) { - case XMLSecurityKey::RSA_SHA1: - if ($key->type !== XMLSecurityKey::RSA_SHA1) { - throw new Exception('Invalid key type for validating signature on query string.'); - } - if (!$key->verifySignature($query,$signature)) { - throw new Exception('Unable to validate signature on query string.'); - } - break; - default: - throw new Exception('Unknown signature algorithm: ' . var_export($sigAlg, TRUE)); - } - } - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/LogoutRequest.php b/inc/simplesamlphp/lib/SAML2/LogoutRequest.php deleted file mode 100644 index 1a9cf1e..0000000 --- a/inc/simplesamlphp/lib/SAML2/LogoutRequest.php +++ /dev/null @@ -1,282 +0,0 @@ -sessionIndexes = array(); - - if ($xml === NULL) { - return; - } - - if ($xml->hasAttribute('NotOnOrAfter')) { - $this->notOnOrAfter = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('NotOnOrAfter')); - } - - $nameId = SAML2_Utils::xpQuery($xml, './saml_assertion:NameID | ./saml_assertion:EncryptedID/xenc:EncryptedData'); - if (empty($nameId)) { - throw new Exception('Missing or in .'); - } elseif (count($nameId) > 1) { - throw new Exception('More than one or in .'); - } - $nameId = $nameId[0]; - if ($nameId->localName === 'EncryptedData') { - /* The NameID element is encrypted. */ - $this->encryptedNameId = $nameId; - } else { - $this->nameId = SAML2_Utils::parseNameId($nameId); - } - - $sessionIndexes = SAML2_Utils::xpQuery($xml, './saml_protocol:SessionIndex'); - foreach ($sessionIndexes as $sessionIndex) { - $this->sessionIndexes[] = trim($sessionIndex->textContent); - } - } - - - /** - * Retrieve the expiration time of this request. - * - * @return int|NULL The expiration time of this request. - */ - public function getNotOnOrAfter() { - - return $this->notOnOrAfter; - } - - - /** - * Set the expiration time of this request. - * - * @param int|NULL $notOnOrAfter The expiration time of this request. - */ - public function setNotOnOrAfter($notOnOrAfter) { - assert('is_int($notOnOrAfter) || is_null($notOnOrAfter)'); - - $this->notOnOrAfter = $notOnOrAfter; - } - - - /** - * Check whether the NameId is encrypted. - * - * @return TRUE if the NameId is encrypted, FALSE if not. - */ - public function isNameIdEncrypted() { - - if ($this->encryptedNameId !== NULL) { - return TRUE; - } - - return FALSE; - } - - - /** - * Encrypt the NameID in the LogoutRequest. - * - * @param XMLSecurityKey $key The encryption key. - */ - public function encryptNameId(XMLSecurityKey $key) { - - /* First create a XML representation of the NameID. */ - $doc = new DOMDocument(); - $root = $doc->createElement('root'); - $doc->appendChild($root); - SAML2_Utils::addNameId($root, $this->nameId); - $nameId = $root->firstChild; - - SimpleSAML_Utilities::debugMessage($nameId, 'encrypt'); - - /* Encrypt the NameID. */ - $enc = new XMLSecEnc(); - $enc->setNode($nameId); - $enc->type = XMLSecEnc::Element; - - $symmetricKey = new XMLSecurityKey(XMLSecurityKey::AES128_CBC); - $symmetricKey->generateSessionKey(); - $enc->encryptKey($key, $symmetricKey); - - $this->encryptedNameId = $enc->encryptNode($symmetricKey); - $this->nameId = NULL; - } - - - /** - * Decrypt the NameID in the LogoutRequest. - * - * @param XMLSecurityKey $key The decryption key. - * @param array $blacklist Blacklisted decryption algorithms. - */ - public function decryptNameId(XMLSecurityKey $key, array $blacklist = array()) { - - if ($this->encryptedNameId === NULL) { - /* No NameID to decrypt. */ - return; - } - - $nameId = SAML2_Utils::decryptElement($this->encryptedNameId, $key, $blacklist); - SimpleSAML_Utilities::debugMessage($nameId, 'decrypt'); - $this->nameId = SAML2_Utils::parseNameId($nameId); - - $this->encryptedNameId = NULL; - } - - - /** - * Retrieve the name identifier of the session that should be terminated. - * - * @return array The name identifier of the session that should be terminated. - */ - public function getNameId() { - - if ($this->encryptedNameId !== NULL) { - throw new Exception('Attempted to retrieve encrypted NameID without decrypting it first.'); - } - - return $this->nameId; - } - - - /** - * Set the name identifier of the session that should be terminated. - * - * The name identifier must be in the format accepted by SAML2_message::buildNameId(). - * - * @see SAML2_message::buildNameId() - * @param array $nameId The name identifier of the session that should be terminated. - */ - public function setNameId($nameId) { - assert('is_array($nameId)'); - - $this->nameId = $nameId; - } - - - /** - * Retrieve the SessionIndexes of the sessions that should be terminated. - * - * @return array The SessionIndexes, or an empty array if all sessions should be terminated. - */ - public function getSessionIndexes() { - return $this->sessionIndexes; - } - - - /** - * Set the SessionIndexes of the sessions that should be terminated. - * - * @param array $sessionIndexes The SessionIndexes, or an empty array if all sessions should be terminated. - */ - public function setSessionIndexes(array $sessionIndexes) { - $this->sessionIndexes = $sessionIndexes; - } - - - /** - * Retrieve the sesion index of the session that should be terminated. - * - * @return string|NULL The sesion index of the session that should be terminated. - */ - public function getSessionIndex() { - - if (empty($this->sessionIndexes)) { - return NULL; - } - - return $this->sessionIndexes[0]; - } - - - /** - * Set the sesion index of the session that should be terminated. - * - * @param string|NULL $sessionIndex The sesion index of the session that should be terminated. - */ - public function setSessionIndex($sessionIndex) { - assert('is_string($sessionIndex) || is_null($sessionIndex)'); - - if (is_null($sessionIndex)) { - $this->sessionIndexes = array(); - } else { - $this->sessionIndexes = array($sessionIndex); - } - } - - - /** - * Convert this logout request message to an XML element. - * - * @return DOMElement This logout request. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - if ($this->notOnOrAfter !== NULL) { - $root->setAttribute('NotOnOrAfter', gmdate('Y-m-d\TH:i:s\Z', $this->notOnOrAfter)); - } - - if ($this->encryptedNameId === NULL) { - SAML2_Utils::addNameId($root, $this->nameId); - } else { - $eid = $root->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:' . 'EncryptedID'); - $root->appendChild($eid); - $eid->appendChild($root->ownerDocument->importNode($this->encryptedNameId, TRUE)); - } - - foreach ($this->sessionIndexes as $sessionIndex) { - SAML2_Utils::addString($root, SAML2_Const::NS_SAMLP, 'SessionIndex', $sessionIndex); - } - - return $root; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/LogoutResponse.php b/inc/simplesamlphp/lib/SAML2/LogoutResponse.php deleted file mode 100644 index b242d67..0000000 --- a/inc/simplesamlphp/lib/SAML2/LogoutResponse.php +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/Message.php b/inc/simplesamlphp/lib/SAML2/Message.php deleted file mode 100644 index c2d12a8..0000000 --- a/inc/simplesamlphp/lib/SAML2/Message.php +++ /dev/null @@ -1,484 +0,0 @@ -tagName = $tagName; - - $this->id = SimpleSAML_Utilities::generateID(); - $this->issueInstant = time(); - $this->certificates = array(); - $this->validators = array(); - - if ($xml === NULL) { - return; - } - - if (!$xml->hasAttribute('ID')) { - throw new Exception('Missing ID attribute on SAML message.'); - } - $this->id = $xml->getAttribute('ID'); - - if ($xml->getAttribute('Version') !== '2.0') { - /* Currently a very strict check. */ - throw new Exception('Unsupported version: ' . $xml->getAttribute('Version')); - } - - $this->issueInstant = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('IssueInstant')); - - if ($xml->hasAttribute('Destination')) { - $this->destination = $xml->getAttribute('Destination'); - } - - $issuer = SAML2_Utils::xpQuery($xml, './saml_assertion:Issuer'); - if (!empty($issuer)) { - $this->issuer = trim($issuer[0]->textContent); - } - - - /* Validate the signature element of the message. */ - try { - $sig = SAML2_Utils::validateElement($xml); - - if ($sig !== FALSE) { - $this->certificates = $sig['Certificates']; - $this->validators[] = array( - 'Function' => array('SAML2_Utils', 'validateSignature'), - 'Data' => $sig, - ); - } - - } catch (Exception $e) { - /* Ignore signature validation errors. */ - } - - } - - - /** - * Add a method for validating this message. - * - * This function is used by the HTTP-Redirect binding, to make it possible to - * check the signature against the one included in the query string. - * - * @param callback $function The function which should be called. - * @param mixed $data The data that should be included as the first parameter to the function. - */ - public function addValidator($function, $data) { - assert('is_callable($function)'); - - $this->validators[] = array( - 'Function' => $function, - 'Data' => $data, - ); - } - - - /** - * Validate this message against a public key. - * - * TRUE is returned on success, FALSE is returned if we don't have any - * signature we can validate. An exception is thrown if the signature - * validation fails. - * - * @param XMLSecurityKey $key The key we should check against. - * @return boolean TRUE on success, FALSE when we don't have a signature. - */ - public function validate(XMLSecurityKey $key) { - - if (count($this->validators) === 0) { - return FALSE; - } - - $exceptions = array(); - - foreach ($this->validators as $validator) { - $function = $validator['Function']; - $data = $validator['Data']; - - try { - call_user_func($function, $data, $key); - /* We were able to validate the message with this validator. */ - return TRUE; - } catch (Exception $e) { - $exceptions[] = $e; - } - } - - /* No validators were able to validate the message. */ - throw $exceptions[0]; - } - - - /** - * Retrieve the identifier of this message. - * - * @return string The identifier of this message. - */ - public function getId() { - return $this->id; - } - - - /** - * Set the identifier of this message. - * - * @param string $id The new identifier of this message. - */ - public function setId($id) { - assert('is_string($id)'); - - $this->id = $id; - } - - - /** - * Retrieve the issue timestamp of this message. - * - * @return int The issue timestamp of this message, as an UNIX timestamp. - */ - public function getIssueInstant() { - return $this->issueInstant; - } - - - /** - * Set the issue timestamp of this message. - * - * @param int $issueInstant The new issue timestamp of this message, as an UNIX timestamp. - */ - public function setIssueInstant($issueInstant) { - assert('is_int($issueInstant)'); - - $this->issueInstant = $issueInstant; - } - - - /** - * Retrieve the destination of this message. - * - * @return string|NULL The destination of this message, or NULL if no destination is given. - */ - public function getDestination() { - return $this->destination; - } - - - /** - * Set the destination of this message. - * - * @param string|NULL $destination The new destination of this message. - */ - public function setDestination($destination) { - assert('is_string($destination) || is_null($destination)'); - - $this->destination = $destination; - } - - - /** - * Retrieve the issuer if this message. - * - * @return string|NULL The issuer of this message, or NULL if no issuer is given. - */ - public function getIssuer() { - return $this->issuer; - } - - - /** - * Set the issuer of this message. - * - * @param string|NULL $issuer The new issuer of this message. - */ - public function setIssuer($issuer) { - assert('is_string($issuer) || is_null($issuer)'); - - $this->issuer = $issuer; - } - - - /** - * Retrieve the RelayState associated with this message. - * - * @return string|NULL The RelayState, or NULL if no RelayState is given. - */ - public function getRelayState() { - return $this->relayState; - } - - - /** - * Set the RelayState associated with this message. - * - * @param string|NULL $relayState The new RelayState. - */ - public function setRelayState($relayState) { - assert('is_string($relayState) || is_null($relayState)'); - - $this->relayState = $relayState; - } - - - /** - * Convert this message to an unsigned XML document. - * - * This method does not sign the resulting XML document. - * - * @return DOMElement The root element of the DOM tree. - */ - public function toUnsignedXML() { - - $this->document = new DOMDocument(); - - $root = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'samlp:' . $this->tagName); - $this->document->appendChild($root); - - /* Ugly hack to add another namespace declaration to the root element. */ - $root->setAttributeNS(SAML2_Const::NS_SAML, 'saml:tmp', 'tmp'); - $root->removeAttributeNS(SAML2_Const::NS_SAML, 'tmp'); - - $root->setAttribute('ID', $this->id); - $root->setAttribute('Version', '2.0'); - $root->setAttribute('IssueInstant', gmdate('Y-m-d\TH:i:s\Z', $this->issueInstant)); - - if ($this->destination !== NULL) { - $root->setAttribute('Destination', $this->destination); - } - - if ($this->issuer !== NULL) { - SAML2_Utils::addString($root, SAML2_Const::NS_SAML, 'saml:Issuer', $this->issuer); - } - - return $root; - } - - - /** - * Convert this message to a signed XML document. - * - * This method sign the resulting XML document if the private key for - * the signature is set. - * - * @return DOMElement The root element of the DOM tree. - */ - public function toSignedXML() { - - $root = $this->toUnsignedXML(); - - if ($this->signatureKey === NULL) { - /* We don't have a key to sign it with. */ - return $root; - } - - - /* Find the position we should insert the signature node at. */ - if ($this->issuer !== NULL) { - /* - * We have an issuer node. The signature node should come - * after the issuer node. - */ - $issuerNode = $root->firstChild; - $insertBefore = $issuerNode->nextSibling; - } else { - /* No issuer node - the signature element should be the first element. */ - $insertBefore = $root->firstChild; - } - - - SAML2_Utils::insertSignature($this->signatureKey, $this->certificates, $root, $insertBefore); - - return $root; - } - - - /** - * Retrieve the private key we should use to sign the message. - * - * @return XMLSecurityKey|NULL The key, or NULL if no key is specified. - */ - public function getSignatureKey() { - return $this->signatureKey; - } - - - /** - * Set the private key we should use to sign the message. - * - * If the key is NULL, the message will be sent unsigned. - * - * @param XMLSecurityKey|NULL $key - */ - public function setSignatureKey(XMLsecurityKey $signatureKey = NULL) { - $this->signatureKey = $signatureKey; - } - - - /** - * Set the certificates that should be included in the message. - * - * The certificates should be strings with the PEM encoded data. - * - * @param array $certificates An array of certificates. - */ - public function setCertificates(array $certificates) { - $this->certificates = $certificates; - } - - - /** - * Retrieve the certificates that are included in the message. - * - * @return array An array of certificates. - */ - public function getCertificates() { - return $this->certificates; - } - - - /** - * Convert an XML element into a message. - * - * @param DOMElement $xml The root XML element. - * @return SAML2_Message The message. - */ - public static function fromXML(DOMElement $xml) { - - if ($xml->namespaceURI !== SAML2_Const::NS_SAMLP) { - throw new Exception('Unknown namespace of SAML message: ' . var_export($xml->namespaceURI, TRUE)); - } - - switch ($xml->localName) { - case 'AttributeQuery': - return new SAML2_AttributeQuery($xml); - case 'AuthnRequest': - return new SAML2_AuthnRequest($xml); - case 'LogoutResponse': - return new SAML2_LogoutResponse($xml); - case 'LogoutRequest': - return new SAML2_LogoutRequest($xml); - case 'Response': - return new SAML2_Response($xml); - case 'ArtifactResponse': - return new SAML2_ArtifactResponse($xml); - case 'ArtifactResolve': - return new SAML2_ArtifactResolve($xml); - default: - throw new Exception('Unknown SAML message: ' . var_export($xml->localName, TRUE)); - } - - } - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/Response.php b/inc/simplesamlphp/lib/SAML2/Response.php deleted file mode 100644 index adae1fe..0000000 --- a/inc/simplesamlphp/lib/SAML2/Response.php +++ /dev/null @@ -1,84 +0,0 @@ -assertions = array(); - - if ($xml === NULL) { - return; - } - - for ($node = $xml->firstChild; $node !== NULL; $node = $node->nextSibling) { - if ($node->namespaceURI !== SAML2_Const::NS_SAML) { - continue; - } - - if ($node->localName === 'Assertion') { - $this->assertions[] = new SAML2_Assertion($node); - } elseif($node->localName === 'EncryptedAssertion') { - $this->assertions[] = new SAML2_EncryptedAssertion($node); - } - } - } - - - /** - * Retrieve the assertions in this response. - * - * @return array Array of SAML2_Assertion and SAML2_EncryptedAssertion objects. - */ - public function getAssertions() { - return $this->assertions; - } - - - /** - * Set the assertions that should be included in this response. - * - * @param array The assertions. - */ - public function setAssertions(array $assertions) { - - $this->assertions = $assertions; - } - - - /** - * Convert the response message to an XML element. - * - * @return DOMElement This response. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - foreach ($this->assertions as $assertion) { - $node = $assertion->toXML($root); - } - - return $root; - } - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/SOAP.php b/inc/simplesamlphp/lib/SAML2/SOAP.php deleted file mode 100644 index e55646c..0000000 --- a/inc/simplesamlphp/lib/SAML2/SOAP.php +++ /dev/null @@ -1,57 +0,0 @@ -'; - $outputFromIdp .= ''; - $outputFromIdp .= ''; - $xmlMessage = $message->toSignedXML(); - SimpleSAML_Utilities::debugMessage($xmlMessage, 'out'); - $tempOutputFromIdp = $xmlMessage->ownerDocument->saveXML($xmlMessage); - $outputFromIdp .= $tempOutputFromIdp; - $outputFromIdp .= ''; - $outputFromIdp .= ''; - print($outputFromIdp); - exit(0); - } - - - /** - * Receive a SAML 2 message sent using the HTTP-POST binding. - * - * Throws an exception if it is unable receive the message. - * - * @return SAML2_Message The received message. - */ - public function receive() { - - $postText = file_get_contents('php://input'); - - if(empty($postText)){ - throw new SimpleSAML_Error_BadRequest('Invalid message received to AssertionConsumerService endpoint.'); - } - - $document = new DOMDocument(); - $document->loadXML($postText); - $xml = $document->firstChild; - SimpleSAML_Utilities::debugMessage($xml, 'in'); - $results = SAML2_Utils::xpQuery($xml, '/soap-env:Envelope/soap-env:Body/*[1]'); - return SAML2_Message::fromXML($results[0]); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/SOAPClient.php b/inc/simplesamlphp/lib/SAML2/SOAPClient.php deleted file mode 100644 index 0ba6ebe..0000000 --- a/inc/simplesamlphp/lib/SAML2/SOAPClient.php +++ /dev/null @@ -1,223 +0,0 @@ -'; - const END_SOAP_ENVELOPE = ''; - - /** - * This function sends the SOAP message to the service location and returns SOAP response - * - * @param SAML2_Message $m The request that should be sent. - * @param SimpleSAML_Configuration $srcMetadata The metadata of the issuer of the message. - * @param SimpleSAML_Configuration $dstMetadata The metadata of the destination of the message. - * @return SAML2_Message The response we received. - */ - public function send(SAML2_Message $msg, SimpleSAML_Configuration $srcMetadata, SimpleSAML_Configuration $dstMetadata = NULL) { - - $issuer = $msg->getIssuer(); - - $ctxOpts = array( - 'ssl' => array( - 'capture_peer_cert' => TRUE, - ), - ); - - // Determine if we are going to do a MutualSSL connection between the IdP and SP - Shoaib - if ($srcMetadata->hasValue('saml.SOAPClient.certificate')) { - $cert = $srcMetadata->getValue('saml.SOAPClient.certificate'); - if ($cert !== FALSE) { - $ctxOpts['ssl']['local_cert'] = SimpleSAML_Utilities::resolveCert($srcMetadata->getString('saml.SOAPClient.certificate')); - if ($srcMetadata->hasValue('saml.SOAPClient.privatekey_pass')) { - $ctxOpts['ssl']['passphrase'] = $srcMetadata->getString('saml.SOAPClient.privatekey_pass'); - } - } - } else { - /* Use the SP certificate and privatekey if it is configured. */ - $privateKey = SimpleSAML_Utilities::loadPrivateKey($srcMetadata); - $publicKey = SimpleSAML_Utilities::loadPublicKey($srcMetadata); - if ($privateKey !== NULL && $publicKey !== NULL && isset($publicKey['PEM'])) { - $keyCertData = $privateKey['PEM'] . $publicKey['PEM']; - $file = SimpleSAML_Utilities::getTempDir() . '/' . sha1($keyCertData) . '.pem'; - if (!file_exists($file)) { - SimpleSAML_Utilities::writeFile($file, $keyCertData); - } - $ctxOpts['ssl']['local_cert'] = $file; - if (isset($privateKey['password'])) { - $ctxOpts['ssl']['passphrase'] = $privateKey['password']; - } - } - } - - // do peer certificate verification - if ($dstMetadata !== NULL) { - $peerPublicKeys = $dstMetadata->getPublicKeys('signing', TRUE); - $certData = ''; - foreach ($peerPublicKeys as $key) { - if ($key['type'] !== 'X509Certificate') { - continue; - } - $certData .= "-----BEGIN CERTIFICATE-----\n" . - chunk_split($key['X509Certificate'], 64) . - "-----END CERTIFICATE-----\n"; - } - $peerCertFile = SimpleSAML_Utilities::getTempDir() . '/' . sha1($certData) . '.pem'; - if (!file_exists($peerCertFile)) { - SimpleSAML_Utilities::writeFile($peerCertFile, $certData); - } - // create ssl context - $ctxOpts['ssl']['verify_peer'] = TRUE; - $ctxOpts['ssl']['verify_depth'] = 1; - $ctxOpts['ssl']['cafile'] = $peerCertFile; - } - - $context = stream_context_create($ctxOpts); - if ($context === NULL) { - throw new Exception('Unable to create SSL stream context'); - } - - $options = array( - 'uri' => $issuer, - 'location' => $msg->getDestination(), - 'stream_context' => $context, - ); - - $x = new SoapClient(NULL, $options); - - // Add soap-envelopes - $request = $msg->toSignedXML(); - $request = self::START_SOAP_ENVELOPE . $request->ownerDocument->saveXML($request) . self::END_SOAP_ENVELOPE; - - SimpleSAML_Utilities::debugMessage($request, 'out'); - - $action = 'http://www.oasis-open.org/committees/security'; - $version = '1.1'; - $destination = $msg->getDestination(); - - - /* Perform SOAP Request over HTTP */ - $soapresponsexml = $x->__doRequest($request, $destination, $action, $version); - if ($soapresponsexml === NULL || $soapresponsexml === "") { - throw new Exception('Empty SOAP response, check peer certificate.'); - } - - SimpleSAML_Utilities::debugMessage($soapresponsexml, 'in'); - - // Convert to SAML2_Message (DOMElement) - $dom = new DOMDocument(); - if (!$dom->loadXML($soapresponsexml)) { - throw new Exception('Not a SOAP response.'); - } - - $soapfault = $this->getSOAPFault($dom); - if (isset($soapfault)) { - throw new Exception($soapfault); - } - //Extract the message from the response - $xml = $dom->firstChild; /* Soap Envelope */ - $samlresponse = SAML2_Utils::xpQuery($dom->firstChild, '/soap-env:Envelope/soap-env:Body/*[1]'); - $samlresponse = SAML2_Message::fromXML($samlresponse[0]); - - /* Add validator to message which uses the SSL context. */ - self::addSSLValidator($samlresponse, $context); - - SimpleSAML_Logger::debug("Valid ArtifactResponse received from IdP"); - - return $samlresponse; - - } - - - /** - * Add a signature validator based on a SSL context. - * - * @param SAML2_Message $msg The message we should add a validator to. - * @param resource $context The stream context. - */ - private static function addSSLValidator(SAML2_Message $msg, $context) { - $options = stream_context_get_options($context); - if (!isset($options['ssl']['peer_certificate'])) { - return; - } - - //$out = ''; - //openssl_x509_export($options['ssl']['peer_certificate'], $out); - - $key = openssl_pkey_get_public($options['ssl']['peer_certificate']); - if ($key === FALSE) { - SimpleSAML_Logger::warning('Unable to get public key from peer certificate.'); - return; - } - - $keyInfo = openssl_pkey_get_details($key); - if ($keyInfo === FALSE) { - SimpleSAML_Logger::warning('Unable to get key details from public key.'); - return; - } - - if (!isset($keyInfo['key'])) { - SimpleSAML_Logger::warning('Missing key in public key details.'); - return; - } - - $msg->addValidator(array('SAML2_SOAPClient', 'validateSSL'), $keyInfo['key']); - } - - - /** - * Validate a SOAP message against the certificate on the SSL connection. - * - * @param string $data The public key that was used on the connection. - * @param XMLSecurityKey $key The key we should validate the certificate against. - */ - public static function validateSSL($data, XMLSecurityKey $key) { - assert('is_string($data)'); - - $keyInfo = openssl_pkey_get_details($key->key); - if ($keyInfo === FALSE) { - throw new Exception('Unable to get key details from XMLSecurityKey.'); - } - - if (!isset($keyInfo['key'])) { - throw new Exception('Missing key in public key details.'); - } - - if ($keyInfo['key'] !== $data) { - SimpleSAML_Logger::debug('Key on SSL connection did not match key we validated against.'); - return FALSE; - } - - SimpleSAML_Logger::debug('Message validated based on SSL certificate.'); - } - - - /* - * Extracts the SOAP Fault from SOAP message - * @param $soapmessage Soap response needs to be type DOMDocument - * @return $soapfaultstring string|NULL - */ - private function getSOAPFault($soapmessage) { - - $soapfault = SAML2_Utils::xpQuery($soapmessage->firstChild, '/soap-env:Envelope/soap-env:Body/soap-env:Fault'); - - if (empty($soapfault)) { - /* No fault. */ - return NULL; - } - $soapfaultelement = $soapfault[0]; - $soapfaultstring = "Unknown fault string found"; // There is a fault element but we havn't found out what the fault string is - // find out the fault string - $faultstringelement = SAML2_Utils::xpQuery($soapfaultelement, './soap-env:faultstring') ; - if (!empty($faultstringelement)) { - return $faultstringelement[0]->textContent; - } - return $soapfaultstring; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/SignedElement.php b/inc/simplesamlphp/lib/SAML2/SignedElement.php deleted file mode 100644 index 903cf56..0000000 --- a/inc/simplesamlphp/lib/SAML2/SignedElement.php +++ /dev/null @@ -1,58 +0,0 @@ -certificates = array(); - $this->validators = array(); - - if ($xml === NULL) { - return; - } - - /* Validate the signature element of the message. */ - try { - $sig = SAML2_Utils::validateElement($xml); - - if ($sig !== FALSE) { - $this->certificates = $sig['Certificates']; - $this->validators[] = array( - 'Function' => array('SAML2_Utils', 'validateSignature'), - 'Data' => $sig, - ); - } - - } catch (Exception $e) { - /* Ignore signature validation errors. */ - } - } - - - /** - * Add a method for validating this element. - * - * This function is used for custom validation extensions - * - * @param callback $function The function which should be called. - * @param mixed $data The data that should be included as the first parameter to the function. - */ - public function addValidator($function, $data) { - assert('is_callable($function)'); - - $this->validators[] = array( - 'Function' => $function, - 'Data' => $data, - ); - } - - - /** - * Validate this element against a public key. - * - * TRUE is returned on success, FALSE is returned if we don't have any - * signature we can validate. An exception is thrown if the signature - * validation fails. - * - * @param XMLSecurityKey $key The key we should check against. - * @return boolean TRUE on success, FALSE when we don't have a signature. - */ - public function validate(XMLSecurityKey $key) { - - if (count($this->validators) === 0) { - return FALSE; - } - - $exceptions = array(); - - foreach ($this->validators as $validator) { - $function = $validator['Function']; - $data = $validator['Data']; - - try { - call_user_func($function, $data, $key); - /* We were able to validate the message with this validator. */ - return TRUE; - } catch (Exception $e) { - $exceptions[] = $e; - } - } - - /* No validators were able to validate the message. */ - throw $exceptions[0]; - } - - - /** - * Retrieve the private key we should use to sign the message. - * - * @return XMLSecurityKey|NULL The key, or NULL if no key is specified. - */ - public function getSignatureKey() { - return $this->signatureKey; - } - - - /** - * Set the private key we should use to sign the message. - * - * If the key is NULL, the message will be sent unsigned. - * - * @param XMLSecurityKey|NULL $key - */ - public function setSignatureKey(XMLsecurityKey $signatureKey = NULL) { - $this->signatureKey = $signatureKey; - } - - - /** - * Set the certificates that should be included in the message. - * - * The certificates should be strings with the PEM encoded data. - * - * @param array $certificates An array of certificates. - */ - public function setCertificates(array $certificates) { - $this->certificates = $certificates; - } - - - /** - * Retrieve the certificates that are included in the message. - * - * @return array An array of certificates. - */ - public function getCertificates() { - return $this->certificates; - } - - - /** - * Retrieve certificates that sign this element. - * - * @return array Array with certificates. - */ - public function getValidatingCertificates() { - - $ret = array(); - foreach ($this->certificates as $cert) { - - /* We have found a matching fingerprint. */ - $pemCert = "-----BEGIN CERTIFICATE-----\n" . - chunk_split($cert, 64) . - "-----END CERTIFICATE-----\n"; - - /* Extract the public key from the certificate for validation. */ - $key = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'public')); - $key->loadKey($pemCert); - - try { - /* Check the signature. */ - if ($this->validate($key)) { - $ret[] = $cert; - } - } catch (Exception $e) { - /* This certificate does not sign this element. */ - } - } - - return $ret; - } - - - /** - * Sign the given XML element. - * - * @param DOMElement $root The element we should sign. - * @param DOMElement|NULL $insertBefore The element we should insert the signature node before. - */ - protected function signElement(DOMElement $root, DOMElement $insertBefore = NULL) { - - if ($this->signatureKey === NULL) { - /* We cannot sign this element. */ - return; - } - - SAML2_Utils::insertSignature($this->signatureKey, $this->certificates, $root, $insertBefore); - - return $root; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/StatusResponse.php b/inc/simplesamlphp/lib/SAML2/StatusResponse.php deleted file mode 100644 index bc264fb..0000000 --- a/inc/simplesamlphp/lib/SAML2/StatusResponse.php +++ /dev/null @@ -1,193 +0,0 @@ - '', - * 'SubCode' => '', - * 'Message' => '', - * ) - * - * Only the 'Code' field is required. The others will be set to NULL if they - * aren't present. - * - * @package simpleSAMLphp - * @version $Id$ - */ -abstract class SAML2_StatusResponse extends SAML2_Message { - - /** - * The ID of the request this is a response to, or NULL if this is an unsolicited response. - * - * @var string|NULL - */ - private $inResponseTo; - - - /** - * The status code of the response. - * - * @var array - */ - private $status; - - - /** - * Constructor for SAML 2 response messages. - * - * @param string $tagName The tag name of the root element. - * @param DOMElement|NULL $xml The input message. - */ - protected function __construct($tagName, DOMElement $xml = NULL) { - parent::__construct($tagName, $xml); - - $this->status = array( - 'Code' => SAML2_Const::STATUS_SUCCESS, - 'SubCode' => NULL, - 'Message' => NULL, - ); - - if ($xml === NULL) { - return; - } - - if ($xml->hasAttribute('InResponseTo')) { - $this->inResponseTo = $xml->getAttribute('InResponseTo'); - } - - $status = SAML2_Utils::xpQuery($xml, './saml_protocol:Status'); - if (empty($status)) { - throw new Exception('Missing status code on response.'); - } - $status = $status[0]; - - $statusCode = SAML2_Utils::xpQuery($status, './saml_protocol:StatusCode'); - if (empty($statusCode)) { - throw new Exception('Missing status code in status element.'); - } - $statusCode = $statusCode[0]; - - $this->status['Code'] = $statusCode->getAttribute('Value'); - - $subCode = SAML2_Utils::xpQuery($statusCode, './saml_protocol:StatusCode'); - if (!empty($subCode)) { - $this->status['SubCode'] = $subCode[0]->getAttribute('Value'); - } - - $message = SAML2_Utils::xpQuery($status, './saml_protocol:StatusMessage'); - if (!empty($message)) { - $this->status['Message'] = trim($message[0]->textContent); - } - } - - - /** - * Determine whether this is a successful response. - * - * @return boolean TRUE if the status code is success, FALSE if not. - */ - public function isSuccess() { - assert('array_key_exists("Code", $this->status)'); - - if ($this->status['Code'] === SAML2_Const::STATUS_SUCCESS) { - return TRUE; - } - - return FALSE; - } - - - /** - * Retrieve the ID of the request this is a response to. - * - * @return string|NULL The ID of the request. - */ - public function getInResponseTo() { - return $this->inResponseTo; - } - - - /** - * Set the ID of the request this is a response to. - * - * @param string|NULL $inResponseTo The ID of the request. - */ - public function setInResponseTo($inResponseTo) { - assert('is_string($inResponseTo) || is_null($inResponseTo)'); - - $this->inResponseTo = $inResponseTo; - } - - - /** - * Retrieve the status code. - * - * @return array The status code. - */ - public function getStatus() { - return $this->status; - } - - - /** - * Set the status code. - * - * @param array $status The status code. - */ - public function setStatus(array $status) { - assert('array_key_exists("Code", $status)'); - - $this->status = $status; - if (!array_key_exists('SubCode', $status)) { - $this->status['SubCode'] = NULL; - } - if (!array_key_exists('Message', $status)) { - $this->status['Message'] = NULL; - } - } - - - /** - * Convert status response message to an XML element. - * - * @return DOMElement This status response. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - if ($this->inResponseTo !== NULL) { - $root->setAttribute('InResponseTo', $this->inResponseTo); - } - - $status = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'Status'); - $root->appendChild($status); - - $statusCode = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'StatusCode'); - $statusCode->setAttribute('Value', $this->status['Code']); - $status->appendChild($statusCode); - - if (!is_null($this->status['SubCode'])) { - $subStatusCode = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'StatusCode'); - $subStatusCode->setAttribute('Value', $this->status['SubCode']); - $statusCode->appendChild($subStatusCode); - } - - if (!is_null($this->status['Message'])) { - SAML2_Utils::addString($status, SAML2_Const::NS_SAMLP, 'StatusMessage', $this->status['Message']); - } - - return $root; - } - - -} - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/SubjectQuery.php b/inc/simplesamlphp/lib/SAML2/SubjectQuery.php deleted file mode 100644 index 6591f7f..0000000 --- a/inc/simplesamlphp/lib/SAML2/SubjectQuery.php +++ /dev/null @@ -1,116 +0,0 @@ -parseSubject($xml); - } - - - /** - * Parse subject in query. - * - * @param DOMElement $xml The SubjectQuery XML element. - */ - private function parseSubject(DOMElement $xml) { - - $subject = SAML2_Utils::xpQuery($xml, './saml_assertion:Subject'); - if (empty($subject)) { - /* No Subject node. */ - throw new Exception('Missing subject in subject query.'); - } elseif (count($subject) > 1) { - throw new Exception('More than one in .'); - } - $subject = $subject[0]; - - $nameId = SAML2_Utils::xpQuery($subject, './saml_assertion:NameID'); - if (empty($nameId)) { - throw new Exception('Missing in .'); - } elseif (count($nameId) > 1) { - throw new Exception('More than one in .'); - } - $nameId = $nameId[0]; - $this->nameId = SAML2_Utils::parseNameId($nameId); - } - - - /** - * Retrieve the NameId of the subject in the query. - * - * The returned NameId is in the format used by SAML2_Utils::addNameId(). - * - * @see SAML2_Utils::addNameId() - * @return array|NULL The name identifier of the assertion. - */ - public function getNameId() { - return $this->nameId; - } - - - /** - * Set the NameId of the subject in the query. - * - * The NameId must be in the format accepted by SAML2_Utils::addNameId(). - * - * @see SAML2_Utils::addNameId() - * @param array|NULL $nameId The name identifier of the assertion. - */ - public function setNameId($nameId) { - assert('is_array($nameId) || is_null($nameId)'); - - $this->nameId = $nameId; - } - - - /** - * Convert subject query message to an XML element. - * - * @return DOMElement This subject query. - */ - public function toUnsignedXML() { - - $root = parent::toUnsignedXML(); - - $subject = $root->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:Subject'); - $root->appendChild($subject); - - SAML2_Utils::addNameId($subject, $this->nameId); - - return $root; - } - -} \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SAML2/Utils.php b/inc/simplesamlphp/lib/SAML2/Utils.php deleted file mode 100644 index 00e5a33..0000000 --- a/inc/simplesamlphp/lib/SAML2/Utils.php +++ /dev/null @@ -1,620 +0,0 @@ -idKeys[] = 'ID'; - - /* Locate the XMLDSig Signature element to be used. */ - $signatureElement = self::xpQuery($root, './ds:Signature'); - if (count($signatureElement) === 0) { - /* We don't have a signature element ot validate. */ - return FALSE; - } elseif (count($signatureElement) > 1) { - throw new Exception('XMLSec: more than one signature element in root.'); - } - $signatureElement = $signatureElement[0]; - $objXMLSecDSig->sigNode = $signatureElement; - - /* Canonicalize the XMLDSig SignedInfo element in the message. */ - $objXMLSecDSig->canonicalizeSignedInfo(); - - /* Validate referenced xml nodes. */ - if (!$objXMLSecDSig->validateReference()) { - throw new Exception('XMLsec: digest validation failed'); - } - - /* Check that $root is one of the signed nodes. */ - $rootSigned = FALSE; - foreach ($objXMLSecDSig->getValidatedNodes() as $signedNode) { - if ($signedNode->isSameNode($root)) { - $rootSigned = TRUE; - break; - } elseif ($root->parentNode instanceof DOMDocument && $signedNode->isSameNode($root->ownerDocument)) { - /* $root is the root element of a signed document. */ - $rootSigned = TRUE; - break; - } - } - if (!$rootSigned) { - throw new Exception('XMLSec: The root element is not signed.'); - } - - /* Now we extract all available X509 certificates in the signature element. */ - $certificates = array(); - foreach (self::xpQuery($signatureElement, './ds:KeyInfo/ds:X509Data/ds:X509Certificate') as $certNode) { - $certData = trim($certNode->textContent); - $certData = str_replace(array("\r", "\n", "\t", ' '), '', $certData); - $certificates[] = $certData; - } - - $ret = array( - 'Signature' => $objXMLSecDSig, - 'Certificates' => $certificates, - ); - - return $ret; - } - - - /** - * Helper function to convert a XMLSecurityKey to the correct algorithm. - * - * @param XMLSecurityKey $key The key. - * @param string $algorithm The desired algorithm. - * @return XMLSecurityKey The new key. - */ - private static function castKey(XMLSecurityKey $key, $algorithm) { - assert('is_string($algorithm)'); - - $keyInfo = openssl_pkey_get_details($key->key); - if ($keyInfo === FALSE) { - throw new Exception('Unable to get key details from XMLSecurityKey.'); - } - if (!isset($keyInfo['key'])) { - throw new Exception('Missing key in public key details.'); - } - - $newKey = new XMLSecurityKey($algorithm, array('type'=>'public')); - $newKey->loadKey($keyInfo['key']); - return $newKey; - } - - - /** - * Check a signature against a key. - * - * An exception is thrown if we are unable to validate the signature. - * - * @param array $info The information returned by the validateElement()-function. - * @param XMLSecurityKey $key The publickey that should validate the Signature object. - */ - public static function validateSignature(array $info, XMLSecurityKey $key) { - assert('array_key_exists("Signature", $info)'); - - $objXMLSecDSig = $info['Signature']; - - $sigMethod = self::xpQuery($objXMLSecDSig->sigNode, './ds:SignedInfo/ds:SignatureMethod'); - if (empty($sigMethod)) { - throw new Exception('Missing SignatureMethod element.'); - } - $sigMethod = $sigMethod[0]; - if (!$sigMethod->hasAttribute('Algorithm')) { - throw new Exception('Missing Algorithm-attribute on SignatureMethod element.'); - } - $algo = $sigMethod->getAttribute('Algorithm'); - - if ($key->type === XMLSecurityKey::RSA_SHA1 && $algo === XMLSecurityKey::RSA_SHA256) { - $key = self::castKey($key, XMLSecurityKey::RSA_SHA256); - } - - /* Check the signature. */ - if (! $objXMLSecDSig->verify($key)) { - throw new Exception("Unable to validate Signature"); - } - } - - - /** - * Do an XPath query on an XML node. - * - * @param DOMNode $node The XML node. - * @param string $query The query. - * @return array Array with matching DOM nodes. - */ - public static function xpQuery(DOMNode $node, $query) { - assert('is_string($query)'); - static $xpCache = NULL; - - if ($node instanceof DOMDocument) { - $doc = $node; - } else { - $doc = $node->ownerDocument; - } - - if ($xpCache === NULL || !$xpCache->document->isSameNode($doc)) { - $xpCache = new DOMXPath($doc); - $xpCache->registerNamespace('soap-env', SAML2_Const::NS_SOAP); - $xpCache->registerNamespace('saml_protocol', SAML2_Const::NS_SAMLP); - $xpCache->registerNamespace('saml_assertion', SAML2_Const::NS_SAML); - $xpCache->registerNamespace('saml_metadata', SAML2_Const::NS_MD); - $xpCache->registerNamespace('ds', XMLSecurityDSig::XMLDSIGNS); - $xpCache->registerNamespace('xenc', XMLSecEnc::XMLENCNS); - } - - $results = $xpCache->query($query, $node); - $ret = array(); - for ($i = 0; $i < $results->length; $i++) { - $ret[$i] = $results->item($i); - } - - return $ret; - } - - - /** - * Make an exact copy the specific DOMElement. - * - * @param DOMElement $element The element we should copy. - * @param DOMElement|NULL $parent The target parent element. - * @return DOMElement The copied element. - */ - public static function copyElement(DOMElement $element, DOMElement $parent = NULL) { - - if ($parent === NULL) { - $document = new DOMDocument(); - } else { - $document = $parent->ownerDocument; - } - - $namespaces = array(); - for ($e = $element; $e !== NULL; $e = $e->parentNode) { - foreach (SAML2_Utils::xpQuery($e, './namespace::*') as $ns) { - $prefix = $ns->localName; - if ($prefix === 'xml' || $prefix === 'xmlns') { - continue; - } - $uri = $ns->nodeValue; - if (!isset($namespaces[$prefix])) { - $namespaces[$prefix] = $uri; - } - } - } - - $newElement = $document->importNode($element, TRUE); - if ($parent !== NULL) { - /* We need to append the child to the parent before we add the namespaces. */ - $parent->appendChild($newElement); - } - - foreach ($namespaces as $prefix => $uri) { - $newElement->setAttributeNS($uri, $prefix . ':__ns_workaround__', 'tmp'); - $newElement->removeAttributeNS($uri, '__ns_workaround__'); - } - - return $newElement; - } - - - /** - * Parse a boolean attribute. - * - * @param DOMElement $node The element we should fetch the attribute from. - * @param string $attributeName The name of the attribute. - * @param mixed $default The value that should be returned if the attribute doesn't exist. - * @return bool|mixed The value of the attribute, or $default if the attribute doesn't exist. - */ - public static function parseBoolean(DOMElement $node, $attributeName, $default = NULL) { - assert('is_string($attributeName)'); - - if (!$node->hasAttribute($attributeName)) { - return $default; - } - $value = $node->getAttribute($attributeName); - switch (strtolower($value)) { - case '0': - case 'false': - return FALSE; - case '1': - case 'true': - return TRUE; - default: - throw new Exception('Invalid value of boolean attribute ' . var_export($attributeName, TRUE) . ': ' . var_export($value, TRUE)); - } - } - - - /** - * Create a NameID element. - * - * The NameId array can have the following elements: 'Value', 'Format', - * 'NameQualifier, 'SPNameQualifier' - * - * Only the 'Value'-element is required. - * - * @param DOMElement $node The DOM node we should append the NameId to. - * @param array $nameId The name identifier. - */ - public static function addNameId(DOMElement $node, array $nameId) { - assert('array_key_exists("Value", $nameId)'); - - $xml = SAML2_Utils::addString($node, SAML2_Const::NS_SAML, 'saml:NameID', $nameId['Value']); - - if (array_key_exists('NameQualifier', $nameId) && $nameId['NameQualifier'] !== NULL) { - $xml->setAttribute('NameQualifier', $nameId['NameQualifier']); - } - if (array_key_exists('SPNameQualifier', $nameId) && $nameId['SPNameQualifier'] !== NULL) { - $xml->setAttribute('SPNameQualifier', $nameId['SPNameQualifier']); - } - if (array_key_exists('Format', $nameId) && $nameId['Format'] !== NULL) { - $xml->setAttribute('Format', $nameId['Format']); - } - } - - - /** - * Parse a NameID element. - * - * @param DOMElement $xml The DOM element we should parse. - * @return array The parsed name identifier. - */ - public static function parseNameId(DOMElement $xml) { - - $ret = array('Value' => trim($xml->textContent)); - - foreach (array('NameQualifier', 'SPNameQualifier', 'Format') as $attr) { - if ($xml->hasAttribute($attr)) { - $ret[$attr] = $xml->getAttribute($attr); - } - } - - return $ret; - } - - - /** - * Insert a Signature-node. - * - * @param XMLSecurityKey $key The key we should use to sign the message. - * @param array $certificates The certificates we should add to the signature node. - * @param DOMElement $root The XML node we should sign. - * @param DomElement $insertBefore The XML element we should insert the signature element before. - */ - public static function insertSignature(XMLSecurityKey $key, array $certificates, DOMElement $root, DOMNode $insertBefore = NULL) { - - $objXMLSecDSig = new XMLSecurityDSig(); - $objXMLSecDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N); - - $objXMLSecDSig->addReferenceList( - array($root), - XMLSecurityDSig::SHA1, - array('http://www.w3.org/2000/09/xmldsig#enveloped-signature', XMLSecurityDSig::EXC_C14N), - array('id_name' => 'ID', 'overwrite' => FALSE) - ); - - $objXMLSecDSig->sign($key); - - foreach ($certificates as $certificate) { - $objXMLSecDSig->add509Cert($certificate, TRUE); - } - - $objXMLSecDSig->insertSignature($root, $insertBefore); - - } - - - /** - * Decrypt an encrypted element. - * - * This is an internal helper function. - * - * @param DOMElement $encryptedData The encrypted data. - * @param XMLSecurityKey $inputKey The decryption key. - * @param array &$blacklist Blacklisted decryption algorithms. - * @return DOMElement The decrypted element. - */ - private static function _decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey, array &$blacklist) { - - $enc = new XMLSecEnc(); - - $enc->setNode($encryptedData); - $enc->type = $encryptedData->getAttribute("Type"); - - $symmetricKey = $enc->locateKey($encryptedData); - if (!$symmetricKey) { - throw new Exception('Could not locate key algorithm in encrypted data.'); - } - - $symmetricKeyInfo = $enc->locateKeyInfo($symmetricKey); - if (!$symmetricKeyInfo) { - throw new Exception('Could not locate for the encrypted key.'); - } - - $inputKeyAlgo = $inputKey->getAlgorith(); - if ($symmetricKeyInfo->isEncrypted) { - $symKeyInfoAlgo = $symmetricKeyInfo->getAlgorith(); - - if (in_array($symKeyInfoAlgo, $blacklist, TRUE)) { - throw new Exception('Algorithm disabled: ' . var_export($symKeyInfoAlgo, TRUE)); - } - - if ($symKeyInfoAlgo === XMLSecurityKey::RSA_OAEP_MGF1P && $inputKeyAlgo === XMLSecurityKey::RSA_1_5) { - /* - * The RSA key formats are equal, so loading an RSA_1_5 key - * into an RSA_OAEP_MGF1P key can be done without problems. - * We therefore pretend that the input key is an - * RSA_OAEP_MGF1P key. - */ - $inputKeyAlgo = XMLSecurityKey::RSA_OAEP_MGF1P; - } - - /* Make sure that the input key format is the same as the one used to encrypt the key. */ - if ($inputKeyAlgo !== $symKeyInfoAlgo) { - throw new Exception('Algorithm mismatch between input key and key used to encrypt ' . - ' the symmetric key for the message. Key was: ' . - var_export($inputKeyAlgo, TRUE) . '; message was: ' . - var_export($symKeyInfoAlgo, TRUE)); - } - - $encKey = $symmetricKeyInfo->encryptedCtx; - $symmetricKeyInfo->key = $inputKey->key; - - $keySize = $symmetricKey->getSymmetricKeySize(); - if ($keySize === NULL) { - /* To protect against "key oracle" attacks, we need to be able to create a - * symmetric key, and for that we need to know the key size. - */ - throw new Exception('Unknown key size for encryption algorithm: ' . var_export($symmetricKey->type, TRUE)); - } - - try { - $key = $encKey->decryptKey($symmetricKeyInfo); - if (strlen($key) != $keySize) { - throw new Exception('Unexpected key size (' . strlen($key) * 8 . 'bits) for encryption algorithm: ' . - var_export($symmetricKey->type, TRUE)); - } - } catch (Exception $e) { - /* We failed to decrypt this key. Log it, and substitute a "random" key. */ - SimpleSAML_Logger::error('Failed to decrypt symmetric key: ' . $e->getMessage()); - /* Create a replacement key, so that it looks like we fail in the same way as if the key was correctly padded. */ - - /* We base the symmetric key on the encrypted key and private key, so that we always behave the - * same way for a given input key. - */ - $encryptedKey = $encKey->getCipherValue(); - $pkey = openssl_pkey_get_details($symmetricKeyInfo->key); - $pkey = sha1(serialize($pkey), TRUE); - $key = sha1($encryptedKey . $pkey, TRUE); - - /* Make sure that the key has the correct length. */ - if (strlen($key) > $keySize) { - $key = substr($key, 0, $keySize); - } elseif (strlen($key) < $keySize) { - $key = str_pad($key, $keySize); - } - } - $symmetricKey->loadkey($key); - - } else { - $symKeyAlgo = $symmetricKey->getAlgorith(); - /* Make sure that the input key has the correct format. */ - if ($inputKeyAlgo !== $symKeyAlgo) { - throw new Exception('Algorithm mismatch between input key and key in message. ' . - 'Key was: ' . var_export($inputKeyAlgo, TRUE) . '; message was: ' . - var_export($symKeyAlgo, TRUE)); - } - $symmetricKey = $inputKey; - } - - $algorithm = $symmetricKey->getAlgorith(); - if (in_array($algorithm, $blacklist, TRUE)) { - throw new Exception('Algorithm disabled: ' . var_export($algorithm, TRUE)); - } - - $decrypted = $enc->decryptNode($symmetricKey, FALSE); - - /* - * This is a workaround for the case where only a subset of the XML - * tree was serialized for encryption. In that case, we may miss the - * namespaces needed to parse the XML. - */ - $xml = ''.$decrypted.''; - $newDoc = new DOMDocument(); - if (!@$newDoc->loadXML($xml)) { - throw new Exception('Failed to parse decrypted XML. Maybe the wrong sharedkey was used?'); - } - $decryptedElement = $newDoc->firstChild->firstChild; - if ($decryptedElement === NULL) { - throw new Exception('Missing encrypted element.'); - } - - if (!($decryptedElement instanceof DOMElement)) { - throw new Exception('Decrypted element was not actually a DOMElement.'); - } - - return $decryptedElement; - } - - - /** - * Decrypt an encrypted element. - * - * @param DOMElement $encryptedData The encrypted data. - * @param XMLSecurityKey $inputKey The decryption key. - * @param array $blacklist Blacklisted decryption algorithms. - * @return DOMElement The decrypted element. - */ - public static function decryptElement(DOMElement $encryptedData, XMLSecurityKey $inputKey, array $blacklist = array()) { - - try { - return self::_decryptElement($encryptedData, $inputKey, $blacklist); - } catch (Exception $e) { - /* - * Something went wrong during decryption, but for security - * reasons we cannot tell the user what failed. - */ - SimpleSAML_Logger::error('Decryption failed: ' . $e->getMessage()); - throw new Exception('Failed to decrypt XML element.'); - } - } - - - /** - * Extract localized strings from a set of nodes. - * - * @param DOMElement $parent The element that contains the localized strings. - * @param string $namespaceURI The namespace URI the localized strings should have. - * @param string $localName The localName of the localized strings. - * @return array Localized strings. - */ - public static function extractLocalizedStrings(DOMElement $parent, $namespaceURI, $localName) { - assert('is_string($namespaceURI)'); - assert('is_string($localName)'); - - $ret = array(); - for ($node = $parent->firstChild; $node !== NULL; $node = $node->nextSibling) { - if ($node->namespaceURI !== $namespaceURI || $node->localName !== $localName) { - continue; - } - - if ($node->hasAttribute('xml:lang')) { - $language = $node->getAttribute('xml:lang'); - } else { - $language = 'en'; - } - $ret[$language] = trim($node->textContent); - } - - return $ret; - } - - - /** - * Extract strings from a set of nodes. - * - * @param DOMElement $parent The element that contains the localized strings. - * @param string $namespaceURI The namespace URI the string elements should have. - * @param string $localName The localName of the string elements. - * @return array The string values of the various nodes. - */ - public static function extractStrings(DOMElement $parent, $namespaceURI, $localName) { - assert('is_string($namespaceURI)'); - assert('is_string($localName)'); - - $ret = array(); - for ($node = $parent->firstChild; $node !== NULL; $node = $node->nextSibling) { - if ($node->namespaceURI !== $namespaceURI || $node->localName !== $localName) { - continue; - } - $ret[] = trim($node->textContent); - } - - return $ret; - } - - - /** - * Append string element. - * - * @param DOMElement $parent The parent element we should append the new nodes to. - * @param string $namespace The namespace of the created element. - * @param string $name The name of the created element. - * @param string $value The value of the element. - * @return DOMElement The generated element. - */ - public static function addString(DOMElement $parent, $namespace, $name, $value) { - assert('is_string($namespace)'); - assert('is_string($name)'); - assert('is_string($value)'); - - $doc = $parent->ownerDocument; - - $n = $doc->createElementNS($namespace, $name); - $n->appendChild($doc->createTextNode($value)); - $parent->appendChild($n); - - return $n; - } - - - /** - * Append string elements. - * - * @param DOMElement $parent The parent element we should append the new nodes to. - * @param string $namespace The namespace of the created elements - * @param string $name The name of the created elements - * @param bool $localized Whether the strings are localized, and should include the xml:lang attribute. - * @param array $values The values we should create the elements from. - */ - public static function addStrings(DOMElement $parent, $namespace, $name, $localized, array $values) { - assert('is_string($namespace)'); - assert('is_string($name)'); - assert('is_bool($localized)'); - - $doc = $parent->ownerDocument; - - foreach ($values as $index => $value) { - $n = $doc->createElementNS($namespace, $name); - $n->appendChild($doc->createTextNode($value)); - if ($localized) { - $n->setAttribute('xml:lang', $index); - } - $parent->appendChild($n); - } - } - - - /** - * Create a KeyDescriptor with the given certificate. - * - * @param string $x509Data The certificate, as a base64-encoded DER data. - * @return SAML2_XML_md_KeyDescriptor The keydescriptor. - */ - public static function createKeyDescriptor($x509Data) { - assert('is_string($x509Data)'); - - $x509Certificate = new SAML2_XML_ds_X509Certificate(); - $x509Certificate->certificate = $x509Data; - - $x509Data = new SAML2_XML_ds_X509Data(); - $x509Data->data[] = $x509Certificate; - - $keyInfo = new SAML2_XML_ds_KeyInfo(); - $keyInfo->info[] = $x509Data; - - $keyDescriptor = new SAML2_XML_md_KeyDescriptor(); - $keyDescriptor->KeyInfo = $keyInfo; - - return $keyDescriptor; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/Chunk.php b/inc/simplesamlphp/lib/SAML2/XML/Chunk.php deleted file mode 100644 index 9f614d3..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/Chunk.php +++ /dev/null @@ -1,104 +0,0 @@ -localName = $xml->localName; - $this->namespaceURI = $xml->namespaceURI; - - $this->xml = SAML2_Utils::copyElement($xml); - } - - - /** - * Get this DOMElement. - * - * @return DOMElement This element. - */ - public function getXML() { - assert('$this->xml instanceof DOMElement || is_string($this->xmlString)'); - - if ($this->xml === NULL) { - $doc = new DOMDocument(); - $doc->loadXML($this->xmlString); - $this->xml = $doc->firstChild; - } - - return $this->xml; - } - - - /** - * Append this XML element to a different XML element. - * - * @param DOMElement $parent The element we should append this element to. - * @return DOMElement The new element. - */ - public function toXML(DOMElement $parent) { - - return SAML2_Utils::copyElement($this->getXML(), $parent); - } - - - /** - * Serialization handler. - * - * Converts the XML data to a string that can be serialized - * - * @return array List of properties that should be serialized. - */ - public function __sleep() { - assert('$this->xml instanceof DOMElement || is_string($this->xmlString)'); - - if ($this->xmlString === NULL) { - $this->xmlString = $this->xml->ownerDocument->saveXML($this->xml); - } - - return array('xmlString', 'localName', 'namespaceURI'); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/ds/KeyInfo.php b/inc/simplesamlphp/lib/SAML2/XML/ds/KeyInfo.php deleted file mode 100644 index 44b4b0d..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/ds/KeyInfo.php +++ /dev/null @@ -1,94 +0,0 @@ -hasAttribute('Id')) { - $this->Id = $xml->getAttribute('Id'); - } - - for ($n = $xml->firstChild; $n !== NULL; $n = $n->nextSibling) { - if (!($n instanceof DOMElement)) { - continue; - } - - if ($n->namespaceURI !== XMLSecurityDSig::XMLDSIGNS) { - $this->info[] = new SAML2_XML_Chunk($n); - continue; - } - switch ($n->localName) { - case 'KeyName': - $this->info[] = new SAML2_XML_ds_KeyName($n); - break; - case 'X509Data': - $this->info[] = new SAML2_XML_ds_X509Data($n); - break; - default: - $this->info[] = new SAML2_XML_Chunk($n); - break; - } - } - } - - - /** - * Convert this KeyInfo to XML. - * - * @param DOMElement $parent The element we should append this KeyInfo to. - */ - public function toXML(DOMElement $parent) { - assert('is_null($this->Id) || is_string($this->Id)'); - assert('is_array($this->info)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:KeyInfo'); - $parent->appendChild($e); - - if (isset($this->Id)) { - $e->setAttribute('Id', $this->Id); - } - - foreach ($this->info as $n) { - $n->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/ds/KeyName.php b/inc/simplesamlphp/lib/SAML2/XML/ds/KeyName.php deleted file mode 100644 index 6eae3a4..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/ds/KeyName.php +++ /dev/null @@ -1,45 +0,0 @@ -name = $xml->textContent; - } - - - /** - * Convert this KeyName element to XML. - * - * @param DOMElement $parent The element we should append this KeyName element to. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->name)'); - - return SAML2_Utils::addString($parent, XMLSecurityDSig::XMLDSIGNS, 'ds:KeyName', $this->name); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/ds/X509Certificate.php b/inc/simplesamlphp/lib/SAML2/XML/ds/X509Certificate.php deleted file mode 100644 index c4dcac1..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/ds/X509Certificate.php +++ /dev/null @@ -1,45 +0,0 @@ -certificate = $xml->textContent; - } - - - /** - * Convert this X509Certificate element to XML. - * - * @param DOMElement $parent The element we should append this X509Certificate element to. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->certificate)'); - - return SAML2_Utils::addString($parent, XMLSecurityDSig::XMLDSIGNS, 'ds:X509Certificate', $this->certificate); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/ds/X509Data.php b/inc/simplesamlphp/lib/SAML2/XML/ds/X509Data.php deleted file mode 100644 index e6b3c06..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/ds/X509Data.php +++ /dev/null @@ -1,74 +0,0 @@ -firstChild; $n !== NULL; $n = $n->nextSibling) { - if (!($n instanceof DOMElement)) { - continue; - } - - if ($n->namespaceURI !== XMLSecurityDSig::XMLDSIGNS) { - $this->data[] = new SAML2_XML_Chunk($n); - continue; - } - switch ($n->localName) { - case 'X509Certificate': - $this->data[] = new SAML2_XML_ds_X509Certificate($n); - break; - default: - $this->data[] = new SAML2_XML_Chunk($n); - break; - } - } - } - - - /** - * Convert this X509Data element to XML. - * - * @param DOMElement $parent The element we should append this X509Data element to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->data)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS, 'ds:X509Data'); - $parent->appendChild($e); - - foreach ($this->data as $n) { - $n->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/AdditionalMetadataLocation.php b/inc/simplesamlphp/lib/SAML2/XML/md/AdditionalMetadataLocation.php deleted file mode 100644 index 3bdb6ba..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/AdditionalMetadataLocation.php +++ /dev/null @@ -1,62 +0,0 @@ -hasAttribute('namespace')) { - throw new Exception('Missing namespace attribute on AdditionalMetadataLocation element.'); - } - $this->namespace = $xml->getAttribute('namespace'); - - $this->location = $xml->textContent; - } - - - /** - * Convert this AdditionalMetadataLocation to XML. - * - * @param DOMElement $parent The element we should append to. - * @return DOMElement This AdditionalMetadataLocation-element. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->namespace)'); - assert('is_string($this->location)'); - - $e = SAML2_Utils::addString($parent, SAML2_Const::NS_MD, 'md:AdditionalMetadataLocation', $this->location); - $e->setAttribute('namespace', $this->namespace); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/AffiliationDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/AffiliationDescriptor.php deleted file mode 100644 index 927ad1f..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/AffiliationDescriptor.php +++ /dev/null @@ -1,162 +0,0 @@ -hasAttribute('affiliationOwnerID')) { - throw new Exception('Missing affiliationOwnerID on AffiliationDescriptor.'); - } - $this->affiliationOwnerID = $xml->getAttribute('affiliationOwnerID'); - - if ($xml->hasAttribute('ID')) { - $this->ID = $xml->getAttribute('ID'); - } - - if ($xml->hasAttribute('validUntil')) { - $this->validUntil = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('validUntil')); - } - - if ($xml->hasAttribute('cacheDuration')) { - $this->cacheDuration = $xml->getAttribute('cacheDuration'); - } - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - $this->AffiliateMember = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AffiliateMember'); - if (empty($this->AffiliateMember)) { - throw new Exception('Missing AffiliateMember in AffiliationDescriptor.'); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:KeyDescriptor') as $kd) { - $this->KeyDescriptor[] = new SAML2_XML_md_KeyDescriptor($kd); - } - } - - - /** - * Add this AffiliationDescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this endpoint to. - * @param string $name The name of the element we should create. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->affiliationOwnerID)'); - assert('is_null($this->ID) || is_string($this->ID)'); - assert('is_null($this->validUntil) || is_int($this->validUntil)'); - assert('is_null($this->cacheDuration) || is_string($this->cacheDuration)'); - assert('is_array($this->Extensions)'); - assert('is_array($this->AffiliateMember)'); - assert('!empty($this->AffiliateMember)'); - assert('is_array($this->KeyDescriptor)'); - - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, 'md:AffiliationDescriptor'); - $parent->appendChild($e); - - $e->setAttribute('affiliationOwnerID', $this->affiliationOwnerID); - - if (isset($this->ID)) { - $e->setAttribute('ID', $this->ID); - } - - if (isset($this->validUntil)) { - $e->setAttribute('validUntil', gmdate('Y-m-d\TH:i:s\Z', $this->validUntil)); - } - - if (isset($this->cacheDuration)) { - $e->setAttribute('cacheDuration', $this->cacheDuration); - } - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:AffiliateMember', FALSE, $this->AffiliateMember); - - foreach ($this->KeyDescriptor as $kd) { - $kd->toXML($e); - } - - $this->signElement($e, $e->firstChild); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php deleted file mode 100644 index 8babb28..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/AttributeAuthorityDescriptor.php +++ /dev/null @@ -1,128 +0,0 @@ -AttributeService[] = new SAML2_XML_md_EndpointType($ep); - } - if (empty($this->AttributeService)) { - throw new Exception('Must have at least one AttributeService in AttributeAuthorityDescriptor.'); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AssertionIDRequestService') as $ep) { - $this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs); - } - - $this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat'); - - $this->AttributeProfile = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AttributeProfile'); - - foreach (SAML2_Utils::xpQuery($xml, './saml_assertion:Attribute') as $a) { - $this->Attribute[] = new SAML2_XML_saml_Attribute($a); - } - } - - - /** - * Add this AttributeAuthorityDescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this IDPSSODescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->AttributeService)'); - assert('!empty($this->AttributeService)'); - assert('is_array($this->AssertionIDRequestService)'); - assert('is_array($this->NameIDFormat)'); - assert('is_array($this->AttributeProfile)'); - assert('is_array($this->Attribute)'); - - $e = parent::toXML($parent); - - foreach ($this->AttributeService as $ep) { - $ep->toXML($e, 'md:AttributeService'); - } - - foreach ($this->AssertionIDRequestService as $ep) { - $ep->toXML($e, 'md:AssertionIDRequestService'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:NameIDFormat', FALSE, $this->NameIDFormat); - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:AttributeProfile', FALSE, $this->AttributeProfile); - - foreach ($this->Attribute as $a) { - $a->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/AttributeConsumingService.php b/inc/simplesamlphp/lib/SAML2/XML/md/AttributeConsumingService.php deleted file mode 100644 index 427fd28..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/AttributeConsumingService.php +++ /dev/null @@ -1,124 +0,0 @@ - translation. - * - * @var array - */ - public $ServiceName = array(); - - - /** - * The ServiceDescription of this AttributeConsumingService. - * - * This is an associative array with language => translation. - * - * @var array - */ - public $ServiceDescription = array(); - - - /** - * The RequestedAttribute elements. - * - * This is an array of SAML_RequestedAttributeType elements. - * - * @var array - */ - public $RequestedAttribute = array(); - - - /** - * Initialize / parse an AttributeConsumingService. - * - * @param DOMElement|NULL $xml The XML element we should load. - */ - public function __construct(DOMElement $xml = NULL) { - - if ($xml === NULL) { - return; - } - - - if (!$xml->hasAttribute('index')) { - throw new Exception('Missing index on AttributeConsumingService.'); - } - $this->index = (int)$xml->getAttribute('index'); - - $this->isDefault = SAML2_Utils::parseBoolean($xml, 'isDefault', NULL); - - $this->ServiceName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'ServiceName'); - if (empty($this->ServiceName)) { - throw new Exception('Missing ServiceName in AttributeConsumingService.'); - } - - $this->ServiceDescription = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'ServiceDescription'); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:RequestedAttribute') as $ra) { - $this->RequestedAttribute[] = new SAML2_XML_md_RequestedAttribute($ra); - } - } - - - /** - * Convert to DOMElement. - * - * @param DOMElement $parent The element we should append this AttributeConsumingService to. - */ - public function toXML(DOMElement $parent) { - assert('is_int($this->index)'); - assert('is_null($this->isDefault) || is_bool($this->isDefault)'); - assert('is_array($this->ServiceName)'); - assert('is_array($this->ServiceDescription)'); - assert('is_array($this->RequestedAttribute)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:AttributeConsumingService'); - $parent->appendChild($e); - - $e->setAttribute('index', (string)$this->index); - - if ($this->isDefault === TRUE) { - $e->setAttribute('isDefault', 'true'); - } elseif ($this->isDefault === FALSE) { - $e->setAttribute('isDefault', 'false'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:ServiceName', TRUE, $this->ServiceName); - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:ServiceDescription', TRUE, $this->ServiceDescription); - - foreach ($this->RequestedAttribute as $ra) { - $ra->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php deleted file mode 100644 index 8ab4c88..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/AuthnAuthorityDescriptor.php +++ /dev/null @@ -1,94 +0,0 @@ -AuthnQueryService[] = new SAML2_XML_md_EndpointType($ep); - } - if (empty($this->AuthnQueryService)) { - throw new Exception('Must have at least one AuthnQueryService in AuthnAuthorityDescriptor.'); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AssertionIDRequestService') as $ep) { - $this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs); - } - - $this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat'); - } - - - /** - * Add this IDPSSODescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this AuthnAuthorityDescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->AuthnQueryService)'); - assert('!empty($this->AuthnQueryService)'); - assert('is_array($this->AssertionIDRequestService)'); - assert('is_array($this->NameIDFormat)'); - - $e = parent::toXML($parent); - - foreach ($this->AuthnQueryService as $ep) { - $ep->toXML($e, 'md:AuthnQueryService'); - } - - foreach ($this->AssertionIDRequestService as $ep) { - $ep->toXML($e, 'md:AssertionIDRequestService'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:NameIDFormat', FALSE, $this->NameIDFormat); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/ContactPerson.php b/inc/simplesamlphp/lib/SAML2/XML/md/ContactPerson.php deleted file mode 100644 index ea347c3..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/ContactPerson.php +++ /dev/null @@ -1,182 +0,0 @@ -hasAttribute('contactType')) { - throw new Exception('Missing contactType on ContactPerson.'); - } - $this->contactType = $xml->getAttribute('contactType'); - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - - $this->Company = self::getStringElement($xml, 'Company'); - $this->GivenName = self::getStringElement($xml, 'GivenName'); - $this->SurName = self::getStringElement($xml, 'SurName'); - $this->EmailAddress = self::getStringElements($xml, 'EmailAddress'); - $this->TelephoneNumber = self::getStringElements($xml, 'TelephoneNumber'); - } - - - /** - * Retrieve the value of a child DOMElements as an array of strings. - * - * @param DOMElement $parent The parent element. - * @param string $name The name of the child elements. - * @return array The value of the child elements. - */ - private static function getStringElements(DOMElement $parent, $name) { - assert('is_string($name)'); - - $e = SAML2_Utils::xpQuery($parent, './saml_metadata:' . $name); - - $ret = array(); - foreach ($e as $i) { - $ret[] = $i->textContent; - } - - return $ret; - } - - - /** - * Retrieve the value of a child DOMElement as a string. - * - * @param DOMElement $parent The parent element. - * @param string $name The name of the child element. - * @return string|NULL The value of the child element. - */ - private static function getStringElement(DOMElement $parent, $name) { - assert('is_string($name)'); - - $e = self::getStringElements($parent, $name); - if (empty($e)) { - return NULL; - } - if (count($e) > 1) { - throw new Exception('More than one ' . $name . ' in ' . $parent->tagName); - } - - return $e[0]; - } - - - /** - * Convert this ContactPerson to XML. - * - * @param DOMElement $parent The element we should add this contact to. - * @return DOMElement The new ContactPerson-element. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->contactType)'); - assert('is_array($this->Extensions)'); - assert('is_null($this->Company) || is_string($this->Company)'); - assert('is_null($this->GivenName) || is_string($this->GivenName)'); - assert('is_null($this->SurName) || is_string($this->SurName)'); - assert('is_array($this->EmailAddress)'); - assert('is_array($this->TelephoneNumber)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:ContactPerson'); - $parent->appendChild($e); - - $e->setAttribute('contactType', $this->contactType); - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - if (isset($this->Company)) { - SAML2_Utils::addString($e, SAML2_Const::NS_MD, 'md:Company', $this->Company); - } - if (isset($this->GivenName)) { - SAML2_Utils::addString($e, SAML2_Const::NS_MD, 'md:GivenName', $this->GivenName); - } - if (isset($this->SurName)) { - SAML2_Utils::addString($e, SAML2_Const::NS_MD, 'md:SurName', $this->SurName); - } - if (!empty($this->EmailAddress)) { - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:EmailAddress', FALSE, $this->EmailAddress); - } - if (!empty($this->TelephoneNumber)) { - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:TelephoneNumber', FALSE, $this->TelephoneNumber); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/EndpointType.php b/inc/simplesamlphp/lib/SAML2/XML/md/EndpointType.php deleted file mode 100644 index e4317e6..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/EndpointType.php +++ /dev/null @@ -1,187 +0,0 @@ -hasAttribute('Binding')) { - throw new Exception('Missing Binding on ' . $xml->tagName); - } - $this->Binding = $xml->getAttribute('Binding'); - - if (!$xml->hasAttribute('Location')) { - throw new Exception('Missing Location on ' . $xml->tagName); - } - $this->Location = $xml->getAttribute('Location'); - - if ($xml->hasAttribute('ResponseLocation')) { - $this->ResponseLocation = $xml->getAttribute('ResponseLocation'); - } - - foreach ($xml->attributes as $a) { - if ($a->namespaceURI === NULL) { - continue; /* Not namespace-qualified -- skip. */ - } - $fullName = '{' . $a->namespaceURI . '}' . $a->localName; - $this->attributes[$fullName] = array( - 'qualifiedName' => $a->nodeName, - 'namespaceURI' => $a->namespaceURI, - 'value' => $a->value, - ); - } - } - - - /** - * Check if a namespace-qualified attribute exists. - * - * @param string $namespaceURI The namespace URI. - * @param string $localName The local name. - * @return boolean TRUE if the attribute exists, FALSE if not. - */ - public function hasAttributeNS($namespaceURI, $localName) { - assert('is_string($namespaceURI)'); - assert('is_string($localName)'); - - $fullName = '{' . $namespaceURI . '}' . $localName; - return isset($this->attributes[$fullName]); - } - - - /** - * Get a namespace-qualified attribute. - * - * @param string $namespaceURI The namespace URI. - * @param string $localName The local name. - * @return string The value of the attribute, or an empty string if the attribute does not exist. - */ - public function getAttributeNS($namespaceURI, $localName) { - assert('is_string($namespaceURI)'); - assert('is_string($localName)'); - - $fullName = '{' . $namespaceURI . '}' . $localName; - if (!isset($this->attributes[$fullName])) { - return ''; - } - return $this->attributes[$fullName]['value']; - } - - - /** - * Get a namespace-qualified attribute. - * - * @param string $namespaceURI The namespace URI. - * @param string $qualifiedName The local name. - * @param string $value The attribute value. - */ - public function setAttributeNS($namespaceURI, $qualifiedName, $value) { - assert('is_string($namespaceURI)'); - assert('is_string($qualifiedName)'); - - $name = explode(':', $qualifiedName, 2); - if (count($name) < 2) { - throw new Exception('Not a qualified name.'); - } - $localName = $name[1]; - - $fullName = '{' . $namespaceURI . '}' . $localName; - $this->attributes[$fullName] = array( - 'qualifiedName' => $qualifiedName, - 'namespaceURI' => $namespaceURI, - 'value' => $value, - ); - } - - - /** - * Remove a namespace-qualified attribute. - * - * @param string $namespaceURI The namespace URI. - * @param string $localName The local name. - */ - public function removeAttributeNS($namespaceURI, $localName) { - assert('is_string($namespaceURI)'); - assert('is_string($localName)'); - - $fullName = '{' . $namespaceURI . '}' . $localName; - unset($this->attributes[$fullName]); - } - - - /** - * Add this endpoint to an XML element. - * - * @param DOMElement $parent The element we should append this endpoint to. - * @param string $name The name of the element we should create. - */ - public function toXML(DOMElement $parent, $name) { - assert('is_string($name)'); - assert('is_string($this->Binding)'); - assert('is_string($this->Location)'); - assert('is_null($this->ResponseLocation) || is_string($this->ResponseLocation)'); - - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, $name); - $parent->appendChild($e); - - $e->setAttribute('Binding', $this->Binding); - $e->setAttribute('Location', $this->Location); - - if (isset($this->ResponseLocation)) { - $e->setAttribute('ResponseLocation', $this->ResponseLocation); - } - - foreach ($this->attributes as $a) { - $e->setAttributeNS($a['namespaceURI'], $a['qualifiedName'], $a['value']); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/EntitiesDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/EntitiesDescriptor.php deleted file mode 100644 index e3ea236..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/EntitiesDescriptor.php +++ /dev/null @@ -1,142 +0,0 @@ -hasAttribute('ID')) { - $this->ID = $xml->getAttribute('ID'); - } - if ($xml->hasAttribute('validUntil')) { - $this->validUntil = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('validUntil')); - } - if ($xml->hasAttribute('cacheDuration')) { - $this->cacheDuration = $xml->getAttribute('cacheDuration'); - } - if ($xml->hasAttribute('Name')) { - $this->Name = $xml->getAttribute('Name'); - } - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $node) { - if ($node->localName === 'EntityDescriptor') { - $this->children[] = new SAML2_XML_md_EntityDescriptor($node); - } else { - $this->children[] = new SAML2_XML_md_EntitiesDescriptor($node); - } - } - } - - - /** - * Convert this EntitiesDescriptor to XML. - * - * @param DOMElement|NULL $parent The EntitiesDescriptor we should append this EntitiesDescriptor to. - */ - public function toXML(DOMElement $parent = NULL) { - assert('is_null($this->ID) || is_string($this->ID)'); - assert('is_null($this->validUntil) || is_int($this->validUntil)'); - assert('is_null($this->cacheDuration) || is_string($this->cacheDuration)'); - assert('is_array($this->Extensions)'); - assert('is_array($this->children)'); - - if ($parent === NULL) { - $doc = new DOMDocument(); - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:EntitiesDescriptor'); - $doc->appendChild($e); - } else { - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, 'md:EntitiesDescriptor'); - $parent->appendChild($e); - } - - if (isset($this->ID)) { - $e->setAttribute('ID', $this->ID); - } - - if (isset($this->validUntil)) { - $e->setAttribute('validUntil', gmdate('Y-m-d\TH:i:s\Z', $this->validUntil)); - } - - if (isset($this->cacheDuration)) { - $e->setAttribute('cacheDuration', $this->cacheDuration); - } - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - foreach ($this->children as $node) { - $node->toXML($e); - } - - $this->signElement($e, $e->firstChild); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/EntityDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/EntityDescriptor.php deleted file mode 100644 index 89c7dce..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/EntityDescriptor.php +++ /dev/null @@ -1,252 +0,0 @@ -hasAttribute('entityID')) { - throw new Exception('Missing required attribute entityID on EntityDescriptor.'); - } - $this->entityID = $xml->getAttribute('entityID'); - - if ($xml->hasAttribute('ID')) { - $this->ID = $xml->getAttribute('ID'); - } - if ($xml->hasAttribute('validUntil')) { - $this->validUntil = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('validUntil')); - } - if ($xml->hasAttribute('cacheDuration')) { - $this->cacheDuration = $xml->getAttribute('cacheDuration'); - } - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - for ($node = $xml->firstChild; $node !== NULL; $node = $node->nextSibling) { - if (!($node instanceof DOMElement)) { - continue; - } - - if ($node->namespaceURI !== SAML2_Const::NS_MD) { - continue; - } - - switch ($node->localName) { - case 'RoleDescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_UnknownRoleDescriptor($node); - break; - case 'IDPSSODescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_IDPSSODescriptor($node); - break; - case 'SPSSODescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_SPSSODescriptor($node); - break; - case 'AuthnAuthorityDescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_AuthnAuthorityDescriptor($node); - break; - case 'AttributeAuthorityDescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_AttributeAuthorityDescriptor($node); - break; - case 'PDPDescriptor': - $this->RoleDescriptor[] = new SAML2_XML_md_PDPDescriptor($node); - break; - } - } - - $affiliationDescriptor = SAML2_Utils::xpQuery($xml, './saml_metadata:AffiliationDescriptor'); - if (count($affiliationDescriptor) > 1) { - throw new Exception('More than one AffiliationDescriptor in the entity.'); - } elseif (!empty($affiliationDescriptor)) { - $this->AffiliationDescriptor = new SAML2_XML_md_AffiliationDescriptor($affiliationDescriptor[0]); - } - - if (empty($this->RoleDescriptor) && is_null($this->AffiliationDescriptor)) { - throw new Exception('Must have either one of the RoleDescriptors or an AffiliationDescriptor in EntityDescriptor.'); - } elseif (!empty($this->RoleDescriptor) && !is_null($this->AffiliationDescriptor)) { - throw new Exception('AffiliationDescriptor cannot be combined with other RoleDescriptor elements in EntityDescriptor.'); - } - - $organization = SAML2_Utils::xpQuery($xml, './saml_metadata:Organization'); - if (count($organization) > 1) { - throw new Exception('More than one Organization in the entity.'); - } elseif (!empty($organization)) { - $this->Organization = new SAML2_XML_md_Organization($organization[0]); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:ContactPerson') as $cp) { - $this->ContactPerson[] = new SAML2_XML_md_ContactPerson($cp); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AdditionalMetadataLocation') as $aml) { - $this->AdditionalMetadataLocation[] = new SAML2_XML_md_AdditionalMetadataLocation($aml); - } - } - - - /** - * Create this EntityDescriptor. - * - * @param DOMElement|NULL $parent The EntitiesDescriptor we should append this EntityDescriptor to. - */ - public function toXML(DOMElement $parent = NULL) { - assert('is_string($this->entityID)'); - assert('is_null($this->ID) || is_string($this->ID)'); - assert('is_null($this->validUntil) || is_int($this->validUntil)'); - assert('is_null($this->cacheDuration) || is_string($this->cacheDuration)'); - assert('is_array($this->Extensions)'); - assert('is_array($this->RoleDescriptor)'); - assert('is_null($this->AffiliationDescriptor) || $this->AffiliationDescriptor instanceof SAML2_XML_md_AffiliationDescriptor'); - assert('is_null($this->Organization) || $this->Organization instanceof SAML2_XML_md_Organization'); - assert('is_array($this->ContactPerson)'); - assert('is_array($this->AdditionalMetadataLocation)'); - - if ($parent === NULL) { - $doc = new DOMDocument(); - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:EntityDescriptor'); - $doc->appendChild($e); - } else { - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, 'md:EntityDescriptor'); - $parent->appendChild($e); - } - - $e->setAttribute('entityID', $this->entityID); - - if (isset($this->ID)) { - $e->setAttribute('ID', $this->ID); - } - - if (isset($this->validUntil)) { - $e->setAttribute('validUntil', gmdate('Y-m-d\TH:i:s\Z', $this->validUntil)); - } - - if (isset($this->cacheDuration)) { - $e->setAttribute('cacheDuration', $this->cacheDuration); - } - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - foreach ($this->RoleDescriptor as $n) { - $n->toXML($e); - } - - if (isset($this->AffiliationDescriptor)) { - $this->AffiliationDescriptor->toXML($e); - } - - if (isset($this->Organization)) { - $this->Organization->toXML($e); - } - - foreach ($this->ContactPerson as $cp) { - $cp->toXML($e); - } - - foreach ($this->AdditionalMetadataLocation as $n) { - $n->toXML($e); - } - - $this->signElement($e, $e->firstChild); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/Extensions.php b/inc/simplesamlphp/lib/SAML2/XML/md/Extensions.php deleted file mode 100644 index d3d237a..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/Extensions.php +++ /dev/null @@ -1,60 +0,0 @@ -namespaceURI === SAML2_XML_shibmd_Scope::NS && $node->localName === 'Scope') { - $ret[] = new SAML2_XML_shibmd_Scope($node); - } elseif ($node->namespaceURI === SAML2_XML_mdattr_EntityAttributes::NS && $node->localName === 'EntityAttributes') { - $ret[] = new SAML2_XML_mdattr_EntityAttributes($node); - } elseif ($node->namespaceURI === SAML2_XML_mdrpi_Common::NS_MDRPI && $node->localName === 'PublicationInfo') { - $ret[] = new SAML2_XML_mdrpi_PublicationInfo($node); - } elseif ($node->namespaceURI === SAML2_XML_mdui_UIInfo::NS && $node->localName === 'UIInfo') { - $ret[] = new SAML2_XML_mdui_UIInfo($node); - } elseif ($node->namespaceURI === SAML2_XML_mdui_DiscoHints::NS && $node->localName === 'DiscoHints') { - $ret[] = new SAML2_XML_mdui_DiscoHints($node); - } else { - $ret[] = new SAML2_XML_Chunk($node); - } - } - - return $ret; - } - - - /** - * Add a list of Extensions to the given element. - * - * @param DOMElement $parent The element we should add the extensions to. - * @param array $extensions List of extension objects. - */ - public static function addList(DOMElement $parent, array $extensions) { - - if (empty($extensions)) { - return; - } - - $extElement = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, 'md:Extensions'); - $parent->appendChild($extElement); - - foreach ($extensions as $ext) { - $ext->toXML($extElement); - } - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/IDPSSODescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/IDPSSODescriptor.php deleted file mode 100644 index 0479d98..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/IDPSSODescriptor.php +++ /dev/null @@ -1,145 +0,0 @@ -WantAuthnRequestsSigned = SAML2_Utils::parseBoolean($xml, 'WantAuthnRequestsSigned', NULL); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:SingleSignOnService') as $ep) { - $this->SingleSignOnService[] = new SAML2_XML_md_EndpointType($ep); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:NameIDMappingService') as $ep) { - $this->NameIDMappingService[] = new SAML2_XML_md_EndpointType($ep); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AssertionIDRequestService') as $ep) { - $this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($ep); - } - - $this->AttributeProfile = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'AttributeProfile'); - - foreach (SAML2_Utils::xpQuery($xml, './saml_assertion:Attribute') as $a) { - $this->Attribute[] = new SAML2_XML_saml_Attribute($a); - } - } - - - /** - * Add this IDPSSODescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this IDPSSODescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_null($this->WantAuthnRequestsSigned) || is_bool($this->WantAuthnRequestsSigned)'); - assert('is_array($this->SingleSignOnService)'); - assert('is_array($this->NameIDMappingService)'); - assert('is_array($this->AssertionIDRequestService)'); - assert('is_array($this->AttributeProfile)'); - assert('is_array($this->Attribute)'); - - $e = parent::toXML($parent); - - if ($this->WantAuthnRequestsSigned === TRUE) { - $e->setAttribute('WantAuthnRequestsSigned', 'true'); - } elseif ($this->WantAuthnRequestsSigned === FALSE) { - $e->setAttribute('WantAuthnRequestsSigned', 'false'); - } - - foreach ($this->SingleSignOnService as $ep) { - $ep->toXML($e, 'md:SingleSignOnService'); - } - - foreach ($this->NameIDMappingService as $ep) { - $ep->toXML($e, 'md:NameIDMappingService'); - } - - foreach ($this->AssertionIDRequestService as $ep) { - $ep->toXML($e, 'md:AssertionIDRequestService'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:AttributeProfile', FALSE, $this->AttributeProfile); - - foreach ($this->Attribute as $a) { - $a->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/IndexedEndpointType.php b/inc/simplesamlphp/lib/SAML2/XML/md/IndexedEndpointType.php deleted file mode 100644 index c019152..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/IndexedEndpointType.php +++ /dev/null @@ -1,71 +0,0 @@ -hasAttribute('index')) { - throw new Exception('Missing index on ' . $xml->tagName); - } - $this->index = (int)$xml->getAttribute('index'); - - $this->isDefault = SAML2_Utils::parseBoolean($xml, 'isDefault', NULL); - } - - - /** - * Add this endpoint to an XML element. - * - * @param DOMElement $parent The element we should append this endpoint to. - * @param string $name The name of the element we should create. - */ - public function toXML(DOMElement $parent, $name) { - assert('is_string($name)'); - assert('is_int($this->index)'); - assert('is_null($this->isDefault) || is_bool($this->isDefault)'); - - $e = parent::toXML($parent, $name); - $e->setAttribute('index', (string)$this->index); - - if ($this->isDefault === TRUE) { - $e->setAttribute('isDefault', 'true'); - } elseif ($this->isDefault === FALSE) { - $e->setAttribute('isDefault', 'false'); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/KeyDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/KeyDescriptor.php deleted file mode 100644 index aeaffe9..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/KeyDescriptor.php +++ /dev/null @@ -1,97 +0,0 @@ -hasAttribute('use')) { - $this->use = $xml->getAttribute('use'); - } - - $keyInfo = SAML2_Utils::xpQuery($xml, './ds:KeyInfo'); - if (count($keyInfo) > 1) { - throw new Exception('More than one ds:KeyInfo in the KeyDescriptor.'); - } elseif (empty($keyInfo)) { - throw new Exception('No ds:KeyInfo in the KeyDescriptor.'); - } - $this->KeyInfo = new SAML2_XML_ds_KeyInfo($keyInfo[0]); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:EncryptionMethod') as $em) { - $this->EncryptionMethod[] = new SAML2_XML_Chunk($em); - } - - } - - - /** - * Convert this KeyDescriptor to XML. - * - * @param DOMElement $parent The element we should append this KeyDescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_null($this->use) || is_string($this->use)'); - assert('$this->KeyInfo instanceof SAML2_XML_ds_KeyInfo'); - assert('is_array($this->EncryptionMethod)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:KeyDescriptor'); - $parent->appendChild($e); - - if (isset($this->use)) { - $e->setAttribute('use', $this->use); - } - - $this->KeyInfo->toXML($e); - - foreach ($this->EncryptionMethod as $em) { - $em->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/Organization.php b/inc/simplesamlphp/lib/SAML2/XML/md/Organization.php deleted file mode 100644 index 5ceaeed..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/Organization.php +++ /dev/null @@ -1,105 +0,0 @@ - translation. - * - * @var array - */ - public $OrganizationName = array(); - - - /** - * The OrganizationDisplayName, as an array of language => translation. - * - * @var array - */ - public $OrganizationDisplayName = array(); - - - /** - * The OrganizationURL, as an array of language => translation. - * - * @var array - */ - public $OrganizationURL = array(); - - - /** - * Initialize an Organization element. - * - * @param DOMElement|NULL $xml The XML element we should load. - */ - public function __construct(DOMElement $xml = NULL) { - - if ($xml === NULL) { - return; - } - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - - $this->OrganizationName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationName'); - if (empty($this->OrganizationName)) { - $this->OrganizationName = array('invalid' => ''); - } - - $this->OrganizationDisplayName = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationDisplayName'); - if (empty($this->OrganizationDisplayName)) { - $this->OrganizationDisplayName = array('invalid' => ''); - } - - $this->OrganizationURL = SAML2_Utils::extractLocalizedStrings($xml, SAML2_Const::NS_MD, 'OrganizationURL'); - if (empty($this->OrganizationURL)) { - $this->OrganizationURL = array('invalid' => ''); - } - } - - - /** - * Convert this Organization to XML. - * - * @param DOMElement $parent The element we should add this organization to. - * @return DOMElement This Organization-element. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->Extensions)'); - assert('is_array($this->OrganizationName)'); - assert('!empty($this->OrganizationName)'); - assert('is_array($this->OrganizationDisplayName)'); - assert('!empty($this->OrganizationDisplayName)'); - assert('is_array($this->OrganizationURL)'); - assert('!empty($this->OrganizationURL)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:Organization'); - $parent->appendChild($e); - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:OrganizationName', TRUE, $this->OrganizationName); - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:OrganizationDisplayName', TRUE, $this->OrganizationDisplayName); - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:OrganizationURL', TRUE, $this->OrganizationURL); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/PDPDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/PDPDescriptor.php deleted file mode 100644 index 677d5f6..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/PDPDescriptor.php +++ /dev/null @@ -1,94 +0,0 @@ -AuthzService[] = new SAML2_XML_md_EndpointType($ep); - } - if (empty($this->AuthzService)) { - throw new Exception('Must have at least one AuthzService in PDPDescriptor.'); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AssertionIDRequestService') as $ep) { - $this->AssertionIDRequestService[] = new SAML2_XML_md_EndpointType($airs); - } - - $this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat'); - } - - - /** - * Add this PDPDescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this IDPSSODescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->AuthzService)'); - assert('!empty($this->AuthzService)'); - assert('is_array($this->AssertionIDRequestService)'); - assert('is_array($this->NameIDFormat)'); - - $e = parent::toXML($parent); - - foreach ($this->AuthzService as $ep) { - $ep->toXML($e, 'md:AuthzService'); - } - - foreach ($this->AssertionIDRequestService as $ep) { - $ep->toXML($e, 'md:AssertionIDRequestService'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:NameIDFormat', FALSE, $this->NameIDFormat); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/RequestedAttribute.php b/inc/simplesamlphp/lib/SAML2/XML/md/RequestedAttribute.php deleted file mode 100644 index 124a25d..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/RequestedAttribute.php +++ /dev/null @@ -1,54 +0,0 @@ -isRequired = SAML2_Utils::parseBoolean($xml, 'isRequired', NULL); - } - - - /** - * Convert this RequestedAttribute to XML. - * - * @param DOMElement $parent The element we should append this RequestedAttribute to. - */ - public function toXML(DOMElement $parent) { - assert('is_bool($this->isRequired) || is_null($this->isRequired)'); - - $e = $this->toXMLInternal($parent, SAML2_Const::NS_MD, 'md:RequestedAttribute'); - - if ($this->isRequired === TRUE) { - $e->setAttribute('isRequired', 'true'); - } elseif ($this->isRequired === FALSE) { - $e->setAttribute('isRequired', 'false'); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/RoleDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/RoleDescriptor.php deleted file mode 100644 index 346d34c..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/RoleDescriptor.php +++ /dev/null @@ -1,208 +0,0 @@ -elementName = $elementName; - - if ($xml === NULL) { - return; - } - - if ($xml->hasAttribute('ID')) { - $this->ID = $xml->getAttribute('ID'); - } - if ($xml->hasAttribute('validUntil')) { - $this->validUntil = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('validUntil')); - } - if ($xml->hasAttribute('cacheDuration')) { - $this->cacheDuration = $xml->getAttribute('cacheDuration'); - } - - if (!$xml->hasAttribute('protocolSupportEnumeration')) { - throw new Exception('Missing protocolSupportEnumeration attribute on ' . $xml->localName); - } - $this->protocolSupportEnumeration = preg_split('/[\s]+/', $xml->getAttribute('protocolSupportEnumeration')); - - if ($xml->hasAttribute('errorURL')) { - $this->errorURL = $xml->getAttribute('errorURL'); - } - - - $this->Extensions = SAML2_XML_md_Extensions::getList($xml); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:KeyDescriptor') as $kd) { - $this->KeyDescriptor[] = new SAML2_XML_md_KeyDescriptor($kd); - } - - $organization = SAML2_Utils::xpQuery($xml, './saml_metadata:Organization'); - if (count($organization) > 1) { - throw new Exception('More than one Organization in the entity.'); - } elseif (!empty($organization)) { - $this->Organization = new SAML2_XML_md_Organization($organization[0]); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:ContactPerson') as $cp) { - $this->contactPersons[] = new SAML2_XML_md_ContactPerson($cp); - } - } - - - /** - * Add this RoleDescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this endpoint to. - * @param string $name The name of the element we should create. - */ - protected function toXML(DOMElement $parent) { - assert('is_null($this->ID) || is_string($this->ID)'); - assert('is_null($this->validUntil) || is_int($this->validUntil)'); - assert('is_null($this->cacheDuration) || is_string($this->cacheDuration)'); - assert('is_array($this->protocolSupportEnumeration)'); - assert('is_null($this->errorURL) || is_string($this->errorURL)'); - assert('is_array($this->Extensions)'); - assert('is_array($this->KeyDescriptor)'); - assert('is_null($this->Organization) || $this->Organization instanceof SAML2_XML_md_Organization'); - assert('is_array($this->ContactPerson)'); - - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, $this->elementName); - $parent->appendChild($e); - - if (isset($this->ID)) { - $e->setAttribute('ID', $this->ID); - } - - if (isset($this->validUntil)) { - $e->setAttribute('validUntil', gmdate('Y-m-d\TH:i:s\Z', $this->validUntil)); - } - - if (isset($this->cacheDuration)) { - $e->setAttribute('cacheDuration', $this->cacheDuration); - } - - $e->setAttribute('protocolSupportEnumeration', implode(' ', $this->protocolSupportEnumeration)); - - if (isset($this->errorURL)) { - $e->setAttribute('errorURL', $this->errorURL); - } - - - SAML2_XML_md_Extensions::addList($e, $this->Extensions); - - foreach ($this->KeyDescriptor as $kd) { - $kd->toXML($e); - } - - if (isset($this->Organization)) { - $this->Organization->toXML($e); - } - - foreach ($this->ContactPerson as $cp) { - $cp->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/SPSSODescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/SPSSODescriptor.php deleted file mode 100644 index da7077e..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/SPSSODescriptor.php +++ /dev/null @@ -1,107 +0,0 @@ -AuthnRequestsSigned = SAML2_Utils::parseBoolean($xml, 'AuthnRequestsSigned', NULL); - $this->WantAssertionsSigned = SAML2_Utils::parseBoolean($xml, 'WantAssertionsSigned', NULL); - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AssertionConsumerService') as $ep) { - $this->AssertionConsumerService[] = new SAML2_XML_md_IndexedEndpointType($ep); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:AttributeConsumingService') as $acs) { - $this->AttributeConsumingService[] = new SAML2_XML_md_AttributeConsumingService($acs); - } - } - - - /** - * Add this SPSSODescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this SPSSODescriptor to. - */ - public function toXML(DOMElement $parent) { - assert('is_null($this->AuthnRequestsSigned) || is_bool($this->AuthnRequestsSigned)'); - assert('is_null($this->WantAssertionsSigned) || is_bool($this->WantAssertionsSigned)'); - assert('is_array($this->AssertionConsumerService)'); - assert('is_array($this->AttributeConsumingService)'); - - $e = parent::toXML($parent); - - if ($this->AuthnRequestsSigned === TRUE) { - $e->setAttribute('AuthnRequestsSigned', 'true'); - } elseif ($this->AuthnRequestsSigned === FALSE) { - $e->setAttribute('AuthnRequestsSigned', 'false'); - } - - if ($this->WantAssertionsSigned === TRUE) { - $e->setAttribute('WantAssertionsSigned', 'true'); - } elseif ($this->WantAssertionsSigned === FALSE) { - $e->setAttribute('WantAssertionsSigned', 'false'); - } - - - foreach ($this->AssertionConsumerService as $ep) { - $ep->toXML($e, 'md:AssertionConsumerService'); - } - - foreach ($this->AttributeConsumingService as $acs) { - $acs->toXML($e); - } - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/SSODescriptorType.php b/inc/simplesamlphp/lib/SAML2/XML/md/SSODescriptorType.php deleted file mode 100644 index bdb8e96..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/SSODescriptorType.php +++ /dev/null @@ -1,114 +0,0 @@ -ArtifactResolutionService[] = new SAML2_XML_md_IndexedEndpointType($ep); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:SingleLogoutService') as $ep) { - $this->SingleLogoutService[] = new SAML2_XML_md_EndpointType($ep); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:ManageNameIDService') as $ep) { - $this->ManageNameIDService[] = new SAML2_XML_md_EndpointType($ep); - } - - $this->NameIDFormat = SAML2_Utils::extractStrings($xml, SAML2_Const::NS_MD, 'NameIDFormat'); - } - - - /** - * Add this SSODescriptorType to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this SSODescriptorType to. - * @param string $name The name of the element we should create. - * @return DOMElement The generated SSODescriptor DOMElement. - */ - protected function toXML(DOMElement $parent) { - assert('is_array($this->ArtifactResolutionService)'); - assert('is_array($this->SingleLogoutService)'); - assert('is_array($this->ManageNameIDService)'); - assert('is_array($this->NameIDFormat)'); - - $e = parent::toXML($parent); - - foreach ($this->ArtifactResolutionService as $ep) { - $ep->toXML($e, 'md:ArtifactResolutionService'); - } - - foreach ($this->SingleLogoutService as $ep) { - $ep->toXML($e, 'md:SingleLogoutService'); - } - - foreach ($this->ManageNameIDService as $ep) { - $ep->toXML($e, 'md:ManageNameIDService'); - } - - SAML2_Utils::addStrings($e, SAML2_Const::NS_MD, 'md:NameIDFormat', FALSE, $this->NameIDFormat); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/md/UnknownRoleDescriptor.php b/inc/simplesamlphp/lib/SAML2/XML/md/UnknownRoleDescriptor.php deleted file mode 100644 index 66e3a79..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/md/UnknownRoleDescriptor.php +++ /dev/null @@ -1,41 +0,0 @@ -xml = new SAML2_XML_Chunk($xml); - } - - - /** - * Add this RoleDescriptor to an EntityDescriptor. - * - * @param DOMElement $parent The EntityDescriptor we should append this RoleDescriptor to. - */ - public function toXML(DOMElement $parent) { - - $this->xml->toXML($parent); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdattr/EntityAttributes.php b/inc/simplesamlphp/lib/SAML2/XML/mdattr/EntityAttributes.php deleted file mode 100644 index 9359008..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdattr/EntityAttributes.php +++ /dev/null @@ -1,72 +0,0 @@ -localName === 'Attribute') { - $this->children[] = new SAML2_XML_saml_Attribute($node); - } else { - $this->children[] = new SAML2_XML_Chunk($node); - } - } - - } - - - /** - * Convert this EntityAttributes to XML. - * - * @param DOMElement $parent The element we should append to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->children)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_XML_mdattr_EntityAttributes::NS, 'mdattr:EntityAttributes'); - $parent->appendChild($e); - - if (!empty($this->children)) { - foreach ($this->children as $child) { - $child->toXML($e); - } - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdrpi/PublicationInfo.php b/inc/simplesamlphp/lib/SAML2/XML/mdrpi/PublicationInfo.php deleted file mode 100644 index bf6bff8..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdrpi/PublicationInfo.php +++ /dev/null @@ -1,102 +0,0 @@ -URL. - * - * @var array - */ - public $UsagePolicy = array(); - - - /** - * Create/parse a mdrpi:PublicationInfo element. - * - * @param DOMElement|NULL $xml The XML element we should load. - */ - public function __construct(DOMElement $xml = NULL) { - - if ($xml === NULL) { - return; - } - - if (!$xml->hasAttribute('publisher')) { - throw new Exception('Missing required attribute "publisher" in mdrpi:PublicationInfo element.'); - } - $this->publisher = $xml->getAttribute('publisher'); - - if ($xml->hasAttribute('creationInstant')) { - $this->creationInstant = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('creationInstant')); - } - - if ($xml->hasAttribute('publicationId')) { - $this->publicationId = $xml->getAttribute('publicationId'); - } - - $this->UsagePolicy = SAML2_Utils::extractLocalizedStrings($xml, SAML2_XML_mdrpi_Common::NS_MDRPI, 'UsagePolicy'); - } - - - /** - * Convert this element to XML. - * - * @param DOMElement $parent The element we should append to. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->publisher)'); - assert('is_int($this->creationInstant) || is_null($this->creationInstant)'); - assert('is_string($this->publicationId) || is_null($this->publicationId)'); - assert('is_array($this->UsagePolicy)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_XML_mdrpi_Common::NS_MDRPI, 'mdrpi:PublicationInfo'); - $parent->appendChild($e); - - $e->setAttribute('publisher', $this->publisher); - - if ($this->creationInstant !== NULL) { - $e->setAttribute('creationInstant', gmdate('Y-m-d\TH:i:s\Z', $this->creationInstant)); - } - - if ($this->publicationId !== NULL) { - $e->setAttribute('publicationId', $this->publicationId); - } - - SAML2_Utils::addStrings($e, SAML2_XML_mdrpi_Common::NS_MDRPI, 'mdrpi:UsagePolicy', TRUE, $this->UsagePolicy); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdui/DiscoHints.php b/inc/simplesamlphp/lib/SAML2/XML/mdui/DiscoHints.php deleted file mode 100644 index 8ff510d..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdui/DiscoHints.php +++ /dev/null @@ -1,106 +0,0 @@ -IPHint = SAML2_Utils::extractStrings($xml, self::NS, 'IPHint'); - $this->DomainHint = SAML2_Utils::extractStrings($xml, self::NS, 'DomainHint'); - $this->GeolocationHint = SAML2_Utils::extractStrings($xml, self::NS, 'GeolocationHint'); - - foreach (SAML2_Utils::xpQuery($xml, "./*[namespace-uri()!='".self::NS."']") as $node) { - $this->children[] = new SAML2_XML_Chunk($node); - } - } - - - /** - * Convert this DiscoHints to XML. - * - * @param DOMElement $parent The element we should append to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->IPHint)'); - assert('is_array($this->DomainHint)'); - assert('is_array($this->GeolocationHint)'); - assert('is_array($this->children)'); - - if (!empty($this->IPHint) - || !empty($this->DomainHint) - || !empty($this->GeolocationHint) - || !empty($this->children)) { - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(self::NS, 'mdui:DiscoHints'); - $parent->appendChild($e); - - if (!empty($this->children)) { - foreach ($this->children as $child) { - $child->toXML($e); - } - } - - SAML2_Utils::addStrings($e, self::NS, 'mdui:IPHint', FALSE, $this->IPHint); - SAML2_Utils::addStrings($e, self::NS, 'mdui:DomainHint', FALSE, $this->DomainHint); - SAML2_Utils::addStrings($e, self::NS, 'mdui:GeolocationHint', FALSE, $this->GeolocationHint); - - return $e; - } - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdui/Keywords.php b/inc/simplesamlphp/lib/SAML2/XML/mdui/Keywords.php deleted file mode 100644 index 0cc2893..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdui/Keywords.php +++ /dev/null @@ -1,79 +0,0 @@ -hasAttribute('xml:lang')) { - throw new Exception('Missing lang on Keywords.'); - } - if (!is_string($xml->textContent) || !strlen($xml->textContent)) { - throw new Exception('Missing value for Keywords.'); - } - $this->Keywords = array(); - foreach (explode(' ', $xml->textContent) as $keyword) { - $this->Keywords[] = str_replace('+', ' ', $keyword); - } - $this->lang = $xml->getAttribute('xml:lang'); - } - - - /** - * Convert this Keywords to XML. - * - * @param DOMElement $parent The element we should append this Keywords to. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->lang)'); - assert('is_array($this->Keywords)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_XML_mdui_UIInfo::NS, 'mdui:Keywords'); - $e->setAttribute('xml:lang', $this->lang); - $e->nodeValue = ''; - foreach ($this->Keywords as $keyword) { - if (strpos($keyword, "+") !== false) { - throw new Exception('Keywords may not contain a "+" character.'); - } - $e->nodeValue .= str_replace(' ', '+', $keyword) . ' '; - } - $e->nodeValue = rtrim($e->nodeValue); - $parent->appendChild($e); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdui/Logo.php b/inc/simplesamlphp/lib/SAML2/XML/mdui/Logo.php deleted file mode 100644 index 1e327a1..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdui/Logo.php +++ /dev/null @@ -1,94 +0,0 @@ -hasAttribute('width')) { - throw new Exception('Missing width of Logo.'); - } - if (!$xml->hasAttribute('height')) { - throw new Exception('Missing height of Logo.'); - } - if (!is_string($xml->textContent) || !strlen($xml->textContent)) { - throw new Exception('Missing url value for Logo.'); - } - $this->url = $xml->textContent; - $this->width = (int)$xml->getAttribute('width'); - $this->height = (int)$xml->getAttribute('height'); - $this->lang = $xml->hasAttribute('xml:lang') ? $xml->getAttribute('xml:lang') : NULL; - } - - - /** - * Convert this Logo to XML. - * - * @param DOMElement $parent The element we should append this Logo to. - */ - public function toXML(DOMElement $parent) { - assert('is_int($this->width)'); - assert('is_int($this->height)'); - assert('is_string($this->url)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_XML_mdui_UIInfo::NS, 'mdui:Logo'); - $e->nodeValue = $this->url; - $e->setAttribute('width', (int)$this->width); - $e->setAttribute('height', (int)$this->height); - if (isset($this->lang)) { - $e->setAttribute('xml:lang', $this->lang); - } - $parent->appendChild($e); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/mdui/UIInfo.php b/inc/simplesamlphp/lib/SAML2/XML/mdui/UIInfo.php deleted file mode 100644 index 2023abe..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/mdui/UIInfo.php +++ /dev/null @@ -1,154 +0,0 @@ - translation. - * - * @var array - */ - public $DisplayName = array(); - - /** - * The Description, as an array of language => translation. - * - * @var array - */ - public $Description = array(); - - /** - * The InformationURL, as an array of language => url. - * - * @var array - */ - public $InformationURL = array(); - - /** - * The PrivacyStatementURL, as an array of language => url. - * - * @var array - */ - public $PrivacyStatementURL = array(); - - /** - * The Keywords, as an array of language => array of strings. - * - * @var array - */ - public $Keywords = array(); - - /** - * The Logo, as an array of associative arrays containing url, width, height, and optional lang. - * - * @var array - */ - public $Logo = array(); - - - /** - * Create a UIInfo element. - * - * @param DOMElement|NULL $xml The XML element we should load. - */ - public function __construct(DOMElement $xml = NULL) { - - if ($xml === NULL) { - return; - } - - $this->DisplayName = SAML2_Utils::extractLocalizedStrings($xml, self::NS, 'DisplayName'); - $this->Description = SAML2_Utils::extractLocalizedStrings($xml, self::NS, 'Description'); - $this->InformationURL = SAML2_Utils::extractLocalizedStrings($xml, self::NS, 'InformationURL'); - $this->PrivacyStatementURL = SAML2_Utils::extractLocalizedStrings($xml, self::NS, 'PrivacyStatementURL'); - - foreach (SAML2_Utils::xpQuery($xml, './*') as $node) { - if ($node->namespaceURI === self::NS) { - switch ($node->localName) { - case 'Keywords': - $this->Keywords[] = new SAML2_XML_mdui_Keywords($node); - break; - case 'Logo': - $this->Logo[] = new SAML2_XML_mdui_Logo($node); - break; - } - } else { - $this->children[] = new SAML2_XML_Chunk($node); - } - } - } - - - /** - * Convert this UIInfo to XML. - * - * @param DOMElement $parent The element we should append to. - */ - public function toXML(DOMElement $parent) { - assert('is_array($this->DisplayName)'); - assert('is_array($this->InformationURL)'); - assert('is_array($this->PrivacyStatementURL)'); - assert('is_array($this->Keywords)'); - assert('is_array($this->Logo)'); - assert('is_array($this->children)'); - - if (!empty($this->DisplayName) - || !empty($this->Description) - || !empty($this->InformationURL) - || !empty($this->PrivacyStatementURL) - || !empty($this->Keywords) - || !empty($this->Logo) - || !empty($this->children)) { - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(self::NS, 'mdui:UIInfo'); - $parent->appendChild($e); - - SAML2_Utils::addStrings($e, self::NS, 'mdui:DisplayName', TRUE, $this->DisplayName); - SAML2_Utils::addStrings($e, self::NS, 'mdui:Description', TRUE, $this->Description); - SAML2_Utils::addStrings($e, self::NS, 'mdui:InformationURL', TRUE, $this->InformationURL); - SAML2_Utils::addStrings($e, self::NS, 'mdui:PrivacyStatementURL', TRUE, $this->PrivacyStatementURL); - - if (!empty($this->Keywords)) { - foreach ($this->Keywords as $child) { - $child->toXML($e); - } - } - - if (!empty($this->Logo)) { - foreach ($this->Logo as $child) { - $child->toXML($e); - } - } - - if (!empty($this->children)) { - foreach ($this->children as $child) { - $child->toXML($e); - } - } - } - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/saml/Attribute.php b/inc/simplesamlphp/lib/SAML2/XML/saml/Attribute.php deleted file mode 100644 index afbf0cb..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/saml/Attribute.php +++ /dev/null @@ -1,121 +0,0 @@ -hasAttribute('Name')) { - throw new Exception('Missing Name on Attribute.'); - } - $this->Name = $xml->getAttribute('Name'); - - if ($xml->hasAttribute('NameFormat')) { - $this->NameFormat = $xml->getAttribute('NameFormat'); - } - - if ($xml->hasAttribute('FriendlyName')) { - $this->FriendlyName = $xml->getAttribute('FriendlyName'); - } - - foreach (SAML2_Utils::xpQuery($xml, './saml_assertion:AttributeValue') as $av) { - $this->AttributeValue[] = new SAML2_XML_saml_AttributeValue($av); - } - } - - - /** - * Internal implementation of toXML. - * This function allows RequestedAttribute to specify the element name and namespace. - * - * @param DOMElement $parent The element we should append this Attribute to. - * @param string $namespace The namespace the element should be created in. - * @param string $name The name of the element. - */ - protected function toXMLInternal(DOMElement $parent, $namespace, $name) { - assert('is_string($namespace)'); - assert('is_string($name)'); - assert('is_string($this->Name)'); - assert('is_null($this->NameFormat) || is_string($this->NameFormat)'); - assert('is_null($this->FriendlyName) || is_string($this->FriendlyName)'); - assert('is_array($this->AttributeValue)'); - - $e = $parent->ownerDocument->createElementNS($namespace, $name); - $parent->appendChild($e); - - $e->setAttribute('Name', $this->Name); - - if (isset($this->NameFormat)) { - $e->setAttribute('NameFormat', $this->NameFormat); - } - - if (isset($this->FriendlyName)) { - $e->setAttribute('FriendlyName', $this->FriendlyName); - } - - foreach ($this->AttributeValue as $av) { - $av->toXML($e); - } - - return $e; - } - - - /** - * Convert this Attribute to XML. - * - * @param DOMElement $parent The element we should append this Attribute to. - */ - public function toXML(DOMElement $parent) { - return $this->toXMLInternal($parent, SAML2_Const::NS_SAML, 'saml:Attribute'); - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/saml/AttributeValue.php b/inc/simplesamlphp/lib/SAML2/XML/saml/AttributeValue.php deleted file mode 100644 index bc89055..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/saml/AttributeValue.php +++ /dev/null @@ -1,99 +0,0 @@ -element = $doc->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeValue'); - $this->element->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:type', 'xs:string'); - $this->element->appendChild($doc->createTextNode($value)); - - /* Make sure that the xs-namespace is available in the AttributeValue (for xs:string). */ - $this->element->setAttributeNS(SAML2_Const::NS_XS, 'xs:tmp', 'tmp'); - $this->element->removeAttributeNS(SAML2_Const::NS_XS, 'tmp'); - - return; - } - - if ($value->namespaceURI === SAML2_Const::NS_SAML && $value->localName === 'AttributeValue') { - $this->element = SAML2_Utils::copyElement($value); - return; - } - - $doc = new DOMDocument(); - $this->element = $doc->createElementNS(SAML2_Const::NS_SAML, 'saml:AttributeValue'); - SAML2_Utils::copyElement($value, $this->element); - } - - - /** - * Append this attribute value to an element. - * - * @param DOMElement $parent The element we should append this attribute value to. - * @return DOMElement The generated AttributeValue element. - */ - public function toXML(DOMElement $parent) { - assert('$this->element instanceof DOMElement'); - assert('$this->element->namespaceURI === SAML2_Const::NS_SAML && $this->element->localName === "AttributeValue"'); - - $v = SAML2_Utils::copyElement($this->element, $parent); - - return $v; - } - - /* - * Returns a plain text content of the attribute value. - */ - public function getString() { - return $this->element->textContent; - } - - - /** - * Convert this attribute value to a string. - * - * If this element contains XML data, that data vil be encoded as a string and returned. - * - * @return string This attribute value. - */ - public function __toString() { - assert('$this->element instanceof DOMElement'); - - $doc = $this->element->ownerDocument; - - $ret = ''; - foreach ($this->element->childNodes as $c) { - $ret .= $doc->saveXML($c); - } - - return $ret; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/saml/NameID.php b/inc/simplesamlphp/lib/SAML2/XML/saml/NameID.php deleted file mode 100644 index b31a00c..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/saml/NameID.php +++ /dev/null @@ -1,125 +0,0 @@ -hasAttribute('SPNameQualifier')) { - $this->SPNameQualifier = $xml->getAttribute('SPNameQualifier'); - } - - if ($xml->hasAttribute('NameQualifier')) { - $this->NameQualifier = $xml->getAttribute('NameQualifier'); - } - - if ($xml->hasAttribute('Format')) { - $this->Format = $xml->getAttribute('Format'); - } - - if ($xml->hasAttribute('SPProvidedID')) { - $this->SPProvidedID = $xml->getAttribute('SPProvidedID'); - } - - $this->value = trim($xml->textContent); - } - - - /** - * Convert this NameID to XML. - * - * @param DOMElement|NULL $parent The element we should append to. - * @return DOMElement This AdditionalMetadataLocation-element. - */ - public function toXML(DOMElement $parent = NULL) { - assert('is_string($this->NameQualifier) || is_null($this->NameQualifier)'); - assert('is_string($this->SPNameQualifier) || is_null($this->SPNameQualifier)'); - assert('is_string($this->Format) || is_null($this->Format)'); - assert('is_string($this->SPProvidedID) || is_null($this->SPProvidedID)'); - assert('is_string($this->value)'); - - if ($parent === NULL) { - $parent = new DOMDocument(); - $doc = $parent; - } else { - $doc = $parent->ownerDocument; - } - $e = $doc->createElementNS(SAML2_Const::NS_SAML, 'saml:NameID'); - $parent->appendChild($e); - - if ($this->NameQualifier !== NULL) { - $e->setAttribute('NameQualifier', $this->NameQualifier); - } - - if ($this->SPNameQualifier !== NULL) { - $e->setAttribute('SPNameQualifier', $this->SPNameQualifier); - } - - if ($this->Format !== NULL) { - $e->setAttribute('Format', $this->Format); - } - - if ($this->SPProvidedID !== NULL) { - $e->setAttribute('SPProvidedID', $this->SPProvidedID); - } - - $t = $doc->createTextNode($this->value); - $e->appendChild($t); - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmation.php b/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmation.php deleted file mode 100644 index 857ee4b..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmation.php +++ /dev/null @@ -1,93 +0,0 @@ -hasAttribute('Method')) { - throw new Exception('SubjectConfirmation element without Method attribute.'); - } - $this->Method = $xml->getAttribute('Method'); - - $nid = SAML2_Utils::xpQuery($xml, './saml_assertion:NameID'); - if (count($nid) > 1) { - throw new Exception('More than one NameID in a SubjectConfirmation element.'); - } elseif (!empty($nid)) { - $this->NameID = new SAML2_XML_saml_NameID($nid[0]); - } - - $scd = SAML2_Utils::xpQuery($xml, './saml_assertion:SubjectConfirmationData'); - if (count($scd) > 1) { - throw new Exception('More than one SubjectConfirmationData child in a SubjectConfirmation element.'); - } elseif (!empty($scd)) { - $this->SubjectConfirmationData = new SAML2_XML_saml_SubjectConfirmationData($scd[0]); - } - } - - - /** - * Convert this element to XML. - * - * @param DOMElement $parent The parent element we should append this element to. - * @return DOMElement This element, as XML. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->Method)'); - assert('is_null($this->NameID) || $this->NameID instanceof SAML2_XML_saml_NameID'); - assert('is_null($this->SubjectConfirmationData) || $this->SubjectConfirmationData instanceof SAML2_XML_saml_SubjectConfirmationData'); - - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:SubjectConfirmation'); - $parent->appendChild($e); - - $e->setAttribute('Method', $this->Method); - - if (isset($this->NameID)) { - $this->NameID->toXML($e); - } - if (isset($this->SubjectConfirmationData)) { - $this->SubjectConfirmationData->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmationData.php b/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmationData.php deleted file mode 100644 index 1c28c65..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/saml/SubjectConfirmationData.php +++ /dev/null @@ -1,146 +0,0 @@ -hasAttribute('NotBefore')) { - $this->NotBefore = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('NotBefore')); - } - if ($xml->hasAttribute('NotOnOrAfter')) { - $this->NotOnOrAfter = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('NotOnOrAfter')); - } - if ($xml->hasAttribute('Recipient')) { - $this->Recipient = $xml->getAttribute('Recipient'); - } - if ($xml->hasAttribute('InResponseTo')) { - $this->InResponseTo = $xml->getAttribute('InResponseTo'); - } - if ($xml->hasAttribute('Address')) { - $this->Address = $xml->getAttribute('Address'); - } - for ($n = $xml->firstChild; $n !== NULL; $n = $n->nextSibling) { - if (!($n instanceof DOMElement)) { - continue; - } - if ($n->namespaceURI !== XMLSecurityDSig::XMLDSIGNS) { - $this->info[] = new SAML2_XML_Chunk($n); - continue; - } - switch ($n->localName) { - case 'KeyInfo': - $this->info[] = new SAML2_XML_ds_KeyInfo($n); - break; - default: - $this->info[] = new SAML2_XML_Chunk($n); - break; - } - } - } - - - /** - * Convert this element to XML. - * - * @param DOMElement $parent The parent element we should append this element to. - * @return DOMElement This element, as XML. - */ - public function toXML(DOMElement $parent) { - assert('is_null($this->NotBefore) || is_int($this->NotBefore)'); - assert('is_null($this->NotOnOrAfter) || is_int($this->NotOnOrAfter)'); - assert('is_null($this->Recipient) || is_string($this->Recipient)'); - assert('is_null($this->InResponseTo) || is_string($this->InResponseTo)'); - assert('is_null($this->Address) || is_string($this->Address)'); - - $e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_SAML, 'saml:SubjectConfirmationData'); - $parent->appendChild($e); - - if (isset($this->NotBefore)) { - $e->setAttribute('NotBefore', gmdate('Y-m-d\TH:i:s\Z', $this->NotBefore)); - } - if (isset($this->NotOnOrAfter)) { - $e->setAttribute('NotOnOrAfter', gmdate('Y-m-d\TH:i:s\Z', $this->NotOnOrAfter)); - } - if (isset($this->Recipient)) { - $e->setAttribute('Recipient', $this->Recipient); - } - if (isset($this->InResponseTo)) { - $e->setAttribute('InResponseTo', $this->InResponseTo); - } - if (isset($this->Address)) { - $e->setAttribute('Address', $this->Address); - } - foreach ($this->info as $n) { - $n->toXML($e); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/samlp/Extensions.php b/inc/simplesamlphp/lib/SAML2/XML/samlp/Extensions.php deleted file mode 100644 index ad86c3f..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/samlp/Extensions.php +++ /dev/null @@ -1,48 +0,0 @@ -ownerDocument->createElementNS(SAML2_Const::NS_SAMLP, 'samlp:Extensions'); - $parent->appendChild($extElement); - - foreach ($extensions as $ext) { - $ext->toXML($extElement); - } - } - -} diff --git a/inc/simplesamlphp/lib/SAML2/XML/shibmd/Scope.php b/inc/simplesamlphp/lib/SAML2/XML/shibmd/Scope.php deleted file mode 100644 index 9847546..0000000 --- a/inc/simplesamlphp/lib/SAML2/XML/shibmd/Scope.php +++ /dev/null @@ -1,74 +0,0 @@ -scope = $xml->textContent; - $this->regexp = SAML2_Utils::parseBoolean($xml, 'regexp', NULL); - } - - - /** - * Convert this Scope to XML. - * - * @param DOMElement $parent The element we should append this Scope to. - */ - public function toXML(DOMElement $parent) { - assert('is_string($this->scope)'); - assert('is_bool($this->regexp) || is_null($this->regexp)'); - - $doc = $parent->ownerDocument; - - $e = $doc->createElementNS(SAML2_XML_shibmd_Scope::NS, 'shibmd:Scope'); - $parent->appendChild($e); - - $e->appendChild($doc->createTextNode($this->scope)); - - if ($this->regexp === TRUE) { - $e->setAttribute('regexp', 'true'); - } elseif ($this->regexp === FALSE) { - $e->setAttribute('regexp', 'false'); - } - - return $e; - } - -} diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/BWC.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/BWC.php index 2866f11..8cf8d7c 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/BWC.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/BWC.php @@ -1,12 +1,19 @@ isset($params['isPassive']) ? $params['isPassive'] : FALSE, @@ -120,7 +130,7 @@ class SimpleSAML_Auth_BWC extends SimpleSAML_Auth_Simple { $config = SimpleSAML_Configuration::getInstance(); $authurl = '/' . $config->getBaseURL() . $this->auth; - SimpleSAML_Utilities::redirect($authurl, array( + SimpleSAML_Utilities::redirectTrustedURL($authurl, array( 'RelayState' => $relayState, 'AuthId' => $authId, 'protocol' => 'saml2', @@ -131,8 +141,9 @@ class SimpleSAML_Auth_BWC extends SimpleSAML_Auth_Simple { /** * Start a logout operation. * - * @param string|NULL $url The url the user should be redirected to after logging out. + * @param string|NULL $url The URL the user should be redirected to after logging out. * Defaults to the current page. + * @deprecated */ public function logout($url = NULL) { @@ -140,23 +151,22 @@ class SimpleSAML_Auth_BWC extends SimpleSAML_Auth_Simple { $url = SimpleSAML_Utilities::selfURL(); } - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if (!$session->isValid($this->authority)) { /* Not authenticated to this authentication source. */ - SimpleSAML_Utilities::redirect($url); + SimpleSAML_Utilities::redirectTrustedURL($url); assert('FALSE'); } if ($this->authority === 'saml2') { $config = SimpleSAML_Configuration::getInstance(); - SimpleSAML_Utilities::redirect('/' . $config->getBaseURL() . 'saml2/sp/initSLO.php', + SimpleSAML_Utilities::redirectTrustedURL('/' . $config->getBaseURL() . 'saml2/sp/initSLO.php', array('RelayState' => $url) ); } $session->doLogout($this->authority); - - SimpleSAML_Utilities::redirect($url); + SimpleSAML_Utilities::redirectTrustedURL($url); } } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/Default.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/Default.php index 2f22b3f..f577577 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/Default.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/Default.php @@ -8,7 +8,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Auth_Default { @@ -19,13 +18,21 @@ class SimpleSAML_Auth_Default { * This function never returns. * * @param string $authId The identifier of the authentication source. - * @param string|array $return The URL or function we should direct the user to after authentication. - * @param string|NULL $errorURL The URL we should direct the user to after failed authentication. - * Can be NULL, in which case a standard error page will be shown. - * @param array $params Extra information about the login. Different authentication requestors may - * provide different information. Optional, will default to an empty array. + * @param string|array $return The URL or function we should direct the + * user to after authentication. If using a URL obtained from user input, + * please make sure to check it by calling + * SimpleSAML_Utilities::checkURLAllowed(). + * @param string|NULL $errorURL The URL we should direct the user to after + * failed authentication. Can be NULL, in which case a standard error page + * will be shown. If using a URL obtained from user input, please make sure + * to check it by calling SimpleSAML_Utilities::checkURLAllowed(). + * @param array $params Extra information about the login. Different + * authentication requestors may provide different information. Optional, + * will default to an empty array. */ - public static function initLogin($authId, $return, $errorURL = NULL, array $params = array()) { + public static function initLogin($authId, $return, $errorURL = NULL, + array $params = array()) { + assert('is_string($authId)'); assert('is_string($return) || is_array($return)'); assert('is_string($errorURL) || is_null($errorURL)'); @@ -91,7 +98,7 @@ class SimpleSAML_Auth_Default { } /* Add those that should always be included. */ - foreach (array('Attributes', 'Expire', 'LogoutState', 'AuthnInstant') as $a) { + foreach (array('Attributes', 'Expire', 'LogoutState', 'AuthnInstant', 'RememberMe') as $a) { if (isset($state[$a])) { $persistentAuthState[$a] = $state[$a]; } @@ -116,12 +123,12 @@ class SimpleSAML_Auth_Default { $return = $state['SimpleSAML_Auth_Default.Return']; /* Save session state. */ - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->doLogin($state['SimpleSAML_Auth_Default.id'], self::extractPersistentAuthState($state)); if (is_string($return)) { /* Redirect... */ - SimpleSAML_Utilities::redirect($return); + SimpleSAML_Utilities::redirectTrustedURL($return); } else { call_user_func($return, $state); assert('FALSE'); @@ -132,17 +139,22 @@ class SimpleSAML_Auth_Default { /** * Start logout. * - * This function starts a logout operation from the current authentication source. This function - * will return if the logout operation does not require a redirect. + * This function starts a logout operation from the current authentication + * source. This function will return if the logout operation does not + * require a redirect. * - * @param string $returnURL The URL we should redirect the user to after logging out. - * @param string|NULL $authority The authentication source we are logging out from, or NULL to log out of the most recent. + * @param string $returnURL The URL we should redirect the user to after + * logging out. No checking is performed on the URL, so make sure to verify + * it on beforehand if the URL is obtained from user input. Refer to + * SimpleSAML_Utilities::checkURLAllowed() for more information. + * @param string|NULL $authority The authentication source we are logging + * out from, or NULL to log out from the most recent. */ public static function initLogoutReturn($returnURL, $authority = NULL) { assert('is_string($returnURL)'); assert('is_string($authority) || is_null($authority)'); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if ($authority === NULL) { $authority = $session->getAuthority(); @@ -171,11 +183,16 @@ class SimpleSAML_Auth_Default { /** * Start logout. * - * This function starts a logout operation from the current authentication source. This function - * never returns. + * This function starts a logout operation from the current authentication + * source. This function never returns. * - * @param string $returnURL The URL we should redirect the user to after logging out. - * @param string|NULL $authority The authentication source we are logging out from, or NULL to log out of the most recent. + * @param string $returnURL The URL we should redirect the user to after + * logging out. No checking is performed on the URL, so make sure to verify + * it on beforehand if the URL is obtained from user input. Refer to + * SimpleSAML_Utilities::checkURLAllowed() for more information. + * @param string|NULL $authority The authentication source we are logging + * out from, or NULL to log out from the most recent. + * @return void This function never returns. */ public static function initLogout($returnURL, $authority = NULL) { assert('is_string($returnURL)'); @@ -184,7 +201,7 @@ class SimpleSAML_Auth_Default { self::initLogoutReturn($returnURL, $authority); /* Redirect... */ - SimpleSAML_Utilities::redirect($returnURL); + SimpleSAML_Utilities::redirectTrustedURL($returnURL); } @@ -202,7 +219,7 @@ class SimpleSAML_Auth_Default { $returnURL = $state['SimpleSAML_Auth_Default.ReturnURL']; /* Redirect... */ - SimpleSAML_Utilities::redirect($returnURL); + SimpleSAML_Utilities::redirectTrustedURL($returnURL); } @@ -217,7 +234,7 @@ class SimpleSAML_Auth_Default { $source = $state['SimpleSAML_Auth_Default.logoutSource']; - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $authId = $session->getAuthority(); if ($authId !== $source) { @@ -239,21 +256,23 @@ class SimpleSAML_Auth_Default { * * This is used to handle IdP initiated SSO. * - * @param string $authId The id of the authentication source that received the request. - * @param array $state A state array. - * @param string $redirectTo The URL we should redirect the user to after - * updating the session. + * @param string $authId The id of the authentication source that received + * the request. + * @param array $state A state array. + * @param string $redirectTo The URL we should redirect the user to after + * updating the session. The function will check if the URL is allowed, so + * there is no need to manually check the URL on beforehand. Please refer + * to the 'trusted.url.domains' configuration directive for more + * information about allowing (or disallowing) URLs. */ public static function handleUnsolicitedAuth($authId, array $state, $redirectTo) { assert('is_string($authId)'); assert('is_string($redirectTo)'); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->doLogin($authId, self::extractPersistentAuthState($state)); - SimpleSAML_Utilities::redirect($redirectTo); + SimpleSAML_Utilities::redirectUntrustedURL($redirectTo); } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php index e1cc228..2a3370e 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/LDAP.php @@ -17,7 +17,6 @@ define('ERR_AS_ATTRIBUTE', 6); * @author Andreas Aakre Solberg, UNINETT AS. * @author Anders Lund, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Session.php 244 2008-02-04 08:36:24Z andreassolberg $ */ class SimpleSAML_Auth_LDAP { @@ -49,16 +48,18 @@ class SimpleSAML_Auth_LDAP { * @param bool $debug * @param int $timeout * @param int $port + * @param bool $referrals */ // TODO: Flesh out documentation. - public function __construct($hostname, $enable_tls = TRUE, $debug = FALSE, $timeout = 0, $port = 389) { + public function __construct($hostname, $enable_tls = TRUE, $debug = FALSE, $timeout = 0, $port = 389, $referrals = TRUE) { // Debug. SimpleSAML_Logger::debug('Library - LDAP __construct(): Setup LDAP with ' . 'host=\'' . $hostname . '\', tls=' . var_export($enable_tls, true) . ', debug=' . var_export($debug, true) . - ', timeout=' . var_export($timeout, true)); + ', timeout=' . var_export($timeout, true) . + ', referrals=' . var_export($referrals, true)); /* * Set debug level before calling connect. Note that this passes @@ -81,6 +82,10 @@ class SimpleSAML_Auth_LDAP { if (!@ldap_set_option($this->ldap, LDAP_OPT_PROTOCOL_VERSION, 3)) throw $this->makeException('Library - LDAP __construct(): Failed to set LDAP Protocol version (LDAP_OPT_PROTOCOL_VERSION) to 3', ERR_INTERNAL); + /* Set referral option */ + if (!@ldap_set_option($this->ldap, LDAP_OPT_REFERRALS, $referrals)) + throw $this->makeException('Library - LDAP __construct(): Failed to set LDAP Referrals (LDAP_OPT_REFERRALS) to '.$referrals, ERR_INTERNAL); + // Set timeouts, if supported. // (OpenLDAP 2.x.x or Netscape Directory SDK x.x needed). $this->timeout = $timeout; @@ -355,6 +360,25 @@ class SimpleSAML_Auth_LDAP { ); } + // parse each entry and process its attributes + for ($i = 0; $i < $results['count']; $i++) { + $entry = $results[$i]; + + // iterate over the attributes of the entry + for ($j = 0; $j < $entry['count']; $j++) { + $name = $entry[$j]; + $attribute = $entry[$name]; + + // decide whether to base64 encode or not + for ($k = 0; $k < $attribute['count']; $k++) { + // base64 encode binary attributes + if (strtolower($name) === 'jpegphoto' || strtolower($name) === 'objectguid') { + $results[$i][$name][$k] = base64_encode($attribute[$k]); + } + } + } + } + // Remove the count and return unset($results['count']); return $results; @@ -381,7 +405,7 @@ class SimpleSAML_Auth_LDAP { $authz_id = null; if ($sasl_args != NULL) { - if (!function_exists(ldap_sasl_bind)) { + if (!function_exists('ldap_sasl_bind')) { $ex_msg = 'Library - missing SASL support'; throw $this->makeException($ex_msg); } @@ -516,8 +540,8 @@ class SimpleSAML_Auth_LDAP { continue; } - // Base64 encode jpegPhoto. - if (strtolower($name) === 'jpegphoto') { + // Base64 encode binary attributes. + if (strtolower($name) === 'jpegphoto' || strtolower($name) === 'objectguid') { $values[] = base64_encode($value); } else $values[] = $value; diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php index 238b58f..cfb452e 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingChain.php @@ -9,7 +9,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Auth_ProcessingChain { @@ -162,7 +161,7 @@ class SimpleSAML_Auth_ProcessingChain { * This function will only return if processing completes. If processing requires showing * a page to the user, we will not be able to return from this function. There are two ways * this can be handled: - * - Redirect to an URL: We will redirect to the URL set in $state['ReturnURL']. + * - Redirect to a URL: We will redirect to the URL set in $state['ReturnURL']. * - Call a function: We will call the function set in $state['ReturnCall']. * * If an exception is thrown during processing, it should be handled by the caller of @@ -248,7 +247,7 @@ class SimpleSAML_Auth_ProcessingChain { * in $state['ReturnURL']. */ $id = SimpleSAML_Auth_State::saveState($state, self::COMPLETED_STAGE); - SimpleSAML_Utilities::redirect($state['ReturnURL'], array(self::AUTHPARAM => $id)); + SimpleSAML_Utilities::redirectTrustedURL($state['ReturnURL'], array(self::AUTHPARAM => $id)); } else { /* Pass the state to the function defined in $state['ReturnCall']. */ @@ -302,8 +301,11 @@ class SimpleSAML_Auth_ProcessingChain { /** * Retrieve a state which has finished processing. * - * @param string $id The identifier of the state. This can be found in the request parameter - * with index from SimpleSAML_Auth_ProcessingChain::AUTHPARAM. + * @param string $id The state identifier. This can be found in the + * SimpleSAML_Auth_ProcessingChain::AUTHPARAM request parameter. Please + * make sure to sanitize it properly by calling the + * SimpleSAML_Utilities::checkURLAllowed() function with the embedded + * restart URL, if any. See also SimpleSAML_Utilities::parseStateID(). */ public static function fetchProcessedState($id) { assert('is_string($id)'); @@ -351,5 +353,3 @@ class SimpleSAML_Auth_ProcessingChain { } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php index a9d42ac..4e4664e 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/ProcessingFilter.php @@ -17,7 +17,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_Auth_ProcessingFilter { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/Simple.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/Simple.php index 0041ddd..26f702c 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/Simple.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/Simple.php @@ -4,7 +4,6 @@ * Helper class for simple authentication applications. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Auth_Simple { @@ -48,7 +47,7 @@ class SimpleSAML_Auth_Simple { * @return bool TRUE if the user is authenticated, FALSE if not. */ public function isAuthenticated() { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->isValid($this->authSource); } @@ -70,7 +69,7 @@ class SimpleSAML_Auth_Simple { */ public function requireAuth(array $params = array()) { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if ($session->isValid($this->authSource)) { /* Already authenticated. */ @@ -89,7 +88,7 @@ class SimpleSAML_Auth_Simple { * This function accepts an array $params, which controls some parts of * the authentication. The accepted parameters depends on the authentication * source being used. Some parameters are generic: - * - 'ErrorURL': An URL that should receive errors from the authentication. + * - 'ErrorURL': A URL that should receive errors from the authentication. * - 'KeepPost': If the current request is a POST request, keep the POST * data until after the authentication. * - 'ReturnTo': The URL the user should be returned to after authentication. @@ -127,7 +126,7 @@ class SimpleSAML_Auth_Simple { if (!isset($params[SimpleSAML_Auth_State::RESTART]) && is_string($returnTo)) { /* - * An URL to restart the authentication, in case the user bookmarks + * A URL to restart the authentication, in case the user bookmarks * something, e.g. the discovery service page. */ $restartURL = $this->getLoginURL($returnTo); @@ -152,7 +151,7 @@ class SimpleSAML_Auth_Simple { * - 'ReturnStateParam': The parameter we should return the state in when redirecting. * - 'ReturnStateStage': The stage the state array should be saved with. * - * @param string|array|NULL $params Either the url the user should be redirected to after logging out, + * @param string|array|NULL $params Either the URL the user should be redirected to after logging out, * or an array with parameters for the logout. If this parameter is * NULL, we will return to the current page. */ @@ -176,7 +175,7 @@ class SimpleSAML_Auth_Simple { assert('isset($params["ReturnStateParam"]) && isset($params["ReturnStateStage"])'); } - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if ($session->isValid($this->authSource)) { $state = $session->getAuthData($this->authSource, 'LogoutState'); if ($state !== NULL) { @@ -219,7 +218,7 @@ class SimpleSAML_Auth_Simple { $params[$state['ReturnStateParam']] = $stateID; } - SimpleSAML_Utilities::redirect($state['ReturnTo'], $params); + SimpleSAML_Utilities::redirectTrustedURL($state['ReturnTo'], $params); } } @@ -241,7 +240,7 @@ class SimpleSAML_Auth_Simple { } /* Authenticated. */ - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->getAuthData($this->authSource, 'Attributes'); } @@ -249,7 +248,7 @@ class SimpleSAML_Auth_Simple { /** * Retrieve authentication data. * - * @param string $name The name of the parameter, e.g. 'Attribute', 'Expire' or 'saml:sp:IdP'. + * @param string $name The name of the parameter, e.g. 'Attributes', 'Expire' or 'saml:sp:IdP'. * @return mixed|NULL The value of the parameter, or NULL if it isn't found or we are unauthenticated. */ public function getAuthData($name) { @@ -259,7 +258,7 @@ class SimpleSAML_Auth_Simple { return NULL; } - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->getAuthData($this->authSource, $name); } @@ -275,19 +274,17 @@ class SimpleSAML_Auth_Simple { return NULL; } - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->getAuthState($this->authSource); } /** - * Retrieve an URL that can be used to log the user in. + * Retrieve a URL that can be used to log the user in. * - * @param string|NULL $returnTo - * The page the user should be returned to afterwards. If this parameter - * is NULL, the user will be returned to the current page. - * @return string - * An URL which is suitable for use in link-elements. + * @param string|NULL $returnTo The page the user should be returned to afterwards. + * If this parameter is NULL, the user will be returned to the current page. + * @return string A URL which is suitable for use in link-elements. */ public function getLoginURL($returnTo = NULL) { assert('is_null($returnTo) || is_string($returnTo)'); @@ -306,13 +303,11 @@ class SimpleSAML_Auth_Simple { /** - * Retrieve an URL that can be used to log the user out. + * Retrieve a URL that can be used to log the user out. * - * @param string|NULL $returnTo - * The page the user should be returned to afterwards. If this parameter - * is NULL, the user will be returned to the current page. - * @return string - * An URL which is suitable for use in link-elements. + * @param string|NULL $returnTo The page the user should be returned to afterwards. + * If this parameter is NULL, the user will be returned to the current page. + * @return string A URL which is suitable for use in link-elements. */ public function getLogoutURL($returnTo = NULL) { assert('is_null($returnTo) || is_string($returnTo)'); diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/Source.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/Source.php index 358cd17..f6da3e0 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/Source.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/Source.php @@ -7,7 +7,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_Auth_Source { @@ -56,7 +55,7 @@ abstract class SimpleSAML_Auth_Source { $source = $config->getArray($id); if (!array_key_exists(0, $source) || !is_string($source[0])) { - throw new Exception('Invalid authentication source \'' . $authId . + throw new Exception('Invalid authentication source \'' . $id . '\': First element must be a string which identifies the authentication source.'); } @@ -111,7 +110,7 @@ abstract class SimpleSAML_Auth_Source { assert('isset($state["ReturnCallback"])'); /* The default implementation just copies over the previous authentication data. */ - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $data = $session->getAuthState($this->authId); foreach ($data as $k => $v) { $state[$k] = $v; @@ -294,7 +293,7 @@ abstract class SimpleSAML_Auth_Source { ); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->setData('SimpleSAML_Auth_Source.LogoutCallbacks', $id, $data, SimpleSAML_Session::DATA_TIMEOUT_LOGOUT); } @@ -315,7 +314,7 @@ abstract class SimpleSAML_Auth_Source { $id = strlen($this->authId) . ':' . $this->authId . $assoc; - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $data = $session->getData('SimpleSAML_Auth_Source.LogoutCallbacks', $id); if ($data === NULL) { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Auth/State.php b/inc/simplesamlphp/lib/SimpleSAML/Auth/State.php index 5eb1b55..3aec571 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Auth/State.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Auth/State.php @@ -26,7 +26,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Auth_State { @@ -160,7 +159,7 @@ class SimpleSAML_Auth_State { /* Save state. */ $serializedState = serialize($state); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->setData('SimpleSAML_Auth_State', $id, $serializedState, self::getStateTimeout()); SimpleSAML_Logger::debug('Saved state: ' . var_export($return, TRUE)); @@ -211,16 +210,10 @@ class SimpleSAML_Auth_State { assert('is_bool($allowMissing)'); SimpleSAML_Logger::debug('Loading state: ' . var_export($id, TRUE)); - $tmp = explode(':', $id, 2); - $id = $tmp[0]; - if (count($tmp) === 2) { - $restartURL = $tmp[1]; - } else { - $restartURL = NULL; - } + $sid = SimpleSAML_Utilities::parseStateID($id); - $session = SimpleSAML_Session::getInstance(); - $state = $session->getData('SimpleSAML_Auth_State', $id); + $session = SimpleSAML_Session::getSessionFromRequest(); + $state = $session->getData('SimpleSAML_Auth_State', $sid['id']); if ($state === NULL) { /* Could not find saved data. */ @@ -228,11 +221,11 @@ class SimpleSAML_Auth_State { return NULL; } - if ($restartURL === NULL) { + if ($sid['url'] === NULL) { throw new SimpleSAML_Error_NoState(); } - SimpleSAML_Utilities::redirect($restartURL); + SimpleSAML_Utilities::redirectTrustedURL($sid['url']); } $state = unserialize($state); @@ -248,15 +241,15 @@ class SimpleSAML_Auth_State { */ $msg = 'Wrong stage in state. Was \'' . $state[self::STAGE] . - '\', shoud be \'' . $stage . '\'.'; + '\', should be \'' . $stage . '\'.'; SimpleSAML_Logger::warning($msg); - if ($restartURL === NULL) { + if ($sid['url'] === NULL) { throw new Exception($msg); } - SimpleSAML_Utilities::redirect($restartURL); + SimpleSAML_Utilities::redirectTrustedURL($sid['url']); } return $state; @@ -280,7 +273,7 @@ class SimpleSAML_Auth_State { SimpleSAML_Logger::debug('Deleting state: ' . var_export($state[self::ID], TRUE)); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->deleteData('SimpleSAML_Auth_State', $state[self::ID]); } @@ -301,7 +294,7 @@ class SimpleSAML_Auth_State { $id = self::saveState($state, self::EXCEPTION_STAGE); /* Redirect to the exception handler. */ - SimpleSAML_Utilities::redirect($state[self::EXCEPTION_HANDLER_URL], array(self::EXCEPTION_PARAM => $id)); + SimpleSAML_Utilities::redirectTrustedURL($state[self::EXCEPTION_HANDLER_URL], array(self::EXCEPTION_PARAM => $id)); } elseif (array_key_exists(self::EXCEPTION_HANDLER_FUNC, $state)) { /* Call the exception handler. */ diff --git a/inc/simplesamlphp/lib/SimpleSAML/AuthMemCookie.php b/inc/simplesamlphp/lib/SimpleSAML/AuthMemCookie.php index 46b70fa..2ce0b74 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/AuthMemCookie.php +++ b/inc/simplesamlphp/lib/SimpleSAML/AuthMemCookie.php @@ -6,7 +6,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_AuthMemCookie { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php b/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php index 9d7a6d4..4eda10b 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/Artifact.php @@ -4,7 +4,6 @@ * Implementation of the Shibboleth 1.3 Artifact binding. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Bindings_Shib13_Artifact { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php b/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php index 7bb0253..9452060 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Bindings/Shib13/HTTPPost.php @@ -5,7 +5,6 @@ * * @author Andreas kre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: HTTPPost.php 2542 2010-09-10 13:14:09Z olavmrk $ */ class SimpleSAML_Bindings_Shib13_HTTPPost { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Configuration.php b/inc/simplesamlphp/lib/SimpleSAML/Configuration.php index da0a73c..ea5c944 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Configuration.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Configuration.php @@ -5,7 +5,6 @@ * * @author Andreas Aakre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Configuration.php 3176 2012-09-25 10:15:16Z jaimepc@gmail.com $ */ class SimpleSAML_Configuration { @@ -279,11 +278,6 @@ class SimpleSAML_Configuration { $dir = dirname($this->filename); - if ($instancename === 'simplesaml') { - /* For backwards compatibility. */ - self::setConfigDir($path, 'simplesaml'); - } - self::$instance[$instancename] = self::loadFromFile($dir . '/' . $filename, TRUE); return self::$instance[$instancename]; } @@ -295,7 +289,7 @@ class SimpleSAML_Configuration { * @return string */ public function getVersion() { - return '1.10.0'; + return '1.13.2'; } @@ -983,6 +977,36 @@ class SimpleSAML_Configuration { } + /** + * Find an endpoint of the given type, using a list of supported bindings as a way to prioritize. + * + * @param string $endpointType The endpoint type. + * @param array $bindings Sorted array of acceptable bindings. + * @param mixed $default The default value to return if no matching endpoint is found. If no default is provided, an exception will be thrown. + * @return array|NULL The default endpoint, or NULL if no acceptable endpoints are used. + */ + public function getEndpointPrioritizedByBinding($endpointType, array $bindings, $default = self::REQUIRED_OPTION) { + assert('is_string($endpointType)'); + + $endpoints = $this->getEndpoints($endpointType); + + foreach ($bindings as $binding) { + foreach ($endpoints as $ep) { + if ($ep['Binding'] === $binding) { + return $ep; + } + } + } + + if ($default === self::REQUIRED_OPTION) { + $loc = $this->location . '[' . var_export($endpointType, TRUE) . ']:'; + throw new Exception($loc . 'Could not find a supported ' . $endpointType . ' endpoint.'); + } + + return $default; + } + + /** * Find the default endpoint of the given type. * @@ -995,6 +1019,7 @@ class SimpleSAML_Configuration { assert('is_string($endpointType)'); $endpoints = $this->getEndpoints($endpointType); + $defaultEndpoint = SimpleSAML_Utilities::getDefaultEndpoint($endpoints, $bindings); if ($defaultEndpoint !== NULL) { return $defaultEndpoint; diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/Assertion.php b/inc/simplesamlphp/lib/SimpleSAML/Error/Assertion.php index 10bb386..a1b88df 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/Assertion.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/Assertion.php @@ -5,7 +5,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_Assertion extends SimpleSAML_Error_Exception { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php b/inc/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php index 7df5cad..efcd5f5 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/AuthSource.php @@ -3,7 +3,6 @@ * Baseclass for auth source exceptions. * * @package simpleSAMLphp_base - * @version $Id$ * */ class SimpleSAML_Error_AuthSource extends SimpleSAML_Error_Error { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php b/inc/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php index f7dabdb..53968c9 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/BadRequest.php @@ -8,7 +8,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_BadRequest extends SimpleSAML_Error_Error { @@ -29,6 +28,7 @@ class SimpleSAML_Error_BadRequest extends SimpleSAML_Error_Error { $this->reason = $reason; parent::__construct(array('BADREQUEST', '%REASON%' => $this->reason)); + $this->httpCode = 400; } @@ -41,16 +41,4 @@ class SimpleSAML_Error_BadRequest extends SimpleSAML_Error_Error { return $this->reason; } - - /** - * Set the HTTP return code for this error. - * - * This should be overridden by subclasses who want a different return code than 500 Internal Server Error. - */ - protected function setHTTPCode() { - header('HTTP/1.0 400 Bad Request'); - } - } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/BadUserInnput.php b/inc/simplesamlphp/lib/SimpleSAML/Error/BadUserInnput.php index 69bda7c..40891e8 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/BadUserInnput.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/BadUserInnput.php @@ -4,7 +4,6 @@ * * @author Thomas Graff * @package simpleSAMLphp_base - * @version $Id$ * */ class SimpleSAML_Error_BadUserInnput extends SimpleSAML_Error_User{ diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/Error.php b/inc/simplesamlphp/lib/SimpleSAML/Error/Error.php index 3772f88..bc10ff1 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/Error.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/Error.php @@ -5,7 +5,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { @@ -18,6 +17,14 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { private $errorCode; + /** + * The http code. + * + * @var integer + */ + protected $httpCode = 500; + + /** * The error title tag in dictionary. * @@ -68,7 +75,7 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { * @param mixed $errorCode One of the error codes defined in the errors dictionary. * @param Exception $cause The exception which caused this fatal error (if any). */ - public function __construct($errorCode, Exception $cause = NULL) { + public function __construct($errorCode, Exception $cause = NULL, $httpCode = NULL) { assert('is_string($errorCode) || is_array($errorCode)'); if (is_array($errorCode)) { @@ -80,6 +87,10 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { $this->errorCode = $errorCode; } + if (isset($httpCode)) { + $this->httpCode = $httpCode; + } + $moduleCode = explode(':', $this->errorCode, 2); if (count($moduleCode) === 2) { $this->module = $moduleCode[0]; @@ -153,7 +164,30 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { * This should be overridden by subclasses who want a different return code than 500 Internal Server Error. */ protected function setHTTPCode() { - header('HTTP/1.0 500 Internal Server Error'); + // Some mostly used HTTP codes. + $httpCodesMap = array( + 400 => 'HTTP/1.0 400 Bad Request', + 403 => 'HTTP/1.0 403 Forbidden', + 404 => 'HTTP/1.0 404 Not Found', + 405 => 'HTTP/1.0 405 Method Not Allowed', + 500 => 'HTTP/1.0 500 Internal Server Error', + 501 => 'HTTP/1.0 501 Method Not Implemented', + 503 => 'HTTP/1.0 503 Service Temporarily Unavailable', + ); + + $httpCode = $this->httpCode; + + if (function_exists('http_response_code')) { + http_response_code($httpCode); + return; + } + + if (!array_key_exists($this->httpCode, $httpCodesMap)) { + $httpCode = 500; + SimpleSAML_Logger::warning('HTTP response code not defined: ' . var_export($this->httpCode, TRUE)); + } + + header($httpCodesMap[$httpCode]); } @@ -172,7 +206,7 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { SimpleSAML_Logger::error('Error report with id ' . $reportId . ' generated.'); $config = SimpleSAML_Configuration::getInstance(); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if (isset($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; @@ -228,13 +262,14 @@ class SimpleSAML_Error_Error extends SimpleSAML_Error_Exception { $data['includeTemplate'] = $this->includeTemplate; /* Check if there is a valid technical contact email address. */ - if($config->getString('technicalcontact_email', 'na@example.org') !== 'na@example.org') { + if($config->getBoolean('errorreporting', TRUE) && + $config->getString('technicalcontact_email', 'na@example.org') !== 'na@example.org') { /* Enable error reporting. */ $baseurl = SimpleSAML_Utilities::getBaseURL(); $data['errorReportAddress'] = $baseurl . 'errorreport.php'; } - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $attributes = $session->getAttributes(); if (is_array($attributes) && array_key_exists('mail', $attributes) && count($attributes['mail']) > 0) { $data['email'] = $attributes['mail'][0]; diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/Exception.php b/inc/simplesamlphp/lib/SimpleSAML/Error/Exception.php index 6e0da80..b0dca28 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/Exception.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/Exception.php @@ -7,7 +7,6 @@ * * @author Thomas Graff * @package simpleSAMLphp_base - * @version $Id$ */ class SimpleSAML_Error_Exception extends Exception { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php b/inc/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php index f8e2bfb..9b2160a 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/InvalidCredential.php @@ -4,7 +4,6 @@ * * @author Thomas Graff * @package simpleSAMLphp_base - * @version $Id$ * */ class SimpleSAML_Error_InvalidCredential extends SimpleSAML_Error_User{ diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php b/inc/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php index 940b914..a0dbc5c 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/MetadataNotFound.php @@ -4,7 +4,6 @@ * Error for missing metadata. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_MetadataNotFound extends SimpleSAML_Error_Error { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/NoState.php b/inc/simplesamlphp/lib/SimpleSAML/Error/NoState.php index 903840d..9452446 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/NoState.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/NoState.php @@ -5,7 +5,6 @@ * that we don't know what to do. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_NoState extends SimpleSAML_Error_Error { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/NotFound.php b/inc/simplesamlphp/lib/SimpleSAML/Error/NotFound.php index fd24067..cb868e8 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/NotFound.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/NotFound.php @@ -8,7 +8,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_NotFound extends SimpleSAML_Error_Error { @@ -37,6 +36,7 @@ class SimpleSAML_Error_NotFound extends SimpleSAML_Error_Error { } $this->reason = $reason; + $this->httpCode = 404; } @@ -49,16 +49,4 @@ class SimpleSAML_Error_NotFound extends SimpleSAML_Error_Error { return $this->reason; } - - /** - * Set the HTTP return code for this error. - * - * This should be overridden by subclasses who want a different return code than 500 Internal Server Error. - */ - protected function setHTTPCode() { - header('HTTP/1.0 404 Not Found'); - } - } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php b/inc/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php index bbe0a27..56db221 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/UnserializableException.php @@ -11,7 +11,6 @@ * of the original exception. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_UnserializableException extends SimpleSAML_Error_Exception { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/User.php b/inc/simplesamlphp/lib/SimpleSAML/Error/User.php index 1c7c7a6..e46c7c6 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/User.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/User.php @@ -6,7 +6,6 @@ * * @author Thomas Graff * @package simpleSAMLphp_base - * @version $Id$ * */ class SimpleSAML_Error_User extends SimpleSAML_Error_Exception{ diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php b/inc/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php index 14df771..9ec418e 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/UserAborted.php @@ -4,7 +4,6 @@ * Exception indicating user aborting the authentication process. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Error_UserAborted extends SimpleSAML_Error_Error { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php b/inc/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php index 85c09c7..557fdc3 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Error/UserNotFound.php @@ -5,7 +5,6 @@ * * @author Thomas Graff * @package simpleSAMLphp_base - * @version $Id$ * */ class SimpleSAML_Error_UserNotFound extends SimpleSAML_Error_User{ diff --git a/inc/simplesamlphp/lib/SimpleSAML/IdP.php b/inc/simplesamlphp/lib/SimpleSAML/IdP.php index de19898..5a20159 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/IdP.php +++ b/inc/simplesamlphp/lib/SimpleSAML/IdP.php @@ -6,7 +6,6 @@ * This class implements the various functions used by IdP. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_IdP { @@ -211,7 +210,7 @@ class SimpleSAML_IdP { $association['core:IdP'] = $this->id; - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->addAssociation($this->associationGroup, $association); } @@ -223,7 +222,7 @@ class SimpleSAML_IdP { */ public function getAssociations() { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->getAssociations($this->associationGroup); } @@ -236,7 +235,7 @@ class SimpleSAML_IdP { public function terminateAssociation($assocId) { assert('is_string($assocId)'); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->terminateAssociation($this->associationGroup, $assocId); } @@ -260,7 +259,7 @@ class SimpleSAML_IdP { assert('is_callable($state["Responder"])'); if (isset($state['core:SP'])) { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->setData('core:idp-ssotime', $state['core:IdP'] . ';' . $state['core:SP'], time(), SimpleSAML_Session::DATA_TIMEOUT_LOGOUT); } @@ -292,7 +291,7 @@ class SimpleSAML_IdP { } if (isset($state['core:SP'])) { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $previousSSOTime = $session->getData('core:idp-ssotime', $state['core:IdP'] . ';' . $state['core:SP']); if ($previousSSOTime !== NULL) { $state['PreviousSSOTimestamp'] = $previousSSOTime; @@ -379,8 +378,6 @@ class SimpleSAML_IdP { if (isset($state['ForceAuthn']) && (bool)$state['ForceAuthn']) { /* Force authentication is in effect. */ $needAuth = TRUE; - } elseif (isset($state['saml:IDPList']) && sizeof($state['saml:IDPList']) > 0) { - $needAuth = !in_array($this->authSource->getAuthData('saml:sp:IdP'), $state['saml:IDPList'], TRUE); } else { $needAuth = !$this->isAuthenticated(); } @@ -500,7 +497,7 @@ class SimpleSAML_IdP { /** - * Log out, then redirect to an URL. + * Log out, then redirect to a URL. * * This function never returns. * @@ -520,7 +517,7 @@ class SimpleSAML_IdP { /** - * Redirect to an URL after logout. + * Redirect to a URL after logout. * * This function never returns. * @@ -529,7 +526,7 @@ class SimpleSAML_IdP { public static function finishLogoutRedirect(SimpleSAML_IdP $idp, array $state) { assert('isset($state["core:Logout:URL"])'); - SimpleSAML_Utilities::redirect($state['core:Logout:URL']); + SimpleSAML_Utilities::redirectTrustedURL($state['core:Logout:URL']); assert('FALSE'); } diff --git a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandler.php b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandler.php index 60a5349..b3e3317 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandler.php +++ b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutHandler.php @@ -4,7 +4,6 @@ * Base class for logout handlers. * * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_IdP_LogoutHandler { diff --git a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutIFrame.php b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutIFrame.php index 094c1a4..44c3b3d 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutIFrame.php +++ b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutIFrame.php @@ -4,7 +4,6 @@ * Class which handles iframe logout. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_IdP_LogoutIFrame extends SimpleSAML_IdP_LogoutHandler { @@ -49,7 +48,7 @@ class SimpleSAML_IdP_LogoutIFrame extends SimpleSAML_IdP_LogoutHandler { } $url = SimpleSAML_Module::getModuleURL('core/idp/logout-iframe.php', $params); - SimpleSAML_Utilities::redirect($url); + SimpleSAML_Utilities::redirectTrustedURL($url); } diff --git a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutTraditional.php b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutTraditional.php index 5a48466..1a43252 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutTraditional.php +++ b/inc/simplesamlphp/lib/SimpleSAML/IdP/LogoutTraditional.php @@ -4,7 +4,6 @@ * Class which handles traditional logout. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler { @@ -30,7 +29,7 @@ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler { try { $idp = SimpleSAML_IdP::getByState($association); $url = call_user_func(array($association['Handler'], 'getLogoutURL'), $idp, $association, $relayState); - SimpleSAML_Utilities::redirect($url); + SimpleSAML_Utilities::redirectTrustedURL($url); } catch (Exception $e) { SimpleSAML_Logger::warning('Unable to initialize logout to ' . var_export($id, TRUE) . '.'); $this->idp->terminateAssociation($id); @@ -76,6 +75,12 @@ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler { throw new SimpleSAML_Error_Exception('RelayState lost during logout.'); } + // sanitize the input + $sid = SimpleSAML_Utilities::parseStateID($relayState); + if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); + } + $state = SimpleSAML_Auth_State::loadState($relayState, 'core:LogoutTraditional'); if ($error === NULL) { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Logger.php b/inc/simplesamlphp/lib/SimpleSAML/Logger.php index 01334f8..40c7980 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Logger.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Logger.php @@ -1,7 +1,7 @@ @@ -9,220 +9,307 @@ * @version $ID$ */ -interface SimpleSAML_Logger_LoggingHandler { - function log_internal($level,$string); -} - -class SimpleSAML_Logger { - private static $loggingHandler = null; - private static $logLevel = null; - - private static $captureLog = FALSE; - private static $capturedLog = array(); - - /** - * Array with log messages from before we - * initialized the logging handler. - * - * @var array - */ - private static $earlyLog = array(); - - - /** - * This constant defines the string we set the trackid to while we are fetching the - * trackid from the session class. This is used to prevent infinite recursion. - */ - private static $TRACKID_FETCHING = '_NOTRACKIDYET_'; - - /** - * This variable holds the trackid we have retrieved from the session class. - * It can also hold NULL, in which case we haven't fetched the trackid yet, or - * TRACKID_FETCHING, which means that we are fetching the trackid now. - */ - private static $trackid = null; - -/* - * LOG_ERR No statistics, only errors - * LOG_WARNING No statistics, only warnings/errors - * LOG_NOTICE Statistics and errors - * LOG_INFO Verbose logs - * LOG_DEBUG Full debug logs - not reccomended for production - -*/ - const EMERG = 0; - const ALERT = 1; - const CRIT = 2; - const ERR = 3; - const WARNING = 4; - const NOTICE = 5; - const INFO = 6; - const DEBUG = 7; - - static function emergency($string) { - self::log_internal(self::EMERG,$string); - } - - static function critical($string) { - self::log_internal(self::CRIT,$string); - } - - static function alert($string) { - self::log_internal(self::ALERT,$string); - } - - static function error($string) { - self::log_internal(self::ERR,$string); - } - - static function warning($string) { - self::log_internal(self::WARNING,$string); - } - - /** - * We reserve the notice level for statistics, so do not use - * this level for other kind of log messages. - */ - static function notice($string) { - self::log_internal(self::NOTICE,$string); - } - - /** - * Info messages is abit less verbose than debug messages. This is useful - * for tracing a session. - */ - static function info($string) { - self::log_internal(self::INFO,$string); - } - - /** - * Debug messages is very verbose, and will contain more inforation than - * what is neccessary for a production system. - */ - static function debug($string) { - self::log_internal(self::DEBUG,$string); - } - - /** - * Statisitics - */ - static function stats($string) { - self::log_internal(self::NOTICE,$string,true); - } - - - - public static function createLoggingHandler() { - - /* Set to FALSE to indicate that it is being initialized. */ - self::$loggingHandler = FALSE; - - /* Get the configuration. */ - $config = SimpleSAML_Configuration::getInstance(); - assert($config instanceof SimpleSAML_Configuration); - - /* Get the metadata handler option from the configuration. */ - $handler = $config->getString('logging.handler', 'syslog'); - - /* - * setting minimum log_level - */ - self::$logLevel = $config->getInteger('logging.level',self::INFO); - - $handler = strtolower($handler); - - if($handler === 'syslog') { - $sh = new SimpleSAML_Logger_LoggingHandlerSyslog(); - - } elseif ($handler === 'file') { - $sh = new SimpleSAML_Logger_LoggingHandlerFile(); - } elseif ($handler === 'errorlog') { - $sh = new SimpleSAML_Logger_LoggingHandlerErrorLog(); - } else { - throw new Exception('Invalid value for the [logging.handler] configuration option. Unknown handler: ' . $handler); - } - /* Set the session handler. */ - self::$loggingHandler = $sh; - } - - public static function setCaptureLog($val = TRUE) { - self::$captureLog = $val; - } - - public static function getCapturedLog() { - return self::$capturedLog; - } - - static function log_internal($level,$string,$statsLog = false) { - if (self::$loggingHandler === NULL) { - /* Initialize logging. */ - self::createLoggingHandler(); - - if (!empty(self::$earlyLog)) { - error_log('----------------------------------------------------------------------'); - /* Output messages which were logged before we initialized to the proper log. */ - foreach (self::$earlyLog as $msg) { - self::log_internal($msg['level'], $msg['string'], $msg['statsLog']); - } - } - - } elseif (self::$loggingHandler === FALSE) { - /* Some error occurred while initializing logging. */ - if (empty(self::$earlyLog)) { - /* This is the first message. */ - error_log('--- Log message(s) while initializing logging ------------------------'); - } - error_log($string); - - self::$earlyLog[] = array('level' => $level, 'string' => $string, 'statsLog' => $statsLog); - return; - } - - - if (self::$captureLog) { - $ts = microtime(TRUE); - $msecs = (int)(($ts - (int)$ts) * 1000); - $ts = GMdate('H:i:s', $ts) . sprintf('.%03d', $msecs) . 'Z'; - self::$capturedLog[] = $ts . ' ' . $string; - } - - if (self::$logLevel >= $level || $statsLog) { - if (is_array($string)) $string = implode(",",$string); - $string = '['.self::getTrackId().'] '.$string; - if ($statsLog) $string = 'STAT '.$string; - self::$loggingHandler->log_internal($level,$string); - } - } - - - /** - * Retrieve the trackid we should use for logging. - * - * It is used to avoid infinite recursion between the logger class and the session class. - * - * @return The trackid we should use for logging, or 'NA' if we detect recursion. - */ - private static function getTrackId() { - - if(self::$trackid === self::$TRACKID_FETCHING) { - /* Recursion detected. */ - return 'NA'; - } - - if(self::$trackid === NULL) { - /* No trackid yet, fetch it from the session class. */ - - /* Mark it as currently being fetched. */ - self::$trackid = self::$TRACKID_FETCHING; - - /* Get the current session. This could cause recursion back to the logger class. */ - $session = SimpleSAML_Session::getInstance(); - - /* Update the trackid. */ - self::$trackid = $session->getTrackId(); - } - - assert('is_string(self::$trackid)'); - return self::$trackid; - } +class SimpleSAML_Logger +{ + private static $loggingHandler = NULL; + private static $logLevel = NULL; + private static $captureLog = FALSE; + private static $capturedLog = array(); + + /** + * Array with messages logged before the logging handler was initialized. + * + * @var array + */ + private static $earlyLog = array(); + + + /** + * This constant defines the string we set the track ID to while we are fetching the track ID from the session + * class. This is used to prevent infinite recursion. + */ + private static $TRACKID_FETCHING = '_NOTRACKIDYET_'; + + /** + * This variable holds the track ID we have retrieved from the session class. It can also be NULL, in which case + * we haven't fetched the track ID yet, or TRACKID_FETCHING, which means that we are fetching the track ID now. + */ + private static $trackid = NULL; + + /** + * This variable holds the format used to log any message. Its use varies depending on the log handler used (for + * instance, you cannot control here how dates are displayed when using syslog or errorlog handlers), but in + * general the options are: + * + * - %date{}: the date and time, with its format specified inside the brackets. See the PHP documentation + * of the strftime() function for more information on the format. If the brackets are omitted, the standard + * format is applied. This can be useful if you just want to control the placement of the date, but don't care + * about the format. + * + * - %process: the name of the SimpleSAMLphp process. Remember you can configure this in the 'logging.processname' + * option. + * + * - %level: the log level (name or number depending on the handler used). + * + * - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind + * the trailing space). + * + * - %trackid: the track ID, an identifier that allows you to track a single session. + * + * - %srcip: the IP address of the client. If you are behind a proxy, make sure to modify the + * $_SERVER['REMOTE_ADDR'] variable on your code accordingly to the X-Forwarded-For header. + * + * - %msg: the message to be logged. + * + * @var string The format of the log line. + */ + private static $format = '%date{%b %d %H:%M:%S} %process %level %stat[%trackid] %msg'; + + const EMERG = 0; + const ALERT = 1; + const CRIT = 2; + const ERR = 3; + const WARNING = 4; + const NOTICE = 5; + const INFO = 6; + const DEBUG = 7; + + + /** + * Log an emergency message. + * + * @var string $string The message to log. + */ + public static function emergency($string) + { + self::log(self::EMERG, $string); + } + + + /** + * Log a critical message. + * + * @var string $string The message to log. + */ + public static function critical($string) + { + self::log(self::CRIT, $string); + } + + + /** + * Log an alert. + * + * @var string $string The message to log. + */ + public static function alert($string) + { + self::log(self::ALERT, $string); + } + + + /** + * Log an error. + * + * @var string $string The message to log. + */ + public static function error($string) + { + self::log(self::ERR, $string); + } + + + /** + * Log a warning. + * + * @var string $string The message to log. + */ + public static function warning($string) + { + self::log(self::WARNING, $string); + } + + /** + * We reserve the notice level for statistics, so do not use this level for other kind of log messages. + * + * @var string $string The message to log. + */ + public static function notice($string) + { + self::log(self::NOTICE, $string); + } + + + /** + * Info messages are a bit less verbose than debug messages. This is useful to trace a session. + * + * @var string $string The message to log. + */ + public static function info($string) + { + self::log(self::INFO, $string); + } + + + /** + * Debug messages are very verbose, and will contain more information than what is necessary for a production + * system. + * + * @var string $string The message to log. + */ + public static function debug($string) + { + self::log(self::DEBUG, $string); + } + + + /** + * Statistics. + * + * @var string $string The message to log. + */ + public static function stats($string) + { + self::log(self::NOTICE, $string, TRUE); + } + + + /** + * Set the logger to capture logs. + * + * @var boolean $val Whether to capture logs or not. Defaults to TRUE. + */ + public static function setCaptureLog($val = TRUE) + { + self::$captureLog = $val; + } + + + /** + * Get the captured log. + */ + public static function getCapturedLog() + { + return self::$capturedLog; + } + + + private static function createLoggingHandler() + { + // set to FALSE to indicate that it is being initialized + self::$loggingHandler = FALSE; + + // get the configuration + $config = SimpleSAML_Configuration::getInstance(); + assert($config instanceof SimpleSAML_Configuration); + + // get the metadata handler option from the configuration + $handler = $config->getString('logging.handler', 'syslog'); + + // setting minimum log_level + self::$logLevel = $config->getInteger('logging.level', self::INFO); + + $handler = strtolower($handler); + + if ($handler === 'syslog') { + $sh = new SimpleSAML_Logger_LoggingHandlerSyslog(); + } elseif ($handler === 'file') { + $sh = new SimpleSAML_Logger_LoggingHandlerFile(); + } elseif ($handler === 'errorlog') { + $sh = new SimpleSAML_Logger_LoggingHandlerErrorLog(); + } else { + throw new Exception( + 'Invalid value for the [logging.handler] configuration option. Unknown handler: ' . $handler + ); + } + + self::$format = $config->getString('logging.format', self::$format); + $sh->setLogFormat(self::$format); + + // set the session handler + self::$loggingHandler = $sh; + } + + + private static function log($level, $string, $statsLog = FALSE) + { + if (self::$loggingHandler === NULL) { + /* Initialize logging. */ + self::createLoggingHandler(); + + if (!empty(self::$earlyLog)) { + error_log('----------------------------------------------------------------------'); + // output messages which were logged before we properly initialized logging + foreach (self::$earlyLog as $msg) { + self::log($msg['level'], $msg['string'], $msg['statsLog']); + } + } + } elseif (self::$loggingHandler === FALSE) { + // some error occurred while initializing logging + if (empty(self::$earlyLog)) { + // this is the first message + error_log('--- Log message(s) while initializing logging ------------------------'); + } + error_log($string); + + self::$earlyLog[] = array('level' => $level, 'string' => $string, 'statsLog' => $statsLog); + return; + } + + if (self::$captureLog) { + $ts = microtime(TRUE); + $msecs = (int) (($ts - (int) $ts) * 1000); + $ts = GMdate('H:i:s', $ts).sprintf('.%03d', $msecs).'Z'; + self::$capturedLog[] = $ts.' '.$string; + } + + if (self::$logLevel >= $level || $statsLog) { + if (is_array($string)) { + $string = implode(",", $string); + } + + $formats = array('%trackid', '%msg', '%srcip', '%stat'); + $replacements = array(self::getTrackId(), $string, $_SERVER['REMOTE_ADDR']); + + $stat = ''; + if ($statsLog) { + $stat = 'STAT '; + } + array_push($replacements, $stat); + + $string = str_replace($formats, $replacements, self::$format); + self::$loggingHandler->log($level, $string); + } + } + + + /** + * Retrieve the track ID we should use for logging. It is used to avoid infinite recursion between the logger class + * and the session class. + * + * @return string The track ID we should use for logging, or 'NA' if we detect recursion. + */ + private static function getTrackId() + { + if (self::$trackid === self::$TRACKID_FETCHING) { + // recursion detected! + return 'NA'; + } + + if (self::$trackid === NULL) { + // no track ID yet, fetch it from the session class + + // mark it as currently being fetched + self::$trackid = self::$TRACKID_FETCHING; + + // get the current session. This could cause recursion back to the logger class + $session = SimpleSAML_Session::getSessionFromRequest(); + + // update the track ID + self::$trackid = $session->getTrackID(); + } + + assert('is_string(self::$trackid)'); + return self::$trackid; + } } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandler.php b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandler.php new file mode 100644 index 0000000..d4d07cd --- /dev/null +++ b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandler.php @@ -0,0 +1,27 @@ + 'EMERG', - SimpleSAML_Logger::ALERT => 'ALERT', - SimpleSAML_Logger::CRIT => 'CRIT', - SimpleSAML_Logger::ERR => 'ERR', - SimpleSAML_Logger::WARNING => 'WARNING', - SimpleSAML_Logger::NOTICE => 'NOTICE', - SimpleSAML_Logger::INFO => 'INFO', - SimpleSAML_Logger::DEBUG => 'DEBUG', - ); + /** + * This array contains the mappings from syslog loglevel to names. + */ + private static $levelNames = array( + SimpleSAML_Logger::EMERG => 'EMERG', + SimpleSAML_Logger::ALERT => 'ALERT', + SimpleSAML_Logger::CRIT => 'CRIT', + SimpleSAML_Logger::ERR => 'ERR', + SimpleSAML_Logger::WARNING => 'WARNING', + SimpleSAML_Logger::NOTICE => 'NOTICE', + SimpleSAML_Logger::INFO => 'INFO', + SimpleSAML_Logger::DEBUG => 'DEBUG', + ); + private $format; - function log_internal($level, $string) { - $config = SimpleSAML_Configuration::getInstance(); - assert($config instanceof SimpleSAML_Configuration); - $processname = $config->getString('logging.processname','simpleSAMLphp'); - - if(array_key_exists($level, self::$levelNames)) { - $levelName = self::$levelNames[$level]; - } else { - $levelName = sprintf('UNKNOWN%d', $level); - } + /** + * Set the format desired for the logs. + * + * @param string $format The format used for logs. + */ + public function setLogFormat($format) + { + $this->format = $format; + } - error_log($processname.' - '.$levelName . ': ' . $string); - } + + /** + * Log a message to syslog. + * + * @param int $level The log level. + * @param string $string The formatted message to log. + */ + public function log($level, $string) + { + $config = SimpleSAML_Configuration::getInstance(); + assert($config instanceof SimpleSAML_Configuration); + $processname = $config->getString('logging.processname', 'simpleSAMLphp'); + + if (array_key_exists($level, self::$levelNames)) { + $levelName = self::$levelNames[$level]; + } else { + $levelName = sprintf('UNKNOWN%d', $level); + } + + $formats = array('%process', '%level'); + $replacements = array($processname, $levelName); + $string = str_replace($formats, $replacements, $string); + $string = preg_replace('/%\w+(\{[^\}]+\})?/', '', $string); + $string = trim($string); + + error_log($string); + } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerFile.php b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerFile.php index 43ed5fb..9ed795e 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerFile.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerFile.php @@ -4,63 +4,104 @@ * A class for logging * * @author Lasse Birnbaum Jensen, SDU. - * @author Andreas kre Solberg, UNINETT AS. + * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp * @version $ID$ */ -class SimpleSAML_Logger_LoggingHandlerFile implements SimpleSAML_Logger_LoggingHandler { - - /** - * This array contains the mappings from syslog loglevel to names. Copied - * more or less directly from SimpleSAML_Logger_LoggingHandlerErrorLog. - */ - private static $levelNames = array( - SimpleSAML_Logger::EMERG => 'EMERGENCY', - SimpleSAML_Logger::ALERT => 'ALERT', - SimpleSAML_Logger::CRIT => 'CRITICAL', - SimpleSAML_Logger::ERR => 'ERROR', - SimpleSAML_Logger::WARNING => 'WARNING', - SimpleSAML_Logger::NOTICE => 'NOTICE', - SimpleSAML_Logger::INFO => 'INFO', - SimpleSAML_Logger::DEBUG => 'DEBUG', - ); +class SimpleSAML_Logger_LoggingHandlerFile implements SimpleSAML_Logger_LoggingHandler +{ + /** + * This array contains the mappings from syslog loglevel to names. Copied + * more or less directly from SimpleSAML_Logger_LoggingHandlerErrorLog. + */ + private static $levelNames = array( + SimpleSAML_Logger::EMERG => 'EMERGENCY', + SimpleSAML_Logger::ALERT => 'ALERT', + SimpleSAML_Logger::CRIT => 'CRITICAL', + SimpleSAML_Logger::ERR => 'ERROR', + SimpleSAML_Logger::WARNING => 'WARNING', + SimpleSAML_Logger::NOTICE => 'NOTICE', + SimpleSAML_Logger::INFO => 'INFO', + SimpleSAML_Logger::DEBUG => 'DEBUG', + ); + private $logFile = NULL; + private $processname = NULL; + private $format; - private $logFile = null; - private $processname = null; - function __construct() { + /** + * Build a new logging handler based on files. + */ + public function __construct() + { $config = SimpleSAML_Configuration::getInstance(); assert($config instanceof SimpleSAML_Configuration); - /* Get the metadata handler option from the configuration. */ - $this->logFile = $config->getPathValue('loggingdir', 'log/').$config->getString('logging.logfile', 'simplesamlphp.log'); - $this->processname = $config->getString('logging.processname','simpleSAMLphp'); - + // get the metadata handler option from the configuration + $this->logFile = $config->getPathValue('loggingdir', 'log/') . + $config->getString('logging.logfile', 'simplesamlphp.log'); + $this->processname = $config->getString('logging.processname', 'simpleSAMLphp'); + if (@file_exists($this->logFile)) { - if (!@is_writeable($this->logFile)) throw new Exception("Could not write to logfile: ".$this->logFile); - } - else - { - if (!@touch($this->logFile)) throw new Exception("Could not create logfile: ".$this->logFile." Loggingdir is not writeable for the webserver user."); + if (!@is_writeable($this->logFile)) { + throw new Exception("Could not write to logfile: " . $this->logFile); + } + } else { + if (!@touch($this->logFile)) { + throw new Exception( + "Could not create logfile: " . $this->logFile . + " Loggingdir is not writeable for the webserver user." + ); + } } - SimpleSAML_Utilities::initTimezone(); + SimpleSAML_Utilities::initTimezone(); } - function log_internal($level, $string) { - if ($this->logFile != null) { - - // Set human-readable log level. Copied from SimpleSAML_Logger_LoggingHandlerErrorLog. - if(array_key_exists($level, self::$levelNames)) - $levelName = self::$levelNames[$level]; - else - $levelName = sprintf('UNKNOWN%d', $level); - - $line = sprintf("%s %s %s %s\n", strftime("%b %d %H:%M:%S"), $this->processname, $levelName, $string); - file_put_contents($this->logFile, $line, FILE_APPEND); + + /** + * Set the format desired for the logs. + * + * @param string $format The format used for logs. + */ + public function setLogFormat($format) + { + $this->format = $format; + } + + + /** + * Log a message to the log file. + * + * @param int $level The log level. + * @param string $string The formatted message to log. + */ + public function log($level, $string) + { + if ($this->logFile != NULL) { + // set human-readable log level. Copied from SimpleSAML_Logger_LoggingHandlerErrorLog. + $levelName = sprintf('UNKNOWN%d', $level); + if (array_key_exists($level, self::$levelNames)) { + $levelName = self::$levelNames[$level]; + } + + $formats = array('%process', '%level'); + $replacements = array($this->processname, $levelName); + + $matches = array(); + if (preg_match('/%date(?:\{([^\}]+)\})?/', $this->format, $matches)) { + $format = "%b %d %H:%M:%S"; + if (isset($matches[1])) { + $format = $matches[1]; + } + + array_push($formats, $matches[0]); + array_push($replacements, strftime($format)); + } + + $string = str_replace($formats, $replacements, $string); + file_put_contents($this->logFile, $string.PHP_EOL, FILE_APPEND); } } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerSyslog.php b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerSyslog.php index 6c7ddfa..f6d58b1 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerSyslog.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Logger/LoggingHandlerSyslog.php @@ -9,39 +9,67 @@ * @version $ID$ */ -class SimpleSAML_Logger_LoggingHandlerSyslog implements SimpleSAML_Logger_LoggingHandler { +class SimpleSAML_Logger_LoggingHandlerSyslog implements SimpleSAML_Logger_LoggingHandler +{ + private $isWindows = FALSE; + private $format; - private $isWindows = false; - - function __construct() { + + /** + * Build a new logging handler based on syslog. + */ + public function __construct() + { $config = SimpleSAML_Configuration::getInstance(); assert($config instanceof SimpleSAML_Configuration); $facility = $config->getInteger('logging.facility', defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER); - $processname = $config->getString('logging.processname','simpleSAMLphp'); - /* - * OS Check - * Setting facility to LOG_USER (only valid in Windows), enable log level rewrite on windows systems. - */ + $processname = $config->getString('logging.processname', 'simpleSAMLphp'); + + // Setting facility to LOG_USER (only valid in Windows), enable log level rewrite on windows systems. if (SimpleSAML_Utilities::isWindowsOS()) { - $this->isWindows = true; - $facility = LOG_USER; + $this->isWindows = TRUE; + $facility = LOG_USER; } - + openlog($processname, LOG_PID, $facility); } - function log_internal($level,$string) { - /* - * Changing log level to supported levels if OS is Windows - */ - if ($this->isWindows) { - if ($level <= 4) - $level = LOG_ERR; - else - $level = LOG_INFO; - } - syslog($level,$level.' '.$string); + + /** + * Set the format desired for the logs. + * + * @param string $format The format used for logs. + */ + public function setLogFormat($format) + { + $this->format = $format; + } + + + /** + * Log a message to syslog. + * + * @param int $level The log level. + * @param string $string The formatted message to log. + */ + public function log($level, $string) + { + // changing log level to supported levels if OS is Windows + if ($this->isWindows) { + if ($level <= 4) { + $level = LOG_ERR; + } else { + $level = LOG_INFO; + } + } + + $formats = array('%process', '%level'); + $replacements = array('', $level); + $string = str_replace($formats, $replacements, $string); + $string = preg_replace('/%\w+(\{[^\}]+\})?/', '', $string); + $string = trim($string); + + syslog($level, $string); } } -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Memcache.php b/inc/simplesamlphp/lib/SimpleSAML/Memcache.php index e83835e..1089afa 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Memcache.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Memcache.php @@ -15,7 +15,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Memcache { @@ -46,7 +45,7 @@ class SimpleSAML_Memcache { continue; } - /* Deserialize the object. */ + /* Unserialize the object. */ $info = unserialize($serializedInfo); /* @@ -249,12 +248,13 @@ class SimpleSAML_Memcache { * @return A Memcache object of the servers in the group. */ private static function loadMemcacheServerGroup(array $group) { + + if(!class_exists('Memcache')) { + throw new Exception('Missing Memcache class. Is the memcache extension installed?'); + } + /* Create the Memcache object. */ $memcache = new Memcache(); - if($memcache == NULL) { - throw new Exception('Unable to create an instance of a Memcache object.' . - ' Is the memcache extension installed?'); - } /* Iterate over all the servers in the group and add them to the Memcache object. */ foreach($group as $index => $server) { diff --git a/inc/simplesamlphp/lib/SimpleSAML/MemcacheStore.php b/inc/simplesamlphp/lib/SimpleSAML/MemcacheStore.php index 81ce8fb..5550929 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/MemcacheStore.php +++ b/inc/simplesamlphp/lib/SimpleSAML/MemcacheStore.php @@ -9,7 +9,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id: MemcacheStore.php 2418 2010-07-13 11:56:17Z olavmrk $ * @deprecated This class will be removed in version 1.8 of simpleSAMLphp. */ class SimpleSAML_MemcacheStore { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php index c9af2c5..759ff28 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandler.php @@ -5,7 +5,6 @@ * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: MetaDataStorageHandler.php 2720 2011-01-19 11:55:44Z olavmrk $ */ class SimpleSAML_Metadata_MetaDataStorageHandler { @@ -100,6 +99,9 @@ class SimpleSAML_Metadata_MetaDataStorageHandler { case 'SingleLogoutService' : return $baseurl . 'saml2/sp/SingleLogoutService.php'; + + case 'SingleLogoutServiceBinding' : + return SAML2_Const::BINDING_HTTP_REDIRECT; } } elseif($set == 'saml20-idp-hosted') { @@ -107,8 +109,14 @@ class SimpleSAML_Metadata_MetaDataStorageHandler { case 'SingleSignOnService' : return $baseurl . 'saml2/idp/SSOService.php'; + case 'SingleSignOnServiceBinding' : + return SAML2_Const::BINDING_HTTP_REDIRECT; + case 'SingleLogoutService' : return $baseurl . 'saml2/idp/SingleLogoutService.php'; + + case 'SingleLogoutServiceBinding' : + return SAML2_Const::BINDING_HTTP_REDIRECT; } } elseif($set == 'shib13-sp-hosted') { switch ($property) { @@ -341,4 +349,3 @@ class SimpleSAML_Metadata_MetaDataStorageHandler { } -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php index 784f734..fb21c7b 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerDynamicXML.php @@ -1,13 +1,12 @@ * @package simpleSAMLphp - * @version $Id: MetaDataStorageHandlerFlatFile.php 2389 2010-07-09 06:54:25Z olavmrk $ */ class SimpleSAML_Metadata_MetaDataStorageHandlerFlatFile extends SimpleSAML_Metadata_MetaDataStorageSource { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php index 292bfa5..4cc25f5 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php @@ -4,7 +4,6 @@ * Class for handling metadata files in serialized format. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Metadata_MetaDataStorageHandlerSerialize extends SimpleSAML_Metadata_MetaDataStorageSource { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php index 33342b0..96a2682 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php @@ -6,7 +6,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Metadata_MetaDataStorageHandlerXML extends SimpleSAML_Metadata_MetaDataStorageSource { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php index 443643d..aefdb6d 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/MetaDataStorageSource.php @@ -10,7 +10,6 @@ * @author Olav Morken, UNINETT AS. * @author Andreas Aakre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_Metadata_MetaDataStorageSource { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php index 5d21c78..196edb3 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLBuilder.php @@ -6,7 +6,6 @@ * This class builds SAML 2.0 metadata for an entity by examining the metadata for the entity. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Metadata_SAMLBuilder { @@ -85,6 +84,20 @@ class SimpleSAML_Metadata_SAMLBuilder { return $xml->ownerDocument->saveXML(); } + public function addSecurityTokenServiceType($metadata) { + assert('is_array($metadata)'); + assert('isset($metadata["entityid"])'); + assert('isset($metadata["metadata-set"])'); + + $metadata = SimpleSAML_Configuration::loadFromArray($metadata, $metadata['entityid']); + $defaultEndpoint = $metadata->getDefaultEndpoint('SingleSignOnService'); + $e = new sspmod_adfs_SAML2_XML_fed_SecurityTokenServiceType(); + $e->Location = $defaultEndpoint['Location']; + + $this->addCertificate($e, $metadata); + + $this->entityDescriptor->RoleDescriptor[] = $e; + } /** * @param SimpleSAML_Configuration $metadata Metadata. @@ -114,7 +127,12 @@ class SimpleSAML_Metadata_SAMLBuilder { foreach ($metadata->getArray('scope') as $scopetext) { $s = new SAML2_XML_shibmd_Scope(); $s->scope = $scopetext; - $s->regexp = FALSE; + // Check whether $ ^ ( ) * | \ are in a scope -> assume regex. + if (1 === preg_match('/[\$\^\)\(\*\|\\\\]/', $scopetext)) { + $s->regexp = TRUE; + } else { + $s->regexp = FALSE; + } $e->Extensions[] = $s; } } @@ -142,6 +160,25 @@ class SimpleSAML_Metadata_SAMLBuilder { $this->entityDescriptor->Extensions[] = $ea; } + if ($metadata->hasValue('RegistrationInfo')) { + $ri = new SAML2_XML_mdrpi_RegistrationInfo(); + foreach ($metadata->getArray('RegistrationInfo') as $riName => $riValues) { + switch ($riName) { + case 'authority': + $ri->registrationAuthority = $riValues; + break; + case 'instant': + $ri->registrationInstant = SAML2_Utils::xsDateTimeToTimestamp($riValues); + break; + case 'policies': + $ri->RegistrationPolicy = $riValues; + break; + } + } + $this->entityDescriptor->Extensions[] = $ri; + + } + if ($metadata->hasValue('UIInfo')) { $ui = new SAML2_XML_mdui_UIInfo(); foreach ($metadata->getArray('UIInfo') as $uiName => $uiValues) { @@ -318,6 +355,8 @@ class SimpleSAML_Metadata_SAMLBuilder { return; } + $attributesrequired = $metadata->getArray('attributes.required', array()); + /* * Add an AttributeConsumingService element with information as name and description and list * of requested attributes @@ -330,12 +369,18 @@ class SimpleSAML_Metadata_SAMLBuilder { $attributeconsumer->ServiceDescription = $metadata->getLocalizedString('description', array()); $nameFormat = $metadata->getString('attributes.NameFormat', SAML2_Const::NAMEFORMAT_UNSPECIFIED); - foreach ($attributes as $attribute) { + foreach ($attributes as $friendlyName => $attribute) { $t = new SAML2_XML_md_RequestedAttribute(); $t->Name = $attribute; + if (!is_int($friendlyName)) { + $t->FriendlyName = $friendlyName; + } if ($nameFormat !== SAML2_Const::NAMEFORMAT_UNSPECIFIED) { $t->NameFormat = $nameFormat; } + if (in_array($attribute, $attributesrequired)) { + $t->isRequired = true; + } $attributeconsumer->RequestedAttribute[] = $t; } @@ -383,16 +428,18 @@ class SimpleSAML_Metadata_SAMLBuilder { * Add SAML 2.0 SP metadata. * * @param array $metadata The metadata. + * @param array $protocols The protocols supported. */ - public function addMetadataSP20($metadata) { + public function addMetadataSP20($metadata, $protocols = array(SAML2_Const::NS_SAMLP)) { assert('is_array($metadata)'); + assert('is_array($protocols)'); assert('isset($metadata["entityid"])'); assert('isset($metadata["metadata-set"])'); $metadata = SimpleSAML_Configuration::loadFromArray($metadata, $metadata['entityid']); $e = new SAML2_XML_md_SPSSODescriptor(); - $e->protocolSupportEnumeration[] = 'urn:oasis:names:tc:SAML:2.0:protocol'; + $e->protocolSupportEnumeration = $protocols; $this->addExtensions($metadata, $e); @@ -440,8 +487,10 @@ class SimpleSAML_Metadata_SAMLBuilder { $e = new SAML2_XML_md_IDPSSODescriptor(); $e->protocolSupportEnumeration[] = 'urn:oasis:names:tc:SAML:2.0:protocol'; - if ($metadata->getBoolean('redirect.sign', FALSE)) { - $e->WantAuthnRequestSigned = TRUE; + if ($metadata->hasValue('sign.authnrequest')) { + $e->WantAuthnRequestsSigned = $metadata->getBoolean('sign.authnrequest'); + } elseif ($metadata->hasValue('redirect.sign')) { + $e->WantAuthnRequestsSigned = $metadata->getBoolean('redirect.sign'); } $this->addExtensions($metadata, $e); diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php index 8822451..41b06a6 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/SAMLParser.php @@ -102,7 +102,7 @@ class SimpleSAML_Metadata_SAMLParser { /** - * This is an array of elements that may be sued to validate this element. + * This is an array of elements that may be used to validate this element. * * @var array */ @@ -223,13 +223,13 @@ class SimpleSAML_Metadata_SAMLParser { /** - * This function parses a DOMElement which represents a EntityDescriptor element. + * This function parses a SAML2_XML_md_EntityDescriptor object which represents a EntityDescriptor element. * - * @param $entityElement A DOMElement which represents a EntityDescriptor element. + * @param $entityElement A SAML2_XML_md_EntityDescriptor object which represents a EntityDescriptor element. * @return An instance of this class with the metadata loaded. */ public static function parseElement($entityElement) { - assert('$entityElement instanceof DOMElement'); + assert('$entityElement instanceof SAML2_XML_md_EntityDescriptor'); return new SimpleSAML_Metadata_SAMLParser($entityElement, NULL); } @@ -384,7 +384,6 @@ class SimpleSAML_Metadata_SAMLParser { * Add organizational metadata */ if (!empty($this->organizationName)) { - $ret['name'] = $this->organizationName; $ret['description'] = $this->organizationName; $ret['OrganizationName'] = $this->organizationName; } @@ -444,7 +443,7 @@ class SimpleSAML_Metadata_SAMLParser { * This function returns the metadata for SAML 1.x SPs in the format simpleSAMLphp expects. * This is an associative array with the following fields: * - 'entityid': The entity id of the entity described in the metadata. - * - 'AssertionConsumerService': String with the url of the assertion consumer service which supports + * - 'AssertionConsumerService': String with the URL of the assertion consumer service which supports * the browser-post binding. * - 'certData': X509Certificate for entity (if present). * @@ -508,8 +507,8 @@ class SimpleSAML_Metadata_SAMLParser { * This is an associative array with the following fields: * - 'entityid': The entity id of the entity described in the metadata. * - 'name': Autogenerated name for this entity. Currently set to the entity id. - * - 'SingleSignOnService': String with the url of the SSO service which supports the redirect binding. - * - 'SingleLogoutService': String with the url where we should send logout requests/responses. + * - 'SingleSignOnService': String with the URL of the SSO service which supports the redirect binding. + * - 'SingleLogoutService': String with the URL where we should send logout requests/responses. * - 'certData': X509Certificate for entity (if present). * - 'certFingerprint': Fingerprint of the X509Certificate from the metadata. * @@ -558,9 +557,9 @@ class SimpleSAML_Metadata_SAMLParser { * This function returns the metadata for SAML 2.0 SPs in the format simpleSAMLphp expects. * This is an associative array with the following fields: * - 'entityid': The entity id of the entity described in the metadata. - * - 'AssertionConsumerService': String with the url of the assertion consumer service which supports + * - 'AssertionConsumerService': String with the URL of the assertion consumer service which supports * the browser-post binding. - * - 'SingleLogoutService': String with the url where we should send logout requests/responses. + * - 'SingleLogoutService': String with the URL where we should send logout requests/responses. * - 'NameIDFormat': The name ID format this SP expects. This may be unset. * - 'certData': X509Certificate for entity (if present). * @@ -623,10 +622,24 @@ class SimpleSAML_Metadata_SAMLParser { $ret['keys'] = $spd['keys']; } + /* Add validate.authnrequest. */ + if (array_key_exists('AuthnRequestsSigned', $spd)) { + $ret['validate.authnrequest'] = $spd['AuthnRequestsSigned']; + } + + /* Add saml20.sign.assertion. */ + if (array_key_exists('WantAssertionsSigned', $spd)) { + $ret['saml20.sign.assertion'] = $spd['WantAssertionsSigned']; + } /* Add extensions. */ $this->addExtensions($ret, $spd); + // prioritize mdui:DisplayName as the name if available + if (!empty($ret['UIInfo']['DisplayName'])) { + $ret['name'] = $ret['UIInfo']['DisplayName']; + } + return $ret; } @@ -636,8 +649,8 @@ class SimpleSAML_Metadata_SAMLParser { * This is an associative array with the following fields: * - 'entityid': The entity id of the entity described in the metadata. * - 'name': Autogenerated name for this entity. Currently set to the entity id. - * - 'SingleSignOnService': String with the url of the SSO service which supports the redirect binding. - * - 'SingleLogoutService': String with the url where we should send logout requests(/responses). + * - 'SingleSignOnService': String with the URL of the SSO service which supports the redirect binding. + * - 'SingleLogoutService': String with the URL where we should send logout requests(/responses). * - 'SingleLogoutServiceResponse': String where we should send logout responses (if this is different from * the 'SingleLogoutService' endpoint. * - 'certData': X509Certificate for entity (if present). @@ -669,7 +682,7 @@ class SimpleSAML_Metadata_SAMLParser { /* Enable redirect.sign if WantAuthnRequestsSigned is enabled. */ if ($idp['WantAuthnRequestsSigned']) { - $ret['redirect.sign'] = TRUE; + $ret['sign.authnrequest'] = TRUE; } /* Find the SSO service endpoint. */ @@ -691,6 +704,11 @@ class SimpleSAML_Metadata_SAMLParser { /* Add extensions. */ $this->addExtensions($ret, $idp); + // prioritize mdui:DisplayName as the name if available + if (!empty($ret['UIInfo']['DisplayName'])) { + $ret['name'] = $ret['UIInfo']['DisplayName']; + } + return $ret; } @@ -810,6 +828,16 @@ class SimpleSAML_Metadata_SAMLParser { self::parseAttributeConsumerService($attcs[0], $sp); } + /* Check AuthnRequestsSigned */ + if ($element->AuthnRequestsSigned !== NULL) { + $sp['AuthnRequestsSigned'] = $element->AuthnRequestsSigned; + } + + /* Check WantAssertionsSigned */ + if ($element->WantAssertionsSigned !== NULL) { + $sp['WantAssertionsSigned'] = $element->WantAssertionsSigned; + } + $this->spDescriptors[] = $sp; } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php b/inc/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php index d696469..5d59591 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Metadata/Signer.php @@ -5,7 +5,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Metadata_Signer { @@ -173,7 +172,12 @@ class SimpleSAML_Metadata_Signer { $rootNode = $xml->firstChild; /* Sign the metadata with our private key. */ - $objXMLSecDSig = new XMLSecurityDSig(); + if ($type == 'ADFS IdP') { + $objXMLSecDSig = new sspmod_adfs_XMLSecurityDSig($metadataString); + } else { + $objXMLSecDSig = new XMLSecurityDSig(); + } + $objXMLSecDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N); $objXMLSecDSig->addReferenceList(array($rootNode), XMLSecurityDSig::SHA1, diff --git a/inc/simplesamlphp/lib/SimpleSAML/Module.php b/inc/simplesamlphp/lib/SimpleSAML/Module.php index be35cbc..78683f3 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Module.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Module.php @@ -5,7 +5,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Module { @@ -42,6 +41,17 @@ class SimpleSAML_Module { return FALSE; } + $globalConfig = SimpleSAML_Configuration::getInstance(); + $moduleEnable = $globalConfig->getArray('module.enable', array()); + + if(isset($moduleEnable[$module])) { + if(is_bool($moduleEnable[$module]) === TRUE) { + return $moduleEnable[$module]; + } + + throw new Exception("Invalid module.enable value for for the module $module"); + } + if (assert_options(ASSERT_ACTIVE) && !file_exists($moduleDir . '/default-enable') && !file_exists($moduleDir . '/default-disable')) { SimpleSAML_Logger::error("Missing default-enable or default-disable file for the module $module"); } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Session.php b/inc/simplesamlphp/lib/SimpleSAML/Session.php index e6640e0..4756b0d 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Session.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Session.php @@ -3,24 +3,31 @@ /** * The Session class holds information about a user session, and everything attached to it. * - * The session will have a duration, and validity, and also cache information about the different + * The session will have a duration and validity, and also cache information about the different * federation protocols, as Shibboleth and SAML 2.0. On the IdP side the Session class holds - * information about all the currently logged in SPs. This is used when the user initiate a + * information about all the currently logged in SPs. This is used when the user initiates a * Single-Log-Out. * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Session.php 3105 2012-05-24 06:08:23Z olavmrk $ */ class SimpleSAML_Session { /** * This is a timeout value for setData, which indicates that the data should be deleted * on logout. + * @deprecated */ const DATA_TIMEOUT_LOGOUT = 'logoutTimeout'; + /** + * This is a timeout value for setData, which indicates that the data + * should never be deleted, i.e. lasts the whole session lifetime. + */ + const DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout'; + + /** * The list of loaded session objects. * @@ -54,70 +61,46 @@ class SimpleSAML_Session { /** - * The track id is a new random unique identifier that is generate for each session. + * The track id is a new random unique identifier that is generated for each session. * This is used in the debug logs and error messages to easily track more information * about what went wrong. + * + * @var int */ private $trackid = 0; - - private $idp = null; - - private $authenticated = null; - private $attributes = null; - - private $sessionindex = null; - private $nameid = null; - - private $authority = null; - - // Session duration parameters - private $sessionstarted = null; - private $sessionduration = null; - - // Track whether the session object is modified or not. - private $dirty = false; - + /** - * This is an array of registered logout handlers. - * All registered logout handlers will be called on logout. + * @deprecated */ - private $logout_handlers = array(); + private $authority = null; + + + private $rememberMeExpire = null; /** - * This is an array of objects which will autoexpire after a set time. It is used + * Marks a session as modified, and therefore needs to be saved before destroying + * this object. + * + * @var bool + */ + private $dirty = false; + + + /** + * This is an array of objects which will expire automatically after a set time. It is used * where one needs to store some information - for example a logout request, but doesn't * want it to be stored forever. * * The data store contains three levels of nested associative arrays. The first is the data type, the * second is the identifier, and the third contains the expire time of the data and the data itself. + * + * @var array */ private $dataStore = null; - /** - * Current NameIDs for sessions. - * - * Stored as a two-level associative array: $sessionNameId[][] - */ - private $sessionNameId; - - - /** - * Logout state when authenticated with authentication sources. - */ - private $logoutState; - - - /** - * Persistent authentication state. - * - * @array - */ - private $authState; - - /** * The list of IdP-SP associations. * @@ -150,7 +133,9 @@ class SimpleSAML_Session { /** - * private constructor restricts instantiaton to getInstance() + * Private constructor that restricts instantiation to getInstance(). + * + * @param boolean $transient Whether to create a transient session or not. */ private function __construct($transient = FALSE) { @@ -163,88 +148,65 @@ class SimpleSAML_Session { } $sh = SimpleSAML_SessionHandler::getSessionHandler(); - $this->sessionId = $sh->getCookieSessionId(); + $this->sessionId = $sh->newSessionId(); - $this->trackid = substr(md5(uniqid(rand(), true)), 0, 10); + $this->trackid = SimpleSAML_Utilities::stringToHex(SimpleSAML_Utilities::generateRandomBytes(5)); $this->dirty = TRUE; - $this->addShutdownFunction(); + + /* Initialize data for session check function if defined */ + $globalConfig = SimpleSAML_Configuration::getInstance(); + $checkFunction = $globalConfig->getArray('session.check_function', NULL); + if (isset($checkFunction)) { + assert('is_callable($checkFunction)'); + call_user_func($checkFunction, $this, TRUE); + } } /** - * Upgrade this session object to use the $authData property. - * - * TODO: Remove in version 1.8. + * Destructor for this class. It will save the session to the session handler + * in case the session has been marked as dirty. Do nothing otherwise. */ - private function upgradeAuthData() { - $this->authData = array(); + public function __destruct() { + if(!$this->dirty) { + /* Session hasn't changed - don't bother saving it. */ + return; + } - if ($this->authority === NULL || !$this->authenticated) { - return; - } + $this->dirty = FALSE; - if ($this->authState !== NULL) { - $data = $this->authState; - } else { - $data = array(); - } + $sh = SimpleSAML_SessionHandler::getSessionHandler(); - if ($this->attributes !== NULL) { - $data['Attributes'] = $this->attributes; - } else { - $data['Attributes'] = array(); - } - - if ($this->idp !== NULL) { - $data['saml:sp:IdP'] = $this->idp; - } - - if ($this->sessionindex !== NULL) { - $data['saml:sp:SessionIndex'] = $this->sessionindex; - } - - if ($this->nameid !== NULL) { - $data['saml:sp:NameID'] = $this->nameid; - } - - $data['AuthnInstant'] = $this->sessionstarted; - $data['Expire'] = $this->sessionstarted + $this->sessionduration; - $this->sessionstarted = NULL; - $this->sessionduration = NULL; - - if ($this->logoutState !== NULL) { - $data['LogoutState'] = $this->logoutState; - } + try { + $sh->saveSession($this); + } catch (Exception $e) { + if (!($e instanceof SimpleSAML_Error_Exception)) { + $e = new SimpleSAML_Error_UnserializableException($e); + } + SimpleSAML_Logger::error('Unable to save session.'); + $e->logError(); + } + } - if (!empty($this->logout_handlers)) { - $data['LogoutHandlers'] = $this->logout_handlers; - } - - $this->authData[$this->authority] = $data; - } + /** + * @deprecated + * @see SimpleSAML_Session::getSessionFromRequest() + */ + public static function getInstance() { + return self::getSessionFromRequest(); + } - /** - * This function is called after this class has been deserialized. - */ - public function __wakeup() { - $this->addShutdownFunction(); - - /* TODO: Remove for version 1.8. */ - if ($this->authData === NULL) { - $this->upgradeAuthData(); - } - } - - - /** + /** * Retrieves the current session. Will create a new session if there isn't a session. * - * @return The current session. + * @return SimpleSAML_Session The current session. + * @throws Exception When session couldn't be initialized and + * the session fallback is disabled by configuration. */ - public static function getInstance() { + public static function getSessionFromRequest() { /* Check if we already have initialized the session. */ if (isset(self::$instance)) { @@ -318,7 +280,7 @@ class SimpleSAML_Session { /** * Retrieve if session is transient. * - * @return boolean The session transient flag. + * @return boolean The session transient flag. */ public function isTransient() { return $this->transient; @@ -328,6 +290,8 @@ class SimpleSAML_Session { /** * Get a unique ID that will be permanent for this session. * Used for debugging and tracing log files related to a session. + * + * @return string The unique ID. */ public function getTrackID() { return $this->trackid; @@ -335,7 +299,10 @@ class SimpleSAML_Session { /** - * Who authorized this session. could be in example saml2, shib13, login,login-admin etc. + * Who authorized this session. Could be for example 'saml2', 'shib13', 'login', 'login-admin' etc. + * + * @return string Who authorized this session. + * @deprecated */ public function getAuthority() { return $this->authority; @@ -347,25 +314,29 @@ class SimpleSAML_Session { * The complete request is not stored, instead the values that will be needed later * are stored in an assoc array. * - * @param $protocol saml2 or shib13 - * @param $requestid The request id used as a key to lookup the cache. - * - * @return Returns an assoc array of cached variables associated with the + * @param string $protocol saml2 or shib13 + * @param string $requestid The request id used as a key to lookup the cache. + * @throws Exception If the method can't find a cached version of the request. + * @return array Returns an assoc array of cached variables associated with the * authentication request. + * @deprecated */ public function getAuthnRequest($protocol, $requestid) { - SimpleSAML_Logger::debug('Library - Session: Get authnrequest from cache ' . $protocol . ' time:' . time() . ' id: '. $requestid ); + SimpleSAML_Logger::debug('Library - Session: Get authnrequest from cache ' . $protocol . ' time:' . time() . + ' id: '. $requestid ); $type = 'AuthnRequest-' . $protocol; $authnRequest = $this->getData($type, $requestid); if($authnRequest === NULL) { /* - * Could not find requested ID. Throw an error. Could be that it is never set, or that it is deleted due to age. + * Could not find requested ID. Throw an error. Could be that it is never set, or that it is deleted + * due to age. */ - throw new Exception('Could not find cached version of authentication request with ID ' . $requestid . ' (' . $protocol . ')'); + throw new Exception('Could not find cached version of authentication request with ID ' . $requestid . + ' (' . $protocol . ')'); } return $authnRequest; @@ -375,13 +346,15 @@ class SimpleSAML_Session { /** * This method sets a cached assoc array to the authentication request cache storage. * - * @param $protocol saml2 or shib13 - * @param $requestid The request id used as a key to lookup the cache. - * @param $cache The assoc array that will be stored. + * @param string $protocol 'saml2' or 'shib13' + * @param string $requestid The request id used as a key to lookup the cache. + * @param array $cache The assoc array that will be stored. + * @deprecated */ public function setAuthnRequest($protocol, $requestid, array $cache) { - SimpleSAML_Logger::debug('Library - Session: Set authnrequest ' . $protocol . ' time:' . time() . ' size:' . count($cache) . ' id: '. $requestid ); + SimpleSAML_Logger::debug('Library - Session: Set authnrequest ' . $protocol . ' time:' . time() . ' size:' . + count($cache) . ' id: '. $requestid ); $type = 'AuthnRequest-' . $protocol; $this->setData($type, $requestid, $cache); @@ -391,7 +364,8 @@ class SimpleSAML_Session { /** * Set the IdP we are authenticated against. * - * @param string|NULL $idp Our current IdP, or NULL if we aren't authenticated with an IdP. + * @param string|NULL $idp Our current IdP, or NULL if we aren't authenticated with an IdP. + * @deprecated */ public function setIdP($idp) { assert('is_string($idp) || is_null($idp)'); @@ -411,7 +385,8 @@ class SimpleSAML_Session { /** * Retrieve the IdP we are currently authenticated against. * - * @return string|NULL Our current IdP, or NULL if we aren't authenticated with an IdP. + * @return string|NULL Our current IdP, or NULL if we aren't authenticated with an IdP. + * @deprecated */ public function getIdP() { if (!isset($this->authData[$this->authority]['saml:sp:IdP'])) { @@ -424,7 +399,8 @@ class SimpleSAML_Session { /** * Set the SessionIndex we received from our IdP. * - * @param string|NULL $sessionindex Our SessionIndex. + * @param string|NULL $sessionindex Our SessionIndex. + * @deprecated */ public function setSessionIndex($sessionindex) { assert('is_string($sessionindex) || is_null($sessionindex)'); @@ -443,7 +419,8 @@ class SimpleSAML_Session { /** * Retrieve our SessionIndex. * - * @return string|NULL Our SessionIndex. + * @return string|NULL Our SessionIndex. + * @deprecated */ public function getSessionIndex() { if (!isset($this->authData[$this->authority]['saml:sp:SessionIndex'])) { @@ -456,7 +433,8 @@ class SimpleSAML_Session { /** * Set our current NameID. * - * @param array|NULL $nameid The NameID we received from the IdP + * @param array|NULL $nameid The NameID we received from the IdP + * @deprecated */ public function setNameID($nameid) { assert('is_array($nameid) || is_null($nameid)'); @@ -476,6 +454,7 @@ class SimpleSAML_Session { * Get our NameID. * * @return array|NULL The NameID we received from the IdP. + * @deprecated */ public function getNameID() { if (!isset($this->authData[$this->authority]['saml:sp:NameID'])) { @@ -485,13 +464,60 @@ class SimpleSAML_Session { } + /** + * Set remember me expire time. + * + * @param int $expire Unix timestamp when remember me session cookies expire. + */ + public function setRememberMeExpire($expire = NULL) { + assert('is_int($expire) || is_null($expire)'); + + if ($expire === NULL) { + $globalConfig = SimpleSAML_Configuration::getInstance(); + $expire = time() + $globalConfig->getInteger('session.rememberme.lifetime', 14*86400); + } + $this->rememberMeExpire = $expire; + + $cookieParams = array('expire' => $this->rememberMeExpire); + $this->updateSessionCookies($cookieParams); + } + + + /** + * Get remember me expire time. + * + * @return integer|NULL The remember me expire time. + */ + public function getRememberMeExpire() { + return $this->rememberMeExpire; + } + + + /** + * Update session cookies. + */ + public function updateSessionCookies($params = NULL) { + $sessionHandler = SimpleSAML_SessionHandler::getSessionHandler(); + + if ($this->sessionId !== NULL) { + $sessionHandler->setCookie($sessionHandler->getSessionCookieName(), $this->sessionId, $params); + } + + if ($this->authToken !== NULL) { + $globalConfig = SimpleSAML_Configuration::getInstance(); + $sessionHandler->setCookie($globalConfig->getString('session.authtoken.cookiename', + 'SimpleSAMLAuthToken'), $this->authToken, $params); + } + } + + /** * Marks the user as logged in with the specified authority. * * If the user already has logged in, the user will be logged out first. * - * @param string $authority The authority the user logged in with. - * @param array|NULL $data The authentication data for this authority. + * @param string $authority The authority the user logged in with. + * @param array|NULL $data The authentication data for this authority. */ public function doLogin($authority, array $data = NULL) { assert('is_string($authority)'); @@ -511,6 +537,8 @@ class SimpleSAML_Session { $data = array(); } + $data['Authority'] = $authority; + $globalConfig = SimpleSAML_Configuration::getInstance(); if (!isset($data['AuthnInstant'])) { $data['AuthnInstant'] = time(); @@ -527,7 +555,15 @@ class SimpleSAML_Session { $this->authToken = SimpleSAML_Utilities::generateID(); $sessionHandler = SimpleSAML_SessionHandler::getSessionHandler(); - $sessionHandler->setCookie($globalConfig->getString('session.authtoken.cookiename', 'SimpleSAMLAuthToken'), $this->authToken); + + if (!$this->transient && (!empty($data['RememberMe']) || $this->rememberMeExpire) && + $globalConfig->getBoolean('session.rememberme.enable', FALSE)) { + + $this->setRememberMeExpire(); + } else { + $sessionHandler->setCookie($globalConfig->getString('session.authtoken.cookiename', + 'SimpleSAMLAuthToken'), $this->authToken); + } } @@ -536,7 +572,7 @@ class SimpleSAML_Session { * * This function will call any registered logout handlers before marking the user as logged out. * - * @param string|NULL $authority The authentication source we are logging out of. + * @param string|NULL $authority The authentication source we are logging out of. */ public function doLogout($authority = NULL) { @@ -563,15 +599,42 @@ class SimpleSAML_Session { $this->authority = NULL; } + if ($this->authority === NULL && $this->rememberMeExpire) { + $this->rememberMeExpire = NULL; + $this->updateSessionCookies(); + } + /* Delete data which expires on logout. */ $this->expireDataLogout(); } + /** + * Set the lifetime for authentication source. + * + * @param string $authority The authentication source we are setting expire time for. + * @param int $expire The number of seconds authentication source is valid. + */ + public function setAuthorityExpire($authority, $expire = NULL) { + assert('isset($this->authData[$authority])'); + assert('is_int($expire) || is_null($expire)'); + + $this->dirty = true; + + if ($expire === NULL) { + $globalConfig = SimpleSAML_Configuration::getInstance(); + $expire = time() + $globalConfig->getInteger('session.duration', 8*60*60); + } + + $this->authData[$authority]['Expire'] = $expire; + } + + /** * Set the lifetime of our current authentication session. * - * @param int $duration The number of seconds this authentication session is valid. + * @param int $duration The number of seconds this authentication session is valid. + * @deprecated */ public function setSessionDuration($duration) { assert('is_int($duration)'); @@ -579,7 +642,6 @@ class SimpleSAML_Session { SimpleSAML_Logger::debug('Library - Session: Set session duration ' . $duration); $this->dirty = true; - $this->sessionduration = $duration; $this->authData[$this->authority]['Expire'] = time() + $duration; } @@ -596,7 +658,8 @@ class SimpleSAML_Session { assert('is_string($authority)'); if (!isset($this->authData[$authority])) { - SimpleSAML_Logger::debug('Session: '. var_export($authority, TRUE) .' not valid because we are not authenticated.'); + SimpleSAML_Logger::debug('Session: '. var_export($authority, TRUE) . + ' not valid because we are not authenticated.'); return FALSE; } @@ -614,7 +677,8 @@ class SimpleSAML_Session { /** * If the user is authenticated, how much time is left of the session. * - * @return int The number of seconds until the session expires. + * @return int The number of seconds until the session expires. + * @deprecated */ public function remainingTime() { @@ -630,7 +694,8 @@ class SimpleSAML_Session { /** * Is the user authenticated. This function does not check the session duration. * - * @return bool TRUE if the user is authenticated, FALSE otherwise. + * @return bool TRUE if the user is authenticated, FALSE otherwise. + * @deprecated */ public function isAuthenticated() { return isset($this->authData[$this->authority]); @@ -640,7 +705,8 @@ class SimpleSAML_Session { /** * Retrieve the time the user was authenticated. * - * @return int|NULL The timestamp for when the user was authenticated. NULL if the user hasn't authenticated. + * @return int|NULL The timestamp for when the user was authenticated. NULL if the user hasn't authenticated. + * @deprecated */ public function getAuthnInstant() { @@ -658,6 +724,7 @@ class SimpleSAML_Session { * Retrieve the attributes associated with this session. * * @return array|NULL The attributes. + * @deprecated */ public function getAttributes() { if (!isset($this->authData[$this->authority]['Attributes'])) { @@ -672,6 +739,7 @@ class SimpleSAML_Session { * * @param string $name The name of the attribute. * @return array|NULL The values of the given attribute. + * @deprecated */ public function getAttribute($name) { if (!isset($this->authData[$this->authority]['Attributes'][$name])) { @@ -685,6 +753,7 @@ class SimpleSAML_Session { * Set the attributes for this session. * * @param array|NULL $attributes The attributes of this session. + * @deprecated */ public function setAttributes($attributes) { assert('isset($this->authData[$this->authority])'); @@ -697,8 +766,8 @@ class SimpleSAML_Session { /** * Set the values of a single attribute. * - * @param string $name The name of the attribute. - * @param array $value The values of the attribute. + * @param string $name The name of the attribute. + * @param array $value The values of the attribute. */ public function setAttribute($name, $value) { assert('isset($this->authData[$this->authority])'); @@ -711,7 +780,8 @@ class SimpleSAML_Session { /** * Calculates the size of the session object after serialization * - * @return The size of the session measured in bytes. + * @return int The size of the session measured in bytes. + * @deprecated */ public function getSize() { $s = serialize($this); @@ -722,8 +792,9 @@ class SimpleSAML_Session { /** * This function registers a logout handler. * - * @param $classname The class which contains the logout handler. - * @param $functionname The logout handler function. + * @param string $classname The class which contains the logout handler. + * @param string $functionname The logout handler function. + * @throws Exception If the handler is not a valid function or method. */ public function registerLogoutHandler($classname, $functionname) { assert('isset($this->authData[$this->authority])'); @@ -744,7 +815,8 @@ class SimpleSAML_Session { /** * This function calls all registered logout handlers. * - * @param string $authority The authentication source we are logging out from. + * @param string $authority The authentication source we are logging out from. + * @throws Exception If the handler is not a valid function or method. */ private function callLogoutHandlers($authority) { assert('is_string($authority)'); @@ -796,6 +868,11 @@ class SimpleSAML_Session { continue; } + if ($info['expires'] === self::DATA_TIMEOUT_SESSION_END) { + /* This data never expires. */ + continue; + } + if($ct > $info['expires']) { unset($typedData[$id]); } @@ -806,6 +883,7 @@ class SimpleSAML_Session { /** * This function deletes data which should be deleted on logout from the data store. + * @deprecated */ private function expireDataLogout() { @@ -856,17 +934,20 @@ class SimpleSAML_Session { * The timeout value can be SimpleSAML_Session::DATA_TIMEOUT_LOGOUT, which indicates * that the data should be deleted on logout (and not before). * - * @param $type The type of the data. This is checked when retrieving data from the store. - * @param $id The identifier of the data. - * @param $data The data. - * @param $timeout The number of seconds this data should be stored after its last access. - * This parameter is optional. The default value is set in 'session.datastore.timeout', - * and the default is 4 hours. + * @param string $type The type of the data. This is checked when retrieving data from the store. + * @param string $id The identifier of the data. + * @param mixed $data The data. + * @param int|NULL $timeout The number of seconds this data should be stored after its last access. + * This parameter is optional. The default value is set in 'session.datastore.timeout', + * and the default is 4 hours. + * @throws Exception If the data couldn't be stored. + * */ public function setData($type, $id, $data, $timeout = NULL) { assert('is_string($type)'); assert('is_string($id)'); - assert('is_int($timeout) || is_null($timeout) || $timeout === self::DATA_TIMEOUT_LOGOUT'); + assert('is_int($timeout) || is_null($timeout) || $timeout === self::DATA_TIMEOUT_LOGOUT ||'. + ' $timeout === self::DATA_TIMEOUT_SESSION_END'); /* Clean out old data. */ $this->expireData(); @@ -894,6 +975,8 @@ class SimpleSAML_Session { if ($timeout === self::DATA_TIMEOUT_LOGOUT) { $expires = self::DATA_TIMEOUT_LOGOUT; + } elseif ($timeout === self::DATA_TIMEOUT_SESSION_END) { + $expires = self::DATA_TIMEOUT_SESSION_END; } else { $expires = time() + $timeout; } @@ -924,9 +1007,9 @@ class SimpleSAML_Session { * Note that this will not change when the data stored in the data store will expire. If that is required, * the data should be written back with setData. * - * @param $type The type of the data. This must match the type used when adding the data. - * @param $id The identifier of the data. Can be NULL, in which case NULL will be returned. - * @return The data of the given type with the given id or NULL if the data doesn't exist in the data store. + * @param string $type The type of the data. This must match the type used when adding the data. + * @param string|NULL $id The identifier of the data. Can be NULL, in which case NULL will be returned. + * @return mixed The data of the given type with the given id or NULL if the data doesn't exist in the data store. */ public function getData($type, $id) { assert('is_string($type)'); @@ -963,8 +1046,8 @@ class SimpleSAML_Session { * * An empty array will be returned if no data of the given type is found. * - * @param $type The type of the data. - * @return An associative array with all data of the given type. + * @param string $type The type of the data. + * @return array An associative array with all data of the given type. */ public function getDataOfType($type) { assert('is_string($type)'); @@ -1025,21 +1108,31 @@ class SimpleSAML_Session { assert('$session instanceof self'); - /* For backwardscompatibility. Remove after 1.7. */ - if ($session->sessionId === NULL) { - $session->sessionId = $sh->getCookieSessionId(); - } - - if ($checkToken && $session->authToken !== NULL) { + if ($checkToken) { $globalConfig = SimpleSAML_Configuration::getInstance(); - $authTokenCookieName = $globalConfig->getString('session.authtoken.cookiename', 'SimpleSAMLAuthToken'); - if (!isset($_COOKIE[$authTokenCookieName])) { - SimpleSAML_Logger::warning('Missing AuthToken cookie.'); - return NULL; + + if ($session->authToken !== NULL) { + $authTokenCookieName = $globalConfig->getString('session.authtoken.cookiename', + 'SimpleSAMLAuthToken'); + if (!isset($_COOKIE[$authTokenCookieName])) { + SimpleSAML_Logger::warning('Missing AuthToken cookie.'); + return NULL; + } + if ($_COOKIE[$authTokenCookieName] !== $session->authToken) { + SimpleSAML_Logger::warning('Invalid AuthToken cookie.'); + return NULL; + } } - if ($_COOKIE[$authTokenCookieName] !== $session->authToken) { - SimpleSAML_Logger::warning('Invalid AuthToken cookie.'); - return NULL; + + /* Run session check function if defined */ + $checkFunction = $globalConfig->getArray('session.check_function', NULL); + if (isset($checkFunction)) { + assert('is_callable($checkFunction)'); + $check = call_user_func($checkFunction, $session); + if ($check !== TRUE) { + SimpleSAML_Logger::warning('Session did not pass check function.'); + return NULL; + } } } @@ -1049,46 +1142,11 @@ class SimpleSAML_Session { } - /** - * Save the session to the session handler. - * - * This function will check the dirty-flag to check if the session has changed. - */ - public function saveSession() { - - if(!$this->dirty) { - /* Session hasn't changed - don't bother saving it. */ - return; - } - - $this->dirty = FALSE; - - $sh = SimpleSAML_SessionHandler::getSessionHandler(); - - try { - $sh->saveSession($this); - } catch (Exception $e) { - if (!($e instanceof SimpleSAML_Error_Exception)) { - $e = new SimpleSAML_Error_UnserializableException($e); - } - SimpleSAML_Logger::error('Unable to save session.'); - $e->logError(); - } - } - - - /** - * Add a shutdown function for saving this session object on exit. - */ - private function addShutdownFunction() { - register_shutdown_function(array($this, 'saveSession')); - } - - /** * Set the logout state for this session. * * @param array $state The state array. + * @deprecated */ public function setLogoutState(array $state) { assert('isset($this->authData[$this->authority])'); @@ -1102,6 +1160,7 @@ class SimpleSAML_Session { * Retrieve the logout state for this session. * * @return array The logout state. If no logout state is set, an empty array will be returned. + * @deprecated */ public function getLogoutState() { assert('isset($this->authData[$this->authority])'); @@ -1187,11 +1246,6 @@ class SimpleSAML_Session { public function getAssociations($idp) { assert('is_string($idp)'); - if (substr($idp, 0, 6) === 'saml2:' && !empty($this->sp_at_idpsessions)) { - /* Remove in 1.7. */ - $this->upgradeAssociations($idp); - } - if (!isset($this->associations)) { $this->associations = array(); } @@ -1227,11 +1281,6 @@ class SimpleSAML_Session { assert('is_string($idp)'); assert('is_string($associationId)'); - if (substr($idp, 0, 6) === 'saml2:' && !empty($this->sp_at_idpsessions)) { - /* Remove in 1.7. */ - $this->upgradeAssociations($idp); - } - if (!isset($this->associations)) { return; } @@ -1252,7 +1301,7 @@ class SimpleSAML_Session { * This function is just for backwards-compatibility. New code should * use the SimpleSAML_IdP::getAssociations()-function. * - * @return array Array of SAML 2 entitiyIDs. + * @return array Array of SAML 2 entityIDs. * @deprecated Will be removed in the future. */ public function get_sp_list() { diff --git a/inc/simplesamlphp/lib/SimpleSAML/SessionHandler.php b/inc/simplesamlphp/lib/SimpleSAML/SessionHandler.php index e7fe77d..8ad3a13 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/SessionHandler.php +++ b/inc/simplesamlphp/lib/SimpleSAML/SessionHandler.php @@ -10,7 +10,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id: SessionHandler.php 3060 2012-03-29 09:02:39Z olavmrk $ */ abstract class SimpleSAML_SessionHandler { @@ -47,6 +46,14 @@ abstract class SimpleSAML_SessionHandler { } + /** + * Create and set new session id. + * + * @return string The new session id. + */ + abstract public function newSessionId(); + + /** * Retrieve the session id of saved in the session cookie. * @@ -55,6 +62,14 @@ abstract class SimpleSAML_SessionHandler { abstract public function getCookieSessionId(); + /** + * Retrieve the session cookie name. + * + * @return string The session cookie name. + */ + abstract public function getSessionCookieName(); + + /** * Save the session. * @@ -130,29 +145,17 @@ abstract class SimpleSAML_SessionHandler { * @param string $name The name of the session cookie. * @param string|NULL $value The value of the cookie. Set to NULL to delete the cookie. */ - public function setCookie($name, $value) { + public function setCookie($name, $value, array $params = NULL) { assert('is_string($name)'); assert('is_string($value) || is_null($value)'); - $params = $this->getCookieParams(); - - // Do not set secure cookie if not on HTTPS - if ($params['secure'] && !SimpleSAML_Utilities::isHTTPS()) { - SimpleSAML_Logger::warning('Setting secure cookie on http not allowed.'); - return; - } - - if ($value === NULL) { - $expire = time() - 365*24*60*60; - } elseif ($params['lifetime'] === 0) { - $expire = 0; + if ($params !== NULL) { + $params = array_merge($this->getCookieParams(), $params); } else { - $expire = time() + $params['lifetime'];; + $params = $this->getCookieParams(); } - if (!setcookie($name, $value, $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly'])) { - throw new SimpleSAML_Error_Exception('Error setting cookie - headers already sent.'); - } + SimpleSAML_Utilities::setCookie($name, $value, $params); } } diff --git a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php index caf1067..60b033a 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php +++ b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerCookie.php @@ -11,7 +11,6 @@ * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp * @abstract - * @version $Id: SessionHandlerCookie.php 3025 2012-01-30 07:35:49Z olavmrk $ */ abstract class SimpleSAML_SessionHandlerCookie extends SimpleSAML_SessionHandler { @@ -39,6 +38,20 @@ extends SimpleSAML_SessionHandler { } + /** + * Create and set new session id. + * + * @return string The new session id. + */ + public function newSessionId() { + $this->session_id = self::createSessionID(); + SimpleSAML_Session::createSession($this->session_id); + $this->setCookie($this->cookie_name, $this->session_id); + + return $this->session_id; + } + + /** * Retrieve the session id of saved in the session cookie. * @@ -54,9 +67,7 @@ extends SimpleSAML_SessionHandler { /* Check if we have a valid session id. */ if(!self::isValidSessionID($this->session_id)) { /* We don't have a valid session. Create a new session id. */ - $this->session_id = self::createSessionID(); - SimpleSAML_Session::createSession($this->session_id); - $this->setCookie($this->cookie_name, $this->session_id); + return self::newSessionId(); } } @@ -64,6 +75,17 @@ extends SimpleSAML_SessionHandler { } + /** + * Retrieve the session cookie name. + * + * @return string The session cookie name. + */ + public function getSessionCookieName() { + + return $this->cookie_name; + } + + /* This static function creates a session id. A session id consists * of 32 random hexadecimal characters. * @@ -115,5 +137,3 @@ extends SimpleSAML_SessionHandler { } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php index e709eda..afb62a6 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php +++ b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerPHP.php @@ -9,10 +9,13 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id: SessionHandlerPHP.php 3025 2012-01-30 07:35:49Z olavmrk $ */ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { + /* This variable contains the session cookie name. */ + protected $cookie_name; + + /* Initialize the PHP session handling. This constructor is protected * because it should only be called from * SimpleSAML_SessionHandler::createSessionHandler(...). @@ -42,8 +45,12 @@ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { session_set_cookie_params($params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']); } - $cookiename = $config->getString('session.phpsession.cookiename', NULL); - if (!empty($cookiename)) session_name($cookiename); + $this->cookie_name = $config->getString('session.phpsession.cookiename', NULL); + if (!empty($this->cookie_name)) { + session_name($this->cookie_name); + } else { + $this->cookie_name = session_name(); + } $savepath = $config->getString('session.phpsession.savepath', NULL); if(!empty($savepath)) { @@ -53,6 +60,38 @@ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { } + /** + * Create and set new session id. + * + * @return string The new session id. + */ + public function newSessionId() { + $session_cookie_params = session_get_cookie_params(); + + if ($session_cookie_params['secure'] && !SimpleSAML_Utilities::isHTTPS()) { + throw new SimpleSAML_Error_Exception('Session start with secure cookie not allowed on http.'); + } + + if (headers_sent()) { + throw new SimpleSAML_Error_Exception('Cannot create new session - headers already sent.'); + } + + /* Generate new (secure) session id. */ + $sessionId = SimpleSAML_Utilities::stringToHex(SimpleSAML_Utilities::generateRandomBytes(16)); + SimpleSAML_Session::createSession($sessionId); + + if (session_id() !== '') { + /* Session already started, close it. */ + session_write_close(); + } + + session_id($sessionId); + session_start(); + + return session_id(); + } + + /** * Retrieve the session id of saved in the session cookie. * @@ -60,24 +99,16 @@ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { */ public function getCookieSessionId() { if(session_id() === '') { + if(!self::hasSessionCookie()) { + return self::newSessionId(); + } + $session_cookie_params = session_get_cookie_params(); if ($session_cookie_params['secure'] && !SimpleSAML_Utilities::isHTTPS()) { throw new SimpleSAML_Error_Exception('Session start with secure cookie not allowed on http.'); } - if(!self::hasSessionCookie()) { - - if (headers_sent()) { - throw new SimpleSAML_Error_Exception('Cannot create new session - headers already sent.'); - } - - /* Session cookie unset - session id not set. Generate new (secure) session id. */ - $sessionId = SimpleSAML_Utilities::stringToHex(SimpleSAML_Utilities::generateRandomBytes(16)); - SimpleSAML_Session::createSession($sessionId); - session_id($sessionId); - } - session_start(); } @@ -85,6 +116,17 @@ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { } + /** + * Retrieve the session cookie name. + * + * @return string The session cookie name. + */ + public function getSessionCookieName() { + + return $this->cookie_name; + } + + /** * Save the current session to the PHP session array. * @@ -145,8 +187,7 @@ class SimpleSAML_SessionHandlerPHP extends SimpleSAML_SessionHandler { */ public function hasSessionCookie() { - $cookieName = session_name(); - return array_key_exists($cookieName, $_COOKIE); + return array_key_exists($this->cookie_name, $_COOKIE); } diff --git a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php index cd01a5a..5b15cf8 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php +++ b/inc/simplesamlphp/lib/SimpleSAML/SessionHandlerStore.php @@ -4,7 +4,6 @@ * Session storage in the datastore. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_SessionHandlerStore extends SimpleSAML_SessionHandlerCookie { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Stats.php b/inc/simplesamlphp/lib/SimpleSAML/Stats.php index 3e3b3af..ec76a3f 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Stats.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Stats.php @@ -6,7 +6,6 @@ * This class is responsible for taking a statistics event and logging it. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Stats { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Stats/Output.php b/inc/simplesamlphp/lib/SimpleSAML/Stats/Output.php index f1ecc1f..b11c7a9 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Stats/Output.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Stats/Output.php @@ -4,7 +4,6 @@ * Interface for statistics outputs. * * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_Stats_Output { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Store.php b/inc/simplesamlphp/lib/SimpleSAML/Store.php index 9447c44..e45d4a7 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Store.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Store.php @@ -4,7 +4,6 @@ * Base class for datastores. * * @package simpleSAMLphp - * @version $Id$ */ abstract class SimpleSAML_Store { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Store/Memcache.php b/inc/simplesamlphp/lib/SimpleSAML/Store/Memcache.php index 15660ac..d4be5ae 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Store/Memcache.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Store/Memcache.php @@ -4,7 +4,6 @@ * A memcache based datastore. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Store_Memcache extends SimpleSAML_Store { diff --git a/inc/simplesamlphp/lib/SimpleSAML/Store/SQL.php b/inc/simplesamlphp/lib/SimpleSAML/Store/SQL.php index 7b837c0..e1b15f5 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Store/SQL.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Store/SQL.php @@ -4,7 +4,6 @@ * A SQL datastore. * * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Store_SQL extends SimpleSAML_Store { @@ -252,6 +251,10 @@ class SimpleSAML_Store_SQL extends SimpleSAML_Store { } $value = urldecode($value); $value = unserialize($value); + + if ($value === FALSE) { + return NULL; + } return $value; } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Utilities.php b/inc/simplesamlphp/lib/SimpleSAML/Utilities.php index c06c94e..e4a9f98 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Utilities.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Utilities.php @@ -5,7 +5,6 @@ * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Utilities.php 3085 2012-05-04 08:03:01Z olavmrk $ */ class SimpleSAML_Utilities { @@ -59,7 +58,11 @@ class SimpleSAML_Utilities { if(strstr($currenthost, ":")) { $currenthostdecomposed = explode(":", $currenthost); - $currenthost = $currenthostdecomposed[0]; + $port = array_pop($currenthostdecomposed); + if (!is_numeric($port)) { + array_push($currenthostdecomposed, $port); + } + $currenthost = implode($currenthostdecomposed, ":"); } return $currenthost; @@ -193,7 +196,7 @@ class SimpleSAML_Utilities { $requestURI = $_SERVER['REQUEST_URI']; if ($requestURI[0] !== '/') { - /* We probably have an url on the form: http://server/. */ + /* We probably have a URL of the form: http://server/. */ if (preg_match('#^https?://[^/]*(/.*)#i', $requestURI, $matches)) { $requestURI = $matches[1]; } @@ -219,7 +222,7 @@ class SimpleSAML_Utilities { $baseURL = $globalConfig->getString('baseurlpath', 'simplesaml/'); if (preg_match('#^https?://.*/$#D', $baseURL, $matches)) { - /* full url in baseurlpath, override local server values */ + /* full URL in baseurlpath, override local server values */ return $baseURL; } elseif ( (preg_match('#^/?([^/]?.*/)$#D', $baseURL, $matches)) || @@ -294,18 +297,83 @@ class SimpleSAML_Utilities { } + /** + * Check if a URL is valid and is in our list of allowed URLs. + * + * @param string $url The URL to check. + * @param array $trustedSites An optional white list of domains. If none + * specified, the 'trusted.url.domains' configuration directive will be + * used. + * @return string The normalized URL itself if it is allowed. + * @throws SimpleSAML_Error_Exception if the URL is malformed or is not + * allowed by configuration. + */ + public static function checkURLAllowed($url, array $trustedSites = NULL) { + if (empty($url)) { + return ''; + } + $url = self::normalizeURL($url); + + // get the white list of domains + if ($trustedSites === NULL) { + $trustedSites = SimpleSAML_Configuration::getInstance()->getArray('trusted.url.domains', NULL); + if ($trustedSites === NULL) { + $trustedSites = SimpleSAML_Configuration::getInstance()->getArray('redirect.trustedsites', NULL); + } + } + + // validates the URL's host is among those allowed + if ($trustedSites !== NULL) { + assert(is_array($trustedSites)); + preg_match('@^https?://([^/]+)@i', $url, $matches); + $hostname = $matches[1]; + + // add self host to the white list + $self_host = self::getSelfHost(); + $trustedSites[] = $self_host; + + /* Throw exception due to redirection to untrusted site */ + if (!in_array($hostname, $trustedSites)) { + throw new SimpleSAML_Error_Exception('URL not allowed: '.$url); + } + } + return $url; + } + + + /** + * Get the ID and (optionally) a URL embedded in a StateID, + * in the form 'id:url'. + * + * @param string $stateId The state ID to use. + * @return array A hashed array with the ID and the URL (if any), + * in the 'id' and 'url' keys, respectively. If there's no URL + * in the input parameter, NULL will be returned as the value for + * the 'url' key. + */ + public static function parseStateID($stateId) { + $tmp = explode(':', $stateId, 2); + $id = $tmp[0]; + $url = NULL; + if (count($tmp) === 2) { + $url = $tmp[1]; + } + return array('id' => $id, 'url' => $url); + } + + public static function checkDateConditions($start=NULL, $end=NULL) { $currentTime = time(); - if (! empty($start)) { - $startTime = self::parseSAML2Time($start); + if (!empty($start)) { + $startTime = SAML2_Utils::xsDateTimeToTimestamp($start); /* Allow for a 10 minute difference in Time */ if (($startTime < 0) || (($startTime - 600) > $currentTime)) { return FALSE; } } - if (! empty($end)) { - $endTime = self::parseSAML2Time($end); + if (!empty($end)) { + $endTime = SAML2_Utils::xsDateTimeToTimestamp($end); if (($endTime < 0) || ($endTime <= $currentTime)) { return FALSE; } @@ -333,55 +401,6 @@ class SimpleSAML_Utilities { } - /* This function converts a SAML2 timestamp on the form - * yyyy-mm-ddThh:mm:ss(\.s+)?Z to a UNIX timestamp. The sub-second - * part is ignored. - * - * Andreas comments: - * I got this timestamp from Shibboleth 1.3 IdP: 2008-01-17T11:28:03.577Z - * Therefore I added to possibliity to have microseconds to the format. - * Added: (\.\\d{1,3})? to the regex. - * - * - * Parameters: - * $time The time we should convert. - * - * Returns: - * $time converted to a unix timestamp. - */ - public static function parseSAML2Time($time) { - $matches = array(); - - - /* We use a very strict regex to parse the timestamp. */ - if(preg_match('/^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)' . - 'T(\\d\\d):(\\d\\d):(\\d\\d)(?:\\.\\d+)?Z$/D', - $time, $matches) == 0) { - throw new Exception( - 'Invalid SAML2 timestamp passed to' . - ' parseSAML2Time: ' . $time); - } - - /* Extract the different components of the time from the - * matches in the regex. intval will ignore leading zeroes - * in the string. - */ - $year = intval($matches[1]); - $month = intval($matches[2]); - $day = intval($matches[3]); - $hour = intval($matches[4]); - $minute = intval($matches[5]); - $second = intval($matches[6]); - - /* We use gmmktime because the timestamp will always be given - * in UTC. - */ - $ts = gmmktime($hour, $minute, $second, $month, $day, $year); - - return $ts; - } - - /** * Interpret a ISO8601 duration value relative to a given timestamp. * @@ -538,95 +557,20 @@ class SimpleSAML_Utilities { return true; } - - /* This function redirects the user to the specified address. - * An optional set of query parameters can be appended by passing - * them in an array. - * - * This function will use the HTTP 303 See Other redirect if the - * current request is a POST request and the HTTP version is HTTP/1.1. - * Otherwise a HTTP 302 Found redirect will be used. - * - * The fuction will also generate a simple web page with a clickable - * link to the target page. - * - * Parameters: - * $url URL we should redirect to. This URL may include - * query parameters. If this URL is a relative URL - * (starting with '/'), then it will be turned into an - * absolute URL by prefixing it with the absolute URL - * to the root of the website. - * $parameters Array with extra query string parameters which should - * be appended to the URL. The name of the parameter is - * the array index. The value of the parameter is the - * value stored in the index. Both the name and the value - * will be urlencoded. If the value is NULL, then the - * parameter will be encoded as just the name, without a - * value. - * - * Returns: - * This function never returns. + /* + * This is a temporary function, holding the redirect() functionality, + * meanwhile we are deprecating the it. */ - public static function redirect($url, $parameters = array()) { - assert(is_string($url)); - assert(strlen($url) > 0); - assert(is_array($parameters)); - - /* Check for relative URL. */ - if(substr($url, 0, 1) === '/') { - /* Prefix the URL with the url to the root of the - * website. - */ - $url = self::selfURLhost() . $url; + private static function _doRedirect($url, $parameters = array()) { + if (!empty($parameters)) { + $url = self::addURLparameter($url, $parameters); } - /* Verify that the URL is to a http or https site. */ - if (!preg_match('@^https?://@i', $url)) { - throw new SimpleSAML_Error_Exception('Redirect to invalid URL: ' . $url); - } - - /* Determine which prefix we should put before the first - * parameter. - */ - if(strpos($url, '?') === FALSE) { - $paramPrefix = '?'; - } else { - $paramPrefix = '&'; - } - - /* Iterate over the parameters and append them to the query - * string. - */ - foreach($parameters as $name => $value) { - - /* Encode the parameter. */ - if($value === NULL) { - $param = urlencode($name); - } elseif (is_array($value)) { - $param = ""; - foreach ($value as $val) { - $param .= urlencode($name) . "[]=" . urlencode($val) . '&'; - } - } else { - $param = urlencode($name) . '=' . - urlencode($value); - } - - /* Append the parameter to the query string. */ - $url .= $paramPrefix . $param; - - /* Every following parameter is guaranteed to follow - * another parameter. Therefore we use the '&' prefix. - */ - $paramPrefix = '&'; - } - - /* Set the HTTP result code. This is either 303 See Other or * 302 Found. HTTP 303 See Other is sent if the HTTP version * is HTTP/1.1 and the request type was a POST request. */ - if($_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.1' && + if ($_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.1' && $_SERVER['REQUEST_METHOD'] === 'POST') { $code = 303; } else { @@ -634,7 +578,7 @@ class SimpleSAML_Utilities { } if (strlen($url) > 2048) { - SimpleSAML_Logger::warning('Redirecting to URL longer than 2048 bytes.'); + SimpleSAML_Logger::warning('Redirecting to a URL longer than 2048 bytes.'); } /* Set the location header. */ @@ -657,7 +601,8 @@ class SimpleSAML_Utilities { echo '

Redirect

'; echo '
'; echo ''; @@ -665,8 +610,101 @@ class SimpleSAML_Utilities { /* End script execution. */ exit; + } + + + /** + * This function redirects the user to the specified address. + * + * This function will use the "HTTP 303 See Other" redirection if the + * current request used the POST method and the HTTP version is 1.1. + * Otherwise, a "HTTP 302 Found" redirection will be used. + * + * The fuction will also generate a simple web page with a clickable + * link to the target page. + * + * @param string $url The URL we should redirect to. This URL may include + * query parameters. If this URL is a relative URL (starting with '/'), + * then it will be turned into an absolute URL by prefixing it with the + * absolute URL to the root of the website. + * @param string[] $parameters An array with extra query string parameters + * which should be appended to the URL. The name of the parameter is the + * array index. The value of the parameter is the value stored in the index. + * Both the name and the value will be urlencoded. If the value is NULL, + * then the parameter will be encoded as just the name, without a value. + * @param string[] $allowed_redirect_hosts An array with a whitelist of + * hosts for which redirects are allowed. If NULL, redirections will be + * allowed to any host. Otherwise, the host of the $url provided must be + * present in this parameter. If the host is not whitelisted, an exception + * will be thrown. + * + * @return void This function never returns. + * @deprecated 1.12.0 This function will be removed from the API. Instead, + * use the redirectTrustedURL or redirectUntrustedURL functions + * accordingly. + */ + public static function redirect($url, $parameters = array(), + $allowed_redirect_hosts = NULL) { + + assert(is_string($url)); + assert(strlen($url) > 0); + assert(is_array($parameters)); + + if ($allowed_redirect_hosts !== NULL) { + $url = self::checkURLAllowed($url, $allowed_redirect_hosts); + } else { + $url = self::normalizeURL($url); + } + self::_doRedirect($url, $parameters); } + /** + * This function redirects to the specified URL without performing + * any security checks. Please, do NOT use this function with user + * supplied URLs. + * + * This function will use the "HTTP 303 See Other" redirection if the + * current request used the POST method and the HTTP version is 1.1. + * Otherwise, a "HTTP 302 Found" redirection will be used. + * + * The fuction will also generate a simple web page with a clickable + * link to the target URL. + * + * @param string $url The URL we should redirect to. This URL may include + * query parameters. If this URL is a relative URL (starting with '/'), + * then it will be turned into an absolute URL by prefixing it with the + * absolute URL to the root of the website. + * @param string[] $parameters An array with extra query string parameters + * which should be appended to the URL. The name of the parameter is the + * array index. The value of the parameter is the value stored in the index. + * Both the name and the value will be urlencoded. If the value is NULL, + * then the parameter will be encoded as just the name, without a value. + * + * @return void This function never returns. + */ + public static function redirectTrustedURL($url, $parameters = array()) { + $url = self::normalizeURL($url); + self::_doRedirect($url, $parameters); + } + + /** + * This function redirects to the specified URL after performing the + * appropriate security checks on it. Particularly, it will make sure that + * the provided URL is allowed by the 'redirect.trustedsites' directive + * in the configuration. + * + * If the aforementioned option is not set or the URL does correspond to a + * trusted site, it performs a redirection to it. If the site is not + * trusted, an exception will be thrown. + * + * See the redirectTrustedURL function for more details. + * + * @return void This function never returns. + */ + public static function redirectUntrustedURL($url, $parameters = array()) { + $url = self::checkURLAllowed($url); + self::_doRedirect($url, $parameters); + } /** * This function transposes a two-dimensional array, so that @@ -899,6 +937,7 @@ class SimpleSAML_Utilities { * @param $schema The schema which should be used. * @return Returns a string with the errors if validation fails. An empty string is * returned if validation passes. + * @deprecated */ public static function validateXML($xml, $schema) { assert('is_string($xml) || $xml instanceof DOMDocument'); @@ -944,6 +983,7 @@ class SimpleSAML_Utilities { * * @param $message The message which should be validated, as a string. * @param $type The type of document - can be either 'saml20', 'saml11' or 'saml-meta'. + * @deprecated */ public static function validateXMLDocument($message, $type) { assert('is_string($message)'); @@ -988,7 +1028,12 @@ class SimpleSAML_Utilities { } - public static function generateRandomBytesMTrand($length) { + /** + * @deprecated + * @param int $length The amount of random bytes to generate. + * @return string A string of $length random bytes. + */ + public static function generateRandomBytesMTrand($length) { /* Use mt_rand to generate $length random bytes. */ $data = ''; @@ -1003,47 +1048,17 @@ class SimpleSAML_Utilities { /** * This function generates a binary string containing random bytes. * - * It will use /dev/urandom if available, and fall back to the builtin mt_rand()-function if not. + * It is implemented as a wrapper of the openssl_random_pseudo_bytes function, + * available since PHP 5.3.0. * - * @param $length The number of random bytes to return. - * @return A string of lenght $length with random bytes. + * @param int $length The number of random bytes to return. + * @param boolean $fallback Deprecated. + * @return string A string of $length random bytes. */ public static function generateRandomBytes($length, $fallback = TRUE) { - static $fp = NULL; assert('is_int($length)'); - if (function_exists('openssl_random_pseudo_bytes')) { - return openssl_random_pseudo_bytes($length); - } - - if($fp === NULL) { - if (@file_exists('/dev/urandom')) { - $fp = @fopen('/dev/urandom', 'rb'); - } else { - $fp = FALSE; - } - } - - if($fp !== FALSE) { - /* Read random bytes from /dev/urandom. */ - $data = fread($fp, $length); - if($data === FALSE) { - throw new Exception('Error reading random data.'); - } - if(strlen($data) != $length) { - SimpleSAML_Logger::warning('Did not get requested number of bytes from random source. Requested (' . $length . ') got (' . strlen($data) . ')'); - if ($fallback) { - $data = self::generateRandomBytesMTrand($length); - } else { - throw new Exception('Did not get requested number of bytes from random source. Requested (' . $length . ') got (' . strlen($data) . ')'); - } - } - } else { - /* Use mt_rand to generate $length random bytes. */ - $data = self::generateRandomBytesMTrand($length); - } - - return $data; + return openssl_random_pseudo_bytes($length); } @@ -1128,11 +1143,10 @@ class SimpleSAML_Utilities { */ public static function resolveURL($url, $base = NULL) { if($base === NULL) { - $base = SimpleSAML_Utilities::getBaseURL(); + $base = self::getBaseURL(); } - - if(!preg_match('$^((((\w+:)//[^/]+)(/[^?#]*))(?:\?[^#]*)?)(?:#.*)?$', $base, $baseParsed)) { + if(!preg_match('/^((((\w+:)\/\/[^\/]+)(\/[^?#]*))(?:\?[^#]*)?)(?:#.*)?/', $base, $baseParsed)) { throw new Exception('Unable to parse base url: ' . $base); } @@ -1193,7 +1207,7 @@ class SimpleSAML_Utilities { /** - * Normalizes an URL to an absolute URL and validate it. + * Normalizes a URL to an absolute URL and validate it. * * In addition to resolving the URL, this function makes sure that it is * a link to a http or https site. @@ -1608,7 +1622,7 @@ class SimpleSAML_Utilities { */ public static function isAdmin() { - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); return $session->isValid('admin') || $session->isValid('login-admin'); } @@ -1618,7 +1632,7 @@ class SimpleSAML_Utilities { * Retrieve a admin login URL. * * @param string|NULL $returnTo The URL the user should arrive on after admin authentication. - * @return string An URL which can be used for admin authentication. + * @return string A URL which can be used for admin authentication. */ public static function getAdminLoginURL($returnTo = NULL) { assert('is_string($returnTo) || is_null($returnTo)'); @@ -1643,7 +1657,7 @@ class SimpleSAML_Utilities { return; } - $returnTo = SimpleSAML_Utilities::selfURL(); + $returnTo = self::selfURL(); /* Not authenticated as admin user. Start authentication. */ @@ -1654,7 +1668,7 @@ class SimpleSAML_Utilities { /* For backwards-compatibility. */ $config = SimpleSAML_Configuration::getInstance(); - SimpleSAML_Utilities::redirect('/' . $config->getBaseURL() . 'auth/login-admin.php', + self::redirectTrustedURL('/' . $config->getBaseURL() . 'auth/login-admin.php', array('RelayState' => $returnTo) ); } @@ -1694,7 +1708,7 @@ class SimpleSAML_Utilities { * * @param string $destination The destination URL. * @param array $post The name-value pairs which will be posted to the destination. - * @return string An URL which can be accessed to post the data. + * @return string A URL which can be accessed to post the data. */ public static function createPostRedirectLink($destination, $post) { assert('is_string($destination)'); @@ -1712,7 +1726,7 @@ class SimpleSAML_Utilities { 'url' => $destination, ); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->setData('core_postdatalink', $postId, $postData); $url = SimpleSAML_Module::getModuleURL('core/postredirect.php', array('RedirId' => $postId)); @@ -1727,7 +1741,7 @@ class SimpleSAML_Utilities { * * @param string $destination The destination URL. * @param array $post The name-value pairs which will be posted to the destination. - * @return string An URL which can be accessed to post the data. + * @return string A URL which can be accessed to post the data. */ public static function createHttpPostRedirectLink($destination, $post) { assert('is_string($destination)'); @@ -1739,7 +1753,7 @@ class SimpleSAML_Utilities { 'url' => $destination, ); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); $session->setData('core_postdatalink', $postId, $postData); $redirInfo = base64_encode(self::aesEncrypt($session->getSessionId() . ':' . $postId)); @@ -1758,6 +1772,7 @@ class SimpleSAML_Utilities { * @param string $certificate The certificate, in PEM format. * @param string $caFile File with trusted certificates, in PEM-format. * @return boolean|string TRUE on success, or a string with error messages if it failed. + * @deprecated */ private static function validateCABuiltIn($certificate, $caFile) { assert('is_string($certificate)'); @@ -1792,6 +1807,7 @@ class SimpleSAML_Utilities { * @param string $certificate The certificate, in PEM format. * @param string $caFile File with trusted certificates, in PEM-format. * @return boolean|string TRUE on success, a string with error messages on failure. + * @deprecated */ private static function validateCAExec($certificate, $caFile) { assert('is_string($certificate)'); @@ -1848,6 +1864,7 @@ class SimpleSAML_Utilities { * * @param string $certificate The certificate, in PEM format. * @param string $caFile File with trusted certificates, in PEM-format. + * @deprecated */ public static function validateCA($certificate, $caFile) { assert('is_string($certificate)'); @@ -1931,9 +1948,10 @@ class SimpleSAML_Utilities { * @param string $filename The name of the file. * @param string $data The data we should write to the file. */ - public static function writeFile($filename, $data) { + public static function writeFile($filename, $data, $mode=0600) { assert('is_string($filename)'); assert('is_string($data)'); + assert('is_numeric($mode)'); $tmpFile = $filename . '.new.' . getmypid() . '.' . php_uname('n'); @@ -1944,7 +1962,7 @@ class SimpleSAML_Utilities { } if (!self::isWindowsOS()) { - $res = chmod($tmpFile, 0600); + $res = chmod($tmpFile, $mode); if ($res === FALSE) { unlink($tmpFile); throw new SimpleSAML_Error_Exception('Error changing file mode ' . $tmpFile . @@ -2090,7 +2108,7 @@ class SimpleSAML_Utilities { public static function checkCookie($retryURL = NULL) { assert('is_string($retryURL) || is_null($retryURL)'); - $session = SimpleSAML_Session::getInstance(); + $session = SimpleSAML_Session::getSessionFromRequest(); if ($session->hasSessionCookie()) { return; } @@ -2099,9 +2117,9 @@ class SimpleSAML_Utilities { $url = SimpleSAML_Module::getModuleURL('core/no_cookie.php'); if ($retryURL !== NULL) { - $url = SimpleSAML_Utilities::addURLParameter($url, array('retryURL' => $retryURL)); + $url = self::addURLParameter($url, array('retryURL' => $retryURL)); } - SimpleSAML_Utilities::redirect($url); + self::redirectTrustedURL($url); } @@ -2171,6 +2189,30 @@ class SimpleSAML_Utilities { if (!isset($context['http']['request_fulluri'])) { $context['http']['request_fulluri'] = TRUE; } + // If the remote endpoint over HTTPS uses the SNI extension + // (Server Name Indication RFC 4366), the proxy could + // introduce a mismatch between the names in the + // Host: HTTP header and the SNI_server_name in TLS + // negotiation (thanks to Cristiano Valli @ GARR-IDEM + // to have pointed this problem). + // See: https://bugs.php.net/bug.php?id=63519 + // These controls will force the same value for both fields. + // Marco Ferrante (marco@csita.unige.it), Nov 2012 + if (preg_match('#^https#i', $path) + && defined('OPENSSL_TLSEXT_SERVER_NAME') + && OPENSSL_TLSEXT_SERVER_NAME) { + // Extract the hostname + $hostname = parse_url($path, PHP_URL_HOST); + if (!empty($hostname)) { + $context['ssl'] = array( + 'SNI_server_name' => $hostname, + 'SNI_enabled' => TRUE, + ); + } + else { + SimpleSAML_Logger::warning('Invalid URL format or local URL used through a proxy'); + } + } } $context = stream_context_create($context); @@ -2288,4 +2330,64 @@ class SimpleSAML_Utilities { return substr(strtoupper(PHP_OS),0,3) == 'WIN'; } + + /** + * Set a cookie. + * + * @param string $name The name of the session cookie. + * @param string|NULL $value The value of the cookie. Set to NULL to delete the cookie. + * @param array|NULL $params Cookie parameters. + * @param bool $throw Whether to throw exception if setcookie fails. + */ + public static function setCookie($name, $value, array $params = NULL, $throw = TRUE) { + assert('is_string($name)'); + assert('is_string($value) || is_null($value)'); + + $default_params = array( + 'lifetime' => 0, + 'expire' => NULL, + 'path' => '/', + 'domain' => NULL, + 'secure' => FALSE, + 'httponly' => TRUE, + 'raw' => FALSE, + ); + + if ($params !== NULL) { + $params = array_merge($default_params, $params); + } else { + $params = $default_params; + } + + // Do not set secure cookie if not on HTTPS + if ($params['secure'] && !self::isHTTPS()) { + SimpleSAML_Logger::warning('Setting secure cookie on http not allowed.'); + return; + } + + if ($value === NULL) { + $expire = time() - 365*24*60*60; + } elseif (isset($params['expire'])) { + $expire = $params['expire']; + } elseif ($params['lifetime'] === 0) { + $expire = 0; + } else { + $expire = time() + $params['lifetime']; + } + + if ($params['raw']) { + $success = setrawcookie($name, $value, $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly']); + } else { + $success = setcookie($name, $value, $expire, $params['path'], $params['domain'], $params['secure'], $params['httponly']); + } + + if (!$success) { + if ($throw) { + throw new SimpleSAML_Error_Exception('Error setting cookie - headers already sent.'); + } else { + SimpleSAML_Logger::warning('Error setting cookie - headers already sent.'); + } + } + } + } diff --git a/inc/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php b/inc/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php index 76c1b18..1bf2dd2 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php +++ b/inc/simplesamlphp/lib/SimpleSAML/Utils/Crypto.php @@ -5,7 +5,6 @@ * * @author Dyonisius Visser, TERENA. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_Utils_Crypto { @@ -30,7 +29,7 @@ class SimpleSAML_Utils_Crypto { if(!$salt) { // Default 8 byte salt, but 4 byte for LDAP SHA1 hashes $bytes = ($algo == 'SSHA1') ? 4 : 8; - $salt = SimpleSAML_Utilities::generateRandomBytes($bytes, TRUE); + $salt = SimpleSAML_Utilities::generateRandomBytes($bytes); } if($algo[0] == 'S' && in_array(substr(strtolower($algo),1), hash_algos())) { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XHTML/EMail.php b/inc/simplesamlphp/lib/SimpleSAML/XHTML/EMail.php index f167413..275295a 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XHTML/EMail.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XHTML/EMail.php @@ -5,7 +5,6 @@ * * @author Andreas kre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_XHTML_EMail { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php b/inc/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php index fb17ac1..30c66da 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XHTML/IdPDisco.php @@ -10,7 +10,6 @@ * @author Olav Morken, UNINETT AS. * @author Andreas Åkre Solberg , UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_XHTML_IdPDisco { @@ -98,7 +97,7 @@ class SimpleSAML_XHTML_IdPDisco { /* Initialize standard classes. */ $this->config = SimpleSAML_Configuration::getInstance(); $this->metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); - $this->session = SimpleSAML_Session::getInstance(); + $this->session = SimpleSAML_Session::getSessionFromRequest(); $this->instance = $instance; $this->metadataSets = $metadataSets; @@ -124,7 +123,7 @@ class SimpleSAML_XHTML_IdPDisco { if(!array_key_exists('return', $_GET)) { throw new Exception('Missing parameter: return'); } else { - $this->returnURL = $_GET['return']; + $this->returnURL = SimpleSAML_Utilities::checkURLAllowed($_GET['return']); } $this->isPassive = FALSE; @@ -190,13 +189,15 @@ class SimpleSAML_XHTML_IdPDisco { protected function setCookie($name, $value) { $prefixedName = 'idpdisco_' . $this->instance . '_' . $name; - /* We save the cookies for 90 days. */ - $saveUntil = time() + 60*60*24*90; + $params = array( + /* We save the cookies for 90 days. */ + 'lifetime' => (60*60*24*90), + /* The base path for cookies. This should be the installation directory for simpleSAMLphp. */ + 'path' => ('/' . $this->config->getBaseUrl()), + 'httponly' => FALSE, + ); - /* The base path for cookies. This should be the installation directory for simpleSAMLphp. */ - $cookiePath = '/' . $this->config->getBaseUrl(); - - setcookie($prefixedName, $value, $saveUntil, $cookiePath); + SimpleSAML_Utilities::setCookie($prefixedName, $value, $params, FALSE); } @@ -396,9 +397,9 @@ class SimpleSAML_XHTML_IdPDisco { $this->setPreviousIdP($idp); if($this->saveIdP()) { - $this->setCookie('remember', 1); + $this->setCookie('remember', '1'); } else { - $this->setCookie('remember', 0); + $this->setCookie('remember', '0'); } return $idp; @@ -461,7 +462,7 @@ class SimpleSAML_XHTML_IdPDisco { $extDiscoveryStorage = $this->config->getString('idpdisco.extDiscoveryStorage', NULL); if ($extDiscoveryStorage !== NULL) { $this->log('Choice made [' . $idp . '] (Forwarding to external discovery storage)'); - SimpleSAML_Utilities::redirect($extDiscoveryStorage, array( + SimpleSAML_Utilities::redirectTrustedURL($extDiscoveryStorage, array( // $this->returnIdParam => $idp, 'entityID' => $this->spEntityId, 'IdPentityID' => $idp, @@ -472,7 +473,7 @@ class SimpleSAML_XHTML_IdPDisco { } else { $this->log('Choice made [' . $idp . '] (Redirecting the user back. returnIDParam=' . $this->returnIdParam . ')'); - SimpleSAML_Utilities::redirect($this->returnURL, array($this->returnIdParam => $idp)); + SimpleSAML_Utilities::redirectTrustedURL($this->returnURL, array($this->returnIdParam => $idp)); } return; @@ -480,7 +481,7 @@ class SimpleSAML_XHTML_IdPDisco { if ($this->isPassive) { $this->log('Choice not made. (Redirecting the user back without answer)'); - SimpleSAML_Utilities::redirect($this->returnURL); + SimpleSAML_Utilities::redirectTrustedURL($this->returnURL); return; } @@ -498,7 +499,7 @@ class SimpleSAML_XHTML_IdPDisco { if(sizeof($idpintersection) == 1) { $this->log('Choice made [' . $idpintersection[0] . '] (Redirecting the user back. returnIDParam=' . $this->returnIdParam . ')'); - SimpleSAML_Utilities::redirect($this->returnURL, array($this->returnIdParam => $idpintersection[0])); + SimpleSAML_Utilities::redirectTrustedURL($this->returnURL, array($this->returnIdParam => $idpintersection[0])); } /* diff --git a/inc/simplesamlphp/lib/SimpleSAML/XHTML/Template.php b/inc/simplesamlphp/lib/SimpleSAML/XHTML/Template.php index 6706fc5..667033a 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XHTML/Template.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XHTML/Template.php @@ -5,7 +5,6 @@ * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Template.php 3001 2011-12-19 13:06:18Z comel.ah $ */ class SimpleSAML_XHTML_Template { @@ -38,6 +37,12 @@ class SimpleSAML_XHTML_Template { private $defaultDictionary = NULL; + /** + * HTTP GET language parameter name. + */ + private $languageParameterName = 'language'; + + /** * Constructor * @@ -52,9 +57,10 @@ class SimpleSAML_XHTML_Template { $this->data['baseurlpath'] = $this->configuration->getBaseURL(); $this->availableLanguages = $this->configuration->getArray('language.available', array('en')); - - if (isset($_GET['language'])) { - $this->setLanguage($_GET['language']); + + $this->languageParameterName = $this->configuration->getString('language.parameter.name', 'language'); + if (isset($_GET[$this->languageParameterName])) { + $this->setLanguage($_GET[$this->languageParameterName], $this->configuration->getBoolean('language.parameter.setcookie', TRUE)); } if($defaultDictionary !== NULL && substr($defaultDictionary, -4) === '.php') { @@ -572,7 +578,7 @@ class SimpleSAML_XHTML_Template { public function show() { $filename = $this->findTemplatePath($this->template); - require_once($filename); + require($filename); } @@ -669,9 +675,10 @@ class SimpleSAML_XHTML_Template { public static function getLanguageCookie() { $config = SimpleSAML_Configuration::getInstance(); $availableLanguages = $config->getArray('language.available', array('en')); + $name = $config->getString('language.cookie.name', 'language'); - if (isset($_COOKIE['language'])) { - $language = strtolower((string)$_COOKIE['language']); + if (isset($_COOKIE[$name])) { + $language = strtolower((string)$_COOKIE[$name]); if (in_array($language, $availableLanguages, TRUE)) { return $language; } @@ -696,7 +703,16 @@ class SimpleSAML_XHTML_Template { if (!in_array($language, $availableLanguages, TRUE) || headers_sent()) { return; } - setcookie('language', $language, time()+60*60*24*900, '/'); + + $name = $config->getString('language.cookie.name', 'language'); + $params = array( + 'lifetime' => ($config->getInteger('language.cookie.lifetime', 60*60*24*900)), + 'domain' => ($config->getString('language.cookie.domain', NULL)), + 'path' => ($config->getString('language.cookie.path', '/')), + 'httponly' => FALSE, + ); + + SimpleSAML_Utilities::setCookie($name, $language, $params, FALSE); } } diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Errors.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Errors.php index 9cd6d7e..ed6cbd3 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Errors.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Errors.php @@ -8,7 +8,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_XML_Errors { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Parser.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Parser.php index a40d79c..65a5091 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Parser.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Parser.php @@ -5,7 +5,6 @@ * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Parser.php 222 2008-01-30 11:10:10Z andreassolberg $ */ class SimpleSAML_XML_Parser { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php index 2028eec..ccb4d94 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnRequest.php @@ -6,7 +6,6 @@ * * @author Andreas kre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: AuthnRequest.php 2070 2010-01-05 10:19:28Z olavmrk $ */ class SimpleSAML_XML_Shib13_AuthnRequest { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php index 6c4a31a..1296cb2 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Shib13/AuthnResponse.php @@ -5,7 +5,6 @@ * * @author Andreas kre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: AuthnResponse.php 2514 2010-08-10 11:27:15Z olavmrk $ */ class SimpleSAML_XML_Shib13_AuthnResponse { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Signer.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Signer.php index 7072e27..7c56903 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Signer.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Signer.php @@ -7,7 +7,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id$ */ class SimpleSAML_XML_Signer { diff --git a/inc/simplesamlphp/lib/SimpleSAML/XML/Validator.php b/inc/simplesamlphp/lib/SimpleSAML/XML/Validator.php index d1b5e3d..50876eb 100644 --- a/inc/simplesamlphp/lib/SimpleSAML/XML/Validator.php +++ b/inc/simplesamlphp/lib/SimpleSAML/XML/Validator.php @@ -5,7 +5,6 @@ * * @author Olav Morken, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Validator.php 1598 2009-08-03 12:44:42Z olavmrk $ */ class SimpleSAML_XML_Validator { diff --git a/inc/simplesamlphp/lib/_autoload.php b/inc/simplesamlphp/lib/_autoload.php index 8e0ec7c..bbe3681 100644 --- a/inc/simplesamlphp/lib/_autoload.php +++ b/inc/simplesamlphp/lib/_autoload.php @@ -1,70 +1,21 @@ = 5.1.2. - */ - spl_autoload_register('SimpleSAML_autoload'); -} else { - - /* spl_autoload_register is unavailable - let us hope that no one else uses the __autoload function. */ - - /** - * Autoload function for those who don't have spl_autoload_register. - * - * @param $className The name of the requested class. - */ - function __autoload($className) { - SimpleSAML_autoload($className); - } +// SSP is loaded as a library. +else if (file_exists(dirname(dirname(__FILE__)) . '/../../autoload.php')) { + require_once dirname(dirname(__FILE__)) . '/../../autoload.php'; +} +else { + throw new Exception('Unable to load Composer autoloader'); } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/lib/_autoload_modules.php b/inc/simplesamlphp/lib/_autoload_modules.php new file mode 100644 index 0000000..fcbc110 --- /dev/null +++ b/inc/simplesamlphp/lib/_autoload_modules.php @@ -0,0 +1,38 @@ + 'server.pem', 'certificate' => 'server.crt', 'auth' => 'example-userpass', + 'authproc' => array( + // Convert LDAP names to WS-Fed Claims. + 100 => array('class' => 'core:AttributeMap', 'name2claim'), + ), ); ?> diff --git a/inc/simplesamlphp/metadata-templates/saml20-idp-hosted.php b/inc/simplesamlphp/metadata-templates/saml20-idp-hosted.php index d470e98..87c03f6 100644 --- a/inc/simplesamlphp/metadata-templates/saml20-idp-hosted.php +++ b/inc/simplesamlphp/metadata-templates/saml20-idp-hosted.php @@ -2,7 +2,7 @@ /** * SAML 2.0 IdP configuration for simpleSAMLphp. * - * See: https://rnd.feide.no/content/idp-hosted-metadata-reference + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-hosted */ $metadata['__DYNAMIC:1__'] = array( @@ -23,6 +23,26 @@ $metadata['__DYNAMIC:1__'] = array( */ 'auth' => 'example-userpass', + /* + * WARNING: SHA-1 is disallowed starting January the 1st, 2014. + * + * Uncomment the following option to start using SHA-256 for your signatures. + * Currently, simpleSAMLphp defaults to SHA-1, which has been deprecated since + * 2011, and will be disallowed by NIST as of 2014. Please refer to the following + * document for more information: + * + * http://csrc.nist.gov/publications/nistpubs/800-131A/sp800-131A.pdf + * + * If you are uncertain about service providers supporting SHA-256 or other + * algorithms of the SHA-2 family, you can configure it individually in the + * SP-remote metadata set for those that support it. Once you are certain that + * all your configured SPs support SHA-2, you can safely remove the configuration + * options in the SP-remote metadata set and uncomment the following option. + * + * Please refer to the IdP hosted reference for more information. + */ + //'signature.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', + /* Uncomment the following to use the uri NameFormat on attributes. */ /* 'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri', @@ -32,4 +52,20 @@ $metadata['__DYNAMIC:1__'] = array( ), */ + /* + * Uncomment the following to specify the registration information in the + * exported metadata. Refer to: + * http://docs.oasis-open.org/security/saml/Post2.0/saml-metadata-rpi/v1.0/cs01/saml-metadata-rpi-v1.0-cs01.html + * for more information. + */ + /* + 'RegistrationInfo' => array( + 'authority' => 'urn:mace:example.org', + 'instant' => '2008-01-17T11:28:03Z', + 'policies' => array( + 'en' => 'http://example.org/policy', + 'es' => 'http://example.org/politica', + ), + ), + */ ); diff --git a/inc/simplesamlphp/metadata-templates/saml20-idp-remote.php b/inc/simplesamlphp/metadata-templates/saml20-idp-remote.php index 63600b6..8824bc9 100644 --- a/inc/simplesamlphp/metadata-templates/saml20-idp-remote.php +++ b/inc/simplesamlphp/metadata-templates/saml20-idp-remote.php @@ -4,7 +4,7 @@ * * Remember to remove the IdPs you don't use from this file. * - * See: https://rnd.feide.no/content/idp-remote-metadata-reference + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote */ /* @@ -22,70 +22,3 @@ $metadata['https://openidp.feide.no'] = array( 'certFingerprint' => 'c9ed4dfb07caf13fc21e0fec1572047eb8a7a4cb' ); - -/* - * Feide, the norwegian federation. Test and production metadata. - */ -$metadata['https://idp-test.feide.no'] = array( - 'name' => array( - 'en' => 'Feide Test environment', - 'no' => 'Feide testmiljø', - ), - 'description' => 'Feide test environment (idp-test.feide.no). Authenticate with your identity from a school or university in Norway.', - - 'SingleSignOnService' => 'https://idp-test.feide.no/simplesaml/saml2/idp/SSOService.php', - 'SingleLogoutService' => 'https://idp-test.feide.no/simplesaml/saml2/idp/SingleLogoutService.php', - - 'certFingerprint' => 'fa982efdb69f26e8073c8f815a82a0c5885960a2', - 'hint.cidr' => '158.38.0.0/16', -); - -$metadata['https://idp.feide.no'] = array( - 'name' => 'Feide', - 'description' => array( - 'en' => 'Authenticate with your identity from a school or university in Norway.', - 'no' => 'Logg inn med din identitet fra skolen eller universitetet du er tilknyttet (i Norge).', - ), - 'SingleSignOnService' => 'https://idp.feide.no/simplesaml/saml2/idp/SSOService.php', - 'SingleLogoutService' => 'https://idp.feide.no/simplesaml/saml2/idp/SingleLogoutService.php', - 'certFingerprint' => 'cde69e332fa7dd0eaa99ee0ddf06916e8942ac53', - 'hint.cidr' => '158.38.0.0/16', -); - - - -/* - * Wayf, the danish federation metadata. - */ -$metadata['https://wayf.wayf.dk'] = array( - 'name' => array( - 'en' => 'DK-WAYF Production server', - 'da' => 'DK-WAYF Produktionsmiljøet', - ), - 'description' => 'Login with your identity from a danish school, university or library.', - 'SingleSignOnService' => 'https://wayf.wayf.dk/saml2/idp/SSOService.php', - 'SingleLogoutService' => 'https://wayf.wayf.dk/saml2/idp/SingleLogoutService.php', - 'certFingerprint' => 'c215d7bf9d51c7805055239f66b957d9a72ff44b' -); - -$metadata['https://betawayf.wayf.dk'] = array( - 'name' => array( - 'en' => 'DK-WAYF Quality Assurance', - 'da' => 'DK-WAYF Quality Assurance miljøet', - ), - 'description' => 'Login with your identity from a danish school, university or library.', - 'SingleSignOnService' => 'https://betawayf.wayf.dk/saml2/idp/SSOService.php', - 'SingleLogoutService' => 'https://betawayf.wayf.dk/saml2/idp/SingleLogoutService.php', - 'certFingerprint' => 'c215d7bf9d51c7805055239f66b957d9a72ff44b' -); - -$metadata['https://testidp.wayf.dk'] = array( - 'name' => array( - 'en' => 'DK-WAYF Test Server', - 'da' => 'DK-WAYF Test Miljøet', - ), - 'description' => 'Login with your identity from a danish school, university or library.', - 'SingleSignOnService' => 'https://testidp.wayf.dk/saml2/idp/SSOService.php', - 'SingleLogoutService' => 'https://testidp.wayf.dk/saml2/idp/SingleLogoutService.php', - 'certFingerprint' => '04b3b08bce004c27458b3e85b125273e67ef062b' -); diff --git a/inc/simplesamlphp/metadata-templates/saml20-sp-remote.php b/inc/simplesamlphp/metadata-templates/saml20-sp-remote.php index 9d80f8f..4254e43 100644 --- a/inc/simplesamlphp/metadata-templates/saml20-sp-remote.php +++ b/inc/simplesamlphp/metadata-templates/saml20-sp-remote.php @@ -2,7 +2,7 @@ /** * SAML 2.0 remote SP metadata for simpleSAMLphp. * - * See: http://simplesamlphp.org/docs/trunk/simplesamlphp-reference-sp-remote + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote */ /* @@ -21,7 +21,7 @@ $metadata['https://saml2sp.example.org'] = array( */ $metadata['google.com'] = array( 'AssertionConsumerService' => 'https://www.google.com/a/g.feide.no/acs', - 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:email', + 'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', 'simplesaml.nameidattribute' => 'uid', 'simplesaml.attributes' => FALSE, ); diff --git a/inc/simplesamlphp/metadata-templates/shib13-idp-hosted.php b/inc/simplesamlphp/metadata-templates/shib13-idp-hosted.php index eef9726..7e3ea05 100644 --- a/inc/simplesamlphp/metadata-templates/shib13-idp-hosted.php +++ b/inc/simplesamlphp/metadata-templates/shib13-idp-hosted.php @@ -2,7 +2,7 @@ /** * SAML 1.1 IdP configuration for simpleSAMLphp. * - * See: https://rnd.feide.no/content/idp-hosted-metadata-reference + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-hosted */ $metadata['__DYNAMIC:1__'] = array( diff --git a/inc/simplesamlphp/metadata-templates/shib13-idp-remote.php b/inc/simplesamlphp/metadata-templates/shib13-idp-remote.php index 5c089b2..87796b2 100644 --- a/inc/simplesamlphp/metadata-templates/shib13-idp-remote.php +++ b/inc/simplesamlphp/metadata-templates/shib13-idp-remote.php @@ -4,7 +4,7 @@ * * Remember to remove the IdPs you don't use from this file. * - * See: https://rnd.feide.no/content/idp-remote-metadata-reference + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote */ /* diff --git a/inc/simplesamlphp/metadata-templates/shib13-sp-hosted.php b/inc/simplesamlphp/metadata-templates/shib13-sp-hosted.php index 1c6aee4..1ddd914 100644 --- a/inc/simplesamlphp/metadata-templates/shib13-sp-hosted.php +++ b/inc/simplesamlphp/metadata-templates/shib13-sp-hosted.php @@ -2,7 +2,7 @@ /** * SAML 1.1 SP configuration for simpleSAMLphp. * - * See: https://rnd.feide.no/content/sp-hosted-metadata-reference + * See: https://simplesamlphp.org/docs/stable/saml:sp */ /* diff --git a/inc/simplesamlphp/metadata-templates/shib13-sp-remote.php b/inc/simplesamlphp/metadata-templates/shib13-sp-remote.php index 5e521f1..fd0f9e4 100644 --- a/inc/simplesamlphp/metadata-templates/shib13-sp-remote.php +++ b/inc/simplesamlphp/metadata-templates/shib13-sp-remote.php @@ -2,23 +2,15 @@ /** * SAML 1.1 remote SP metadata for simpleSAMLphp. * - * See: https://rnd.feide.no/content/sp-remote-metadata-reference + * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote */ +/* + * This is just an example: + */ $metadata['https://sp.shiblab.feide.no'] = array( 'AssertionConsumerService' => 'http://sp.shiblab.feide.no/Shibboleth.sso/SAML/POST', 'audience' => 'urn:mace:feide:shiblab', 'base64attributes' => FALSE, ); -$metadata['urn:geant:edugain:component:be:switchaai-test:central'] = array( - 'AssertionConsumerService' => 'https://edugain-login.switch.ch/ShiBE-R/WebSSOResponseListener', - 'audience' => 'urn:geant:edugain:component:be:switchaai-test:central', - 'base64attributes' => FALSE, -); - -$metadata['urn:geant:edugain:component:be:rediris:rediris.es'] = array( - 'AssertionConsumerService' => 'http://serrano.rediris.es:8080/PAPIWebSSOResponseListener/request', - 'audience' => 'urn:geant:edugain:component:be:rediris:rediris.es', - 'base64attributes' => FALSE, -); diff --git a/inc/simplesamlphp/metadata/saml20-idp-remote.php b/inc/simplesamlphp/metadata/saml20-idp-remote.php index 9ae055b..b3de027 100644 --- a/inc/simplesamlphp/metadata/saml20-idp-remote.php +++ b/inc/simplesamlphp/metadata/saml20-idp-remote.php @@ -156,8 +156,8 @@ o2zbumirrLLqnt1gmBDvDvlOwC/zAAyL4chbz66eQHTiIYZZvYgy', ), ); -$metadata['http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata'] = array ( - 'entityid' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata', +$metadata['https://mon-meyzieu.dev.entrouvert.org/idp/saml2/metadata'] = array ( + 'entityid' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/metadata', 'contacts' => array ( ), @@ -167,12 +167,12 @@ $metadata['http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata'] = array ( 0 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/sso', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/sso', ), 1 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/sso', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/sso', ), ), 'SingleLogoutService' => @@ -180,19 +180,19 @@ $metadata['http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata'] = array ( 0 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/slo', - 'ResponseLocation' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/slo_return', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/slo', + 'ResponseLocation' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/slo_return', ), 1 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/slo', - 'ResponseLocation' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/slo_return', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/slo', + 'ResponseLocation' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/slo_return', ), 2 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/slo/soap', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/slo/soap', ), ), 'ArtifactResolutionService' => @@ -200,7 +200,7 @@ $metadata['http://mon.meyzieu.dev.entrouvert.org/idp/saml2/metadata'] = array ( 0 => array ( 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP', - 'Location' => 'http://mon.meyzieu.dev.entrouvert.org/idp/saml2/artifact', + 'Location' => 'https://mon-meyzieu.dev.entrouvert.org/idp/saml2/artifact', 'index' => 0, ), ), @@ -231,3 +231,4 @@ o2zbumirrLLqnt1gmBDvDvlOwC/zAAyL4chbz66eQHTiIYZZvYgy', ), ), ); + diff --git a/inc/simplesamlphp/modules/InfoCard/lib/Auth/Source/ICAuth.php b/inc/simplesamlphp/modules/InfoCard/lib/Auth/Source/ICAuth.php index 5f11dc2..bfefdab 100644 --- a/inc/simplesamlphp/modules/InfoCard/lib/Auth/Source/ICAuth.php +++ b/inc/simplesamlphp/modules/InfoCard/lib/Auth/Source/ICAuth.php @@ -37,12 +37,11 @@ class sspmod_InfoCard_Auth_Source_ICAuth extends SimpleSAML_Auth_Source { $state[self::AUTHID] = $this->authId; $id = SimpleSAML_Auth_State::saveState($state, self::STAGEID); $url = SimpleSAML_Module::getModuleURL('InfoCard/login-infocard.php'); - SimpleSAML_Utilities::redirect($url, array('AuthState' => $id)); + SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id)); } public static function handleLogin($authStateId, $xmlToken) { -SimpleSAML_Logger::debug('ENTRA en icauth'); assert('is_string($authStateId)'); $config = SimpleSAML_Configuration::getInstance(); @@ -61,14 +60,20 @@ SimpleSAML_Logger::debug('ENTRA en icauth'); SimpleSAML_Logger::debug("NOXMLtoken: ".$xmlToken); $claims = $infocard->process($xmlToken); if($claims->isValid()) { -// if(false) { $attributes = array(); foreach ($Infocard['requiredClaims'] as $claim => $data){ $attributes[$claim] = array($claims->$claim); } foreach ($Infocard['optionalClaims'] as $claim => $data){ $attributes[$claim] = array($claims->$claim); - } + } + + // sanitize the input + $sid = SimpleSAML_Utilities::parseStateID($authStateId); + if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); + } + /* Retrieve the authentication state. */ $state = SimpleSAML_Auth_State::loadState($authStateId, self::STAGEID); /* Find authentication source. */ @@ -78,12 +83,10 @@ SimpleSAML_Logger::debug('ENTRA en icauth'); throw new Exception('Could not find authentication source with id ' . $state[self::AUTHID]); } $state['Attributes'] = $attributes; -SimpleSAML_Logger::debug('VALIDA'); unset($infocard); unset($claims); SimpleSAML_Auth_Source::completeAuth($state); } else { -SimpleSAML_Logger::debug('NO VALIDA ERROR:'.$claims->getErrorMsg()); unset($infocard); unset($claims); return 'wrong_IC'; diff --git a/inc/simplesamlphp/modules/InfoCard/lib/STS.php b/inc/simplesamlphp/modules/InfoCard/lib/STS.php index a9530ef..0ba0e14 100644 --- a/inc/simplesamlphp/modules/InfoCard/lib/STS.php +++ b/inc/simplesamlphp/modules/InfoCard/lib/STS.php @@ -360,7 +360,7 @@ class sspmod_InfoCard_STS { $canonicalbuf = sspmod_InfoCard_Utils::canonicalize($signedinfo); $privkey = openssl_pkey_get_private(file_get_contents($config['sts_key'])); $signature = ''; - openssl_sign($canonicalbuf, &$signature, $privkey); + openssl_sign($canonicalbuf, $signature, $privkey); openssl_free_key($privkey); $samlsignature = base64_encode($signature); @@ -381,4 +381,4 @@ class sspmod_InfoCard_STS { } -?> \ No newline at end of file +?> diff --git a/inc/simplesamlphp/modules/InfoCard/www/getcardform.php b/inc/simplesamlphp/modules/InfoCard/www/getcardform.php index c4dd9af..76f4690 100644 --- a/inc/simplesamlphp/modules/InfoCard/www/getcardform.php +++ b/inc/simplesamlphp/modules/InfoCard/www/getcardform.php @@ -19,7 +19,7 @@ $Infocard = $autoconfig->getValue('InfoCard'); /* Load the session of the current user. */ -$session = SimpleSAML_Session::getInstance(); +$session = SimpleSAML_Session::getSessionFromRequest(); if (!array_key_exists('AuthState', $_REQUEST)) { SimpleSAML_Logger::debug('NO AUTH STATE'); diff --git a/inc/simplesamlphp/modules/InfoCard/www/login-infocard.php b/inc/simplesamlphp/modules/InfoCard/www/login-infocard.php index 9d0ae3b..97a399b 100644 --- a/inc/simplesamlphp/modules/InfoCard/www/login-infocard.php +++ b/inc/simplesamlphp/modules/InfoCard/www/login-infocard.php @@ -26,7 +26,7 @@ $contact_info_URL = $autoconfig->getValue('contact_info_URL'); /* Load the session of the current user. */ -$session = SimpleSAML_Session::getInstance(); +$session = SimpleSAML_Session::getSessionFromRequest(); if (!array_key_exists('AuthState', $_REQUEST)) { diff --git a/inc/simplesamlphp/modules/adfs/docs/adfs.txt b/inc/simplesamlphp/modules/adfs/docs/adfs.txt new file mode 100644 index 0000000..a57820a --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/docs/adfs.txt @@ -0,0 +1,83 @@ +Enables AD FS IdP +Compatible with VS 2012 Identity and Access + +Basic Setup Companion based on: +http://simplesamlphp.org/docs/stable/simplesamlphp-idp + +1. Enabling the Identity Provider functionality + +In config/config.php, the option will be: +'enable.adfs-idp' => true + +2. Authentication module + +Follow as is. + +3. Configuring the authentication module + +In addition to enabling authentication module, enable adfs module by creating a file named 'enable' in modules/adfs + +In unix from installation directory: +touch modules/adfs/enable + +4. Configuring the IdP + +ADFS IdP is configured by metadata stored in /metadata/adfs-idp-hosted.php and metadata/adfs-sp-remote.php + +If they are not present, copy them from /metadata-templates to the metadata +directory. + +5. Using the uri NameFormat on attributes + +WS-FED likes a few parameters to be very specifically named. This is +especially true if .net clients will be treating this as a Microsoft ADFS +IdP. + +The recommended settings for /metadata/adfs-idp-hosted.php is: + +'authproc' => array( + // Convert LDAP names to WS-Fed Claims. + 100 => array('class' => 'core:AttributeMap', 'name2claim'), +), + +6. Adding SPs to the IdP + +The minimal configuration for /metadata/adfs-sp-remote.php is: + +$metadata['urn:federation:localhost'] = array( + prp' => 'https://localhost/adfs/ls/', +); + +7. Creating a SSL self signed certificate + +Follow as is. + +8. Adding this IdP to other SPs + +Metadata should be available from /module.php/adfs/idp/metadata.php + +9. This module tries its best to emulate a Microsoft ADFS endpoint, and as +such, it is simplest to test using a .net client. + +To build the test client, follow the tutorial at: +http://code.msdn.microsoft.com/Claims-Aware-Web-d94a89ca + +This will build a .net app that uses a dev machine running STS (their name for +an IdP). + +To point to your SimpleSamlPHP ADFS IdP, in VS 2012: + +a. Right-click the project in Solution Explorer and select the Identity and +Access option. + +b. In the Identity and Access Window, Select Use a business identity +provider. + +c. Under “Enter the path to the STS metadata document” enter the url you have + +from step 8. Something like +https://.../module.php/adfs/idp/metadata.php + +d. Click Ok + +For more information in regards to .NET: http://msdn.microsoft.com/en-us/library/hh377151.aspx diff --git a/inc/simplesamlphp/modules/adfs/lib/IdP/ADFS.php b/inc/simplesamlphp/modules/adfs/lib/IdP/ADFS.php index 1353d01..d7fc51f 100644 --- a/inc/simplesamlphp/modules/adfs/lib/IdP/ADFS.php +++ b/inc/simplesamlphp/modules/adfs/lib/IdP/ADFS.php @@ -171,10 +171,17 @@ class sspmod_adfs_IdP_ADFS { // NB:: we don't know from which SP the logout request came from $metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); $idpMetadata = $idp->getConfig(); - SimpleSAML_Utilities::redirect($idpMetadata->getValue('redirect-after-logout', SimpleSAML_Utilities::getBaseURL())); + SimpleSAML_Utilities::redirectTrustedURL($idpMetadata->getValue('redirect-after-logout', SimpleSAML_Utilities::getBaseURL())); } public static function receiveLogoutMessage(SimpleSAML_IdP $idp) { + // if a redirect is to occur based on wreply, we will redirect to url as + // this implies an override to normal sp notification. + if(isset($_GET['wreply']) && !empty($_GET['wreply'])) { + $idp->doLogoutRedirect(SimpleSAML_Utilities::checkURLAllowed($_GET['wreply'])); + assert(FALSE); + } + $state = array( 'Responder' => array('sspmod_adfs_IdP_ADFS', 'sendLogoutResponse'), ); @@ -187,7 +194,7 @@ class sspmod_adfs_IdP_ADFS { $idp->handleLogoutRequest($state, $assocId); } - // accepts an association array, and returns an URL that can be accessed to terminate the association. + // accepts an association array, and returns a URL that can be accessed to terminate the association. public static function getLogoutURL(SimpleSAML_IdP $idp, array $association, $relayState) { $metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); $idpMetadata = $idp->getConfig(); diff --git a/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Const.php b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Const.php new file mode 100644 index 0000000..e42ca71 --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/Const.php @@ -0,0 +1,12 @@ +ownerDocument->createElement($name); + $parent->appendChild($e); + + $endpoint = $parent->ownerDocument->createElement('EndpointReference'); + $endpoint->setAttribute('xmlns', 'http://www.w3.org/2005/08/addressing'); + $e->appendChild($endpoint); + + $address = $parent->ownerDocument->createElement('Address', $address); + $endpoint->appendChild($address); + + return $e; + } + +} diff --git a/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php new file mode 100644 index 0000000..e4c9780 --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/SecurityTokenServiceType.php @@ -0,0 +1,55 @@ +Location)'); + + $e = parent::toXML($parent); + $e->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:fed', sspmod_adfs_SAML2_XML_fed_Const::NS_FED); + $e->setAttributeNS(SAML2_Const::NS_XSI, 'xsi:type', 'fed:SecurityTokenServiceType'); + sspmod_adfs_SAML2_XML_fed_TokenTypesOffered::appendXML($e); + sspmod_adfs_SAML2_XML_fed_Endpoint::appendXML($e, 'SecurityTokenServiceEndpoint', $this->Location); + sspmod_adfs_SAML2_XML_fed_Endpoint::appendXML($e, 'fed:PassiveRequestorEndpoint', $this->Location); + + return $e; + } +} diff --git a/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/TokenTypesOffered.php b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/TokenTypesOffered.php new file mode 100644 index 0000000..e544caa --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/lib/SAML2/XML/fed/TokenTypesOffered.php @@ -0,0 +1,25 @@ +ownerDocument->createElementNS(sspmod_adfs_SAML2_XML_fed_Const::NS_FED, 'fed:TokenTypesOffered'); + $parent->appendChild($e); + + $tokentype = $parent->ownerDocument->createElementNS(sspmod_adfs_SAML2_XML_fed_Const::NS_FED, 'fed:TokenType'); + $tokentype->setAttribute('Uri', 'urn:oasis:names:tc:SAML:1.0:assertion'); + $e->appendChild($tokentype); + + return $e; + } + +} diff --git a/inc/simplesamlphp/modules/adfs/lib/XMLSecurityDSig.php b/inc/simplesamlphp/modules/adfs/lib/XMLSecurityDSig.php new file mode 100644 index 0000000..330a63f --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/lib/XMLSecurityDSig.php @@ -0,0 +1,31 @@ +loadXML($template); + $this->sigNode = $sigdoc->documentElement; + } +} diff --git a/inc/simplesamlphp/modules/adfs/www/idp/metadata.php b/inc/simplesamlphp/modules/adfs/www/idp/metadata.php new file mode 100644 index 0000000..f1a191a --- /dev/null +++ b/inc/simplesamlphp/modules/adfs/www/idp/metadata.php @@ -0,0 +1,156 @@ +getBoolean('enable.adfs-idp', false)) + throw new SimpleSAML_Error_Error('NOACCESS'); + +/* Check if valid local session exists.. */ +if ($config->getBoolean('admin.protectmetadata', false)) { + SimpleSAML_Utilities::requireAdmin(); +} + + +try { + $idpentityid = isset($_GET['idpentityid']) ? $_GET['idpentityid'] : $metadata->getMetaDataCurrentEntityID('adfs-idp-hosted'); + $idpmeta = $metadata->getMetaDataConfig($idpentityid, 'adfs-idp-hosted'); + + $availableCerts = array(); + + $keys = array(); + $certInfo = SimpleSAML_Utilities::loadPublicKey($idpmeta, FALSE, 'new_'); + if ($certInfo !== NULL) { + $availableCerts['new_idp.crt'] = $certInfo; + $keys[] = array( + 'type' => 'X509Certificate', + 'signing' => TRUE, + 'encryption' => TRUE, + 'X509Certificate' => $certInfo['certData'], + ); + $hasNewCert = TRUE; + } else { + $hasNewCert = FALSE; + } + + $certInfo = SimpleSAML_Utilities::loadPublicKey($idpmeta, TRUE); + $availableCerts['idp.crt'] = $certInfo; + $keys[] = array( + 'type' => 'X509Certificate', + 'signing' => TRUE, + 'encryption' => ($hasNewCert ? FALSE : TRUE), + 'X509Certificate' => $certInfo['certData'], + ); + + if ($idpmeta->hasValue('https.certificate')) { + $httpsCert = SimpleSAML_Utilities::loadPublicKey($idpmeta, TRUE, 'https.'); + assert('isset($httpsCert["certData"])'); + $availableCerts['https.crt'] = $httpsCert; + $keys[] = array( + 'type' => 'X509Certificate', + 'signing' => TRUE, + 'encryption' => FALSE, + 'X509Certificate' => $httpsCert['certData'], + ); + } + + $adfs_service_location = SimpleSAML_Module::getModuleURL('adfs') . '/idp/prp.php'; + $metaArray = array( + 'metadata-set' => 'adfs-idp-remote', + 'entityid' => $idpentityid, + 'SingleSignOnService' => array(0 => array( + 'Binding' => SAML2_Const::BINDING_HTTP_REDIRECT, + 'Location' => $adfs_service_location)), + 'SingleLogoutService' => array(0 => array( + 'Binding' => SAML2_Const::BINDING_HTTP_REDIRECT, + 'Location' => $adfs_service_location)), + ); + + if (count($keys) === 1) { + $metaArray['certData'] = $keys[0]['X509Certificate']; + } else { + $metaArray['keys'] = $keys; + } + + $metaArray['NameIDFormat'] = $idpmeta->getString('NameIDFormat', 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'); + + if ($idpmeta->hasValue('OrganizationName')) { + $metaArray['OrganizationName'] = $idpmeta->getLocalizedString('OrganizationName'); + $metaArray['OrganizationDisplayName'] = $idpmeta->getLocalizedString('OrganizationDisplayName', $metaArray['OrganizationName']); + + if (!$idpmeta->hasValue('OrganizationURL')) { + throw new SimpleSAML_Error_Exception('If OrganizationName is set, OrganizationURL must also be set.'); + } + $metaArray['OrganizationURL'] = $idpmeta->getLocalizedString('OrganizationURL'); + } + + if ($idpmeta->hasValue('scope')) { + $metaArray['scope'] = $idpmeta->getArray('scope'); + } + + if ($idpmeta->hasValue('EntityAttributes')) { + $metaArray['EntityAttributes'] = $idpmeta->getArray('EntityAttributes'); + } + + if ($idpmeta->hasValue('UIInfo')) { + $metaArray['UIInfo'] = $idpmeta->getArray('UIInfo'); + } + + if ($idpmeta->hasValue('DiscoHints')) { + $metaArray['DiscoHints'] = $idpmeta->getArray('DiscoHints'); + } + + if ($idpmeta->hasValue('RegistrationInfo')) { + $metaArray['RegistrationInfo'] = $idpmeta->getArray('RegistrationInfo'); + } + + $metaflat = '$metadata[' . var_export($idpentityid, TRUE) . '] = ' . var_export($metaArray, TRUE) . ';'; + + $metaBuilder = new SimpleSAML_Metadata_SAMLBuilder($idpentityid); + $metaBuilder->addSecurityTokenServiceType($metaArray); + $metaBuilder->addOrganizationInfo($metaArray); + $technicalContactEmail = $config->getString('technicalcontact_email', NULL); + if ($technicalContactEmail && $technicalContactEmail !== 'na@example.org') { + $metaBuilder->addContact('technical', array( + 'emailAddress' => $technicalContactEmail, + 'name' => $config->getString('technicalcontact_name', NULL), + )); + } + $output_xhtml = array_key_exists('output', $_GET) && $_GET['output'] == 'xhtml'; + $metaxml = $metaBuilder->getEntityDescriptorText($output_xhtml); + if (!$output_xhtml) { + $metaxml = str_replace("\n", '', $metaxml); + } + + /* Sign the metadata if enabled. */ + $metaxml = SimpleSAML_Metadata_Signer::sign($metaxml, $idpmeta->toArray(), 'ADFS IdP'); + + if ($output_xhtml) { + $defaultidp = $config->getString('default-adfs-idp', NULL); + + $t = new SimpleSAML_XHTML_Template($config, 'metadata.php', 'admin'); + + $t->data['available_certs'] = $availableCerts; + $t->data['header'] = 'adfs-idp'; + $t->data['metaurl'] = SimpleSAML_Utilities::selfURLNoQuery(); + $t->data['metadata'] = htmlspecialchars($metaxml); + $t->data['metadataflat'] = htmlspecialchars($metaflat); + $t->data['defaultidp'] = $defaultidp; + $t->show(); + + } else { + header('Content-Type: application/xml'); + + // make sure to export only the md:EntityDescriptor + $metaxml = substr($metaxml, strpos($metaxml, '') + $metaxml = substr($metaxml, 0, strrpos($metaxml, '') + 22); + echo $metaxml; + + exit(0); + } + +} catch(Exception $exception) { + throw new SimpleSAML_Error_Error('METADATA', $exception); +} diff --git a/inc/simplesamlphp/modules/adfs/www/idp/prp.php b/inc/simplesamlphp/modules/adfs/www/idp/prp.php index c6f545e..3bfc076 100644 --- a/inc/simplesamlphp/modules/adfs/www/idp/prp.php +++ b/inc/simplesamlphp/modules/adfs/www/idp/prp.php @@ -4,7 +4,6 @@ * * @author Hans Zandbelt, SURFnet bv, * @package simpleSAMLphp - * @version $Id$ */ SimpleSAML_Logger::info('ADFS - IdP.prp: Accessing ADFS IdP endpoint prp'); diff --git a/inc/simplesamlphp/modules/aggregator/dictionaries/aggregator.translation.json b/inc/simplesamlphp/modules/aggregator/dictionaries/aggregator.translation.json index 0ea3ad9..91495e2 100644 --- a/inc/simplesamlphp/modules/aggregator/dictionaries/aggregator.translation.json +++ b/inc/simplesamlphp/modules/aggregator/dictionaries/aggregator.translation.json @@ -20,8 +20,12 @@ "ru": "\u0410\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "zh": "\u5143\u4fe1\u606f\u805a\u5408\u5668", "ar": " \u0645\u062c\u0645\u0639 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629\/ \u0627\u0644\u0645\u064a\u062a\u0627\u062f\u0627\u062a\u0627", + "lv": "Metadatu agregators", "id": "Aggregator metadata", - "sr": "Agregator metapodataka" + "sr": "Agregator metapodataka", + "ro": "Agregator de metadate", + "cs": "Metadata agreg\u00e1tor", + "eu": "Metadatu eranslea" }, "aggregator_header": { "no": "Aggregatorer", @@ -44,8 +48,12 @@ "ru": "\u0410\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u044b", "zh": "\u805a\u5408\u5668", "ar": "\u0645\u062c\u0645\u0639\u0627\u062a", + "lv": "Agregatori", "id": "Aggregator", - "sr": "Agregatori" + "sr": "Agregatori", + "ro": "Agregatoare", + "cs": "Agreg\u00e1tory", + "eu": "Eransleak" }, "no_aggregators": { "no": "Ingen aggregator definert i konfigurasjonen", @@ -68,8 +76,12 @@ "ru": "\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u044b.", "zh": "\u914d\u7f6e\u4e2d\u6ca1\u6709\u5b9a\u4e49\u805a\u5408\u5668", "ar": "\u0644\u0645 \u064a\u062a\u0645 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u062c\u0645\u0639\u0627\u062a \u0628\u0627\u0644\u0643\u0648\u0646\u0641\u064a\u063a\u0631\u0627\u0634\u0646", + "lv": "Konfigur\u0101cij\u0101 nav defin\u0113ti agregatori.", "id": "Tidak ada aggregator yang didefinisikan di konfigurasi", - "sr": "U pode\u0161avanjima nije definisan nijedan agregator." + "sr": "U pode\u0161avanjima nije definisan nijedan agregator.", + "ro": "Nu sunt definite agregatoare \u00een configurare.", + "cs": "\u017d\u00e1dn\u00e9 agreg\u00e1tory nejsou definov\u00e1ny v konfiguraci.", + "eu": "Ez da inolako eranslerik zehaztu konfigurazioan. " }, "text": { "no": "tekst", @@ -92,7 +104,11 @@ "ru": "\u0442\u0435\u043a\u0441\u0442", "zh": "\u6587\u672c", "ar": "\u0646\u0635", + "lv": "teksts", "id": "teks", - "sr": "tekst" + "sr": "tekst", + "ro": "text", + "cs": "text", + "eu": "testua" } } diff --git a/inc/simplesamlphp/modules/aggregator/docs/aggregator.txt b/inc/simplesamlphp/modules/aggregator/docs/aggregator.txt index 0b13592..23dc8bd 100644 --- a/inc/simplesamlphp/modules/aggregator/docs/aggregator.txt +++ b/inc/simplesamlphp/modules/aggregator/docs/aggregator.txt @@ -7,7 +7,6 @@ aggregator Module http://daringfireball.net/projects/markdown/syntax --> - * Version: `$Id: aggregator.txt 1894 2009-10-23 10:47:27Z andreassolberg $` * Author: Andreas Åkre Solberg , UNINETT AS * Package: simpleSAMLphp @@ -33,6 +32,16 @@ The configuration file includes an option `aggregators`, which includes a indexe All of the global parameters can be overriden for each aggregator. Here is a list of the available (global) paramters: +`maxDuration` +: Max validity of metadata (duration) in seconds. + +`reconstruct` +: Whether simpleSAMLphp should regenerate the metadata XML (TRUE) or pass-through the input metadata XML (FALSE). + +`RegistrationInfo` +: Allows to specify information about the registrar of this metadata. Please refer to the + [MDRPI extension](./simplesamlphp-metadata-extensions-rpi) document for further information. + `set` : By default all SAML types are available, including: `array('saml20-idp-remote', 'saml20-sp-remote', 'shib13-idp-remote', 'shib13-sp-remote')`. This list can be reduced by specifying one of the following values: @@ -43,27 +52,18 @@ All of the global parameters can be overriden for each aggregator. Here is a lis * `saml2` * `shib13` -`foo` -: sldkfjdslkjf - -`reconstruct` -: Whether simpleSAMLphp should regenerate the metadata XML (TRUE) or pass-through the input metadata XML (FALSE). - -`maxDuration` -: Max validity of metadata (duration) in seconds. - `sign.enable` : Enable signing of metadata document +`sign.certificate` +: Certificate to embed, corresponding to the private key. + `sign.privatekey` : Private key to use when signing `sign.privatekey_pass` : Optionally a passphrase to the private key -`sign.certificate` -: Certificate to embed, corresponding to the private key. - Accessing the aggregate ----------------------- @@ -84,7 +84,7 @@ The endpoint supports the following query parameter: : Specify a `tag` that will be excluded from the metadata set. Useful for leaving out your own federation metadata. `mimetype` -: Select Mime-Type that will be used. Default is `application/samlmetadata+xml`. +: Select the Mime-Type that will be used. Default is `application/samlmetadata+xml`. diff --git a/inc/simplesamlphp/modules/aggregator/lib/ARP.php b/inc/simplesamlphp/modules/aggregator/lib/ARP.php index 5e76b76..0847522 100644 --- a/inc/simplesamlphp/modules/aggregator/lib/ARP.php +++ b/inc/simplesamlphp/modules/aggregator/lib/ARP.php @@ -2,7 +2,6 @@ /* * @author Andreas Åkre Solberg * @package simpleSAMLphp - * @version $Id: ARP.php 1895 2009-10-23 11:36:19Z andreassolberg $ */ class sspmod_aggregator_ARP { diff --git a/inc/simplesamlphp/modules/aggregator/lib/Aggregator.php b/inc/simplesamlphp/modules/aggregator/lib/Aggregator.php index 1010fc7..1f41602 100644 --- a/inc/simplesamlphp/modules/aggregator/lib/Aggregator.php +++ b/inc/simplesamlphp/modules/aggregator/lib/Aggregator.php @@ -5,7 +5,6 @@ * * @author Andreas Åkre Solberg * @package simpleSAMLphp - * @version $Id: Aggregator.php 1963 2009-11-05 11:27:44Z olavmrk $ */ class sspmod_aggregator_Aggregator { @@ -86,11 +85,8 @@ class sspmod_aggregator_Aggregator { var_export($id, TRUE) . ': ' . $e->getMessage()); } - - #echo $exclude; exit; /* Find list of all available entities. */ $entities = array(); - #echo '
'; print_r($this->sets); exit;
 		
 		foreach ($sources as $source) {
 			foreach ($this->sets as $set) {
@@ -176,18 +172,31 @@ class sspmod_aggregator_Aggregator {
 
 		// Get metadata entries
 		$entities = $this->getSources();
-		
-		
-		// Generate XML Document
-		$xml = new DOMDocument();
-		$entitiesDescriptor = $xml->createElementNS('urn:oasis:names:tc:SAML:2.0:metadata', 'EntitiesDescriptor');
-		$entitiesDescriptor->setAttribute('Name', $this->id);
-		$xml->appendChild($entitiesDescriptor);
-		
-		
 		$maxDuration = $this->getMaxDuration();
 		$reconstruct = $this->getReconstruct();
 
+		$entitiesDescriptor = new SAML2_XML_md_EntitiesDescriptor();
+		$entitiesDescriptor->Name = $this->id;
+		$entitiesDescriptor->validUntil = time() + $maxDuration;
+
+		// add RegistrationInfo extension if enabled
+		if ($this->gConfig->hasValue('RegistrationInfo')) {
+			$ri = new SAML2_XML_mdrpi_RegistrationInfo();
+			foreach ($this->gConfig->getArray('RegistrationInfo') as $riName => $riValues) {
+				switch ($riName) {
+					case 'authority':
+						$ri->registrationAuthority = $riValues;
+						break;
+					case 'instant':
+						$ri->registrationInstant = SAML2_Utils::xsDateTimeToTimestamp($riValues);
+						break;
+					case 'policies':
+						$ri->RegistrationPolicy = $riValues;
+						break;
+				}
+			}
+			$entitiesDescriptor->Extensions[] = $ri;
+		}
 
 		/* Build EntityDescriptor elements for them. */
 		foreach ($entities as $entity => $sets) {
@@ -218,7 +227,7 @@ class sspmod_aggregator_Aggregator {
 				/* All metadata sets for the entity contain the same entity descriptor. Use that one. */
 				$tmp = new DOMDocument();
 				$tmp->loadXML(base64_decode($entityDescriptor));
-				$entityDescriptor = $tmp->documentElement;
+				$entitiesDescriptor->children[] = new SAML2_XML_md_EntityDescriptor($tmp->documentElement);
 			} else {
 				
 				$tmp = new SimpleSAML_Metadata_SAMLBuilder($entity, $maxDuration, $maxDuration);
@@ -229,21 +238,19 @@ class sspmod_aggregator_Aggregator {
 					$orgmeta = $metadata;
 				}
 				$tmp->addOrganizationInfo($orgmeta);
-				$entityDescriptor = $tmp->getEntityDescriptor();
+				$entitiesDescriptor->children[] = new SAML2_XML_md_EntityDescriptor($tmp->getEntityDescriptor());
 			}
-
-			$entitiesDescriptor->appendChild($xml->importNode($entityDescriptor, TRUE));
 		}
 		
+		$document = $entitiesDescriptor->toXML();
 		
-		/* Sign the metadata if enabled. */
+		// sign the metadata if enabled
 		if ($this->shouldSign()) {
 			$signer = new SimpleSAML_XML_Signer($this->getSigningInfo());
-			$signer->sign($entitiesDescriptor, $entitiesDescriptor, $entitiesDescriptor->firstChild);
+			$signer->sign($document, $document, $document->firstChild);
 		}
 		
-
-		return $xml;
+		return $document;
 	}
 	
 
diff --git a/inc/simplesamlphp/modules/aggregator/templates/list.php b/inc/simplesamlphp/modules/aggregator/templates/list.php
index b16a7cb..47362c2 100644
--- a/inc/simplesamlphp/modules/aggregator/templates/list.php
+++ b/inc/simplesamlphp/modules/aggregator/templates/list.php
@@ -24,4 +24,3 @@ if (count($this->data['sources']) === 0) {
 }
 
 $this->includeAtTemplateBase('includes/footer.php');
-?>
\ No newline at end of file
diff --git a/inc/simplesamlphp/modules/aggregator/www/arp.php b/inc/simplesamlphp/modules/aggregator/www/arp.php
index ef7d329..3c05d22 100644
--- a/inc/simplesamlphp/modules/aggregator/www/arp.php
+++ b/inc/simplesamlphp/modules/aggregator/www/arp.php
@@ -15,7 +15,7 @@ if (!array_key_exists('id', $_GET)) {
 	exit;
 }
 $id = $_GET['id'];
-if (!in_array($id, $aggregators->getOptions())) 
+if (!in_array($id, $aggregators->getOptions()))
 	throw new SimpleSAML_Error_NotFound('No aggregator with id ' . var_export($id, TRUE) . ' found.');
 
 $aConfig = $aggregators->getConfigItem($id);
@@ -23,10 +23,10 @@ $aConfig = $aggregators->getConfigItem($id);
 
 $aggregator = new sspmod_aggregator_Aggregator($gConfig, $aConfig, $id);
 
-if (isset($_REQUEST['set'])) 
+if (isset($_REQUEST['set']))
 	$aggregator->limitSets($_REQUEST['set']);
 
-if (isset($_REQUEST['exclude'])) 
+if (isset($_REQUEST['exclude']))
 	$aggregator->exclude($_REQUEST['exclude']);
 
 
@@ -40,6 +40,16 @@ if (isset($_REQUEST['prefix'])) $prefix = $_REQUEST['prefix'];
 $suffix = '';
 if (isset($_REQUEST['suffix'])) $suffix = $_REQUEST['suffix'];
 
+/* Make sure that the request isn't suspicious (contains references to current
+ * directory or parent directory or anything like that. Searching for './' in the
+ * URL will detect both '../' and './'. Searching for '\' will detect attempts to
+ * use Windows-style paths.
+ */
+if (strpos($attributemap, '\\') !== FALSE) {
+	throw new SimpleSAML_Error_BadRequest('Requested URL contained a backslash.');
+} elseif (strpos($attributemap, './') !== FALSE) {
+	throw new SimpleSAML_Error_BadRequest('Requested URL contained \'./\'.');
+}
 
 $arp = new sspmod_aggregator_ARP($md, $attributemap, $prefix, $suffix);
 
@@ -56,22 +66,21 @@ if ($aggregator->shouldSign()) {
 	$signer->sign($firstelement, $firstelement, $firstelement->firstChild);
 }
 
+$mimetype = 'application/samlmetadata-xml';
+$allowedmimetypes = array(
+    'text/plain',
+    'application/samlmetadata-xml',
+    'application/xml',
+);
 
-
-
-// echo('
' . $arpxml); exit;
-
-
-/* Show the metadata. */
-if(array_key_exists('mimetype', $_GET)) {
-	$mimeType = $_GET['mimetype'];
-} else {
-	$mimeType = 'application/samlmetadata+xml';
+if (isset($_GET['mimetype']) && in_array($_GET['mimetype'], $allowedmimetypes)) {
+    $mimetype = $_GET['mimetype'];
 }
 
-header('Content-Type: ' . $mimeType);
+if ($mimetype === 'text/plain') {
+    SimpleSAML_Utilities::formatDOMElement($xml->documentElement);
+}
+
+header('Content-Type: ' . $mimetype);
 
 echo($xml->saveXML());
-
-
-?>
\ No newline at end of file
diff --git a/inc/simplesamlphp/modules/aggregator/www/index.php b/inc/simplesamlphp/modules/aggregator/www/index.php
index 618abfb..1b1049a 100644
--- a/inc/simplesamlphp/modules/aggregator/www/index.php
+++ b/inc/simplesamlphp/modules/aggregator/www/index.php
@@ -15,7 +15,7 @@ if (!array_key_exists('id', $_GET)) {
 	exit;
 }
 $id = $_GET['id'];
-if (!in_array($id, $aggregators->getOptions())) 
+if (!in_array($id, $aggregators->getOptions()))
 	throw new SimpleSAML_Error_NotFound('No aggregator with id ' . var_export($id, TRUE) . ' found.');
 
 $aConfig = $aggregators->getConfigItem($id);
@@ -23,7 +23,7 @@ $aConfig = $aggregators->getConfigItem($id);
 
 $aggregator = new sspmod_aggregator_Aggregator($gConfig, $aConfig, $id);
 
-if (isset($_REQUEST['set'])) 
+if (isset($_REQUEST['set']))
 	$aggregator->limitSets($_REQUEST['set']);
 
 if (isset($_REQUEST['exclude'])) 
@@ -32,17 +32,24 @@ if (isset($_REQUEST['exclude']))
 
 $xml = $aggregator->getMetadataDocument();
 
+$mimetype = 'application/samlmetadata+xml';
+$allowedmimetypes = array(
+    'text/plain',
+    'application/samlmetadata-xml',
+    'application/xml',
+);
 
-/* Show the metadata. */
-if(array_key_exists('mimetype', $_GET)) {
-	$mimeType = $_GET['mimetype'];
-} else {
-	$mimeType = 'application/samlmetadata+xml';
+if (isset($_GET['mimetype']) && in_array($_GET['mimetype'], $allowedmimetypes)) {
+    $mimetype = $_GET['mimetype'];
 }
 
-header('Content-Type: ' . $mimeType);
+if ($mimetype === 'text/plain') {
+    SimpleSAML_Utilities::formatDOMElement($xml);
+}
 
-echo($xml->saveXML());
+$metadata = ''."\n".$xml->ownerDocument->saveXML($xml);
 
+header('Content-Type: ' . $mimetype);
+header('Content-Length: ' . strlen($metadata));
 
-?>
\ No newline at end of file
+echo $metadata;
diff --git a/inc/simplesamlphp/modules/aggregator2/docs/aggregator2.txt b/inc/simplesamlphp/modules/aggregator2/docs/aggregator2.txt
index 4348332..75f29f9 100644
--- a/inc/simplesamlphp/modules/aggregator2/docs/aggregator2.txt
+++ b/inc/simplesamlphp/modules/aggregator2/docs/aggregator2.txt
@@ -66,6 +66,10 @@ The aggregator can be configured with the following options:
     This certificate is included in the generated metadata.
     The path to the certificate can be absolute, or it can be relative to the `cert`-directory.
 
+`RegistrationInfo`
+:   Allows to specify information about the registrar of this metadata. Please refer to the
+    [MDRPI extension](./simplesamlphp-metadata-extensions-rpi) document for further information.
+
 
 ### Aggregator source configuration
 
diff --git a/inc/simplesamlphp/modules/aggregator2/lib/Aggregator.php b/inc/simplesamlphp/modules/aggregator2/lib/Aggregator.php
index caf283a..0fc5b14 100644
--- a/inc/simplesamlphp/modules/aggregator2/lib/Aggregator.php
+++ b/inc/simplesamlphp/modules/aggregator2/lib/Aggregator.php
@@ -4,7 +4,6 @@
  * Class which implements a basic metadata aggregator.
  *
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_aggregator2_Aggregator {
 
@@ -119,6 +118,14 @@ class sspmod_aggregator2_Aggregator {
 	protected $cacheTag;
 
 
+	/**
+	 * The registration information for our generated metadata.
+	 *
+	 * @var array
+	 */
+	protected $regInfo;
+
+
 	/**
 	 * Initialize this aggregator.
 	 *
@@ -172,6 +179,8 @@ class sspmod_aggregator2_Aggregator {
 
 		$this->sslCAFile = $config->getString('ssl.cafile', NULL);
 
+		$this->regInfo = $config->getArray('RegistrationInfo', NULL);
+
 		$this->initSources($config->getConfigList('sources'));
 	}
 
@@ -379,6 +388,29 @@ class sspmod_aggregator2_Aggregator {
 	protected function getEntitiesDescriptor() {
 
 		$ret = new SAML2_XML_md_EntitiesDescriptor();
+
+		$now = time();
+
+		// add RegistrationInfo extension if enabled
+		if ($this->regInfo !== NULL) {
+			$ri = new SAML2_XML_mdrpi_RegistrationInfo();
+			$ri->registrationInstant = $now;
+			foreach ($this->regInfo as $riName => $riValues) {
+				switch ($riName) {
+					case 'authority':
+						$ri->registrationAuthority = $riValues;
+						break;
+					case 'instant':
+						$ri->registrationInstant = SAML2_Utils::xsDateTimeToTimestamp($riValues);
+						break;
+					case 'policies':
+						$ri->RegistrationPolicy = $riValues;
+						break;
+				}
+			}
+			$ret->Extensions[] = $ri;
+		}
+
 		foreach ($this->sources as $source) {
 			$m = $source->getMetadata();
 			if ($m === NULL) {
@@ -387,7 +419,7 @@ class sspmod_aggregator2_Aggregator {
 			$ret->children[] = $m;
 		}
 
-		$ret->validUntil = time() + $this->validLength;
+		$ret->validUntil = $now + $this->validLength;
 
 		return $ret;
 	}
diff --git a/inc/simplesamlphp/modules/aggregator2/lib/EntitySource.php b/inc/simplesamlphp/modules/aggregator2/lib/EntitySource.php
index 854147d..25f3c78 100644
--- a/inc/simplesamlphp/modules/aggregator2/lib/EntitySource.php
+++ b/inc/simplesamlphp/modules/aggregator2/lib/EntitySource.php
@@ -4,7 +4,6 @@
  * Class for loading metadata from files and URLs.
  *
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_aggregator2_EntitySource {
 
diff --git a/inc/simplesamlphp/modules/aggregator2/www/get.php b/inc/simplesamlphp/modules/aggregator2/www/get.php
index bb47f8d..016eef2 100644
--- a/inc/simplesamlphp/modules/aggregator2/www/get.php
+++ b/inc/simplesamlphp/modules/aggregator2/www/get.php
@@ -3,7 +3,6 @@
 if (!isset($_REQUEST['id'])) {
 	throw new SimpleSAML_Error_BadRequest('Missing required id-parameter.');
 }
-
 $id = (string)$_REQUEST['id'];
 
 $aggregator = sspmod_aggregator2_Aggregator::getAggregator($id);
@@ -11,4 +10,11 @@ $xml = $aggregator->getMetadata();
 
 header('Content-Type: application/samlmetadata+xml');
 header('Content-Length: ' . strlen($xml));
+
+/*
+ * At this point, if the ID was forged, getMetadata() would
+ * have failed to find a valid metadata set, so we can trust it.
+ */
+header('Content-Disposition: filename='.$id.'.xml');
+
 echo($xml);
diff --git a/inc/simplesamlphp/modules/aselect/docs/aselect.txt b/inc/simplesamlphp/modules/aselect/docs/aselect.txt
index 756798e..c434219 100644
--- a/inc/simplesamlphp/modules/aselect/docs/aselect.txt
+++ b/inc/simplesamlphp/modules/aselect/docs/aselect.txt
@@ -41,4 +41,4 @@ Author: Wessel Dankers 
 
 Copyright: © 2011,2012 Tilburg University (http://www.tilburguniversity.edu)
 
-License: GPL version 3 or any later version.
+License: LGPL version 2.1
diff --git a/inc/simplesamlphp/modules/aselect/lib/Auth/Source/aselect.php b/inc/simplesamlphp/modules/aselect/lib/Auth/Source/aselect.php
index c7cb88d..874b5ca 100644
--- a/inc/simplesamlphp/modules/aselect/lib/Auth/Source/aselect.php
+++ b/inc/simplesamlphp/modules/aselect/lib/Auth/Source/aselect.php
@@ -52,7 +52,7 @@ class sspmod_aselect_Auth_Source_aselect extends SimpleSAML_Auth_Source {
 			$app_url = SimpleSAML_Module::getModuleURL('aselect/credentials.php', array('ssp_state' => $id));
 			$as_url = $this->request_authentication($app_url);
 
-			SimpleSAML_Utilities::redirect($as_url);
+			SimpleSAML_Utilities::redirectTrustedURL($as_url);
 		} catch(Exception $e) {
 			// attach the exception to the state
 			SimpleSAML_Auth_State::throwException($state, $e);
@@ -150,7 +150,7 @@ class sspmod_aselect_Auth_Source_aselect extends SimpleSAML_Auth_Source {
 		curl_close($curl);
 
 		if($str === false)
-			throw new SimpleSAML_Error_Exception("Unable to retrieve URL: $error");
+			throw new SimpleSAML_Error_Exception("Unable to retrieve URL: $err");
 
 		parse_str($str, $res);
 
diff --git a/inc/simplesamlphp/modules/aselect/www/credentials.php b/inc/simplesamlphp/modules/aselect/www/credentials.php
index 3d3b8cb..1da71a6 100644
--- a/inc/simplesamlphp/modules/aselect/www/credentials.php
+++ b/inc/simplesamlphp/modules/aselect/www/credentials.php
@@ -7,7 +7,18 @@
  * @author Wessel Dankers, Tilburg University
  */
 function check_credentials() {
-	$state = SimpleSAML_Auth_State::loadState($_REQUEST['ssp_state'], 'aselect:login');
+	
+	if (!array_key_exists('ssp_state', $_REQUEST))
+		throw new SimpleSAML_Error_Exception("Missing ssp_state parameter");
+	$id = $_REQUEST['ssp_state'];
+
+	// sanitize the input
+	$sid = SimpleSAML_Utilities::parseStateID($id);
+	if (!is_null($sid['url'])) {
+		SimpleSAML_Utilities::checkURLAllowed($sid['url']);
+	}
+
+	$state = SimpleSAML_Auth_State::loadState($id, 'aselect:login');
 
 	if(!array_key_exists('a-select-server', $_REQUEST))
 		SimpleSAML_Auth_State::throwException($state, new SimpleSAML_Error_Exception("Missing a-select-server parameter"));
diff --git a/inc/simplesamlphp/modules/authX509/dictionaries/X509error.translation.json b/inc/simplesamlphp/modules/authX509/dictionaries/X509error.translation.json
index e454640..9961885 100644
--- a/inc/simplesamlphp/modules/authX509/dictionaries/X509error.translation.json
+++ b/inc/simplesamlphp/modules/authX509/dictionaries/X509error.translation.json
@@ -20,8 +20,12 @@
 		"ru": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 X509",
 		"zh": "X509\u786e\u8ba4\u8ba4\u8bc1",
 		"ar": "\u062a\u0635\u062f\u064a\u0642 \u0634\u0647\u0627\u062f\u0629 X509",
+		"lv": "x509 sertifik\u0101ta autentifik\u0101cija",
 		"id": "Autentifikasi certificate X509",
-		"sr": "Autentifikacija upotrebom X509 digitalnog sertifikata"
+		"sr": "Autentifikacija upotrebom X509 digitalnog sertifikata",
+		"ro": "Autentificare cu certificat X509",
+		"cs": "Autentizace certifik\u00e1tem X509",
+		"eu": "Kautotzea X509 ziurtagiri bidez"
 	},
 	"certificate_text": {
 		"fr": "Un certificat X509 est requis pour acc\u00e9der \u00e0 ce service.",
@@ -44,7 +48,11 @@
 		"ru": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0443 \u043f\u043e\u0434\u043b\u0438\u043d\u043d\u043e\u0441\u0442\u0438 X509 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043b\u0443\u0436\u0431\u0435.",
 		"zh": "X509\u786e\u8ba4\u8ba4\u8bc1\u8981\u6c42\u8bbf\u95ee\u8be5\u670d\u52a1",
 		"ar": "\u062a\u0635\u062f\u064a\u0642 \u0634\u0647\u0627\u062f\u0629 (X509) \u0636\u0631\u0648\u0631\u064a \u0644\u062f\u062e\u0648\u0644 \u0647\u0630\u0647 \u0627\u0644\u062e\u062f\u0645\u0629",
+		"lv": "x509 sertifik\u0101ta autentifik\u0101cija ir nepiecie\u0161ama, lai piek\u013c\u016btu \u0161im servisam",
 		"id": "Autentifikasi certificate X509 diperlukan untuk mengakses layanan ini.",
-		"sr": "Za pristup ovom servisu potrebno je da se autentifikujete upotrebom X509 sertifikata."
+		"sr": "Za pristup ovom servisu potrebno je da se autentifikujete upotrebom X509 sertifikata.",
+		"ro": "Pentru accesarea acestui serviciu este necesar\u0103 autentificarea cu certificat X509.",
+		"cs": "Pro p\u0159\u00edstup k t\u00e9to slu\u017eb\u011b je vy\u017eadov\u00e1n X509 certifik\u00e1t.",
+		"eu": "X509 ziurtagiriaren bidezko kautotzea beharrezkoa da zerbitzu honetan sartzeko"
 	}
 }
diff --git a/inc/simplesamlphp/modules/authX509/docs/authX509.txt b/inc/simplesamlphp/modules/authX509/docs/authX509.txt
index 4992e61..8cb3ff3 100644
--- a/inc/simplesamlphp/modules/authX509/docs/authX509.txt
+++ b/inc/simplesamlphp/modules/authX509/docs/authX509.txt
@@ -1,7 +1,7 @@
 Using the X509 authentication source with simpleSAMLphp
 =======================================================
 
-The authX509 module provide X509 authentication with certificate
+The authX509 module provides X509 authentication with certificate
 validation. For now there is only one authentication source:
 
 * authX509userCert Validate against LDAP userCertificate attribute
@@ -27,22 +27,22 @@ Note that SSLVerifyClient can be set to optional if you want to support
 both certificate and plain login authentication at the same time (more on
 this later).
 
-If your server or your client (or both!) have TLS renegociation disabled
+If your server or your client (or both!) have TLS renegotiation disabled
 as a workaround for CVE-2009-3555, then the configuration directive above
 must not appear in a , , or in a name-based
-. You can only use them server-wide, or in 
-with different IP address/port combinaisons.
+. You can only use them server-wide, or in s
+with different IP address/port combinations.
 
 
 Setting up the authX509 module
 ------------------------------
 
-The first thing you need to do is to enable the cas module:
+The first thing you need to do is to enable the module:
 
     touch modules/authX509/enable
 
 Then you must add it as an authentication source. Here is an
-example authsource.php
+example authsources.php entry:
 
     'x509' => array(
         'authX509:X509userCert',
@@ -52,8 +52,8 @@ example authsource.php
         'search.enable' => TRUE,
         'search.attributes' => array('uid', 'mail'),
         'search.base' => 'dc=example,dc=net',
-        'x509attributes' => array('UID' => 'uid'),
-        'ldapusercert' => array('userCertificate;binary'),
+        'authX509:x509attributes' => array('UID' => 'uid'),
+        'authX509:ldapusercert' => array('userCertificate;binary'),
     ),
 
 The configuration is the same as for the LDAP module, except for
@@ -62,16 +62,18 @@ two options:
 * x509attributes is used to map a certificate subject attribute to
                  an LDAP attribute. It is used to find the certificate
                  owner in LDAP from the certificate subject. If multiple
-                 mappings are provided, any mappping will match (this
-                 is a logical OR). Default is array('UID' => 'uid')
+                 mappings are provided, any mapping will match (this
+                 is a logical OR). Default is array('UID' => 'uid').
 * ldapusercert   the LDAP attribute in which the user certificate will
-                 be found. Default is userCertificate;binary
+                 be found. Default is userCertificate;binary. This can
+                 be set to NULL to avoid looking up the certificate in
+                 LDAP.
 
 
 Uploading certificate in LDAP
 -----------------------------
 
-Certificate are usually stored in LDAP as DER, in binary. Here is
+Certificates are usually stored in LDAP as DER, in binary. Here is
 how to convert from PEM to DER:
 
     openssl x509 -in cert.pem -inform PEM -outform DER -out cert.der
@@ -84,8 +86,8 @@ Here is some LDIF to upload the certificate in the directory:
     userCertificate;binary:< file:///path/to/cert.der
 
 
-Supporting both certificate and login authentications
-=====================================================
+Supporting both certificate and login authentication
+====================================================
 
 In your Apache configuration, set SSLVerifyClient to optional. Then you
 can hack your metadata/saml20-idp-hosted.php file that way:
diff --git a/inc/simplesamlphp/modules/authX509/lib/Auth/Source/X509userCert.php b/inc/simplesamlphp/modules/authX509/lib/Auth/Source/X509userCert.php
index e7e73dc..cfab1fa 100644
--- a/inc/simplesamlphp/modules/authX509/lib/Auth/Source/X509userCert.php
+++ b/inc/simplesamlphp/modules/authX509/lib/Auth/Source/X509userCert.php
@@ -6,7 +6,6 @@
  *
  * @author Emmanuel Dreyfus 
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authX509_Auth_Source_X509userCert extends SimpleSAML_Auth_Source {
 
@@ -46,7 +45,7 @@ class sspmod_authX509_Auth_Source_X509userCert extends SimpleSAML_Auth_Source {
 			$this->x509attributes =
 				$config['authX509:x509attributes'];
 
-		if (isset($config['authX509:ldapusercert']))
+		if (array_key_exists('authX509:ldapusercert', $config))
 			$this->ldapusercert =
 				$config['authX509:ldapusercert'];
 
@@ -142,18 +141,20 @@ class sspmod_authX509_Auth_Source_X509userCert extends SimpleSAML_Auth_Source {
 			return;
 		}
 
-		$dn = FALSE;
+		$dn = NULL;
 		foreach ($this->x509attributes as $x509_attr => $ldap_attr) {
 			/* value is scalar */
-			$value = $client_cert_data['subject'][$x509_attr];
-			SimpleSAML_Logger::info('authX509: cert '.
-			                        $x509_attr.' = '.$value);
-			$dn = $ldapcf->searchfordn($ldap_attr, $value, TRUE);
-			if ($dn !== FALSE)
-				break;
+			if (array_key_exists($x509_attr, $client_cert_data['subject'])) {
+				$value = $client_cert_data['subject'][$x509_attr];
+				SimpleSAML_Logger::info('authX509: cert '.
+				                        $x509_attr.' = '.$value);
+				$dn = $ldapcf->searchfordn($ldap_attr, $value, TRUE);
+				if ($dn !== NULL)
+					break;
+			}
 		}
 
-		if ($dn === FALSE) {
+		if ($dn === NULL) {
 			SimpleSAML_Logger::error('authX509: cert has '.
 			                         'no matching user in LDAP');
 			$state['authX509.error'] = "UNKNOWNCERT";
@@ -163,6 +164,16 @@ class sspmod_authX509_Auth_Source_X509userCert extends SimpleSAML_Auth_Source {
 			return;
 		}
 
+		if ($this->ldapusercert === NULL) { // do not check for certificate match
+			$attributes = $ldapcf->getAttributes($dn);
+			assert('is_array($attributes)');
+			$state['Attributes'] = $attributes;
+			$this->authSuccesful($state);
+
+			assert('FALSE'); /* NOTREACHED */
+			return;
+		}
+
 		$ldap_certs = $ldapcf->getAttributes($dn, $this->ldapusercert);
 		if ($ldap_certs === FALSE) {
 			SimpleSAML_Logger::error('authX509: no certificate '.
diff --git a/inc/simplesamlphp/modules/authYubiKey/dictionaries/yubikey.translation.json b/inc/simplesamlphp/modules/authYubiKey/dictionaries/yubikey.translation.json
index f2111ab..3c30383 100644
--- a/inc/simplesamlphp/modules/authYubiKey/dictionaries/yubikey.translation.json
+++ b/inc/simplesamlphp/modules/authYubiKey/dictionaries/yubikey.translation.json
@@ -13,6 +13,7 @@
 		"fi": "Kirjaudu Yubikeylla",
 		"pt": "Entrar com YubiKey",
 		"pl": "Login z YubiKey",
+		"eu": "YubiKey erabiliz",
 		"tr": "YubiKey ile giri\u015f",
 		"fr": "S'authentifier avec YubiKey",
 		"it": "Connessione con YubiKey",
@@ -24,8 +25,11 @@
 		"ru": "\u0412\u043e\u0439\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e YubiKey",
 		"zh": "\u4f7f\u7528YubiKey\u767b\u5f55",
 		"ar": "\u0623\u062f\u062e\u0644 \u0645\u0633\u062a\u062e\u062f\u0645\u0627\u064bYubiKey ",
+		"lv": "Piesl\u0113gties ar YubiKey",
 		"id": "Login dengan YubiKey",
-		"sr": "Prijavite se pomo\u0107u YubiKey-a"
+		"sr": "Prijavite se pomo\u0107u YubiKey-a",
+		"ro": "Login cu YubiKey",
+		"cs": "P\u0159ihl\u00e1\u0161en\u00ed pomoc\u00ed YubiKey"
 	},
 	"intro": {
 		"no": "En tjeneste har bedt om at du autentiserer deg. For \u00e5 autentisere seg, trykk p\u00e5 knappen p\u00e5 din YubiKey. Feltet under vil da bli automatisk utfylt med et sikkert engangspassord.",
@@ -52,7 +56,11 @@
 		"ru": "\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c YubiKey. \u0412 \u043f\u043e\u043b\u0435 \u043d\u0438\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c.",
 		"zh": "\u67d0\u4e9b\u670d\u52a1\u8bf7\u6c42\u8ba4\u8bc1\u3002\u4e3a\u4e86\u8ba4\u8bc1\uff0c\u8bf7\u70b9\u51fb\u4f60\u7684YubiKey\u6309\u94ae\uff0c\u4e0b\u5217\u533a\u57df\u5e94\u8be5\u4f1a\u88ab\u81ea\u52a8\u586b\u5145\u6210\u4e00\u6b21\u6027\u5b89\u5168\u5bc6\u7801",
 		"ar": "\u0628\u0639\u0636 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u062a\u062a\u0637\u0644\u0628  \u062a\u0635\u062f\u064a\u0642\u0627\u064b. \u0644\u0644\u062a\u0635\u062f\u064a\u0642 \u0623\u0636\u063a\u0637 \u0627\u0644\u0632\u0631 \u0627\u0644\u0645\u0648\u062c\u0648\u062f \u0639\u0644\u064a   YubiKey. \u0645\u0645\u0627 \u0633\u064a\u0624\u062f\u064a \u0644\u0645\u0644\u0621 \u0627\u0644\u062d\u0642\u0644 \u0623\u062f\u0646\u0627\u0647 \u0628\u0643\u0644\u0645\u0629 \u0633\u0631 \u0648\u0627\u062d\u062f\u0629 \u0627\u0645\u0646\u0647 \u0627\u062a\u0648\u0645\u0627\u062a\u064a\u0643\u064a\u0627\u064b",
+		"lv": "K\u0101ds serviss prasa autentifik\u0101ciju. Klik\u0161\u0137iniet YubiKey pogu. Ievadlauks zem\u0101k autom\u0101tiski tiks aizpild\u012bts ar dro\u0161u vienreiz\u0113ju paroli.",
 		"id": "Beberapa layanan meminta autentifikasi. Untuk melakukan autentifikasi, klik tombol pada YubiKey Anda. Field dibawah seharusnya secara otomatis akan diisi dengan one-time-password yang aman.",
-		"sr": "Neki od servisa je zatra\u017eio da se autentifikujete. Da biste se autentifikovali pritisnite dugme na va\u0161em YubiKey ure\u0111aju. Nakon toga bi u polje ispod trebala biti automatski upisana jednokratna lozinka."
+		"sr": "Neki od servisa je zatra\u017eio da se autentifikujete. Da biste se autentifikovali pritisnite dugme na va\u0161em YubiKey ure\u0111aju. Nakon toga bi u polje ispod trebala biti automatski upisana jednokratna lozinka.",
+		"ro": "Un serviciu a cerut s\u0103 v\u0103 autentifica\u021bi. Pentru autentificare, ap\u0103sa\u021bi butonul de pe YubiKey. C\u00e2mpul de mai jos va fi completat automat cu o parol\u0103 de unic\u0103 folosin\u021b\u0103.",
+		"cs": "N\u011bkter\u00e1 slu\u017eba si vy\u017e\u00e1dala autentizaci. K p\u0159ihl\u00e1\u0161en\u00ed klikn\u011bte na v\u00e1\u0161 YubiKey. Spodn\u00ed pol\u00ed\u010dko by se pot\u00e9 m\u011blo automaticky vyplnit bezpe\u010dn\u00fdm jednor\u00e1zov\u00fdm heslem.",
+		"eu": "Zerbitzu batek kautotzeko eskatu du. Kautotzeko, klikatu zure YubiKey botoia. Behean kokatutako eremua automatikoki bete beharko litzateke erabilera bakarreko (OTP) pasahitz seguru batekin"
 	}
 }
diff --git a/inc/simplesamlphp/modules/authYubiKey/lib/Auth/Source/YubiKey.php b/inc/simplesamlphp/modules/authYubiKey/lib/Auth/Source/YubiKey.php
index 1381ee6..07482db 100644
--- a/inc/simplesamlphp/modules/authYubiKey/lib/Auth/Source/YubiKey.php
+++ b/inc/simplesamlphp/modules/authYubiKey/lib/Auth/Source/YubiKey.php
@@ -38,7 +38,6 @@
  * go to http://yubico.com/developers/api/
  *
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authYubiKey_Auth_Source_YubiKey extends SimpleSAML_Auth_Source {
 
@@ -104,7 +103,7 @@ class sspmod_authYubiKey_Auth_Source_YubiKey extends SimpleSAML_Auth_Source {
 		$id = SimpleSAML_Auth_State::saveState($state, self::STAGEID);
 
 		$url = SimpleSAML_Module::getModuleURL('authYubiKey/yubikeylogin.php');
-		SimpleSAML_Utilities::redirect($url, array('AuthState' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id));
 	}
 	
 	
@@ -124,6 +123,12 @@ class sspmod_authYubiKey_Auth_Source_YubiKey extends SimpleSAML_Auth_Source {
 		assert('is_string($authStateId)');
 		assert('is_string($otp)');
 
+		// sanitize the input
+		$sid = SimpleSAML_Utilities::parseStateID($authStateId);
+		if (!is_null($sid['url'])) {
+			SimpleSAML_Utilities::checkURLAllowed($sid['url']);
+		}
+
 		/* Retrieve the authentication state. */
 		$state = SimpleSAML_Auth_State::loadState($authStateId, self::STAGEID);
 
diff --git a/inc/simplesamlphp/modules/authYubiKey/www/yubikeylogin.php b/inc/simplesamlphp/modules/authYubiKey/www/yubikeylogin.php
index 3c28150..fd6e0a7 100644
--- a/inc/simplesamlphp/modules/authYubiKey/www/yubikeylogin.php
+++ b/inc/simplesamlphp/modules/authYubiKey/www/yubikeylogin.php
@@ -7,7 +7,6 @@
  *
  * @author Olav Morken, UNINETT AS.
  * @package simpleSAMLphp
- * @version $Id$
  */
 
 if (!array_key_exists('AuthState', $_REQUEST)) {
diff --git a/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php b/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php
index ef7cd02..cc23bdc 100644
--- a/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php
+++ b/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Hash.php
@@ -8,7 +8,6 @@
  *
  * @author Dyonisius Visser, TERENA.
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authcrypt_Auth_Source_Hash extends sspmod_core_Auth_UserPassBase {
 
diff --git a/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php b/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php
index 88ba768..9acd461 100644
--- a/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php
+++ b/inc/simplesamlphp/modules/authcrypt/lib/Auth/Source/Htpasswd.php
@@ -5,7 +5,6 @@
  *
  * @author Dyonisius (Dick) Visser, TERENA.
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authcrypt_Auth_Source_Htpasswd extends sspmod_core_Auth_UserPassBase {
 
diff --git a/inc/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php b/inc/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php
index fcf3bff..44ac08e 100644
--- a/inc/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php
+++ b/inc/simplesamlphp/modules/authfacebook/extlibinc/base_facebook.php
@@ -120,7 +120,12 @@ abstract class BaseFacebook
   /**
    * Version.
    */
-  const VERSION = '3.1.1';
+  const VERSION = '3.2.2';
+
+  /**
+   * Signed Request Algorithm.
+   */
+  const SIGNED_REQUEST_ALGORITHM = 'HMAC-SHA256';
 
   /**
    * Default options for curl.
@@ -129,7 +134,7 @@ abstract class BaseFacebook
     CURLOPT_CONNECTTIMEOUT => 10,
     CURLOPT_RETURNTRANSFER => true,
     CURLOPT_TIMEOUT        => 60,
-    CURLOPT_USERAGENT      => 'facebook-php-3.1',
+    CURLOPT_USERAGENT      => 'facebook-php-3.2',
   );
 
   /**
@@ -146,11 +151,12 @@ abstract class BaseFacebook
    * Maps aliases to Facebook domains.
    */
   public static $DOMAIN_MAP = array(
-    'api'       => 'https://api.facebook.com/',
-    'api_video' => 'https://api-video.facebook.com/',
-    'api_read'  => 'https://api-read.facebook.com/',
-    'graph'     => 'https://graph.facebook.com/',
-    'www'       => 'https://www.facebook.com/',
+    'api'         => 'https://api.facebook.com/',
+    'api_video'   => 'https://api-video.facebook.com/',
+    'api_read'    => 'https://api-read.facebook.com/',
+    'graph'       => 'https://graph.facebook.com/',
+    'graph_video' => 'https://graph-video.facebook.com/',
+    'www'         => 'https://www.facebook.com/',
   );
 
   /**
@@ -161,11 +167,11 @@ abstract class BaseFacebook
   protected $appId;
 
   /**
-   * The Application API Secret.
+   * The Application App Secret.
    *
    * @var string
    */
-  protected $apiSecret;
+  protected $appSecret;
 
   /**
    * The ID of the Facebook user, or 0 if the user is logged out.
@@ -199,6 +205,13 @@ abstract class BaseFacebook
    */
   protected $fileUploadSupport = false;
 
+  /**
+   * Indicates if we trust HTTP_X_FORWARDED_* headers.
+   *
+   * @var boolean
+   */
+  protected $trustForwarded = false;
+
   /**
    * Initialize a Facebook Application.
    *
@@ -211,14 +224,16 @@ abstract class BaseFacebook
    */
   public function __construct($config) {
     $this->setAppId($config['appId']);
-    $this->setApiSecret($config['secret']);
+    $this->setAppSecret($config['secret']);
     if (isset($config['fileUpload'])) {
       $this->setFileUploadSupport($config['fileUpload']);
     }
-
+    if (isset($config['trustForwarded']) && $config['trustForwarded']) {
+      $this->trustForwarded = true;
+    }
     $state = $this->getPersistentData('state');
     if (!empty($state)) {
-      $this->state = $this->getPersistentData('state');
+      $this->state = $state;
     }
   }
 
@@ -243,23 +258,45 @@ abstract class BaseFacebook
   }
 
   /**
-   * Set the API Secret.
+   * Set the App Secret.
    *
-   * @param string $apiSecret The API Secret
+   * @param string $apiSecret The App Secret
    * @return BaseFacebook
+   * @deprecated
    */
   public function setApiSecret($apiSecret) {
-    $this->apiSecret = $apiSecret;
+    $this->setAppSecret($apiSecret);
     return $this;
   }
 
   /**
-   * Get the API Secret.
+   * Set the App Secret.
    *
-   * @return string the API Secret
+   * @param string $appSecret The App Secret
+   * @return BaseFacebook
+   */
+  public function setAppSecret($appSecret) {
+    $this->appSecret = $appSecret;
+    return $this;
+  }
+
+  /**
+   * Get the App Secret.
+   *
+   * @return string the App Secret
+   * @deprecated
    */
   public function getApiSecret() {
-    return $this->apiSecret;
+    return $this->getAppSecret();
+  }
+
+  /**
+   * Get the App Secret.
+   *
+   * @return string the App Secret
+   */
+  public function getAppSecret() {
+    return $this->appSecret;
   }
 
   /**
@@ -278,10 +315,21 @@ abstract class BaseFacebook
    *
    * @return boolean true if and only if the server supports file upload.
    */
-  public function useFileUploadSupport() {
+  public function getFileUploadSupport() {
     return $this->fileUploadSupport;
   }
 
+  /**
+   * DEPRECATED! Please use getFileUploadSupport instead.
+   *
+   * Get the file upload support status.
+   *
+   * @return boolean true if and only if the server supports file upload.
+   */
+  public function useFileUploadSupport() {
+    return $this->getFileUploadSupport();
+  }
+
   /**
    * Sets the access token for api calls.  Use this if you get
    * your access token by other means and just want the SDK
@@ -295,6 +343,49 @@ abstract class BaseFacebook
     return $this;
   }
 
+  /**
+   * Extend an access token, while removing the short-lived token that might
+   * have been generated via client-side flow. Thanks to http://bit.ly/b0Pt0H
+   * for the workaround.
+   */
+  public function setExtendedAccessToken() {
+    try {
+      // need to circumvent json_decode by calling _oauthRequest
+      // directly, since response isn't JSON format.
+      $access_token_response = $this->_oauthRequest(
+        $this->getUrl('graph', '/oauth/access_token'),
+        $params = array(
+          'client_id' => $this->getAppId(),
+          'client_secret' => $this->getAppSecret(),
+          'grant_type' => 'fb_exchange_token',
+          'fb_exchange_token' => $this->getAccessToken(),
+        )
+      );
+    }
+    catch (FacebookApiException $e) {
+      // most likely that user very recently revoked authorization.
+      // In any event, we don't have an access token, so say so.
+      return false;
+    }
+
+    if (empty($access_token_response)) {
+      return false;
+    }
+
+    $response_params = array();
+    parse_str($access_token_response, $response_params);
+
+    if (!isset($response_params['access_token'])) {
+      return false;
+    }
+
+    $this->destroySession();
+
+    $this->setPersistentData(
+      'access_token', $response_params['access_token']
+    );
+  }
+
   /**
    * Determines the access token that should be used for API calls.
    * The first time this is called, $this->accessToken is set equal
@@ -348,6 +439,11 @@ abstract class BaseFacebook
       // the JS SDK puts a code in with the redirect_uri of ''
       if (array_key_exists('code', $signed_request)) {
         $code = $signed_request['code'];
+        if ($code && $code == $this->getPersistentData('code')) {
+          // short-circuit if the code we have is the same as the one presented
+          return $this->getPersistentData('access_token');
+        }
+
         $access_token = $this->getAccessTokenFromCode($code, '');
         if ($access_token) {
           $this->setPersistentData('code', $code);
@@ -392,10 +488,10 @@ abstract class BaseFacebook
    */
   public function getSignedRequest() {
     if (!$this->signedRequest) {
-      if (isset($_REQUEST['signed_request'])) {
+      if (!empty($_REQUEST['signed_request'])) {
         $this->signedRequest = $this->parseSignedRequest(
           $_REQUEST['signed_request']);
-      } else if (isset($_COOKIE[$this->getSignedRequestCookieName()])) {
+      } else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
         $this->signedRequest = $this->parseSignedRequest(
           $_COOKIE[$this->getSignedRequestCookieName()]);
       }
@@ -433,6 +529,11 @@ abstract class BaseFacebook
     if ($signed_request) {
       if (array_key_exists('user_id', $signed_request)) {
         $user = $signed_request['user_id'];
+
+        if($user != $this->getPersistentData('user_id')){
+          $this->clearAllPersistentData();
+        }
+
         $this->setPersistentData('user_id', $signed_request['user_id']);
         return $user;
       }
@@ -469,7 +570,7 @@ abstract class BaseFacebook
    * JavaScript, you can pass in display=popup as part of the $params.
    *
    * The parameters:
-   * - redirect_uri: the url to go to after a successful login
+   * - redirect_uri: the URL to go to after a successful login
    * - scope: comma separated list of requested extended perms
    *
    * @param array $params Provide custom parameters
@@ -499,7 +600,7 @@ abstract class BaseFacebook
    * Get a Logout URL suitable for use with redirects.
    *
    * The parameters:
-   * - next: the url to go to after a successful logout
+   * - next: the URL to go to after a successful logout
    *
    * @param array $params Provide custom parameters
    * @return string The URL for the logout flow
@@ -510,7 +611,7 @@ abstract class BaseFacebook
       'logout.php',
       array_merge(array(
         'next' => $this->getCurrentUrl(),
-        'access_token' => $this->getAccessToken(),
+        'access_token' => $this->getUserAccessToken(),
       ), $params)
     );
   }
@@ -567,6 +668,17 @@ abstract class BaseFacebook
     return 'fbsr_'.$this->getAppId();
   }
 
+  /**
+   * Constructs and returns the name of the coookie that potentially contain
+   * metadata. The cookie is not set by the BaseFacebook class, but it may be
+   * set by the JavaScript SDK.
+   *
+   * @return string the name of the cookie that would house metadata.
+   */
+  protected function getMetadataCookieName() {
+    return 'fbm_'.$this->getAppId();
+  }
+
   /**
    * Get the authorization code from the query parameters, if it exists,
    * and otherwise return false to signal no authorization code was
@@ -621,7 +733,7 @@ abstract class BaseFacebook
    *                public information about users and applications.
    */
   protected function getApplicationAccessToken() {
-    return $this->appId.'|'.$this->apiSecret;
+    return $this->appId.'|'.$this->appSecret;
   }
 
   /**
@@ -664,7 +776,7 @@ abstract class BaseFacebook
         $this->_oauthRequest(
           $this->getUrl('graph', '/oauth/access_token'),
           $params = array('client_id' => $this->getAppId(),
-                          'client_secret' => $this->getApiSecret(),
+                          'client_secret' => $this->getAppSecret(),
                           'redirect_uri' => $redirect_uri,
                           'code' => $code));
     } catch (FacebookApiException $e) {
@@ -707,16 +819,34 @@ abstract class BaseFacebook
     // results are returned, errors are thrown
     if (is_array($result) && isset($result['error_code'])) {
       $this->throwAPIException($result);
+      // @codeCoverageIgnoreStart
     }
+    // @codeCoverageIgnoreEnd
 
-    if ($params['method'] === 'auth.expireSession' ||
-        $params['method'] === 'auth.revokeAuthorization') {
+    $method = strtolower($params['method']);
+    if ($method === 'auth.expiresession' ||
+        $method === 'auth.revokeauthorization') {
       $this->destroySession();
     }
 
     return $result;
   }
 
+  /**
+   * Return true if this is video post.
+   *
+   * @param string $path The path
+   * @param string $method The http method (default 'GET')
+   *
+   * @return boolean true if this is video post
+   */
+  protected function isVideoPost($path, $method = 'GET') {
+    if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) {
+      return true;
+    }
+    return false;
+  }
+
   /**
    * Invoke the Graph API.
    *
@@ -734,15 +864,23 @@ abstract class BaseFacebook
     }
     $params['method'] = $method; // method override as we always do a POST
 
+    if ($this->isVideoPost($path, $method)) {
+      $domainKey = 'graph_video';
+    } else {
+      $domainKey = 'graph';
+    }
+
     $result = json_decode($this->_oauthRequest(
-      $this->getUrl('graph', $path),
+      $this->getUrl($domainKey, $path),
       $params
     ), true);
 
     // results are returned, errors are thrown
     if (is_array($result) && isset($result['error'])) {
       $this->throwAPIException($result);
+      // @codeCoverageIgnoreStart
     }
+    // @codeCoverageIgnoreEnd
 
     return $result;
   }
@@ -788,7 +926,7 @@ abstract class BaseFacebook
     }
 
     $opts = self::$CURL_OPTS;
-    if ($this->useFileUploadSupport()) {
+    if ($this->getFileUploadSupport()) {
       $opts[CURLOPT_POSTFIELDS] = $params;
     } else {
       $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
@@ -816,6 +954,25 @@ abstract class BaseFacebook
       $result = curl_exec($ch);
     }
 
+    // With dual stacked DNS responses, it's possible for a server to
+    // have IPv6 enabled but not have IPv6 connectivity.  If this is
+    // the case, curl will try IPv4 first and if that fails, then it will
+    // fall back to IPv6 and the error EHOSTUNREACH is returned by the
+    // operating system.
+    if ($result === false && empty($opts[CURLOPT_IPRESOLVE])) {
+        $matches = array();
+        $regex = '/Failed to connect to ([^:].*): Network is unreachable/';
+        if (preg_match($regex, curl_error($ch), $matches)) {
+          if (strlen(@inet_pton($matches[1])) === 16) {
+            self::errorLog('Invalid IPv6 configuration on server, '.
+                           'Please disable or get native IPv6 on your server.');
+            self::$CURL_OPTS[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
+            curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
+            $result = curl_exec($ch);
+          }
+        }
+    }
+
     if ($result === false) {
       $e = new FacebookApiException(array(
         'error_code' => curl_errno($ch),
@@ -844,14 +1001,15 @@ abstract class BaseFacebook
     $sig = self::base64UrlDecode($encoded_sig);
     $data = json_decode(self::base64UrlDecode($payload), true);
 
-    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') {
-      self::errorLog('Unknown algorithm. Expected HMAC-SHA256');
+    if (strtoupper($data['algorithm']) !== self::SIGNED_REQUEST_ALGORITHM) {
+      self::errorLog(
+        'Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM);
       return null;
     }
 
     // check sig
     $expected_sig = hash_hmac('sha256', $payload,
-                              $this->getApiSecret(), $raw = true);
+                              $this->getAppSecret(), $raw = true);
     if ($sig !== $expected_sig) {
       self::errorLog('Bad Signed JSON signature!');
       return null;
@@ -860,6 +1018,26 @@ abstract class BaseFacebook
     return $data;
   }
 
+  /**
+   * Makes a signed_request blob using the given data.
+   *
+   * @param array The data array.
+   * @return string The signed request.
+   */
+  protected function makeSignedRequest($data) {
+    if (!is_array($data)) {
+      throw new InvalidArgumentException(
+        'makeSignedRequest expects an array. Got: ' . print_r($data, true));
+    }
+    $data['algorithm'] = self::SIGNED_REQUEST_ALGORITHM;
+    $data['issued_at'] = time();
+    $json = json_encode($data);
+    $b64 = self::base64UrlEncode($json);
+    $raw_sig = hash_hmac('sha256', $b64, $this->getAppSecret(), $raw = true);
+    $sig = self::base64UrlEncode($raw_sig);
+    return $sig.'.'.$b64;
+  }
+
   /**
    * Build the URL for api given parameters.
    *
@@ -961,6 +1139,47 @@ abstract class BaseFacebook
     return $url;
   }
 
+  protected function getHttpHost() {
+    if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
+      return $_SERVER['HTTP_X_FORWARDED_HOST'];
+    }
+    return $_SERVER['HTTP_HOST'];
+  }
+
+  protected function getHttpProtocol() {
+    if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+      if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
+        return 'https';
+      }
+      return 'http';
+    }
+    /*apache + variants specific way of checking for https*/
+    if (isset($_SERVER['HTTPS']) &&
+        ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) {
+      return 'https';
+    }
+    /*nginx way of checking for https*/
+    if (isset($_SERVER['SERVER_PORT']) &&
+        ($_SERVER['SERVER_PORT'] === '443')) {
+      return 'https';
+    }
+    return 'http';
+  }
+
+  /**
+   * Get the base domain used for the cookie.
+   */
+  protected function getBaseDomain() {
+    // The base domain is stored in the metadata cookie if not we fallback
+    // to the current hostname
+    $metadata = $this->getMetadataCookie();
+    if (array_key_exists('base_domain', $metadata) &&
+        !empty($metadata['base_domain'])) {
+      return trim($metadata['base_domain'], '.');
+    }
+    return $this->getHttpHost();
+  }
+
   /**
    * Returns the Current URL, stripping it of known FB parameters that should
    * not persist.
@@ -968,15 +1187,9 @@ abstract class BaseFacebook
    * @return string The current URL
    */
   protected function getCurrentUrl() {
-    if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
-      || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'
-    ) {
-      $protocol = 'https://';
-    }
-    else {
-      $protocol = 'http://';
-    }
-    $currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+    $protocol = $this->getHttpProtocol() . '://';
+    $host = $this->getHttpHost();
+    $currentUrl = $protocol.$host.$_SERVER['REQUEST_URI'];
     $parts = parse_url($currentUrl);
 
     $query = '';
@@ -1030,7 +1243,7 @@ abstract class BaseFacebook
   /**
    * Analyzes the supplied result to see if it was thrown
    * because the access token is no longer valid.  If that is
-   * the case, then the persistent store is cleared.
+   * the case, then we destroy the session.
    *
    * @param $result array A record storing the error message returned
    *                      by a failed API call.
@@ -1045,12 +1258,13 @@ abstract class BaseFacebook
         // REST server errors are just Exceptions
       case 'Exception':
         $message = $e->getMessage();
-      if ((strpos($message, 'Error validating access token') !== false) ||
-          (strpos($message, 'Invalid OAuth access token') !== false)) {
-        $this->setAccessToken(null);
-        $this->user = 0;
-        $this->clearAllPersistentData();
-      }
+        if ((strpos($message, 'Error validating access token') !== false) ||
+            (strpos($message, 'Invalid OAuth access token') !== false) ||
+            (strpos($message, 'An active access token must be used') !== false)
+        ) {
+          $this->destroySession();
+        }
+        break;
     }
 
     throw $e;
@@ -1078,6 +1292,7 @@ abstract class BaseFacebook
    * Exactly the same as base64_encode except it uses
    *   - instead of +
    *   _ instead of /
+   *   No padded =
    *
    * @param string $input base64UrlEncoded string
    * @return string
@@ -1086,13 +1301,94 @@ abstract class BaseFacebook
     return base64_decode(strtr($input, '-_', '+/'));
   }
 
+  /**
+   * Base64 encoding that doesn't need to be urlencode()ed.
+   * Exactly the same as base64_encode except it uses
+   *   - instead of +
+   *   _ instead of /
+   *
+   * @param string $input string
+   * @return string base64Url encoded string
+   */
+  protected static function base64UrlEncode($input) {
+    $str = strtr(base64_encode($input), '+/', '-_');
+    $str = str_replace('=', '', $str);
+    return $str;
+  }
+
   /**
    * Destroy the current session
    */
   public function destroySession() {
-    $this->setAccessToken(null);
-    $this->user = 0;
+    $this->accessToken = null;
+    $this->signedRequest = null;
+    $this->user = null;
     $this->clearAllPersistentData();
+
+    // Javascript sets a cookie that will be used in getSignedRequest that we
+    // need to clear if we can
+    $cookie_name = $this->getSignedRequestCookieName();
+    if (array_key_exists($cookie_name, $_COOKIE)) {
+      unset($_COOKIE[$cookie_name]);
+      if (!headers_sent()) {
+        $base_domain = $this->getBaseDomain();
+        setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
+      } else {
+        // @codeCoverageIgnoreStart
+        self::errorLog(
+          'There exists a cookie that we wanted to clear that we couldn\'t '.
+          'clear because headers was already sent. Make sure to do the first '.
+          'API call before outputing anything.'
+        );
+        // @codeCoverageIgnoreEnd
+      }
+    }
+  }
+
+  /**
+   * Parses the metadata cookie that our Javascript API set
+   *
+   * @return  an array mapping key to value
+   */
+  protected function getMetadataCookie() {
+    $cookie_name = $this->getMetadataCookieName();
+    if (!array_key_exists($cookie_name, $_COOKIE)) {
+      return array();
+    }
+
+    // The cookie value can be wrapped in "-characters so remove them
+    $cookie_value = trim($_COOKIE[$cookie_name], '"');
+
+    if (empty($cookie_value)) {
+      return array();
+    }
+
+    $parts = explode('&', $cookie_value);
+    $metadata = array();
+    foreach ($parts as $part) {
+      $pair = explode('=', $part, 2);
+      if (!empty($pair[0])) {
+        $metadata[urldecode($pair[0])] =
+          (count($pair) > 1) ? urldecode($pair[1]) : '';
+      }
+    }
+
+    return $metadata;
+  }
+
+  protected static function isAllowedDomain($big, $small) {
+    if ($big === $small) {
+      return true;
+    }
+    return self::endsWith($big, '.'.$small);
+  }
+
+  protected static function endsWith($big, $small) {
+    $len = strlen($small);
+    if ($len === 0) {
+      return true;
+    }
+    return substr($big, -$len) === $small;
   }
 
   /**
diff --git a/inc/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt b/inc/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt
index b92d719..969239f 100644
--- a/inc/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt
+++ b/inc/simplesamlphp/modules/authfacebook/extlibinc/fb_ca_chain_bundle.crt
@@ -1,121 +1,3920 @@
+##
+## ca-bundle.crt -- Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Thu Oct 18 19:05:59 2012
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+
+# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.86 $ $Date: 2012/10/18 16:26:52 $
+
+GTE CyberTrust Global Root
+==========================
 -----BEGIN CERTIFICATE-----
-MIIFgjCCBGqgAwIBAgIQDKKbZcnESGaLDuEaVk6fQjANBgkqhkiG9w0BAQUFADBm
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBDQS0zMB4XDTEwMDExMzAwMDAwMFoXDTEzMDQxMTIzNTk1OVowaDELMAkGA1UE
-BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQBgNVBAcTCVBhbG8gQWx0bzEX
-MBUGA1UEChMORmFjZWJvb2ssIEluYy4xFzAVBgNVBAMUDiouZmFjZWJvb2suY29t
-MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9rzj7QIuLM3sdHu1HcI1VcR3g
-b5FExKNV646agxSle1aQ/sJev1mh/u91ynwqd2BQmM0brZ1Hc3QrfYyAaiGGgEkp
-xbhezyfeYhAyO0TKAYxPnm2cTjB5HICzk6xEIwFbA7SBJ2fSyW1CFhYZyo3tIBjj
-19VjKyBfpRaPkzLmRwIDAQABo4ICrDCCAqgwHwYDVR0jBBgwFoAUUOpzidsp+xCP
-nuUBINTeeZlIg/cwHQYDVR0OBBYEFPp+tsFBozkjrHlEnZ9J4cFj2eM0MA4GA1Ud
-DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMF8GA1UdHwRYMFYwKaAnoCWGI2h0dHA6
-Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9jYTMtZmIuY3JsMCmgJ6AlhiNodHRwOi8vY3Js
-NC5kaWdpY2VydC5jb20vY2EzLWZiLmNybDCCAcYGA1UdIASCAb0wggG5MIIBtQYL
-YIZIAYb9bAEDAAEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0
-LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIB
-UgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkA
-YwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEA
-bgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMA
-UABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkA
-IABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwA
-aQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8A
-cgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMA
-ZQAuMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQUF
-AAOCAQEACOkTIdxMy11+CKrbGNLBSg5xHaTvu/v1wbyn3dO/mf68pPfJnX6ShPYy
-4XM4Vk0x4uaFaU4wAGke+nCKGi5dyg0Esg7nemLNKEJaFAJZ9enxZm334lSCeARy
-wlDtxULGOFRyGIZZPmbV2eNq5xdU/g3IuBEhL722mTpAye9FU/J8Wsnw54/gANyO
-Gzkewigua8ip8Lbs9Cht399yAfbfhUP1DrAm/xEcnHrzPr3cdCtOyJaM6SRPpRqH
-ITK5Nc06tat9lXVosSinT3KqydzxBYua9gCFFiR3x3DgZfvXkC6KDdUlDrNcJUub
-a1BHnLLP4mxTHL6faAXYd05IxNn/IA==
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
 -----END CERTIFICATE-----
+
+Thawte Server CA
+================
 -----BEGIN CERTIFICATE-----
-MIIGVTCCBT2gAwIBAgIQCFH5WYFBRcq94CTiEsnCDjANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA3MDQwMzAwMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR
-CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv
-KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5
-BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf
-1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs
-zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d
-32duXvsCAwEAAaOCAvcwggLzMA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w
-ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3
-LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH
-AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy
-AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj
-AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg
-AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ
-AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt
-AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj
-AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl
-AHIAZQBuAGMAZQAuMA8GA1UdEwEB/wQFMAMBAf8wNAYIKwYBBQUHAQEEKDAmMCQG
-CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSBhzCB
-hDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFz
-c3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNlcnQu
-Y29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSMEGDAW
-gBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUBINTe
-eZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAF1PhPGoiNOjsrycbeUpSXfh59bcqdg1
-rslx3OXb3J0kIZCmz7cBHJvUV5eR13UWpRLXuT0uiT05aYrWNTf58SHEW0CtWakv
-XzoAKUMncQPkvTAyVab+hA4LmzgZLEN8rEO/dTHlIxxFVbdpCJG1z9fVsV7un5Tk
-1nq5GMO41lJjHBC6iy9tXcwFOPRWBW3vnuzoYTYMFEuFFFoMg08iXFnLjIpx2vrF
-EIRYzwfu45DC9fkpx1ojcflZtGQriLCnNseaIGHr+k61rmsb5OPs4tk8QUmoIKRU
-9ZKNu8BVIASm2LAXFszj0Mi0PeXZhMbT9m5teMl5Q+h6N/9cNUm/ocU=
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
 -----END CERTIFICATE-----
+
+Thawte Premium Server CA
+========================
 -----BEGIN CERTIFICATE-----
-MIIEQjCCA6ugAwIBAgIEQoclDjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEy
-MjIxNTI3MjdaFw0xNDA3MjIxNTU3MjdaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
-EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV
-BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD
-1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt
-cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46
-OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd
-HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm
-t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET
-MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr
-BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo
-dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v
-Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU
-mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7
-UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF
-BQADgYEAUuVY7HCc/9EvhaYzC1rAIo348LtGIiMduEl5Xa24G8tmJnDioD2GU06r
-1kjLX/ktCdpdBgXadbjtdrZXTP59uN0AXlsdaTiFufsqVLPvkp5yMnqnuI3E2o6p
-NpAkoQSbB6kUCNnXcW26valgOjDLZFOnr241QiwdBAJAAE/rRa8=
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
+UCemDaYj+bvLpgcUQg==
 -----END CERTIFICATE-----
+
+Equifax Secure CA
+=================
 -----BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
-VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
-ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
-ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
-MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
-b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
-U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
-I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
-wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
-AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
-oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
-dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
-MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
-MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
-E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
-MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
-95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
-2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
+70+sB3c4
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 1
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
+MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
+NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
+o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
+kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
+RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+
+Digital Signature Trust Co. Global CA 3
+=======================================
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
+ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
+MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
+IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
+VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
+xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
+BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
+dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
+IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
+BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
+AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
+up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
+mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
+Tqj/ZA1k
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
+k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
+WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
+XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
+lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
+-----END CERTIFICATE-----
+
+Verisign Class 2 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
+cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
+Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
+nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
+wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
+ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
+1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
+LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
+-----END CERTIFICATE-----
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+ValiCert Class 1 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
+Orf1LXLI
+-----END CERTIFICATE-----
+
+ValiCert Class 2 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
+W9ViH0Pd
+-----END CERTIFICATE-----
+
+RSA Root Certificate 1
+======================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
+on+jjBXu
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
+bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
+rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
+FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
+y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
+a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
+D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
+-----END CERTIFICATE-----
+
+Verisign Class 2 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
+azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
+c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
+aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
+tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
+C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
+0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
+Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
+JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
+0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
+JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
+GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+Entrust.net Secure Server CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
+AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
+gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
+AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
+o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
+2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
+OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Equifax Secure Global eBusiness CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 1
+=============================
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 2
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
+ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
+MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
+DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
+2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
+BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
+JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
+uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
+jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
+78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
+V+GRMOrN
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+UTN-USER First-Network Applications
+===================================
+-----BEGIN CERTIFICATE-----
+MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
+BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
+WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
+YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
+cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
+mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
+DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
+Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
+P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
+j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
+HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
+cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
+CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
+IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
+RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
+xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
+DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
+fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
+f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
+qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
+RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
+gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
+6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
+FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
+Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
+B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
+aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
+T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
+JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
+zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
+ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
+1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
+GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
+Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 1 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
+NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
+7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
+EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
+0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
+2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
+HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
+iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
+28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
+yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
+vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
+qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
+IRlXvVWa
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+TDC Internet Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
+ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
+NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
+ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
+xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
+znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
+5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
+otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
+AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
+VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
+MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
+AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
+UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
+CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
+gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
+O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
+Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
+TDC OCES Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
+ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
+MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
+nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
+zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
+iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
+dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
+3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
+5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
+ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
+cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
+Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
+LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
+MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
+aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
+MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
+NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
+A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
+A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
+AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
+AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
+-----END CERTIFICATE-----
+
+UTN DATACorp SGC Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+UTN USERFirst Email Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
+BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
+OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
+FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
+ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
+dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
+B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
+om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
+TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
+yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
+AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
+HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
+bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
+AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
+xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
+NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
+w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+UTN USERFirst Object Root CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
+BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
+NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
+HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
+dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
+loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
+w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
+lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
+RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
+BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
+ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
+c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
+DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
+NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
+PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
+qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
+hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+NetLock Qualified (Class QA) Root
+=================================
+-----BEGIN CERTIFICATE-----
+MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
+eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
+bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
+LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
+dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
+aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
+CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
+8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
+m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
+0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
+0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
+YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
+biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
+a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
+YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
+YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
+ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
+L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
+Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
+aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
+YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
+IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
+DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
+wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
+W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
+R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
+5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
+-----END CERTIFICATE-----
+
+NetLock Notary (Class A) Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
+8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+NetLock Business (Class B) Root
+===============================
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+NetLock Express (Class C) Root
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Firmaprofesional Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+Wells Fargo Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
+bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
+MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
+x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
+E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
+OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
+sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
+YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
+BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
+ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
+m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
+OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
+tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
+UrbnBEI=
+-----END CERTIFICATE-----
+
+SwissSign Platinum CA - G2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
+HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
+U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
+669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
+eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
+WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
+j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
+8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
+aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
+domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
+CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
+zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
+IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
+Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
+NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
+U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
+KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
+9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
+aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
+OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
+Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
+IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+S-TRUST Authentication and Encryption Root CA 2005 PN
+=====================================================
+-----BEGIN CERTIFICATE-----
+MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
+BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
+cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
+LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
+NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
+ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
+aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
+b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
+4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
+g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
+eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
+KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
+/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
+bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
+D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
+pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
+P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
+nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
+F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
+Hz2eBIPdltkdOpQ=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+======================================
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 2 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
+vQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 3 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
+5A==
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA I
+=============================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+ComSign CA
+==========
+-----BEGIN CERTIFICATE-----
+MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
+EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
+MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
+Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
+ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
+P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
+GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
+YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
+rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
+oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
+AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
+QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
+mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
+/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
+zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
+AGegcQCCSA==
+-----END CERTIFICATE-----
+
+ComSign Secured CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+Buypass Class 3 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+============================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+CA Disig
+========
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
+QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
+MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
+bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
+GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
+Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
+hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
+ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
+gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
+AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
+aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
+ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
+BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
+WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
+mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
+ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
+4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Verisign Class 1 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
+VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
+yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
+XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
+0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
+RjXZ+Hxb
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
+CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
+bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
+D/xwzoiQ
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
+===================================================
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
+ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
+MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
+cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
+aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
+8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
+jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
+JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
+9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
+SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
+F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
+D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
+Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA III
+===============================
+-----BEGIN CERTIFICATE-----
+MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
+Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
+QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
+KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
+QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
+juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
+CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
+M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
+A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
+g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
+KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
+BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
+CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
+woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+=============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+A-Trust-nQual-03
+================
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
+Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
+a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
+dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
+RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
+ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
+c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
+zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
+yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
+SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
+iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
+cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
+eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
+ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
+sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
+JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
+ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı
+======================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
 -----END CERTIFICATE-----
diff --git a/inc/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php b/inc/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php
index 67ab3cb..72696c8 100644
--- a/inc/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php
+++ b/inc/simplesamlphp/modules/authfacebook/lib/Auth/Source/Facebook.php
@@ -5,7 +5,6 @@
  *
  * @author Andreas Åkre Solberg, UNINETT AS.
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authfacebook_Auth_Source_Facebook extends SimpleSAML_Auth_Source {
 
@@ -80,7 +79,7 @@ class sspmod_authfacebook_Auth_Source_Facebook extends SimpleSAML_Auth_Source {
 		$url = $facebook->getLoginUrl(array('redirect_uri' => $linkback, 'scope' => $this->req_perms));
 		SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT);
 
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	}
 		
 
diff --git a/inc/simplesamlphp/modules/authfacebook/lib/Facebook.php b/inc/simplesamlphp/modules/authfacebook/lib/Facebook.php
index 7fc2ba5..04d47e2 100644
--- a/inc/simplesamlphp/modules/authfacebook/lib/Facebook.php
+++ b/inc/simplesamlphp/modules/authfacebook/lib/Facebook.php
@@ -8,6 +8,14 @@ require_once(dirname(dirname(__FILE__)) . '/extlibinc/base_facebook.php');
  */
 class sspmod_authfacebook_Facebook extends BaseFacebook
 {
+  const FBSS_COOKIE_NAME = 'fbss';
+
+  // We can set this to a high number because the main session
+  // expiration will trump this.
+  const FBSS_COOKIE_EXPIRE = 31556926; // 1 year
+
+  // Stores the shared session ID if one is set.
+  protected $sharedSessionID;
 
   /* SimpleSAMLPhp state array */
   protected $ssp_state;
@@ -18,18 +26,60 @@ class sspmod_authfacebook_Facebook extends BaseFacebook
    * access token if during the course of execution
    * we discover them.
    *
-   * @param Array $config the application configuration.
+   * @param Array $config the application configuration. Additionally
+   * accepts "sharedSession" as a boolean to turn on a secondary
+   * cookie for environments with a shared session (that is, your app
+   * shares the domain with other apps).
    * @see BaseFacebook::__construct in base_facebook.php
    */
   public function __construct(array $config, &$ssp_state) {
     $this->ssp_state = &$ssp_state;
 
     parent::__construct($config);
+    if (!empty($config['sharedSession'])) {
+      $this->initSharedSession();
+    }
   }
 
   protected static $kSupportedKeys =
     array('state', 'code', 'access_token', 'user_id');
 
+  protected function initSharedSession() {
+    $cookie_name = $this->getSharedSessionCookieName();
+    if (isset($_COOKIE[$cookie_name])) {
+      $data = $this->parseSignedRequest($_COOKIE[$cookie_name]);
+      if ($data && !empty($data['domain']) &&
+          self::isAllowedDomain($this->getHttpHost(), $data['domain'])) {
+        // good case
+        $this->sharedSessionID = $data['id'];
+        return;
+      }
+      // ignoring potentially unreachable data
+    }
+    // evil/corrupt/missing case
+    $base_domain = $this->getBaseDomain();
+    $this->sharedSessionID = md5(uniqid(mt_rand(), true));
+    $cookie_value = $this->makeSignedRequest(
+      array(
+        'domain' => $base_domain,
+        'id' => $this->sharedSessionID,
+      )
+    );
+    $_COOKIE[$cookie_name] = $cookie_value;
+    if (!headers_sent()) {
+      $expire = time() + self::FBSS_COOKIE_EXPIRE;
+      setcookie($cookie_name, $cookie_value, $expire, '/', '.'.$base_domain);
+    } else {
+      // @codeCoverageIgnoreStart
+      SimpleSAML_Logger::debug(
+        'Shared session ID cookie could not be set! You must ensure you '.
+        'create the Facebook instance before headers have been sent. This '.
+        'will cause authentication issues after the first request.'
+      );
+      // @codeCoverageIgnoreEnd
+    }
+  }
+
   /**
    * Provides the implementations of the inherited abstract
    * methods.  The implementation uses PHP sessions to maintain
@@ -53,10 +103,8 @@ class sspmod_authfacebook_Facebook extends BaseFacebook
     }
 
     $session_var_name = $this->constructSessionVariableName($key);
-    if (isset($this->ssp_state[$session_var_name])) {
-      $value = $this->ssp_state[$session_var_name];
-    }
-    return isset($value) ? $value : $default;
+    return isset($this->ssp_state[$session_var_name]) ?
+      $this->ssp_state[$session_var_name] : $default;
   }
 
   protected function clearPersistentData($key) {
@@ -75,11 +123,27 @@ class sspmod_authfacebook_Facebook extends BaseFacebook
     foreach (self::$kSupportedKeys as $key) {
       $this->clearPersistentData($key);
     }
+    if ($this->sharedSessionID) {
+      $this->deleteSharedSessionCookie();
+    }
+  }
+
+  protected function deleteSharedSessionCookie() {
+    $cookie_name = $this->getSharedSessionCookieName();
+    unset($_COOKIE[$cookie_name]);
+    $base_domain = $this->getBaseDomain();
+    setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
+  }
+
+  protected function getSharedSessionCookieName() {
+    return self::FBSS_COOKIE_NAME . '_' . $this->getAppId();
   }
 
   protected function constructSessionVariableName($key) {
-    return 'authfacebook:authdata:' . implode('_', array('fb',
-                              $this->getAppId(),
-                              $key));
+    $parts = array('authfacebook:authdata:fb', $this->getAppId(), $key);
+    if ($this->sharedSessionID) {
+      array_unshift($parts, $this->sharedSessionID);
+    }
+    return implode('_', $parts);
   }
 }
diff --git a/inc/simplesamlphp/modules/authfacebook/www/linkback.php b/inc/simplesamlphp/modules/authfacebook/www/linkback.php
index 3a27fe5..879e3d2 100644
--- a/inc/simplesamlphp/modules/authfacebook/www/linkback.php
+++ b/inc/simplesamlphp/modules/authfacebook/www/linkback.php
@@ -9,6 +9,13 @@ if (!array_key_exists('AuthState', $_REQUEST) || empty($_REQUEST['AuthState']))
 }
 
 $stateID = $_REQUEST['AuthState'];
+
+// sanitize the input
+$sid = SimpleSAML_Utilities::parseStateID($stateID);
+if (!is_null($sid['url'])) {
+	SimpleSAML_Utilities::checkURLAllowed($sid['url']);
+}
+
 $state = SimpleSAML_Auth_State::loadState($stateID, sspmod_authfacebook_Auth_Source_Facebook::STAGE_INIT);
 
 /* Find authentication source. */
diff --git a/inc/simplesamlphp/modules/authlinkedin/lib/Auth/Source/LinkedIn.php b/inc/simplesamlphp/modules/authlinkedin/lib/Auth/Source/LinkedIn.php
index 228e02c..c62ce12 100644
--- a/inc/simplesamlphp/modules/authlinkedin/lib/Auth/Source/LinkedIn.php
+++ b/inc/simplesamlphp/modules/authlinkedin/lib/Auth/Source/LinkedIn.php
@@ -7,7 +7,6 @@ require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/oauth/lib
  *
  * @author Brook Schofield, TERENA.
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authlinkedin_Auth_Source_LinkedIn extends SimpleSAML_Auth_Source {
 
diff --git a/inc/simplesamlphp/modules/authlinkedin/www/linkback.php b/inc/simplesamlphp/modules/authlinkedin/www/linkback.php
index 961eaa6..e65a8aa 100644
--- a/inc/simplesamlphp/modules/authlinkedin/www/linkback.php
+++ b/inc/simplesamlphp/modules/authlinkedin/www/linkback.php
@@ -10,6 +10,12 @@ if (array_key_exists('stateid', $_REQUEST)) {
         throw new Exception('Lost OAuth Client State');
 }
 
+// sanitize the input
+$sid = SimpleSAML_Utilities::parseStateID($stateId);
+if (!is_null($sid['url'])) {
+	SimpleSAML_Utilities::checkURLAllowed($sid['url']);
+}
+
 $state = SimpleSAML_Auth_State::loadState($stateId, sspmod_authlinkedin_Auth_Source_LinkedIn::STAGE_INIT);
 
 // http://developer.linkedin.com/docs/DOC-1008#2_Redirect_the_User_to_our_Authorization_Server
diff --git a/inc/simplesamlphp/modules/authmyspace/lib/Auth/Source/MySpace.php b/inc/simplesamlphp/modules/authmyspace/lib/Auth/Source/MySpace.php
index 6304762..b651466 100644
--- a/inc/simplesamlphp/modules/authmyspace/lib/Auth/Source/MySpace.php
+++ b/inc/simplesamlphp/modules/authmyspace/lib/Auth/Source/MySpace.php
@@ -7,7 +7,6 @@ require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/oauth/lib
  *
  * @author Brook Schofield, TERENA.
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authmyspace_Auth_Source_MySpace extends SimpleSAML_Auth_Source {
 
diff --git a/inc/simplesamlphp/modules/authmyspace/www/linkback.php b/inc/simplesamlphp/modules/authmyspace/www/linkback.php
index 93c4515..4dbaf79 100644
--- a/inc/simplesamlphp/modules/authmyspace/www/linkback.php
+++ b/inc/simplesamlphp/modules/authmyspace/www/linkback.php
@@ -10,6 +10,12 @@ if (array_key_exists('stateid', $_REQUEST)) {
 	throw new Exception('State Lost - not returned by MySpace Auth');
 }
 
+// sanitize the input
+$sid = SimpleSAML_Utilities::parseStateID($stateId);
+if (!is_null($sid['url'])) {
+	SimpleSAML_Utilities::checkURLAllowed($sid['url']);
+}
+
 $state = SimpleSAML_Auth_State::loadState($stateId, sspmod_authmyspace_Auth_Source_MySpace::STAGE_INIT);
 
 if (array_key_exists('oauth_problem', $_REQUEST)) {
diff --git a/inc/simplesamlphp/modules/authorize/dictionaries/Authorize.translation.json b/inc/simplesamlphp/modules/authorize/dictionaries/Authorize.translation.json
index 3e6549a..1605ab6 100644
--- a/inc/simplesamlphp/modules/authorize/dictionaries/Authorize.translation.json
+++ b/inc/simplesamlphp/modules/authorize/dictionaries/Authorize.translation.json
@@ -17,14 +17,18 @@
 		"nl": "Geen toegang",
 		"zh-tw": "\u7981\u6b62\u5b58\u53d6",
 		"nn": "Ingen tilgang",
-		"pl": "Dost\u0119 zabroniony",
+		"pl": "Dost\u0119p zabroniony",
 		"et": "Juurdep\u00e4\u00e4s keelatud",
 		"he": "\u05d2\u05d9\u05e9\u05d4 \u05d0\u05e1\u05d5\u05e8\u05d4",
 		"ru": "\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d",
 		"zh": "\u7981\u6b62\u8bbf\u95ee",
 		"ar": "\u0645\u0645\u0646\u0648\u0639 \u0627\u0644\u062f\u062e\u0648\u0644",
+		"lv": "Pieeja liegta",
 		"id": "Dilarang mengakses",
-		"sr": "Pristup zabranjen"
+		"sr": "Pristup zabranjen",
+		"ro": "Accesul nu este permis",
+		"cs": "P\u0159\u00edstup odm\u00edtnut",
+		"eu": "Sarrera debekatua"
 	},
 	"403_text": {
 		"es": "No tiene los privilegios necesarios para acceder a esta aplicaci\u00f3n. Si considera que esto no es correcto, consulte el administrador.",
@@ -49,7 +53,11 @@
 		"ru": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.",
 		"zh": "\u4f60\u6ca1\u6709\u6743\u9650\u8bbf\u95ee\u8be5\u5e94\u7528\uff0c\u5982\u679c\u4f60\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u9519\u8bef\uff0c\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458",
 		"ar": "\u0644\u0627 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0647\u0630\u0627 \u0627\u0644\u062a\u0637\u0628\u064a\u0642. \u0642\u0645 \u0628\u0623\u062e\u0637\u0627\u0631 \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0646 \u0643\u0646\u062a \u062a\u0638\u0646 \u0627\u0646 \u0647\u0630\u0627 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d",
+		"lv": "Jums nav pietiekamu ties\u012bbu \u0161\u012bs aplik\u0101cijas izmanto\u0161anai. Vaic\u0101jiet administratoram.",
 		"id": "Anda tidak memiliki hak yang diperlukan untuk mengakses aplikasi ini. Silahkan menghubungi administrator jika seharusnya anda dapat mengakses aplikasi ini.",
-		"sr": "Nemate potrebna ovla\u0161\u0107enja za pristup ovoj aplikaciji. Molimo kontaktirajte administratora aplikacije ako smatrate da bi vam pristup aplikaciji trebao biti omogu\u0107en."
+		"sr": "Nemate potrebna ovla\u0161\u0107enja za pristup ovoj aplikaciji. Molimo kontaktirajte administratora aplikacije ako smatrate da bi vam pristup aplikaciji trebao biti omogu\u0107en.",
+		"ro": "Nu ave\u021bi drepturile necesare pentru a accesa\/folosi aceast\u0103 aplica\u021bie. V\u0103 rug\u0103m s\u0103 contacta\u021bi administratorul sistemului dac\u0103 considera\u021bi aceast\u0103 afirma\u021bie ca fiind incorect\u0103.",
+		"cs": "Nem\u00e1te dostate\u010dn\u00e1 pr\u00e1va pro p\u0159\u00edstup k t\u00e9to aplikaci. Pros\u00edm, kontaktujte administr\u00e1tora, pokud toto omezen\u00ed shled\u00e1v\u00e1te nespr\u00e1vn\u00e9.",
+		"eu": "Ez duzu beharrezko pribilegiorik aplikazio honetan sartzeko. Hau okerra dela baderitzozu, jar zaitez administratzailearekin harremanetan. "
 	}
 }
diff --git a/inc/simplesamlphp/modules/authorize/docs/authorize.txt b/inc/simplesamlphp/modules/authorize/docs/authorize.txt
index d8a0cc9..8d4730c 100644
--- a/inc/simplesamlphp/modules/authorize/docs/authorize.txt
+++ b/inc/simplesamlphp/modules/authorize/docs/authorize.txt
@@ -7,7 +7,6 @@ authorize Module
 	http://daringfireball.net/projects/markdown/syntax
 -->
 
-  * Version: `$Id$`
   * Author: Ernesto Revilla , Yaco Sistemas, Ryan Panning
   * Package: simpleSAMLphp
 
diff --git a/inc/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php b/inc/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php
index cd81556..b73ad37 100644
--- a/inc/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php
+++ b/inc/simplesamlphp/modules/authorize/lib/Auth/Process/Authorize.php
@@ -6,7 +6,6 @@
  *
  * @author Ernesto Revilla, Yaco Sistemas SL., Ryan Panning
  * @package simpleSAMLphp
- * @version $Id$
  */
 class sspmod_authorize_Auth_Process_Authorize extends SimpleSAML_Auth_ProcessingFilter {
 
@@ -129,7 +128,7 @@ class sspmod_authorize_Auth_Process_Authorize extends SimpleSAML_Auth_Processing
 			'authorize:Authorize');
 		$url = SimpleSAML_Module::getModuleURL(
 			'authorize/authorize_403.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 }
 
diff --git a/inc/simplesamlphp/modules/authorize/templates/authorize_403.php b/inc/simplesamlphp/modules/authorize/templates/authorize_403.php
index 6bb2e3b..fa947d7 100644
--- a/inc/simplesamlphp/modules/authorize/templates/authorize_403.php
+++ b/inc/simplesamlphp/modules/authorize/templates/authorize_403.php
@@ -7,7 +7,6 @@
  * - 'params': Parameters which should be included in the request.
  *
  * @package simpleSAMLphp
- * @version $Id$
  */
 
 
@@ -19,5 +18,12 @@ $this->includeAtTemplateBase('includes/header.php');
 

data['403_header']; ?>

data['403_text']; ?>

data['LogoutURL'])) { +?> +

t('{status:logout}'); ?>

+ +includeAtTemplateBase('includes/footer.php'); ?> diff --git a/inc/simplesamlphp/modules/authorize/www/authorize_403.php b/inc/simplesamlphp/modules/authorize/www/authorize_403.php index 60e0d9b..330b235 100644 --- a/inc/simplesamlphp/modules/authorize/www/authorize_403.php +++ b/inc/simplesamlphp/modules/authorize/www/authorize_403.php @@ -3,7 +3,6 @@ * Show a 403 Forbidden page about not authorized to access an application. * * @package simpleSAMLphp - * @version $Id$ */ if (!array_key_exists('StateId', $_REQUEST)) { @@ -11,10 +10,20 @@ if (!array_key_exists('StateId', $_REQUEST)) { } $id = $_REQUEST['StateId']; + +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($id); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($id, 'authorize:Authorize'); $globalConfig = SimpleSAML_Configuration::getInstance(); $t = new SimpleSAML_XHTML_Template($globalConfig, 'authorize:authorize_403.php'); +if (isset($state['Source']['auth'])) { + $t->data['LogoutURL'] = SimpleSAML_Module::getModuleURL('core/authenticate.php', array('as' => $state['Source']['auth']))."&logout"; +} header('HTTP/1.0 403 Forbidden'); $t->show(); diff --git a/inc/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php b/inc/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php index 7fc0e4f..c071066 100644 --- a/inc/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php +++ b/inc/simplesamlphp/modules/authtwitter/lib/Auth/Source/Twitter.php @@ -7,7 +7,6 @@ require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/oauth/lib * * @author Andreas Åkre Solberg, UNINETT AS. * @package simpleSAMLphp - * @version $Id: Twitter.php 2867 2011-07-05 12:08:29Z comel.ah $ */ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { @@ -23,6 +22,7 @@ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { private $key; private $secret; + private $force_login; /** @@ -38,18 +38,11 @@ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { /* Call the parent constructor first, as required by the interface. */ parent::__construct($info, $config); - if (!array_key_exists('key', $config)) - throw new Exception('Twitter authentication source is not properly configured: missing [key]'); - - $this->key = $config['key']; - - if (!array_key_exists('secret', $config)) - throw new Exception('Twitter authentication source is not properly configured: missing [secret]'); - - $this->secret = $config['secret']; - - // require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/extlibinc/facebook.php'); + $configObject = SimpleSAML_Configuration::loadFromArray($config, 'authsources[' . var_export($this->authId, TRUE) . ']'); + $this->key = $configObject->getString('key'); + $this->secret = $configObject->getString('secret'); + $this->force_login = $configObject->getBoolean('force_login', FALSE); } @@ -77,12 +70,29 @@ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); // Authorize the request token - $consumer->getAuthorizeRequest('https://api.twitter.com/oauth/authenticate', $requestToken); + $url = 'https://api.twitter.com/oauth/authenticate'; + if ($this->force_login) { + $url = SimpleSAML_Utilities::addURLparameter($url, array('force_login' => 'true')); + } + $consumer->getAuthorizeRequest($url, $requestToken); } public function finalStep(&$state) { $requestToken = $state['authtwitter:authdata:requestToken']; + $parameters = array(); + + if (!isset($_REQUEST['oauth_token'])) { + throw new SimpleSAML_Error_BadRequest("Missing oauth_token parameter."); + } + if ($requestToken->key !== (string)$_REQUEST['oauth_token']) { + throw new SimpleSAML_Error_BadRequest("Invalid oauth_token parameter."); + } + + if (!isset($_REQUEST['oauth_verifier'])) { + throw new SimpleSAML_Error_BadRequest("Missing oauth_verifier parameter."); + } + $parameters['oauth_verifier'] = (string)$_REQUEST['oauth_verifier']; $consumer = new sspmod_oauth_Consumer($this->key, $this->secret); @@ -90,11 +100,11 @@ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { $requestToken->key . "] with the secret [" . $requestToken->secret . "]"); // Replace the request token with an access token - $accessToken = $consumer->getAccessToken('https://api.twitter.com/oauth/access_token', $requestToken); + $accessToken = $consumer->getAccessToken('https://api.twitter.com/oauth/access_token', $requestToken, $parameters); SimpleSAML_Logger::debug("Got an access token from the OAuth service provider [" . $accessToken->key . "] with the secret [" . $accessToken->secret . "]"); - $userdata = $consumer->getUserInfo('https://api.twitter.com/account/verify_credentials.json', $accessToken); + $userdata = $consumer->getUserInfo('https://api.twitter.com/1.1/account/verify_credentials.json', $accessToken); if (!isset($userdata['id_str']) || !isset($userdata['screen_name'])) { throw new SimpleSAML_Error_AuthSource($this->authId, 'Authentication error: id_str and screen_name not set.'); @@ -114,5 +124,3 @@ class sspmod_authtwitter_Auth_Source_Twitter extends SimpleSAML_Auth_Source { } } - -?> \ No newline at end of file diff --git a/inc/simplesamlphp/modules/authtwitter/www/linkback.php b/inc/simplesamlphp/modules/authtwitter/www/linkback.php index de6ec85..9a397ed 100644 --- a/inc/simplesamlphp/modules/authtwitter/www/linkback.php +++ b/inc/simplesamlphp/modules/authtwitter/www/linkback.php @@ -9,6 +9,12 @@ if (!array_key_exists('AuthState', $_REQUEST) || empty($_REQUEST['AuthState'])) } $stateID = $_REQUEST['AuthState']; +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($stateID); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($stateID, sspmod_authtwitter_Auth_Source_Twitter::STAGE_INIT); /* Find authentication source. */ diff --git a/inc/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php b/inc/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php index 2dcd532..a54061e 100644 --- a/inc/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php +++ b/inc/simplesamlphp/modules/authwindowslive/lib/Auth/Source/LiveID.php @@ -5,7 +5,6 @@ * * @author Brook Schofield, TERENA. * @package simpleSAMLphp - * @version $Id$ */ class sspmod_authwindowslive_Auth_Source_LiveID extends SimpleSAML_Auth_Source { @@ -72,7 +71,7 @@ class sspmod_authwindowslive_Auth_Source_LiveID extends SimpleSAML_Auth_Source { . '&wrap_scope=WL_Profiles.View,Messenger.SignIn' ; - SimpleSAML_Utilities::redirect($authorizeURL); + SimpleSAML_Utilities::redirectTrustedURL($authorizeURL); } diff --git a/inc/simplesamlphp/modules/authwindowslive/www/linkback.php b/inc/simplesamlphp/modules/authwindowslive/www/linkback.php index 7ae4266..29b8b0d 100644 --- a/inc/simplesamlphp/modules/authwindowslive/www/linkback.php +++ b/inc/simplesamlphp/modules/authwindowslive/www/linkback.php @@ -6,6 +6,13 @@ if (array_key_exists('wrap_client_state', $_REQUEST)) { $stateId = $_REQUEST['wrap_client_state']; + + // sanitize the input + $sid = SimpleSAML_Utilities::parseStateID($stateId); + if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); + } + $state = SimpleSAML_Auth_State::loadState($stateId, sspmod_authwindowslive_Auth_Source_LiveID::STAGE_INIT); } else { throw new Exception('Lost OAuth-WRAP Client State'); diff --git a/inc/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php b/inc/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php index faa52d0..611fd85 100644 --- a/inc/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php +++ b/inc/simplesamlphp/modules/cas/lib/Auth/Source/CAS.php @@ -7,7 +7,6 @@ * * @author Danny Bollaert, UGent. * @package simpleSAMLphp - * @version $Id$ */ class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source { @@ -77,7 +76,7 @@ class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source { if(isset($this->_casConfig['login'])){ $this->_loginMethod = $this->_casConfig['login']; }else{ - throw new Exception("cas login url not specified"); + throw new Exception("cas login URL not specified"); } } @@ -206,7 +205,7 @@ class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source { $serviceUrl = SimpleSAML_Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID)); - SimpleSAML_Utilities::redirect($this->_loginMethod, array( + SimpleSAML_Utilities::redirectTrustedURL($this->_loginMethod, array( 'service' => $serviceUrl)); } @@ -230,7 +229,7 @@ class sspmod_cas_Auth_Source_CAS extends SimpleSAML_Auth_Source { SimpleSAML_Auth_State::deleteState($state); // we want cas to log us out - SimpleSAML_Utilities::redirect($logoutUrl, array()); + SimpleSAML_Utilities::redirectTrustedURL($logoutUrl); } } diff --git a/inc/simplesamlphp/modules/cas/www/linkback.php b/inc/simplesamlphp/modules/cas/www/linkback.php index 1e6740c..473c44b 100644 --- a/inc/simplesamlphp/modules/cas/www/linkback.php +++ b/inc/simplesamlphp/modules/cas/www/linkback.php @@ -13,6 +13,12 @@ if (!isset($_GET['ticket'])) { throw new SimpleSAML_Error_BadRequest('Missing ticket parameter.'); } +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($stateId); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($stateId, sspmod_cas_Auth_Source_CAS::STAGE_INIT); $state['cas:ticket'] = (string)$_GET['ticket']; diff --git a/inc/simplesamlphp/modules/casserver/config-templates/module_casserver.php b/inc/simplesamlphp/modules/casserver/config-templates/module_casserver.php index 007034f..0695bd5 100644 --- a/inc/simplesamlphp/modules/casserver/config-templates/module_casserver.php +++ b/inc/simplesamlphp/modules/casserver/config-templates/module_casserver.php @@ -1,8 +1,6 @@ $service, 'proxies' => array(), 'validbefore' => time() + 5)); -SimpleSAML_Utilities::redirect( +SimpleSAML_Utilities::redirectTrustedURL( SimpleSAML_Utilities::addURLparameter($service, array('ticket' => $ticket) ) ); - -?> diff --git a/inc/simplesamlphp/modules/cdc/lib/Auth/Process/CDC.php b/inc/simplesamlphp/modules/cdc/lib/Auth/Process/CDC.php index 16cf328..d0cfaa0 100644 --- a/inc/simplesamlphp/modules/cdc/lib/Auth/Process/CDC.php +++ b/inc/simplesamlphp/modules/cdc/lib/Auth/Process/CDC.php @@ -4,7 +4,6 @@ * Filter for setting the SAML 2 common domain cookie. * * @package simpleSAMLphp - * @version $Id$ */ class sspmod_cdc_Auth_Process_CDC extends SimpleSAML_Auth_ProcessingFilter { diff --git a/inc/simplesamlphp/modules/cdc/lib/Client.php b/inc/simplesamlphp/modules/cdc/lib/Client.php index 2e5043a..2800a0b 100644 --- a/inc/simplesamlphp/modules/cdc/lib/Client.php +++ b/inc/simplesamlphp/modules/cdc/lib/Client.php @@ -4,7 +4,6 @@ * CDC client class. * * @package simpleSAMLphp - * @version $Id$ */ class sspmod_cdc_Client { diff --git a/inc/simplesamlphp/modules/cdc/lib/Server.php b/inc/simplesamlphp/modules/cdc/lib/Server.php index dfc4f5a..2aa8850 100644 --- a/inc/simplesamlphp/modules/cdc/lib/Server.php +++ b/inc/simplesamlphp/modules/cdc/lib/Server.php @@ -4,7 +4,6 @@ * CDC server class. * * @package simpleSAMLphp - * @version $Id$ */ class sspmod_cdc_Server { @@ -116,6 +115,8 @@ class sspmod_cdc_Server { $domain = $request['domain']; $server = new sspmod_cdc_Server($domain); + $server->validate('CDCRequest'); + $server->handleRequest($request); } @@ -203,8 +204,14 @@ class sspmod_cdc_Server { * @return array The response. */ private function handleDelete(array $request) { + $params = array( + 'path' => '/', + 'domain' => '.' . $this->domain, + 'secure' => TRUE, + 'httponly' => FALSE, + ); - setcookie('_saml_idp', 'DELETE', time() - 86400 , '/', '.' . $this->domain, TRUE); + SimpleSAML_Utilities::setCookie('_saml_idp', NULL, $params, FALSE); return 'ok'; } @@ -319,7 +326,7 @@ class sspmod_cdc_Server { $url = SimpleSAML_Utilities::addURLparameter($to, $params); if (strlen($url) < 2048) { - SimpleSAML_Utilities::redirect($url); + SimpleSAML_Utilities::redirectTrustedURL($url); } else { SimpleSAML_Utilities::postRedirect($to, $params); } @@ -392,13 +399,15 @@ class sspmod_cdc_Server { $cookie = $tmp[1]; } - if ($this->cookieLifetime === 0) { - $expire = 0; - } else { - $expire = time() + $this->cookieLifetime; - } + $params = array( + 'lifetime' => $this->cookieLifetime, + 'path' => '/', + 'domain' => '.' . $this->domain, + 'secure' => TRUE, + 'httponly' => FALSE, + ); - setcookie('_saml_idp', $cookie, $expire, '/', '.' . $this->domain, TRUE); + SimpleSAML_Utilities::setCookie('_saml_idp', $cookie, $params, FALSE); } } diff --git a/inc/simplesamlphp/modules/cdc/www/resume.php b/inc/simplesamlphp/modules/cdc/www/resume.php index 6e4fcf3..8d7258d 100644 --- a/inc/simplesamlphp/modules/cdc/www/resume.php +++ b/inc/simplesamlphp/modules/cdc/www/resume.php @@ -17,6 +17,12 @@ if (!isset($response['id'])) { throw new SimpleSAML_Error_BadRequest('CDCResponse without id.'); } +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($response['id']); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($response['id'], 'cdc:resume'); SimpleSAML_Auth_ProcessingChain::resumeProcessing($state); diff --git a/inc/simplesamlphp/modules/consent/dictionaries/consent.definition.json b/inc/simplesamlphp/modules/consent/dictionaries/consent.definition.json index 073a463..d36f9e7 100644 --- a/inc/simplesamlphp/modules/consent/dictionaries/consent.definition.json +++ b/inc/simplesamlphp/modules/consent/dictionaries/consent.definition.json @@ -33,7 +33,7 @@ "en": "No consent given" }, "noconsent_text": { - "en": "You did not give consent for transfering your attributes to the service provider." + "en": "You did not give consent for transfering your attributes to SPNAME." }, "noconsent_return": { "en": "Return to consent page" @@ -61,5 +61,8 @@ }, "show_attribute": { "en": "Show content" + }, + "abort": { + "en": "Abort login to SPNAME" } } diff --git a/inc/simplesamlphp/modules/consent/dictionaries/consent.translation.json b/inc/simplesamlphp/modules/consent/dictionaries/consent.translation.json index 7efde04..9d5756d 100644 --- a/inc/simplesamlphp/modules/consent/dictionaries/consent.translation.json +++ b/inc/simplesamlphp/modules/consent/dictionaries/consent.translation.json @@ -5,7 +5,7 @@ "sv": "Ja", "es": "S\u00ed", "fr": "Oui", - "de": "Ja, ich stimmte zu", + "de": "Ja, ich stimme zu", "nl": "Ja, ik ga akkoord", "lb": "Jo", "sl": "Da, nadaljuj", @@ -27,8 +27,11 @@ "ru": "\u0414\u0430, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c", "zh": "\u662f\u7684\uff0c\u7ee7\u7eed", "ar": "\u0646\u0639\u0645\u060c \u0648\u0627\u0635\u0644", + "lv": "J\u0101, turpin\u0101t", "id": "Yam lanjutkan", - "sr": "Da, nastavi" + "sr": "Da, nastavi", + "ro": "Da, continu\u0103", + "eu": "Bai, jarraitu" }, "no": { "no": "Nei, avbryt", @@ -36,7 +39,7 @@ "sv": "Nej", "es": "No", "fr": "Non", - "de": "Nein, ich stimmte nicht zu", + "de": "Nein, ich stimme nicht zu", "nl": "Nee, ik weiger", "lb": "Nee", "sl": "Ne, prekli\u010di", @@ -58,8 +61,11 @@ "ru": "\u041d\u0435\u0442, \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c", "zh": "\u4e0d\uff0c\u53d6\u6d88", "ar": "\u0644\u0627\u060c \u0627\u0644\u063a", + "lv": "N\u0113, atcelt", "id": "Tidak, batalkan", - "sr": "Ne, odustani" + "sr": "Ne, odustani", + "ro": "Nu, renun\u021b", + "eu": "Ez, utzi" }, "remember": { "no": "Godta ogs\u00e5 for fremtiden", @@ -89,8 +95,11 @@ "ru": "\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c", "zh": "\u8bb0\u4f4f", "ar": "\u062a\u0630\u0643\u0631\u0623\u0644\u063a\u062a \u0630\u0643\u0631", + "lv": "Atcer\u0113ties", "id": "Ingat", - "sr": "Zapamti moj izbor" + "sr": "Zapamti moj izbor", + "ro": "\u021aine minte", + "eu": "Onespena gogoratu" }, "consent_accept": { "no": "For \u00e5 fullf\u00f8re innloggingen m\u00e5 du godta at opplysningene nedenfor sendes til SPNAME.", @@ -120,8 +129,11 @@ "ru": "SPNAME \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u043d\u0438\u0436\u0435, \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430.", "zh": "SPNAME\u8bf7\u6c42\u7684\u4fe1\u606f\u5df2\u7ecf\u88ab\u4f20\u8f93\u51fa\u53bb", "ar": "\u064a\u062d\u062a\u0627\u062c SPNAME \u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0623\u062f\u0646\u0627\u0647 ", + "lv": "SPNAME prasa p\u0101rraid\u012bt pa t\u012bklu zem\u0101k eso\u0161o inform\u0101ciju.", "id": "SPNAME mensyaratkan informasi dibawah ini harus ditransder.", - "sr": "Servis SPNAME zahteva slanje dole navedenih podataka." + "sr": "Servis SPNAME zahteva slanje dole navedenih podataka.", + "ro": "SPNAME solicit\u0103 trimiterea informa\u021biilor de mai jos.", + "eu": "Zerbitzuak, hemen agertzen den informazioa lekualdatzea eskatzen du." }, "login": { "no": "innlogging", @@ -148,11 +160,14 @@ "zh-tw": "\u767b\u5165", "et": "logi sisse", "he": "\u05db\u05e0\u05d9\u05e1\u05d4", - "ru": "\u0432\u043e\u0439\u0442\u0438", + "ru": "\u041b\u043e\u0433\u0438\u043d", "zh": "\u767b\u5f55", "ar": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644", + "lv": "piesl\u0113gties", "id": "login", - "sr": "prijavi se" + "sr": "prijavi se", + "ro": "autentificare", + "eu": "hasi saioa" }, "service_providers_for": { "no": "Tjenesteleverand\u00f8r for", @@ -182,8 +197,11 @@ "ru": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438 \u0443\u0441\u043b\u0443\u0433 \u0434\u043b\u044f", "zh": "\u670d\u52a1\u63d0\u4f9b\u8005\u7ed9", "ar": "\u0645\u0642\u062f\u0645\u064a \u062e\u062f\u0645\u0627\u062a \u0644", + "lv": "Servisa pieg\u0101d\u0101t\u0101ji priek\u0161", "id": "Service Provider untuk", - "sr": "Davaoci Servisa za" + "sr": "Davaoci Servisa za", + "ro": "Furnizor de servicii pentru", + "eu": "Zerbitzu hornitzaileak hontarako: " }, "service_provider_header": { "no": "Tjenesteleverand\u00f8r", @@ -213,8 +231,11 @@ "ru": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a \u0443\u0441\u043b\u0443\u0433", "zh": "\u670d\u52a1\u63d0\u4f9b\u8005", "ar": "\u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0627\u062a", + "lv": "Servisa pieg\u0101d\u0101t\u0101js", "id": "Service Provider", - "sr": "Davalac Servisa" + "sr": "Davalac Servisa", + "ro": "Furnizor de servicii", + "eu": "Zerbitzu hornitzailea" }, "status_header": { "no": "Samtykke-status", @@ -244,8 +265,11 @@ "ru": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441", "zh": "\u540c\u610f\u72b6\u6001", "ar": "\u062d\u0627\u0644\u0629 \u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Noteikumu statuss", "id": "Status persetujuan", - "sr": "Status odobrenja" + "sr": "Status odobrenja", + "ro": "Stare acord", + "eu": "Onespen egoera" }, "show_hide_attributes": { "no": "Vis\/skjul opplysninger", @@ -275,8 +299,11 @@ "ru": "\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\/\u0441\u043a\u0440\u044b\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b", "zh": "\u663e\u793a\/\u9690\u85cf\u5c5e\u6027", "ar": "\u0627\u0638\u0647\u0631\/\u0627\u0644\u063a\u064a \u0627\u0644\u0633\u0645\u0627\u062a", + "lv": "r\u0101d\u012bt\/sl\u0113pt atrib\u016btus", "id": "perlihatkan\/sembunyikan attribut", - "sr": "prika\u017ei\/sakrij atribute" + "sr": "prika\u017ei\/sakrij atribute", + "ro": "arat\u0103\/ascunde atributele", + "eu": "erakutsi\/gorde atributuak" }, "consent_privacypolicy": { "no": "Personvern for tjenesten", @@ -305,8 +332,11 @@ "ru": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0431\u044b", "zh": "\u8be5\u670d\u52a1\u7684\u9690\u79c1\u7b56\u7565", "ar": "\u0633\u064a\u0627\u0633\u0629 \u0627\u0644\u062e\u0635\u0648\u0635\u064a\u0629 \u0644\u0644\u062e\u062f\u0645\u0629", + "lv": "Servisa dro\u0161\u012bbas noteikumi", "id": "Kebijakan privasi untuk layanan", - "sr": "Politika za\u0161tite privatnosti kod servisa" + "sr": "Politika za\u0161tite privatnosti kod servisa", + "ro": "Politica de confiden\u021bialitate pentru serviciu", + "eu": "Zerbitzuarentzako pribatutasun-politika" }, "noconsent_title": { "no": "Ikke akseptert overf\u00f8ring av informasjon", @@ -335,12 +365,15 @@ "ru": "\u041d\u0435\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f", "zh": "\u672a\u540c\u610f", "ar": "\u0644\u0645 \u062a\u0639\u0637\u064a \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Nav noteikumu", "id": "Tidan ada persetujuan yang diberikan", - "sr": "Slanje podataka nije odobreno" + "sr": "Slanje podataka nije odobreno", + "ro": "Nu a fost dat acordul (consim\u021b\u0103m\u00e2ntul)", + "eu": "Ez da onespena eman" }, "noconsent_text": { - "no": "Du har ikke akseptert \u00e5 overlevere opplysninger til tjenesteleverand\u00f8ren.", - "nn": "Du har ikkje akseptert til at dine opplysningar kan sendast til tenesteleverand\u00f8ren", + "no": "Du har ikke akseptert \u00e5 overlevere opplysninger til SPNAME.", + "nn": "Du har ikkje akseptert til at dine opplysningar kan sendast til SPNAME.", "sv": "Du gav inte samtycke f\u00f6r att \u00f6verf\u00f6ra dina attribut till tj\u00e4nsteleverant\u00f6ren.", "es": "No ha dado su consentimiento para tranferir sus atributos al proveedor de servicio.", "de": "Sie haben der Weitergabe ihrer Daten an den Service Provider nicht zugestimmt.", @@ -362,15 +395,18 @@ "zh-tw": "\u60a8\u4e0d\u540c\u610f\u50b3\u8f38\u60a8\u7684\u5c6c\u6027\u81f3\u670d\u52d9\u63d0\u4f9b\u8005\u3002", "et": "Sa ei andnud n\u00f5usolekut sinu atribuutide teenusepakkujale edastamiseks.", "he": "\u05dc\u05d0 \u05e0\u05ea\u05e0\u05ea \u05d4\u05e1\u05db\u05de\u05d4 \u05dc\u05d4\u05e2\u05d1\u05e8\u05ea \u05d4\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd \u05dc\u05e1\u05e4\u05e7 \u05d4\u05e9\u05d9\u05e8\u05d5\u05ea.", - "ru": "\u0412\u044b \u043d\u0435 \u0434\u0430\u043b\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0432\u0430\u0448\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0443 \u0443\u0441\u043b\u0443\u0433.", + "ru": "\u0412\u044b \u043d\u0435 \u0434\u0430\u043b\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0432\u0430\u0448\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0443 \u0443\u0441\u043b\u0443\u0433.", "zh": "\u4f60\u6ca1\u6709\u540c\u610f\u4f20\u8f93\u4f60\u7684\u76f8\u5173\u5c5e\u6027\u7ed9\u670d\u52a1\u63d0\u4f9b\u8005", "ar": "\u0644\u0645 \u062a\u0648\u0627\u0641\u0642 \u0639\u0644\u064a \u062a\u062d\u0648\u064a\u0644 \u0633\u0645\u0627\u062a\u0643 \u0644\u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629", + "lv": "J\u016bs neesat devis at\u013cauju p\u0101rraid\u012bt inform\u0101ciju servisa pieg\u0101d\u0101t\u0101jam.", "id": "Anda tidak memberikan persetujuan untuk mentransfer atribut-atribute Anda ke service provider.", - "sr": "Niste odobrili da se va\u0161i podaci po\u0161alju davaocu servisa." + "sr": "Niste odobrili da se va\u0161i podaci po\u0161alju davaocu servisa.", + "ro": "Nu a\u021bi fost de acord s\u0103 trimite\u021bi atributele c\u0103tre SPNAME.", + "eu": "Ez duzu onespena eman zure atributuak zerbitzuari transferitzeko." }, "noconsent_return": { - "no": "G\u00e5 tilbake til aksept-siden med opplysninger", - "nn": "G\u00e5 tilbake til aksept-sida for overf\u00f8ring av opplysningar", + "no": "G\u00e5 tilbake til samtykkesiden", + "nn": "G\u00e5 tilbake til samtykkesida", "sv": "\u00c5ter till sidan f\u00f6r samtycke", "es": "Volver a la p\u00e1gina de consentimiento", "de": "Zur\u00fcck", @@ -394,8 +430,12 @@ "he": "\u05d7\u05d6\u05d5\u05e8 \u05dc\u05d3\u05e3 \u05d4\u05e1\u05db\u05de\u05d4", "zh": "\u8fd4\u56de\u540c\u610f\u754c\u9762", "ar": "\u0639\u062f \u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Atgriezties uz noteikumu lapu", "id": "Kembali ke halaman persetujuan", - "sr": "Povratak na stranicu za kreiranje pristanka" + "sr": "Povratak na stranicu za kreiranje pristanka", + "ro": "\u00centoarcere la pagina de consim\u021b\u0103m\u00e2nt", + "ru": "\u0412\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f", + "eu": "Itzuli onespen orrira" }, "consent_header": { "no": "Samtykke om overf\u00f8ring av personinformasjon", @@ -423,8 +463,12 @@ "pt-br": "Consentimento sobre a libera\u00e7\u00e3o de informa\u00e7\u00f5es pessoais", "zh": "\u540c\u610f\u5f00\u653e\u4e2a\u4eba\u4fe1\u606f", "ar": "\u0627\u0648\u0627\u0641\u0642 \u0639\u0644\u064a \u0646\u0634\u0631 \u0633\u0645\u0627\u062a\u064a \u0627\u0644\u0634\u062e\u0635\u064a\u0629", + "lv": "Noteikumi par person\u012bg\u0101s inform\u0101cijas nodo\u0161anu", "id": "Persetujuan tentang melepas informasi personal", - "sr": "Pristanak za slanje li\u010dnih podataka" + "sr": "Pristanak za slanje li\u010dnih podataka", + "ro": "Acordul pentru a furniza informa\u021bii personale", + "ru": "\u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445", + "eu": "Informazio pertsonala askatzeko onespena " }, "consent_attributes_header": { "no": "Opplysninger som vil bli sendt til SPNAME", @@ -451,8 +495,12 @@ "he": "\u05d4\u05de\u05d9\u05d3\u05e2 \u05d9\u05e9\u05dc\u05d7 \u05dc SPNAME", "zh": "\u4fe1\u606f\u5c06\u4f1a\u53d1\u9001\u7ed9SPNAME", "ar": "\u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u064a \u0633\u064a\u062a\u0645 \u0625\u0631\u0633\u0627\u0644\u0647\u0627 \u0644 SPNAME", + "lv": "Inform\u0101cija, kas tiks s\u016bt\u012bta SPNAME", "id": "Informasi yang akan dikirim ke SPNAME", - "sr": "Informacije koje \u0107e biti poslate servisu SPNAME" + "sr": "Informacije koje \u0107e biti poslate servisu SPNAME", + "ro": "Informa\u021bii care vor fi trimise la SPNAME", + "ru": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0432 SPNAME ", + "eu": "Zerbitzura bidaliko diren atributuak" }, "show_attributes": { "no": "Vis opplysninger", @@ -480,8 +528,12 @@ "pt-br": "Mostrar atributos", "zh": "\u663e\u793a\u5c5e\u6027", "ar": "\u0627\u0638\u0647\u0631 \u0627\u0644\u0633\u0645\u0627\u062a", + "lv": "R\u0101d\u012bt atrib\u016btus", "id": "Perlihatkan atribut-atribut", - "sr": "Prika\u017ei atribute" + "sr": "Prika\u017ei atribute", + "ro": "Arat\u0103 atributele", + "ru": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b", + "eu": "Erakutsi atributuak" }, "noconsent_goto_about": { "no": "G\u00e5 til informasjonsside om tjenesten", @@ -509,8 +561,12 @@ "pt-br": "Ir para a P\u00e1gina de Informa\u00e7\u00e3o do servi\u00e7o", "zh": "\u83b7\u53d6\u8be5\u670d\u52a1\u7684\u4fe1\u606f", "ar": "\u0627\u0630\u0647\u0628 \u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u062e\u062f\u0645\u0629", + "lv": "Iet uz servisa inform\u0101cijas lapu", "id": "Pergi ke halaman informasi untul layanan", - "sr": "Idi na stranicu sa informacijama o servisu" + "sr": "Idi na stranicu sa informacijama o servisu", + "ro": "Link la pagina serviciului", + "ru": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u043b\u0443\u0436\u0431\u0435", + "eu": "Joan zerbitzuaren informazio orrira" }, "consent_purpose": { "no": "Form\u00e5let med SPNAME er SPDESC", @@ -537,8 +593,12 @@ "he": "\u05d4\u05de\u05d8\u05e8\u05d4 \u05e9\u05dc SPNAME \u05d4\u05d9\u05d0 SPDESC", "zh": "SPNAME\u7684\u76ee\u7684\u662fSPDESC", "ar": "\u0627\u0644\u063a\u0631\u0636 \u0645\u0646 SPNAME \u0647\u0648 SPDESC", + "lv": "SPNAME nol\u016bks ir SPDESC", "id": "Tujuan dari SPNAME adalah SPDESC", - "sr": "Namena servisa SPNAME je SPDESC" + "sr": "Namena servisa SPNAME je SPDESC", + "ro": "Scopul SPNAME este SPDESC", + "ru": "\u0426\u0435\u043b\u044c SPNAME - SPDESC", + "eu": "Zerbtizuaren xedea SPDESC da" }, "table_caption": { "no": "Bruker innformasjon", @@ -564,8 +624,13 @@ "pt-br": "Informa\u00e7\u00f5es do Usu\u00e1rio", "zh": "\u7528\u6237\u4fe1\u606f", "ar": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645", + "lv": "Lietot\u0101ja inform\u0101cija", "id": "Informasi User", - "sr": "Informacije o korisniku" + "sr": "Informacije o korisniku", + "ro": "Informa\u021bii despre utilizator", + "ru": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435", + "cs": "U\u017eivatelsk\u00e9 informace", + "eu": "Erabiltzailearen informazioa" }, "table_summary": { "no": "Her listes den innformasjonen om deg som blir send til den tjenesten du er i ferd med \u00e5 logge p\u00e5", @@ -591,8 +656,13 @@ "pt-br": "Liste as informa\u00e7\u00f5es sobre voc\u00ea que est\u00e1 prestes a ser transmitida para o servi\u00e7o que voc\u00ea est\u00e1 acessando", "zh": "\u5f53\u4f60\u767b\u5f55\u65f6\u5c06\u8981\u4f20\u8f93\u7ed9\u670d\u52a1\u7684\u4fe1\u606f\u5217\u8868", "ar": "\u0642\u0627\u0626\u0645\u0629 \u0645\u0639\u0644\u0648\u0645\u0627\u062a\u0643 \u0627\u0644\u062a\u064a \u0633\u062a\u062d\u0648\u0644 \u0644\u0645\u0642\u062f\u0645 \u0627\u0644\u062e\u062f\u0645\u0629 \u0627\u0644\u0630\u064a \u062a\u0631\u063a\u0628 \u0628\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0627\u0644\u064a\u0647", + "lv": "Inform\u0101cija par Jums, kas tiks s\u016bt\u012bta servisam, kuram J\u016bs piesl\u0113dzaties", "id": "Daftar informasi tentang Anda yang akan dikirimkan ke service tujuan login Anda.", - "sr": "Prika\u017ei spisak podataka o vama koji \u0107e biti prosle\u0111eni servisu kome \u017eelite pristupiti" + "sr": "Prika\u017ei spisak podataka o vama koji \u0107e biti prosle\u0111eni servisu kome \u017eelite pristupiti", + "ro": "Afi\u0219eaz\u0103 informa\u021biile care vor fi trimise la serviciul unde dori\u021bi s\u0103 v\u0103 autentifica\u021bi", + "ru": "\u0412\u044b\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0441\u043b\u0443\u0436\u0431\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043f\u044b\u0442\u0430\u0435\u0442\u0435\u0441\u044c \u0432\u043e\u0439\u0442\u0438", + "cs": "Seznam informac\u00ed o v\u00e1s, kter\u00e9 budou p\u0159ed\u00e1ny slu\u017eb\u011b, ke kter\u00e9 se p\u0159ihla\u0161ujete", + "eu": "Zu identifikatuko zaren zerbitzura zure ze informazio bidaliko den erakusten du " }, "show_attribute": { "no": "Vis innhold", @@ -617,7 +687,31 @@ "pt-br": "Mostrar Conte\u00fado", "zh": "\u663e\u793a\u5185\u5bb9", "ar": "\u0627\u0638\u0647\u0631\u0627\u0644\u064a\u0647\u0627 \u0638\u0647\u0631 \u0627\u0644\u0645\u062d\u062a\u0648\u064a", + "lv": "R\u0101d\u012bt saturu", "id": "Perlihatkan konten", - "sr": "Prika\u017ei sadr\u017eaj" + "sr": "Prika\u017ei sadr\u017eaj", + "ro": "Arat\u0103 con\u021binutul", + "ru": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435", + "cs": "Zobrazit obsah", + "eu": "Erakutsi onespena" + }, + "abort": { + "no": "Avbryt innlogging til SPNAME", + "nn": "Avbryt innlogging til SPNAME", + "lt": "At\u0161aukti prisijungim\u0105 prie SPNAME", + "sr": "Prekini prijavu na SPNAME", + "it": "Login interrotto a SPNAME", + "fr": "Annuler la connexion au fournisseur de service SPNAME", + "de": "Anmeldung am Service Provider SPNAME abbrechen", + "et": "Katkesta sisselogimine: SPNAME", + "nl": "Inloggen op SPNAME afbreken", + "es": "Cancelar la identificaci\u00f3n en SPNAME", + "ro": "Anuleaz\u0103 cererea de autentificare la SPNAME", + "ar": "\u0625\u0644\u063a\u0627\u0621 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644SPNAME", + "ru": "\u041f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043d \u0432 SPNAME", + "cs": "Zru\u0161it p\u0159ihl\u00e1\u0161en\u00ed k SPNAME", + "hr": "Odustani od prijave u SPNAME", + "zh": "\u4e2d\u6b62\u767b\u5f55\u5230SPNAME", + "eu": "Bertan behera utzi zerbitzuan identifikazioa" } } diff --git a/inc/simplesamlphp/modules/consent/docs/consent.txt b/inc/simplesamlphp/modules/consent/docs/consent.txt index bd78b73..2151e96 100644 --- a/inc/simplesamlphp/modules/consent/docs/consent.txt +++ b/inc/simplesamlphp/modules/consent/docs/consent.txt @@ -35,7 +35,7 @@ consent module: touch modules/consent/enable -The simplest wayf to setup the consent module is to not use any storage at +The simplest way to setup the consent module is to not use any storage at all. This means that the user will always be asked to give consent each time the user logs in. @@ -66,7 +66,7 @@ Example: ### Using a database as storage ### -In order to use tha database backend storage, you first need to setup the +In order to use a database backend storage, you first need to setup the database. Here is the initialization SQL script: @@ -89,7 +89,7 @@ The `consent:Database` backend storage has the following options : Data Source Name must comply to the syntax for the PHP PDO layer. `username` -: Username for the database user to be used for the connectio. +: Username for the database user to be used for the connection. `password` : Password for the database user used for the connection. @@ -131,7 +131,7 @@ Options The following options can be used when configuring the Consent module -`ìncludeValues` +`includeValues` : Boolean value that indicate whether the values of the attributes should be used in calculating the unique hashes that identifies the consent. If includeValues is set and the value of an attribute changes, then the @@ -139,19 +139,19 @@ The following options can be used when configuring the Consent module `checked` : Boolean value that indicate whether the "Remember" consent checkbox is - checkd by default. This option is optional and defaults to FALSE. + checked by default. This option is optional and defaults to FALSE. `focus` -: Indicates whether the "Yes" or "No" button is in fucus by default. This +: Indicates whether the "Yes" or "No" button is in focus by default. This option is optional and can take the value 'yes' or 'no' as strings. If - omitted neither will recive focus. + omitted neither will receive focus. `store` : Configuration of the Consent storage backend. The store option is given in the format : and refers to the class sspmod__Consent_Store_. The consent module comes with two build in storages backends 'consnet:Cookie' and 'consent:Database'. See - seperate section on setting up consent using different storage methods. + separate section on setting up consent using different storage methods. This option is optional. If option is not set, then the user is asked to consent, but the consent is not saved. @@ -160,6 +160,9 @@ The following options can be used when configuring the Consent module the attributes that should have it value hidden. Default behaviour is that all attribute values are shown +`showNoConsentAboutService` +: Whether we will show a link to more information about the service from the + no consent page. Defaults to `TRUE`. External options ---------------- @@ -268,7 +271,7 @@ These values will be listed as an bullet list ) ) -This array hawe two child array. These will be listed in two separate sub +This array has two child arrays. These will be listed in two separate sub tables. Array ( diff --git a/inc/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php b/inc/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php index cf57ba3..ac0a4bd 100644 --- a/inc/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php +++ b/inc/simplesamlphp/modules/consent/lib/Auth/Process/Consent.php @@ -6,7 +6,6 @@ * released to the SP. * * @package simpleSAMLphp - * @version $Id$ */ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilter { @@ -52,6 +51,13 @@ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilt */ private $_noconsentattributes = array(); + /** + * Whether we should show the "about service"-link on the no consent page. + * + * @var bool + */ + private $_showNoConsentAboutService = true; + /** * Initialize consent filter * @@ -125,6 +131,14 @@ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilt ); } } + + if (array_key_exists('showNoConsentAboutService', $config)) { + if (!is_bool($config['showNoConsentAboutService'])) { + throw new SimpleSAML_Error_Exception('Consent: showNoConsentAboutService must be a boolean.'); + } + $this->_showNoConsentAboutService = $config['showNoConsentAboutService']; + } + } /** @@ -250,6 +264,7 @@ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilt $state['consent:checked'] = $this->_checked; $state['consent:hiddenAttributes'] = $this->_hiddenAttributes; $state['consent:noconsentattributes'] = $this->_noconsentattributes; + $state['consent:showNoConsentAboutService'] = $this->_showNoConsentAboutService; // User interaction nessesary. Throw exception on isPassive request if (isset($state['isPassive']) && $state['isPassive'] == true) { @@ -262,7 +277,7 @@ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilt // Save state and redirect $id = SimpleSAML_Auth_State::saveState($state, 'consent:request'); $url = SimpleSAML_Module::getModuleURL('consent/getconsent.php'); - SimpleSAML_Utilities::redirect($url, array('StateId' => $id)); + SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id)); } /** diff --git a/inc/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php b/inc/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php index d0e638e..265d36c 100644 --- a/inc/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php +++ b/inc/simplesamlphp/modules/consent/lib/Consent/Store/Cookie.php @@ -18,7 +18,6 @@ * * @author Olav Morken * @package simpleSAMLphp - * @version $Id$ */ class sspmod_consent_Consent_Store_Cookie extends sspmod_consent_Store { @@ -264,28 +263,23 @@ class sspmod_consent_Consent_Store_Cookie extends sspmod_consent_Store private function _setConsentCookie($name, $value) { assert('is_string($name)'); - assert('is_string($value)'); + assert('is_string($value) || is_null($value)'); - if ($value === null) { - $expire = 1; /* Delete by setting expiry in the past. */ - $value = ''; - } else { - $expire = time() + 90 * 24*60*60; - } + $globalConfig = SimpleSAML_Configuration::getInstance(); + $params = array( + 'lifetime' => (90*24*60*60), + 'path' => ('/' . $globalConfig->getBaseURL()), + 'httponly' => FALSE, + ); if (SimpleSAML_Utilities::isHTTPS()) { /* Enable secure cookie for https-requests. */ - $secure = true; + $params['secure'] = true; } else { - $secure = false; + $params['secure'] = false; } - $globalConfig = SimpleSAML_Configuration::getInstance(); - $path = '/' . $globalConfig->getBaseURL(); - - setcookie($name, $value, $expire, $path, null, $secure); + SimpleSAML_Utilities::setCookie($name, $value, $params, FALSE); } } - -?> diff --git a/inc/simplesamlphp/modules/consent/lib/Consent/Store/Database.php b/inc/simplesamlphp/modules/consent/lib/Consent/Store/Database.php index 3a9a887..daae61c 100644 --- a/inc/simplesamlphp/modules/consent/lib/Consent/Store/Database.php +++ b/inc/simplesamlphp/modules/consent/lib/Consent/Store/Database.php @@ -3,8 +3,8 @@ * Store consent in database. * * This class implements a consent store which stores the consent information - * in a database. It is tested, and should work against both MySQL and - * PostgreSQL. + * in a database. It is tested, and should work against MySQL, PostgreSQL and + * SQLite. * * It has the following options: * - dsn: The DSN which should be used to connect to the database server. See @@ -15,7 +15,6 @@ * * @author Olav Morken * @package simpleSAMLphp - * @version $Id$ */ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store { @@ -24,6 +23,11 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store */ private $_dsn; + /** + * The DATETIME SQL function to use + */ + private $_dateTime; + /** * Username for the database. */ @@ -64,23 +68,34 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store { parent::__construct($config); - foreach (array('dsn', 'username', 'password') as $id) { - if (!array_key_exists($id, $config)) { - throw new Exception( - 'consent:Database - Missing required option \'' . $id . '\'.' - ); - } - if (!is_string($config[$id])) { - throw new Exception( - 'consent:Database - \'' . $id . '\' is supposed to be a string.' - ); - } + if (!array_key_exists('dsn', $config)) { + throw new Exception('consent:Database - Missing required option \'dsn\'.'); + } + if (!is_string($config['dsn'])) { + throw new Exception('consent:Database - \'dsn\' is supposed to be a string.'); } $this->_dsn = $config['dsn']; - $this->_username = $config['username']; - $this->_password = $config['password']; + $this->_dateTime = (0 === strpos($this->_dsn, 'sqlite:')) ? 'DATETIME("NOW")' : 'NOW()'; + + if (array_key_exists('username', $config)) { + if(!is_string($config['username'])) { + throw new Exception('consent:Database - \'username\' is supposed to be a string.'); + } + $this->_username = $config['username']; + } else { + $this->_username = NULL; + } + + if (array_key_exists('password', $config)) { + if(!is_string($config['password'])) { + throw new Exception('consent:Database - \'password\' is supposed to be a string.'); + } + $this->_password = $config['password']; + } else { + $this->_password = NULL; + } if (array_key_exists('table', $config)) { if (!is_string($config['table'])) { @@ -112,6 +127,7 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store { return array( '_dsn', + '_dateTime', '_username', '_password', '_table', @@ -140,7 +156,7 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store $st = $this->_execute( 'UPDATE ' . $this->_table . ' ' . - 'SET usage_date = NOW() ' . + 'SET usage_date = ' . $this->_dateTime . ' ' . 'WHERE hashed_user_id = ? AND service_id = ? AND attribute = ?', array($userId, $destinationId, $attributeSet) ); @@ -181,7 +197,7 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store /* Check for old consent (with different attribute set). */ $st = $this->_execute( 'UPDATE ' . $this->_table . ' ' . - 'SET consent_date = NOW(), usage_date = NOW(), attribute = ? ' . + 'SET consent_date = ' . $this->_dateTime . ', usage_date = ' . $this->_dateTime . ', attribute = ? ' . 'WHERE hashed_user_id = ? AND service_id = ?', array($attributeSet, $userId, $destinationId) ); @@ -201,7 +217,7 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store 'INSERT INTO ' . $this->_table . ' (' . 'consent_date, usage_date, hashed_user_id, service_id, attribute' . ') ' . - 'VALUES (NOW(), NOW(), ?, ?, ?)', + 'VALUES (' . $this->_dateTime . ', ' . $this->_dateTime . ', ?, ?, ?)', array($userId, $destinationId, $attributeSet) ); @@ -494,4 +510,24 @@ class sspmod_consent_Consent_Store_Database extends sspmod_consent_Store return $error[0] . ' - ' . $error[2] . ' (' . $error[1] . ')'; } + + /** + * A quick selftest of the consent database. + * + * @return boolen TRUE if OK, FALSE if not. Will throw an exception on connection errors. + */ + public function selftest() + { + $st = $this->_execute( + 'SELECT * FROM ' . $this->_table . ' WHERE hashed_user_id = ? AND service_id = ? AND attribute = ?', + array('test', 'test', 'test') + ); + + if ($st === FALSE) { + /* Normally, the test will fail by an exception, so we won't reach this code. */ + return FALSE; + } + + return TRUE; + } } diff --git a/inc/simplesamlphp/modules/consent/lib/Logout.php b/inc/simplesamlphp/modules/consent/lib/Logout.php new file mode 100644 index 0000000..89fc8d4 --- /dev/null +++ b/inc/simplesamlphp/modules/consent/lib/Logout.php @@ -0,0 +1,15 @@ + * @author JAcob Christiansen - * @version $Id$ */ abstract class sspmod_consent_Store { diff --git a/inc/simplesamlphp/modules/consent/templates/consentform.php b/inc/simplesamlphp/modules/consent/templates/consentform.php index d08b203..59608f0 100644 --- a/inc/simplesamlphp/modules/consent/templates/consentform.php +++ b/inc/simplesamlphp/modules/consent/templates/consentform.php @@ -13,7 +13,6 @@ * - 'sppp': URL to the privacy policy of the destination, or FALSE. * * @package simpleSAMLphp - * @version $Id$ */ assert('is_array($this->data["srcMetadata"])'); assert('is_array($this->data["dstMetadata"])'); diff --git a/inc/simplesamlphp/modules/consent/templates/logout_completed.php b/inc/simplesamlphp/modules/consent/templates/logout_completed.php new file mode 100644 index 0000000..978931c --- /dev/null +++ b/inc/simplesamlphp/modules/consent/templates/logout_completed.php @@ -0,0 +1,9 @@ +data['header'] = $this->t('{logout:title}'); +$this->includeAtTemplateBase('includes/header.php'); + +echo('

' . $this->data['header'] . '

'); +echo('

' . $this->t('{logout:logged_out_text}') . '

'); + +$this->includeAtTemplateBase('includes/footer.php'); diff --git a/inc/simplesamlphp/modules/consent/templates/noconsent.php b/inc/simplesamlphp/modules/consent/templates/noconsent.php index 5d52fb3..f0bc375 100644 --- a/inc/simplesamlphp/modules/consent/templates/noconsent.php +++ b/inc/simplesamlphp/modules/consent/templates/noconsent.php @@ -1,9 +1,24 @@ data['dstMetadata'])) { + $dstName = $this->data['dstMetadata']['name']; +} elseif (array_key_exists('OrganizationDisplayName', $this->data['dstMetadata'])) { + $dstName = $this->data['dstMetadata']['OrganizationDisplayName']; +} else { + $dstName = $this->data['dstMetadata']['entityid']; +} +if (is_array($dstName)) { + $dstName = $this->t($dstName); +} +$dstName = htmlspecialchars($dstName); + + $this->data['header'] = $this->t('{consent:consent:noconsent_title}');; + $this->includeAtTemplateBase('includes/header.php'); echo '

' . $this->data['header'] . '

'; -echo '

' . $this->t('{consent:consent:noconsent_text}') . '

'; +echo '

' . $this->t('{consent:consent:noconsent_text}', array('SPNAME' => $dstName)) . '

'; if ($this->data['resumeFrom']) { echo('

'); @@ -17,4 +32,7 @@ if ($this->data['aboutService']) { echo('

'); } +echo('

' . $this->t('{consent:consent:abort}', array('SPNAME' => $dstName)) . '

'); + + $this->includeAtTemplateBase('includes/footer.php'); diff --git a/inc/simplesamlphp/modules/consent/www/getconsent.php b/inc/simplesamlphp/modules/consent/www/getconsent.php index 3628bd1..ef66031 100644 --- a/inc/simplesamlphp/modules/consent/www/getconsent.php +++ b/inc/simplesamlphp/modules/consent/www/getconsent.php @@ -6,7 +6,6 @@ * authorizes the release of attributes. * * @package simpleSAMLphp - * @version $Id$ */ /** * Explicit instruct consent page to send no-cache header to browsers to make @@ -31,6 +30,13 @@ if (!array_key_exists('StateId', $_REQUEST)) { } $id = $_REQUEST['StateId']; + +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($id); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($id, 'consent:request'); if (array_key_exists('core:SP', $state)) { diff --git a/inc/simplesamlphp/modules/consent/www/logout.php b/inc/simplesamlphp/modules/consent/www/logout.php new file mode 100644 index 0000000..4bd0938 --- /dev/null +++ b/inc/simplesamlphp/modules/consent/www/logout.php @@ -0,0 +1,25 @@ +handleLogoutRequest($state, NULL); +assert('FALSE'); diff --git a/inc/simplesamlphp/modules/consent/www/logout_completed.php b/inc/simplesamlphp/modules/consent/www/logout_completed.php new file mode 100644 index 0000000..e96fa11 --- /dev/null +++ b/inc/simplesamlphp/modules/consent/www/logout_completed.php @@ -0,0 +1,10 @@ +show(); diff --git a/inc/simplesamlphp/modules/consent/www/noconsent.php b/inc/simplesamlphp/modules/consent/www/noconsent.php index 85d2e67..4e847ce 100644 --- a/inc/simplesamlphp/modules/consent/www/noconsent.php +++ b/inc/simplesamlphp/modules/consent/www/noconsent.php @@ -3,7 +3,6 @@ * This is the page the user lands on when choosing "no" in the consent form. * * @package simpleSAMLphp - * @version $Id$ */ if (!array_key_exists('StateId', $_REQUEST)) { throw new SimpleSAML_Error_BadRequest( @@ -12,6 +11,13 @@ if (!array_key_exists('StateId', $_REQUEST)) { } $id = $_REQUEST['StateId']; + +// sanitize the input +$sid = SimpleSAML_Utilities::parseStateID($id); +if (!is_null($sid['url'])) { + SimpleSAML_Utilities::checkURLAllowed($sid['url']); +} + $state = SimpleSAML_Auth_State::loadState($id, 'consent:request'); $resumeFrom = SimpleSAML_Module::getModuleURL( @@ -19,9 +25,17 @@ $resumeFrom = SimpleSAML_Module::getModuleURL( array('StateId' => $id) ); +$logoutLink = SimpleSAML_Module::getModuleURL( + 'consent/logout.php', + array('StateId' => $id) +); + + $aboutService = null; -if (isset($state['Destination']['url.about'])) { - $aboutService = $state['Destination']['url.about']; +if (!isset($state['consent:showNoConsentAboutService']) || $state['consent:showNoConsentAboutService']) { + if (isset($state['Destination']['url.about'])) { + $aboutService = $state['Destination']['url.about']; + } } $statsInfo = array(); @@ -36,4 +50,5 @@ $t = new SimpleSAML_XHTML_Template($globalConfig, 'consent:noconsent.php'); $t->data['dstMetadata'] = $state['Destination']; $t->data['resumeFrom'] = $resumeFrom; $t->data['aboutService'] = $aboutService; +$t->data['logoutLink'] = $logoutLink; $t->show(); diff --git a/inc/simplesamlphp/modules/consentAdmin/config-templates/module_consentAdmin.php b/inc/simplesamlphp/modules/consentAdmin/config-templates/module_consentAdmin.php index 8ed4b75..72cdce9 100644 --- a/inc/simplesamlphp/modules/consentAdmin/config-templates/module_consentAdmin.php +++ b/inc/simplesamlphp/modules/consentAdmin/config-templates/module_consentAdmin.php @@ -4,7 +4,6 @@ * * @author Jacob Christiansen, * @package simpleSAMLphp - * @version $Id$ */ $config = array( /* @@ -26,7 +25,7 @@ $config = array( 'returnURL' => 'http://www.wayf.dk', // Shows description of the services if set to true (defaults to true) - 'showDesription' => true, + 'showDescription' => true, // Set authority 'authority' => 'saml2', diff --git a/inc/simplesamlphp/modules/consentAdmin/dictionaries/consentadmin.translation.json b/inc/simplesamlphp/modules/consentAdmin/dictionaries/consentadmin.translation.json index a1293d8..6d1c22f 100644 --- a/inc/simplesamlphp/modules/consentAdmin/dictionaries/consentadmin.translation.json +++ b/inc/simplesamlphp/modules/consentAdmin/dictionaries/consentadmin.translation.json @@ -20,8 +20,13 @@ "he": "(\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05e9\u05dd)", "zh": "\uff08\u6ca1\u6709\u6307\u5b9a\u540d\u5b57\uff09", "ar": "\u0627\u0644\u0627\u0633\u0645 \u063a\u064a\u0631 \u0645\u062d\u062f\u062f", + "lv": "(v\u0101rds nav nor\u0101d\u012bts)", "id": "(Nama tidak diisi)", - "sr": "(ime nije specificirano)" + "sr": "(ime nije specificirano)", + "ro": "(nu a fost specificat numele)", + "ru": "(\u0438\u043c\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e)", + "cs": "(jm\u00e9no nespecifikov\u00e1no)", + "eu": "(izena ez da zehaztu)" }, "sp_empty_description": { "da": "(ingen beskrivelse)", @@ -44,8 +49,13 @@ "he": "(\u05d0\u05d9\u05df \u05ea\u05d9\u05d0\u05d5\u05e8)", "zh": "\uff08\u6ca1\u6709\u63cf\u8ff0\uff09", "ar": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0648\u0635\u0641", + "lv": "(nav apraksta)", "id": "(Tidak ada penjelasan)", - "sr": "(nema opisa)" + "sr": "(nema opisa)", + "ro": "(f\u0103r\u0103 descriere)", + "ru": "(\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442)", + "cs": "(\u017e\u00e1dn\u00fd popis)", + "eu": "(deskribapenik gabe)" }, "attribute_org": { "da": "Organisation", @@ -68,8 +78,13 @@ "he": "\u05d0\u05d9\u05e8\u05d2\u05d5\u05df", "zh": "\u7ec4\u7ec7", "ar": "\u0627\u0644\u0645\u0646\u0638\u0645\u0629", + "lv": "Organiz\u0101cija", "id": "Organisasi", - "sr": "Institucija" + "sr": "Institucija", + "ro": "Institu\u021bie", + "ru": "\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f", + "cs": "Organizace", + "eu": "Erakundea" }, "added": { "da": "Samtykke givet", @@ -92,8 +107,13 @@ "he": "\u05d4\u05e1\u05db\u05de\u05d4 \u05d4\u05d5\u05e1\u05e4\u05d4", "zh": "\u5df2\u7ecf\u6dfb\u52a0\u7684\u8bb8\u53ef", "ar": "\u062a\u0645\u062a \u0627\u0636\u0627\u0641\u0629 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Pievienotie noteikumi", "id": "Consent telah ditambahkan", - "sr": "Dozvola dodata" + "sr": "Dozvola dodata", + "ro": "Acordul a fost ad\u0103ugat", + "ru": "\u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e", + "cs": "Ud\u011blen\u00e9 povolen\u00ed", + "eu": "Onespena gehitua" }, "removed": { "da": "Samtykke slettet", @@ -116,8 +136,13 @@ "he": "\u05d4\u05e1\u05db\u05de\u05d4 \u05d4\u05d5\u05e1\u05e8\u05d4", "zh": "\u5df2\u7ecf\u79fb\u9664\u7684\u8bb8\u53ef", "ar": "\u062a\u0645 \u062d\u0630\u0641 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "No\u0146emtie noteikumi", "id": "Consent telah dibuang", - "sr": "Dozvola uklonjena" + "sr": "Dozvola uklonjena", + "ro": "Acordul a fost \u00eenl\u0103turat", + "ru": "\u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043e", + "cs": "Odebran\u00e9 povolen\u00ed", + "eu": "Onespena ezabatua" }, "updated": { "da": "Samtykke Opdateret", @@ -140,8 +165,13 @@ "he": "\u05d4\u05e1\u05db\u05de\u05d4 \u05e2\u05d5\u05d3\u05db\u05e0\u05d4", "zh": "\u5df2\u7ecf\u66f4\u65b0\u7684\u8bb8\u53ef", "ar": "\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Uzlabotie noteikumi", "id": "Consent telah diupdate", - "sr": "Dozvola a\u017eurirana" + "sr": "Dozvola a\u017eurirana", + "ro": "Acordul a fost actualizat", + "ru": "\u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "cs": "Aktualizovan\u00e9 povolen\u00ed", + "eu": "Onespena eguneratua" }, "unknown": { "da": "Ukendt ...", @@ -164,8 +194,13 @@ "he": "\u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2...", "zh": "\u672a\u77e5...", "ar": "\u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641", + "lv": "Nezin\u0101ms ...", "id": "Tidak diketahui...", - "sr": "Nepoznato ..." + "sr": "Nepoznato ...", + "ro": "Necunoscut ...", + "ru": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e..", + "cs": "Nezn\u00e1m\u00fd ...", + "eu": "Ezezaguna..." }, "attribute_id": { "da": "Identitet", @@ -188,8 +223,13 @@ "he": "\u05d6\u05d4\u05d5\u05ea", "zh": "\u8eab\u4efd", "ar": "\u0627\u0644\u0647\u0648\u064a\u0629", + "lv": "Identit\u0101te", "id": "Identitas", - "sr": "Identitet" + "sr": "Identitet", + "ro": "Identitate", + "ru": "\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f", + "cs": "Identita", + "eu": "Identitatea" }, "attribute_injected": { "da": "Injiceret attribut", @@ -212,8 +252,13 @@ "he": "\u05de\u05d0\u05e4\u05d9\u05d9\u05df \u05de\u05d5\u05d6\u05e8\u05e7", "zh": "\u6ce8\u5165\u7684\u5c5e\u6027", "ar": "\u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u062a\u064a \u062a\u0645 \u062a\u0642\u062f\u064a\u0645\u0647\u0627", + "lv": "Ievietots atrib\u016bts", "id": "Attribut yang diinjeksi", - "sr": "Uba\u010deni atribut" + "sr": "Uba\u010deni atribut", + "ro": "Atribut introdus", + "ru": "\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442", + "cs": "Vlo\u017een\u00fd atribut", + "eu": "Atributua sartuta" }, "show": { "da": "Vis", @@ -236,8 +281,13 @@ "he": "\u05d4\u05e6\u05d2", "zh": "\u663e\u793a", "ar": "\u0627\u0638\u0647\u0627\u0631", + "lv": "Par\u0101d\u012bt", "id": "Perlihatkan", - "sr": "Prika\u017ei" + "sr": "Prika\u017ei", + "ro": "Arat\u0103", + "ru": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c", + "cs": "Zobrazit", + "eu": "Erakutsi" }, "hide": { "da": "Skjul", @@ -260,8 +310,13 @@ "he": "\u05d4\u05e1\u05ea\u05e8", "zh": "\u9690\u85cf", "ar": "\u0627\u062e\u0641\u0627\u0621", + "lv": "Sl\u0113pt", "id": "Sembunyikan", - "sr": "Sakrij" + "sr": "Sakrij", + "ro": "Ascunde", + "ru": "\u0421\u043a\u0440\u044b\u0442\u044c", + "cs": "Skr\u00fdt", + "eu": "Ezkutatu" }, "attributes_text": { "da": "attributter", @@ -284,8 +339,13 @@ "he": "\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd", "zh": "\u5c5e\u6027", "ar": "\u0627\u0644\u0633\u0645\u0627\u062a", + "lv": "atrib\u016bti", "id": "Attribute", - "sr": "atributi" + "sr": "atributi", + "ro": "atribute", + "ru": "\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b", + "cs": "atributy", + "eu": "Atributuak" }, "consentadmin_header": { "da": "Administrer dine samtykker", @@ -308,8 +368,13 @@ "he": "\u05de\u05e0\u05d4\u05dc \u05d4\u05e1\u05db\u05de\u05d5\u05ea\u05ea", "zh": "\u7ba1\u7406\u5458\u8bb8\u53ef", "ar": "\u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629", + "lv": "Noteikumu administrators", "id": "Administrasi Consent", - "sr": "Administracija dozvola" + "sr": "Administracija dozvola", + "ro": "Administrarea acordurilor (consim\u021b\u0103mintelor)", + "ru": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435\u043c", + "cs": "Administrace povolen\u00ed", + "eu": "Onespenaren kudeaketa" }, "consentadmin_description1": { "da": "WAYF videregiver kun oplysninger til eksterne tjenester, hvis du giver dit samtykke til det. Hvilke oplysninger det drejer sig om, varierer alt efter hvad tjenesteudbyderen har behov for. Det kan for eksempel v\u00e6re:

'; echo 'You were redirected to: '; - echo '' . htmlspecialchars($url) . ''; + echo '' . htmlspecialchars($url) . ''; echo ''; echo '