diff --git a/.travis.yml b/.travis.yml index d5d0be3ded2..3aedf7e4f26 100644 --- a/.travis.yml +++ b/.travis.yml @@ -75,7 +75,7 @@ script: - if [[ $DEFAULT = 1 && $TRAVIS_PHP_VERSION != 7.0 ]]; then vendor/bin/phpunit; fi - if [[ $PHPCS = 1 ]]; then composer cs-check; fi - - if [[ $PHPSTAN = 1 ]]; then composer require --dev phpstan/phpstan:^0.8 && vendor/bin/phpstan analyse -c phpstan.neon -l 1 src; fi + - if [[ $PHPSTAN = 1 ]]; then composer require --dev phpstan/phpstan:^0.8 && vendor/bin/phpstan analyse -c phpstan.neon -l 2 src; fi after_success: - if [[ $DEFAULT = 1 && $TRAVIS_PHP_VERSION = 7.0 ]]; then bash <(curl -s https://codecov.io/bash); fi diff --git a/README.md b/README.md index 5a988b64a55..5dc3663d57d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ recommend using the [app skeleton](https://github.com/cakephp/app) as a starting point. For existing applications you can run the following: ``` bash -$ composer require cakephp/cakephp:"~3.4" +$ composer require cakephp/cakephp:"~3.5" ``` ## Running Tests diff --git a/VERSION.txt b/VERSION.txt index c4b7365a0f1..a168d2e335e 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -16,4 +16,4 @@ // @license https://opensource.org/licenses/mit-license.php MIT License // +--------------------------------------------------------------------------------------------+ // //////////////////////////////////////////////////////////////////////////////////////////////////// -3.5.0 +3.5.1 diff --git a/config/cacert.pem b/config/cacert.pem index b4109e40a75..6e13c65fed1 100644 --- a/config/cacert.pem +++ b/config/cacert.pem @@ -1,44 +1,21 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016 -## -## The Equifax Secure CA was readded as there were replies to the issue -## that updated this certificate bundle. +## Certificate data from Mozilla as of: Wed Jun 7 03:12:05 2017 GMT ## ## 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://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## 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. ## -## Conversion done with mk-ca-bundle.pl version 1.25. -## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e +## Conversion done with mk-ca-bundle.pl version 1.27. +## SHA256: 93753268e1c596aee21893fb1c6975338389132f15c942ed65fc394a904371d7 ## -# -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -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----- GlobalSign Root CA @@ -275,27 +252,6 @@ 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----- @@ -652,28 +608,6 @@ 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----- - UTN USERFirst Hardware Root CA ============================== -----BEGIN CERTIFICATE----- @@ -754,41 +688,6 @@ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----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----- - XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- @@ -1321,33 +1220,6 @@ 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----- @@ -1365,30 +1237,6 @@ 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----- @@ -1433,46 +1281,6 @@ hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= -----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----- @@ -1598,58 +1406,6 @@ 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----- - -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----- @@ -1691,28 +1447,6 @@ 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----- @@ -1843,8 +1577,8 @@ A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- -NetLock Arany (Class Gold) Főtanúsítvány -============================================ +NetLock Arany (Class Gold) F?tan?s?tv?ny +======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 @@ -1899,58 +1633,6 @@ 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----- @@ -2383,8 +2065,8 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- -Certinomis - Autorité Racine -============================= +Certinomis - Autorit? Racine +============================ -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg @@ -2414,41 +2096,6 @@ 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----- - TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- @@ -3778,8 +3425,8 @@ kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- -TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 -========================================================= +T?RKTRUST Elektronik Sertifika Hizmet Sa?lay?c?s? H5 +==================================================== -----BEGIN CERTIFICATE----- MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp @@ -3802,30 +3449,6 @@ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= -----END CERTIFICATE----- -TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 -========================================================= ------BEGIN CERTIFICATE----- -MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 -MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL -BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf -aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm -aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a -2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED -wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb -HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV -+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT -9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R -fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy -o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW -hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 -O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== ------END CERTIFICATE----- - Certinomis - Root CA ==================== -----BEGIN CERTIFICATE----- @@ -3914,3 +3537,419 @@ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu a/GRspBl9JrmkO5K -----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +Certplus Root CA G1 +=================== +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV +BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe +Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD +ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN +r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx +Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj +BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv +LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 +z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc +4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd +4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj +jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ +ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY +lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG +YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ +2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F +6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX +CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe +tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC +VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ ++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ +qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +Certplus Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT +AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x +NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 +cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN +Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud +IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV +HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl +vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +OpenTrust Root CA G1 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx +MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa +Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 +ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO +YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 +xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO +9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq +3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi +n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 +URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr +TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px +N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv +uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK +n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh +X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 +nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm +GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ +bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o +4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA +OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx +-----END CERTIFICATE----- + +OpenTrust Root CA G2 +==================== +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy +MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM +CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ +Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz +4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV +eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt +UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz +3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj +3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz +9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 +0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT +y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 +M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI +mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG +S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp +EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ +6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr +gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo +SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 +YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm +u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK +-----END CERTIFICATE----- + +OpenTrust Root CA G3 +==================== +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X +DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w +ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B +ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf +BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM +BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta +3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +LuxTrust Global Root 2 +====================== +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG +A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh +bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW +MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm +Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2 +xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC +wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm +1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm +FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF +wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/ +a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U +ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ +MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB +/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5 +Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ +FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN +H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW +7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu +ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA +VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR +TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt +/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc +7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I +iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- diff --git a/phpstan.neon b/phpstan.neon index 85658cd7d12..459f9cf0b75 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -6,16 +6,24 @@ parameters: - '#Function xcache_[a-zA-Z0-9_]+ not found#' - '#Cake\\Database\\Type\\[a-zA-Z0-9_]+Type::__construct\(\) does not call parent constructor from Cake\\Database\\Type#' - '#Constructor of class Cake\\[a-zA-Z0-9_\\]+ has an unused parameter#' - - '#Call to an undefined method Cake\\Console\\Shell::main\(\)#' - '#Access to undefined constant Memcached::OPT_CLIENT_MODE#' - '#Access to undefined constant Memcached::DYNAMIC_CLIENT_MODE#' - '#Access to undefined constant PDO::SQLSRV_ATTR_ENCODING#' - '#Access to undefined constant PDO::SQLSRV_ENCODING_BINARY#' - - '#Access to an undefined property Cake\\Http\\Client\\Message::\$headers#' - - '#Access to an undefined property Cake\\[a-zA-Z0-9_\\]+::\$_validViewOptions#' - - '#Access to an undefined property Cake\\Database\\Driver::\$_connection#' - '#Constant XC_TYPE_VAR not found#' - '#Class PHPUnit_Runner_Version not found and could not be autoloaded#' + - '#Call to an undefined method Cake\\Auth\\Storage\\StorageInterface::getConfig\(\)#' + - '#Call to an undefined method Cake\\Auth\\Storage\\StorageInterface::setConfig\(\)#' + - '#Call to an undefined method Psr\\Http\\Message\\ResponseInterface::getCookies\(\)#' + - '#Access to an undefined property Psr\\Http\\Message\\UriInterface::\$webroot#' + - '#Access to an undefined property Psr\\Http\\Message\\UriInterface::\$base#' + - '#Call to an undefined method Cake\\Collection\\Iterator\\ZipIterator::getInnerIterator\(\)#' + - '#Call to an undefined method Cake\\ORM\\ResultSet::getInnerIterator\(\)#' + - '#Result of method Cake\\Http\\Response::send\(\) \(void\) is used#' + - '#Method Cake\\View\\Form\\ContextInterface::val\(\) invoked with 2 parameters, 1 required#' + - '#Access to an undefined property Exception::\$queryString#' + - '#Access to an undefined property PHPUnit\\Framework\\Test::\$fixtureManager#' + - '#Method Redis::#' earlyTerminatingMethodCalls: Cake\Shell\Shell: - abort diff --git a/src/Auth/BaseAuthenticate.php b/src/Auth/BaseAuthenticate.php index 43367a2dfa8..95e353bad54 100644 --- a/src/Auth/BaseAuthenticate.php +++ b/src/Auth/BaseAuthenticate.php @@ -107,6 +107,9 @@ protected function _findUser($username, $password = null) $result = $this->_query($username)->first(); if (empty($result)) { + $hasher = $this->passwordHasher(); + $hasher->hash((string)$password); + return false; } diff --git a/src/Auth/DigestAuthenticate.php b/src/Auth/DigestAuthenticate.php index 78cbbce2ef5..ff8437ff3cc 100644 --- a/src/Auth/DigestAuthenticate.php +++ b/src/Auth/DigestAuthenticate.php @@ -17,6 +17,7 @@ use Cake\Controller\ComponentRegistry; use Cake\Core\Configure; use Cake\Http\ServerRequest; +use Cake\Utility\Security; /** * Digest Authentication adapter for AuthComponent. @@ -121,7 +122,7 @@ public function getUser(ServerRequest $request) unset($user[$field]); $hash = $this->generateResponseHash($digest, $password, $request->getEnv('ORIGINAL_REQUEST_METHOD')); - if ($digest['response'] === $hash) { + if (hash_equals($hash, $digest['response'])) { return $user; } @@ -250,7 +251,7 @@ public function loginHeaders(ServerRequest $request) protected function generateNonce() { $expiryTime = microtime(true) + $this->getConfig('nonceLifetime'); - $signatureValue = md5($expiryTime . ':' . $this->getConfig('secret')); + $signatureValue = hash_hmac('sha256', $expiryTime . ':' . $this->getConfig('secret'), Security::getSalt()); $nonceValue = $expiryTime . ':' . $signatureValue; return base64_encode($nonceValue); @@ -276,7 +277,8 @@ protected function validNonce($nonce) if ($expires < microtime(true)) { return false; } + $check = hash_hmac('sha1', $expires . ':' . $this->getConfig('secret'), $this->getConfig('secret')); - return md5($expires . ':' . $this->getConfig('secret')) === $checksum; + return hash_equals($check, $checksum); } } diff --git a/src/Collection/CollectionInterface.php b/src/Collection/CollectionInterface.php index 5f87b84fb3b..08694ecc90d 100644 --- a/src/Collection/CollectionInterface.php +++ b/src/Collection/CollectionInterface.php @@ -1019,7 +1019,7 @@ public function isEmpty(); * losing any possible transformations. This is used mainly to remove empty * IteratorIterator wrappers that can only slowdown the iteration process. * - * @return \Iterator + * @return \Traversable */ public function unwrap(); diff --git a/src/Collection/CollectionTrait.php b/src/Collection/CollectionTrait.php index c93a76d2601..a0969337d93 100644 --- a/src/Collection/CollectionTrait.php +++ b/src/Collection/CollectionTrait.php @@ -335,7 +335,7 @@ public function sample($size = 10) */ public function take($size = 1, $from = 0) { - return new Collection(new LimitIterator($this->unwrap(), $from, $size)); + return new Collection(new LimitIterator($this, $from, $size)); } /** @@ -343,7 +343,7 @@ public function take($size = 1, $from = 0) */ public function skip($howMany) { - return new Collection(new LimitIterator($this->unwrap(), $howMany)); + return new Collection(new LimitIterator($this, $howMany)); } /** @@ -367,7 +367,8 @@ public function firstMatch(array $conditions) */ public function first() { - foreach ($this->take(1) as $result) { + $iterator = new LimitIterator($this, 0, 1); + foreach ($iterator as $result) { return $result; } } @@ -377,18 +378,25 @@ public function first() */ public function last() { - $iterator = $this->unwrap(); - $count = $iterator instanceof Countable ? - count($iterator) : - iterator_count($iterator); + $iterator = $this->optimizeUnwrap(); + if (is_array($iterator)) { + return array_pop($iterator); + } - if ($count === 0) { - return null; + if ($iterator instanceof Countable) { + $count = count($iterator); + if ($count === 0) { + return null; + } + $iterator = new LimitIterator($iterator, $count - 1, 1); } - foreach ($this->take(1, $count - 1) as $last) { - return $last; + $result = null; + foreach ($iterator as $result) { + // No-op } + + return $result; } /** @@ -716,7 +724,7 @@ public function unwrap() /** * Backwards compatible wrapper for unwrap() * - * @return \Iterator + * @return \Traversable * @deprecated */ // @codingStandardsIgnoreLine diff --git a/src/Console/Shell.php b/src/Console/Shell.php index a7ee9406949..d513038f7bd 100644 --- a/src/Console/Shell.php +++ b/src/Console/Shell.php @@ -32,6 +32,8 @@ * Base class for command-line utilities for automating programmer chores. * * Is the equivalent of Cake\Controller\Controller on the command line. + * + * @method int main() */ class Shell { diff --git a/src/Controller/Controller.php b/src/Controller/Controller.php index 214560cbddf..5556ea21968 100644 --- a/src/Controller/Controller.php +++ b/src/Controller/Controller.php @@ -621,7 +621,8 @@ public function render($view = null, $layout = null) } $this->View = $this->createView(); - $this->response->body($this->View->render($view, $layout)); + $contents = $this->View->render($view, $layout); + $this->response = $this->View->response->withStringBody($contents); return $this->response; } diff --git a/src/Core/StaticConfigTrait.php b/src/Core/StaticConfigTrait.php index b96d9b536e4..c278aaf0cf4 100644 --- a/src/Core/StaticConfigTrait.php +++ b/src/Core/StaticConfigTrait.php @@ -249,19 +249,52 @@ public static function parseDsn($dsn) throw new InvalidArgumentException('Only strings can be passed to parseDsn'); } - $pattern = '/^(?P[\w\\\\]+):\/\/((?P.*?)(:(?P.*?))?@)?' . - '((?P[.\w-\\\\]+)(:(?P\d+))?)?' . - '(?P\/[^?]*)?(\?(?P.*))?$/'; + $pattern = <<<'REGEXP' +{ + ^ + (?P<_scheme> + (?P[\w\\\\]+):// + ) + (?P<_username> + (?P.*?) + (?P<_password> + :(?P.*?) + )? + @ + )? + (?P<_host> + (?P[^?#/:@]+) + (?P<_port> + :(?P\d+) + )? + )? + (?P<_path> + (?P/[^?#]*) + )? + (?P<_query> + \?(?P[^#]*) + )? + (?P<_fragment> + \#(?P.*) + )? + $ +}x +REGEXP; + preg_match($pattern, $dsn, $parsed); if (!$parsed) { throw new InvalidArgumentException("The DSN string '{$dsn}' could not be parsed."); } + + $exists = []; foreach ($parsed as $k => $v) { if (is_int($k)) { unset($parsed[$k]); - } - if ($v === '') { + } elseif (strpos($k, '_') === 0) { + $exists[substr($k, 1)] = ($v !== ''); + unset($parsed[$k]); + } elseif ($v === '' && !$exists[$k]) { unset($parsed[$k]); } } @@ -285,15 +318,6 @@ public static function parseDsn($dsn) } } - if (isset($parsed['user'])) { - $parsed['username'] = $parsed['user']; - } - - if (isset($parsed['pass'])) { - $parsed['password'] = $parsed['pass']; - } - - unset($parsed['pass'], $parsed['user']); $parsed = $queryArgs + $parsed; if (empty($parsed['className'])) { diff --git a/src/Database/Connection.php b/src/Database/Connection.php index 1244a8b3e48..95c31c51489 100644 --- a/src/Database/Connection.php +++ b/src/Database/Connection.php @@ -25,6 +25,7 @@ use Cake\Database\Schema\CachedCollection; use Cake\Database\Schema\Collection as SchemaCollection; use Cake\Datasource\ConnectionInterface; +use Cake\Log\Log; /** * Represents a connection with a database server. @@ -120,6 +121,18 @@ public function __construct($config) } } + /** + * Destructor + * + * Disconnects the driver to release the connection. + */ + public function __destruct() + { + if ($this->_transactionStarted && class_exists('Cake\Log\Log')) { + Log::warning('The connection is going to be closed but there is an active transaction.'); + } + } + /** * {@inheritDoc} */ diff --git a/src/Database/Driver.php b/src/Database/Driver.php index 281842475f0..cb9b72459e3 100644 --- a/src/Database/Driver.php +++ b/src/Database/Driver.php @@ -19,7 +19,9 @@ /** * Represents a database driver containing all specificities for - * a database engine including its SQL dialect + * a database engine including its SQL dialect. + * + * @property \Cake\Datasource\ConnectionInterface $_connection */ abstract class Driver { @@ -86,7 +88,7 @@ abstract public function disconnect(); * If first argument is passed, * * @param null|\PDO $connection The connection object - * @return \Cake\Database\Connection + * @return \PDO */ abstract public function connection($connection = null); diff --git a/src/Database/Schema/MysqlSchema.php b/src/Database/Schema/MysqlSchema.php index 3355e60dc1c..04ca01dce30 100644 --- a/src/Database/Schema/MysqlSchema.php +++ b/src/Database/Schema/MysqlSchema.php @@ -22,6 +22,12 @@ */ class MysqlSchema extends BaseSchema { + /** + * The driver instance being used. + * + * @var \Cake\Database\Driver\Mysql + */ + protected $_driver; /** * {@inheritDoc} diff --git a/src/Database/Statement/StatementDecorator.php b/src/Database/Statement/StatementDecorator.php index a34b2ca1aef..ce98d316e8c 100644 --- a/src/Database/Statement/StatementDecorator.php +++ b/src/Database/Statement/StatementDecorator.php @@ -39,7 +39,7 @@ class StatementDecorator implements StatementInterface, Countable, IteratorAggre * Statement instance implementation, such as PDOStatement * or any other custom implementation. * - * @var \Cake\Database\StatementInterface + * @var \Cake\Database\StatementInterface|\PDOStatement */ protected $_statement; @@ -60,7 +60,7 @@ class StatementDecorator implements StatementInterface, Countable, IteratorAggre /** * Constructor * - * @param \Cake\Database\StatementInterface|null $statement Statement implementation such as PDOStatement + * @param \Cake\Database\StatementInterface|\PDOStatement|null $statement Statement implementation such as PDOStatement * @param \Cake\Database\Driver|null $driver Driver instance */ public function __construct($statement = null, $driver = null) @@ -318,7 +318,7 @@ public function lastInsertId($table = null, $column = null) /** * Returns the statement object that was decorated by this class. * - * @return \Cake\Database\StatementInterface + * @return \Cake\Database\StatementInterface|\PDOStatement */ public function getInnerStatement() { diff --git a/src/Datasource/ConnectionInterface.php b/src/Datasource/ConnectionInterface.php index 0bb2c525d53..44db87bffe8 100644 --- a/src/Datasource/ConnectionInterface.php +++ b/src/Datasource/ConnectionInterface.php @@ -20,6 +20,13 @@ * * @method object getLogger() Get the current logger instance * @method $this setLogger($logger) Set the current logger. + * @method bool supportsDynamicConstraints() + * @method \Cake\Database\Schema\Collection schemaCollection() + * @method \Cake\Database\Query newQuery() + * @method \Cake\Database\StatementInterface prepare($sql) + * @method \Cake\Database\StatementInterface execute($query, $params = [], array $types = []) + * @method string quote($value, $type = null) + * @method string|int lastInsertId($table = null, $column = null) */ interface ConnectionInterface { diff --git a/src/Datasource/EntityInterface.php b/src/Datasource/EntityInterface.php index 3b92847e961..e5a72b9cf33 100644 --- a/src/Datasource/EntityInterface.php +++ b/src/Datasource/EntityInterface.php @@ -37,6 +37,8 @@ * @method bool isAccessible($property) * @method $this setSource($source) * @method array getSource() + * @method array extractOriginal(array $properties) + * @method array extractOriginalChanged(array $properties) * * @property mixed $id Alias for commonly used primary key. */ diff --git a/src/Datasource/QueryInterface.php b/src/Datasource/QueryInterface.php index 119fea96503..3d4ec5f6ea3 100644 --- a/src/Datasource/QueryInterface.php +++ b/src/Datasource/QueryInterface.php @@ -18,7 +18,7 @@ /** * The basis for every query object * - * @package Cake\Datasource + * @method $this andWhere($conditions, $types = []) */ interface QueryInterface { diff --git a/src/Error/ExceptionRenderer.php b/src/Error/ExceptionRenderer.php index dfb51c5c052..08596d09df6 100644 --- a/src/Error/ExceptionRenderer.php +++ b/src/Error/ExceptionRenderer.php @@ -170,7 +170,7 @@ public function render() $message = $this->_message($exception, $code); $url = $this->controller->request->getRequestTarget(); - if (method_exists($exception, 'responseHeader')) { + if ($exception instanceof CakeException) { $this->controller->response->header($exception->responseHeader()); } $this->controller->response->statusCode($code); diff --git a/src/Error/Middleware/ErrorHandlerMiddleware.php b/src/Error/Middleware/ErrorHandlerMiddleware.php index f1cdcef4b83..eae164ec4a7 100644 --- a/src/Error/Middleware/ErrorHandlerMiddleware.php +++ b/src/Error/Middleware/ErrorHandlerMiddleware.php @@ -16,6 +16,7 @@ use Cake\Core\App; use Cake\Core\Configure; +use Cake\Core\Exception\Exception as CakeException; use Cake\Core\InstanceConfigTrait; use Cake\Error\ExceptionRenderer; use Cake\Log\Log; @@ -90,7 +91,7 @@ public function __invoke($request, $response, $next) { try { return $next($request, $response); - } catch (\Exception $e) { + } catch (Exception $e) { return $this->handleException($e, $request, $response); } } @@ -111,7 +112,7 @@ public function handleException($exception, $request, $response) $this->logException($request, $exception); return $res; - } catch (\Exception $e) { + } catch (Exception $e) { $this->logException($request, $e); $body = $response->getBody(); @@ -193,7 +194,7 @@ protected function getMessage($request, $exception) ); $debug = Configure::read('debug'); - if ($debug && method_exists($exception, 'getAttributes')) { + if ($debug && $exception instanceof CakeException) { $attributes = $exception->getAttributes(); if ($attributes) { $message .= "\nException Attributes: " . var_export($exception->getAttributes(), true); diff --git a/src/Form/Form.php b/src/Form/Form.php index 40c6c638547..18264a0bf89 100644 --- a/src/Form/Form.php +++ b/src/Form/Form.php @@ -158,6 +158,28 @@ public function errors() return $this->_errors; } + /** + * Set the errors in the form. + * + * ``` + * $errors = [ + * 'field_name' => ['rule_name' => 'message'] + * ]; + * + * $form->setErrors($errors); + * ``` + * + * @since 3.5.1 + * @param array $errors Errors list. + * @return $this + */ + public function setErrors(array $errors) + { + $this->_errors = $errors; + + return $this; + } + /** * Execute the form if it is valid. * diff --git a/src/Http/ActionDispatcher.php b/src/Http/ActionDispatcher.php index 9d0e8e37396..6a4a94aaafa 100644 --- a/src/Http/ActionDispatcher.php +++ b/src/Http/ActionDispatcher.php @@ -122,15 +122,16 @@ protected function _invoke(Controller $controller) } if (!$response && $controller->autoRender) { - $response = $controller->render(); - } elseif (!$response) { - $response = $controller->response; + $controller->render(); } $result = $controller->shutdownProcess(); if ($result instanceof Response) { return $result; } + if (!$response) { + $response = $controller->response; + } return $response; } diff --git a/src/Http/Client/Message.php b/src/Http/Client/Message.php index dc351a2a593..e6117028d49 100644 --- a/src/Http/Client/Message.php +++ b/src/Http/Client/Message.php @@ -18,6 +18,8 @@ * * Defines some common helper methods, constants * and properties. + * + * @property array $headers */ class Message { diff --git a/src/Http/Response.php b/src/Http/Response.php index a458f2d689e..f47489132e1 100644 --- a/src/Http/Response.php +++ b/src/Http/Response.php @@ -540,15 +540,15 @@ public function sendHeaders() */ protected function _setCookies() { - foreach ($this->_cookies as $name => $c) { + foreach ($this->_cookies as $cookie) { setcookie( - $name, - $c['value'], - $c['expire'], - $c['path'], - $c['domain'], - $c['secure'], - $c['httpOnly'] + $cookie->getName(), + $cookie->getValue(), + $cookie->getExpiresTimestamp(), + $cookie->getPath(), + $cookie->getDomain(), + $cookie->isSecure(), + $cookie->isHttpOnly() ); } } diff --git a/src/Http/ServerRequest.php b/src/Http/ServerRequest.php index 81877c633d1..be1be669a49 100644 --- a/src/Http/ServerRequest.php +++ b/src/Http/ServerRequest.php @@ -550,7 +550,8 @@ public function session(Session $session = null) public function clientIp() { if ($this->trustProxy && $this->getEnv('HTTP_X_FORWARDED_FOR')) { - $ipaddr = preg_replace('/(?:,.*)/', '', $this->getEnv('HTTP_X_FORWARDED_FOR')); + $addresses = explode(',', $this->getEnv('HTTP_X_FORWARDED_FOR')); + $ipaddr = end($addresses); } elseif ($this->trustProxy && $this->getEnv('HTTP_CLIENT_IP')) { $ipaddr = $this->getEnv('HTTP_CLIENT_IP'); } else { diff --git a/src/I18n/RelativeTimeFormatter.php b/src/I18n/RelativeTimeFormatter.php index 230ee06c30b..7cf103090a0 100644 --- a/src/I18n/RelativeTimeFormatter.php +++ b/src/I18n/RelativeTimeFormatter.php @@ -37,7 +37,7 @@ public function diffForHumans(ChronosInterface $date, ChronosInterface $other = { $isNow = $other === null; if ($isNow) { - $other = $date->now($date->tz); + $other = $date->now($date->getTimezone()); } $diffInterval = $date->diff($other); @@ -94,7 +94,7 @@ public function diffForHumans(ChronosInterface $date, ChronosInterface $other = public function timeAgoInWords(DatetimeInterface $time, array $options = []) { $options = $this->_options($options, FrozenTime::class); - if ($options['timezone']) { + if ($options['timezone'] && $time instanceof ChronosInterface) { $time = $time->timezone($options['timezone']); } @@ -284,7 +284,7 @@ protected function _diffData($futureTime, $pastTime, $backwards, $options) public function dateAgoInWords(DatetimeInterface $date, array $options = []) { $options = $this->_options($options, FrozenDate::class); - if ($options['timezone']) { + if ($options['timezone'] && $date instanceof ChronosInterface) { $date = $date->timezone($options['timezone']); } diff --git a/src/I18n/Translator.php b/src/I18n/Translator.php index 86c778b4a0e..b563909aacf 100644 --- a/src/I18n/Translator.php +++ b/src/I18n/Translator.php @@ -9,103 +9,20 @@ * * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://cakephp.org CakePHP(tm) Project - * - * This file contains sections from the Aura Project - * @license https://github.com/auraphp/Aura.Intl/blob/3.x/LICENSE - * - * The Aura Project for PHP. - * - * @package Aura.Intl - * @license https://opensource.org/licenses/bsd-license.php BSD */ namespace Cake\I18n; use Aura\Intl\FormatterInterface; use Aura\Intl\Package; -use Aura\Intl\TranslatorInterface; +use Aura\Intl\Translator as BaseTranslator; /** * Provides missing message behavior for CakePHP internal message formats. * * @internal */ -class Translator implements TranslatorInterface +class Translator extends BaseTranslator { - /** - * A fallback translator. - * - * @var \Aura\Intl\TranslatorInterface - */ - protected $fallback; - - /** - * The formatter to use when translating messages. - * - * @var \Aura\Intl\FormatterInterface - */ - protected $formatter; - - /** - * The locale being used for translations. - * - * @var string - */ - protected $locale; - - /** - * The Package containing keys and translations. - * - * @var \Aura\Intl\Package - */ - protected $package; - - /** - * Constructor - * - * @param string $locale The locale being used. - * @param \Aura\Intl\Package $package The Package containing keys and translations. - * @param \Aura\Intl\FormatterInterface $formatter A message formatter. - * @param \Aura\Intl\TranslatorInterface|null $fallback A fallback translator. - */ - public function __construct( - $locale, - Package $package, - FormatterInterface $formatter, - TranslatorInterface $fallback = null - ) { - $this->locale = $locale; - $this->package = $package; - $this->formatter = $formatter; - $this->fallback = $fallback; - } - - /** - * Gets the message translation by its key. - * - * @param string $key The message key. - * @return string|bool The message translation string, or false if not found. - */ - protected function getMessage($key) - { - $message = $this->package->getMessage($key); - if ($message) { - return $message; - } - - if ($this->fallback) { - // get the message from the fallback translator - $message = $this->fallback->getMessage($key); - if ($message) { - // speed optimization: retain locally - $this->package->addMessage($key, $message); - // done! - return $message; - } - } - - // no local message, no fallback - return false; - } /** * Translates the message formatting any placeholders @@ -187,14 +104,4 @@ protected function resolveContext($key, $message, array $vars) return $message['_context'][$context]; } - - /** - * An object of type Package - * - * @return \Aura\Intl\Package - */ - public function getPackage() - { - return $this->package; - } } diff --git a/src/Network/Session/CacheSession.php b/src/Network/Session/CacheSession.php index e9c6ad986e6..82b9877d0c1 100644 --- a/src/Network/Session/CacheSession.php +++ b/src/Network/Session/CacheSession.php @@ -77,8 +77,8 @@ public function close() /** * Method used to read from a cache session. * - * @param string $id The key of the value to read - * @return string The value of the key or empty if it does not exist + * @param string|int $id ID that uniquely identifies session in cache. + * @return string Session data or empty string if it does not exist. */ public function read($id) { @@ -94,8 +94,8 @@ public function read($id) /** * Helper function called on write for cache sessions. * - * @param int $id ID that uniquely identifies session in database - * @param mixed $data The value of the data to be saved. + * @param string|int $id ID that uniquely identifies session in cache. + * @param mixed $data The data to be saved. * @return bool True for successful write, false otherwise. */ public function write($id, $data) @@ -110,7 +110,7 @@ public function write($id, $data) /** * Method called on the destruction of a cache session. * - * @param int $id ID that uniquely identifies session in cache + * @param string|int $id ID that uniquely identifies session in cache. * @return bool Always true. */ public function destroy($id) diff --git a/src/Network/Session/DatabaseSession.php b/src/Network/Session/DatabaseSession.php index 147ccbc7ac8..0a329632e38 100644 --- a/src/Network/Session/DatabaseSession.php +++ b/src/Network/Session/DatabaseSession.php @@ -102,8 +102,8 @@ public function close() /** * Method used to read from a database session. * - * @param int|string $id The key of the value to read - * @return string The value of the key or empty if it does not exist + * @param string|int $id ID that uniquely identifies session in database. + * @return string Session data or empty string if it does not exist. */ public function read($id) { @@ -134,8 +134,8 @@ public function read($id) /** * Helper function called on write for database sessions. * - * @param int $id ID that uniquely identifies session in database - * @param mixed $data The value of the data to be saved. + * @param string|int $id ID that uniquely identifies session in database. + * @param mixed $data The data to be saved. * @return bool True for successful write, false otherwise. */ public function write($id, $data) @@ -154,7 +154,7 @@ public function write($id, $data) /** * Method called on the destruction of a database session. * - * @param int $id ID that uniquely identifies session in database + * @param string|int $id ID that uniquely identifies session in database. * @return bool True for successful delete, false otherwise. */ public function destroy($id) diff --git a/src/ORM/Association.php b/src/ORM/Association.php index 64df174aa50..15cdc77217a 100644 --- a/src/ORM/Association.php +++ b/src/ORM/Association.php @@ -947,7 +947,7 @@ public function attachTo(Query $query, array $options = []) * Conditionally adds a condition to the passed Query that will make it find * records where there is no match with this association. * - * @param \Cake\ORM\Query $query The query to modify + * @param \Cake\Datasource\QueryInterface $query The query to modify * @param array $options Options array containing the `negateMatch` key. * @return void */ diff --git a/src/ORM/Association/BelongsToMany.php b/src/ORM/Association/BelongsToMany.php index b514d2d15fe..6a9e07446ab 100644 --- a/src/ORM/Association/BelongsToMany.php +++ b/src/ORM/Association/BelongsToMany.php @@ -513,7 +513,7 @@ protected function _appendNotMatching($query, $options) ->andWhere(function ($exp) use ($subquery, $conds) { $identifiers = []; foreach (array_keys($conds) as $field) { - $identifiers = new IdentifierExpression($field); + $identifiers[] = new IdentifierExpression($field); } $identifiers = $subquery->newExpr()->add($identifiers)->setConjunction(','); $nullExp = clone $exp; diff --git a/src/ORM/Behavior/CounterCacheBehavior.php b/src/ORM/Behavior/CounterCacheBehavior.php index e4a62f5d075..dbb54c4d5dd 100644 --- a/src/ORM/Behavior/CounterCacheBehavior.php +++ b/src/ORM/Behavior/CounterCacheBehavior.php @@ -18,7 +18,6 @@ use Cake\Event\Event; use Cake\ORM\Association; use Cake\ORM\Behavior; -use Cake\ORM\Entity; /** * CounterCache behavior @@ -199,12 +198,12 @@ protected function _processAssociations(Event $event, EntityInterface $entity) * Updates counter cache for a single association * * @param \Cake\Event\Event $event Event instance. - * @param \Cake\ORM\Entity $entity Entity + * @param \Cake\Datasource\EntityInterface $entity Entity * @param \Cake\ORM\Association $assoc The association object * @param array $settings The settings for for counter cache for this association * @return void */ - protected function _processAssociation(Event $event, Entity $entity, Association $assoc, array $settings) + protected function _processAssociation(Event $event, EntityInterface $entity, Association $assoc, array $settings) { $foreignKeys = (array)$assoc->getForeignKey(); $primaryKeys = (array)$assoc->getBindingKey(); diff --git a/src/ORM/EagerLoader.php b/src/ORM/EagerLoader.php index d65848a9b15..37bf9fd566e 100644 --- a/src/ORM/EagerLoader.php +++ b/src/ORM/EagerLoader.php @@ -813,7 +813,7 @@ protected function _collectKeys($external, $query, $statement) * Helper function used to iterate a statement and extract the columns * defined in $collectKeys * - * @param \Cake\Database\StatementInterface $statement The statement to read from. + * @param \Cake\Database\Statement\BufferedStatement $statement The statement to read from. * @param array $collectKeys The keys to collect * @return array */ diff --git a/src/ORM/Marshaller.php b/src/ORM/Marshaller.php index 646aa86e158..e4a18943637 100644 --- a/src/ORM/Marshaller.php +++ b/src/ORM/Marshaller.php @@ -159,7 +159,7 @@ protected function _buildPropertyMap($data, $options) * * @param array $data The data to hydrate. * @param array $options List of options - * @return \Cake\ORM\Entity + * @return \Cake\Datasource\EntityInterface * @see \Cake\ORM\Table::newEntity() * @see \Cake\ORM\Entity::$_accessible */ @@ -169,7 +169,7 @@ public function one(array $data, array $options = []) $primaryKey = (array)$this->_table->getPrimaryKey(); $entityClass = $this->_table->getEntityClass(); - /* @var \Cake\ORM\Entity $entity */ + /* @var \Cake\Datasource\EntityInterface $entity */ $entity = new $entityClass(); $entity->setSource($this->_table->getRegistryAlias()); diff --git a/src/ORM/Table.php b/src/ORM/Table.php index ca891a23177..30395175e24 100644 --- a/src/ORM/Table.php +++ b/src/ORM/Table.php @@ -885,7 +885,7 @@ public function association($name) /** * Get the associations collection for this table. * - * @return \Cake\ORM\AssociationCollection The collection of association objects. + * @return \Cake\ORM\AssociationCollection|\Cake\ORM\Association[] The collection of association objects. */ public function associations() { diff --git a/src/Routing/Middleware/AssetMiddleware.php b/src/Routing/Middleware/AssetMiddleware.php index 4a2ef1a33c2..50f83960aa3 100644 --- a/src/Routing/Middleware/AssetMiddleware.php +++ b/src/Routing/Middleware/AssetMiddleware.php @@ -88,6 +88,10 @@ public function __invoke($request, $response, $next) return $next($request, $response); } + if (strpos($url, '/.') !== false) { + return $next($request, $response); + } + $assetFile = $this->_getAssetFile($url); if ($assetFile === null || !file_exists($assetFile)) { return $next($request, $response); diff --git a/src/TestSuite/ConsoleIntegrationTestCase.php b/src/TestSuite/ConsoleIntegrationTestCase.php index 39b9928ddaf..a7652e2dd73 100644 --- a/src/TestSuite/ConsoleIntegrationTestCase.php +++ b/src/TestSuite/ConsoleIntegrationTestCase.php @@ -138,6 +138,18 @@ public function assertExitCode($expected, $message = '') $this->assertSame($expected, $this->_exitCode, $message); } + /** + * Asserts that `stdout` is empty + * + * @param string $message The message to output when the assertion fails. + * @return void + */ + public function assertOutputEmpty($message = 'stdout was not empty') + { + $output = implode(PHP_EOL, $this->_out->messages()); + $this->assertSame('', $output, $message); + } + /** * Asserts `stdout` contains expected output * @@ -164,6 +176,23 @@ public function assertOutputRegExp($pattern, $message = '') $this->assertRegExp($pattern, $output, $message); } + /** + * Check that a row of cells exists in the output. + * + * @param array $row Row of cells to ensure exist in the output. + * @param string $message Failure message. + * @return void + */ + protected function assertOutputContainsRow(array $row, $message = '') + { + $row = array_map(function ($cell) { + return preg_quote($cell, '/'); + }, $row); + $cells = implode('\s+\|\s+', $row); + $pattern = '/' . $cells . '/'; + $this->assertOutputRegexp($pattern); + } + /** * Asserts `stderr` contains expected output * @@ -190,6 +219,18 @@ public function assertErrorRegExp($pattern, $message = '') $this->assertRegExp($pattern, $output, $message); } + /** + * Asserts that `stderr` is empty + * + * @param string $message The message to output when the assertion fails. + * @return void + */ + public function assertErrorEmpty($message = 'stderr was not empty') + { + $output = implode(PHP_EOL, $this->_err->messages()); + $this->assertSame('', $output, $message); + } + /** * Builds the appropriate command dispatcher * diff --git a/src/Utility/Hash.php b/src/Utility/Hash.php index 7ff1ec080a6..12712a05dd9 100644 --- a/src/Utility/Hash.php +++ b/src/Utility/Hash.php @@ -350,11 +350,6 @@ protected static function _simpleOp($op, $data, $path, $values = null) $count = count($path); $last = $count - 1; foreach ($path as $i => $key) { - if ((is_numeric($key) && (int)$key > 0 || $key === '0') && - strpos($key, '0') !== 0 - ) { - $key = (int)$key; - } if ($op === 'insert') { if ($i === $last) { $_list[$key] = $values; @@ -370,7 +365,9 @@ protected static function _simpleOp($op, $data, $path, $values = null) } } elseif ($op === 'remove') { if ($i === $last) { - unset($_list[$key]); + if (is_array($_list)) { + unset($_list[$key]); + } return $data; } @@ -419,7 +416,7 @@ public static function remove(array $data, $path) if ($match && is_array($v)) { if ($conditions) { if (static::_matches($v, $conditions)) { - if ($nextPath) { + if ($nextPath !== '') { $data[$k] = static::remove($v, $nextPath); } else { unset($data[$k]); @@ -431,7 +428,7 @@ public static function remove(array $data, $path) if (empty($data[$k])) { unset($data[$k]); } - } elseif ($match && empty($nextPath)) { + } elseif ($match && $nextPath === '') { unset($data[$k]); } } diff --git a/src/Utility/Xml.php b/src/Utility/Xml.php index dd198215e35..d300124e85b 100644 --- a/src/Utility/Xml.php +++ b/src/Utility/Xml.php @@ -107,7 +107,7 @@ public static function build($input, array $options = []) 'return' => 'simplexml', 'loadEntities' => false, 'readFile' => true, - 'parseHuge' => true, + 'parseHuge' => false, ]; $options += $defaults; @@ -328,8 +328,20 @@ protected static function _fromArray($dom, $node, &$data, $format) */ protected static function _createChild($data) { - $value = $dom = $key = $format = $node = null; - extract($data); + $data += [ + 'dom' => null, + 'node' => null, + 'key' => null, + 'value' => null, + 'format' => null, + ]; + + $value = $data['value']; + $dom = $data['dom']; + $key = $data['key']; + $format = $data['format']; + $node = $data['node']; + $childNS = $childValue = null; if (is_object($value) && method_exists($value, 'toArray') && is_callable([$value, 'toArray'])) { $value = call_user_func([$value, 'toArray']); diff --git a/src/View/Helper/HtmlHelper.php b/src/View/Helper/HtmlHelper.php index ba7937dc6d9..66dd992c4f3 100644 --- a/src/View/Helper/HtmlHelper.php +++ b/src/View/Helper/HtmlHelper.php @@ -826,7 +826,7 @@ protected function _prepareCrumbs($startText, $escape = true) * - `fullBase` If true the src attribute will get a full address for the image file. * - `plugin` False value will prevent parsing path as a plugin * - * @param string $path Path to the image file, relative to the app/webroot/img/ directory. + * @param string|array $path Path to the image file, relative to the app/webroot/img/ directory. * @param array $options Array of HTML attributes. See above for special options. * @return string completed img tag * @link https://book.cakephp.org/3.0/en/views/helpers/html.html#linking-to-images diff --git a/src/View/Helper/TextHelper.php b/src/View/Helper/TextHelper.php index a0411515721..724af2a2eab 100644 --- a/src/View/Helper/TextHelper.php +++ b/src/View/Helper/TextHelper.php @@ -16,6 +16,7 @@ use Cake\Core\App; use Cake\Core\Exception\Exception; +use Cake\Utility\Security; use Cake\View\Helper; use Cake\View\View; @@ -48,7 +49,7 @@ class TextHelper extends Helper ]; /** - * An array of md5sums and their contents. + * An array of hashes and their contents. * Used when inserting links into text. * * @var array @@ -167,7 +168,7 @@ protected function _insertPlaceHolder($matches) if (isset($matches['url_bare'])) { $match = $matches['url_bare']; } - $key = md5($match); + $key = hash_hmac('sha1', $match, Security::getSalt()); $this->_placeholders[$key] = [ 'content' => $match, 'envelope' => $envelope diff --git a/src/View/Helper/TimeHelper.php b/src/View/Helper/TimeHelper.php index 5dc8717486c..60b55a1603e 100644 --- a/src/View/Helper/TimeHelper.php +++ b/src/View/Helper/TimeHelper.php @@ -248,7 +248,7 @@ public function toRss($dateString, $timezone = null) * - `class` - The class name to use, defaults to `time-ago-in-words`. * - `title` - Defaults to the $dateTime input. * - * @param int|string|\DateTime $dateTime UNIX timestamp, strtotime() valid string or DateTime object + * @param int|string|\DateTime|\Cake\Chronos\ChronosInterface $dateTime UNIX timestamp, strtotime() valid string or DateTime object * @param array $options Default format if timestamp is used in $dateString * @return string Relative time string. * @see \Cake\I18n\Time::timeAgoInWords() diff --git a/src/View/Helper/UrlHelper.php b/src/View/Helper/UrlHelper.php index fd4a32af8eb..172c3e104ed 100644 --- a/src/View/Helper/UrlHelper.php +++ b/src/View/Helper/UrlHelper.php @@ -144,7 +144,7 @@ public function assetUrl($path, array $options = []) return $this->build($path, !empty($options['fullBase'])); } if (strpos($path, '://') !== false || preg_match('/^[a-z]+:/i', $path)) { - return $path; + return ltrim($this->build($path), '/'); } if (!array_key_exists('plugin', $options) || $options['plugin'] !== false) { list($plugin, $path) = $this->_View->pluginSplit($path, false); diff --git a/src/View/StringTemplate.php b/src/View/StringTemplate.php index a3c07f86cbd..1e42a71d6b2 100644 --- a/src/View/StringTemplate.php +++ b/src/View/StringTemplate.php @@ -315,6 +315,9 @@ protected function _formatAttribute($key, $value, $escape = true) } $truthy = [1, '1', true, 'true', $key]; $isMinimized = isset($this->_compactAttributes[$key]); + if (!preg_match('/\A(\w|[.-])+\z/', $key)) { + $key = h($key); + } if ($isMinimized && in_array($value, $truthy, true)) { return "$key=\"$key\""; } diff --git a/src/View/ViewVarsTrait.php b/src/View/ViewVarsTrait.php index 95d0050f5e2..a1602e02ac0 100644 --- a/src/View/ViewVarsTrait.php +++ b/src/View/ViewVarsTrait.php @@ -20,6 +20,8 @@ * * Once collected context data can be passed to another object. * This is done in Controller, TemplateTask and View for example. + * + * @property array $_validViewOptions */ trait ViewVarsTrait { diff --git a/tests/TestCase/Auth/DigestAuthenticateTest.php b/tests/TestCase/Auth/DigestAuthenticateTest.php index 69b90b0a579..c2368424a37 100644 --- a/tests/TestCase/Auth/DigestAuthenticateTest.php +++ b/tests/TestCase/Auth/DigestAuthenticateTest.php @@ -515,7 +515,7 @@ protected function generateNonce($secret = null, $expires = 300, $time = null) $secret = $secret ?: Configure::read('Security.salt'); $time = $time ?: microtime(true); $expiryTime = $time + $expires; - $signatureValue = md5($expiryTime . ':' . $secret); + $signatureValue = hash_hmac('sha1', $expiryTime . ':' . $secret, $secret); $nonceValue = $expiryTime . ':' . $signatureValue; return base64_encode($nonceValue); diff --git a/tests/TestCase/Collection/CollectionTest.php b/tests/TestCase/Collection/CollectionTest.php index 83e94207e6c..d971d5375f3 100644 --- a/tests/TestCase/Collection/CollectionTest.php +++ b/tests/TestCase/Collection/CollectionTest.php @@ -913,6 +913,29 @@ public function testSample($data) } } + /** + * Tests the sample() method with a traversable non-iterator + * + * @return void + */ + public function testSampleWithTraversableNonIterator() + { + $collection = new Collection($this->datePeriod('2017-01-01', '2017-01-07')); + $result = $collection->sample(3)->toList(); + $list = [ + '2017-01-01', + '2017-01-02', + '2017-01-03', + '2017-01-04', + '2017-01-05', + '2017-01-06', + ]; + $this->assertCount(3, $result); + foreach ($result as $date) { + $this->assertContains($date->format('Y-m-d'), $list); + } + } + /** * Test toArray method * @@ -1003,6 +1026,23 @@ public function testTake() $this->assertEquals([2 => 3, 3 => 4], $taken->toArray()); } + /** + * Tests the take() method with a traversable non-iterator + * + * @return void + */ + public function testTakeWithTraversableNonIterator() + { + $collection = new Collection($this->datePeriod('2017-01-01', '2017-01-07')); + $result = $collection->take(3, 1)->toList(); + $expected = [ + new \DateTime('2017-01-02'), + new \DateTime('2017-01-03'), + new \DateTime('2017-01-04'), + ]; + $this->assertEquals($expected, $result); + } + /** * Tests match * @@ -1912,6 +1952,36 @@ public function testSkip() $this->assertEquals([5], $collection->skip(4)->toList()); } + /** + * Tests the skip() method with a traversable non-iterator + * + * @return void + */ + public function testSkipWithTraversableNonIterator() + { + $collection = new Collection($this->datePeriod('2017-01-01', '2017-01-07')); + $result = $collection->skip(3)->toList(); + $expected = [ + new \DateTime('2017-01-04'), + new \DateTime('2017-01-05'), + new \DateTime('2017-01-06'), + ]; + $this->assertEquals($expected, $result); + } + + /** + * Tests the first() method with a traversable non-iterator + * + * @return void + */ + public function testFirstWithTraversableNonIterator() + { + $collection = new Collection($this->datePeriod('2017-01-01', '2017-01-07')); + $date = $collection->first(); + $this->assertInstanceOf('DateTime', $date); + $this->assertEquals('2017-01-01', $date->format('Y-m-d')); + } + /** * Tests the last() method * @@ -1933,12 +2003,59 @@ public function testLast() * * @return void */ - public function testLAstWithEmptyCollection() + public function testLastWithEmptyCollection() { $collection = new Collection([]); $this->assertNull($collection->last()); } + /** + * Tests the last() method with a countable object + * + * @return void + */ + public function testLastWithCountable() + { + $collection = new Collection(new ArrayObject([1, 2, 3])); + $this->assertEquals(3, $collection->last()); + } + + /** + * Tests the last() method with an empty countable object + * + * @return void + */ + public function testLastWithEmptyCountable() + { + $collection = new Collection(new ArrayObject([])); + $this->assertNull($collection->last()); + } + + /** + * Tests the last() method with a non-rewindable iterator + * + * @return void + */ + public function testLastWithNonRewindableIterator() + { + $iterator = new NoRewindIterator(new ArrayIterator([1, 2, 3])); + $collection = new Collection($iterator); + $this->assertEquals(3, $collection->last()); + } + + /** + * Tests the last() method with a traversable non-iterator + * + * @return void + */ + public function testLastWithTraversableNonIterator() + { + $collection = new Collection($this->datePeriod('2017-01-01', '2017-01-07')); + $date = $collection->last(); + $this->assertInstanceOf('DateTime', $date); + $this->assertEquals('2017-01-06', $date->format('Y-m-d')); + } + /** * Tests sumOf with no parameters * @@ -2383,4 +2500,16 @@ protected function yieldItems(array $items) yield $k => $v; } } + + /** + * Create a DatePeriod object. + * + * @param string $start Start date + * @param string $end End date + * @return \DatePeriod + */ + protected function datePeriod($start, $end) + { + return new \DatePeriod(new \DateTime($start), new \DateInterval('P1D'), new \DateTime($end)); + } } diff --git a/tests/TestCase/Controller/ControllerTest.php b/tests/TestCase/Controller/ControllerTest.php index d8860e18f18..12a3c84d8a1 100644 --- a/tests/TestCase/Controller/ControllerTest.php +++ b/tests/TestCase/Controller/ControllerTest.php @@ -403,6 +403,25 @@ public function testRender() $this->assertRegExp('/this is the test element/', (string)$result); } + /** + * test view rendering changing response + * + * @return void + */ + public function testRenderViewChangesResponse() + { + $request = new ServerRequest('controller_posts/index'); + $request->params['action'] = 'header'; + + $controller = new Controller($request, new Response()); + $controller->viewBuilder()->templatePath('Posts'); + + $result = $controller->render('header'); + $this->assertContains('header template', (string)$result); + $this->assertTrue($controller->response->hasHeader('X-view-template')); + $this->assertSame('yes', $controller->response->getHeaderLine('X-view-template')); + } + /** * test that a component beforeRender can change the controller view class. * diff --git a/tests/TestCase/Core/StaticConfigTraitTest.php b/tests/TestCase/Core/StaticConfigTraitTest.php index 33249635f2e..6340b6afc12 100644 --- a/tests/TestCase/Core/StaticConfigTraitTest.php +++ b/tests/TestCase/Core/StaticConfigTraitTest.php @@ -196,7 +196,7 @@ public function testParseDsnQuerystring() ]; $this->assertEquals($expected, TestEmailStaticConfig::parseDsn($dsn)); - $dsn = 'mail://user:secret@localhost:25?timeout=30&client=null&tls=null'; + $dsn = 'mail://user:secret@localhost:25?timeout=30&client=null&tls=null#fragment'; $expected = [ 'className' => 'Cake\Mailer\Transport\MailTransport', 'client' => null, @@ -207,6 +207,7 @@ public function testParseDsnQuerystring() 'timeout' => '30', 'tls' => null, 'username' => 'user', + 'fragment' => 'fragment', ]; $this->assertEquals($expected, TestEmailStaticConfig::parseDsn($dsn)); diff --git a/tests/TestCase/Database/ConnectionTest.php b/tests/TestCase/Database/ConnectionTest.php index 149017e67ea..b4e76bdd737 100644 --- a/tests/TestCase/Database/ConnectionTest.php +++ b/tests/TestCase/Database/ConnectionTest.php @@ -20,6 +20,7 @@ use Cake\Database\Log\LoggingStatement; use Cake\Database\Log\QueryLogger; use Cake\Datasource\ConnectionManager; +use Cake\Log\Log; use Cake\TestSuite\TestCase; use ReflectionMethod; @@ -54,6 +55,7 @@ public function setUp() public function tearDown() { + Log::reset(); $this->connection->useSavePoints(false); unset($this->connection); parent::tearDown(); @@ -489,6 +491,30 @@ public function testSimpleTransactions() $this->assertCount(1, $result); } + /** + * Tests that the destructor of Connection generates a warning log + * when transaction is not closed + * + * @return void + */ + public function testDestructorWithUncommittedTransaction() + { + $driver = $this->getMockFormDriver(); + $connection = new Connection(['driver' => $driver]); + $connection->begin(); + $this->assertTrue($connection->inTransaction()); + + $logger = $this->createMock('Psr\Log\AbstractLogger'); + $logger->expects($this->once()) + ->method('log') + ->with('warning', $this->stringContains('The connection is going to be closed')); + + Log::setConfig('error', $logger); + + // Destroy the connection + unset($connection); + } + /** * Tests that it is possible to use virtualized nested transaction * with early rollback algorithm diff --git a/tests/TestCase/Datasource/ConnectionManagerTest.php b/tests/TestCase/Datasource/ConnectionManagerTest.php index 440bc3d017d..4ce0c875a03 100644 --- a/tests/TestCase/Datasource/ConnectionManagerTest.php +++ b/tests/TestCase/Datasource/ConnectionManagerTest.php @@ -306,6 +306,31 @@ public function dsnProvider() 'log' => '1' ] ], + 'no password' => [ + 'mysql://user@localhost:3306/database', + [ + 'className' => 'Cake\Database\Connection', + 'driver' => 'Cake\Database\Driver\Mysql', + 'host' => 'localhost', + 'database' => 'database', + 'port' => 3306, + 'scheme' => 'mysql', + 'username' => 'user', + ] + ], + 'empty password' => [ + 'mysql://user:@localhost:3306/database', + [ + 'className' => 'Cake\Database\Connection', + 'driver' => 'Cake\Database\Driver\Mysql', + 'host' => 'localhost', + 'database' => 'database', + 'port' => 3306, + 'scheme' => 'mysql', + 'username' => 'user', + 'password' => '', + ] + ], 'sqlite memory' => [ 'sqlite:///:memory:', [ @@ -346,6 +371,18 @@ public function dsnProvider() 'username' => 'sa', ] ], + 'sqllocaldb' => [ + 'sqlserver://username:password@(localdb)\.\DeptSharedLocalDB/database', + [ + 'className' => 'Cake\Database\Connection', + 'driver' => 'Cake\Database\Driver\Sqlserver', + 'host' => '(localdb)\.\DeptSharedLocalDB', + 'password' => 'password', + 'database' => 'database', + 'scheme' => 'sqlserver', + 'username' => 'username', + ] + ], 'classname query arg' => [ 'mysql://localhost/database?className=Custom\Driver', [ @@ -379,13 +416,13 @@ public function dsnProvider() ] ], 'complex password' => [ - 'mysql://user:pas#][{}$%20@!@localhost:3306/database?log=1"eIdentifiers=1', + 'mysql://user:/?#][{}$%20@!@localhost:3306/database?log=1"eIdentifiers=1', [ 'className' => 'Cake\Database\Connection', 'database' => 'database', 'driver' => 'Cake\Database\Driver\Mysql', 'host' => 'localhost', - 'password' => 'pas#][{}$%20@!', + 'password' => '/?#][{}$%20@!', 'port' => 3306, 'scheme' => 'mysql', 'username' => 'user', diff --git a/tests/TestCase/Form/FormTest.php b/tests/TestCase/Form/FormTest.php index be30c8a33c3..c6b4421c175 100644 --- a/tests/TestCase/Form/FormTest.php +++ b/tests/TestCase/Form/FormTest.php @@ -115,6 +115,22 @@ public function testErrors() $this->assertEquals('Must be so long', $errors['body']['length']); } + /** + * Test setErrors() + * + * @return void + */ + public function testSetErrors() + { + $form = new Form(); + $expected = [ + 'field_name' => ['rule_name' => 'message'] + ]; + + $form->setErrors($expected); + $this->assertSame($expected, $form->errors()); + } + /** * Test _execute is skipped on validation failure. * diff --git a/tests/TestCase/Http/ResponseTest.php b/tests/TestCase/Http/ResponseTest.php index 635652d3061..b86c1f616af 100644 --- a/tests/TestCase/Http/ResponseTest.php +++ b/tests/TestCase/Http/ResponseTest.php @@ -339,29 +339,34 @@ public function testHeader() public function testSend() { $response = $this->getMockBuilder('Cake\Http\Response') - ->setMethods(['_sendHeader', '_sendContent', '_setCookies']) + ->setMethods(['_sendHeader', '_sendContent']) ->getMock(); $response->header([ 'Content-Language' => 'es', 'WWW-Authenticate' => 'Negotiate', 'Access-Control-Allow-Origin' => ['domain1', 'domain2'], ]); + $response->cookie(['name' => 'thing', 'value' => 'value']); $response->body('the response body'); + $response->expects($this->once())->method('_sendContent')->with('the response body'); - $response->expects($this->at(0))->method('_setCookies'); - $response->expects($this->at(1)) + $response->expects($this->at(0)) ->method('_sendHeader')->with('HTTP/1.1 200 OK'); - $response->expects($this->at(2)) + $response->expects($this->at(1)) ->method('_sendHeader')->with('Content-Type', 'text/html; charset=UTF-8'); - $response->expects($this->at(3)) + $response->expects($this->at(2)) ->method('_sendHeader')->with('Content-Language', 'es'); - $response->expects($this->at(4)) + $response->expects($this->at(3)) ->method('_sendHeader')->with('WWW-Authenticate', 'Negotiate'); - $response->expects($this->at(5)) + $response->expects($this->at(4)) ->method('_sendHeader')->with('Access-Control-Allow-Origin', 'domain1'); - $response->expects($this->at(6)) + $response->expects($this->at(5)) ->method('_sendHeader')->with('Access-Control-Allow-Origin', 'domain2'); $response->send(); + + $this->assertCount(1, $GLOBALS['mockedCookies']); + $this->assertSame('value', $GLOBALS['mockedCookies'][0]['value']); + $this->assertSame('thing', $GLOBALS['mockedCookies'][0]['name']); } /** diff --git a/tests/TestCase/Http/ServerRequestTest.php b/tests/TestCase/Http/ServerRequestTest.php index 26492fb2502..1404a0bf7ba 100644 --- a/tests/TestCase/Http/ServerRequestTest.php +++ b/tests/TestCase/Http/ServerRequestTest.php @@ -688,13 +688,13 @@ public function testDefaultEnvValue() public function testClientIp() { $request = new ServerRequest(['environment' => [ - 'HTTP_X_FORWARDED_FOR' => '192.168.1.5, 10.0.1.1, proxy.com', + 'HTTP_X_FORWARDED_FOR' => '192.168.1.5, 10.0.1.1, proxy.com, real.ip', 'HTTP_CLIENT_IP' => '192.168.1.2', 'REMOTE_ADDR' => '192.168.1.3' ]]); $request->trustProxy = true; - $this->assertEquals('192.168.1.5', $request->clientIp()); + $this->assertEquals('real.ip', $request->clientIp()); $request->env('HTTP_X_FORWARDED_FOR', ''); $this->assertEquals('192.168.1.2', $request->clientIp()); diff --git a/tests/TestCase/ORM/CompositeKeysTest.php b/tests/TestCase/ORM/CompositeKeysTest.php index 2c20de9ea54..7bdd83db3bc 100644 --- a/tests/TestCase/ORM/CompositeKeysTest.php +++ b/tests/TestCase/ORM/CompositeKeysTest.php @@ -14,6 +14,8 @@ */ namespace Cake\Test\TestCase\ORM; +use Cake\Database\Driver\Sqlite; +use Cake\Database\Driver\Sqlserver; use Cake\Datasource\ConnectionManager; use Cake\ORM\Entity; use Cake\ORM\Marshaller; @@ -21,6 +23,7 @@ use Cake\ORM\Table; use Cake\ORM\TableRegistry; use Cake\TestSuite\TestCase; +use PDO; /** * Test entity for mass assignment. @@ -740,6 +743,49 @@ public function testLoadIntoMany() $this->assertEquals($expected, $result); } + /** + * Tests notMatching() with a belongsToMany association + * + * @return void + */ + public function testNotMatchingBelongsToMany() + { + $driver = $this->connection->driver(); + + if ($driver instanceof Sqlserver) { + $this->markTestSkipped('Sqlserver does not support the requirements of this test.'); + } elseif ($driver instanceof Sqlite) { + $serverVersion = $driver->connection()->getAttribute(PDO::ATTR_SERVER_VERSION); + if (version_compare($serverVersion, '3.15.0', '<')) { + $this->markTestSkipped("Sqlite ($serverVersion) does not support the requirements of this test."); + } + } + + $articles = TableRegistry::get('SiteArticles'); + $articles->belongsToMany('SiteTags', [ + 'through' => 'SiteArticlesTags', + 'foreignKey' => ['article_id', 'site_id'], + 'targetForeignKey' => ['tag_id', 'site_id'] + ]); + + $results = $articles->find() + ->hydrate(false) + ->notMatching('SiteTags') + ->toArray(); + + $expected = [ + [ + 'id' => 3, + 'author_id' => 1, + 'site_id' => 2, + 'title' => 'Third Article', + 'body' => 'Third Article Body', + ], + ]; + + $this->assertEquals($expected, $results); + } + /** * Helper method to skip tests when connection is SQLite. * @@ -748,7 +794,7 @@ public function testLoadIntoMany() public function skipIfSqlite() { $this->skipIf( - $this->connection->driver() instanceof \Cake\Database\Driver\Sqlite, + $this->connection->driver() instanceof Sqlite, 'SQLite does not support the requirements of this test.' ); } diff --git a/tests/TestCase/Routing/DispatcherFactoryTest.php b/tests/TestCase/Routing/DispatcherFactoryTest.php index 893f7a4e998..ec1e9dc6d97 100644 --- a/tests/TestCase/Routing/DispatcherFactoryTest.php +++ b/tests/TestCase/Routing/DispatcherFactoryTest.php @@ -121,12 +121,16 @@ public function testCreateDispatchWithFilters() $response = $this->getMockBuilder('Cake\Http\Response') ->setMethods(['send']) ->getMock(); + + $response->expects($this->once()) + ->method('send') + ->will($this->returnSelf()); + DispatcherFactory::add('ControllerFactory'); DispatcherFactory::add('Append'); $dispatcher = DispatcherFactory::create(); $result = $dispatcher->dispatch($url, $response); - $this->assertNull($result); - $this->assertEquals('posts index appended content', $response->body()); + $this->assertEquals('posts index appended content', $result->body()); } } diff --git a/tests/TestCase/Routing/DispatcherTest.php b/tests/TestCase/Routing/DispatcherTest.php index 480a6cea885..21e53f76136 100644 --- a/tests/TestCase/Routing/DispatcherTest.php +++ b/tests/TestCase/Routing/DispatcherTest.php @@ -160,7 +160,9 @@ public function testDispatchBasic() 'pass' => ['extract'], ] ]); - $response = $this->getMockBuilder('Cake\Http\Response')->getMock(); + $response = $this->getMockBuilder('Cake\Http\Response') + ->setMethods(['send']) + ->getMock(); $response->expects($this->once()) ->method('send'); diff --git a/tests/TestCase/Routing/Middleware/AssetMiddlewareTest.php b/tests/TestCase/Routing/Middleware/AssetMiddlewareTest.php index dbe10bdd4a5..bc901374b12 100644 --- a/tests/TestCase/Routing/Middleware/AssetMiddlewareTest.php +++ b/tests/TestCase/Routing/Middleware/AssetMiddlewareTest.php @@ -232,4 +232,40 @@ public function test404OnDoubleDot() $res = $middleware($request, $response, $next); $this->assertEmpty($res->getBody()->getContents()); } + + /** + * Test that hidden filenames result in a 404 + * + * @return void + */ + public function test404OnHiddenFile() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/test_plugin/.hiddenfile']); + $response = new Response(); + $next = function ($req, $res) { + return $res; + }; + + $middleware = new AssetMiddleware(); + $res = $middleware($request, $response, $next); + $this->assertEmpty($res->getBody()->getContents()); + } + + /** + * Test that hidden filenames result in a 404 + * + * @return void + */ + public function test404OnHiddenFolder() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/test_plugin/.hiddenfolder/some.js']); + $response = new Response(); + $next = function ($req, $res) { + return $res; + }; + + $middleware = new AssetMiddleware(); + $res = $middleware($request, $response, $next); + $this->assertEmpty($res->getBody()->getContents()); + } } diff --git a/tests/TestCase/Shell/CacheShellTest.php b/tests/TestCase/Shell/CacheShellTest.php index 2df8fa04519..ed789cf2c4d 100644 --- a/tests/TestCase/Shell/CacheShellTest.php +++ b/tests/TestCase/Shell/CacheShellTest.php @@ -16,13 +16,14 @@ use Cake\Cache\Cache; use Cake\Console\Exception\StopException; +use Cake\Console\Shell; use Cake\Shell\CacheShell; -use Cake\TestSuite\TestCase; +use Cake\TestSuite\ConsoleIntegrationTestCase; /** * CacheShell tests. */ -class CacheShellTest extends TestCase +class CacheShellTest extends ConsoleIntegrationTestCase { /** @@ -33,8 +34,6 @@ class CacheShellTest extends TestCase public function setUp() { parent::setUp(); - $this->io = $this->getMockBuilder('Cake\Console\ConsoleIo')->getMock(); - $this->shell = new CacheShell($this->io); Cache::config('test', ['engine' => 'File', 'path' => CACHE]); } @@ -46,8 +45,6 @@ public function setUp() public function tearDown() { parent::tearDown(); - unset($this->io); - unset($this->shell); Cache::drop('test'); } @@ -58,7 +55,11 @@ public function tearDown() */ public function testGetOptionParser() { - $this->assertInstanceOf('Cake\Console\ConsoleOptionParser', $this->shell->getOptionParser()); + $this->exec('cache -h'); + + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContains('list_prefixes'); + $this->assertOutputContains('clear_all'); } /** @@ -68,8 +69,9 @@ public function testGetOptionParser() */ public function testClearInvalidPrefix() { - $this->expectException(StopException::class); - $this->shell->clear('foo'); + $this->exec('cache clear foo'); + $this->assertExitCode(Shell::CODE_ERROR); + $this->assertErrorContains('The "foo" cache configuration does not exist'); } /** @@ -80,7 +82,9 @@ public function testClearInvalidPrefix() public function testClearValidPrefix() { Cache::add('key', 'value', 'test'); - $this->shell->clear('test'); + $this->exec('cache clear test'); + + $this->assertExitCode(Shell::CODE_SUCCESS); $this->assertFalse(Cache::read('key', 'test')); } @@ -92,7 +96,9 @@ public function testClearValidPrefix() public function testClearIgnoresOtherCaches() { Cache::add('key', 'value', 'test'); - $this->shell->clear('_cake_core_'); + $this->exec('cache clear _cake_core_'); + + $this->assertExitCode(Shell::CODE_SUCCESS); $this->assertEquals('value', Cache::read('key', 'test')); } @@ -105,7 +111,9 @@ public function testClearAll() { Cache::add('key', 'value1', 'test'); Cache::add('key', 'value3', '_cake_core_'); - $this->shell->clearAll(); + $this->exec('cache clear_all'); + + $this->assertExitCode(Shell::CODE_SUCCESS); $this->assertFalse(Cache::read('key', 'test')); $this->assertFalse(Cache::read('key', '_cake_core_')); } diff --git a/tests/TestCase/Shell/RoutesShellTest.php b/tests/TestCase/Shell/RoutesShellTest.php index 475fa3da8a5..c3a9b140f68 100644 --- a/tests/TestCase/Shell/RoutesShellTest.php +++ b/tests/TestCase/Shell/RoutesShellTest.php @@ -14,14 +14,15 @@ */ namespace Cake\Test\TestCase\Shell; +use Cake\Console\Shell; use Cake\Routing\Router; use Cake\Shell\RoutesShell; -use Cake\TestSuite\TestCase; +use Cake\TestSuite\ConsoleIntegrationTestCase; /** * RoutesShellTest */ -class RoutesShellTest extends TestCase +class RoutesShellTest extends ConsoleIntegrationTestCase { /** @@ -32,18 +33,6 @@ class RoutesShellTest extends TestCase public function setUp() { parent::setUp(); - $this->io = $this->getMockBuilder('Cake\Console\ConsoleIo') - ->setMethods(['helper', 'out', 'err']) - ->getMock(); - $this->table = $this->getMockBuilder('Cake\Shell\Helper\TableHelper') - ->setConstructorArgs([$this->io]) - ->getMock(); - $this->io->expects($this->any()) - ->method('helper') - ->with('table') - ->will($this->returnValue($this->table)); - - $this->shell = new RoutesShell($this->io); Router::connect('/articles/:action/*', ['controller' => 'Articles']); Router::connect('/bake/:controller/:action', ['plugin' => 'Bake']); Router::connect('/tests/:action/*', ['controller' => 'Tests'], ['_name' => 'testName']); @@ -58,7 +47,6 @@ public function tearDown() { parent::tearDown(); Router::reload(); - unset($this->io, $this->shell); } /** @@ -68,29 +56,28 @@ public function tearDown() */ public function testMain() { - $this->table->expects($this->once()) - ->method('output') - ->with( - $this->logicalAnd( - $this->contains(['Route name', 'URI template', 'Defaults']), - $this->contains([ - 'articles:_action', - '/articles/:action/*', - '{"controller":"Articles","action":"index","plugin":null}' - ]), - $this->contains([ - 'bake._controller:_action', - '/bake/:controller/:action', - '{"plugin":"Bake","action":"index"}', - ]), - $this->contains([ - 'testName', - '/tests/:action/*', - '{"controller":"Tests","action":"index","plugin":null}' - ]) - ) - ); - $this->shell->main(); + $this->exec('routes'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContainsRow([ + 'Route name', + 'URI template', + 'Defaults' + ]); + $this->assertOutputContainsRow([ + 'articles:_action', + '/articles/:action/*', + '{"controller":"Articles","action":"index","plugin":null}' + ]); + $this->assertOutputContainsRow([ + 'bake._controller:_action', + '/bake/:controller/:action', + '{"plugin":"Bake","action":"index"}' + ]); + $this->assertOutputContainsRow([ + 'testName', + '/tests/:action/*', + '{"controller":"Tests","action":"index","plugin":null}' + ]); } /** @@ -100,19 +87,18 @@ public function testMain() */ public function testCheck() { - $this->table->expects($this->once()) - ->method('output') - ->with( - $this->logicalAnd( - $this->contains(['Route name', 'URI template', 'Defaults']), - $this->contains([ - 'articles:_action', - '/articles/index', - '{"action":"index","pass":[],"controller":"Articles","plugin":null}' - ]) - ) - ); - $this->shell->check('/articles/index'); + $this->exec('routes check /articles/check'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContainsRow([ + 'Route name', + 'URI template', + 'Defaults' + ]); + $this->assertOutputContainsRow([ + 'articles:_action', + '/articles/check', + '{"action":"check","pass":[],"controller":"Articles","plugin":null}' + ]); } /** @@ -122,19 +108,18 @@ public function testCheck() */ public function testCheckWithNamedRoute() { - $this->table->expects($this->once()) - ->method('output') - ->with( - $this->logicalAnd( - $this->contains(['Route name', 'URI template', 'Defaults']), - $this->contains([ - 'testName', - '/tests/index', - '{"action":"index","pass":[],"controller":"Tests","plugin":null}' - ]) - ) - ); - $this->shell->check('/tests/index'); + $this->exec('routes check /tests/index'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContainsRow([ + 'Route name', + 'URI template', + 'Defaults' + ]); + $this->assertOutputContainsRow([ + 'testName', + '/tests/index', + '{"action":"index","pass":[],"controller":"Tests","plugin":null}' + ]); } /** @@ -144,10 +129,9 @@ public function testCheckWithNamedRoute() */ public function testCheckNotFound() { - $this->io->expects($this->at(0)) - ->method('err') - ->with($this->stringContains('did not match')); - $this->shell->check('/nope'); + $this->exec('routes check /nope'); + $this->assertExitCode(Shell::CODE_ERROR); + $this->assertErrorContains('did not match'); } /** @@ -155,22 +139,25 @@ public function testCheckNotFound() * * @return void */ - public function testGenerate() + public function testGenerateNoPassArgs() { - $this->io->expects($this->never()) - ->method('err'); - $this->io->expects($this->at(0)) - ->method('out') - ->with($this->stringContains('> /articles/index')); - $this->io->expects($this->at(2)) - ->method('out') - ->with($this->stringContains('> /articles/view/2/3')); - - $this->shell->args = ['controller:Articles', 'action:index']; - $this->shell->generate(); + $this->exec('routes generate controller:Articles action:index'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContains('> /articles/index'); + $this->assertErrorEmpty(); + } - $this->shell->args = ['controller:Articles', 'action:view', '2', '3']; - $this->shell->generate(); + /** + * Test generating URLs with passed arguments + * + * @return void + */ + public function testGeneratePassedArguments() + { + $this->exec('routes generate controller:Articles action:view 2 3'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContains('> /articles/view/2/3'); + $this->assertErrorEmpty(); } /** @@ -180,14 +167,9 @@ public function testGenerate() */ public function testGenerateBoolParams() { - $this->io->expects($this->never()) - ->method('err'); - $this->io->expects($this->at(0)) - ->method('out') - ->with($this->stringContains('> https://example.com/articles/index')); - - $this->shell->args = ['_ssl:true', '_host:example.com', 'controller:Articles', 'action:index']; - $this->shell->generate(); + $this->exec('routes generate controller:Articles action:index _ssl:true _host:example.com'); + $this->assertExitCode(Shell::CODE_SUCCESS); + $this->assertOutputContains('> https://example.com/articles/index'); } /** @@ -197,10 +179,8 @@ public function testGenerateBoolParams() */ public function testGenerateMissing() { - $this->io->expects($this->at(0)) - ->method('err') - ->with($this->stringContains('do not match')); - $this->shell->args = ['controller:Derp']; - $this->shell->generate(); + $this->exec('routes generate controller:Derp'); + $this->assertExitCode(Shell::CODE_ERROR); + $this->assertErrorContains('do not match'); } } diff --git a/tests/TestCase/TestSuite/ConsoleIntegrationTestCaseTest.php b/tests/TestCase/TestSuite/ConsoleIntegrationTestCaseTest.php index f6117ade5ce..0a5953ffd02 100644 --- a/tests/TestCase/TestSuite/ConsoleIntegrationTestCaseTest.php +++ b/tests/TestCase/TestSuite/ConsoleIntegrationTestCaseTest.php @@ -80,6 +80,7 @@ public function testExecWithArgsAndOption() { $this->exec('integration args_and_options arg --opt="some string"'); + $this->assertErrorEmpty(); $this->assertOutputContains('arg: arg'); $this->assertOutputContains('opt: some string'); $this->assertExitCode(Shell::CODE_SUCCESS); @@ -94,6 +95,7 @@ public function testExecWithMissingRequiredArg() { $this->exec('integration args_and_options'); + $this->assertOutputEmpty(); $this->assertErrorContains('Missing required arguments'); $this->assertErrorContains('arg is required'); $this->assertExitCode(Shell::CODE_ERROR); diff --git a/tests/TestCase/Utility/HashTest.php b/tests/TestCase/Utility/HashTest.php index f4324776796..9237798a0dc 100644 --- a/tests/TestCase/Utility/HashTest.php +++ b/tests/TestCase/Utility/HashTest.php @@ -2127,6 +2127,43 @@ public function testRemove() $this->assertEquals($expected, $result); $result = Hash::remove($array, '{n}.{n}.part'); $this->assertEquals($expected, $result); + + $array = [ + 'foo' => 'string', + ]; + $expected = $array; + $result = Hash::remove($array, 'foo.bar'); + $this->assertEquals($expected, $result); + + $array = [ + 'foo' => 'string', + 'bar' => [ + 0 => 'a', + 1 => 'b', + ], + ]; + $expected = [ + 'foo' => 'string', + 'bar' => [ + 1 => 'b', + ], + ]; + $result = Hash::remove($array, '{s}.0'); + $this->assertEquals($expected, $result); + + $array = [ + 'foo' => [ + 0 => 'a', + 1 => 'b', + ], + ]; + $expected = [ + 'foo' => [ + 1 => 'b', + ], + ]; + $result = Hash::remove($array, 'foo[1=b].0'); + $this->assertEquals($expected, $result); } /** diff --git a/tests/TestCase/View/Helper/HtmlHelperTest.php b/tests/TestCase/View/Helper/HtmlHelperTest.php index a01d6a0d916..03c0043dbb4 100644 --- a/tests/TestCase/View/Helper/HtmlHelperTest.php +++ b/tests/TestCase/View/Helper/HtmlHelperTest.php @@ -347,6 +347,11 @@ public function testImageTag() $result = $this->Html->image('cid:cakephp_logo'); $expected = ['img' => ['src' => 'cid:cakephp_logo', 'alt' => '']]; $this->assertHtml($expected, $result); + + $result = $this->Html->image('x:">'); + $expected = ['img' => ['src' => 'x:"><script>alert(1)</script>', 'alt' => '']]; + + $this->assertHtml($expected, $result); } /** @@ -562,6 +567,10 @@ public function testCssLink() $expected['link']['href'] = 'css/screen.css?with=param&other=param'; $this->assertHtml($expected, $result); + $result = $this->Html->css('x:">'); + $expected['link']['href'] = 'x:"><script>alert(1)</script>'; + $this->assertHtml($expected, $result); + $result = $this->Html->css('http://whatever.com/screen.css?1234'); $expected['link']['href'] = 'preg:/http:\/\/.*\/screen\.css\?1234/'; $this->assertHtml($expected, $result); @@ -904,6 +913,12 @@ public function testScript() ]; $this->assertHtml($expected, $result); + $result = $this->Html->script('x:">'); + $expected = [ + 'script' => ['src' => 'x:"><script>alert(1)</script>'] + ]; + $this->assertHtml($expected, $result); + $result = $this->Html->script('foo2', ['pathPrefix' => '/my/custom/path/']); $expected = [ 'script' => ['src' => '/my/custom/path/foo2.js'] @@ -1716,6 +1731,24 @@ public function testMetaIcon() ]; $this->assertHtml($expected, $result); + $result = $this->Html->meta('icon', 'x:">'); + $url = 'x:"><script>alert(1)</script>'; + $expected = [ + 'link' => [ + 'href' => $url, + 'type' => 'image/x-icon', + 'rel' => 'icon' + ], + [ + 'link' => [ + 'href' => $url, + 'type' => 'image/x-icon', + 'rel' => 'shortcut icon' + ] + ] + ]; + $this->assertHtml($expected, $result); + $this->Html->request->webroot = '/testing/'; $result = $this->Html->meta('icon'); $expected = [ @@ -1956,6 +1989,12 @@ public function testDiv() $result = $this->Html->div('class-name', '', ['escape' => true]); $expected = ['div' => ['class' => 'class-name'], '<text>', '/div']; $this->assertHtml($expected, $result); + + $evilKey = ">"; + $options = [$evilKey => 'some value']; + $result = $this->Html->div('class-name', '', $options); + $expected = '
'; + $this->assertEquals($expected, $result); } /** diff --git a/tests/TestCase/View/Helper/UrlHelperTest.php b/tests/TestCase/View/Helper/UrlHelperTest.php index c9b03dab8f4..24ea1137d51 100644 --- a/tests/TestCase/View/Helper/UrlHelperTest.php +++ b/tests/TestCase/View/Helper/UrlHelperTest.php @@ -198,6 +198,9 @@ public function testAssetUrl() $result = $this->Helper->assetUrl('foo.jpg?one=two&three=four'); $this->assertEquals('foo.jpg?one=two&three=four', $result); + $result = $this->Helper->assetUrl('x:">'); + $this->assertEquals('x:"><script>alert(1)</script>', $result); + $result = $this->Helper->assetUrl('dir/big+tall/image', ['ext' => '.jpg']); $this->assertEquals('dir/big%2Btall/image.jpg', $result); } diff --git a/tests/TestCase/View/StringTemplateTest.php b/tests/TestCase/View/StringTemplateTest.php index 2be808f5b58..2286d66025b 100644 --- a/tests/TestCase/View/StringTemplateTest.php +++ b/tests/TestCase/View/StringTemplateTest.php @@ -264,6 +264,15 @@ public function testFormatAttributes() ' data-hero="<batman>"', $result ); + + $evilKey = ">"; + $attrs = [$evilKey => 'some value']; + + $result = $this->template->formatAttributes($attrs); + $this->assertEquals( + ' ><script>alert(1)</script>="some value"', + $result + ); } /** diff --git a/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfile b/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfile new file mode 100644 index 00000000000..2ef267e25bd --- /dev/null +++ b/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfile @@ -0,0 +1 @@ +some content diff --git a/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfolder/some.js b/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfolder/some.js new file mode 100644 index 00000000000..a54d3b85bf1 --- /dev/null +++ b/tests/test_app/Plugin/TestPlugin/webroot/.hiddenfolder/some.js @@ -0,0 +1 @@ +var content = 'some'; diff --git a/tests/test_app/TestApp/Template/Posts/header.ctp b/tests/test_app/TestApp/Template/Posts/header.ctp new file mode 100644 index 00000000000..12b6e95c960 --- /dev/null +++ b/tests/test_app/TestApp/Template/Posts/header.ctp @@ -0,0 +1,4 @@ +response = $this->response->withHeader('X-view-template', 'yes'); +?> +header template