diff --git a/lib/cacerts.pem b/lib/cacerts.pem deleted file mode 100644 index 70990f1f8..000000000 --- a/lib/cacerts.pem +++ /dev/null @@ -1,2183 +0,0 @@ -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -# Issuer: O=Equifax OU=Equifax Secure Certificate Authority -# Subject: O=Equifax OU=Equifax Secure Certificate Authority -# Label: "Equifax Secure CA" -# Serial: 903804111 -# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 -# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a -# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA -# Label: "GlobalSign Root CA" -# Serial: 4835703278459707669005204 -# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a -# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c -# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 -# Label: "GlobalSign Root CA - R2" -# Serial: 4835703278459682885658125 -# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 -# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe -# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 3 Public Primary Certification Authority - G3" -# Serial: 206684696279472310254277870180966723415 -# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 -# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 -# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only -# Label: "Verisign Class 4 Public Primary Certification Authority - G3" -# Serial: 314531972711909413743075096039378935511 -# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df -# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d -# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Premium 2048 Secure Server CA" -# Serial: 946059622 -# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc -# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe -# SHA256 Fingerprint: d1:c3:39:ea:27:84:eb:87:0f:93:4f:c5:63:4e:4a:a9:ad:55:05:01:64:01:f2:64:65:d3:7a:57:46:63:35:9f ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 -# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2 -# Label: "Equifax Secure eBusiness CA 2" -# Serial: 930140085 -# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca -# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc -# SHA256 Fingerprint: 2f:27:4e:48:ab:a4:ac:7b:76:59:33:10:17:75:50:6d:c3:0e:e3:8e:f6:ac:d5:c0:49:32:cf:e0:41:23:42:20 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Low-Value Services Root" -# Serial: 1 -# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc -# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d -# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network -# Label: "AddTrust External Root" -# Serial: 1 -# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f -# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 -# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Public Services Root" -# Serial: 1 -# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f -# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 -# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network -# Label: "AddTrust Qualified Certificates Root" -# Serial: 1 -# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb -# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf -# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- - -# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. -# Label: "Entrust Root Certification Authority" -# Serial: 1164660820 -# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 -# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 -# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. -# Label: "GeoTrust Global CA" -# Serial: 144470 -# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 -# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 -# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Global CA 2" -# Serial: 1 -# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 -# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d -# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. -# Label: "GeoTrust Universal CA" -# Serial: 1 -# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 -# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 -# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. -# Label: "GeoTrust Universal CA 2" -# Serial: 1 -# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 -# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 -# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Label: "America Online Root Certification Authority 1" -# Serial: 1 -# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e -# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a -# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Label: "America Online Root Certification Authority 2" -# Serial: 1 -# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf -# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 -# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- - -# Issuer: CN=AAA Certificate Services O=Comodo CA Limited -# Subject: CN=AAA Certificate Services O=Comodo CA Limited -# Label: "Comodo AAA Services root" -# Serial: 1 -# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 -# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 -# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -# Issuer: CN=Secure Certificate Services O=Comodo CA Limited -# Subject: CN=Secure Certificate Services O=Comodo CA Limited -# Label: "Comodo Secure Services root" -# Serial: 1 -# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd -# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 -# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - -# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited -# Subject: CN=Trusted Certificate Services O=Comodo CA Limited -# Label: "Comodo Trusted Services root" -# Serial: 1 -# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 -# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd -# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN DATACorp SGC Root CA" -# Serial: 91374294542884689855167577680241077609 -# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 -# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 -# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com -# Label: "UTN USERFirst Hardware Root CA" -# Serial: 91374294542884704022267039221184531197 -# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 -# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 -# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - -# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com -# Label: "XRamp Global CA Root" -# Serial: 107108908803651509692980124233745014957 -# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 -# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 -# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority -# Label: "Go Daddy Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 -# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 -# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- - -# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority -# Label: "Starfield Class 2 CA" -# Serial: 0 -# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 -# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a -# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 1 -# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 -# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f -# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root CA" -# Serial: 17154717934120587862167794914071425081 -# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 -# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 -# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert High Assurance EV Root CA" -# Serial: 3553400076410547919724730734378100087 -# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a -# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 -# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. -# Label: "GeoTrust Primary Certification Authority" -# Serial: 32798226551256963324313806436981982369 -# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf -# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 -# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA" -# Serial: 69529181992039203566298953787712940909 -# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 -# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 -# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" -# Serial: 33037644167568058970164719475676101450 -# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c -# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 -# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO Certification Authority O=COMODO CA Limited -# Label: "COMODO Certification Authority" -# Serial: 104350513648249232941998508985834464573 -# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 -# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b -# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- - -# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. -# Label: "Network Solutions Certificate Authority" -# Serial: 116697915152937497490437556386812487904 -# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e -# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce -# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Label: "TC TrustCenter Class 2 CA II" -# Serial: 941389028203453866782103406992443 -# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 -# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e -# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf -tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg -uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J -XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK -8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 -5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 -kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS -GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt -ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 -au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV -hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI -dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Label: "TC TrustCenter Class 3 CA II" -# Serial: 1506523511417715638772220530020799 -# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e -# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 -# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW -Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q -Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 -1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq -ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 -Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX -XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN -irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 -TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 -g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB -95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj -S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Label: "TC TrustCenter Universal CA I" -# Serial: 601024842042189035295619584734726 -# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c -# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 -# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx -MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg -R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD -VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR -JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T -fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu -jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z -wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ -fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD -VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G -CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 -7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn -8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs -ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ -2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc -# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc -# Label: "Cybertrust Global Root" -# Serial: 4835703278459682877484360 -# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 -# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 -# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G3" -# Serial: 28809105769928564313984085209975885599 -# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 -# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd -# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G2" -# Serial: 71758320672825410020661621085256472406 -# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f -# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 -# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only -# Label: "thawte Primary Root CA - G3" -# Serial: 127614157056681299805556476275995414779 -# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 -# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 -# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only -# Label: "GeoTrust Primary Certification Authority - G2" -# Serial: 80682863203381065782177908751794619243 -# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a -# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 -# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Universal Root Certification Authority" -# Serial: 85209574734084581917763752644031726877 -# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 -# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 -# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only -# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" -# Serial: 63143484348153506665311985501458640051 -# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 -# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a -# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Label: "TC TrustCenter Universal CA III" -# Serial: 2010889993983507346460533407902964 -# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b -# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87 -# SHA256 Fingerprint: 30:9b:4a:87:f6:ca:56:c9:31:69:aa:a9:9c:6d:98:88:54:d7:89:2b:d5:43:7e:2d:07:b2:9c:be:da:55:d3:5d ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy -MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl -ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm -BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF -5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv -DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v -zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT -yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj -dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh -MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI -4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz -dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY -aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G -DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH -LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Commercial O=AffirmTrust -# Subject: CN=AffirmTrust Commercial O=AffirmTrust -# Label: "AffirmTrust Commercial" -# Serial: 8608355977964138876 -# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 -# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 -# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Networking O=AffirmTrust -# Subject: CN=AffirmTrust Networking O=AffirmTrust -# Label: "AffirmTrust Networking" -# Serial: 8957382827206547757 -# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f -# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f -# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium O=AffirmTrust -# Subject: CN=AffirmTrust Premium O=AffirmTrust -# Label: "AffirmTrust Premium" -# Serial: 7893706540734352110 -# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 -# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 -# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- - -# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust -# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust -# Label: "AffirmTrust Premium ECC" -# Serial: 8401224907861490260 -# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d -# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb -# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing -# Label: "StartCom Certification Authority" -# Serial: 45 -# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 -# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 -# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul -F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC -ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w -ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk -aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 -YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg -c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 -d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG -CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF -wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS -Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst -0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc -pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl -CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF -P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK -1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm -KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ -8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm -fyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. -# Label: "StartCom Certification Authority G2" -# Serial: 59 -# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 -# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 -# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 -OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG -A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ -JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD -vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo -D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ -Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW -RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK -HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN -nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM -0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i -UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 -Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg -TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL -BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX -UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl -6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK -9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ -HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI -wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY -XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l -IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo -hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr -so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- diff --git a/lib/compat/multi_json.rb b/lib/compat/multi_json.rb deleted file mode 100644 index 3974f084b..000000000 --- a/lib/compat/multi_json.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'multi_json' - -if !MultiJson.respond_to?(:load) || [ - Kernel, - defined?(ActiveSupport::Dependencies::Loadable) && ActiveSupport::Dependencies::Loadable -].compact.include?(MultiJson.method(:load).owner) - module MultiJson - class < - #
  • :two_legged_oauth_1
  • - #
  • :oauth_1
  • - #
  • :oauth_2
  • - #
  • :google_app_default
  • - # - # @option options [Boolean] :auto_refresh_token (true) - # The setting that controls whether or not the api client attempts to - # refresh authorization when a 401 is hit in #execute. If the token does - # not support it, this option is ignored. - # @option options [String] :application_name - # The name of the application using the client. - # @option options [String | Array | nil] :scope - # The scope(s) used when using google application default credentials - # @option options [String] :application_version - # The version number of the application using the client. - # @option options [String] :user_agent - # ("{app_name} google-api-ruby-client/{version} {os_name}/{os_version}") - # The user agent used by the client. Most developers will want to - # leave this value alone and use the `:application_name` option instead. - # @option options [String] :host ("www.googleapis.com") - # The API hostname used by the client. This rarely needs to be changed. - # @option options [String] :port (443) - # The port number used by the client. This rarely needs to be changed. - # @option options [String] :discovery_path ("/discovery/v1") - # The discovery base path. This rarely needs to be changed. - # @option options [String] :ca_file - # Optional set of root certificates to use when validating SSL connections. - # By default, a bundled set of trusted roots will be used. - # @options options[Hash] :force_encoding - # Experimental option. True if response body should be force encoded into the charset - # specified in the Content-Type header. Mostly intended for compressed content. - # @options options[Hash] :faraday_options - # Pass through of options to set on the Faraday connection - def initialize(options={}) - logger.debug { "#{self.class} - Initializing client with options #{options}" } - - # Normalize key to String to allow indifferent access. - options = options.inject({}) do |accu, (key, value)| - accu[key.to_sym] = value - accu - end - # Almost all API usage will have a host of 'www.googleapis.com'. - self.host = options[:host] || 'www.googleapis.com' - self.port = options[:port] || 443 - self.discovery_path = options[:discovery_path] || '/discovery/v1' - - # Most developers will want to leave this value alone and use the - # application_name option. - if options[:application_name] - app_name = options[:application_name] - app_version = options[:application_version] - application_string = "#{app_name}/#{app_version || '0.0.0'}" - else - logger.warn { "#{self.class} - Please provide :application_name and :application_version when initializing the client" } - end - - proxy = options[:proxy] || Object::ENV["http_proxy"] - - self.user_agent = options[:user_agent] || ( - "#{application_string} " + - "google-api-ruby-client/#{Google::APIClient::VERSION::STRING} #{ENV::OS_VERSION} (gzip)" - ).strip - # The writer method understands a few Symbols and will generate useful - # default authentication mechanisms. - self.authorization = - options.key?(:authorization) ? options[:authorization] : :oauth_2 - if !options['scope'].nil? and self.authorization.respond_to?(:scope=) - self.authorization.scope = options['scope'] - end - self.auto_refresh_token = options.fetch(:auto_refresh_token) { true } - self.key = options[:key] - self.user_ip = options[:user_ip] - self.retries = options.fetch(:retries) { 0 } - self.expired_auth_retry = options.fetch(:expired_auth_retry) { true } - @discovery_uris = {} - @discovery_documents = {} - @discovered_apis = {} - ca_file = options[:ca_file] || File.expand_path('../../cacerts.pem', __FILE__) - self.connection = Faraday.new do |faraday| - faraday.response :charset if options[:force_encoding] - faraday.response :gzip - faraday.options.params_encoder = Faraday::FlatParamsEncoder - faraday.ssl.ca_file = ca_file - faraday.ssl.verify = true - faraday.proxy proxy - faraday.adapter Faraday.default_adapter - if options[:faraday_option].is_a?(Hash) - options[:faraday_option].each_pair do |option, value| - faraday.options.send("#{option}=", value) - end - end - end - return self - end - - ## - # Returns the authorization mechanism used by the client. - # - # @return [#generate_authenticated_request] The authorization mechanism. - attr_reader :authorization - - ## - # Sets the authorization mechanism used by the client. - # - # @param [#generate_authenticated_request] new_authorization - # The new authorization mechanism. - def authorization=(new_authorization) - case new_authorization - when :oauth_1, :oauth - require 'signet/oauth_1/client' - # NOTE: Do not rely on this default value, as it may change - new_authorization = Signet::OAuth1::Client.new( - :temporary_credential_uri => - 'https://www.google.com/accounts/OAuthGetRequestToken', - :authorization_uri => - 'https://www.google.com/accounts/OAuthAuthorizeToken', - :token_credential_uri => - 'https://www.google.com/accounts/OAuthGetAccessToken', - :client_credential_key => 'anonymous', - :client_credential_secret => 'anonymous' - ) - when :two_legged_oauth_1, :two_legged_oauth - require 'signet/oauth_1/client' - # NOTE: Do not rely on this default value, as it may change - new_authorization = Signet::OAuth1::Client.new( - :client_credential_key => nil, - :client_credential_secret => nil, - :two_legged => true - ) - when :google_app_default - require 'googleauth' - new_authorization = Google::Auth.get_application_default - - when :oauth_2 - require 'signet/oauth_2/client' - # NOTE: Do not rely on this default value, as it may change - new_authorization = Signet::OAuth2::Client.new( - :authorization_uri => - 'https://accounts.google.com/o/oauth2/auth', - :token_credential_uri => - 'https://accounts.google.com/o/oauth2/token' - ) - when nil - # No authorization mechanism - else - if !new_authorization.respond_to?(:generate_authenticated_request) - raise TypeError, - 'Expected authorization mechanism to respond to ' + - '#generate_authenticated_request.' - end - end - @authorization = new_authorization - return @authorization - end - - ## - # Default Faraday/HTTP connection. - # - # @return [Faraday::Connection] - attr_accessor :connection - - ## - # The setting that controls whether or not the api client attempts to - # refresh authorization when a 401 is hit in #execute. - # - # @return [Boolean] - attr_accessor :auto_refresh_token - - ## - # The application's API key issued by the API console. - # - # @return [String] The API key. - attr_accessor :key - - ## - # The IP address of the user this request is being performed on behalf of. - # - # @return [String] The user's IP address. - attr_accessor :user_ip - - ## - # The user agent used by the client. - # - # @return [String] - # The user agent string used in the User-Agent header. - attr_accessor :user_agent - - ## - # The API hostname used by the client. - # - # @return [String] - # The API hostname. Should almost always be 'www.googleapis.com'. - attr_accessor :host - - ## - # The port number used by the client. - # - # @return [String] - # The port number. Should almost always be 443. - attr_accessor :port - - ## - # The base path used by the client for discovery. - # - # @return [String] - # The base path. Should almost always be '/discovery/v1'. - attr_accessor :discovery_path - - ## - # Number of times to retry on recoverable errors - # - # @return [FixNum] - # Number of retries - attr_accessor :retries - - ## - # Whether or not an expired auth token should be re-acquired - # (and the operation retried) regardless of retries setting - # @return [Boolean] - # Auto retry on auth expiry - attr_accessor :expired_auth_retry - - ## - # Returns the URI for the directory document. - # - # @return [Addressable::URI] The URI of the directory document. - def directory_uri - return resolve_uri(self.discovery_path + '/apis') - end - - ## - # Manually registers a URI as a discovery document for a specific version - # of an API. - # - # @param [String, Symbol] api The API name. - # @param [String] version The desired version of the API. - # @param [Addressable::URI] uri The URI of the discovery document. - # @return [Google::APIClient::API] The service object. - def register_discovery_uri(api, version, uri) - api = api.to_s - version = version || 'v1' - @discovery_uris["#{api}:#{version}"] = uri - discovered_api(api, version) - end - - ## - # Returns the URI for the discovery document. - # - # @param [String, Symbol] api The API name. - # @param [String] version The desired version of the API. - # @return [Addressable::URI] The URI of the discovery document. - def discovery_uri(api, version=nil) - api = api.to_s - version = version || 'v1' - return @discovery_uris["#{api}:#{version}"] ||= ( - resolve_uri( - self.discovery_path + '/apis/{api}/{version}/rest', - 'api' => api, - 'version' => version - ) - ) - end - - ## - # Manually registers a pre-loaded discovery document for a specific version - # of an API. - # - # @param [String, Symbol] api The API name. - # @param [String] version The desired version of the API. - # @param [String, StringIO] discovery_document - # The contents of the discovery document. - # @return [Google::APIClient::API] The service object. - def register_discovery_document(api, version, discovery_document) - api = api.to_s - version = version || 'v1' - if discovery_document.kind_of?(StringIO) - discovery_document.rewind - discovery_document = discovery_document.string - elsif discovery_document.respond_to?(:to_str) - discovery_document = discovery_document.to_str - else - raise TypeError, - "Expected String or StringIO, got #{discovery_document.class}." - end - @discovery_documents["#{api}:#{version}"] = - MultiJson.load(discovery_document) - discovered_api(api, version) - end - - ## - # Returns the parsed directory document. - # - # @return [Hash] The parsed JSON from the directory document. - def directory_document - return @directory_document ||= (begin - response = self.execute!( - :http_method => :get, - :uri => self.directory_uri, - :authenticated => false - ) - response.data - end) - end - - ## - # Returns the parsed discovery document. - # - # @param [String, Symbol] api The API name. - # @param [String] version The desired version of the API. - # @return [Hash] The parsed JSON from the discovery document. - def discovery_document(api, version=nil) - api = api.to_s - version = version || 'v1' - return @discovery_documents["#{api}:#{version}"] ||= (begin - response = self.execute!( - :http_method => :get, - :uri => self.discovery_uri(api, version), - :authenticated => false - ) - response.data - end) - end - - ## - # Returns all APIs published in the directory document. - # - # @return [Array] The list of available APIs. - def discovered_apis - @directory_apis ||= (begin - document_base = self.directory_uri - if self.directory_document && self.directory_document['items'] - self.directory_document['items'].map do |discovery_document| - Google::APIClient::API.new( - document_base, - discovery_document - ) - end - else - [] - end - end) - end - - ## - # Returns the service object for a given service name and service version. - # - # @param [String, Symbol] api The API name. - # @param [String] version The desired version of the API. - # - # @return [Google::APIClient::API] The service object. - def discovered_api(api, version=nil) - if !api.kind_of?(String) && !api.kind_of?(Symbol) - raise TypeError, - "Expected String or Symbol, got #{api.class}." - end - api = api.to_s - version = version || 'v1' - return @discovered_apis["#{api}:#{version}"] ||= begin - document_base = self.discovery_uri(api, version) - discovery_document = self.discovery_document(api, version) - if document_base && discovery_document - Google::APIClient::API.new( - document_base, - discovery_document - ) - else - nil - end - end - end - - ## - # Returns the method object for a given RPC name and service version. - # - # @param [String, Symbol] rpc_name The RPC name of the desired method. - # @param [String, Symbol] api The API the method is within. - # @param [String] version The desired version of the API. - # - # @return [Google::APIClient::Method] The method object. - def discovered_method(rpc_name, api, version=nil) - if !rpc_name.kind_of?(String) && !rpc_name.kind_of?(Symbol) - raise TypeError, - "Expected String or Symbol, got #{rpc_name.class}." - end - rpc_name = rpc_name.to_s - api = api.to_s - version = version || 'v1' - service = self.discovered_api(api, version) - if service.to_h[rpc_name] - return service.to_h[rpc_name] - else - return nil - end - end - - ## - # Returns the service object with the highest version number. - # - # @note Warning: This method should be used with great care. - # As APIs are updated, minor differences between versions may cause - # incompatibilities. Requesting a specific version will avoid this issue. - # - # @param [String, Symbol] api The name of the service. - # - # @return [Google::APIClient::API] The service object. - def preferred_version(api) - if !api.kind_of?(String) && !api.kind_of?(Symbol) - raise TypeError, - "Expected String or Symbol, got #{api.class}." - end - api = api.to_s - return self.discovered_apis.detect do |a| - a.name == api && a.preferred == true - end - end - - ## - # Verifies an ID token against a server certificate. Used to ensure that - # an ID token supplied by an untrusted client-side mechanism is valid. - # Raises an error if the token is invalid or missing. - # - # @deprecated Use the google-id-token gem for verifying JWTs - def verify_id_token! - require 'jwt' - require 'openssl' - @certificates ||= {} - if !self.authorization.respond_to?(:id_token) - raise ArgumentError, ( - "Current authorization mechanism does not support ID tokens: " + - "#{self.authorization.class.to_s}" - ) - elsif !self.authorization.id_token - raise ArgumentError, ( - "Could not verify ID token, ID token missing. " + - "Scopes were: #{self.authorization.scope.inspect}" - ) - else - check_cached_certs = lambda do - valid = false - for _key, cert in @certificates - begin - self.authorization.decoded_id_token(cert.public_key) - valid = true - rescue JWT::DecodeError, Signet::UnsafeOperationError - # Expected exception. Ignore, ID token has not been validated. - end - end - valid - end - if check_cached_certs.call() - return true - end - response = self.execute!( - :http_method => :get, - :uri => 'https://www.googleapis.com/oauth2/v1/certs', - :authenticated => false - ) - @certificates.merge!( - Hash[MultiJson.load(response.body).map do |key, cert| - [key, OpenSSL::X509::Certificate.new(cert)] - end] - ) - if check_cached_certs.call() - return true - else - raise InvalidIDTokenError, - "Could not verify ID token against any available certificate." - end - end - return nil - end - - ## - # Generates a request. - # - # @option options [Google::APIClient::Method] :api_method - # The method object or the RPC name of the method being executed. - # @option options [Hash, Array] :parameters - # The parameters to send to the method. - # @option options [Hash, Array] :headers The HTTP headers for the request. - # @option options [String] :body The body of the request. - # @option options [String] :version ("v1") - # The service version. Only used if `api_method` is a `String`. - # @option options [#generate_authenticated_request] :authorization - # The authorization mechanism for the response. Used only if - # `:authenticated` is `true`. - # @option options [TrueClass, FalseClass] :authenticated (true) - # `true` if the request must be signed or somehow - # authenticated, `false` otherwise. - # - # @return [Google::APIClient::Reference] The generated request. - # - # @example - # request = client.generate_request( - # :api_method => 'plus.activities.list', - # :parameters => - # {'collection' => 'public', 'userId' => 'me'} - # ) - def generate_request(options={}) - options = { - :api_client => self - }.merge(options) - return Google::APIClient::Request.new(options) - end - - ## - # Executes a request, wrapping it in a Result object. - # - # @param [Google::APIClient::Request, Hash, Array] params - # Either a Google::APIClient::Request, a Hash, or an Array. - # - # If a Google::APIClient::Request, no other parameters are expected. - # - # If a Hash, the below parameters are handled. If an Array, the - # parameters are assumed to be in the below order: - # - # - (Google::APIClient::Method) api_method: - # The method object or the RPC name of the method being executed. - # - (Hash, Array) parameters: - # The parameters to send to the method. - # - (String) body: The body of the request. - # - (Hash, Array) headers: The HTTP headers for the request. - # - (Hash) options: A set of options for the request, of which: - # - (#generate_authenticated_request) :authorization (default: true) - - # The authorization mechanism for the response. Used only if - # `:authenticated` is `true`. - # - (TrueClass, FalseClass) :authenticated (default: true) - - # `true` if the request must be signed or somehow - # authenticated, `false` otherwise. - # - (TrueClass, FalseClass) :gzip (default: true) - - # `true` if gzip enabled, `false` otherwise. - # - (FixNum) :retries - - # # of times to retry on recoverable errors - # - # @return [Google::APIClient::Result] The result from the API, nil if batch. - # - # @example - # result = client.execute(batch_request) - # - # @example - # plus = client.discovered_api('plus') - # result = client.execute( - # :api_method => plus.activities.list, - # :parameters => {'collection' => 'public', 'userId' => 'me'} - # ) - # - # @see Google::APIClient#generate_request - def execute!(*params) - if params.first.kind_of?(Google::APIClient::Request) - request = params.shift - options = params.shift || {} - else - # This block of code allows us to accept multiple parameter passing - # styles, and maintaining some backwards compatibility. - # - # Note: I'm extremely tempted to deprecate this style of execute call. - if params.last.respond_to?(:to_hash) && params.size == 1 - options = params.pop - else - options = {} - end - - options[:api_method] = params.shift if params.size > 0 - options[:parameters] = params.shift if params.size > 0 - options[:body] = params.shift if params.size > 0 - options[:headers] = params.shift if params.size > 0 - options.update(params.shift) if params.size > 0 - request = self.generate_request(options) - end - - request.headers['User-Agent'] ||= '' + self.user_agent unless self.user_agent.nil? - request.headers['Accept-Encoding'] ||= 'gzip' unless options[:gzip] == false - request.headers['Content-Type'] ||= '' - request.parameters['key'] ||= self.key unless self.key.nil? - request.parameters['userIp'] ||= self.user_ip unless self.user_ip.nil? - - connection = options[:connection] || self.connection - request.authorization = options[:authorization] || self.authorization unless options[:authenticated] == false - - tries = 1 + (options[:retries] || self.retries) - attempt = 0 - - Retriable.retriable :tries => tries, - :on => [TransmissionError], - :on_retry => client_error_handler, - :interval => lambda {|attempts| (2 ** attempts) + rand} do - attempt += 1 - - # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows - # auth to be re-attempted without having to retry all sorts of other failures like - # NotFound, etc - Retriable.retriable :tries => ((expired_auth_retry || tries > 1) && attempt == 1) ? 2 : 1, - :on => [AuthorizationError], - :on_retry => authorization_error_handler(request.authorization) do - result = request.send(connection, true) - - case result.status - when 200...300 - result - when 301, 302, 303, 307 - request = generate_request(request.to_hash.merge({ - :uri => result.headers['location'], - :api_method => nil - })) - raise RedirectError.new(result.headers['location'], result) - when 401 - raise AuthorizationError.new(result.error_message || 'Invalid/Expired Authentication', result) - when 400, 402...500 - raise ClientError.new(result.error_message || "A client error has occurred", result) - when 500...600 - raise ServerError.new(result.error_message || "A server error has occurred", result) - else - raise TransmissionError.new(result.error_message || "A transmission error has occurred", result) - end - end - end - end - - ## - # Same as Google::APIClient#execute!, but does not raise an exception for - # normal API errros. - # - # @see Google::APIClient#execute - def execute(*params) - begin - return self.execute!(*params) - rescue TransmissionError => e - return e.result - end - end - - protected - - ## - # Resolves a URI template against the client's configured base. - # - # @api private - # @param [String, Addressable::URI, Addressable::Template] template - # The template to resolve. - # @param [Hash] mapping The mapping that corresponds to the template. - # @return [Addressable::URI] The expanded URI. - def resolve_uri(template, mapping={}) - @base_uri ||= Addressable::URI.new( - :scheme => 'https', - :host => self.host, - :port => self.port - ).normalize - template = if template.kind_of?(Addressable::Template) - template.pattern - elsif template.respond_to?(:to_str) - template.to_str - else - raise TypeError, - "Expected String, Addressable::URI, or Addressable::Template, " + - "got #{template.class}." - end - return Addressable::Template.new(@base_uri + template).expand(mapping) - end - - - ## - # Returns on proc for special processing of retries for authorization errors - # Only 401s should be retried and only if the credentials are refreshable - # - # @param [#fetch_access_token!] authorization - # OAuth 2 credentials - # @return [Proc] - def authorization_error_handler(authorization) - can_refresh = authorization.respond_to?(:refresh_token) && auto_refresh_token - Proc.new do |exception, tries| - next unless exception.kind_of?(AuthorizationError) - if can_refresh - begin - logger.debug("Attempting refresh of access token & retry of request") - authorization.fetch_access_token! - next - rescue Signet::AuthorizationError - end - end - raise exception - end - end - - ## - # Returns on proc for special processing of retries as not all client errors - # are recoverable. Only 401s should be retried (via authorization_error_handler) - # - # @return [Proc] - def client_error_handler - Proc.new do |exception, tries| - raise exception if exception.kind_of?(ClientError) - end - end - - end - -end diff --git a/lib/google/api_client/auth/compute_service_account.rb b/lib/google/api_client/auth/compute_service_account.rb deleted file mode 100644 index 118f1e6eb..000000000 --- a/lib/google/api_client/auth/compute_service_account.rb +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'faraday' -require 'signet/oauth_2/client' - -module Google - class APIClient - class ComputeServiceAccount < Signet::OAuth2::Client - def fetch_access_token(options={}) - connection = options[:connection] || Faraday.default_connection - response = connection.get 'http://metadata/computeMetadata/v1beta1/instance/service-accounts/default/token' - Signet::OAuth2.parse_credentials(response.body, response.headers['content-type']) - end - end - end -end diff --git a/lib/google/api_client/auth/file_storage.rb b/lib/google/api_client/auth/file_storage.rb deleted file mode 100644 index b3d017166..000000000 --- a/lib/google/api_client/auth/file_storage.rb +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'signet/oauth_2/client' -require_relative 'storage' -require_relative 'storages/file_store' - -module Google - class APIClient - - ## - # Represents cached OAuth 2 tokens stored on local disk in a - # JSON serialized file. Meant to resemble the serialized format - # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.file.Storage-class.html - # - # @deprecated - # Use {Google::APIClient::Storage} and {Google::APIClient::FileStore} instead - # - class FileStorage - - attr_accessor :storage - - def initialize(path) - store = Google::APIClient::FileStore.new(path) - @storage = Google::APIClient::Storage.new(store) - @storage.authorize - end - - def load_credentials - storage.authorize - end - - def authorization - storage.authorization - end - - ## - # Write the credentials to the specified file. - # - # @param [Signet::OAuth2::Client] authorization - # Optional authorization instance. If not provided, the authorization - # already associated with this instance will be written. - def write_credentials(auth=nil) - storage.write_credentials(auth) - end - end - end -end diff --git a/lib/google/api_client/auth/installed_app.rb b/lib/google/api_client/auth/installed_app.rb deleted file mode 100644 index bdbb655d5..000000000 --- a/lib/google/api_client/auth/installed_app.rb +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'webrick' -require 'launchy' - -module Google - class APIClient - - # Small helper for the sample apps for performing OAuth 2.0 flows from the command - # line or in any other installed app environment. - # - # @example - # - # client = Google::APIClient.new - # flow = Google::APIClient::InstalledAppFlow.new( - # :client_id => '691380668085.apps.googleusercontent.com', - # :client_secret => '...', - # :scope => 'https://www.googleapis.com/auth/drive' - # ) - # client.authorization = flow.authorize - # - class InstalledAppFlow - - RESPONSE_BODY = <<-HTML - - - - - You may close this window. - - HTML - - ## - # Configure the flow - # - # @param [Hash] options The configuration parameters for the client. - # @option options [Fixnum] :port - # Port to run the embedded server on. Defaults to 9292 - # @option options [String] :client_id - # A unique identifier issued to the client to identify itself to the - # authorization server. - # @option options [String] :client_secret - # A shared symmetric secret issued by the authorization server, - # which is used to authenticate the client. - # @option options [String] :scope - # The scope of the access request, expressed either as an Array - # or as a space-delimited String. - # - # @see Signet::OAuth2::Client - def initialize(options) - @port = options[:port] || 9292 - @authorization = Signet::OAuth2::Client.new({ - :authorization_uri => 'https://accounts.google.com/o/oauth2/auth', - :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', - :redirect_uri => "http://localhost:#{@port}/"}.update(options) - ) - end - - ## - # Request authorization. Opens a browser and waits for response. - # - # @param [Google::APIClient::Storage] storage - # Optional object that responds to :write_credentials, used to serialize - # the OAuth 2 credentials after completing the flow. - # - # @return [Signet::OAuth2::Client] - # Authorization instance, nil if user cancelled. - def authorize(storage=nil) - auth = @authorization - - server = WEBrick::HTTPServer.new( - :Port => @port, - :BindAddress =>"localhost", - :Logger => WEBrick::Log.new(STDOUT, 0), - :AccessLog => [] - ) - begin - trap("INT") { server.shutdown } - - server.mount_proc '/' do |req, res| - auth.code = req.query['code'] - if auth.code - auth.fetch_access_token! - end - res.status = WEBrick::HTTPStatus::RC_ACCEPTED - res.body = RESPONSE_BODY - server.stop - end - - Launchy.open(auth.authorization_uri.to_s) - server.start - ensure - server.shutdown - end - if @authorization.access_token - if storage.respond_to?(:write_credentials) - storage.write_credentials(@authorization) - end - return @authorization - else - return nil - end - end - end - - end -end - diff --git a/lib/google/api_client/auth/jwt_asserter.rb b/lib/google/api_client/auth/jwt_asserter.rb deleted file mode 100644 index 35ad6ec8e..000000000 --- a/lib/google/api_client/auth/jwt_asserter.rb +++ /dev/null @@ -1,126 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'jwt' -require 'signet/oauth_2/client' -require 'delegate' - -module Google - class APIClient - ## - # Generates access tokens using the JWT assertion profile. Requires a - # service account & access to the private key. - # - # @example Using Signet - # - # key = Google::APIClient::KeyUtils.load_from_pkcs12('client.p12', 'notasecret') - # client.authorization = Signet::OAuth2::Client.new( - # :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', - # :audience => 'https://accounts.google.com/o/oauth2/token', - # :scope => 'https://www.googleapis.com/auth/prediction', - # :issuer => '123456-abcdef@developer.gserviceaccount.com', - # :signing_key => key) - # client.authorization.fetch_access_token! - # client.execute(...) - # - # @deprecated - # Service accounts are now supported directly in Signet - # @see https://developers.google.com/accounts/docs/OAuth2ServiceAccount - class JWTAsserter - # @return [String] ID/email of the issuing party - attr_accessor :issuer - # @return [Fixnum] How long, in seconds, the assertion is valid for - attr_accessor :expiry - # @return [Fixnum] Seconds to expand the issued at/expiry window to account for clock skew - attr_accessor :skew - # @return [String] Scopes to authorize - attr_reader :scope - # @return [String,OpenSSL::PKey] key for signing assertions - attr_writer :key - # @return [String] Algorithm used for signing - attr_accessor :algorithm - - ## - # Initializes the asserter for a service account. - # - # @param [String] issuer - # Name/ID of the client issuing the assertion - # @param [String, Array] scope - # Scopes to authorize. May be a space delimited string or array of strings - # @param [String,OpenSSL::PKey] key - # Key for signing assertions - # @param [String] algorithm - # Algorithm to use, either 'RS256' for RSA with SHA-256 - # or 'HS256' for HMAC with SHA-256 - def initialize(issuer, scope, key, algorithm = "RS256") - self.issuer = issuer - self.scope = scope - self.expiry = 60 # 1 min default - self.skew = 60 - self.key = key - self.algorithm = algorithm - end - - ## - # Set the scopes to authorize - # - # @param [String, Array] new_scope - # Scopes to authorize. May be a space delimited string or array of strings - def scope=(new_scope) - case new_scope - when Array - @scope = new_scope.join(' ') - when String - @scope = new_scope - when nil - @scope = '' - else - raise TypeError, "Expected Array or String, got #{new_scope.class}" - end - end - - ## - # Request a new access token. - # - # @param [String] person - # Email address of a user, if requesting a token to act on their behalf - # @param [Hash] options - # Pass through to Signet::OAuth2::Client.fetch_access_token - # @return [Signet::OAuth2::Client] Access token - # - # @see Signet::OAuth2::Client.fetch_access_token! - def authorize(person = nil, options={}) - authorization = self.to_authorization(person) - authorization.fetch_access_token!(options) - return authorization - end - - ## - # Builds a Signet OAuth2 client - # - # @return [Signet::OAuth2::Client] Access token - def to_authorization(person = nil) - return Signet::OAuth2::Client.new( - :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', - :audience => 'https://accounts.google.com/o/oauth2/token', - :scope => self.scope, - :issuer => @issuer, - :signing_key => @key, - :signing_algorithm => @algorithm, - :person => person - ) - end - end - end -end diff --git a/lib/google/api_client/auth/key_utils.rb b/lib/google/api_client/auth/key_utils.rb deleted file mode 100644 index 6b6e0cfe5..000000000 --- a/lib/google/api_client/auth/key_utils.rb +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -module Google - class APIClient - ## - # Helper for loading keys from the PKCS12 files downloaded when - # setting up service accounts at the APIs Console. - # - module KeyUtils - ## - # Loads a key from PKCS12 file, assuming a single private key - # is present. - # - # @param [String] keyfile - # Path of the PKCS12 file to load. If not a path to an actual file, - # assumes the string is the content of the file itself. - # @param [String] passphrase - # Passphrase for unlocking the private key - # - # @return [OpenSSL::PKey] The private key for signing assertions. - def self.load_from_pkcs12(keyfile, passphrase) - load_key(keyfile, passphrase) do |content, pass_phrase| - OpenSSL::PKCS12.new(content, pass_phrase).key - end - end - - - ## - # Loads a key from a PEM file. - # - # @param [String] keyfile - # Path of the PEM file to load. If not a path to an actual file, - # assumes the string is the content of the file itself. - # @param [String] passphrase - # Passphrase for unlocking the private key - # - # @return [OpenSSL::PKey] The private key for signing assertions. - # - def self.load_from_pem(keyfile, passphrase) - load_key(keyfile, passphrase) do | content, pass_phrase| - OpenSSL::PKey::RSA.new(content, pass_phrase) - end - end - - private - - ## - # Helper for loading keys from file or memory. Accepts a block - # to handle the specific file format. - # - # @param [String] keyfile - # Path of thefile to load. If not a path to an actual file, - # assumes the string is the content of the file itself. - # @param [String] passphrase - # Passphrase for unlocking the private key - # - # @yield [String, String] - # Key file & passphrase to extract key from - # @yieldparam [String] keyfile - # Contents of the file - # @yieldparam [String] passphrase - # Passphrase to unlock key - # @yieldreturn [OpenSSL::PKey] - # Private key - # - # @return [OpenSSL::PKey] The private key for signing assertions. - def self.load_key(keyfile, passphrase, &block) - begin - begin - content = File.open(keyfile, 'rb') { |io| io.read } - rescue - content = keyfile - end - block.call(content, passphrase) - rescue OpenSSL::OpenSSLError - raise ArgumentError.new("Invalid keyfile or passphrase") - end - end - end - end -end diff --git a/lib/google/api_client/auth/pkcs12.rb b/lib/google/api_client/auth/pkcs12.rb deleted file mode 100644 index 94c43185d..000000000 --- a/lib/google/api_client/auth/pkcs12.rb +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'google/api_client/auth/key_utils' -module Google - class APIClient - ## - # Helper for loading keys from the PKCS12 files downloaded when - # setting up service accounts at the APIs Console. - # - module PKCS12 - ## - # Loads a key from PKCS12 file, assuming a single private key - # is present. - # - # @param [String] keyfile - # Path of the PKCS12 file to load. If not a path to an actual file, - # assumes the string is the content of the file itself. - # @param [String] passphrase - # Passphrase for unlocking the private key - # - # @return [OpenSSL::PKey] The private key for signing assertions. - # @deprecated - # Use {Google::APIClient::KeyUtils} instead - def self.load_key(keyfile, passphrase) - KeyUtils.load_from_pkcs12(keyfile, passphrase) - end - end - end -end diff --git a/lib/google/api_client/auth/storage.rb b/lib/google/api_client/auth/storage.rb deleted file mode 100644 index c762316e7..000000000 --- a/lib/google/api_client/auth/storage.rb +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'signet/oauth_2/client' - -module Google - class APIClient - ## - # Represents cached OAuth 2 tokens stored on local disk in a - # JSON serialized file. Meant to resemble the serialized format - # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.file.Storage-class.html - # - class Storage - - AUTHORIZATION_URI = 'https://accounts.google.com/o/oauth2/auth' - TOKEN_CREDENTIAL_URI = 'https://accounts.google.com/o/oauth2/token' - - # @return [Object] Storage object. - attr_accessor :store - - # @return [Signet::OAuth2::Client] - attr_reader :authorization - - ## - # Initializes the Storage object. - # - # @params [Object] Storage object - def initialize(store) - @store= store - @authorization = nil - end - - ## - # Write the credentials to the specified store. - # - # @params [Signet::OAuth2::Client] authorization - # Optional authorization instance. If not provided, the authorization - # already associated with this instance will be written. - def write_credentials(authorization=nil) - @authorization = authorization if authorization - if @authorization.respond_to?(:refresh_token) && @authorization.refresh_token - store.write_credentials(credentials_hash) - end - end - - ## - # Loads credentials and authorizes an client. - # @return [Object] Signet::OAuth2::Client or NIL - def authorize - @authorization = nil - cached_credentials = load_credentials - if cached_credentials && cached_credentials.size > 0 - @authorization = Signet::OAuth2::Client.new(cached_credentials) - @authorization.issued_at = Time.at(cached_credentials['issued_at'].to_i) - self.refresh_authorization if @authorization.expired? - end - return @authorization - end - - ## - # refresh credentials and save them to store - def refresh_authorization - authorization.refresh! - self.write_credentials - end - - private - - ## - # Attempt to read in credentials from the specified store. - def load_credentials - store.load_credentials - end - - ## - # @return [Hash] with credentials - def credentials_hash - { - :access_token => authorization.access_token, - :authorization_uri => AUTHORIZATION_URI, - :client_id => authorization.client_id, - :client_secret => authorization.client_secret, - :expires_in => authorization.expires_in, - :refresh_token => authorization.refresh_token, - :token_credential_uri => TOKEN_CREDENTIAL_URI, - :issued_at => authorization.issued_at.to_i - } - end - end - end -end diff --git a/lib/google/api_client/auth/storages/file_store.rb b/lib/google/api_client/auth/storages/file_store.rb deleted file mode 100644 index cd3eae710..000000000 --- a/lib/google/api_client/auth/storages/file_store.rb +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'json' - -module Google - class APIClient - ## - # Represents cached OAuth 2 tokens stored on local disk in a - # JSON serialized file. Meant to resemble the serialized format - # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.file.Storage-class.html - # - class FileStore - - attr_accessor :path - - ## - # Initializes the FileStorage object. - # - # @param [String] path - # Path to the credentials file. - def initialize(path) - @path= path - end - - ## - # Attempt to read in credentials from the specified file. - def load_credentials - open(path, 'r') { |f| JSON.parse(f.read) } - rescue - nil - end - - ## - # Write the credentials to the specified file. - # - # @param [Signet::OAuth2::Client] authorization - # Optional authorization instance. If not provided, the authorization - # already associated with this instance will be written. - def write_credentials(credentials_hash) - open(self.path, 'w+') do |f| - f.write(credentials_hash.to_json) - end - end - end - end -end diff --git a/lib/google/api_client/auth/storages/redis_store.rb b/lib/google/api_client/auth/storages/redis_store.rb deleted file mode 100644 index 3f76f7ca8..000000000 --- a/lib/google/api_client/auth/storages/redis_store.rb +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'json' - -module Google - class APIClient - class RedisStore - - DEFAULT_REDIS_CREDENTIALS_KEY = "google_api_credentials" - - attr_accessor :redis - - ## - # Initializes the RedisStore object. - # - # @params [Object] Redis instance - def initialize(redis, key = nil) - @redis= redis - @redis_credentials_key = key - end - - ## - # Attempt to read in credentials from redis. - def load_credentials - credentials = redis.get redis_credentials_key - JSON.parse(credentials) if credentials - end - - def redis_credentials_key - @redis_credentials_key || DEFAULT_REDIS_CREDENTIALS_KEY - end - - ## - # Write the credentials to redis. - # - # @params [Hash] credentials - def write_credentials(credentials_hash) - redis.set(redis_credentials_key, credentials_hash.to_json) - end - end - end -end diff --git a/lib/google/api_client/batch.rb b/lib/google/api_client/batch.rb deleted file mode 100644 index 45a2e3104..000000000 --- a/lib/google/api_client/batch.rb +++ /dev/null @@ -1,326 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'addressable/uri' -require 'google/api_client/reference' -require 'securerandom' - -module Google - class APIClient - - ## - # Helper class to contain a response to an individual batched call. - # - # @api private - class BatchedCallResponse - # @return [String] UUID of the call - attr_reader :call_id - # @return [Fixnum] HTTP status code - attr_accessor :status - # @return [Hash] HTTP response headers - attr_accessor :headers - # @return [String] HTTP response body - attr_accessor :body - - ## - # Initialize the call response - # - # @param [String] call_id - # UUID of the original call - # @param [Fixnum] status - # HTTP status - # @param [Hash] headers - # HTTP response headers - # @param [#read, #to_str] body - # Response body - def initialize(call_id, status = nil, headers = nil, body = nil) - @call_id, @status, @headers, @body = call_id, status, headers, body - end - end - - # Wraps multiple API calls into a single over-the-wire HTTP request. - # - # @example - # - # client = Google::APIClient.new - # urlshortener = client.discovered_api('urlshortener') - # batch = Google::APIClient::BatchRequest.new do |result| - # puts result.data - # end - # - # batch.add(:api_method => urlshortener.url.insert, :body_object => { 'longUrl' => 'http://example.com/foo' }) - # batch.add(:api_method => urlshortener.url.insert, :body_object => { 'longUrl' => 'http://example.com/bar' }) - # - # client.execute(batch) - # - class BatchRequest < Request - BATCH_BOUNDARY = "-----------RubyApiBatchRequest".freeze - - # @api private - # @return [Array<(String,Google::APIClient::Request,Proc)] List of API calls in the batch - attr_reader :calls - - ## - # Creates a new batch request. - # - # @param [Hash] options - # Set of options for this request. - # @param [Proc] block - # Callback for every call's response. Won't be called if a call defined - # a callback of its own. - # - # @return [Google::APIClient::BatchRequest] - # The constructed object. - # - # @yield [Google::APIClient::Result] - # block to be called when result ready - def initialize(options = {}, &block) - @calls = [] - @global_callback = nil - @global_callback = block if block_given? - @last_auto_id = 0 - - @base_id = SecureRandom.uuid - - options[:uri] ||= 'https://www.googleapis.com/batch' - options[:http_method] ||= 'POST' - - super options - end - - ## - # Add a new call to the batch request. - # Each call must have its own call ID; if not provided, one will - # automatically be generated, avoiding collisions. If duplicate call IDs - # are provided, an error will be thrown. - # - # @param [Hash, Google::APIClient::Request] call - # the call to be added. - # @param [String] call_id - # the ID to be used for this call. Must be unique - # @param [Proc] block - # callback for this call's response. - # - # @return [Google::APIClient::BatchRequest] - # the BatchRequest, for chaining - # - # @yield [Google::APIClient::Result] - # block to be called when result ready - def add(call, call_id = nil, &block) - unless call.kind_of?(Google::APIClient::Reference) - call = Google::APIClient::Reference.new(call) - end - call_id ||= new_id - if @calls.assoc(call_id) - raise BatchError, - 'A call with this ID already exists: %s' % call_id - end - callback = block_given? ? block : @global_callback - @calls << [call_id, call, callback] - return self - end - - ## - # Processes the HTTP response to the batch request, issuing callbacks. - # - # @api private - # - # @param [Faraday::Response] response - # the HTTP response. - def process_http_response(response) - content_type = find_header('Content-Type', response.headers) - m = /.*boundary=(.+)/.match(content_type) - if m - boundary = m[1] - parts = response.body.split(/--#{Regexp.escape(boundary)}/) - parts = parts[1...-1] - parts.each do |part| - call_response = deserialize_call_response(part) - _, call, callback = @calls.assoc(call_response.call_id) - result = Google::APIClient::Result.new(call, call_response) - callback.call(result) if callback - end - end - Google::APIClient::Result.new(self, response) - end - - ## - # Return the request body for the BatchRequest's HTTP request. - # - # @api private - # - # @return [String] - # the request body. - def to_http_request - if @calls.nil? || @calls.empty? - raise BatchError, 'Cannot make an empty batch request' - end - parts = @calls.map {|(call_id, call, _callback)| serialize_call(call_id, call)} - build_multipart(parts, 'multipart/mixed', BATCH_BOUNDARY) - super - end - - - protected - - ## - # Helper method to find a header from its name, regardless of case. - # - # @api private - # - # @param [String] name - # the name of the header to find. - # @param [Hash] headers - # the hash of headers and their values. - # - # @return [String] - # the value of the desired header. - def find_header(name, headers) - _, header = headers.detect do |h, v| - h.downcase == name.downcase - end - return header - end - - ## - # Create a new call ID. Uses an auto-incrementing, conflict-avoiding ID. - # - # @api private - # - # @return [String] - # the new, unique ID. - def new_id - @last_auto_id += 1 - while @calls.assoc(@last_auto_id) - @last_auto_id += 1 - end - return @last_auto_id.to_s - end - - ## - # Convert a Content-ID header value to an id. Presumes the Content-ID - # header conforms to the format that id_to_header() returns. - # - # @api private - # - # @param [String] header - # Content-ID header value. - # - # @return [String] - # The extracted ID value. - def header_to_id(header) - if !header.start_with?('<') || !header.end_with?('>') || - !header.include?('+') - raise BatchError, 'Invalid value for Content-ID: "%s"' % header - end - - _base, call_id = header[1...-1].split('+') - return Addressable::URI.unencode(call_id) - end - - ## - # Auxiliary method to split the headers from the body in an HTTP response. - # - # @api private - # - # @param [String] response - # the response to parse. - # - # @return [Array, String] - # the headers and the body, separately. - def split_headers_and_body(response) - headers = {} - payload = response.lstrip - while payload - line, payload = payload.split("\n", 2) - line.sub!(/\s+\z/, '') - break if line.empty? - match = /\A([^:]+):\s*/.match(line) - if match - headers[match[1]] = match.post_match - else - raise BatchError, 'Invalid header line in response: %s' % line - end - end - return headers, payload - end - - ## - # Convert a single batched response into a BatchedCallResponse object. - # - # @api private - # - # @param [String] call_response - # the request to deserialize. - # - # @return [Google::APIClient::BatchedCallResponse] - # the parsed and converted response. - def deserialize_call_response(call_response) - outer_headers, outer_body = split_headers_and_body(call_response) - status_line, payload = outer_body.split("\n", 2) - _protocol, status, _reason = status_line.split(' ', 3) - - headers, body = split_headers_and_body(payload) - content_id = find_header('Content-ID', outer_headers) - call_id = header_to_id(content_id) - return BatchedCallResponse.new(call_id, status.to_i, headers, body) - end - - ## - # Serialize a single batched call for assembling the multipart message - # - # @api private - # - # @param [Google::APIClient::Request] call - # the call to serialize. - # - # @return [Faraday::UploadIO] - # the serialized request - def serialize_call(call_id, call) - method, uri, headers, body = call.to_http_request - request = "#{method.to_s.upcase} #{Addressable::URI.parse(uri).request_uri} HTTP/1.1" - headers.each do |header, value| - request << "\r\n%s: %s" % [header, value] - end - if body - # TODO - CompositeIO if body is a stream - request << "\r\n\r\n" - if body.respond_to?(:read) - request << body.read - else - request << body.to_s - end - end - Faraday::UploadIO.new(StringIO.new(request), 'application/http', 'ruby-api-request', 'Content-ID' => id_to_header(call_id)) - end - - ## - # Convert an id to a Content-ID header value. - # - # @api private - # - # @param [String] call_id - # identifier of individual call. - # - # @return [String] - # A Content-ID header with the call_id encoded into it. A UUID is - # prepended to the value because Content-ID headers are supposed to be - # universally unique. - def id_to_header(call_id) - return '<%s+%s>' % [@base_id, Addressable::URI.encode(call_id)] - end - - end - end -end \ No newline at end of file diff --git a/lib/google/api_client/charset.rb b/lib/google/api_client/charset.rb deleted file mode 100644 index 47b11ba84..000000000 --- a/lib/google/api_client/charset.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'faraday' -require 'zlib' - -module Google - class APIClient - class Charset < Faraday::Response::Middleware - include Google::APIClient::Logging - - def charset_for_content_type(type) - if type - m = type.match(/(?:charset|encoding)="?([a-z0-9-]+)"?/i) - if m - return Encoding.find(m[1]) - end - end - nil - end - - def adjust_encoding(env) - charset = charset_for_content_type(env[:response_headers]['content-type']) - if charset && env[:body].encoding != charset - env[:body].force_encoding(charset) - end - end - - def on_complete(env) - adjust_encoding(env) - end - end - end -end - -Faraday::Response.register_middleware :charset => Google::APIClient::Charset \ No newline at end of file diff --git a/lib/google/api_client/client_secrets.rb b/lib/google/api_client/client_secrets.rb deleted file mode 100644 index a9cc24138..000000000 --- a/lib/google/api_client/client_secrets.rb +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'compat/multi_json' - - -module Google - class APIClient - ## - # Manages the persistence of client configuration data and secrets. Format - # inspired by the Google API Python client. - # - # @see https://developers.google.com/api-client-library/python/guide/aaa_client_secrets - # - # @example - # { - # "web": { - # "client_id": "asdfjasdljfasdkjf", - # "client_secret": "1912308409123890", - # "redirect_uris": ["https://www.example.com/oauth2callback"], - # "auth_uri": "https://accounts.google.com/o/oauth2/auth", - # "token_uri": "https://accounts.google.com/o/oauth2/token" - # } - # } - # - # @example - # { - # "installed": { - # "client_id": "837647042410-75ifg...usercontent.com", - # "client_secret":"asdlkfjaskd", - # "redirect_uris": ["http://localhost", "urn:ietf:oauth:2.0:oob"], - # "auth_uri": "https://accounts.google.com/o/oauth2/auth", - # "token_uri": "https://accounts.google.com/o/oauth2/token" - # } - # } - class ClientSecrets - - ## - # Reads client configuration from a file - # - # @param [String] filename - # Path to file to load - # - # @return [Google::APIClient::ClientSecrets] - # OAuth client settings - def self.load(filename=nil) - if filename && File.directory?(filename) - search_path = File.expand_path(filename) - filename = nil - end - while filename == nil - search_path ||= File.expand_path('.') - if File.exists?(File.join(search_path, 'client_secrets.json')) - filename = File.join(search_path, 'client_secrets.json') - elsif search_path == '/' || search_path =~ /[a-zA-Z]:[\/\\]/ - raise ArgumentError, - 'No client_secrets.json filename supplied ' + - 'and/or could not be found in search path.' - else - search_path = File.expand_path(File.join(search_path, '..')) - end - end - data = File.open(filename, 'r') { |file| MultiJson.load(file.read) } - return self.new(data) - end - - ## - # Intialize OAuth client settings. - # - # @param [Hash] options - # Parsed client secrets files - def initialize(options={}) - # Client auth configuration - @flow = options[:flow] || options.keys.first.to_s || 'web' - fdata = options[@flow] - @client_id = fdata[:client_id] || fdata["client_id"] - @client_secret = fdata[:client_secret] || fdata["client_secret"] - @redirect_uris = fdata[:redirect_uris] || fdata["redirect_uris"] - @redirect_uris ||= [fdata[:redirect_uri] || fdata["redirect_uri"]].compact - @javascript_origins = ( - fdata[:javascript_origins] || - fdata["javascript_origins"] - ) - @javascript_origins ||= [fdata[:javascript_origin] || fdata["javascript_origin"]].compact - @authorization_uri = fdata[:auth_uri] || fdata["auth_uri"] - @authorization_uri ||= fdata[:authorization_uri] - @token_credential_uri = fdata[:token_uri] || fdata["token_uri"] - @token_credential_uri ||= fdata[:token_credential_uri] - - # Associated token info - @access_token = fdata[:access_token] || fdata["access_token"] - @refresh_token = fdata[:refresh_token] || fdata["refresh_token"] - @id_token = fdata[:id_token] || fdata["id_token"] - @expires_in = fdata[:expires_in] || fdata["expires_in"] - @expires_at = fdata[:expires_at] || fdata["expires_at"] - @issued_at = fdata[:issued_at] || fdata["issued_at"] - end - - attr_reader( - :flow, :client_id, :client_secret, :redirect_uris, :javascript_origins, - :authorization_uri, :token_credential_uri, :access_token, - :refresh_token, :id_token, :expires_in, :expires_at, :issued_at - ) - - ## - # Serialize back to the original JSON form - # - # @return [String] - # JSON - def to_json - return MultiJson.dump(to_hash) - end - - def to_hash - { - self.flow => ({ - 'client_id' => self.client_id, - 'client_secret' => self.client_secret, - 'redirect_uris' => self.redirect_uris, - 'javascript_origins' => self.javascript_origins, - 'auth_uri' => self.authorization_uri, - 'token_uri' => self.token_credential_uri, - 'access_token' => self.access_token, - 'refresh_token' => self.refresh_token, - 'id_token' => self.id_token, - 'expires_in' => self.expires_in, - 'expires_at' => self.expires_at, - 'issued_at' => self.issued_at - }).inject({}) do |accu, (k, v)| - # Prunes empty values from JSON output. - unless v == nil || (v.respond_to?(:empty?) && v.empty?) - accu[k] = v - end - accu - end - } - end - - def to_authorization - gem 'signet', '>= 0.4.0' - require 'signet/oauth_2/client' - # NOTE: Do not rely on this default value, as it may change - new_authorization = Signet::OAuth2::Client.new - new_authorization.client_id = self.client_id - new_authorization.client_secret = self.client_secret - new_authorization.authorization_uri = ( - self.authorization_uri || - 'https://accounts.google.com/o/oauth2/auth' - ) - new_authorization.token_credential_uri = ( - self.token_credential_uri || - 'https://accounts.google.com/o/oauth2/token' - ) - new_authorization.redirect_uri = self.redirect_uris.first - - # These are supported, but unlikely. - new_authorization.access_token = self.access_token - new_authorization.refresh_token = self.refresh_token - new_authorization.id_token = self.id_token - new_authorization.expires_in = self.expires_in - new_authorization.issued_at = self.issued_at if self.issued_at - new_authorization.expires_at = self.expires_at if self.expires_at - return new_authorization - end - end - end -end diff --git a/lib/google/api_client/discovery.rb b/lib/google/api_client/discovery.rb deleted file mode 100644 index bb01d67ce..000000000 --- a/lib/google/api_client/discovery.rb +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'google/api_client/discovery/api' -require 'google/api_client/discovery/resource' -require 'google/api_client/discovery/method' -require 'google/api_client/discovery/schema' diff --git a/lib/google/api_client/discovery/api.rb b/lib/google/api_client/discovery/api.rb deleted file mode 100644 index 3bbc90da3..000000000 --- a/lib/google/api_client/discovery/api.rb +++ /dev/null @@ -1,310 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'addressable/uri' -require 'multi_json' -require 'active_support/inflector' -require 'google/api_client/discovery/resource' -require 'google/api_client/discovery/method' -require 'google/api_client/discovery/media' - -module Google - class APIClient - ## - # A service that has been described by a discovery document. - class API - - ## - # Creates a description of a particular version of a service. - # - # @param [String] document_base - # Base URI for the discovery document. - # @param [Hash] discovery_document - # The section of the discovery document that applies to this service - # version. - # - # @return [Google::APIClient::API] The constructed service object. - def initialize(document_base, discovery_document) - @document_base = Addressable::URI.parse(document_base) - @discovery_document = discovery_document - metaclass = (class << self; self; end) - self.discovered_resources.each do |resource| - method_name = ActiveSupport::Inflector.underscore(resource.name).to_sym - if !self.respond_to?(method_name) - metaclass.send(:define_method, method_name) { resource } - end - end - self.discovered_methods.each do |method| - method_name = ActiveSupport::Inflector.underscore(method.name).to_sym - if !self.respond_to?(method_name) - metaclass.send(:define_method, method_name) { method } - end - end - end - - # @return [String] unparsed discovery document for the API - attr_reader :discovery_document - - ## - # Returns the id of the service. - # - # @return [String] The service id. - def id - return ( - @discovery_document['id'] || - "#{self.name}:#{self.version}" - ) - end - - ## - # Returns the identifier for the service. - # - # @return [String] The service identifier. - def name - return @discovery_document['name'] - end - - ## - # Returns the version of the service. - # - # @return [String] The service version. - def version - return @discovery_document['version'] - end - - ## - # Returns a human-readable title for the API. - # - # @return [Hash] The API title. - def title - return @discovery_document['title'] - end - - ## - # Returns a human-readable description of the API. - # - # @return [Hash] The API description. - def description - return @discovery_document['description'] - end - - ## - # Returns a URI for the API documentation. - # - # @return [Hash] The API documentation. - def documentation - return Addressable::URI.parse(@discovery_document['documentationLink']) - end - - ## - # Returns true if this is the preferred version of this API. - # - # @return [TrueClass, FalseClass] - # Whether or not this is the preferred version of this API. - def preferred - return !!@discovery_document['preferred'] - end - - ## - # Returns the list of API features. - # - # @return [Array] - # The features supported by this API. - def features - return @discovery_document['features'] || [] - end - - ## - # Returns the root URI for this service. - # - # @return [Addressable::URI] The root URI. - def root_uri - return @root_uri ||= ( - Addressable::URI.parse(self.discovery_document['rootUrl']) - ) - end - - ## - # Returns true if this API uses a data wrapper. - # - # @return [TrueClass, FalseClass] - # Whether or not this API uses a data wrapper. - def data_wrapper? - return self.features.include?('dataWrapper') - end - - ## - # Returns the base URI for the discovery document. - # - # @return [Addressable::URI] The base URI. - attr_reader :document_base - - ## - # Returns the base URI for this version of the service. - # - # @return [Addressable::URI] The base URI that methods are joined to. - def method_base - if @discovery_document['basePath'] - return @method_base ||= ( - self.root_uri.join(Addressable::URI.parse(@discovery_document['basePath'])) - ).normalize - else - return nil - end - end - - ## - # Updates the hierarchy of resources and methods with the new base. - # - # @param [Addressable::URI, #to_str, String] new_method_base - # The new base URI to use for the service. - def method_base=(new_method_base) - @method_base = Addressable::URI.parse(new_method_base) - self.discovered_resources.each do |resource| - resource.method_base = @method_base - end - self.discovered_methods.each do |method| - method.method_base = @method_base - end - end - - ## - # Returns the base URI for batch calls to this service. - # - # @return [Addressable::URI] The base URI that methods are joined to. - def batch_path - if @discovery_document['batchPath'] - return @batch_path ||= ( - self.document_base.join(Addressable::URI.parse('/' + - @discovery_document['batchPath'])) - ).normalize - else - return nil - end - end - - ## - # A list of schemas available for this version of the API. - # - # @return [Hash] A list of {Google::APIClient::Schema} objects. - def schemas - return @schemas ||= ( - (@discovery_document['schemas'] || []).inject({}) do |accu, (k, v)| - accu[k] = Google::APIClient::Schema.parse(self, v) - accu - end - ) - end - - ## - # Returns a schema for a kind value. - # - # @return [Google::APIClient::Schema] The associated Schema object. - def schema_for_kind(kind) - api_name, schema_name = kind.split('#', 2) - if api_name != self.name - raise ArgumentError, - "The kind does not match this API. " + - "Expected '#{self.name}', got '#{api_name}'." - end - for k, v in self.schemas - return v if k.downcase == schema_name.downcase - end - return nil - end - - ## - # A list of resources available at the root level of this version of the - # API. - # - # @return [Array] A list of {Google::APIClient::Resource} objects. - def discovered_resources - return @discovered_resources ||= ( - (@discovery_document['resources'] || []).inject([]) do |accu, (k, v)| - accu << Google::APIClient::Resource.new( - self, self.method_base, k, v - ) - accu - end - ) - end - - ## - # A list of methods available at the root level of this version of the - # API. - # - # @return [Array] A list of {Google::APIClient::Method} objects. - def discovered_methods - return @discovered_methods ||= ( - (@discovery_document['methods'] || []).inject([]) do |accu, (k, v)| - accu << Google::APIClient::Method.new(self, self.method_base, k, v) - accu - end - ) - end - - ## - # Allows deep inspection of the discovery document. - def [](key) - return @discovery_document[key] - end - - ## - # Converts the service to a flat mapping of RPC names and method objects. - # - # @return [Hash] All methods available on the service. - # - # @example - # # Discover available methods - # method_names = client.discovered_api('buzz').to_h.keys - def to_h - return @hash ||= (begin - methods_hash = {} - self.discovered_methods.each do |method| - methods_hash[method.id] = method - end - self.discovered_resources.each do |resource| - methods_hash.merge!(resource.to_h) - end - methods_hash - end) - end - - ## - # Returns a String representation of the service's state. - # - # @return [String] The service's state, as a String. - def inspect - sprintf( - "#<%s:%#0x ID:%s>", self.class.to_s, self.object_id, self.id - ) - end - - ## - # Marshalling support - serialize the API to a string (doc base + original - # discovery document). - def _dump(level) - MultiJson.dump([@document_base.to_s, @discovery_document]) - end - - ## - # Marshalling support - Restore an API instance from serialized form - def self._load(obj) - new(*MultiJson.load(obj)) - end - - end - end -end diff --git a/lib/google/api_client/discovery/media.rb b/lib/google/api_client/discovery/media.rb deleted file mode 100644 index ffa7e87c3..000000000 --- a/lib/google/api_client/discovery/media.rb +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'addressable/uri' -require 'addressable/template' - -require 'google/api_client/errors' - - -module Google - class APIClient - ## - # Media upload elements for discovered methods - class MediaUpload - - ## - # Creates a description of a particular method. - # - # @param [Google::APIClient::API] api - # Base discovery document for the API - # @param [Addressable::URI] method_base - # The base URI for the service. - # @param [Hash] discovery_document - # The media upload section of the discovery document. - # - # @return [Google::APIClient::Method] The constructed method object. - def initialize(api, method_base, discovery_document) - @api = api - @method_base = method_base - @discovery_document = discovery_document - end - - ## - # List of acceptable mime types - # - # @return [Array] - # List of acceptable mime types for uploaded content - def accepted_types - @discovery_document['accept'] - end - - ## - # Maximum size of an uplad - # TODO: Parse & convert to numeric value - # - # @return [String] - def max_size - @discovery_document['maxSize'] - end - - ## - # Returns the URI template for the method. A parameter list can be - # used to expand this into a URI. - # - # @return [Addressable::Template] The URI template. - def uri_template - return @uri_template ||= Addressable::Template.new( - @api.method_base.join(Addressable::URI.parse(@discovery_document['protocols']['simple']['path'])) - ) - end - - end - - end -end diff --git a/lib/google/api_client/discovery/method.rb b/lib/google/api_client/discovery/method.rb deleted file mode 100644 index 3a06857c0..000000000 --- a/lib/google/api_client/discovery/method.rb +++ /dev/null @@ -1,363 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'addressable/uri' -require 'addressable/template' - -require 'google/api_client/errors' - - -module Google - class APIClient - ## - # A method that has been described by a discovery document. - class Method - - ## - # Creates a description of a particular method. - # - # @param [Google::APIClient::API] api - # The API this method belongs to. - # @param [Addressable::URI] method_base - # The base URI for the service. - # @param [String] method_name - # The identifier for the method. - # @param [Hash] discovery_document - # The section of the discovery document that applies to this method. - # - # @return [Google::APIClient::Method] The constructed method object. - def initialize(api, method_base, method_name, discovery_document) - @api = api - @method_base = method_base - @name = method_name - @discovery_document = discovery_document - end - - # @return [String] unparsed discovery document for the method - attr_reader :discovery_document - - ## - # Returns the API this method belongs to. - # - # @return [Google::APIClient::API] The API this method belongs to. - attr_reader :api - - ## - # Returns the identifier for the method. - # - # @return [String] The method identifier. - attr_reader :name - - ## - # Returns the base URI for the method. - # - # @return [Addressable::URI] - # The base URI that this method will be joined to. - attr_reader :method_base - - ## - # Updates the method with the new base. - # - # @param [Addressable::URI, #to_str, String] new_method_base - # The new base URI to use for the method. - def method_base=(new_method_base) - @method_base = Addressable::URI.parse(new_method_base) - @uri_template = nil - end - - ## - # Returns a human-readable description of the method. - # - # @return [Hash] The API description. - def description - return @discovery_document['description'] - end - - ## - # Returns the method ID. - # - # @return [String] The method identifier. - def id - return @discovery_document['id'] - end - - ## - # Returns the HTTP method or 'GET' if none is specified. - # - # @return [String] The HTTP method that will be used in the request. - def http_method - return @discovery_document['httpMethod'] || 'GET' - end - - ## - # Returns the URI template for the method. A parameter list can be - # used to expand this into a URI. - # - # @return [Addressable::Template] The URI template. - def uri_template - return @uri_template ||= Addressable::Template.new( - self.method_base.join(Addressable::URI.parse("./" + @discovery_document['path'])) - ) - end - - ## - # Returns media upload information for this method, if supported - # - # @return [Google::APIClient::MediaUpload] Description of upload endpoints - def media_upload - if @discovery_document['mediaUpload'] - return @media_upload ||= Google::APIClient::MediaUpload.new(self, self.method_base, @discovery_document['mediaUpload']) - else - return nil - end - end - - ## - # Returns the Schema object for the method's request, if any. - # - # @return [Google::APIClient::Schema] The request schema. - def request_schema - if @discovery_document['request'] - schema_name = @discovery_document['request']['$ref'] - return @api.schemas[schema_name] - else - return nil - end - end - - ## - # Returns the Schema object for the method's response, if any. - # - # @return [Google::APIClient::Schema] The response schema. - def response_schema - if @discovery_document['response'] - schema_name = @discovery_document['response']['$ref'] - return @api.schemas[schema_name] - else - return nil - end - end - - ## - # Normalizes parameters, converting to the appropriate types. - # - # @param [Hash, Array] parameters - # The parameters to normalize. - # - # @return [Hash] The normalized parameters. - def normalize_parameters(parameters={}) - # Convert keys to Strings when appropriate - if parameters.kind_of?(Hash) || parameters.kind_of?(Array) - # Returning an array since parameters can be repeated (ie, Adsense Management API) - parameters = parameters.inject([]) do |accu, (k, v)| - k = k.to_s if k.kind_of?(Symbol) - k = k.to_str if k.respond_to?(:to_str) - unless k.kind_of?(String) - raise TypeError, "Expected String, got #{k.class}." - end - accu << [k, v] - accu - end - else - raise TypeError, - "Expected Hash or Array, got #{parameters.class}." - end - return parameters - end - - ## - # Expands the method's URI template using a parameter list. - # - # @api private - # @param [Hash, Array] parameters - # The parameter list to use. - # - # @return [Addressable::URI] The URI after expansion. - def generate_uri(parameters={}) - parameters = self.normalize_parameters(parameters) - - self.validate_parameters(parameters) - template_variables = self.uri_template.variables - upload_type = parameters.assoc('uploadType') || parameters.assoc('upload_type') - if upload_type - unless self.media_upload - raise ArgumentException, "Media upload not supported for this method" - end - case upload_type.last - when 'media', 'multipart', 'resumable' - uri = self.media_upload.uri_template.expand(parameters) - else - raise ArgumentException, "Invalid uploadType '#{upload_type}'" - end - else - uri = self.uri_template.expand(parameters) - end - query_parameters = parameters.reject do |k, v| - template_variables.include?(k) - end - # encode all non-template parameters - params = "" - unless query_parameters.empty? - params = "?" + Addressable::URI.form_encode(query_parameters.sort) - end - # Normalization is necessary because of undesirable percent-escaping - # during URI template expansion - return uri.normalize + params - end - - ## - # Generates an HTTP request for this method. - # - # @api private - # @param [Hash, Array] parameters - # The parameters to send. - # @param [String, StringIO] body The body for the HTTP request. - # @param [Hash, Array] headers The HTTP headers for the request. - # @option options [Faraday::Connection] :connection - # The HTTP connection to use. - # - # @return [Array] The generated HTTP request. - def generate_request(parameters={}, body='', headers={}, options={}) - if !headers.kind_of?(Array) && !headers.kind_of?(Hash) - raise TypeError, "Expected Hash or Array, got #{headers.class}." - end - method = self.http_method.to_s.downcase.to_sym - uri = self.generate_uri(parameters) - headers = Faraday::Utils::Headers.new(headers) - return [method, uri, headers, body] - end - - - ## - # Returns a Hash of the parameter descriptions for - # this method. - # - # @return [Hash] The parameter descriptions. - def parameter_descriptions - @parameter_descriptions ||= ( - @discovery_document['parameters'] || {} - ).inject({}) { |h,(k,v)| h[k]=v; h } - end - - ## - # Returns an Array of the parameters for this method. - # - # @return [Array] The parameters. - def parameters - @parameters ||= (( - @discovery_document['parameters'] || {} - ).inject({}) { |h,(k,v)| h[k]=v; h }).keys - end - - ## - # Returns an Array of the required parameters for this - # method. - # - # @return [Array] The required parameters. - # - # @example - # # A list of all required parameters. - # method.required_parameters - def required_parameters - @required_parameters ||= ((self.parameter_descriptions.select do |k, v| - v['required'] - end).inject({}) { |h,(k,v)| h[k]=v; h }).keys - end - - ## - # Returns an Array of the optional parameters for this - # method. - # - # @return [Array] The optional parameters. - # - # @example - # # A list of all optional parameters. - # method.optional_parameters - def optional_parameters - @optional_parameters ||= ((self.parameter_descriptions.reject do |k, v| - v['required'] - end).inject({}) { |h,(k,v)| h[k]=v; h }).keys - end - - ## - # Verifies that the parameters are valid for this method. Raises an - # exception if validation fails. - # - # @api private - # @param [Hash, Array] parameters - # The parameters to verify. - # - # @return [NilClass] nil if validation passes. - def validate_parameters(parameters={}) - parameters = self.normalize_parameters(parameters) - required_variables = ((self.parameter_descriptions.select do |k, v| - v['required'] - end).inject({}) { |h,(k,v)| h[k]=v; h }).keys - missing_variables = required_variables - parameters.map { |(k, _)| k } - if missing_variables.size > 0 - raise ArgumentError, - "Missing required parameters: #{missing_variables.join(', ')}." - end - parameters.each do |k, v| - # Handle repeated parameters. - if self.parameter_descriptions[k] && - self.parameter_descriptions[k]['repeated'] && - v.kind_of?(Array) - # If this is a repeated parameter and we've got an array as a - # value, just provide the whole array to the loop below. - items = v - else - # If this is not a repeated parameter, or if it is but we're - # being given a single value, wrap the value in an array, so that - # the loop below still works for the single element. - items = [v] - end - - items.each do |item| - if self.parameter_descriptions[k] - enum = self.parameter_descriptions[k]['enum'] - if enum && !enum.include?(item) - raise ArgumentError, - "Parameter '#{k}' has an invalid value: #{item}. " + - "Must be one of #{enum.inspect}." - end - pattern = self.parameter_descriptions[k]['pattern'] - if pattern - regexp = Regexp.new("^#{pattern}$") - if item !~ regexp - raise ArgumentError, - "Parameter '#{k}' has an invalid value: #{item}. " + - "Must match: /^#{pattern}$/." - end - end - end - end - end - return nil - end - - ## - # Returns a String representation of the method's state. - # - # @return [String] The method's state, as a String. - def inspect - sprintf( - "#<%s:%#0x ID:%s>", - self.class.to_s, self.object_id, self.id - ) - end - end - end -end diff --git a/lib/google/api_client/discovery/resource.rb b/lib/google/api_client/discovery/resource.rb deleted file mode 100644 index 9b757c684..000000000 --- a/lib/google/api_client/discovery/resource.rb +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'addressable/uri' - -require 'active_support/inflector' -require 'google/api_client/discovery/method' - - -module Google - class APIClient - ## - # A resource that has been described by a discovery document. - class Resource - - ## - # Creates a description of a particular version of a resource. - # - # @param [Google::APIClient::API] api - # The API this resource belongs to. - # @param [Addressable::URI] method_base - # The base URI for the service. - # @param [String] resource_name - # The identifier for the resource. - # @param [Hash] discovery_document - # The section of the discovery document that applies to this resource. - # - # @return [Google::APIClient::Resource] The constructed resource object. - def initialize(api, method_base, resource_name, discovery_document) - @api = api - @method_base = method_base - @name = resource_name - @discovery_document = discovery_document - metaclass = (class <String representation of the resource's state. - # - # @return [String] The resource's state, as a String. - def inspect - sprintf( - "#<%s:%#0x NAME:%s>", self.class.to_s, self.object_id, self.name - ) - end - end - end -end diff --git a/lib/google/api_client/discovery/schema.rb b/lib/google/api_client/discovery/schema.rb deleted file mode 100644 index 57666e698..000000000 --- a/lib/google/api_client/discovery/schema.rb +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'time' -require 'multi_json' -require 'compat/multi_json' -require 'base64' -require 'autoparse' -require 'addressable/uri' -require 'addressable/template' - -require 'active_support/inflector' -require 'google/api_client/errors' - - -module Google - class APIClient - ## - # @api private - module Schema - def self.parse(api, schema_data) - # This method is super-long, but hard to break up due to the - # unavoidable dependence on closures and execution context. - schema_name = schema_data['id'] - - # Due to an oversight, schema IDs may not be URI references. - # TODO(bobaman): Remove this code once this has been resolved. - schema_uri = ( - api.document_base + - (schema_name[0..0] != '#' ? '#' + schema_name : schema_name) - ) - - # Due to an oversight, schema IDs may not be URI references. - # TODO(bobaman): Remove this whole lambda once this has been resolved. - reformat_references = lambda do |data| - # This code is not particularly efficient due to recursive traversal - # and excess object creation, but this hopefully shouldn't be an - # issue since it should only be called only once per schema per - # process. - if data.kind_of?(Hash) && - data['$ref'] && !data['$ref'].kind_of?(Hash) - if data['$ref'].respond_to?(:to_str) - reference = data['$ref'].to_str - else - raise TypeError, "Expected String, got #{data['$ref'].class}" - end - reference = '#' + reference if reference[0..0] != '#' - data.merge({ - '$ref' => reference - }) - elsif data.kind_of?(Hash) - data.inject({}) do |accu, (key, value)| - if value.kind_of?(Hash) - accu[key] = reformat_references.call(value) - else - accu[key] = value - end - accu - end - else - data - end - end - schema_data = reformat_references.call(schema_data) - - if schema_name - api_name_string = ActiveSupport::Inflector.camelize(api.name) - api_version_string = ActiveSupport::Inflector.camelize(api.version).gsub('.', '_') - # This is for compatibility with Ruby 1.8.7. - # TODO(bobaman) Remove this when we eventually stop supporting 1.8.7. - args = [] - args << false if Class.method(:const_defined?).arity != 1 - if Google::APIClient::Schema.const_defined?(api_name_string, *args) - api_name = Google::APIClient::Schema.const_get( - api_name_string, *args - ) - else - api_name = Google::APIClient::Schema.const_set( - api_name_string, Module.new - ) - end - if api_name.const_defined?(api_version_string, *args) - api_version = api_name.const_get(api_version_string, *args) - else - api_version = api_name.const_set(api_version_string, Module.new) - end - if api_version.const_defined?(schema_name, *args) - schema_class = api_version.const_get(schema_name, *args) - end - end - - # It's possible the schema has already been defined. If so, don't - # redefine it. This means that reloading a schema which has already - # been loaded into memory is not possible. - unless schema_class - schema_class = AutoParse.generate(schema_data, :uri => schema_uri) - if schema_name - api_version.const_set(schema_name, schema_class) - end - end - return schema_class - end - end - end -end diff --git a/lib/google/api_client/environment.rb b/lib/google/api_client/environment.rb deleted file mode 100644 index 50c84fe5c..000000000 --- a/lib/google/api_client/environment.rb +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -module Google - class APIClient - module ENV - OS_VERSION = begin - if RUBY_PLATFORM =~ /mswin|win32|mingw|bccwin|cygwin/ - # TODO(bobaman) - # Confirm that all of these Windows environments actually have access - # to the `ver` command. - `ver`.sub(/\s*\[Version\s*/, '/').sub(']', '').strip - elsif RUBY_PLATFORM =~ /darwin/i - "Mac OS X/#{`sw_vers -productVersion`}" - elsif RUBY_PLATFORM == 'java' - # Get the information from java system properties to avoid spawning a - # sub-process, which is not friendly in some contexts (web servers). - require 'java' - name = java.lang.System.getProperty('os.name') - version = java.lang.System.getProperty('os.version') - "#{name}/#{version}" - else - `uname -sr`.sub(' ', '/') - end - rescue Exception - RUBY_PLATFORM - end - end - end -end diff --git a/lib/google/api_client/errors.rb b/lib/google/api_client/errors.rb deleted file mode 100644 index 9644c692a..000000000 --- a/lib/google/api_client/errors.rb +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -module Google - class APIClient - ## - # An error which is raised when there is an unexpected response or other - # transport error that prevents an operation from succeeding. - class TransmissionError < StandardError - attr_reader :result - def initialize(message = nil, result = nil) - super(message) - @result = result - end - end - - ## - # An exception that is raised if a redirect is required - # - class RedirectError < TransmissionError - end - - ## - # An exception that is raised if a method is called with missing or - # invalid parameter values. - class ValidationError < StandardError - end - - ## - # A 4xx class HTTP error occurred. - class ClientError < TransmissionError - end - - ## - # A 401 HTTP error occurred. - class AuthorizationError < ClientError - end - - ## - # A 5xx class HTTP error occurred. - class ServerError < TransmissionError - end - - ## - # An exception that is raised if an ID token could not be validated. - class InvalidIDTokenError < StandardError - end - - # Error class for problems in batch requests. - class BatchError < StandardError - end - end -end diff --git a/lib/google/api_client/gzip.rb b/lib/google/api_client/gzip.rb deleted file mode 100644 index 42fabbbdb..000000000 --- a/lib/google/api_client/gzip.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'faraday' -require 'zlib' - -module Google - class APIClient - class Gzip < Faraday::Response::Middleware - include Google::APIClient::Logging - - def on_complete(env) - encoding = env[:response_headers]['content-encoding'].to_s.downcase - case encoding - when 'gzip' - logger.debug { "Decompressing gzip encoded response (#{env[:body].length} bytes)" } - env[:body] = Zlib::GzipReader.new(StringIO.new(env[:body])).read - env[:response_headers].delete('content-encoding') - logger.debug { "Decompressed (#{env[:body].length} bytes)" } - when 'deflate' - logger.debug{ "Decompressing deflate encoded response (#{env[:body].length} bytes)" } - env[:body] = Zlib::Inflate.inflate(env[:body]) - env[:response_headers].delete('content-encoding') - logger.debug { "Decompressed (#{env[:body].length} bytes)" } - end - end - end - end -end - -Faraday::Response.register_middleware :gzip => Google::APIClient::Gzip \ No newline at end of file diff --git a/lib/google/api_client/logging.rb b/lib/google/api_client/logging.rb deleted file mode 100644 index 09a075b5c..000000000 --- a/lib/google/api_client/logging.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'logger' - -module Google - class APIClient - - class << self - ## - # Logger for the API client - # - # @return [Logger] logger instance. - attr_accessor :logger - end - - self.logger = Logger.new(STDOUT) - self.logger.level = Logger::WARN - - ## - # Module to make accessing the logger simpler - module Logging - ## - # Logger for the API client - # - # @return [Logger] logger instance. - def logger - Google::APIClient.logger - end - end - - end - - -end \ No newline at end of file diff --git a/lib/google/api_client/media.rb b/lib/google/api_client/media.rb deleted file mode 100644 index 5066bcebd..000000000 --- a/lib/google/api_client/media.rb +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -require 'google/api_client/reference' - -module Google - class APIClient - ## - # Uploadable media support. Holds an IO stream & content type. - # - # @see Faraday::UploadIO - # @example - # media = Google::APIClient::UploadIO.new('mymovie.m4v', 'video/mp4') - class UploadIO < Faraday::UploadIO - - # @return [Fixnum] Size of chunks to upload. Default is nil, meaning upload the entire file in a single request - attr_accessor :chunk_size - - ## - # Get the length of the stream - # - # @return [Fixnum] - # Length of stream, in bytes - def length - io.respond_to?(:length) ? io.length : File.size(local_path) - end - end - - ## - # Wraps an input stream and limits data to a given range - # - # @example - # chunk = Google::APIClient::RangedIO.new(io, 0, 1000) - class RangedIO - ## - # Bind an input stream to a specific range. - # - # @param [IO] io - # Source input stream - # @param [Fixnum] offset - # Starting offset of the range - # @param [Fixnum] length - # Length of range - def initialize(io, offset, length) - @io = io - @offset = offset - @length = length - self.rewind - end - - ## - # @see IO#read - def read(amount = nil, buf = nil) - buffer = buf || '' - if amount.nil? - size = @length - @pos - done = '' - elsif amount == 0 - size = 0 - done = '' - else - size = [@length - @pos, amount].min - done = nil - end - - if size > 0 - result = @io.read(size) - result.force_encoding("BINARY") if result.respond_to?(:force_encoding) - buffer << result if result - @pos = @pos + size - end - - if buffer.length > 0 - buffer - else - done - end - end - - ## - # @see IO#rewind - def rewind - self.pos = 0 - end - - ## - # @see IO#pos - def pos - @pos - end - - ## - # @see IO#pos= - def pos=(pos) - @pos = pos - @io.pos = @offset + pos - end - end - - ## - # Resumable uploader. - # - class ResumableUpload < Request - # @return [Fixnum] Max bytes to send in a single request - attr_accessor :chunk_size - - ## - # Creates a new uploader. - # - # @param [Hash] options - # Request options - def initialize(options={}) - super options - self.uri = options[:uri] - self.http_method = :put - @offset = options[:offset] || 0 - @complete = false - @expired = false - end - - ## - # Sends all remaining chunks to the server - # - # @deprecated Pass the instance to {Google::APIClient#execute} instead - # - # @param [Google::APIClient] api_client - # API Client instance to use for sending - def send_all(api_client) - result = nil - until complete? - result = send_chunk(api_client) - break unless result.status == 308 - end - return result - end - - - ## - # Sends the next chunk to the server - # - # @deprecated Pass the instance to {Google::APIClient#execute} instead - # - # @param [Google::APIClient] api_client - # API Client instance to use for sending - def send_chunk(api_client) - return api_client.execute(self) - end - - ## - # Check if upload is complete - # - # @return [TrueClass, FalseClass] - # Whether or not the upload complete successfully - def complete? - return @complete - end - - ## - # Check if the upload URL expired (upload not completed in alotted time.) - # Expired uploads must be restarted from the beginning - # - # @return [TrueClass, FalseClass] - # Whether or not the upload has expired and can not be resumed - def expired? - return @expired - end - - ## - # Check if upload is resumable. That is, neither complete nor expired - # - # @return [TrueClass, FalseClass] True if upload can be resumed - def resumable? - return !(self.complete? or self.expired?) - end - - ## - # Convert to an HTTP request. Returns components in order of method, URI, - # request headers, and body - # - # @api private - # - # @return [Array<(Symbol, Addressable::URI, Hash, [#read,#to_str])>] - def to_http_request - if @complete - raise Google::APIClient::ClientError, "Upload already complete" - elsif @offset.nil? - self.headers.update({ - 'Content-Length' => "0", - 'Content-Range' => "bytes */#{media.length}" }) - else - start_offset = @offset - remaining = self.media.length - start_offset - chunk_size = self.media.chunk_size || self.chunk_size || self.media.length - content_length = [remaining, chunk_size].min - chunk = RangedIO.new(self.media.io, start_offset, content_length) - end_offset = start_offset + content_length - 1 - self.headers.update({ - 'Content-Length' => "#{content_length}", - 'Content-Type' => self.media.content_type, - 'Content-Range' => "bytes #{start_offset}-#{end_offset}/#{media.length}" }) - self.body = chunk - end - super - end - - ## - # Check the result from the server, updating the offset and/or location - # if available. - # - # @api private - # - # @param [Faraday::Response] response - # HTTP response - # - # @return [Google::APIClient::Result] - # Processed API response - def process_http_response(response) - case response.status - when 200...299 - @complete = true - when 308 - range = response.headers['range'] - if range - @offset = range.scan(/\d+/).collect{|x| Integer(x)}.last + 1 - end - if response.headers['location'] - self.uri = response.headers['location'] - end - when 400...499 - @expired = true - when 500...599 - # Invalidate the offset to mark it needs to be queried on the - # next request - @offset = nil - end - return Google::APIClient::Result.new(self, response) - end - - ## - # Hashified verison of the API request - # - # @return [Hash] - def to_hash - super.merge(:offset => @offset) - end - - end - end -end \ No newline at end of file diff --git a/lib/google/api_client/railtie.rb b/lib/google/api_client/railtie.rb deleted file mode 100644 index 86d9a6b20..000000000 --- a/lib/google/api_client/railtie.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rails/railtie' -require 'google/api_client/logging' - -module Google - class APIClient - - ## - # Optional support class for Rails. Currently replaces the built-in logger - # with Rails' application log. - # - class Railtie < Rails::Railtie - initializer 'google-api-client' do |app| - logger = app.config.logger || Rails.logger - Google::APIClient.logger = logger unless logger.nil? - end - end - end -end diff --git a/lib/google/api_client/reference.rb b/lib/google/api_client/reference.rb deleted file mode 100644 index 15b34250d..000000000 --- a/lib/google/api_client/reference.rb +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'google/api_client/request' - -module Google - class APIClient - ## - # Subclass of Request for backwards compatibility with pre-0.5.0 versions of the library - # - # @deprecated - # use {Google::APIClient::Request} instead - class Reference < Request - end - end -end diff --git a/lib/google/api_client/request.rb b/lib/google/api_client/request.rb deleted file mode 100644 index d043e0016..000000000 --- a/lib/google/api_client/request.rb +++ /dev/null @@ -1,350 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'faraday' -require 'faraday/request/multipart' -require 'compat/multi_json' -require 'addressable/uri' -require 'stringio' -require 'google/api_client/discovery' -require 'google/api_client/logging' - -module Google - class APIClient - - ## - # Represents an API request. - class Request - include Google::APIClient::Logging - - MULTIPART_BOUNDARY = "-----------RubyApiMultipartPost".freeze - - # @return [Hash] Request parameters - attr_reader :parameters - # @return [Hash] Additional HTTP headers - attr_reader :headers - # @return [Google::APIClient::Method] API method to invoke - attr_reader :api_method - # @return [Google::APIClient::UploadIO] File to upload - attr_accessor :media - # @return [#generated_authenticated_request] User credentials - attr_accessor :authorization - # @return [TrueClass,FalseClass] True if request should include credentials - attr_accessor :authenticated - # @return [#read, #to_str] Request body - attr_accessor :body - - ## - # Build a request - # - # @param [Hash] options - # @option options [Hash, Array] :parameters - # Request parameters for the API method. - # @option options [Google::APIClient::Method] :api_method - # API method to invoke. Either :api_method or :uri must be specified - # @option options [TrueClass, FalseClass] :authenticated - # True if request should include credentials. Implicitly true if - # unspecified and :authorization present - # @option options [#generate_signed_request] :authorization - # OAuth credentials - # @option options [Google::APIClient::UploadIO] :media - # File to upload, if media upload request - # @option options [#to_json, #to_hash] :body_object - # Main body of the API request. Typically hash or object that can - # be serialized to JSON - # @option options [#read, #to_str] :body - # Raw body to send in POST/PUT requests - # @option options [String, Addressable::URI] :uri - # URI to request. Either :api_method or :uri must be specified - # @option options [String, Symbol] :http_method - # HTTP method when requesting a URI - def initialize(options={}) - @parameters = Faraday::Utils::ParamsHash.new - @headers = Faraday::Utils::Headers.new - - self.parameters.merge!(options[:parameters]) unless options[:parameters].nil? - self.headers.merge!(options[:headers]) unless options[:headers].nil? - self.api_method = options[:api_method] - self.authenticated = options[:authenticated] - self.authorization = options[:authorization] - - # These parameters are handled differently because they're not - # parameters to the API method, but rather to the API system. - self.parameters['key'] ||= options[:key] if options[:key] - self.parameters['userIp'] ||= options[:user_ip] if options[:user_ip] - - if options[:media] - self.initialize_media_upload(options) - elsif options[:body] - self.body = options[:body] - elsif options[:body_object] - self.headers['Content-Type'] ||= 'application/json' - self.body = serialize_body(options[:body_object]) - else - self.body = '' - end - - unless self.api_method - self.http_method = options[:http_method] || 'GET' - self.uri = options[:uri] - end - end - - # @!attribute [r] upload_type - # @return [String] protocol used for upload - def upload_type - return self.parameters['uploadType'] || self.parameters['upload_type'] - end - - # @!attribute http_method - # @return [Symbol] HTTP method if invoking a URI - def http_method - return @http_method ||= self.api_method.http_method.to_s.downcase.to_sym - end - - def http_method=(new_http_method) - if new_http_method.kind_of?(Symbol) - @http_method = new_http_method.to_s.downcase.to_sym - elsif new_http_method.respond_to?(:to_str) - @http_method = new_http_method.to_s.downcase.to_sym - else - raise TypeError, - "Expected String or Symbol, got #{new_http_method.class}." - end - end - - def api_method=(new_api_method) - if new_api_method.nil? || new_api_method.kind_of?(Google::APIClient::Method) - @api_method = new_api_method - else - raise TypeError, - "Expected Google::APIClient::Method, got #{new_api_method.class}." - end - end - - # @!attribute uri - # @return [Addressable::URI] URI to send request - def uri - return @uri ||= self.api_method.generate_uri(self.parameters) - end - - def uri=(new_uri) - @uri = Addressable::URI.parse(new_uri) - @parameters.update(@uri.query_values) unless @uri.query_values.nil? - end - - - # Transmits the request with the given connection - # - # @api private - # - # @param [Faraday::Connection] connection - # the connection to transmit with - # @param [TrueValue,FalseValue] is_retry - # True if request has been previous sent - # - # @return [Google::APIClient::Result] - # result of API request - def send(connection, is_retry = false) - self.body.rewind if is_retry && self.body.respond_to?(:rewind) - env = self.to_env(connection) - logger.debug { "#{self.class} Sending API request #{env[:method]} #{env[:url].to_s} #{env[:request_headers]}" } - http_response = connection.app.call(env) - result = self.process_http_response(http_response) - - logger.debug { "#{self.class} Result: #{result.status} #{result.headers}" } - - # Resumamble slightly different than other upload protocols in that it requires at least - # 2 requests. - if result.status == 200 && self.upload_type == 'resumable' && self.media - upload = result.resumable_upload - unless upload.complete? - logger.debug { "#{self.class} Sending upload body" } - result = upload.send(connection) - end - end - return result - end - - # Convert to an HTTP request. Returns components in order of method, URI, - # request headers, and body - # - # @api private - # - # @return [Array<(Symbol, Addressable::URI, Hash, [#read,#to_str])>] - def to_http_request - request = ( - if self.api_method - self.api_method.generate_request(self.parameters, self.body, self.headers) - elsif self.uri - unless self.parameters.empty? - self.uri.query = Addressable::URI.form_encode(self.parameters) - end - [self.http_method, self.uri.to_s, self.headers, self.body] - end) - return request - end - - ## - # Hashified verison of the API request - # - # @return [Hash] - def to_hash - options = {} - if self.api_method - options[:api_method] = self.api_method - options[:parameters] = self.parameters - else - options[:http_method] = self.http_method - options[:uri] = self.uri - end - options[:headers] = self.headers - options[:body] = self.body - options[:media] = self.media - unless self.authorization.nil? - options[:authorization] = self.authorization - end - return options - end - - ## - # Prepares the request for execution, building a hash of parts - # suitable for sending to Faraday::Connection. - # - # @api private - # - # @param [Faraday::Connection] connection - # Connection for building the request - # - # @return [Hash] - # Encoded request - def to_env(connection) - method, uri, headers, body = self.to_http_request - http_request = connection.build_request(method) do |req| - req.url(uri.to_s) - req.headers.update(headers) - req.body = body - end - - if self.authorization.respond_to?(:generate_authenticated_request) - http_request = self.authorization.generate_authenticated_request( - :request => http_request, - :connection => connection - ) - end - - http_request.to_env(connection) - end - - ## - # Convert HTTP response to an API Result - # - # @api private - # - # @param [Faraday::Response] response - # HTTP response - # - # @return [Google::APIClient::Result] - # Processed API response - def process_http_response(response) - Result.new(self, response) - end - - protected - - ## - # Adjust headers & body for media uploads - # - # @api private - # - # @param [Hash] options - # @option options [Hash, Array] :parameters - # Request parameters for the API method. - # @option options [Google::APIClient::UploadIO] :media - # File to upload, if media upload request - # @option options [#to_json, #to_hash] :body_object - # Main body of the API request. Typically hash or object that can - # be serialized to JSON - # @option options [#read, #to_str] :body - # Raw body to send in POST/PUT requests - def initialize_media_upload(options) - self.media = options[:media] - case self.upload_type - when "media" - if options[:body] || options[:body_object] - raise ArgumentError, "Can not specify body & body object for simple uploads" - end - self.headers['Content-Type'] ||= self.media.content_type - self.headers['Content-Length'] ||= self.media.length.to_s - self.body = self.media - when "multipart" - unless options[:body_object] - raise ArgumentError, "Multipart requested but no body object" - end - metadata = StringIO.new(serialize_body(options[:body_object])) - build_multipart([Faraday::UploadIO.new(metadata, 'application/json', 'file.json'), self.media]) - when "resumable" - file_length = self.media.length - self.headers['X-Upload-Content-Type'] = self.media.content_type - self.headers['X-Upload-Content-Length'] = file_length.to_s - if options[:body_object] - self.headers['Content-Type'] ||= 'application/json' - self.body = serialize_body(options[:body_object]) - else - self.body = '' - end - end - end - - ## - # Assemble a multipart message from a set of parts - # - # @api private - # - # @param [Array<[#read,#to_str]>] parts - # Array of parts to encode. - # @param [String] mime_type - # MIME type of the message - # @param [String] boundary - # Boundary for separating each part of the message - def build_multipart(parts, mime_type = 'multipart/related', boundary = MULTIPART_BOUNDARY) - env = Faraday::Env.new - env.request = Faraday::RequestOptions.new - env.request.boundary = boundary - env.request_headers = {'Content-Type' => "#{mime_type};boundary=#{boundary}"} - multipart = Faraday::Request::Multipart.new - self.body = multipart.create_multipart(env, parts.map {|part| [nil, part]}) - self.headers.update(env[:request_headers]) - end - - ## - # Serialize body object to JSON - # - # @api private - # - # @param [#to_json,#to_hash] body - # object to serialize - # - # @return [String] - # JSON - def serialize_body(body) - return body.to_json if body.respond_to?(:to_json) - return MultiJson.dump(body.to_hash) if body.respond_to?(:to_hash) - raise TypeError, 'Could not convert body object to JSON.' + - 'Must respond to :to_json or :to_hash.' - end - - end - end -end diff --git a/lib/google/api_client/result.rb b/lib/google/api_client/result.rb deleted file mode 100644 index 090f22947..000000000 --- a/lib/google/api_client/result.rb +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -module Google - class APIClient - ## - # This class wraps a result returned by an API call. - class Result - extend Forwardable - - ## - # Init the result - # - # @param [Google::APIClient::Request] request - # The original request - # @param [Faraday::Response] response - # Raw HTTP Response - def initialize(request, response) - @request = request - @response = response - @media_upload = reference if reference.kind_of?(ResumableUpload) - end - - # @return [Google::APIClient::Request] Original request object - attr_reader :request - # @return [Faraday::Response] HTTP response - attr_reader :response - # @!attribute [r] reference - # @return [Google::APIClient::Request] Original request object - # @deprecated See {#request} - alias_method :reference, :request # For compatibility with pre-beta clients - - # @!attribute [r] status - # @return [Fixnum] HTTP status code - # @!attribute [r] headers - # @return [Hash] HTTP response headers - # @!attribute [r] body - # @return [String] HTTP response body - def_delegators :@response, :status, :headers, :body - - # @!attribute [r] resumable_upload - # @return [Google::APIClient::ResumableUpload] For resuming media uploads - def resumable_upload - @media_upload ||= ( - options = self.reference.to_hash.merge( - :uri => self.headers['location'], - :media => self.reference.media - ) - Google::APIClient::ResumableUpload.new(options) - ) - end - - ## - # Get the content type of the response - # @!attribute [r] media_type - # @return [String] - # Value of content-type header - def media_type - _, content_type = self.headers.detect do |h, v| - h.downcase == 'Content-Type'.downcase - end - if content_type - return content_type[/^([^;]*);?.*$/, 1].strip.downcase - else - return nil - end - end - - ## - # Check if request failed - which is anything other than 200/201 OK - # - # @!attribute [r] error? - # @return [TrueClass, FalseClass] - # true if result of operation is an error - def error? - return !self.success? - end - - ## - # Check if request was successful - # - # @!attribute [r] success? - # @return [TrueClass, FalseClass] - # true if result of operation was successful - def success? - if self.response.status == 200 || self.response.status == 201 - return true - else - return false - end - end - - ## - # Extracts error messages from the response body - # - # @!attribute [r] error_message - # @return [String] - # error message, if available - def error_message - if self.data? - if self.data.respond_to?(:error) && - self.data.error.respond_to?(:message) - # You're going to get a terrible error message if the response isn't - # parsed successfully as an error. - return self.data.error.message - elsif self.data['error'] && self.data['error']['message'] - return self.data['error']['message'] - end - end - return self.body - end - - ## - # Check for parsable data in response - # - # @!attribute [r] data? - # @return [TrueClass, FalseClass] - # true if body can be parsed - def data? - !(self.body.nil? || self.body.empty? || self.media_type != 'application/json') - end - - ## - # Return parsed version of the response body. - # - # @!attribute [r] data - # @return [Object, Hash, String] - # Object if body parsable from API schema, Hash if JSON, raw body if unable to parse - def data - return @data ||= (begin - if self.data? - media_type = self.media_type - data = self.body - case media_type - when 'application/json' - data = MultiJson.load(data) - # Strip data wrapper, if present - data = data['data'] if data.has_key?('data') - else - raise ArgumentError, - "Content-Type not supported for parsing: #{media_type}" - end - if @request.api_method && @request.api_method.response_schema - # Automatically parse using the schema designated for the - # response of this API method. - data = @request.api_method.response_schema.new(data) - data - else - # Otherwise, return the raw unparsed value. - # This value must be indexable like a Hash. - data - end - end - end) - end - - ## - # Get the token used for requesting the next page of data - # - # @!attribute [r] next_page_token - # @return [String] - # next page token - def next_page_token - if self.data.respond_to?(:next_page_token) - return self.data.next_page_token - elsif self.data.respond_to?(:[]) - return self.data["nextPageToken"] - else - raise TypeError, "Data object did not respond to #next_page_token." - end - end - - ## - # Build a request for fetching the next page of data - # - # @return [Google::APIClient::Request] - # API request for retrieving next page, nil if no page token available - def next_page - return nil unless self.next_page_token - merged_parameters = Hash[self.reference.parameters].merge({ - self.page_token_param => self.next_page_token - }) - # Because Requests can be coerced to Hashes, we can merge them, - # preserving all context except the API method parameters that we're - # using for pagination. - return Google::APIClient::Request.new( - Hash[self.reference].merge(:parameters => merged_parameters) - ) - end - - ## - # Get the token used for requesting the previous page of data - # - # @!attribute [r] prev_page_token - # @return [String] - # previous page token - def prev_page_token - if self.data.respond_to?(:prev_page_token) - return self.data.prev_page_token - elsif self.data.respond_to?(:[]) - return self.data["prevPageToken"] - else - raise TypeError, "Data object did not respond to #next_page_token." - end - end - - ## - # Build a request for fetching the previous page of data - # - # @return [Google::APIClient::Request] - # API request for retrieving previous page, nil if no page token available - def prev_page - return nil unless self.prev_page_token - merged_parameters = Hash[self.reference.parameters].merge({ - self.page_token_param => self.prev_page_token - }) - # Because Requests can be coerced to Hashes, we can merge them, - # preserving all context except the API method parameters that we're - # using for pagination. - return Google::APIClient::Request.new( - Hash[self.reference].merge(:parameters => merged_parameters) - ) - end - - ## - # Pagination scheme used by this request/response - # - # @!attribute [r] pagination_type - # @return [Symbol] - # currently always :token - def pagination_type - return :token - end - - ## - # Name of the field that contains the pagination token - # - # @!attribute [r] page_token_param - # @return [String] - # currently always 'pageToken' - def page_token_param - return "pageToken" - end - - end - end -end diff --git a/lib/google/api_client/service.rb b/lib/google/api_client/service.rb deleted file mode 100755 index 28f2605d9..000000000 --- a/lib/google/api_client/service.rb +++ /dev/null @@ -1,233 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'google/api_client' -require 'google/api_client/service/stub_generator' -require 'google/api_client/service/resource' -require 'google/api_client/service/request' -require 'google/api_client/service/result' -require 'google/api_client/service/batch' -require 'google/api_client/service/simple_file_store' - -module Google - class APIClient - - ## - # Experimental new programming interface at the API level. - # Hides Google::APIClient. Designed to be easier to use, with less code. - # - # @example - # calendar = Google::APIClient::Service.new('calendar', 'v3') - # result = calendar.events.list('calendarId' => 'primary').execute() - class Service - include Google::APIClient::Service::StubGenerator - extend Forwardable - - DEFAULT_CACHE_FILE = 'discovery.cache' - - # Cache for discovered APIs. - @@discovered = {} - - ## - # Creates a new Service. - # - # @param [String, Symbol] api_name - # The name of the API this service will access. - # @param [String, Symbol] api_version - # The version of the API this service will access. - # @param [Hash] options - # The configuration parameters for the service. - # @option options [Symbol, #generate_authenticated_request] :authorization - # (:oauth_1) - # The authorization mechanism used by the client. The following - # mechanisms are supported out-of-the-box: - #
      - #
    • :two_legged_oauth_1
    • - #
    • :oauth_1
    • - #
    • :oauth_2
    • - #
    - # @option options [Boolean] :auto_refresh_token (true) - # The setting that controls whether or not the api client attempts to - # refresh authorization when a 401 is hit in #execute. If the token does - # not support it, this option is ignored. - # @option options [String] :application_name - # The name of the application using the client. - # @option options [String] :application_version - # The version number of the application using the client. - # @option options [String] :host ("www.googleapis.com") - # The API hostname used by the client. This rarely needs to be changed. - # @option options [String] :port (443) - # The port number used by the client. This rarely needs to be changed. - # @option options [String] :discovery_path ("/discovery/v1") - # The discovery base path. This rarely needs to be changed. - # @option options [String] :ca_file - # Optional set of root certificates to use when validating SSL connections. - # By default, a bundled set of trusted roots will be used. - # @option options [#generate_authenticated_request] :authorization - # The authorization mechanism for requests. Used only if - # `:authenticated` is `true`. - # @option options [TrueClass, FalseClass] :authenticated (default: true) - # `true` if requests must be signed or somehow - # authenticated, `false` otherwise. - # @option options [TrueClass, FalseClass] :gzip (default: true) - # `true` if gzip enabled, `false` otherwise. - # @option options [Faraday::Connection] :connection - # A custom connection to be used for all requests. - # @option options [ActiveSupport::Cache::Store, :default] :discovery_cache - # A cache store to place the discovery documents for loaded APIs. - # Avoids unnecessary roundtrips to the discovery service. - # :default loads the default local file cache store. - def initialize(api_name, api_version, options = {}) - @api_name = api_name.to_s - if api_version.nil? - raise ArgumentError, - "API version must be set" - end - @api_version = api_version.to_s - if options && !options.respond_to?(:to_hash) - raise ArgumentError, - "expected options Hash, got #{options.class}" - end - - params = {} - [:application_name, :application_version, :authorization, :host, :port, - :discovery_path, :auto_refresh_token, :key, :user_ip, - :ca_file].each do |option| - if options.include? option - params[option] = options[option] - end - end - - @client = Google::APIClient.new(params) - - @connection = options[:connection] || @client.connection - - @options = options - - # Initialize cache store. Default to SimpleFileStore if :cache_store - # is not provided and we have write permissions. - if options.include? :cache_store - @cache_store = options[:cache_store] - else - cache_exists = File.exists?(DEFAULT_CACHE_FILE) - if (cache_exists && File.writable?(DEFAULT_CACHE_FILE)) || - (!cache_exists && File.writable?(Dir.pwd)) - @cache_store = Google::APIClient::Service::SimpleFileStore.new( - DEFAULT_CACHE_FILE) - end - end - - # Attempt to read API definition from memory cache. - # Not thread-safe, but the worst that can happen is a cache miss. - unless @api = @@discovered[[api_name, api_version]] - # Attempt to read API definition from cache store, if there is one. - # If there's a miss or no cache store, call discovery service. - if !@cache_store.nil? - @api = @cache_store.fetch("%s/%s" % [api_name, api_version]) do - @client.discovered_api(api_name, api_version) - end - else - @api = @client.discovered_api(api_name, api_version) - end - @@discovered[[api_name, api_version]] = @api - end - - generate_call_stubs(self, @api) - end - - ## - # Returns the authorization mechanism used by the service. - # - # @return [#generate_authenticated_request] The authorization mechanism. - def_delegators :@client, :authorization, :authorization= - - ## - # The setting that controls whether or not the service attempts to - # refresh authorization when a 401 is hit during an API call. - # - # @return [Boolean] - def_delegators :@client, :auto_refresh_token, :auto_refresh_token= - - ## - # The application's API key issued by the API console. - # - # @return [String] The API key. - def_delegators :@client, :key, :key= - - ## - # The Faraday/HTTP connection used by this service. - # - # @return [Faraday::Connection] - attr_accessor :connection - - ## - # The cache store used for storing discovery documents. - # - # @return [ActiveSupport::Cache::Store, - # Google::APIClient::Service::SimpleFileStore, - # nil] - attr_reader :cache_store - - ## - # Prepares a Google::APIClient::BatchRequest object to make batched calls. - # @param [Array] calls - # Optional array of Google::APIClient::Service::Request to initialize - # the batch request with. - # @param [Proc] block - # Callback for every call's response. Won't be called if a call defined - # a callback of its own. - # - # @yield [Google::APIClient::Service::Result] - # block to be called when result ready - def batch(calls = nil, &block) - Google::APIClient::Service::BatchRequest.new(self, calls, &block) - end - - ## - # Executes an API request. - # Do not call directly; this method is only used by Request objects when - # executing. - # - # @param [Google::APIClient::Service::Request, - # Google::APIClient::Service::BatchCall] request - # The request to be executed. - def execute(request) - if request.instance_of? Google::APIClient::Service::Request - params = {:api_method => request.method, - :parameters => request.parameters, - :connection => @connection} - if request.respond_to? :body - if request.body.respond_to? :to_hash - params[:body_object] = request.body - else - params[:body] = request.body - end - end - if request.respond_to? :media - params[:media] = request.media - end - [:authenticated, :gzip].each do |option| - if @options.include? option - params[option] = @options[option] - end - end - result = @client.execute(params) - return Google::APIClient::Service::Result.new(request, result) - elsif request.instance_of? Google::APIClient::Service::BatchRequest - @client.execute(request.base_batch, {:connection => @connection}) - end - end - end - end -end diff --git a/lib/google/api_client/service/batch.rb b/lib/google/api_client/service/batch.rb deleted file mode 100644 index 7ba406e61..000000000 --- a/lib/google/api_client/service/batch.rb +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'google/api_client/service/result' -require 'google/api_client/batch' - -module Google - class APIClient - class Service - - ## - # Helper class to contain the result of an individual batched call. - # - class BatchedCallResult < Result - # @return [Fixnum] Index of the call - def call_index - return @base_result.response.call_id.to_i - 1 - end - end - - ## - # - # - class BatchRequest - ## - # Creates a new batch request. - # This class shouldn't be instantiated directly, but rather through - # Service.batch. - # - # @param [Array] calls - # List of Google::APIClient::Service::Request to be made. - # @param [Proc] block - # Callback for every call's response. Won't be called if a call - # defined a callback of its own. - # - # @yield [Google::APIClient::Service::Result] - # block to be called when result ready - def initialize(service, calls, &block) - @service = service - @base_batch = Google::APIClient::BatchRequest.new - @global_callback = block if block_given? - - if calls && calls.length > 0 - calls.each do |call| - add(call) - end - end - end - - ## - # Add a new call to the batch request. - # - # @param [Google::APIClient::Service::Request] call - # the call to be added. - # @param [Proc] block - # callback for this call's response. - # - # @return [Google::APIClient::Service::BatchRequest] - # the BatchRequest, for chaining - # - # @yield [Google::APIClient::Service::Result] - # block to be called when result ready - def add(call, &block) - if !block_given? && @global_callback.nil? - raise BatchError, 'Request needs a block' - end - callback = block || @global_callback - base_call = { - :api_method => call.method, - :parameters => call.parameters - } - if call.respond_to? :body - if call.body.respond_to? :to_hash - base_call[:body_object] = call.body - else - base_call[:body] = call.body - end - end - @base_batch.add(base_call) do |base_result| - result = Google::APIClient::Service::BatchedCallResult.new( - call, base_result) - callback.call(result) - end - return self - end - - ## - # Executes the batch request. - def execute - @service.execute(self) - end - - attr_reader :base_batch - - end - - end - end -end diff --git a/lib/google/api_client/service/request.rb b/lib/google/api_client/service/request.rb deleted file mode 100755 index dcbc7e321..000000000 --- a/lib/google/api_client/service/request.rb +++ /dev/null @@ -1,144 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -module Google - class APIClient - class Service - ## - # Handles an API request. - # This contains a full definition of the request to be made (including - # method name, parameters, body and media). The remote API call can be - # invoked with execute(). - class Request - ## - # Build a request. - # This class should not be directly instantiated in user code; - # instantiation is handled by the stub methods created on Service and - # Resource objects. - # - # @param [Google::APIClient::Service] service - # The parent Service instance that will execute the request. - # @param [Google::APIClient::Method] method - # The Method instance that describes the API method invoked by the - # request. - # @param [Hash] parameters - # A Hash of parameter names and values to be sent in the API call. - def initialize(service, method, parameters) - @service = service - @method = method - @parameters = parameters - @body = nil - @media = nil - - metaclass = (class << self; self; end) - - # If applicable, add "body", "body=" and resource-named methods for - # retrieving and setting the HTTP body for this request. - # Examples of setting the body for files.insert in the Drive API: - # request.body = object - # request.execute - # OR - # request.file = object - # request.execute - # OR - # request.body(object).execute - # OR - # request.file(object).execute - # Examples of retrieving the body for files.insert in the Drive API: - # object = request.body - # OR - # object = request.file - if method.request_schema - body_name = method.request_schema.data['id'].dup - body_name[0] = body_name[0].chr.downcase - body_name_equals = (body_name + '=').to_sym - body_name = body_name.to_sym - - metaclass.send(:define_method, :body) do |*args| - if args.length == 1 - @body = args.first - return self - elsif args.length == 0 - return @body - else - raise ArgumentError, - "wrong number of arguments (#{args.length}; expecting 0 or 1)" - end - end - - metaclass.send(:define_method, :body=) do |body| - @body = body - end - - metaclass.send(:alias_method, body_name, :body) - metaclass.send(:alias_method, body_name_equals, :body=) - end - - # If applicable, add "media" and "media=" for retrieving and setting - # the media object for this request. - # Examples of setting the media object: - # request.media = object - # request.execute - # OR - # request.media(object).execute - # Example of retrieving the media object: - # object = request.media - if method.media_upload - metaclass.send(:define_method, :media) do |*args| - if args.length == 1 - @media = args.first - return self - elsif args.length == 0 - return @media - else - raise ArgumentError, - "wrong number of arguments (#{args.length}; expecting 0 or 1)" - end - end - - metaclass.send(:define_method, :media=) do |media| - @media = media - end - end - end - - ## - # Returns the parent service capable of executing this request. - # - # @return [Google::APIClient::Service] The parent service. - attr_reader :service - - ## - # Returns the Method instance that describes the API method invoked by - # the request. - # - # @return [Google::APIClient::Method] The API method description. - attr_reader :method - - ## - # Contains the Hash of parameter names and values to be sent as the - # parameters for the API call. - # - # @return [Hash] The request parameters. - attr_accessor :parameters - - ## - # Executes the request. - def execute - @service.execute(self) - end - end - end - end -end diff --git a/lib/google/api_client/service/resource.rb b/lib/google/api_client/service/resource.rb deleted file mode 100755 index b493769d4..000000000 --- a/lib/google/api_client/service/resource.rb +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -module Google - class APIClient - class Service - ## - # Handles an API resource. - # Simple class that contains API methods and/or child resources. - class Resource - include Google::APIClient::Service::StubGenerator - - ## - # Build a resource. - # This class should not be directly instantiated in user code; resources - # are instantiated by the stub generation mechanism on Service creation. - # - # @param [Google::APIClient::Service] service - # The Service instance this resource belongs to. - # @param [Google::APIClient::API, Google::APIClient::Resource] root - # The node corresponding to this resource. - def initialize(service, root) - @service = service - generate_call_stubs(service, root) - end - end - end - end -end diff --git a/lib/google/api_client/service/result.rb b/lib/google/api_client/service/result.rb deleted file mode 100755 index b20a59664..000000000 --- a/lib/google/api_client/service/result.rb +++ /dev/null @@ -1,164 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -module Google - class APIClient - class Service - ## - # Handles an API result. - # Wraps around the Google::APIClient::Result class, making it easier to - # handle the result (e.g. pagination) and keeping it in line with the rest - # of the Service programming interface. - class Result - extend Forwardable - - ## - # Init the result. - # - # @param [Google::APIClient::Service::Request] request - # The original request - # @param [Google::APIClient::Result] base_result - # The base result to be wrapped - def initialize(request, base_result) - @request = request - @base_result = base_result - end - - # @!attribute [r] status - # @return [Fixnum] HTTP status code - # @!attribute [r] headers - # @return [Hash] HTTP response headers - # @!attribute [r] body - # @return [String] HTTP response body - def_delegators :@base_result, :status, :headers, :body - - # @return [Google::APIClient::Service::Request] Original request object - attr_reader :request - - ## - # Get the content type of the response - # @!attribute [r] media_type - # @return [String] - # Value of content-type header - def_delegators :@base_result, :media_type - - ## - # Check if request failed - # - # @!attribute [r] error? - # @return [TrueClass, FalseClass] - # true if result of operation is an error - def_delegators :@base_result, :error? - - ## - # Check if request was successful - # - # @!attribute [r] success? - # @return [TrueClass, FalseClass] - # true if result of operation was successful - def_delegators :@base_result, :success? - - ## - # Extracts error messages from the response body - # - # @!attribute [r] error_message - # @return [String] - # error message, if available - def_delegators :@base_result, :error_message - - ## - # Check for parsable data in response - # - # @!attribute [r] data? - # @return [TrueClass, FalseClass] - # true if body can be parsed - def_delegators :@base_result, :data? - - ## - # Return parsed version of the response body. - # - # @!attribute [r] data - # @return [Object, Hash, String] - # Object if body parsable from API schema, Hash if JSON, raw body if unable to parse - def_delegators :@base_result, :data - - ## - # Pagination scheme used by this request/response - # - # @!attribute [r] pagination_type - # @return [Symbol] - # currently always :token - def_delegators :@base_result, :pagination_type - - ## - # Name of the field that contains the pagination token - # - # @!attribute [r] page_token_param - # @return [String] - # currently always 'pageToken' - def_delegators :@base_result, :page_token_param - - ## - # Get the token used for requesting the next page of data - # - # @!attribute [r] next_page_token - # @return [String] - # next page tokenx = - def_delegators :@base_result, :next_page_token - - ## - # Get the token used for requesting the previous page of data - # - # @!attribute [r] prev_page_token - # @return [String] - # previous page token - def_delegators :@base_result, :prev_page_token - - # @!attribute [r] resumable_upload - def resumable_upload - # TODO(sgomes): implement resumable_upload for Service::Result - raise NotImplementedError - end - - ## - # Build a request for fetching the next page of data - # - # @return [Google::APIClient::Service::Request] - # API request for retrieving next page - def next_page - return nil unless self.next_page_token - request = @request.clone - # Make a deep copy of the parameters. - request.parameters = Marshal.load(Marshal.dump(request.parameters)) - request.parameters[page_token_param] = self.next_page_token - return request - end - - ## - # Build a request for fetching the previous page of data - # - # @return [Google::APIClient::Service::Request] - # API request for retrieving previous page - def prev_page - return nil unless self.prev_page_token - request = @request.clone - # Make a deep copy of the parameters. - request.parameters = Marshal.load(Marshal.dump(request.parameters)) - request.parameters[page_token_param] = self.prev_page_token - return request - end - end - end - end -end diff --git a/lib/google/api_client/service/simple_file_store.rb b/lib/google/api_client/service/simple_file_store.rb deleted file mode 100644 index 216b3fac5..000000000 --- a/lib/google/api_client/service/simple_file_store.rb +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -module Google - class APIClient - class Service - - # Simple file store to be used in the event no ActiveSupport cache store - # is provided. This is not thread-safe, and does not support a number of - # features (such as expiration), but it's useful for the simple purpose of - # caching discovery documents to disk. - # Implements the basic cache methods of ActiveSupport::Cache::Store in a - # limited fashion. - class SimpleFileStore - - # Creates a new SimpleFileStore. - # - # @param [String] file_path - # The path to the cache file on disk. - # @param [Object] options - # The options to be used with this SimpleFileStore. Not implemented. - def initialize(file_path, options = nil) - @file_path = file_path.to_s - end - - # Returns true if a key exists in the cache. - # - # @param [String] name - # The name of the key. Will always be converted to a string. - # @param [Object] options - # The options to be used with this query. Not implemented. - def exist?(name, options = nil) - read_file - @cache.nil? ? nil : @cache.include?(name.to_s) - end - - # Fetches data from the cache and returns it, using the given key. - # If the key is missing and no block is passed, returns nil. - # If the key is missing and a block is passed, executes the block, sets - # the key to its value, and returns it. - # - # @param [String] name - # The name of the key. Will always be converted to a string. - # @param [Object] options - # The options to be used with this query. Not implemented. - # @yield [String] - # optional block with the default value if the key is missing - def fetch(name, options = nil) - read_file - if block_given? - entry = read(name.to_s, options) - if entry.nil? - value = yield name.to_s - write(name.to_s, value) - return value - else - return entry - end - else - return read(name.to_s, options) - end - end - - # Fetches data from the cache, using the given key. - # Returns nil if the key is missing. - # - # @param [String] name - # The name of the key. Will always be converted to a string. - # @param [Object] options - # The options to be used with this query. Not implemented. - def read(name, options = nil) - read_file - @cache.nil? ? nil : @cache[name.to_s] - end - - # Writes the value to the cache, with the key. - # - # @param [String] name - # The name of the key. Will always be converted to a string. - # @param [Object] value - # The value to be written. - # @param [Object] options - # The options to be used with this query. Not implemented. - def write(name, value, options = nil) - read_file - @cache = {} if @cache.nil? - @cache[name.to_s] = value - write_file - return nil - end - - # Deletes an entry in the cache. - # Returns true if an entry is deleted. - # - # @param [String] name - # The name of the key. Will always be converted to a string. - # @param [Object] options - # The options to be used with this query. Not implemented. - def delete(name, options = nil) - read_file - return nil if @cache.nil? - if @cache.include? name.to_s - @cache.delete name.to_s - write_file - return true - else - return nil - end - end - - protected - - # Read the entire cache file from disk. - # Will avoid reading if there have been no changes. - def read_file - if !File.exist? @file_path - @cache = nil - else - # Check for changes after our last read or write. - if @last_change.nil? || File.mtime(@file_path) > @last_change - File.open(@file_path) do |file| - @cache = Marshal.load(file) - @last_change = file.mtime - end - end - end - return @cache - end - - # Write the entire cache contents to disk. - def write_file - File.open(@file_path, 'w') do |file| - Marshal.dump(@cache, file) - end - @last_change = File.mtime(@file_path) - end - end - end - end -end \ No newline at end of file diff --git a/lib/google/api_client/service/stub_generator.rb b/lib/google/api_client/service/stub_generator.rb deleted file mode 100755 index 3c84dddbd..000000000 --- a/lib/google/api_client/service/stub_generator.rb +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'active_support/inflector' - -module Google - class APIClient - class Service - ## - # Auxiliary mixin to generate resource and method stubs. - # Used by the Service and Service::Resource classes to generate both - # top-level and nested resources and methods. - module StubGenerator - def generate_call_stubs(service, root) - metaclass = (class << self; self; end) - - # Handle resources. - root.discovered_resources.each do |resource| - method_name = ActiveSupport::Inflector.underscore(resource.name).to_sym - if !self.respond_to?(method_name) - metaclass.send(:define_method, method_name) do - Google::APIClient::Service::Resource.new(service, resource) - end - end - end - - # Handle methods. - root.discovered_methods.each do |method| - method_name = ActiveSupport::Inflector.underscore(method.name).to_sym - if !self.respond_to?(method_name) - metaclass.send(:define_method, method_name) do |*args| - if args.length > 1 - raise ArgumentError, - "wrong number of arguments (#{args.length} for 1)" - elsif !args.first.respond_to?(:to_hash) && !args.first.nil? - raise ArgumentError, - "expected parameter Hash, got #{args.first.class}" - else - return Google::APIClient::Service::Request.new( - service, method, args.first - ) - end - end - end - end - end - end - end - end -end diff --git a/lib/google/api_client/service_account.rb b/lib/google/api_client/service_account.rb deleted file mode 100644 index 3d941ae07..000000000 --- a/lib/google/api_client/service_account.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'google/api_client/auth/pkcs12' -require 'google/api_client/auth/jwt_asserter' -require 'google/api_client/auth/key_utils' -require 'google/api_client/auth/compute_service_account' -require 'google/api_client/auth/storage' -require 'google/api_client/auth/storages/redis_store' -require 'google/api_client/auth/storages/file_store' diff --git a/lib/google/api_client/version.rb b/lib/google/api_client/version.rb deleted file mode 100644 index 18d4ec22c..000000000 --- a/lib/google/api_client/version.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -module Google - class APIClient - module VERSION - MAJOR = 0 - MINOR = 8 - TINY = 6 - PATCH = nil - STRING = [MAJOR, MINOR, TINY, PATCH].compact.join('.') - end - end -end diff --git a/spec/fixtures/files/auth_stored_credentials.json b/spec/fixtures/files/auth_stored_credentials.json deleted file mode 100644 index 4cd786e4a..000000000 --- a/spec/fixtures/files/auth_stored_credentials.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "access_token":"access_token_123456789", - "authorization_uri":"https://accounts.google.com/o/oauth2/auth", - "client_id":"123456789p.apps.googleusercontent.com", - "client_secret":"very_secret", - "expires_in":3600, - "refresh_token":"refresh_token_12345679", - "token_credential_uri":"https://accounts.google.com/o/oauth2/token", - "issued_at":1386053761} \ No newline at end of file diff --git a/spec/fixtures/files/client_secrets.json b/spec/fixtures/files/client_secrets.json deleted file mode 100644 index 05fa7cbb5..000000000 --- a/spec/fixtures/files/client_secrets.json +++ /dev/null @@ -1 +0,0 @@ -{"installed":{"auth_uri":"https://accounts.google.com/o/oauth2/auth","client_secret":"i8YaXdGgiQ4_KrTVNGsB7QP1","token_uri":"https://accounts.google.com/o/oauth2/token","client_email":"","client_x509_cert_url":"","client_id":"898243283568.apps.googleusercontent.com","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs"}} \ No newline at end of file diff --git a/spec/fixtures/files/privatekey.p12 b/spec/fixtures/files/privatekey.p12 deleted file mode 100644 index 1e737a93a..000000000 Binary files a/spec/fixtures/files/privatekey.p12 and /dev/null differ diff --git a/spec/fixtures/files/sample.txt b/spec/fixtures/files/sample.txt deleted file mode 100644 index fe9a30d95..000000000 --- a/spec/fixtures/files/sample.txt +++ /dev/null @@ -1,33 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus posuere urna bibendum diam vulputate fringilla. Fusce elementum fermentum justo id aliquam. Integer vel felis ut arcu elementum lacinia. Duis congue urna eget nisl dapibus tristique molestie turpis sollicitudin. Vivamus in justo quam. Proin condimentum mollis tortor at molestie. Cras luctus, nunc a convallis iaculis, est risus consequat nisi, sit amet sollicitudin metus mi a urna. Aliquam accumsan, massa quis condimentum varius, sapien massa faucibus nibh, a dignissim magna nibh a lacus. Nunc aliquet, nunc ac pulvinar consectetur, sapien lacus hendrerit enim, nec dapibus lorem mi eget risus. Praesent vitae justo eget dolor blandit ullamcorper. Duis id nibh vitae sem aliquam vehicula et ac massa. In neque elit, molestie pulvinar viverra at, vestibulum quis velit. - -Mauris sit amet placerat enim. Duis vel tellus ac dui auctor tincidunt id nec augue. Donec ut blandit turpis. Mauris dictum urna id urna vestibulum accumsan. Maecenas sagittis urna vitae erat facilisis gravida. Phasellus tellus augue, commodo ut iaculis vitae, interdum ut dolor. Proin at dictum lorem. Quisque pellentesque neque ante, vitae rutrum elit. Pellentesque sit amet erat orci. Praesent justo diam, tristique eu tempus ut, vestibulum eget dui. Maecenas et elementum justo. Cras a augue a elit porttitor placerat eget ut magna. - -Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam adipiscing tellus in arcu bibendum volutpat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed laoreet faucibus tristique. Duis metus eros, molestie eget dignissim in, imperdiet fermentum nulla. Vestibulum laoreet lorem eu justo vestibulum lobortis. Praesent pharetra leo vel mauris rhoncus commodo sollicitudin ante auctor. Ut sagittis, tortor nec placerat rutrum, neque ipsum cursus nisl, ut lacinia magna risus ac risus. Sed volutpat commodo orci, sodales fermentum dui accumsan eu. Donec egestas ullamcorper elit at condimentum. In euismod sodales posuere. Nullam lacinia tempus molestie. Etiam vitae ullamcorper dui. Fusce congue suscipit arcu, at consectetur diam gravida id. Quisque augue urna, commodo eleifend volutpat vitae, tincidunt ac ligula. Curabitur eget orci nisl, vel placerat ipsum. - -Curabitur rutrum euismod nisi, consectetur varius tortor condimentum non. Pellentesque rhoncus nisi eu purus ultricies suscipit. Morbi ante nisi, varius nec molestie bibendum, pharetra quis enim. Proin eget nunc ante. Cras aliquam enim vel nunc laoreet ut facilisis nunc interdum. Fusce libero ipsum, posuere eget blandit quis, bibendum vitae quam. Integer dictum faucibus lacus eget facilisis. Duis adipiscing tortor magna, vel tincidunt risus. In non augue eu nisl sodales cursus vel eget nisi. Maecenas dignissim lectus elementum eros fermentum gravida et eget leo. Aenean quis cursus arcu. Mauris posuere purus non diam mattis vehicula. Integer nec orci velit. - -Integer ac justo ac magna adipiscing condimentum vitae tincidunt dui. Morbi augue arcu, blandit nec interdum sit amet, condimentum vel nisl. Nulla vehicula tincidunt laoreet. Aliquam ornare elementum urna, sed vehicula magna porta id. Vestibulum dictum ultrices tortor sit amet tincidunt. Praesent bibendum, metus vel volutpat interdum, nisl nunc cursus libero, vel congue ligula mi et felis. Nulla mollis elementum nulla, in accumsan risus consequat at. Suspendisse potenti. Vestibulum enim lorem, dignissim ut porta vestibulum, porta eget mi. Fusce a elit ac dui sodales gravida. Pellentesque sed elit at dui dapibus mattis a non arcu. - -Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In nec posuere augue. Praesent non suscipit arcu. Sed nibh risus, lacinia ut molestie vitae, tristique eget turpis. Sed pretium volutpat arcu, non rutrum leo volutpat sed. Maecenas quis neque nisl, sit amet ornare dolor. Nulla pharetra pulvinar tellus sed eleifend. Aliquam eget mattis nulla. Nulla dictum vehicula velit, non facilisis lorem volutpat id. Fusce scelerisque sem vitae purus dapibus lobortis. Mauris ac turpis nec nibh consequat porttitor. Ut sit amet iaculis lorem. Vivamus blandit erat ac odio venenatis fringilla a sit amet ante. Quisque ut urna sed augue laoreet sagittis. - -Integer nisl urna, bibendum id lobortis in, tempor non velit. Fusce sed volutpat quam. Suspendisse eu placerat purus. Maecenas quis feugiat lectus. Sed accumsan malesuada dui, a pretium purus facilisis quis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc ac purus id lacus malesuada placerat et in nunc. Ut imperdiet tincidunt est, at consectetur augue egestas hendrerit. Pellentesque eu erat a dui dignissim adipiscing. Integer quis leo non felis placerat eleifend. Fusce luctus mi a lorem mattis eget accumsan libero posuere. Sed pellentesque, odio id pharetra tempus, enim quam placerat metus, auctor aliquam elit mi facilisis quam. Nam at velit et eros rhoncus accumsan. - -Donec tellus diam, fringilla ac viverra fringilla, rhoncus sit amet purus. Cras et ligula sed nibh tempor gravida. Aliquam id tempus mauris. Ut convallis quam sed arcu varius eget mattis magna tincidunt. Aliquam et suscipit est. Sed metus augue, tristique sed accumsan eget, euismod et augue. Nam augue sapien, placerat vel facilisis eu, tempor id risus. Aliquam mollis egestas mi. Fusce scelerisque convallis mauris quis blandit. Mauris nec ante id lacus sagittis tincidunt ornare vehicula dui. Curabitur tristique mattis nunc, vel cursus libero viverra feugiat. Suspendisse at sapien velit, a lacinia dolor. Vivamus in est non odio feugiat lacinia sodales ut magna. - -Donec interdum ligula id ipsum dapibus consectetur. Pellentesque vitae posuere ligula. Morbi rhoncus bibendum eleifend. Suspendisse fringilla nunc at elit malesuada vitae ullamcorper lorem laoreet. Suspendisse a ante at ipsum iaculis cursus. Duis accumsan ligula quis nibh luctus pretium. Duis ultrices scelerisque dolor, et vulputate lectus commodo ut. - -Vestibulum ac tincidunt lorem. Vestibulum lorem massa, dictum a scelerisque ut, convallis vitae eros. Morbi ipsum nisl, lacinia non tempor nec, lobortis id diam. Fusce quis magna nunc. Proin ultricies congue justo sed mattis. Vestibulum sit amet arcu tellus. Quisque ultricies porta massa iaculis vehicula. Vestibulum sollicitudin tempor urna vel sodales. Pellentesque ultricies tellus vel metus porta nec iaculis sapien mollis. Maecenas ullamcorper, metus eget imperdiet sagittis, odio orci dapibus neque, in vulputate nunc nibh non libero. Donec velit quam, lobortis quis tempus a, hendrerit id arcu. - -Donec nec ante at tortor dignissim mattis. Curabitur vehicula tincidunt magna id sagittis. Proin euismod dignissim porta. Curabitur non turpis purus, in rutrum nulla. Nam turpis nulla, tincidunt et hendrerit non, posuere nec enim. Curabitur leo enim, lobortis ut placerat id, condimentum nec massa. In bibendum, lectus sit amet molestie commodo, felis massa rutrum nisl, ac fermentum ligula lacus in ipsum. - -Pellentesque mi nulla, scelerisque vitae tempus id, consequat a augue. Quisque vel nisi sit amet ipsum faucibus laoreet sed vitae lorem. Praesent nunc tortor, volutpat ac commodo non, pharetra sed neque. Curabitur nec felis at mi blandit aliquet eu ornare justo. Mauris dignissim purus quis nisl porttitor interdum. Aenean id ipsum enim, blandit commodo justo. Quisque facilisis elit quis velit commodo scelerisque lobortis sapien condimentum. Cras sit amet porttitor velit. Praesent nec tempor arcu. - -Donec varius mi adipiscing elit semper vel feugiat ipsum dictum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non quam nisl, ac mattis justo. Vestibulum sed massa eget velit tristique auctor ut ac sapien. Curabitur aliquet ligula eget dui ornare at scelerisque mauris faucibus. Vestibulum id mauris metus, sed vestibulum nibh. Nulla egestas dictum blandit. Mauris vitae nibh at dui mollis lobortis. Phasellus sem leo, euismod at fringilla quis, mollis in nibh. Aenean vel lacus et elit pharetra elementum. Aliquam at ligula id sem bibendum volutpat. Pellentesque quis elit a massa dapibus viverra ut et lorem. Donec nulla eros, iaculis nec commodo vel, suscipit sit amet tortor. Integer tempor, elit at viverra imperdiet, velit sapien laoreet nunc, id laoreet ligula risus vel risus. Nullam sed tortor metus. - -In nunc orci, tempor vulputate pretium vel, suscipit quis risus. Suspendisse accumsan facilisis felis eget posuere. Donec a faucibus felis. Proin nibh erat, sollicitudin quis vestibulum id, tincidunt quis justo. In sed purus eu nisi dignissim condimentum. Sed mattis dapibus lorem id vulputate. Suspendisse nec elit a augue interdum consequat quis id magna. In eleifend aliquam tempor. In in lacus augue. - -Ut euismod sollicitudin lorem, id aliquam magna dictum sed. Nunc fringilla lobortis nisi sed consectetur. Nulla facilisi. Aenean nec lobortis augue. Curabitur ullamcorper dapibus libero, vel pellentesque arcu sollicitudin non. Praesent varius, turpis nec sollicitudin bibendum, elit tortor rhoncus lacus, gravida luctus leo nisi in felis. Ut metus eros, molestie non faucibus vel, condimentum ac elit. - -Suspendisse nisl justo, lacinia sit amet interdum nec, tincidunt placerat urna. Suspendisse potenti. In et odio sed purus malesuada cursus sed nec lectus. Cras commodo, orci sit amet hendrerit iaculis, nunc urna facilisis tellus, vel laoreet odio nulla quis nibh. Maecenas ut justo ut lacus posuere sodales. Vestibulum facilisis fringilla diam at volutpat. Proin a hendrerit urna. Aenean placerat pulvinar arcu, sit amet lobortis neque eleifend in. Aenean risus nulla, facilisis ut tincidunt vitae, fringilla at ligula. Praesent eleifend est at sem lacinia auctor. Nulla ornare nunc in erat laoreet blandit. - -Suspendisse pharetra leo ac est porta consequat. Nunc sem nibh, gravida vel aliquam a, ornare in tortor. Nulla vel sapien et felis placerat pellentesque id scelerisque nisl. Praesent et posuere. \ No newline at end of file diff --git a/spec/fixtures/files/secret.pem b/spec/fixtures/files/secret.pem deleted file mode 100644 index 28b8d1205..000000000 --- a/spec/fixtures/files/secret.pem +++ /dev/null @@ -1,19 +0,0 @@ -Bag Attributes - friendlyName: privatekey - localKeyID: 54 69 6D 65 20 31 33 35 31 38 38 38 31 37 38 36 39 36 -Key Attributes: ------BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQDYDyPb3GhyFx5i/wxS/jFsO6wSLys1ehAk6QZoBXGlg7ETVrIJ -HYh9gXQUno4tJiQoaO8wOvleIRrqI0LkiftCXKWVSrzOiV+O9GkKx1byw1yAIZus -QdwMT7X0O9hrZLZwhICWC9s6cGhnlCVxLIP/+JkVK7hxEq/LxoSszNV77wIDAQAB -AoGAa2G69L7quil7VMBmI6lqbtyJfNAsrXtpIq8eG/z4qsZ076ObAKTI/XeldcoH -57CZL+xXVKU64umZMt0rleJuGXdlauEUbsSx+biGewRfGTgC4rUSjmE539rBvmRW -gaKliorepPMp/+B9CcG/2YfDPRvG/2cgTXJHVvneo+xHL4ECQQD2Jx5Mvs8z7s2E -jY1mkpRKqh4Z7rlitkAwe1NXcVC8hz5ASu7ORyTl8EPpKAfRMYl1ofK/ozT1URXf -kL5nChPfAkEA4LPUJ6cqrY4xrrtdGaM4iGIxzen5aZlKz/YNlq5LuQKbnLLHMuXU -ohp/ynpqNWbcAFbmtGSMayxGKW5+fJgZ8QJAUBOZv82zCmn9YcnK3juBEmkVMcp/ -dKVlbGAyVJgAc9RrY+78kQ6D6mmnLgpfwKYk2ae9mKo3aDbgrsIfrtWQcQJAfFGi -CEpJp3orbLQG319ZsMM7MOTJdC42oPZOMFbAWFzkAX88DKHx0bn9h+XQizkccSej -Ppz+v3DgZJ3YZ1Cz0QJBALiqIokZ+oa3AY6oT0aiec6txrGvNPPbwOsrBpFqGNbu -AByzWWBoBi40eKMSIR30LqN9H8YnJ91Aoy1njGYyQaw= ------END RSA PRIVATE KEY----- diff --git a/spec/fixtures/files/zoo.json b/spec/fixtures/files/zoo.json deleted file mode 100644 index 4abd957c9..000000000 --- a/spec/fixtures/files/zoo.json +++ /dev/null @@ -1,584 +0,0 @@ -{ - "kind": "discovery#describeItem", - "name": "zoo", - "version": "v1", - "description": "Zoo API used for testing", - "basePath": "/zoo/", - "rootUrl": "https://www.googleapis.com/", - "servicePath": "zoo/v1/", - "rpcPath": "/rpc", - "parameters": { - "alt": { - "type": "string", - "description": "Data format for the response.", - "default": "json", - "enum": [ - "json" - ], - "enumDescriptions": [ - "Responses with Content-Type of application/json" - ], - "location": "query" - }, - "fields": { - "type": "string", - "description": "Selector specifying which fields to include in a partial response.", - "location": "query" - }, - "key": { - "type": "string", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "location": "query" - }, - "oauth_token": { - "type": "string", - "description": "OAuth 2.0 token for the current user.", - "location": "query" - }, - "prettyPrint": { - "type": "boolean", - "description": "Returns response with indentations and line breaks.", - "default": "true", - "location": "query" - }, - "quotaUser": { - "type": "string", - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.", - "location": "query" - }, - "userIp": { - "type": "string", - "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.", - "location": "query" - } - }, - "features": [ - "dataWrapper" - ], - "schemas": { - "Animal": { - "id": "Animal", - "type": "object", - "properties": { - "etag": { - "type": "string" - }, - "kind": { - "type": "string", - "default": "zoo#animal" - }, - "name": { - "type": "string" - }, - "photo": { - "type": "object", - "properties": { - "filename": { - "type": "string" - }, - "hash": { - "type": "string" - }, - "hashAlgorithm": { - "type": "string" - }, - "size": { - "type": "integer" - }, - "type": { - "type": "string" - } - } - } - } - }, - "Animal2": { - "id": "Animal2", - "type": "object", - "properties": { - "kind": { - "type": "string", - "default": "zoo#animal" - }, - "name": { - "type": "string" - } - } - }, - "AnimalFeed": { - "id": "AnimalFeed", - "type": "object", - "properties": { - "etag": { - "type": "string" - }, - "items": { - "type": "array", - "items": { - "$ref": "Animal" - } - }, - "kind": { - "type": "string", - "default": "zoo#animalFeed" - } - } - }, - "AnimalMap": { - "id": "AnimalMap", - "type": "object", - "properties": { - "etag": { - "type": "string" - }, - "animals": { - "type": "object", - "description": "Map of animal id to animal data", - "additionalProperties": { - "$ref": "Animal" - } - }, - "kind": { - "type": "string", - "default": "zoo#animalMap" - } - } - }, - "LoadFeed": { - "id": "LoadFeed", - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "type": "object", - "properties": { - "doubleVal": { - "type": "number" - }, - "nullVal": { - "type": "null" - }, - "booleanVal": { - "type": "boolean", - "description": "True or False." - }, - "anyVal": { - "type": "any", - "description": "Anything will do." - }, - "enumVal": { - "type": "string" - }, - "kind": { - "type": "string", - "default": "zoo#loadValue" - }, - "longVal": { - "type": "integer" - }, - "stringVal": { - "type": "string" - } - } - } - }, - "kind": { - "type": "string", - "default": "zoo#loadFeed" - } - } - } - }, - "methods": { - "query": { - "path": "query", - "id": "bigquery.query", - "httpMethod": "GET", - "parameters": { - "q": { - "type": "string", - "location": "query", - "required": false, - "repeated": false - }, - "i": { - "type": "integer", - "location": "query", - "required": false, - "repeated": false, - "minimum": "0", - "maximum": "4294967295", - "default": "20" - }, - "n": { - "type": "number", - "location": "query", - "required": false, - "repeated": false - }, - "b": { - "type": "boolean", - "location": "query", - "required": false, - "repeated": false - }, - "a": { - "type": "any", - "location": "query", - "required": false, - "repeated": false - }, - "o": { - "type": "object", - "location": "query", - "required": false, - "repeated": false - }, - "e": { - "type": "string", - "location": "query", - "required": false, - "repeated": false, - "enum": [ - "foo", - "bar" - ] - }, - "er": { - "type": "string", - "location": "query", - "required": false, - "repeated": true, - "enum": [ - "one", - "two", - "three" - ] - }, - "rr": { - "type": "string", - "location": "query", - "required": false, - "repeated": true, - "pattern": "[a-z]+" - } - } - } - }, - "resources": { - "my": { - "resources": { - "favorites": { - "methods": { - "list": { - "path": "favorites/@me/mine", - "id": "zoo.animals.mine", - "httpMethod": "GET", - "parameters": { - "max-results": { - "location": "query", - "required": false - } - } - } - } - } - } - }, - "global": { - "resources": { - "print": { - "methods": { - "assert": { - "path": "global/print/assert", - "id": "zoo.animals.mine", - "httpMethod": "GET", - "parameters": { - "max-results": { - "location": "query", - "required": false - } - } - } - } - } - } - }, - "animals": { - "methods": { - "crossbreed": { - "path": "animals/crossbreed", - "id": "zoo.animals.crossbreed", - "httpMethod": "POST", - "description": "Cross-breed animals", - "response": { - "$ref": "Animal2" - }, - "mediaUpload": { - "accept": [ - "image/png" - ], - "protocols": { - "simple": { - "multipart": true, - "path": "upload/activities/{userId}/@self" - }, - "resumable": { - "multipart": true, - "path": "upload/activities/{userId}/@self" - } - } - } - }, - "delete": { - "path": "animals/{name}", - "id": "zoo.animals.delete", - "httpMethod": "DELETE", - "description": "Delete animals", - "parameters": { - "name": { - "location": "path", - "required": true, - "description": "Name of the animal to delete", - "type": "string" - } - }, - "parameterOrder": [ - "name" - ] - }, - "get": { - "path": "animals/{name}", - "id": "zoo.animals.get", - "httpMethod": "GET", - "description": "Get animals", - "supportsMediaDownload": true, - "parameters": { - "name": { - "location": "path", - "required": true, - "description": "Name of the animal to load", - "type": "string" - }, - "projection": { - "location": "query", - "type": "string", - "enum": [ - "full" - ], - "enumDescriptions": [ - "Include everything" - ] - } - }, - "parameterOrder": [ - "name" - ], - "response": { - "$ref": "Animal" - } - }, - "getmedia": { - "path": "animals/{name}", - "id": "zoo.animals.get", - "httpMethod": "GET", - "description": "Get animals", - "parameters": { - "name": { - "location": "path", - "required": true, - "description": "Name of the animal to load", - "type": "string" - }, - "projection": { - "location": "query", - "type": "string", - "enum": [ - "full" - ], - "enumDescriptions": [ - "Include everything" - ] - } - }, - "parameterOrder": [ - "name" - ] - }, - "insert": { - "path": "animals", - "id": "zoo.animals.insert", - "httpMethod": "POST", - "description": "Insert animals", - "request": { - "$ref": "Animal" - }, - "response": { - "$ref": "Animal" - }, - "mediaUpload": { - "accept": [ - "image/png" - ], - "maxSize": "1KB", - "protocols": { - "simple": { - "multipart": true, - "path": "upload/activities/{userId}/@self" - }, - "resumable": { - "multipart": true, - "path": "upload/activities/{userId}/@self" - } - } - } - }, - "list": { - "path": "animals", - "id": "zoo.animals.list", - "httpMethod": "GET", - "description": "List animals", - "parameters": { - "max-results": { - "location": "query", - "description": "Maximum number of results to return", - "type": "integer", - "minimum": "0" - }, - "name": { - "location": "query", - "description": "Restrict result to animals with this name", - "type": "string" - }, - "projection": { - "location": "query", - "type": "string", - "enum": [ - "full" - ], - "enumDescriptions": [ - "Include absolutely everything" - ] - }, - "start-token": { - "location": "query", - "description": "Pagination token", - "type": "string" - } - }, - "response": { - "$ref": "AnimalFeed" - } - }, - "patch": { - "path": "animals/{name}", - "id": "zoo.animals.patch", - "httpMethod": "PATCH", - "description": "Update animals", - "parameters": { - "name": { - "location": "path", - "required": true, - "description": "Name of the animal to update", - "type": "string" - } - }, - "parameterOrder": [ - "name" - ], - "request": { - "$ref": "Animal" - }, - "response": { - "$ref": "Animal" - } - }, - "update": { - "path": "animals/{name}", - "id": "zoo.animals.update", - "httpMethod": "PUT", - "description": "Update animals", - "parameters": { - "name": { - "location": "path", - "description": "Name of the animal to update", - "type": "string" - } - }, - "parameterOrder": [ - "name" - ], - "request": { - "$ref": "Animal" - }, - "response": { - "$ref": "Animal" - } - } - } - }, - "load": { - "methods": { - "list": { - "path": "load", - "id": "zoo.load.list", - "httpMethod": "GET", - "response": { - "$ref": "LoadFeed" - } - } - } - }, - "loadNoTemplate": { - "methods": { - "list": { - "path": "loadNoTemplate", - "id": "zoo.loadNoTemplate.list", - "httpMethod": "GET" - } - } - }, - "scopedAnimals": { - "methods": { - "list": { - "path": "scopedanimals", - "id": "zoo.scopedAnimals.list", - "httpMethod": "GET", - "description": "List animals (scoped)", - "parameters": { - "max-results": { - "location": "query", - "description": "Maximum number of results to return", - "type": "integer", - "minimum": "0" - }, - "name": { - "location": "query", - "description": "Restrict result to animals with this name", - "type": "string" - }, - "projection": { - "location": "query", - "type": "string", - "enum": [ - "full" - ], - "enumDescriptions": [ - "Include absolutely everything" - ] - }, - "start-token": { - "location": "query", - "description": "Pagination token", - "type": "string" - } - }, - "response": { - "$ref": "AnimalFeed" - } - } - } - } - } -} \ No newline at end of file diff --git a/spec/google/api_client/auth/storage_spec.rb b/spec/google/api_client/auth/storage_spec.rb deleted file mode 100644 index d8e5b960c..000000000 --- a/spec/google/api_client/auth/storage_spec.rb +++ /dev/null @@ -1,122 +0,0 @@ -require 'spec_helper' - -require 'google/api_client' -require 'google/api_client/version' - -describe Google::APIClient::Storage do - let(:client) { Google::APIClient.new(:application_name => 'API Client Tests') } - let(:root_path) { File.expand_path(File.join(__FILE__, '..', '..', '..')) } - let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) } - - let(:store) { double } - let(:client_stub) { double } - subject { Google::APIClient::Storage.new(store) } - - describe 'authorize' do - it 'should authorize' do - expect(subject).to respond_to(:authorization) - expect(subject.store).to be == store - end - end - - describe 'authorize' do - describe 'with credentials' do - - it 'should initialize a new OAuth Client' do - expect(subject).to receive(:load_credentials).and_return({:first => 'a dummy'}) - expect(client_stub).to receive(:issued_at=) - expect(client_stub).to receive(:expired?).and_return(false) - expect(Signet::OAuth2::Client).to receive(:new).and_return(client_stub) - expect(subject).not_to receive(:refresh_authorization) - subject.authorize - end - - it 'should refresh authorization' do - expect(subject).to receive(:load_credentials).and_return({:first => 'a dummy'}) - expect(client_stub).to receive(:issued_at=) - expect(client_stub).to receive(:expired?).and_return(true) - expect(Signet::OAuth2::Client).to receive(:new).and_return(client_stub) - expect(subject).to receive(:refresh_authorization) - auth = subject.authorize - expect(auth).to be == subject.authorization - expect(auth).not_to be_nil - end - end - - describe 'without credentials' do - - it 'should return nil' do - expect(subject.authorization).to be_nil - expect(subject).to receive(:load_credentials).and_return({}) - expect(subject.authorize).to be_nil - expect(subject.authorization).to be_nil - end - end - end - - describe 'write_credentials' do - it 'should call store to write credentials' do - authorization_stub = double - expect(authorization_stub).to receive(:refresh_token).and_return(true) - expect(subject).to receive(:credentials_hash) - expect(subject.store).to receive(:write_credentials) - subject.write_credentials(authorization_stub) - expect(subject.authorization).to be == authorization_stub - end - - it 'should not call store to write credentials' do - expect(subject).not_to receive(:credentials_hash) - expect(subject.store).not_to receive(:write_credentials) - expect { - subject.write_credentials() - }.not_to raise_error - end - it 'should not call store to write credentials' do - expect(subject).not_to receive(:credentials_hash) - expect(subject.store).not_to receive(:write_credentials) - expect { - subject.write_credentials('something') - }.not_to raise_error - end - - end - - describe 'refresh_authorization' do - it 'should call refresh and write credentials' do - expect(subject).to receive(:write_credentials) - authorization_stub = double - expect(subject).to receive(:authorization).and_return(authorization_stub) - expect(authorization_stub).to receive(:refresh!).and_return(true) - subject.refresh_authorization - end - end - - describe 'load_credentials' do - it 'should call store to load credentials' do - expect(subject.store).to receive(:load_credentials) - subject.send(:load_credentials) - end - end - - describe 'credentials_hash' do - it 'should return an hash' do - authorization_stub = double - expect(authorization_stub).to receive(:access_token) - expect(authorization_stub).to receive(:client_id) - expect(authorization_stub).to receive(:client_secret) - expect(authorization_stub).to receive(:expires_in) - expect(authorization_stub).to receive(:refresh_token) - expect(authorization_stub).to receive(:issued_at).and_return('100') - allow(subject).to receive(:authorization).and_return(authorization_stub) - credentials = subject.send(:credentials_hash) - expect(credentials).to include(:access_token) - expect(credentials).to include(:authorization_uri) - expect(credentials).to include(:client_id) - expect(credentials).to include(:client_secret) - expect(credentials).to include(:expires_in) - expect(credentials).to include(:refresh_token) - expect(credentials).to include(:token_credential_uri) - expect(credentials).to include(:issued_at) - end - end -end diff --git a/spec/google/api_client/auth/storages/file_store_spec.rb b/spec/google/api_client/auth/storages/file_store_spec.rb deleted file mode 100644 index 2963b1d45..000000000 --- a/spec/google/api_client/auth/storages/file_store_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'spec_helper' - -require 'google/api_client' -require 'google/api_client/version' - -describe Google::APIClient::FileStore do - let(:root_path) { File.expand_path(File.join(__FILE__, '..','..','..', '..','..')) } - let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) } - - let(:credentials_hash) {{ - "access_token"=>"my_access_token", - "authorization_uri"=>"https://accounts.google.com/o/oauth2/auth", - "client_id"=>"123456_test_client_id@.apps.googleusercontent.com", - "client_secret"=>"123456_client_secret", - "expires_in"=>3600, - "refresh_token"=>"my_refresh_token", - "token_credential_uri"=>"https://accounts.google.com/o/oauth2/token", - "issued_at"=>1384440275 - }} - - subject{Google::APIClient::FileStore.new('a file path')} - - it 'should have a path' do - expect(subject.path).to be == 'a file path' - subject.path = 'an other file path' - expect(subject.path).to be == 'an other file path' - end - - it 'should load credentials' do - subject.path = json_file - credentials = subject.load_credentials - expect(credentials).to include('access_token', 'authorization_uri', 'refresh_token') - end - - it 'should write credentials' do - io_stub = StringIO.new - expect(subject).to receive(:open).and_return(io_stub) - subject.write_credentials(credentials_hash) - end -end diff --git a/spec/google/api_client/auth/storages/redis_store_spec.rb b/spec/google/api_client/auth/storages/redis_store_spec.rb deleted file mode 100644 index de5abc4a1..000000000 --- a/spec/google/api_client/auth/storages/redis_store_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -require 'spec_helper' - -require 'google/api_client' -require 'google/api_client/version' - - -describe Google::APIClient::RedisStore do - let(:root_path) { File.expand_path(File.join(__FILE__, '..', '..', '..', '..', '..')) } - let(:json_file) { File.expand_path(File.join(root_path, 'fixtures', 'files', 'auth_stored_credentials.json')) } - let(:redis) {double} - - let(:credentials_hash) { { - "access_token" => "my_access_token", - "authorization_uri" => "https://accounts.google.com/o/oauth2/auth", - "client_id" => "123456_test_client_id@.apps.googleusercontent.com", - "client_secret" => "123456_client_secret", - "expires_in" => 3600, - "refresh_token" => "my_refresh_token", - "token_credential_uri" => "https://accounts.google.com/o/oauth2/token", - "issued_at" => 1384440275 - } } - - subject { Google::APIClient::RedisStore.new('a redis instance') } - - it 'should have a redis instance' do - expect(subject.redis).to be == 'a redis instance' - subject.redis = 'an other redis instance' - expect(subject.redis).to be == 'an other redis instance' - end - - describe 'load_credentials' do - - it 'should load credentials' do - subject.redis= redis - expect(redis).to receive(:get).and_return(credentials_hash.to_json) - expect(subject.load_credentials).to be == credentials_hash - end - - it 'should return nil' do - subject.redis= redis - expect(redis).to receive(:get).and_return(nil) - expect(subject.load_credentials).to be_nil - end - end - - describe 'redis_credentials_key' do - context 'without given key' do - it 'should return default key' do - expect(subject.redis_credentials_key).to be == "google_api_credentials" - end - end - context 'with given key' do - let(:redis_store) { Google::APIClient::RedisStore.new('a redis instance', 'another_google_api_credentials') } - it 'should use given key' do - expect(redis_store.redis_credentials_key).to be == "another_google_api_credentials" - end - end - - end - - describe 'write credentials' do - - it 'should write credentials' do - subject.redis= redis - expect(redis).to receive(:set).and_return('ok') - expect(subject.write_credentials(credentials_hash)).to be_truthy - end - end - -end diff --git a/spec/google/api_client/batch_spec.rb b/spec/google/api_client/batch_spec.rb deleted file mode 100644 index 3aa95a88b..000000000 --- a/spec/google/api_client/batch_spec.rb +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' -require 'google/api_client' - -RSpec.describe Google::APIClient::BatchRequest do - CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT) - - after do - # Reset client to not-quite-pristine state - CLIENT.key = nil - CLIENT.user_ip = nil - end - - it 'should raise an error if making an empty batch request' do - batch = Google::APIClient::BatchRequest.new - - expect(lambda do - CLIENT.execute(batch) - end).to raise_error(Google::APIClient::BatchError) - end - - it 'should allow query parameters in batch requests' do - batch = Google::APIClient::BatchRequest.new - batch.add(:uri => 'https://example.com', :parameters => { - 'a' => '12345' - }) - method, uri, headers, body = batch.to_http_request - expect(body.read).to include("/?a=12345") - end - - describe 'with the discovery API' do - before do - CLIENT.authorization = nil - @discovery = CLIENT.discovered_api('discovery', 'v1') - end - - describe 'with two valid requests' do - before do - @call1 = { - :api_method => @discovery.apis.get_rest, - :parameters => { - 'api' => 'plus', - 'version' => 'v1' - } - } - - @call2 = { - :api_method => @discovery.apis.get_rest, - :parameters => { - 'api' => 'discovery', - 'version' => 'v1' - } - } - end - - it 'should execute both when using a global callback' do - block_called = 0 - ids = ['first_call', 'second_call'] - expected_ids = ids.clone - batch = Google::APIClient::BatchRequest.new do |result| - block_called += 1 - expect(result.status).to eq(200) - expect(expected_ids).to include(result.response.call_id) - expected_ids.delete(result.response.call_id) - end - - batch.add(@call1, ids[0]) - batch.add(@call2, ids[1]) - - CLIENT.execute(batch) - expect(block_called).to eq(2) - end - - it 'should execute both when using individual callbacks' do - batch = Google::APIClient::BatchRequest.new - - call1_returned, call2_returned = false, false - batch.add(@call1) do |result| - call1_returned = true - expect(result.status).to eq(200) - end - batch.add(@call2) do |result| - call2_returned = true - expect(result.status).to eq(200) - end - - CLIENT.execute(batch) - expect(call1_returned).to be_truthy - expect(call2_returned).to be_truthy - end - - it 'should raise an error if using the same call ID more than once' do - batch = Google::APIClient::BatchRequest.new - - expect(lambda do - batch.add(@call1, 'my_id') - batch.add(@call2, 'my_id') - end).to raise_error(Google::APIClient::BatchError) - end - end - - describe 'with a valid request and an invalid one' do - before do - @call1 = { - :api_method => @discovery.apis.get_rest, - :parameters => { - 'api' => 'plus', - 'version' => 'v1' - } - } - - @call2 = { - :api_method => @discovery.apis.get_rest, - :parameters => { - 'api' => 0, - 'version' => 1 - } - } - end - - it 'should execute both when using a global callback' do - block_called = 0 - ids = ['first_call', 'second_call'] - expected_ids = ids.clone - batch = Google::APIClient::BatchRequest.new do |result| - block_called += 1 - expect(expected_ids).to include(result.response.call_id) - expected_ids.delete(result.response.call_id) - if result.response.call_id == ids[0] - expect(result.status).to eq(200) - else - expect(result.status).to be >= 400 - expect(result.status).to be < 500 - end - end - - batch.add(@call1, ids[0]) - batch.add(@call2, ids[1]) - - CLIENT.execute(batch) - expect(block_called).to eq(2) - end - - it 'should execute both when using individual callbacks' do - batch = Google::APIClient::BatchRequest.new - - call1_returned, call2_returned = false, false - batch.add(@call1) do |result| - call1_returned = true - expect(result.status).to eq(200) - end - batch.add(@call2) do |result| - call2_returned = true - expect(result.status).to be >= 400 - expect(result.status).to be < 500 - end - - CLIENT.execute(batch) - expect(call1_returned).to be_truthy - expect(call2_returned).to be_truthy - end - end - end - - describe 'with the calendar API' do - before do - CLIENT.authorization = nil - @calendar = CLIENT.discovered_api('calendar', 'v3') - end - - describe 'with two valid requests' do - before do - event1 = { - 'summary' => 'Appointment 1', - 'location' => 'Somewhere', - 'start' => { - 'dateTime' => '2011-01-01T10:00:00.000-07:00' - }, - 'end' => { - 'dateTime' => '2011-01-01T10:25:00.000-07:00' - }, - 'attendees' => [ - { - 'email' => 'myemail@mydomain.tld' - } - ] - } - - event2 = { - 'summary' => 'Appointment 2', - 'location' => 'Somewhere as well', - 'start' => { - 'dateTime' => '2011-01-02T10:00:00.000-07:00' - }, - 'end' => { - 'dateTime' => '2011-01-02T10:25:00.000-07:00' - }, - 'attendees' => [ - { - 'email' => 'myemail@mydomain.tld' - } - ] - } - - @call1 = { - :api_method => @calendar.events.insert, - :parameters => {'calendarId' => 'myemail@mydomain.tld'}, - :body => MultiJson.dump(event1), - :headers => {'Content-Type' => 'application/json'} - } - - @call2 = { - :api_method => @calendar.events.insert, - :parameters => {'calendarId' => 'myemail@mydomain.tld'}, - :body => MultiJson.dump(event2), - :headers => {'Content-Type' => 'application/json'} - } - end - - it 'should convert to a correct HTTP request' do - batch = Google::APIClient::BatchRequest.new { |result| } - batch.add(@call1, '1').add(@call2, '2') - request = batch.to_env(CLIENT.connection) - boundary = Google::APIClient::BatchRequest::BATCH_BOUNDARY - expect(request[:method].to_s.downcase).to eq('post') - expect(request[:url].to_s).to eq('https://www.googleapis.com/batch') - expect(request[:request_headers]['Content-Type']).to eq("multipart/mixed;boundary=#{boundary}") - body = request[:body].read - expect(body).to include(@call1[:body]) - expect(body).to include(@call2[:body]) - end - end - - end -end diff --git a/spec/google/api_client/client_secrets_spec.rb b/spec/google/api_client/client_secrets_spec.rb deleted file mode 100644 index ead9bf7e9..000000000 --- a/spec/google/api_client/client_secrets_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# encoding:utf-8 - -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client/client_secrets' - -FIXTURES_PATH = File.expand_path('../../../fixtures', __FILE__) - -RSpec.describe Google::APIClient::ClientSecrets do - - context 'with JSON file' do - let(:file) { File.join(FIXTURES_PATH, 'files', 'client_secrets.json') } - subject(:secrets) { Google::APIClient::ClientSecrets.load(file)} - - it 'should load the correct client ID' do - expect(secrets.client_id).to be == '898243283568.apps.googleusercontent.com' - end - - it 'should load the correct client secret' do - expect(secrets.client_secret).to be == 'i8YaXdGgiQ4_KrTVNGsB7QP1' - end - - context 'serialzed to hash' do - subject(:hash) { secrets.to_hash } - it 'should contain the flow as the first key' do - expect(hash).to have_key "installed" - end - - it 'should contain the client ID' do - expect(hash["installed"]["client_id"]).to be == '898243283568.apps.googleusercontent.com' - end - - it 'should contain the client secret' do - expect(hash["installed"]["client_secret"]).to be == 'i8YaXdGgiQ4_KrTVNGsB7QP1' - end - - end - end -end \ No newline at end of file diff --git a/spec/google/api_client/discovery_spec.rb b/spec/google/api_client/discovery_spec.rb deleted file mode 100644 index 637d25e9f..000000000 --- a/spec/google/api_client/discovery_spec.rb +++ /dev/null @@ -1,708 +0,0 @@ -# encoding:utf-8 - -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -require 'spec_helper' - -require 'faraday' -require 'multi_json' -require 'compat/multi_json' -require 'signet/oauth_1/client' -require 'google/api_client' - -fixtures_path = File.expand_path('../../../fixtures', __FILE__) - -RSpec.describe Google::APIClient do - include ConnectionHelpers - CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT) - - after do - # Reset client to not-quite-pristine state - CLIENT.key = nil - CLIENT.user_ip = nil - end - - it 'should raise a type error for bogus authorization' do - expect(lambda do - Google::APIClient.new(:application_name => 'API Client Tests', :authorization => 42) - end).to raise_error(TypeError) - end - - it 'should not be able to retrieve the discovery document for a bogus API' do - expect(lambda do - CLIENT.discovery_document('bogus') - end).to raise_error(Google::APIClient::TransmissionError) - expect(lambda do - CLIENT.discovered_api('bogus') - end).to raise_error(Google::APIClient::TransmissionError) - end - - it 'should raise an error for bogus services' do - expect(lambda do - CLIENT.discovered_api(42) - end).to raise_error(TypeError) - end - - it 'should raise an error for bogus services' do - expect(lambda do - CLIENT.preferred_version(42) - end).to raise_error(TypeError) - end - - it 'should raise an error for bogus methods' do - expect(lambda do - CLIENT.execute(42) - end).to raise_error(TypeError) - end - - it 'should not return a preferred version for bogus service names' do - expect(CLIENT.preferred_version('bogus')).to eq(nil) - end - - describe 'with zoo API' do - it 'should return API instance registered from file' do - zoo_json = File.join(fixtures_path, 'files', 'zoo.json') - contents = File.open(zoo_json, 'rb') { |io| io.read } - api = CLIENT.register_discovery_document('zoo', 'v1', contents) - expect(api).to be_kind_of(Google::APIClient::API) - end - end - - describe 'with the prediction API' do - before do - CLIENT.authorization = nil - # The prediction API no longer exposes a v1, so we have to be - # careful about looking up the wrong API version. - @prediction = CLIENT.discovered_api('prediction', 'v1.2') - end - - it 'should correctly determine the discovery URI' do - expect(CLIENT.discovery_uri('prediction')).to be === - 'https://www.googleapis.com/discovery/v1/apis/prediction/v1/rest' - end - - it 'should correctly determine the discovery URI if :user_ip is set' do - CLIENT.user_ip = '127.0.0.1' - - conn = stub_connection do |stub| - stub.get('/discovery/v1/apis/prediction/v1.2/rest?userIp=127.0.0.1') do |env| - [200, {}, '{}'] - end - end - CLIENT.execute( - :http_method => 'GET', - :uri => CLIENT.discovery_uri('prediction', 'v1.2'), - :authenticated => false, - :connection => conn - ) - conn.verify - end - - it 'should correctly determine the discovery URI if :key is set' do - CLIENT.key = 'qwerty' - conn = stub_connection do |stub| - stub.get('/discovery/v1/apis/prediction/v1.2/rest?key=qwerty') do |env| - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :http_method => 'GET', - :uri => CLIENT.discovery_uri('prediction', 'v1.2'), - :authenticated => false, - :connection => conn - ) - conn.verify - end - - it 'should correctly determine the discovery URI if both are set' do - CLIENT.key = 'qwerty' - CLIENT.user_ip = '127.0.0.1' - conn = stub_connection do |stub| - stub.get('/discovery/v1/apis/prediction/v1.2/rest?key=qwerty&userIp=127.0.0.1') do |env| - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :http_method => 'GET', - :uri => CLIENT.discovery_uri('prediction', 'v1.2'), - :authenticated => false, - :connection => conn - ) - conn.verify - end - - it 'should correctly generate API objects' do - expect(CLIENT.discovered_api('prediction', 'v1.2').name).to eq('prediction') - expect(CLIENT.discovered_api('prediction', 'v1.2').version).to eq('v1.2') - expect(CLIENT.discovered_api(:prediction, 'v1.2').name).to eq('prediction') - expect(CLIENT.discovered_api(:prediction, 'v1.2').version).to eq('v1.2') - end - - it 'should discover methods' do - expect(CLIENT.discovered_method( - 'prediction.training.insert', 'prediction', 'v1.2' - ).name).to eq('insert') - expect(CLIENT.discovered_method( - :'prediction.training.insert', :prediction, 'v1.2' - ).name).to eq('insert') - expect(CLIENT.discovered_method( - 'prediction.training.delete', 'prediction', 'v1.2' - ).name).to eq('delete') - end - - it 'should define the origin API in discovered methods' do - expect(CLIENT.discovered_method( - 'prediction.training.insert', 'prediction', 'v1.2' - ).api.name).to eq('prediction') - end - - it 'should not find methods that are not in the discovery document' do - expect(CLIENT.discovered_method( - 'prediction.bogus', 'prediction', 'v1.2' - )).to eq(nil) - end - - it 'should raise an error for bogus methods' do - expect(lambda do - CLIENT.discovered_method(42, 'prediction', 'v1.2') - end).to raise_error(TypeError) - end - - it 'should raise an error for bogus methods' do - expect(lambda do - CLIENT.execute(:api_method => CLIENT.discovered_api('prediction', 'v1.2')) - end).to raise_error(TypeError) - end - - it 'should correctly determine the preferred version' do - expect(CLIENT.preferred_version('prediction').version).not_to eq('v1') - expect(CLIENT.preferred_version(:prediction).version).not_to eq('v1') - end - - it 'should return a batch path' do - expect(CLIENT.discovered_api('prediction', 'v1.2').batch_path).not_to be_nil - end - - it 'should generate valid requests' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - expect(env[:body]).to eq('') - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => conn - ) - conn.verify - end - - it 'should generate valid requests when parameter value includes semicolon' do - conn = stub_connection do |stub| - # semicolon (;) in parameter value was being converted to - # bare ampersand (&) in 0.4.7. ensure that it gets converted - # to a CGI-escaped semicolon (%3B) instead. - stub.post('/prediction/v1.2/training?data=12345%3B67890') do |env| - expect(env[:body]).to eq('') - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345;67890'}, - :connection => conn - ) - conn.verify - end - - it 'should generate valid requests when multivalued parameters are passed' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=1&data=2') do |env| - expect(env.params['data']).to include('1', '2') - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => ['1', '2']}, - :connection => conn - ) - conn.verify - end - - it 'should generate requests against the correct URIs' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => conn - ) - conn.verify - end - - it 'should generate requests against the correct URIs' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => conn - ) - conn.verify - end - - it 'should allow modification to the base URIs for testing purposes' do - # Using a new client instance here to avoid caching rebased discovery doc - prediction_rebase = - Google::APIClient.new(:application_name => 'API Client Tests').discovered_api('prediction', 'v1.2') - prediction_rebase.method_base = - 'https://testing-domain.example.com/prediction/v1.2/' - - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training') do |env| - expect(env[:url].host).to eq('testing-domain.example.com') - [200, {}, '{}'] - end - end - - request = CLIENT.execute( - :api_method => prediction_rebase.training.insert, - :parameters => {'data' => '123'}, - :connection => conn - ) - conn.verify - end - - it 'should generate OAuth 1 requests' do - CLIENT.authorization = :oauth_1 - CLIENT.authorization.token_credential_key = '12345' - CLIENT.authorization.token_credential_secret = '12345' - - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - expect(env[:request_headers]).to have_key('Authorization') - expect(env[:request_headers]['Authorization']).to match(/^OAuth/) - [200, {}, '{}'] - end - end - - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => conn - ) - conn.verify - end - - it 'should generate OAuth 2 requests' do - CLIENT.authorization = :oauth_2 - CLIENT.authorization.access_token = '12345' - - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - expect(env[:request_headers]).to have_key('Authorization') - expect(env[:request_headers]['Authorization']).to match(/^Bearer/) - [200, {}, '{}'] - end - end - - request = CLIENT.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => conn - ) - conn.verify - end - - it 'should not be able to execute improperly authorized requests' do - CLIENT.authorization = :oauth_1 - CLIENT.authorization.token_credential_key = '12345' - CLIENT.authorization.token_credential_secret = '12345' - result = CLIENT.execute( - @prediction.training.insert, - {'data' => '12345'} - ) - expect(result.response.status).to eq(401) - end - - it 'should not be able to execute improperly authorized requests' do - CLIENT.authorization = :oauth_2 - CLIENT.authorization.access_token = '12345' - result = CLIENT.execute( - @prediction.training.insert, - {'data' => '12345'} - ) - expect(result.response.status).to eq(401) - end - - it 'should not be able to execute improperly authorized requests' do - expect(lambda do - CLIENT.authorization = :oauth_1 - CLIENT.authorization.token_credential_key = '12345' - CLIENT.authorization.token_credential_secret = '12345' - result = CLIENT.execute!( - @prediction.training.insert, - {'data' => '12345'} - ) - end).to raise_error(Google::APIClient::ClientError) - end - - it 'should not be able to execute improperly authorized requests' do - expect(lambda do - CLIENT.authorization = :oauth_2 - CLIENT.authorization.access_token = '12345' - result = CLIENT.execute!( - @prediction.training.insert, - {'data' => '12345'} - ) - end).to raise_error(Google::APIClient::ClientError) - end - - it 'should correctly handle unnamed parameters' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.2/training') do |env| - expect(env[:request_headers]).to have_key('Content-Type') - expect(env[:request_headers]['Content-Type']).to eq('application/json') - [200, {}, '{}'] - end - end - CLIENT.authorization = :oauth_2 - CLIENT.authorization.access_token = '12345' - CLIENT.execute( - :api_method => @prediction.training.insert, - :body => MultiJson.dump({"id" => "bucket/object"}), - :headers => {'Content-Type' => 'application/json'}, - :connection => conn - ) - conn.verify - end - end - - describe 'with the plus API' do - before do - CLIENT.authorization = nil - @plus = CLIENT.discovered_api('plus') - end - - it 'should correctly determine the discovery URI' do - expect(CLIENT.discovery_uri('plus')).to be === - 'https://www.googleapis.com/discovery/v1/apis/plus/v1/rest' - end - - it 'should find APIs that are in the discovery document' do - expect(CLIENT.discovered_api('plus').name).to eq('plus') - expect(CLIENT.discovered_api('plus').version).to eq('v1') - expect(CLIENT.discovered_api(:plus).name).to eq('plus') - expect(CLIENT.discovered_api(:plus).version).to eq('v1') - end - - it 'should find methods that are in the discovery document' do - # TODO(bobaman) Fix this when the RPC names are correct - expect(CLIENT.discovered_method( - 'plus.activities.list', 'plus' - ).name).to eq('list') - end - - it 'should define the origin API in discovered methods' do - expect(CLIENT.discovered_method( - 'plus.activities.list', 'plus' - ).api.name).to eq('plus') - end - - it 'should not find methods that are not in the discovery document' do - expect(CLIENT.discovered_method('plus.bogus', 'plus')).to eq(nil) - end - - it 'should generate requests against the correct URIs' do - conn = stub_connection do |stub| - stub.get('/plus/v1/people/107807692475771887386/activities/public') do |env| - [200, {}, '{}'] - end - end - - request = CLIENT.execute( - :api_method => @plus.activities.list, - :parameters => { - 'userId' => '107807692475771887386', 'collection' => 'public' - }, - :authenticated => false, - :connection => conn - ) - conn.verify - end - - it 'should correctly validate parameters' do - expect(lambda do - CLIENT.execute( - :api_method => @plus.activities.list, - :parameters => {'alt' => 'json'}, - :authenticated => false - ) - end).to raise_error(ArgumentError) - end - - it 'should correctly validate parameters' do - expect(lambda do - CLIENT.execute( - :api_method => @plus.activities.list, - :parameters => { - 'userId' => '107807692475771887386', 'collection' => 'bogus' - }, - :authenticated => false - ).to_env(CLIENT.connection) - end).to raise_error(ArgumentError) - end - - it 'should correctly determine the service root_uri' do - expect(@plus.root_uri.to_s).to eq('https://www.googleapis.com/') - end - end - - describe 'with the adsense API' do - before do - CLIENT.authorization = nil - @adsense = CLIENT.discovered_api('adsense', 'v1.3') - end - - it 'should correctly determine the discovery URI' do - expect(CLIENT.discovery_uri('adsense', 'v1.3').to_s).to be === - 'https://www.googleapis.com/discovery/v1/apis/adsense/v1.3/rest' - end - - it 'should find APIs that are in the discovery document' do - expect(CLIENT.discovered_api('adsense', 'v1.3').name).to eq('adsense') - expect(CLIENT.discovered_api('adsense', 'v1.3').version).to eq('v1.3') - end - - it 'should return a batch path' do - expect(CLIENT.discovered_api('adsense', 'v1.3').batch_path).not_to be_nil - end - - it 'should find methods that are in the discovery document' do - expect(CLIENT.discovered_method( - 'adsense.reports.generate', 'adsense', 'v1.3' - ).name).to eq('generate') - end - - it 'should not find methods that are not in the discovery document' do - expect(CLIENT.discovered_method('adsense.bogus', 'adsense', 'v1.3')).to eq(nil) - end - - it 'should generate requests against the correct URIs' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/adclients') do |env| - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @adsense.adclients.list, - :authenticated => false, - :connection => conn - ) - conn.verify - end - - it 'should not be able to execute requests without authorization' do - result = CLIENT.execute( - :api_method => @adsense.adclients.list, - :authenticated => false - ) - expect(result.response.status).to eq(401) - end - - it 'should fail when validating missing required parameters' do - expect(lambda do - CLIENT.execute( - :api_method => @adsense.reports.generate, - :authenticated => false - ) - end).to raise_error(ArgumentError) - end - - it 'should succeed when validating parameters in a correct call' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/reports?dimension=DATE&endDate=2010-01-01&metric=PAGE_VIEWS&startDate=2000-01-01') do |env| - [200, {}, '{}'] - end - end - expect(lambda do - CLIENT.execute( - :api_method => @adsense.reports.generate, - :parameters => { - 'startDate' => '2000-01-01', - 'endDate' => '2010-01-01', - 'dimension' => 'DATE', - 'metric' => 'PAGE_VIEWS' - }, - :authenticated => false, - :connection => conn - ) - end).not_to raise_error - conn.verify - end - - it 'should fail when validating parameters with invalid values' do - expect(lambda do - CLIENT.execute( - :api_method => @adsense.reports.generate, - :parameters => { - 'startDate' => '2000-01-01', - 'endDate' => '2010-01-01', - 'dimension' => 'BAD_CHARACTERS=-&*(£&', - 'metric' => 'PAGE_VIEWS' - }, - :authenticated => false - ) - end).to raise_error(ArgumentError) - end - - it 'should succeed when validating repeated parameters in a correct call' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/reports?dimension=DATE&dimension=PRODUCT_CODE'+ - '&endDate=2010-01-01&metric=CLICKS&metric=PAGE_VIEWS&'+ - 'startDate=2000-01-01') do |env| - [200, {}, '{}'] - end - end - expect(lambda do - CLIENT.execute( - :api_method => @adsense.reports.generate, - :parameters => { - 'startDate' => '2000-01-01', - 'endDate' => '2010-01-01', - 'dimension' => ['DATE', 'PRODUCT_CODE'], - 'metric' => ['PAGE_VIEWS', 'CLICKS'] - }, - :authenticated => false, - :connection => conn - ) - end).not_to raise_error - conn.verify - end - - it 'should fail when validating incorrect repeated parameters' do - expect(lambda do - CLIENT.execute( - :api_method => @adsense.reports.generate, - :parameters => { - 'startDate' => '2000-01-01', - 'endDate' => '2010-01-01', - 'dimension' => ['DATE', 'BAD_CHARACTERS=-&*(£&'], - 'metric' => ['PAGE_VIEWS', 'CLICKS'] - }, - :authenticated => false - ) - end).to raise_error(ArgumentError) - end - - it 'should generate valid requests when multivalued parameters are passed' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/reports?dimension=DATE&dimension=PRODUCT_CODE'+ - '&endDate=2010-01-01&metric=CLICKS&metric=PAGE_VIEWS&'+ - 'startDate=2000-01-01') do |env| - expect(env.params['dimension']).to include('DATE', 'PRODUCT_CODE') - expect(env.params['metric']).to include('CLICKS', 'PAGE_VIEWS') - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @adsense.reports.generate, - :parameters => { - 'startDate' => '2000-01-01', - 'endDate' => '2010-01-01', - 'dimension' => ['DATE', 'PRODUCT_CODE'], - 'metric' => ['PAGE_VIEWS', 'CLICKS'] - }, - :authenticated => false, - :connection => conn - ) - conn.verify - end - end - - describe 'with the Drive API' do - before do - CLIENT.authorization = nil - @drive = CLIENT.discovered_api('drive', 'v1') - end - - it 'should include media upload info methods' do - expect(@drive.files.insert.media_upload).not_to eq(nil) - end - - it 'should include accepted media types' do - expect(@drive.files.insert.media_upload.accepted_types).not_to be_empty - end - - it 'should have an upload path' do - expect(@drive.files.insert.media_upload.uri_template).not_to eq(nil) - end - - it 'should have a max file size' do - expect(@drive.files.insert.media_upload.max_size).not_to eq(nil) - end - end - - describe 'with the Pub/Sub API' do - before do - CLIENT.authorization = nil - @pubsub = CLIENT.discovered_api('pubsub', 'v1beta2') - end - - it 'should generate requests against the correct URIs' do - conn = stub_connection do |stub| - stub.get('/v1beta2/projects/12345/topics') do |env| - expect(env[:url].host).to eq('pubsub.googleapis.com') - [200, {}, '{}'] - end - end - request = CLIENT.execute( - :api_method => @pubsub.projects.topics.list, - :parameters => {'project' => 'projects/12345'}, - :connection => conn - ) - conn.verify - end - - it 'should correctly determine the service root_uri' do - expect(@pubsub.root_uri.to_s).to eq('https://pubsub.googleapis.com/') - end - - it 'should discover correct method URIs' do - list = CLIENT.discovered_method( - "pubsub.projects.topics.list", "pubsub", "v1beta2" - ) - expect(list.uri_template.pattern).to eq( - "https://pubsub.googleapis.com/v1beta2/{+project}/topics" - ) - - publish = CLIENT.discovered_method( - "pubsub.projects.topics.publish", "pubsub", "v1beta2" - ) - expect(publish.uri_template.pattern).to eq( - "https://pubsub.googleapis.com/v1beta2/{+topic}:publish" - ) - end - end -end diff --git a/spec/google/api_client/gzip_spec.rb b/spec/google/api_client/gzip_spec.rb deleted file mode 100644 index 0539b97d9..000000000 --- a/spec/google/api_client/gzip_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -# Encoding: utf-8 -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' - -RSpec.describe Google::APIClient::Gzip do - - def create_connection(&block) - Faraday.new do |b| - b.response :charset - b.response :gzip - b.adapter :test do |stub| - stub.get '/', &block - end - end - end - - it 'should ignore non-zipped content' do - conn = create_connection do |env| - [200, {}, 'Hello world'] - end - result = conn.get('/') - expect(result.body).to eq("Hello world") - end - - it 'should decompress gziped content' do - conn = create_connection do |env| - [200, { 'Content-Encoding' => 'gzip'}, Base64.decode64('H4sICLVGwlEAA3RtcADzSM3JyVcozy/KSeECANXgObcMAAAA')] - end - result = conn.get('/') - expect(result.body).to eq("Hello world\n") - end - - it 'should inflate with the correct charset encoding' do - conn = create_connection do |env| - [200, - { 'Content-Encoding' => 'deflate', 'Content-Type' => 'application/json;charset=BIG5'}, - Base64.decode64('eJxb8nLp7t2VAA8fBCI=')] - end - result = conn.get('/') - expect(result.body.encoding).to eq(Encoding::BIG5) - expect(result.body).to eq('日本語'.encode("BIG5")) - end - - describe 'with API Client' do - - before do - @client = Google::APIClient.new(:application_name => 'test') - @client.authorization = nil - end - - - it 'should send gzip in user agent' do - conn = create_connection do |env| - agent = env[:request_headers]['User-Agent'] - expect(agent).not_to be_nil - expect(agent).to include 'gzip' - [200, {}, 'Hello world'] - end - @client.execute(:uri => 'http://www.example.com/', :connection => conn) - end - - it 'should send gzip in accept-encoding' do - conn = create_connection do |env| - encoding = env[:request_headers]['Accept-Encoding'] - expect(encoding).not_to be_nil - expect(encoding).to include 'gzip' - [200, {}, 'Hello world'] - end - @client.execute(:uri => 'http://www.example.com/', :connection => conn) - end - - it 'should not send gzip in accept-encoding if disabled for request' do - conn = create_connection do |env| - encoding = env[:request_headers]['Accept-Encoding'] - expect(encoding).not_to include('gzip') unless encoding.nil? - [200, {}, 'Hello world'] - end - response = @client.execute(:uri => 'http://www.example.com/', :gzip => false, :connection => conn) - puts response.status - end - - end -end diff --git a/spec/google/api_client/media_spec.rb b/spec/google/api_client/media_spec.rb deleted file mode 100644 index f32b31efc..000000000 --- a/spec/google/api_client/media_spec.rb +++ /dev/null @@ -1,178 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' - -fixtures_path = File.expand_path('../../../fixtures', __FILE__) - -RSpec.describe Google::APIClient::UploadIO do - it 'should reject invalid file paths' do - expect(lambda do - media = Google::APIClient::UploadIO.new('doesnotexist', 'text/plain') - end).to raise_error - end - - describe 'with a file' do - before do - @file = File.expand_path('files/sample.txt', fixtures_path) - @media = Google::APIClient::UploadIO.new(@file, 'text/plain') - end - - it 'should report the correct file length' do - expect(@media.length).to eq(File.size(@file)) - end - - it 'should have a mime type' do - expect(@media.content_type).to eq('text/plain') - end - end - - describe 'with StringIO' do - before do - @content = "hello world" - @media = Google::APIClient::UploadIO.new(StringIO.new(@content), 'text/plain', 'test.txt') - end - - it 'should report the correct file length' do - expect(@media.length).to eq(@content.length) - end - - it 'should have a mime type' do - expect(@media.content_type).to eq('text/plain') - end - end -end - -RSpec.describe Google::APIClient::RangedIO do - before do - @source = StringIO.new("1234567890abcdef") - @io = Google::APIClient::RangedIO.new(@source, 1, 5) - end - - it 'should return the correct range when read entirely' do - expect(@io.read).to eq("23456") - end - - it 'should maintain position' do - expect(@io.read(1)).to eq('2') - expect(@io.read(2)).to eq('34') - expect(@io.read(2)).to eq('56') - end - - it 'should allow rewinds' do - expect(@io.read(2)).to eq('23') - @io.rewind() - expect(@io.read(2)).to eq('23') - end - - it 'should allow setting position' do - @io.pos = 3 - expect(@io.read).to eq('56') - end - - it 'should not allow position to be set beyond range' do - @io.pos = 10 - expect(@io.read).to eq('') - end - - it 'should return empty string when read amount is zero' do - expect(@io.read(0)).to eq('') - end - - it 'should return empty string at EOF if amount is nil' do - @io.read - expect(@io.read).to eq('') - end - - it 'should return nil at EOF if amount is positive int' do - @io.read - expect(@io.read(1)).to eq(nil) - end - -end - -RSpec.describe Google::APIClient::ResumableUpload do - CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT) - - after do - # Reset client to not-quite-pristine state - CLIENT.key = nil - CLIENT.user_ip = nil - end - - before do - @drive = CLIENT.discovered_api('drive', 'v1') - @file = File.expand_path('files/sample.txt', fixtures_path) - @media = Google::APIClient::UploadIO.new(@file, 'text/plain') - @uploader = Google::APIClient::ResumableUpload.new( - :media => @media, - :api_method => @drive.files.insert, - :uri => 'https://www.googleapis.com/upload/drive/v1/files/12345') - end - - it 'should consider 20x status as complete' do - request = @uploader.to_http_request - @uploader.process_http_response(mock_result(200)) - expect(@uploader.complete?).to eq(true) - end - - it 'should consider 30x status as incomplete' do - request = @uploader.to_http_request - @uploader.process_http_response(mock_result(308)) - expect(@uploader.complete?).to eq(false) - expect(@uploader.expired?).to eq(false) - end - - it 'should consider 40x status as fatal' do - request = @uploader.to_http_request - @uploader.process_http_response(mock_result(404)) - expect(@uploader.expired?).to eq(true) - end - - it 'should detect changes to location' do - request = @uploader.to_http_request - @uploader.process_http_response(mock_result(308, 'location' => 'https://www.googleapis.com/upload/drive/v1/files/abcdef')) - expect(@uploader.uri.to_s).to eq('https://www.googleapis.com/upload/drive/v1/files/abcdef') - end - - it 'should resume from the saved range reported by the server' do - @uploader.chunk_size = 200 - @uploader.to_http_request # Send bytes 0-199, only 0-99 saved - @uploader.process_http_response(mock_result(308, 'range' => '0-99')) - method, url, headers, body = @uploader.to_http_request # Send bytes 100-299 - expect(headers['Content-Range']).to eq("bytes 100-299/#{@media.length}") - expect(headers['Content-length']).to eq("200") - end - - it 'should resync the offset after 5xx errors' do - @uploader.chunk_size = 200 - @uploader.to_http_request - @uploader.process_http_response(mock_result(500)) # Invalidates range - method, url, headers, body = @uploader.to_http_request # Resync - expect(headers['Content-Range']).to eq("bytes */#{@media.length}") - expect(headers['Content-length']).to eq("0") - @uploader.process_http_response(mock_result(308, 'range' => '0-99')) - method, url, headers, body = @uploader.to_http_request # Send next chunk at correct range - expect(headers['Content-Range']).to eq("bytes 100-299/#{@media.length}") - expect(headers['Content-length']).to eq("200") - end - - def mock_result(status, headers = {}) - reference = Google::APIClient::Reference.new(:api_method => @drive.files.insert) - double('result', :status => status, :headers => headers, :reference => reference) - end - -end diff --git a/spec/google/api_client/request_spec.rb b/spec/google/api_client/request_spec.rb deleted file mode 100644 index c63f750dc..000000000 --- a/spec/google/api_client/request_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' - -RSpec.describe Google::APIClient::Request do - CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT) - - it 'should normalize parameter names to strings' do - request = Google::APIClient::Request.new(:uri => 'https://www.google.com', :parameters => { - :a => '1', 'b' => '2' - }) - expect(request.parameters['a']).to eq('1') - expect(request.parameters['b']).to eq('2') - end -end diff --git a/spec/google/api_client/result_spec.rb b/spec/google/api_client/result_spec.rb deleted file mode 100644 index 67c63b77c..000000000 --- a/spec/google/api_client/result_spec.rb +++ /dev/null @@ -1,207 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' - -RSpec.describe Google::APIClient::Result do - CLIENT = Google::APIClient.new(:application_name => 'API Client Tests') unless defined?(CLIENT) - - describe 'with the plus API' do - before do - CLIENT.authorization = nil - @plus = CLIENT.discovered_api('plus', 'v1') - @reference = Google::APIClient::Reference.new({ - :api_method => @plus.activities.list, - :parameters => { - 'userId' => 'me', - 'collection' => 'public', - 'maxResults' => 20 - } - }) - @request = @reference.to_http_request - - # Response double - @response = double("response") - allow(@response).to receive(:status).and_return(200) - allow(@response).to receive(:headers).and_return({ - 'etag' => '12345', - 'x-google-apiary-auth-scopes' => - 'https://www.googleapis.com/auth/plus.me', - 'content-type' => 'application/json; charset=UTF-8', - 'date' => 'Mon, 23 Apr 2012 00:00:00 GMT', - 'cache-control' => 'private, max-age=0, must-revalidate, no-transform', - 'server' => 'GSE', - 'connection' => 'close' - }) - end - - describe 'with a next page token' do - before do - allow(@response).to receive(:body).and_return( - <<-END_OF_STRING - { - "kind": "plus#activityFeed", - "etag": "FOO", - "nextPageToken": "NEXT+PAGE+TOKEN", - "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?", - "nextLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN", - "title": "Plus Public Activity Feed for ", - "updated": "2012-04-23T00:00:00.000Z", - "id": "123456790", - "items": [] - } - END_OF_STRING - ) - @result = Google::APIClient::Result.new(@reference, @response) - end - - it 'should indicate a successful response' do - expect(@result.error?).to be_falsey - end - - it 'should return the correct next page token' do - expect(@result.next_page_token).to eq('NEXT+PAGE+TOKEN') - end - - it 'should escape the next page token when calling next_page' do - reference = @result.next_page - expect(Hash[reference.parameters]).to include('pageToken') - expect(Hash[reference.parameters]['pageToken']).to eq('NEXT+PAGE+TOKEN') - url = reference.to_env(CLIENT.connection)[:url] - expect(url.to_s).to include('pageToken=NEXT%2BPAGE%2BTOKEN') - end - - it 'should return content type correctly' do - expect(@result.media_type).to eq('application/json') - end - - it 'should return the result data correctly' do - expect(@result.data?).to be_truthy - expect(@result.data.class.to_s).to eq( - 'Google::APIClient::Schema::Plus::V1::ActivityFeed' - ) - expect(@result.data.kind).to eq('plus#activityFeed') - expect(@result.data.etag).to eq('FOO') - expect(@result.data.nextPageToken).to eq('NEXT+PAGE+TOKEN') - expect(@result.data.selfLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' - ) - expect(@result.data.nextLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' + - 'maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN' - ) - expect(@result.data.title).to eq('Plus Public Activity Feed for ') - expect(@result.data.id).to eq("123456790") - expect(@result.data.items).to be_empty - end - end - - describe 'without a next page token' do - before do - allow(@response).to receive(:body).and_return( - <<-END_OF_STRING - { - "kind": "plus#activityFeed", - "etag": "FOO", - "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?", - "title": "Plus Public Activity Feed for ", - "updated": "2012-04-23T00:00:00.000Z", - "id": "123456790", - "items": [] - } - END_OF_STRING - ) - @result = Google::APIClient::Result.new(@reference, @response) - end - - it 'should not return a next page token' do - expect(@result.next_page_token).to eq(nil) - end - - it 'should return content type correctly' do - expect(@result.media_type).to eq('application/json') - end - - it 'should return the result data correctly' do - expect(@result.data?).to be_truthy - expect(@result.data.class.to_s).to eq( - 'Google::APIClient::Schema::Plus::V1::ActivityFeed' - ) - expect(@result.data.kind).to eq('plus#activityFeed') - expect(@result.data.etag).to eq('FOO') - expect(@result.data.selfLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' - ) - expect(@result.data.title).to eq('Plus Public Activity Feed for ') - expect(@result.data.id).to eq("123456790") - expect(@result.data.items).to be_empty - end - end - - describe 'with JSON error response' do - before do - allow(@response).to receive(:body).and_return( - <<-END_OF_STRING - { - "error": { - "errors": [ - { - "domain": "global", - "reason": "parseError", - "message": "Parse Error" - } - ], - "code": 400, - "message": "Parse Error" - } - } - END_OF_STRING - ) - allow(@response).to receive(:status).and_return(400) - @result = Google::APIClient::Result.new(@reference, @response) - end - - it 'should return error status correctly' do - expect(@result.error?).to be_truthy - end - - it 'should return the correct error message' do - expect(@result.error_message).to eq('Parse Error') - end - end - - describe 'with 204 No Content response' do - before do - allow(@response).to receive(:body).and_return('') - allow(@response).to receive(:status).and_return(204) - allow(@response).to receive(:headers).and_return({}) - @result = Google::APIClient::Result.new(@reference, @response) - end - - it 'should indicate no data is available' do - expect(@result.data?).to be_falsey - end - - it 'should return nil for data' do - expect(@result.data).to eq(nil) - end - - it 'should return nil for media_type' do - expect(@result.media_type).to eq(nil) - end - end - end -end diff --git a/spec/google/api_client/service_account_spec.rb b/spec/google/api_client/service_account_spec.rb deleted file mode 100644 index 6314cea6b..000000000 --- a/spec/google/api_client/service_account_spec.rb +++ /dev/null @@ -1,169 +0,0 @@ -# Copyright 2012 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' - -fixtures_path = File.expand_path('../../../fixtures', __FILE__) - -RSpec.describe Google::APIClient::KeyUtils do - it 'should read PKCS12 files from the filesystem' do - if RUBY_PLATFORM == 'java' && RUBY_VERSION.start_with?('1.8') - pending "Reading from PKCS12 not supported on jruby 1.8.x" - end - path = File.expand_path('files/privatekey.p12', fixtures_path) - key = Google::APIClient::KeyUtils.load_from_pkcs12(path, 'notasecret') - expect(key).not_to eq(nil) - end - - it 'should read PKCS12 files from loaded files' do - if RUBY_PLATFORM == 'java' && RUBY_VERSION.start_with?('1.8') - pending "Reading from PKCS12 not supported on jruby 1.8.x" - end - path = File.expand_path('files/privatekey.p12', fixtures_path) - content = File.read(path) - key = Google::APIClient::KeyUtils.load_from_pkcs12(content, 'notasecret') - expect(key).not_to eq(nil) - end - - it 'should read PEM files from the filesystem' do - path = File.expand_path('files/secret.pem', fixtures_path) - key = Google::APIClient::KeyUtils.load_from_pem(path, 'notasecret') - expect(key).not_to eq(nil) - end - - it 'should read PEM files from loaded files' do - path = File.expand_path('files/secret.pem', fixtures_path) - content = File.read(path) - key = Google::APIClient::KeyUtils.load_from_pem(content, 'notasecret') - expect(key).not_to eq(nil) - end - -end - -RSpec.describe Google::APIClient::JWTAsserter do - include ConnectionHelpers - - before do - @key = OpenSSL::PKey::RSA.new 2048 - end - - it 'should generate valid JWTs' do - asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key) - jwt = asserter.to_authorization.to_jwt - expect(jwt).not_to eq(nil) - - claim = JWT.decode(jwt, @key.public_key, true) - claim = claim[0] if claim[0] - expect(claim["iss"]).to eq('client1') - expect(claim["scope"]).to eq('scope1 scope2') - end - - it 'should allow impersonation' do - conn = stub_connection do |stub| - stub.post('/o/oauth2/token') do |env| - params = Addressable::URI.form_unencode(env[:body]) - JWT.decode(params.assoc("assertion").last, @key.public_key) - expect(params.assoc("grant_type")).to eq(['grant_type','urn:ietf:params:oauth:grant-type:jwt-bearer']) - [200, {'content-type' => 'application/json'}, '{ - "access_token" : "1/abcdef1234567890", - "token_type" : "Bearer", - "expires_in" : 3600 - }'] - end - end - asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key) - auth = asserter.authorize('user1@email.com', { :connection => conn }) - expect(auth).not_to eq(nil?) - expect(auth.person).to eq('user1@email.com') - conn.verify - end - - it 'should send valid access token request' do - conn = stub_connection do |stub| - stub.post('/o/oauth2/token') do |env| - params = Addressable::URI.form_unencode(env[:body]) - JWT.decode(params.assoc("assertion").last, @key.public_key) - expect(params.assoc("grant_type")).to eq(['grant_type','urn:ietf:params:oauth:grant-type:jwt-bearer']) - [200, {'content-type' => 'application/json'}, '{ - "access_token" : "1/abcdef1234567890", - "token_type" : "Bearer", - "expires_in" : 3600 - }'] - end - end - asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key) - auth = asserter.authorize(nil, { :connection => conn }) - expect(auth).not_to eq(nil?) - expect(auth.access_token).to eq("1/abcdef1234567890") - conn.verify - end - - it 'should be refreshable' do - conn = stub_connection do |stub| - stub.post('/o/oauth2/token') do |env| - params = Addressable::URI.form_unencode(env[:body]) - JWT.decode(params.assoc("assertion").last, @key.public_key) - expect(params.assoc("grant_type")).to eq(['grant_type','urn:ietf:params:oauth:grant-type:jwt-bearer']) - [200, {'content-type' => 'application/json'}, '{ - "access_token" : "1/abcdef1234567890", - "token_type" : "Bearer", - "expires_in" : 3600 - }'] - end - stub.post('/o/oauth2/token') do |env| - params = Addressable::URI.form_unencode(env[:body]) - JWT.decode(params.assoc("assertion").last, @key.public_key) - expect(params.assoc("grant_type")).to eq(['grant_type','urn:ietf:params:oauth:grant-type:jwt-bearer']) - [200, {'content-type' => 'application/json'}, '{ - "access_token" : "1/0987654321fedcba", - "token_type" : "Bearer", - "expires_in" : 3600 - }'] - end - end - asserter = Google::APIClient::JWTAsserter.new('client1', 'scope1 scope2', @key) - auth = asserter.authorize(nil, { :connection => conn }) - expect(auth).not_to eq(nil?) - expect(auth.access_token).to eq("1/abcdef1234567890") - - auth.fetch_access_token!(:connection => conn) - expect(auth.access_token).to eq("1/0987654321fedcba") - - conn.verify - end -end - -RSpec.describe Google::APIClient::ComputeServiceAccount do - include ConnectionHelpers - - it 'should query metadata server' do - conn = stub_connection do |stub| - stub.get('/computeMetadata/v1beta1/instance/service-accounts/default/token') do |env| - expect(env.url.host).to eq('metadata') - [200, {'content-type' => 'application/json'}, '{ - "access_token" : "1/abcdef1234567890", - "token_type" : "Bearer", - "expires_in" : 3600 - }'] - end - end - service_account = Google::APIClient::ComputeServiceAccount.new - auth = service_account.fetch_access_token!({ :connection => conn }) - expect(auth).not_to eq(nil?) - expect(auth["access_token"]).to eq("1/abcdef1234567890") - conn.verify - end -end diff --git a/spec/google/api_client/service_spec.rb b/spec/google/api_client/service_spec.rb deleted file mode 100644 index a6f6925e5..000000000 --- a/spec/google/api_client/service_spec.rb +++ /dev/null @@ -1,618 +0,0 @@ -# encoding:utf-8 - -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client' -require 'google/api_client/service' - -fixtures_path = File.expand_path('../../../fixtures', __FILE__) - -RSpec.describe Google::APIClient::Service do - include ConnectionHelpers - - APPLICATION_NAME = 'API Client Tests' - - it 'should error out when called without an API name or version' do - expect(lambda do - Google::APIClient::Service.new - end).to raise_error(ArgumentError) - end - - it 'should error out when called without an API version' do - expect(lambda do - Google::APIClient::Service.new('foo') - end).to raise_error(ArgumentError) - end - - it 'should error out when the options hash is not a hash' do - expect(lambda do - Google::APIClient::Service.new('foo', 'v1', 42) - end).to raise_error(ArgumentError) - end - - describe 'with the AdSense Management API' do - - it 'should make a valid call for a method with no parameters' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/adclients') do |env| - [200, {}, '{}'] - end - end - adsense = Google::APIClient::Service.new( - 'adsense', - 'v1.3', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - - req = adsense.adclients.list.execute() - conn.verify - end - - it 'should make a valid call for a method with parameters' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/adclients/1/adunits') do |env| - [200, {}, '{}'] - end - end - adsense = Google::APIClient::Service.new( - 'adsense', - 'v1.3', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - req = adsense.adunits.list(:adClientId => '1').execute() - end - - it 'should make a valid call for a deep method' do - conn = stub_connection do |stub| - stub.get('/adsense/v1.3/accounts/1/adclients') do |env| - [200, {}, '{}'] - end - end - adsense = Google::APIClient::Service.new( - 'adsense', - 'v1.3', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - req = adsense.accounts.adclients.list(:accountId => '1').execute() - end - - describe 'with no connection' do - before do - @adsense = Google::APIClient::Service.new('adsense', 'v1.3', - {:application_name => APPLICATION_NAME, :cache_store => nil}) - end - - it 'should return a resource when using a valid resource name' do - expect(@adsense.accounts).to be_a(Google::APIClient::Service::Resource) - end - - it 'should throw an error when using an invalid resource name' do - expect(lambda do - @adsense.invalid_resource - end).to raise_error - end - - it 'should return a request when using a valid method name' do - req = @adsense.adclients.list - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('adsense.adclients.list') - expect(req.parameters).to be_nil - end - - it 'should throw an error when using an invalid method name' do - expect(lambda do - @adsense.adclients.invalid_method - end).to raise_error - end - - it 'should return a valid request with parameters' do - req = @adsense.adunits.list(:adClientId => '1') - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('adsense.adunits.list') - expect(req.parameters).not_to be_nil - expect(req.parameters[:adClientId]).to eq('1') - end - end - end - - describe 'with the Prediction API' do - - it 'should make a valid call with an object body' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.5/trainedmodels?project=1') do |env| - expect(env.body).to eq('{"id":"1"}') - [200, {}, '{}'] - end - end - prediction = Google::APIClient::Service.new( - 'prediction', - 'v1.5', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - req = prediction.trainedmodels.insert(:project => '1').body({'id' => '1'}).execute() - conn.verify - end - - it 'should make a valid call with a text body' do - conn = stub_connection do |stub| - stub.post('/prediction/v1.5/trainedmodels?project=1') do |env| - expect(env.body).to eq('{"id":"1"}') - [200, {}, '{}'] - end - end - prediction = Google::APIClient::Service.new( - 'prediction', - 'v1.5', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - req = prediction.trainedmodels.insert(:project => '1').body('{"id":"1"}').execute() - conn.verify - end - - describe 'with no connection' do - before do - @prediction = Google::APIClient::Service.new('prediction', 'v1.5', - {:application_name => APPLICATION_NAME, :cache_store => nil}) - end - - it 'should return a valid request with a body' do - req = @prediction.trainedmodels.insert(:project => '1').body({'id' => '1'}) - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('prediction.trainedmodels.insert') - expect(req.body).to eq({'id' => '1'}) - expect(req.parameters).not_to be_nil - expect(req.parameters[:project]).to eq('1') - end - - it 'should return a valid request with a body when using resource name' do - req = @prediction.trainedmodels.insert(:project => '1').training({'id' => '1'}) - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('prediction.trainedmodels.insert') - expect(req.training).to eq({'id' => '1'}) - expect(req.parameters).not_to be_nil - expect(req.parameters[:project]).to eq('1') - end - end - end - - describe 'with the Drive API' do - - before do - @metadata = { - 'title' => 'My movie', - 'description' => 'The best home movie ever made' - } - @file = File.expand_path('files/sample.txt', fixtures_path) - @media = Google::APIClient::UploadIO.new(@file, 'text/plain') - end - - it 'should make a valid call with an object body and media upload' do - conn = stub_connection do |stub| - stub.post('/upload/drive/v1/files?uploadType=multipart') do |env| - expect(env.body).to be_a Faraday::CompositeReadIO - [200, {}, '{}'] - end - end - drive = Google::APIClient::Service.new( - 'drive', - 'v1', - { - :application_name => APPLICATION_NAME, - :authenticated => false, - :connection => conn, - :cache_store => nil - } - ) - req = drive.files.insert(:uploadType => 'multipart').body(@metadata).media(@media).execute() - conn.verify - end - - describe 'with no connection' do - before do - @drive = Google::APIClient::Service.new('drive', 'v1', - {:application_name => APPLICATION_NAME, :cache_store => nil}) - end - - it 'should return a valid request with a body and media upload' do - req = @drive.files.insert(:uploadType => 'multipart').body(@metadata).media(@media) - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('drive.files.insert') - expect(req.body).to eq(@metadata) - expect(req.media).to eq(@media) - expect(req.parameters).not_to be_nil - expect(req.parameters[:uploadType]).to eq('multipart') - end - - it 'should return a valid request with a body and media upload when using resource name' do - req = @drive.files.insert(:uploadType => 'multipart').file(@metadata).media(@media) - expect(req).to be_a(Google::APIClient::Service::Request) - expect(req.method.id).to eq('drive.files.insert') - expect(req.file).to eq(@metadata) - expect(req.media).to eq(@media) - expect(req.parameters).not_to be_nil - expect(req.parameters[:uploadType]).to eq('multipart') - end - end - end - - describe 'with the Discovery API' do - it 'should make a valid end-to-end request' do - discovery = Google::APIClient::Service.new('discovery', 'v1', - {:application_name => APPLICATION_NAME, :authenticated => false, - :cache_store => nil}) - result = discovery.apis.get_rest(:api => 'discovery', :version => 'v1').execute - expect(result).not_to be_nil - expect(result.data.name).to eq('discovery') - expect(result.data.version).to eq('v1') - end - end -end - - -RSpec.describe Google::APIClient::Service::Result do - - describe 'with the plus API' do - before do - @plus = Google::APIClient::Service.new('plus', 'v1', - {:application_name => APPLICATION_NAME, :cache_store => nil}) - @reference = Google::APIClient::Reference.new({ - :api_method => @plus.activities.list.method, - :parameters => { - 'userId' => 'me', - 'collection' => 'public', - 'maxResults' => 20 - } - }) - @request = @plus.activities.list(:userId => 'me', :collection => 'public', - :maxResults => 20) - - # Response double - @response = double("response") - allow(@response).to receive(:status).and_return(200) - allow(@response).to receive(:headers).and_return({ - 'etag' => '12345', - 'x-google-apiary-auth-scopes' => - 'https://www.googleapis.com/auth/plus.me', - 'content-type' => 'application/json; charset=UTF-8', - 'date' => 'Mon, 23 Apr 2012 00:00:00 GMT', - 'cache-control' => 'private, max-age=0, must-revalidate, no-transform', - 'server' => 'GSE', - 'connection' => 'close' - }) - end - - describe 'with a next page token' do - before do - @body = <<-END_OF_STRING - { - "kind": "plus#activityFeed", - "etag": "FOO", - "nextPageToken": "NEXT+PAGE+TOKEN", - "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?", - "nextLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN", - "title": "Plus Public Activity Feed for ", - "updated": "2012-04-23T00:00:00.000Z", - "id": "123456790", - "items": [] - } - END_OF_STRING - allow(@response).to receive(:body).and_return(@body) - base_result = Google::APIClient::Result.new(@reference, @response) - @result = Google::APIClient::Service::Result.new(@request, base_result) - end - - it 'should indicate a successful response' do - expect(@result.error?).to be_falsey - end - - it 'should return the correct next page token' do - expect(@result.next_page_token).to eq('NEXT+PAGE+TOKEN') - end - - it 'generate a correct request when calling next_page' do - next_page_request = @result.next_page - expect(next_page_request.parameters).to include('pageToken') - expect(next_page_request.parameters['pageToken']).to eq('NEXT+PAGE+TOKEN') - @request.parameters.each_pair do |param, value| - expect(next_page_request.parameters[param]).to eq(value) - end - end - - it 'should return content type correctly' do - expect(@result.media_type).to eq('application/json') - end - - it 'should return the body correctly' do - expect(@result.body).to eq(@body) - end - - it 'should return the result data correctly' do - expect(@result.data?).to be_truthy - expect(@result.data.class.to_s).to eq( - 'Google::APIClient::Schema::Plus::V1::ActivityFeed' - ) - expect(@result.data.kind).to eq('plus#activityFeed') - expect(@result.data.etag).to eq('FOO') - expect(@result.data.nextPageToken).to eq('NEXT+PAGE+TOKEN') - expect(@result.data.selfLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' - ) - expect(@result.data.nextLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' + - 'maxResults=20&pageToken=NEXT%2BPAGE%2BTOKEN' - ) - expect(@result.data.title).to eq('Plus Public Activity Feed for ') - expect(@result.data.id).to eq("123456790") - expect(@result.data.items).to be_empty - end - end - - describe 'without a next page token' do - before do - @body = <<-END_OF_STRING - { - "kind": "plus#activityFeed", - "etag": "FOO", - "selfLink": "https://www.googleapis.com/plus/v1/people/foo/activities/public?", - "title": "Plus Public Activity Feed for ", - "updated": "2012-04-23T00:00:00.000Z", - "id": "123456790", - "items": [] - } - END_OF_STRING - allow(@response).to receive(:body).and_return(@body) - base_result = Google::APIClient::Result.new(@reference, @response) - @result = Google::APIClient::Service::Result.new(@request, base_result) - end - - it 'should not return a next page token' do - expect(@result.next_page_token).to eq(nil) - end - - it 'should return content type correctly' do - expect(@result.media_type).to eq('application/json') - end - - it 'should return the body correctly' do - expect(@result.body).to eq(@body) - end - - it 'should return the result data correctly' do - expect(@result.data?).to be_truthy - expect(@result.data.class.to_s).to eq( - 'Google::APIClient::Schema::Plus::V1::ActivityFeed' - ) - expect(@result.data.kind).to eq('plus#activityFeed') - expect(@result.data.etag).to eq('FOO') - expect(@result.data.selfLink).to eq( - 'https://www.googleapis.com/plus/v1/people/foo/activities/public?' - ) - expect(@result.data.title).to eq('Plus Public Activity Feed for ') - expect(@result.data.id).to eq("123456790") - expect(@result.data.items).to be_empty - end - end - - describe 'with JSON error response' do - before do - @body = <<-END_OF_STRING - { - "error": { - "errors": [ - { - "domain": "global", - "reason": "parseError", - "message": "Parse Error" - } - ], - "code": 400, - "message": "Parse Error" - } - } - END_OF_STRING - allow(@response).to receive(:body).and_return(@body) - allow(@response).to receive(:status).and_return(400) - base_result = Google::APIClient::Result.new(@reference, @response) - @result = Google::APIClient::Service::Result.new(@request, base_result) - end - - it 'should return error status correctly' do - expect(@result.error?).to be_truthy - end - - it 'should return the correct error message' do - expect(@result.error_message).to eq('Parse Error') - end - - it 'should return the body correctly' do - expect(@result.body).to eq(@body) - end - end - - describe 'with 204 No Content response' do - before do - allow(@response).to receive(:body).and_return('') - allow(@response).to receive(:status).and_return(204) - allow(@response).to receive(:headers).and_return({}) - base_result = Google::APIClient::Result.new(@reference, @response) - @result = Google::APIClient::Service::Result.new(@request, base_result) - end - - it 'should indicate no data is available' do - expect(@result.data?).to be_falsey - end - - it 'should return nil for data' do - expect(@result.data).to eq(nil) - end - - it 'should return nil for media_type' do - expect(@result.media_type).to eq(nil) - end - end - end -end - -RSpec.describe Google::APIClient::Service::BatchRequest do - - include ConnectionHelpers - - context 'with a service connection' do - before do - @conn = stub_connection do |stub| - stub.post('/batch') do |env| - [500, {'Content-Type' => 'application/json'}, '{}'] - end - end - @discovery = Google::APIClient::Service.new('discovery', 'v1', - {:application_name => APPLICATION_NAME, :authorization => nil, - :cache_store => nil, :connection => @conn}) - @calls = [ - @discovery.apis.get_rest(:api => 'plus', :version => 'v1'), - @discovery.apis.get_rest(:api => 'discovery', :version => 'v1') - ] - end - - it 'should use the service connection' do - batch = @discovery.batch(@calls) do - end - batch.execute - @conn.verify - end - end - - describe 'with the discovery API' do - before do - @discovery = Google::APIClient::Service.new('discovery', 'v1', - {:application_name => APPLICATION_NAME, :authorization => nil, - :cache_store => nil}) - end - - describe 'with two valid requests' do - before do - @calls = [ - @discovery.apis.get_rest(:api => 'plus', :version => 'v1'), - @discovery.apis.get_rest(:api => 'discovery', :version => 'v1') - ] - end - - it 'should execute both when using a global callback' do - block_called = 0 - batch = @discovery.batch(@calls) do |result| - block_called += 1 - expect(result.status).to eq(200) - end - - batch.execute - expect(block_called).to eq(2) - end - - it 'should execute both when using individual callbacks' do - call1_returned, call2_returned = false, false - batch = @discovery.batch - - batch.add(@calls[0]) do |result| - call1_returned = true - expect(result.status).to eq(200) - expect(result.call_index).to eq(0) - end - - batch.add(@calls[1]) do |result| - call2_returned = true - expect(result.status).to eq(200) - expect(result.call_index).to eq(1) - end - - batch.execute - expect(call1_returned).to eq(true) - expect(call2_returned).to eq(true) - end - end - - describe 'with a valid request and an invalid one' do - before do - @calls = [ - @discovery.apis.get_rest(:api => 'plus', :version => 'v1'), - @discovery.apis.get_rest(:api => 'invalid', :version => 'invalid') - ] - end - - it 'should execute both when using a global callback' do - block_called = 0 - batch = @discovery.batch(@calls) do |result| - block_called += 1 - if result.call_index == 0 - expect(result.status).to eq(200) - else - expect(result.status).to be >= 400 - expect(result.status).to be < 500 - end - end - - batch.execute - expect(block_called).to eq(2) - end - - it 'should execute both when using individual callbacks' do - call1_returned, call2_returned = false, false - batch = @discovery.batch - - batch.add(@calls[0]) do |result| - call1_returned = true - expect(result.status).to eq(200) - expect(result.call_index).to eq(0) - end - - batch.add(@calls[1]) do |result| - call2_returned = true - expect(result.status).to be >= 400 - expect(result.status).to be < 500 - expect(result.call_index).to eq(1) - end - - batch.execute - expect(call1_returned).to eq(true) - expect(call2_returned).to eq(true) - end - end - end -end \ No newline at end of file diff --git a/spec/google/api_client/simple_file_store_spec.rb b/spec/google/api_client/simple_file_store_spec.rb deleted file mode 100644 index cb7d89847..000000000 --- a/spec/google/api_client/simple_file_store_spec.rb +++ /dev/null @@ -1,133 +0,0 @@ -# encoding:utf-8 - -# Copyright 2013 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'google/api_client/service/simple_file_store' - -RSpec.describe Google::APIClient::Service::SimpleFileStore do - - FILE_NAME = 'test.cache' - - describe 'with no cache file' do - before(:each) do - File.delete(FILE_NAME) if File.exists?(FILE_NAME) - @cache = Google::APIClient::Service::SimpleFileStore.new(FILE_NAME) - end - - it 'should return nil when asked if a key exists' do - expect(@cache.exist?('invalid')).to be_nil - expect(File.exists?(FILE_NAME)).to be_falsey - end - - it 'should return nil when asked to read a key' do - expect(@cache.read('invalid')).to be_nil - expect(File.exists?(FILE_NAME)).to be_falsey - end - - it 'should return nil when asked to fetch a key' do - expect(@cache.fetch('invalid')).to be_nil - expect(File.exists?(FILE_NAME)).to be_falsey - end - - it 'should create a cache file when asked to fetch a key with a default' do - expect(@cache.fetch('new_key') do - 'value' - end).to eq('value') - expect(File.exists?(FILE_NAME)).to be_truthy - end - - it 'should create a cache file when asked to write a key' do - @cache.write('new_key', 'value') - expect(File.exists?(FILE_NAME)).to be_truthy - end - - it 'should return nil when asked to delete a key' do - expect(@cache.delete('invalid')).to be_nil - expect(File.exists?(FILE_NAME)).to be_falsey - end - end - - describe 'with an existing cache' do - before(:each) do - File.delete(FILE_NAME) if File.exists?(FILE_NAME) - @cache = Google::APIClient::Service::SimpleFileStore.new(FILE_NAME) - @cache.write('existing_key', 'existing_value') - end - - it 'should return true when asked if an existing key exists' do - expect(@cache.exist?('existing_key')).to be_truthy - end - - it 'should return false when asked if a nonexistent key exists' do - expect(@cache.exist?('invalid')).to be_falsey - end - - it 'should return the value for an existing key when asked to read it' do - expect(@cache.read('existing_key')).to eq('existing_value') - end - - it 'should return nil for a nonexistent key when asked to read it' do - expect(@cache.read('invalid')).to be_nil - end - - it 'should return the value for an existing key when asked to read it' do - expect(@cache.read('existing_key')).to eq('existing_value') - end - - it 'should return nil for a nonexistent key when asked to fetch it' do - expect(@cache.fetch('invalid')).to be_nil - end - - it 'should return and save the default value for a nonexistent key when asked to fetch it with a default' do - expect(@cache.fetch('new_key') do - 'value' - end).to eq('value') - expect(@cache.read('new_key')).to eq('value') - end - - it 'should remove an existing value and return true when asked to delete it' do - expect(@cache.delete('existing_key')).to be_truthy - expect(@cache.read('existing_key')).to be_nil - end - - it 'should return false when asked to delete a nonexistent key' do - expect(@cache.delete('invalid')).to be_falsey - end - - it 'should convert keys to strings when storing them' do - @cache.write(:symbol_key, 'value') - expect(@cache.read('symbol_key')).to eq('value') - end - - it 'should convert keys to strings when reading them' do - expect(@cache.read(:existing_key)).to eq('existing_value') - end - - it 'should convert keys to strings when fetching them' do - expect(@cache.fetch(:existing_key)).to eq('existing_value') - end - - it 'should convert keys to strings when deleting them' do - expect(@cache.delete(:existing_key)).to be_truthy - expect(@cache.read('existing_key')).to be_nil - end - end - - after(:all) do - File.delete(FILE_NAME) if File.exists?(FILE_NAME) - end -end \ No newline at end of file diff --git a/spec/google/api_client_spec.rb b/spec/google/api_client_spec.rb deleted file mode 100644 index eb9a59af7..000000000 --- a/spec/google/api_client_spec.rb +++ /dev/null @@ -1,352 +0,0 @@ -# Copyright 2010 Google Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require 'spec_helper' - -require 'faraday' -require 'signet/oauth_1/client' -require 'google/api_client' - -shared_examples_for 'configurable user agent' do - include ConnectionHelpers - - it 'should allow the user agent to be modified' do - client.user_agent = 'Custom User Agent/1.2.3' - expect(client.user_agent).to eq('Custom User Agent/1.2.3') - end - - it 'should allow the user agent to be set to nil' do - client.user_agent = nil - expect(client.user_agent).to eq(nil) - end - - it 'should not allow the user agent to be used with bogus values' do - expect(lambda do - client.user_agent = 42 - client.execute(:uri=>'https://www.google.com/') - end).to raise_error(TypeError) - end - - it 'should transmit a User-Agent header when sending requests' do - client.user_agent = 'Custom User Agent/1.2.3' - - conn = stub_connection do |stub| - stub.get('/') do |env| - headers = env[:request_headers] - expect(headers).to have_key('User-Agent') - expect(headers['User-Agent']).to eq(client.user_agent) - [200, {}, ['']] - end - end - client.execute(:uri=>'https://www.google.com/', :connection => conn) - conn.verify - end -end - -RSpec.describe Google::APIClient do - include ConnectionHelpers - - let(:client) { Google::APIClient.new(:application_name => 'API Client Tests') } - - it "should pass the faraday options provided on initialization to FaraDay configuration block" do - client = Google::APIClient.new(faraday_option: {timeout: 999}) - expect(client.connection.options.timeout).to be == 999 - end - - it 'should make its version number available' do - expect(Google::APIClient::VERSION::STRING).to be_instance_of(String) - end - - it 'should default to OAuth 2' do - expect(Signet::OAuth2::Client).to be === client.authorization - end - - describe 'configure for no authentication' do - before do - client.authorization = nil - end - it_should_behave_like 'configurable user agent' - end - - describe 'configured for OAuth 1' do - before do - client.authorization = :oauth_1 - client.authorization.token_credential_key = 'abc' - client.authorization.token_credential_secret = '123' - end - - it 'should use the default OAuth1 client configuration' do - expect(client.authorization.temporary_credential_uri.to_s).to eq( - 'https://www.google.com/accounts/OAuthGetRequestToken' - ) - expect(client.authorization.authorization_uri.to_s).to include( - 'https://www.google.com/accounts/OAuthAuthorizeToken' - ) - expect(client.authorization.token_credential_uri.to_s).to eq( - 'https://www.google.com/accounts/OAuthGetAccessToken' - ) - expect(client.authorization.client_credential_key).to eq('anonymous') - expect(client.authorization.client_credential_secret).to eq('anonymous') - end - - it_should_behave_like 'configurable user agent' - end - - describe 'configured for OAuth 2' do - before do - client.authorization = :oauth_2 - client.authorization.access_token = '12345' - end - - # TODO - it_should_behave_like 'configurable user agent' - end - - describe 'when executing requests' do - before do - @prediction = client.discovered_api('prediction', 'v1.2') - client.authorization = :oauth_2 - @connection = stub_connection do |stub| - stub.post('/prediction/v1.2/training?data=12345') do |env| - expect(env[:request_headers]['Authorization']).to eq('Bearer 12345') - [200, {}, '{}'] - end - end - end - - after do - @connection.verify - end - - it 'should use default authorization' do - client.authorization.access_token = "12345" - client.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :connection => @connection - ) - end - - it 'should use request scoped authorization when provided' do - client.authorization.access_token = "abcdef" - new_auth = Signet::OAuth2::Client.new(:access_token => '12345') - client.execute( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'}, - :authorization => new_auth, - :connection => @connection - ) - end - - it 'should accept options with batch/request style execute' do - client.authorization.access_token = "abcdef" - new_auth = Signet::OAuth2::Client.new(:access_token => '12345') - request = client.generate_request( - :api_method => @prediction.training.insert, - :parameters => {'data' => '12345'} - ) - client.execute( - request, - :authorization => new_auth, - :connection => @connection - ) - end - - - it 'should accept options in array style execute' do - client.authorization.access_token = "abcdef" - new_auth = Signet::OAuth2::Client.new(:access_token => '12345') - client.execute( - @prediction.training.insert, {'data' => '12345'}, '', {}, - { :authorization => new_auth, :connection => @connection } - ) - end - end - - describe 'when retries enabled' do - before do - client.retries = 2 - end - - after do - @connection.verify - end - - it 'should follow redirects' do - client.authorization = nil - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [302, {'location' => 'https://www.google.com/bar'}, '{}'] - end - stub.get('/bar') do |env| - [200, {}, '{}'] - end - end - - client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection - ) - end - - it 'should refresh tokens on 401 errors' do - client.authorization.access_token = '12345' - expect(client.authorization).to receive(:fetch_access_token!) - - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [401, {}, '{}'] - end - stub.get('/foo') do |env| - [200, {}, '{}'] - end - end - - client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection - ) - end - - - it 'should not attempt multiple token refreshes' do - client.authorization.access_token = '12345' - expect(client.authorization).to receive(:fetch_access_token!).once - - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [401, {}, '{}'] - end - end - - client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection - ) - end - - it 'should not retry on client errors' do - count = 0 - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - expect(count).to eq(0) - count += 1 - [403, {}, '{}'] - end - end - - client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection, - :authenticated => false - ) - end - - it 'should retry on 500 errors' do - client.authorization = nil - - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [500, {}, '{}'] - end - stub.get('/foo') do |env| - [200, {}, '{}'] - end - end - - expect(client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection - ).status).to eq(200) - - end - - it 'should fail after max retries' do - client.authorization = nil - count = 0 - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - count += 1 - [500, {}, '{}'] - end - end - - expect(client.execute( - :uri => 'https://www.google.com/foo', - :connection => @connection - ).status).to eq(500) - expect(count).to eq(3) - end - - end - - describe 'when retries disabled and expired_auth_retry on (default)' do - before do - client.retries = 0 - end - - after do - @connection.verify - end - - it 'should refresh tokens on 401 errors' do - client.authorization.access_token = '12345' - expect(client.authorization).to receive(:fetch_access_token!) - - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [401, {}, '{}'] - end - stub.get('/foo') do |env| - [200, {}, '{}'] - end - end - - client.execute( - :uri => 'https://www.gogole.com/foo', - :connection => @connection - ) - end - - end - - describe 'when retries disabled and expired_auth_retry off' do - before do - client.retries = 0 - client.expired_auth_retry = false - end - - it 'should not refresh tokens on 401 errors' do - client.authorization.access_token = '12345' - expect(client.authorization).not_to receive(:fetch_access_token!) - - @connection = stub_connection do |stub| - stub.get('/foo') do |env| - [401, {}, '{}'] - end - stub.get('/foo') do |env| - [200, {}, '{}'] - end - end - - resp = client.execute( - :uri => 'https://www.gogole.com/foo', - :connection => @connection - ) - - expect(resp.response.status).to be == 401 - end - - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 1c64a4e8c..000000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,66 +0,0 @@ -$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__)) -$LOAD_PATH.uniq! - -require 'rspec' -require 'faraday' - -begin - require 'simplecov' - require 'coveralls' - - SimpleCov.formatter = Coveralls::SimpleCov::Formatter - SimpleCov.start -rescue LoadError - # SimpleCov missing, so just run specs with no coverage. -end - -Faraday::Adapter.load_middleware(:test) - -module Faraday - class Connection - def verify - if app.kind_of?(Faraday::Adapter::Test) - app.stubs.verify_stubbed_calls - else - raise TypeError, "Expected test adapter" - end - end - end -end - -module ConnectionHelpers - def stub_connection(&block) - stubs = Faraday::Adapter::Test::Stubs.new do |stub| - block.call(stub) - end - connection = Faraday.new do |builder| - builder.options.params_encoder = Faraday::FlatParamsEncoder - builder.adapter(:test, stubs) - end - end -end - -module JSONMatchers - class EqualsJson - def initialize(expected) - @expected = JSON.parse(expected) - end - def matches?(target) - @target = JSON.parse(target) - @target.eql?(@expected) - end - def failure_message - "expected #{@target.inspect} to be #{@expected}" - end - def negative_failure_message - "expected #{@target.inspect} not to be #{@expected}" - end - end - - def be_json(expected) - EqualsJson.new(expected) - end -end - -RSpec.configure do |config| -end diff --git a/yard/bin/yard-wiki b/yard/bin/yard-wiki deleted file mode 100755 index 61416750e..000000000 --- a/yard/bin/yard-wiki +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env ruby -$LOAD_PATH.unshift( - File.expand_path(File.join(File.dirname(__FILE__), '../lib')) -) -$LOAD_PATH.uniq! - -require 'yard/cli/wiki' - -YARD::CLI::Wiki.run(*ARGV) diff --git a/yard/lib/yard-google-code.rb b/yard/lib/yard-google-code.rb deleted file mode 100644 index cd4eba834..000000000 --- a/yard/lib/yard-google-code.rb +++ /dev/null @@ -1,12 +0,0 @@ -$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) -$LOAD_PATH.uniq! - -YARD::Templates::Engine.register_template_path File.dirname(__FILE__) + '/../templates' -require 'yard/templates/template' -require 'yard/templates/helpers/wiki_helper' - -::YARD::Templates::Template.extra_includes |= [ - YARD::Templates::Helpers::WikiHelper -] - -require 'yard/serializers/wiki_serializer' diff --git a/yard/lib/yard/cli/wiki.rb b/yard/lib/yard/cli/wiki.rb deleted file mode 100644 index 2c1739319..000000000 --- a/yard/lib/yard/cli/wiki.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'yard' -require 'yard/serializers/wiki_serializer' -require 'yard/cli/yardoc' - -module YARD - module CLI - class Wiki < Yardoc - # Creates a new instance of the commandline utility - def initialize - super - @options = SymbolHash.new(false) - @options.update( - :format => :html, - :template => :default, - :markup => :rdoc, # default is :rdoc but falls back on :none - :serializer => YARD::Serializers::WikiSerializer.new, # Sigh. :-( - :default_return => "Object", - :hide_void_return => false, - :no_highlight => false, - :files => [], - :verifier => Verifier.new - ) - @visibilities = [:public] - @assets = {} - @excluded = [] - @files = [] - @hidden_tags = [] - @use_cache = false - @use_yardopts_file = true - @use_document_file = true - @generate = true - @options_file = DEFAULT_YARDOPTS_FILE - @statistics = true - @list = false - @save_yardoc = true - @has_markup = false - - if defined?(::Encoding) && ::Encoding.respond_to?(:default_external=) - ::Encoding.default_external, ::Encoding.default_internal = 'utf-8', 'utf-8' - end - end - end - end -end diff --git a/yard/lib/yard/rake/wikidoc_task.rb b/yard/lib/yard/rake/wikidoc_task.rb deleted file mode 100644 index 573bfb4d3..000000000 --- a/yard/lib/yard/rake/wikidoc_task.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'rake' -require 'rake/tasklib' -require 'yard/rake/yardoc_task' -require 'yard/cli/wiki' - -module YARD - module Rake - # The rake task to run {CLI::Yardoc} and generate documentation. - class WikidocTask < YardocTask - protected - - # Defines the rake task - # @return [void] - def define - desc "Generate Wiki Documentation with YARD" - task(name) do - before.call if before.is_a?(Proc) - yardoc = YARD::CLI::Wiki.new - yardoc.parse_arguments *(options + files) - yardoc.options[:verifier] = verifier if verifier - yardoc.run - after.call if after.is_a?(Proc) - end - end - end - end -end diff --git a/yard/lib/yard/serializers/wiki_serializer.rb b/yard/lib/yard/serializers/wiki_serializer.rb deleted file mode 100644 index 469c4736e..000000000 --- a/yard/lib/yard/serializers/wiki_serializer.rb +++ /dev/null @@ -1,68 +0,0 @@ -# encoding: utf-8 - -require 'yard/serializers/file_system_serializer' - -module YARD - module Serializers - ## - # Subclass required to get correct filename for the top level namespace. - # :-( - class WikiSerializer < FileSystemSerializer - # Post-process the data before serializing. - # Strip unnecessary whitespace. - # Convert stuff into more wiki-friendly stuff. - # FULL OF HACKS! - def serialize(object, data) - data = data.encode("UTF-8") - if object == "Sidebar.wiki" - data = data.gsub(/^#sidebar Sidebar\n/, "") - end - data = data.gsub(/\n\s*\n/, "\n") - # ASCII/UTF-8 erb error work-around. - data = data.gsub(/--/, "—") - data = data.gsub(/——/, "----") - data = data.gsub(/----\n----/, "----") - # HACK! Google Code Wiki treats blocks like
     blocks.
    -        data = data.gsub(/\(.+)\<\/code\>/, "`\\1`")
    -        super(object, data)
    -      end
    -
    -      def serialized_path(object)
    -        return object if object.is_a?(String)
    -
    -        if object.is_a?(CodeObjects::ExtraFileObject)
    -          fspath = ['file.' + object.name + (extension.empty? ? '' : ".#{extension}")]
    -        else
    -          # This line is the only change of significance.
    -          # Changed from 'top-level-namespace' to 'TopLevelNamespace' to
    -          # conform to wiki word page naming convention.
    -          objname = object != YARD::Registry.root ? object.name.to_s : "TopLevelNamespace"
    -          objname += '_' + object.scope.to_s[0,1] if object.is_a?(CodeObjects::MethodObject)
    -          fspath = [objname + (extension.empty? ? '' : ".#{extension}")]
    -          if object.namespace && object.namespace.path != ""
    -            fspath.unshift(*object.namespace.path.split(CodeObjects::NSEP))
    -          end
    -        end
    -
    -        # Don't change the filenames, it just makes it more complicated
    -        # to figure out the original name.
    -        #fspath.map! do |p|
    -        #  p.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
    -        #end
    -
    -        # Remove special chars from filenames.
    -        # Windows disallows \ / : * ? " < > | but we will just remove any
    -        # non alphanumeric (plus period, underscore and dash).
    -        fspath.map! do |p|
    -          p.gsub(/[^\w\.-]/) do |x|
    -            encoded = '_'
    -
    -            x.each_byte { |b| encoded << ("%X" % b) }
    -            encoded
    -          end
    -        end
    -        fspath.join("")
    -      end
    -    end
    -  end
    -end
    diff --git a/yard/lib/yard/templates/helpers/wiki_helper.rb b/yard/lib/yard/templates/helpers/wiki_helper.rb
    deleted file mode 100644
    index e03dfb668..000000000
    --- a/yard/lib/yard/templates/helpers/wiki_helper.rb
    +++ /dev/null
    @@ -1,502 +0,0 @@
    -require 'cgi'
    -require 'rdiscount'
    -
    -module YARD
    -  module Templates::Helpers
    -    # The helper module for HTML templates.
    -    module WikiHelper
    -      include MarkupHelper
    -
    -      # @return [String] escapes text
    -      def h(text)
    -        out = ""
    -        text = text.split(/\n/)
    -        text.each_with_index do |line, i|
    -          out <<
    -          case line
    -          when /^\s*$/; "\n\n"
    -          when /^\s+\S/, /^=/; line + "\n"
    -          else; line + (text[i + 1] =~ /^\s+\S/ ? "\n" : " ")
    -          end
    -        end
    -        out.strip
    -      end
    -
    -      # @return [String] wraps text at +col+ columns.
    -      def wrap(text, col = 72)
    -        text.strip.gsub(/(.{1,#{col}})( +|$\n?)|(.{1,#{col}})/, "\\1\\3\n")
    -      end
    -
    -      # Escapes a URL
    -      # 
    -      # @param [String] text the URL
    -      # @return [String] the escaped URL
    -      def urlencode(text)
    -        CGI.escape(text.to_s)
    -      end
    -
    -      def indent(text, len = 2)
    -        text.gsub(/^/, ' ' * len)
    -      end
    -
    -      def unindent(text)
    -        lines = text.split("\n", -1)
    -        min_indent_size = text.size
    -        for line in lines
    -          indent_size = (line.gsub("\t", "  ") =~ /[^\s]/) || text.size
    -          min_indent_size = indent_size if indent_size < min_indent_size
    -        end
    -        text.gsub("\t", "  ").gsub(Regexp.new("^" + " " * min_indent_size), '')
    -      end
    -
    -      # @group Converting Markup to HTML
    -
    -      # Turns text into HTML using +markup+ style formatting.
    -      #
    -      # @param [String] text the text to format
    -      # @param [Symbol] markup examples are +:markdown+, +:textile+, +:rdoc+.
    -      #   To add a custom markup type, see {MarkupHelper}
    -      # @return [String] the HTML
    -      def htmlify(text, markup = options[:markup])
    -        markup_meth = "html_markup_#{markup}"
    -        return text unless respond_to?(markup_meth)
    -        return "" unless text
    -        return text unless markup
    -        load_markup_provider(markup)
    -        html = send(markup_meth, text)
    -        if html.respond_to?(:encode)
    -          html = html.force_encoding(text.encoding) # for libs that mess with encoding
    -          html = html.encode(:invalid => :replace, :replace => '?')
    -        end
    -        html = resolve_links(html)
    -        html = html.gsub(/
    (?:\s*)?(.+?)(?:<\/code>\s*)?<\/pre>/m) do
    -          str = unindent($1).strip
    -          str = html_syntax_highlight(CGI.unescapeHTML(str)) unless options[:no_highlight]
    -          str
    -        end unless markup == :text
    -        html
    -      end
    -
    -      # Converts Markdown to HTML
    -      # @param [String] text input Markdown text
    -      # @return [String] output HTML
    -      # @since 0.6.0
    -      def html_markup_markdown(text)
    -        Markdown.new(text).to_html
    -      end
    -
    -      # Converts Textile to HTML
    -      # @param [String] text the input Textile text
    -      # @return [String] output HTML
    -      # @since 0.6.0
    -      def html_markup_textile(text)
    -        doc = markup_class(:textile).new(text)
    -        doc.hard_breaks = false if doc.respond_to?(:hard_breaks=)
    -        doc.to_html
    -      end
    -
    -      # Converts plaintext to HTML
    -      # @param [String] text the input text
    -      # @return [String] the output HTML
    -      # @since 0.6.0
    -      def html_markup_text(text)
    -        "
    " + text + "
    " - end - - # Converts HTML to HTML - # @param [String] text input html - # @return [String] output HTML - # @since 0.6.0 - def html_markup_html(text) - text - end - - # @return [String] HTMLified text as a single line (paragraphs removed) - def htmlify_line(*args) - htmlify(*args) - end - - # Fixes RDoc behaviour with ++ only supporting alphanumeric text. - # - # @todo Refactor into own SimpleMarkup subclass - def fix_typewriter(text) - text.gsub(/\+(?! )([^\n\+]{1,900})(?! )\+/) do - type_text, pre_text, no_match = $1, $`, $& - pre_match = pre_text.scan(%r()) - if pre_match.last.nil? || pre_match.last.include?('/') - '`' + h(type_text) + '`' - else - no_match - end - end - end - - # Don't allow -- to turn into — element. The chances of this being - # some --option is far more likely than the typographical meaning. - # - # @todo Refactor into own SimpleMarkup subclass - def fix_dash_dash(text) - text.gsub(/—(?=\S)/, '--') - end - - # @group Syntax Highlighting Source Code - - # Syntax highlights +source+ in language +type+. - # - # @note To support a specific language +type+, implement the method - # +html_syntax_highlight_TYPE+ in this class. - # - # @param [String] source the source code to highlight - # @param [Symbol] type the language type (:ruby, :plain, etc). Use - # :plain for no syntax highlighting. - # @return [String] the highlighted source - def html_syntax_highlight(source, type = nil) - return "" unless source - return "{{{\n#{source}\n}}}" - end - - # @return [String] unhighlighted source - def html_syntax_highlight_plain(source) - return "" unless source - return "{{{\n#{source}\n}}}" - end - - # @group Linking Objects and URLs - - # Resolves any text in the form of +{Name}+ to the object specified by - # Name. Also supports link titles in the form +{Name title}+. - # - # @example Linking to an instance method - # resolve_links("{MyClass#method}") # => "MyClass#method" - # @example Linking to a class with a title - # resolve_links("{A::B::C the C class}") # => "the c class" - # @param [String] text the text to resolve links in - # @return [String] HTML with linkified references - def resolve_links(text) - code_tags = 0 - text.gsub(/<(\/)?(pre|code|tt)|\{(\S+?)(?:\s(.*?\S))?\}(?=[\W<]|.+<\/|$)/) do |str| - closed, tag, name, title, match = $1, $2, $3, $4, $& - if tag - code_tags += (closed ? -1 : 1) - next str - end - next str unless code_tags == 0 - - next(match) if name[0,1] == '|' - if object.is_a?(String) - object - else - link = linkify(name, title) - if link == name || link == title - match = /(.+)?(\{#{Regexp.quote name}(?:\s.*?)?\})(.+)?/.match(text) - file = (@file ? @file : object.file) || '(unknown)' - line = (@file ? 1 : (object.docstring.line_range ? object.docstring.line_range.first : 1)) + (match ? $`.count("\n") : 0) - log.warn "In file `#{file}':#{line}: Cannot resolve link to #{name} from text" + (match ? ":" : ".") - log.warn((match[1] ? '...' : '') + match[2].gsub("\n","") + (match[3] ? '...' : '')) if match - end - - link - end - end - end - - def unlink(value) - value.gsub(/\b(([A-Z][a-z]+){2,99})\b/, "!\\1") - end - - # (see BaseHelper#link_file) - def link_file(filename, title = nil, anchor = nil) - link_url(url_for_file(filename, anchor), title) - end - - # (see BaseHelper#link_include_object) - def link_include_object(obj) - htmlify(obj.docstring) - end - - # (see BaseHelper#link_object) - def link_object(obj, otitle = nil, anchor = nil, relative = true) - return otitle if obj.nil? - obj = Registry.resolve(object, obj, true, true) if obj.is_a?(String) - if !otitle && obj.root? - title = "Top Level Namespace" - elsif otitle - # title = "`" + otitle.to_s + "`" - title = otitle.to_s - elsif object.is_a?(CodeObjects::Base) - # title = "`" + h(object.relative_path(obj)) + "`" - title = h(object.relative_path(obj)) - else - # title = "`" + h(obj.to_s) + "`" - title = h(obj.to_s) - end - unless serializer - return unlink(title) - end - return unlink(title) if obj.is_a?(CodeObjects::Proxy) - - link = url_for(obj, anchor, relative) - if link - link_url(link, title, :formatted => false) - else - unlink(title) - end - end - - # (see BaseHelper#link_url) - def link_url(url, title = nil, params = {}) - title ||= url - if url.to_s == "" - title - else - if params[:formatted] - "#{title}" - else - "[#{url} #{title}]" - end - end - end - - # @group URL Helpers - - # @param [CodeObjects::Base] object the object to get an anchor for - # @return [String] the anchor for a specific object - def anchor_for(object) - # Method:_Google::APIClient#execute! - case object - when CodeObjects::MethodObject - if object.scope == :instance - "Method:_#{object.path}" - elsif object.scope == :class - "Method:_#{object.path}" - end - when CodeObjects::ClassVariableObject - "#{object.name.to_s.gsub('@@', '')}-#{object.type}" - when CodeObjects::Base - "#{object.name}-#{object.type}" - when CodeObjects::Proxy - object.path - else - object.to_s - end - end - - # Returns the URL for an object. - # - # @param [String, CodeObjects::Base] obj the object (or object path) to link to - # @param [String] anchor the anchor to link to - # @param [Boolean] relative use a relative or absolute link - # @return [String] the URL location of the object - def url_for(obj, anchor = nil, relative = true) - link = nil - return link unless serializer - if obj.kind_of?(CodeObjects::Base) && obj.root? - return 'TopLevelNamespace' - end - - if obj.is_a?(CodeObjects::Base) && !obj.is_a?(CodeObjects::NamespaceObject) - # If the obj is not a namespace obj make it the anchor. - anchor, obj = obj, obj.namespace - end - - objpath = serializer.serialized_path(obj) - return link unless objpath - - if relative - fromobj = object - if object.is_a?(CodeObjects::Base) && - !object.is_a?(CodeObjects::NamespaceObject) - fromobj = fromobj.namespace - end - - from = serializer.serialized_path(fromobj) - link = File.relative_path(from, objpath) - else - link = objpath - end - - return ( - link.gsub(/\.html$/, '').gsub(/\.wiki$/, '') + - (anchor ? '#' + urlencode(anchor_for(anchor)) : '') - ) - end - - # Returns the URL for a specific file - # - # @param [String] filename the filename to link to - # @param [String] anchor optional anchor - # @return [String] the URL pointing to the file - def url_for_file(filename, anchor = nil) - fromobj = object - if CodeObjects::Base === fromobj && !fromobj.is_a?(CodeObjects::NamespaceObject) - fromobj = fromobj.namespace - end - from = serializer.serialized_path(fromobj) - if filename == options[:readme] - filename = 'Documentation' - else - filename = File.basename(filename).gsub(/\.[^.]+$/, '').capitalize - end - link = File.relative_path(from, filename) - return ( - link.gsub(/\.html$/, '').gsub(/\.wiki$/, '') + - (anchor ? '#' + urlencode(anchor) : '') - ) - end - - # @group Formatting Objects and Attributes - - # Formats a list of objects and links them - # @return [String] a formatted list of objects - def format_object_name_list(objects) - objects.sort_by {|o| o.name.to_s.downcase }.map do |o| - "" + linkify(o, o.name) + "" - end.join(", ") - end - - # Formats a list of types from a tag. - # - # @param [Array, FalseClass] typelist - # the list of types to be formatted. - # - # @param [Boolean] brackets omits the surrounding - # brackets if +brackets+ is set to +false+. - # - # @return [String] the list of types formatted - # as [Type1, Type2, ...] with the types linked - # to their respective descriptions. - # - def format_types(typelist, brackets = true) - return unless typelist.is_a?(Array) - list = typelist.map do |type| - type = type.gsub(/([<>])/) { h($1) } - type = type.gsub(/([\w:]+)/) do - $1 == "lt" || $1 == "gt" ? "`#{$1}`" : linkify($1, $1) - end - end - list.empty? ? "" : (brackets ? "(#{list.join(", ")})" : list.join(", ")) - end - - # Get the return types for a method signature. - # - # @param [CodeObjects::MethodObject] meth the method object - # @param [Boolean] link whether to link the types - # @return [String] the signature types - # @since 0.5.3 - def signature_types(meth, link = true) - meth = convert_method_to_overload(meth) - - type = options[:default_return] || "" - if meth.tag(:return) && meth.tag(:return).types - types = meth.tags(:return).map {|t| t.types ? t.types : [] }.flatten.uniq - first = link ? h(types.first) : format_types([types.first], false) - if types.size == 2 && types.last == 'nil' - type = first + '?' - elsif types.size == 2 && types.last =~ /^(Array)?<#{Regexp.quote types.first}>$/ - type = first + '+' - elsif types.size > 2 - type = [first, '...'].join(', ') - elsif types == ['void'] && options[:hide_void_return] - type = "" - else - type = link ? h(types.join(", ")) : format_types(types, false) - end - elsif !type.empty? - type = link ? h(type) : format_types([type], false) - end - type = "(#{type.to_s.strip}) " unless type.empty? - type - end - - # Formats the signature of method +meth+. - # - # @param [CodeObjects::MethodObject] meth the method object to list - # the signature of - # @param [Boolean] link whether to link the method signature to the details view - # @param [Boolean] show_extras whether to show extra meta-data (visibility, attribute info) - # @param [Boolean] full_attr_name whether to show the full attribute name - # ("name=" instead of "name") - # @return [String] the formatted method signature - def signature(meth, link = true, show_extras = true, full_attr_name = true) - meth = convert_method_to_overload(meth) - - type = signature_types(meth, link) - name = full_attr_name ? meth.name : meth.name.to_s.gsub(/^(\w+)=$/, '\1') - blk = format_block(meth) - args = !full_attr_name && meth.writer? ? "" : format_args(meth) - extras = [] - extras_text = '' - if show_extras - if rw = meth.attr_info - attname = [rw[:read] ? 'read' : nil, rw[:write] ? 'write' : nil].compact - attname = attname.size == 1 ? attname.join('') + 'only' : nil - extras << attname if attname - end - extras << meth.visibility if meth.visibility != :public - extras_text = ' (' + extras.join(", ") + ')' unless extras.empty? - end - title = "%s *`%s`* `%s` `%s`" % [type, h(name.to_s).strip, args, blk] - title.gsub!(//, "") - title.gsub!(/<\/tt>/, "") - title.gsub!(/`\s*`/, "") - title.strip! - if link - if meth.is_a?(YARD::CodeObjects::MethodObject) - link_title = - "#{h meth.name(true)} (#{meth.scope} #{meth.type})" - else - link_title = "#{h name} (#{meth.type})" - end - # This has to be raw HTML, can't wiki-format a link title otherwise. - "#{title}#{extras_text}" - else - title + extras_text - end - end - - # @group Getting the Character Encoding - - # Returns the current character set. The default value can be overridden - # by setting the +LANG+ environment variable or by overriding this - # method. In Ruby 1.9 you can also modify this value by setting - # +Encoding.default_external+. - # - # @return [String] the current character set - # @since 0.5.4 - def charset - return 'utf-8' unless RUBY19 || lang = ENV['LANG'] - if RUBY19 - lang = Encoding.default_external.name.downcase - else - lang = lang.downcase.split('.').last - end - case lang - when "ascii-8bit", "us-ascii", "ascii-7bit"; 'iso-8859-1' - else; lang - end - end - - # @endgroup - - private - - # Converts a set of hash options into HTML attributes for a tag - # - # @param [Hash{String => String}] opts the tag options - # @return [String] the tag attributes of an HTML tag - def tag_attrs(opts = {}) - opts.sort_by {|k, v| k.to_s }.map {|k,v| "#{k}=#{v.to_s.inspect}" if v }.join(" ") - end - - # Converts a {CodeObjects::MethodObject} into an overload object - # @since 0.5.3 - def convert_method_to_overload(meth) - # use first overload tag if it has a return type and method itself does not - if !meth.tag(:return) && meth.tags(:overload).size == 1 && meth.tag(:overload).tag(:return) - return meth.tag(:overload) - end - meth - end - end - end -end diff --git a/yard/templates/default/class/setup.rb b/yard/templates/default/class/setup.rb deleted file mode 100644 index 0b4dc12f8..000000000 --- a/yard/templates/default/class/setup.rb +++ /dev/null @@ -1,43 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -include T('default/module') - -def init - super - sections.place(:subclasses).before(:children) - sections.place(:constructor_details, [T('method_details')]).before(:methodmissing) - # Weird bug w/ doubled sections - sections.uniq! -end - -def constructor_details - ctors = object.meths(:inherited => true, :included => true) - return unless @ctor = ctors.find {|o| o.name == :initialize } - return if prune_method_listing([@ctor]).empty? - erb(:constructor_details) -end - -def subclasses - return if object.path == "Object" # don't show subclasses for Object - unless globals.subclasses - globals.subclasses = {} - list = run_verifier Registry.all(:class) - list.each do |o| - (globals.subclasses[o.superclass.path] ||= []) << o if o.superclass - end - end - - @subclasses = globals.subclasses[object.path] - return if @subclasses.nil? || @subclasses.empty? - @subclasses = @subclasses.sort_by {|o| o.path }.map do |child| - name = child.path - if object.namespace - name = object.relative_path(child) - end - [name, child] - end - erb(:subclasses) -end \ No newline at end of file diff --git a/yard/templates/default/docstring/setup.rb b/yard/templates/default/docstring/setup.rb deleted file mode 100644 index 63a5877fb..000000000 --- a/yard/templates/default/docstring/setup.rb +++ /dev/null @@ -1,54 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -def init - return if object.docstring.blank? && !object.has_tag?(:api) - sections :index, [:private, :deprecated, :abstract, :todo, :note, :returns_void, :text], T('tags') -end - -def private - return unless object.has_tag?(:api) && object.tag(:api).text == 'private' - erb(:private) -end - -def abstract - return unless object.has_tag?(:abstract) - erb(:abstract) -end - -def deprecated - return unless object.has_tag?(:deprecated) - erb(:deprecated) -end - -def todo - return unless object.has_tag?(:todo) - erb(:todo) -end - -def note - return unless object.has_tag?(:note) - erb(:note) -end - -def returns_void - return unless object.type == :method - return if object.name == :initialize && object.scope == :instance - return unless object.tags(:return).size == 1 && object.tag(:return).types == ['void'] - erb(:returns_void) -end - -def docstring_text - text = "" - unless object.tags(:overload).size == 1 && object.docstring.empty? - text = object.docstring - end - - if text.strip.empty? && object.tags(:return).size == 1 && object.tag(:return).text - text = object.tag(:return).text.gsub(/\A([a-z])/) {|x| x.upcase } - end - - text.strip -end \ No newline at end of file diff --git a/yard/templates/default/method/setup.rb b/yard/templates/default/method/setup.rb deleted file mode 100644 index a6ed29924..000000000 --- a/yard/templates/default/method/setup.rb +++ /dev/null @@ -1,8 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -def init - sections :header, [T('method_details')] -end \ No newline at end of file diff --git a/yard/templates/default/method_details/setup.rb b/yard/templates/default/method_details/setup.rb deleted file mode 100644 index e3bfea003..000000000 --- a/yard/templates/default/method_details/setup.rb +++ /dev/null @@ -1,8 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -def init - sections :header, [:method_signature, T('docstring')] -end diff --git a/yard/templates/default/module/setup.rb b/yard/templates/default/module/setup.rb deleted file mode 100644 index d2559eaa4..000000000 --- a/yard/templates/default/module/setup.rb +++ /dev/null @@ -1,133 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -include Helpers::ModuleHelper - -def init - sections :header, :box_info, :pre_docstring, T('docstring'), :children, - :constant_summary, [T('docstring')], :inherited_constants, - :inherited_methods, - :methodmissing, [T('method_details')], - :attribute_details, [T('method_details')], - :method_details_list, [T('method_details')] -end - -def pre_docstring - return if object.docstring.blank? - erb(:pre_docstring) -end - -def children - @inner = [[:modules, []], [:classes, []]] - object.children.each do |child| - @inner[0][1] << child if child.type == :module - @inner[1][1] << child if child.type == :class - end - @inner.map! {|v| [v[0], run_verifier(v[1].sort_by {|o| o.name.to_s })] } - return if (@inner[0][1].size + @inner[1][1].size) == 0 - erb(:children) -end - -def methodmissing - mms = object.meths(:inherited => true, :included => true) - return unless @mm = mms.find {|o| o.name == :method_missing && o.scope == :instance } - erb(:methodmissing) -end - -def method_listing(include_specials = true) - return @smeths ||= method_listing.reject {|o| special_method?(o) } unless include_specials - return @meths if @meths - @meths = object.meths(:inherited => false, :included => false) - @meths = sort_listing(prune_method_listing(@meths)) - @meths -end - -def special_method?(meth) - return true if meth.name(true) == '#method_missing' - return true if meth.constructor? - false -end - -def attr_listing - return @attrs if @attrs - @attrs = [] - [:class, :instance].each do |scope| - object.attributes[scope].each do |name, rw| - @attrs << (rw[:read] || rw[:write]) - end - end - @attrs = sort_listing(prune_method_listing(@attrs, false)) -end - -def constant_listing - return @constants if @constants - @constants = object.constants(:included => false, :inherited => false) - @constants += object.cvars - @constants = run_verifier(@constants) - @constants -end - -def sort_listing(list) - list.sort_by {|o| [o.scope.to_s, o.name.to_s.downcase] } -end - -def docstring_full(obj) - docstring = "" - if obj.tags(:overload).size == 1 && obj.docstring.empty? - docstring = obj.tag(:overload).docstring - else - docstring = obj.docstring - end - - if docstring.summary.empty? && obj.tags(:return).size == 1 && obj.tag(:return).text - docstring = Docstring.new(obj.tag(:return).text.gsub(/\A([a-z])/) {|x| x.upcase }.strip) - end - - docstring -end - -def docstring_summary(obj) - docstring_full(obj).summary -end - -def groups(list, type = "Method") - if groups_data = object.groups - others = list.select {|m| !m.group } - groups_data.each do |name| - items = list.select {|m| m.group == name } - yield(items, name) unless items.empty? - end - else - others = [] - group_data = {} - list.each do |meth| - if meth.group - (group_data[meth.group] ||= []) << meth - else - others << meth - end - end - group_data.each {|group, items| yield(items, group) unless items.empty? } - end - - scopes(others) {|items, scope| yield(items, "#{scope.to_s.capitalize} #{type} Summary") } -end - -def scopes(list) - [:class, :instance].each do |scope| - items = list.select {|m| m.scope == scope } - yield(items, scope) unless items.empty? - end -end - -def mixed_into(object) - unless globals.mixed_into - globals.mixed_into = {} - list = run_verifier Registry.all(:class, :module) - list.each {|o| o.mixins.each {|m| (globals.mixed_into[m.path] ||= []) << o } } - end - - globals.mixed_into[object.path] || [] -end diff --git a/yard/templates/default/tags/setup.rb b/yard/templates/default/tags/setup.rb deleted file mode 100644 index 33dc42cac..000000000 --- a/yard/templates/default/tags/setup.rb +++ /dev/null @@ -1,55 +0,0 @@ -lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../../lib')) -$LOAD_PATH.unshift(lib_dir) -$LOAD_PATH.uniq! -require 'yard-google-code' - -def init - tags = Tags::Library.visible_tags - [:abstract, :deprecated, :note, :todo] - create_tag_methods(tags - [:example, :option, :overload, :see]) - sections :index, tags - sections.any(:overload).push(T('docstring')) -end - -def return - if object.type == :method - return if object.name == :initialize && object.scope == :instance - return if object.tags(:return).size == 1 && object.tag(:return).types == ['void'] - end - tag(:return) -end - -private - -def tag(name, opts = nil) - return unless object.has_tag?(name) - opts ||= options_for_tag(name) - @no_names = true if opts[:no_names] - @no_types = true if opts[:no_types] - @name = name - out = erb('tag') - @no_names, @no_types = nil, nil - out -end - -def create_tag_methods(tags) - tags.each do |tag| - next if respond_to?(tag) - instance_eval(<<-eof, __FILE__, __LINE__ + 1) - def #{tag}; tag(#{tag.inspect}) end - eof - end -end - -def options_for_tag(tag) - opts = {:no_types => true, :no_names => true} - case Tags::Library.factory_method_for(tag) - when :with_types - opts[:no_types] = false - when :with_types_and_name - opts[:no_types] = false - opts[:no_names] = false - when :with_name - opts[:no_names] = false - end - opts -end