Version Description
- Added: Disable Google Fonts options due to GDPR
- Added: Search field for settings
- Added: Settings import/export feature
- Added: New Monthly Skin (simple)
- Added: Deactivate MEC lite when Pro is activate
- Changed: settings styles
- Improved: Styling Options
- Fixed: Global ticket variations
- Fixed: Showing end time in local time widget when end time or event time is/are hidden
- Fixed: Showing shortcodes in event excerpt
- Fixed: Not showing event title in novel style of monthly calendar
- Fixed: Ticket time in notifications
- Fixed: CSV export for custom fields
- Fixed: Notifications for full attendee info
- Fixed: Social icons when occurrence is set
- Fixed: Next event module
- Fixed: Showing booking tickets.
- Fixed: Some PHP notices.
Download this release
Release Info
Developer | webnus |
Plugin | Modern Events Calendar Lite |
Version | 3.4.5 |
Comparing to | |
See all releases |
Code changes from version 3.4.0 to 3.4.5
- app/api/Google/Auth/Abstract.php +38 -38
- app/api/Google/Auth/AppIdentity.php +120 -120
- app/api/Google/Auth/AssertionCredentials.php +136 -136
- app/api/Google/Auth/ComputeEngine.php +146 -146
- app/api/Google/Auth/Exception.php +24 -24
- app/api/Google/Auth/LoginTicket.php +71 -71
- app/api/Google/Auth/OAuth2.php +646 -646
- app/api/Google/Auth/Simple.php +63 -63
- app/api/Google/Cache/Abstract.php +53 -53
- app/api/Google/Cache/Apc.php +113 -113
- app/api/Google/Cache/Exception.php +24 -24
- app/api/Google/Cache/File.php +209 -209
- app/api/Google/Cache/Memcache.php +184 -184
- app/api/Google/Cache/Null.php +57 -57
- app/api/Google/Client.php +715 -715
- app/api/Google/Collection.php +101 -101
- app/api/Google/Config.php +456 -456
- app/api/Google/Exception.php +20 -20
- app/api/Google/Http/Batch.php +145 -145
- app/api/Google/Http/CacheParser.php +185 -185
- app/api/Google/Http/MediaFileUpload.php +341 -341
- app/api/Google/Http/REST.php +178 -178
- app/api/Google/Http/Request.php +504 -504
- app/api/Google/IO/Abstract.php +339 -339
- app/api/Google/IO/Curl.php +194 -194
- app/api/Google/IO/Exception.php +69 -69
- app/api/Google/IO/Stream.php +243 -243
- app/api/Google/IO/cacerts.pem +2183 -2183
- app/api/Google/Logger/Abstract.php +408 -408
- app/api/Google/Logger/Exception.php +24 -24
- app/api/Google/Logger/File.php +158 -158
- app/api/Google/Logger/Null.php +43 -43
- app/api/Google/Logger/Psr.php +93 -93
- app/api/Google/Model.php +295 -295
- app/api/Google/Service.php +56 -56
- app/api/Google/Service/Calendar.php +3856 -3856
- app/api/Google/Service/Exception.php +105 -105
- app/api/Google/Service/Resource.php +255 -255
- app/api/Google/Signer/Abstract.php +29 -29
- app/api/Google/Signer/P12.php +94 -94
- app/api/Google/Task/Exception.php +24 -24
- app/api/Google/Task/Retryable.php +36 -36
- app/api/Google/Task/Runner.php +257 -257
- app/api/Google/Utils.php +133 -133
- app/api/Google/Utils/URITemplate.php +333 -333
- app/api/Google/Verifier/Abstract.php +30 -30
- app/api/Google/Verifier/Pem.php +75 -75
- app/api/Google/autoload.php +36 -36
- app/api/Meetup/meetup.php +132 -132
- app/api/Stripe/Account.php +131 -131
- app/api/Stripe/AlipayAccount.php +13 -13
- app/api/Stripe/ApiRequestor.php +283 -283
- app/api/Stripe/ApiResource.php +205 -205
- app/api/Stripe/ApiResponse.php +32 -32
- app/api/Stripe/ApplePayDomain.php +0 -20
app/api/Google/Auth/Abstract.php
CHANGED
@@ -1,38 +1,38 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Abstract class for the Authentication in the API client
|
24 |
-
* @author Chris Chabot <chabotc@google.com>
|
25 |
-
*
|
26 |
-
*/
|
27 |
-
abstract class Google_Auth_Abstract
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* An utility function that first calls $this->auth->sign($request) and then
|
31 |
-
* executes makeRequest() on that signed request. Used for when a request
|
32 |
-
* should be authenticated
|
33 |
-
* @param Google_Http_Request $request
|
34 |
-
* @return Google_Http_Request $request
|
35 |
-
*/
|
36 |
-
abstract public function authenticatedRequest(Google_Http_Request $request);
|
37 |
-
abstract public function sign(Google_Http_Request $request);
|
38 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Abstract class for the Authentication in the API client
|
24 |
+
* @author Chris Chabot <chabotc@google.com>
|
25 |
+
*
|
26 |
+
*/
|
27 |
+
abstract class Google_Auth_Abstract
|
28 |
+
{
|
29 |
+
/**
|
30 |
+
* An utility function that first calls $this->auth->sign($request) and then
|
31 |
+
* executes makeRequest() on that signed request. Used for when a request
|
32 |
+
* should be authenticated
|
33 |
+
* @param Google_Http_Request $request
|
34 |
+
* @return Google_Http_Request $request
|
35 |
+
*/
|
36 |
+
abstract public function authenticatedRequest(Google_Http_Request $request);
|
37 |
+
abstract public function sign(Google_Http_Request $request);
|
38 |
+
}
|
app/api/Google/Auth/AppIdentity.php
CHANGED
@@ -1,120 +1,120 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/*
|
19 |
-
* WARNING - this class depends on the Google App Engine PHP library
|
20 |
-
* which is 5.3 and above only, so if you include this in a PHP 5.2
|
21 |
-
* setup or one without 5.3 things will blow up.
|
22 |
-
*/
|
23 |
-
use google\appengine\api\app_identity\AppIdentityService;
|
24 |
-
|
25 |
-
if (!class_exists('Google_Client')) {
|
26 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
27 |
-
}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* Authentication via the Google App Engine App Identity service.
|
31 |
-
*/
|
32 |
-
class Google_Auth_AppIdentity extends Google_Auth_Abstract
|
33 |
-
{
|
34 |
-
const CACHE_PREFIX = "Google_Auth_AppIdentity::";
|
35 |
-
private $client;
|
36 |
-
private $token = false;
|
37 |
-
private $tokenScopes = false;
|
38 |
-
|
39 |
-
public function __construct(Google_Client $client, $config = null)
|
40 |
-
{
|
41 |
-
$this->client = $client;
|
42 |
-
}
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Retrieve an access token for the scopes supplied.
|
46 |
-
*/
|
47 |
-
public function authenticateForScope($scopes)
|
48 |
-
{
|
49 |
-
if ($this->token && $this->tokenScopes == $scopes) {
|
50 |
-
return $this->token;
|
51 |
-
}
|
52 |
-
|
53 |
-
$cacheKey = self::CACHE_PREFIX;
|
54 |
-
if (is_string($scopes)) {
|
55 |
-
$cacheKey .= $scopes;
|
56 |
-
} else if (is_array($scopes)) {
|
57 |
-
$cacheKey .= implode(":", $scopes);
|
58 |
-
}
|
59 |
-
|
60 |
-
$this->token = $this->client->getCache()->get($cacheKey);
|
61 |
-
if (!$this->token) {
|
62 |
-
$this->retrieveToken($scopes, $cacheKey);
|
63 |
-
} else if ($this->token['expiration_time'] < time()) {
|
64 |
-
$this->client->getCache()->delete($cacheKey);
|
65 |
-
$this->retrieveToken($scopes, $cacheKey);
|
66 |
-
}
|
67 |
-
|
68 |
-
$this->tokenScopes = $scopes;
|
69 |
-
return $this->token;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* Retrieve a new access token and store it in cache
|
74 |
-
* @param mixed $scopes
|
75 |
-
* @param string $cacheKey
|
76 |
-
*/
|
77 |
-
private function retrieveToken($scopes, $cacheKey)
|
78 |
-
{
|
79 |
-
$this->token = AppIdentityService::getAccessToken($scopes);
|
80 |
-
if ($this->token) {
|
81 |
-
$this->client->getCache()->set(
|
82 |
-
$cacheKey,
|
83 |
-
$this->token
|
84 |
-
);
|
85 |
-
}
|
86 |
-
}
|
87 |
-
|
88 |
-
/**
|
89 |
-
* Perform an authenticated / signed apiHttpRequest.
|
90 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
91 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
92 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
93 |
-
*
|
94 |
-
* @param Google_Http_Request $request
|
95 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
96 |
-
* responseHttpCode, responseHeaders and responseBody.
|
97 |
-
*/
|
98 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
99 |
-
{
|
100 |
-
$request = $this->sign($request);
|
101 |
-
return $this->client->getIo()->makeRequest($request);
|
102 |
-
}
|
103 |
-
|
104 |
-
public function sign(Google_Http_Request $request)
|
105 |
-
{
|
106 |
-
if (!$this->token) {
|
107 |
-
// No token, so nothing to do.
|
108 |
-
return $request;
|
109 |
-
}
|
110 |
-
|
111 |
-
$this->client->getLogger()->debug('App Identity authentication');
|
112 |
-
|
113 |
-
// Add the OAuth2 header to the request
|
114 |
-
$request->setRequestHeaders(
|
115 |
-
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
116 |
-
);
|
117 |
-
|
118 |
-
return $request;
|
119 |
-
}
|
120 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/*
|
19 |
+
* WARNING - this class depends on the Google App Engine PHP library
|
20 |
+
* which is 5.3 and above only, so if you include this in a PHP 5.2
|
21 |
+
* setup or one without 5.3 things will blow up.
|
22 |
+
*/
|
23 |
+
use google\appengine\api\app_identity\AppIdentityService;
|
24 |
+
|
25 |
+
if (!class_exists('Google_Client')) {
|
26 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Authentication via the Google App Engine App Identity service.
|
31 |
+
*/
|
32 |
+
class Google_Auth_AppIdentity extends Google_Auth_Abstract
|
33 |
+
{
|
34 |
+
const CACHE_PREFIX = "Google_Auth_AppIdentity::";
|
35 |
+
private $client;
|
36 |
+
private $token = false;
|
37 |
+
private $tokenScopes = false;
|
38 |
+
|
39 |
+
public function __construct(Google_Client $client, $config = null)
|
40 |
+
{
|
41 |
+
$this->client = $client;
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Retrieve an access token for the scopes supplied.
|
46 |
+
*/
|
47 |
+
public function authenticateForScope($scopes)
|
48 |
+
{
|
49 |
+
if ($this->token && $this->tokenScopes == $scopes) {
|
50 |
+
return $this->token;
|
51 |
+
}
|
52 |
+
|
53 |
+
$cacheKey = self::CACHE_PREFIX;
|
54 |
+
if (is_string($scopes)) {
|
55 |
+
$cacheKey .= $scopes;
|
56 |
+
} else if (is_array($scopes)) {
|
57 |
+
$cacheKey .= implode(":", $scopes);
|
58 |
+
}
|
59 |
+
|
60 |
+
$this->token = $this->client->getCache()->get($cacheKey);
|
61 |
+
if (!$this->token) {
|
62 |
+
$this->retrieveToken($scopes, $cacheKey);
|
63 |
+
} else if ($this->token['expiration_time'] < time()) {
|
64 |
+
$this->client->getCache()->delete($cacheKey);
|
65 |
+
$this->retrieveToken($scopes, $cacheKey);
|
66 |
+
}
|
67 |
+
|
68 |
+
$this->tokenScopes = $scopes;
|
69 |
+
return $this->token;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Retrieve a new access token and store it in cache
|
74 |
+
* @param mixed $scopes
|
75 |
+
* @param string $cacheKey
|
76 |
+
*/
|
77 |
+
private function retrieveToken($scopes, $cacheKey)
|
78 |
+
{
|
79 |
+
$this->token = AppIdentityService::getAccessToken($scopes);
|
80 |
+
if ($this->token) {
|
81 |
+
$this->client->getCache()->set(
|
82 |
+
$cacheKey,
|
83 |
+
$this->token
|
84 |
+
);
|
85 |
+
}
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Perform an authenticated / signed apiHttpRequest.
|
90 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
91 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
92 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
93 |
+
*
|
94 |
+
* @param Google_Http_Request $request
|
95 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
96 |
+
* responseHttpCode, responseHeaders and responseBody.
|
97 |
+
*/
|
98 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
99 |
+
{
|
100 |
+
$request = $this->sign($request);
|
101 |
+
return $this->client->getIo()->makeRequest($request);
|
102 |
+
}
|
103 |
+
|
104 |
+
public function sign(Google_Http_Request $request)
|
105 |
+
{
|
106 |
+
if (!$this->token) {
|
107 |
+
// No token, so nothing to do.
|
108 |
+
return $request;
|
109 |
+
}
|
110 |
+
|
111 |
+
$this->client->getLogger()->debug('App Identity authentication');
|
112 |
+
|
113 |
+
// Add the OAuth2 header to the request
|
114 |
+
$request->setRequestHeaders(
|
115 |
+
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
116 |
+
);
|
117 |
+
|
118 |
+
return $request;
|
119 |
+
}
|
120 |
+
}
|
app/api/Google/Auth/AssertionCredentials.php
CHANGED
@@ -1,136 +1,136 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Credentials object used for OAuth 2.0 Signed JWT assertion grants.
|
24 |
-
*/
|
25 |
-
class Google_Auth_AssertionCredentials
|
26 |
-
{
|
27 |
-
const MAX_TOKEN_LIFETIME_SECS = 3600;
|
28 |
-
|
29 |
-
public $serviceAccountName;
|
30 |
-
public $scopes;
|
31 |
-
public $privateKey;
|
32 |
-
public $privateKeyPassword;
|
33 |
-
public $assertionType;
|
34 |
-
public $sub;
|
35 |
-
/**
|
36 |
-
* @deprecated
|
37 |
-
* @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
|
38 |
-
*/
|
39 |
-
public $prn;
|
40 |
-
private $useCache;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* @param $serviceAccountName
|
44 |
-
* @param $scopes array List of scopes
|
45 |
-
* @param $privateKey
|
46 |
-
* @param string $privateKeyPassword
|
47 |
-
* @param string $assertionType
|
48 |
-
* @param bool|string $sub The email address of the user for which the
|
49 |
-
* application is requesting delegated access.
|
50 |
-
* @param bool useCache Whether to generate a cache key and allow
|
51 |
-
* automatic caching of the generated token.
|
52 |
-
*/
|
53 |
-
public function __construct(
|
54 |
-
$serviceAccountName,
|
55 |
-
$scopes,
|
56 |
-
$privateKey,
|
57 |
-
$privateKeyPassword = 'notasecret',
|
58 |
-
$assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer',
|
59 |
-
$sub = false,
|
60 |
-
$useCache = true
|
61 |
-
) {
|
62 |
-
$this->serviceAccountName = $serviceAccountName;
|
63 |
-
$this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
|
64 |
-
$this->privateKey = $privateKey;
|
65 |
-
$this->privateKeyPassword = $privateKeyPassword;
|
66 |
-
$this->assertionType = $assertionType;
|
67 |
-
$this->sub = $sub;
|
68 |
-
$this->prn = $sub;
|
69 |
-
$this->useCache = $useCache;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* Generate a unique key to represent this credential.
|
74 |
-
* @return string
|
75 |
-
*/
|
76 |
-
public function getCacheKey()
|
77 |
-
{
|
78 |
-
if (!$this->useCache) {
|
79 |
-
return false;
|
80 |
-
}
|
81 |
-
$h = $this->sub;
|
82 |
-
$h .= $this->assertionType;
|
83 |
-
$h .= $this->privateKey;
|
84 |
-
$h .= $this->scopes;
|
85 |
-
$h .= $this->serviceAccountName;
|
86 |
-
return md5($h);
|
87 |
-
}
|
88 |
-
|
89 |
-
public function generateAssertion()
|
90 |
-
{
|
91 |
-
$now = time();
|
92 |
-
|
93 |
-
$jwtParams = array(
|
94 |
-
'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI,
|
95 |
-
'scope' => $this->scopes,
|
96 |
-
'iat' => $now,
|
97 |
-
'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
|
98 |
-
'iss' => $this->serviceAccountName,
|
99 |
-
);
|
100 |
-
|
101 |
-
if ($this->sub !== false) {
|
102 |
-
$jwtParams['sub'] = $this->sub;
|
103 |
-
} else if ($this->prn !== false) {
|
104 |
-
$jwtParams['prn'] = $this->prn;
|
105 |
-
}
|
106 |
-
|
107 |
-
return $this->makeSignedJwt($jwtParams);
|
108 |
-
}
|
109 |
-
|
110 |
-
/**
|
111 |
-
* Creates a signed JWT.
|
112 |
-
* @param array $payload
|
113 |
-
* @return string The signed JWT.
|
114 |
-
*/
|
115 |
-
private function makeSignedJwt($payload)
|
116 |
-
{
|
117 |
-
$header = array('typ' => 'JWT', 'alg' => 'RS256');
|
118 |
-
|
119 |
-
$payload = json_encode($payload);
|
120 |
-
// Handle some overzealous escaping in PHP json that seemed to cause some errors
|
121 |
-
// with claimsets.
|
122 |
-
$payload = str_replace('\/', '/', $payload);
|
123 |
-
|
124 |
-
$segments = array(
|
125 |
-
Google_Utils::urlSafeB64Encode(json_encode($header)),
|
126 |
-
Google_Utils::urlSafeB64Encode($payload)
|
127 |
-
);
|
128 |
-
|
129 |
-
$signingInput = implode('.', $segments);
|
130 |
-
$signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword);
|
131 |
-
$signature = $signer->sign($signingInput);
|
132 |
-
$segments[] = Google_Utils::urlSafeB64Encode($signature);
|
133 |
-
|
134 |
-
return implode(".", $segments);
|
135 |
-
}
|
136 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Credentials object used for OAuth 2.0 Signed JWT assertion grants.
|
24 |
+
*/
|
25 |
+
class Google_Auth_AssertionCredentials
|
26 |
+
{
|
27 |
+
const MAX_TOKEN_LIFETIME_SECS = 3600;
|
28 |
+
|
29 |
+
public $serviceAccountName;
|
30 |
+
public $scopes;
|
31 |
+
public $privateKey;
|
32 |
+
public $privateKeyPassword;
|
33 |
+
public $assertionType;
|
34 |
+
public $sub;
|
35 |
+
/**
|
36 |
+
* @deprecated
|
37 |
+
* @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
|
38 |
+
*/
|
39 |
+
public $prn;
|
40 |
+
private $useCache;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @param $serviceAccountName
|
44 |
+
* @param $scopes array List of scopes
|
45 |
+
* @param $privateKey
|
46 |
+
* @param string $privateKeyPassword
|
47 |
+
* @param string $assertionType
|
48 |
+
* @param bool|string $sub The email address of the user for which the
|
49 |
+
* application is requesting delegated access.
|
50 |
+
* @param bool useCache Whether to generate a cache key and allow
|
51 |
+
* automatic caching of the generated token.
|
52 |
+
*/
|
53 |
+
public function __construct(
|
54 |
+
$serviceAccountName,
|
55 |
+
$scopes,
|
56 |
+
$privateKey,
|
57 |
+
$privateKeyPassword = 'notasecret',
|
58 |
+
$assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer',
|
59 |
+
$sub = false,
|
60 |
+
$useCache = true
|
61 |
+
) {
|
62 |
+
$this->serviceAccountName = $serviceAccountName;
|
63 |
+
$this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
|
64 |
+
$this->privateKey = $privateKey;
|
65 |
+
$this->privateKeyPassword = $privateKeyPassword;
|
66 |
+
$this->assertionType = $assertionType;
|
67 |
+
$this->sub = $sub;
|
68 |
+
$this->prn = $sub;
|
69 |
+
$this->useCache = $useCache;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Generate a unique key to represent this credential.
|
74 |
+
* @return string
|
75 |
+
*/
|
76 |
+
public function getCacheKey()
|
77 |
+
{
|
78 |
+
if (!$this->useCache) {
|
79 |
+
return false;
|
80 |
+
}
|
81 |
+
$h = $this->sub;
|
82 |
+
$h .= $this->assertionType;
|
83 |
+
$h .= $this->privateKey;
|
84 |
+
$h .= $this->scopes;
|
85 |
+
$h .= $this->serviceAccountName;
|
86 |
+
return md5($h);
|
87 |
+
}
|
88 |
+
|
89 |
+
public function generateAssertion()
|
90 |
+
{
|
91 |
+
$now = time();
|
92 |
+
|
93 |
+
$jwtParams = array(
|
94 |
+
'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI,
|
95 |
+
'scope' => $this->scopes,
|
96 |
+
'iat' => $now,
|
97 |
+
'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
|
98 |
+
'iss' => $this->serviceAccountName,
|
99 |
+
);
|
100 |
+
|
101 |
+
if ($this->sub !== false) {
|
102 |
+
$jwtParams['sub'] = $this->sub;
|
103 |
+
} else if ($this->prn !== false) {
|
104 |
+
$jwtParams['prn'] = $this->prn;
|
105 |
+
}
|
106 |
+
|
107 |
+
return $this->makeSignedJwt($jwtParams);
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Creates a signed JWT.
|
112 |
+
* @param array $payload
|
113 |
+
* @return string The signed JWT.
|
114 |
+
*/
|
115 |
+
private function makeSignedJwt($payload)
|
116 |
+
{
|
117 |
+
$header = array('typ' => 'JWT', 'alg' => 'RS256');
|
118 |
+
|
119 |
+
$payload = json_encode($payload);
|
120 |
+
// Handle some overzealous escaping in PHP json that seemed to cause some errors
|
121 |
+
// with claimsets.
|
122 |
+
$payload = str_replace('\/', '/', $payload);
|
123 |
+
|
124 |
+
$segments = array(
|
125 |
+
Google_Utils::urlSafeB64Encode(json_encode($header)),
|
126 |
+
Google_Utils::urlSafeB64Encode($payload)
|
127 |
+
);
|
128 |
+
|
129 |
+
$signingInput = implode('.', $segments);
|
130 |
+
$signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword);
|
131 |
+
$signature = $signer->sign($signingInput);
|
132 |
+
$segments[] = Google_Utils::urlSafeB64Encode($signature);
|
133 |
+
|
134 |
+
return implode(".", $segments);
|
135 |
+
}
|
136 |
+
}
|
app/api/Google/Auth/ComputeEngine.php
CHANGED
@@ -1,146 +1,146 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Authentication via built-in Compute Engine service accounts.
|
24 |
-
* The instance must be pre-configured with a service account
|
25 |
-
* and the appropriate scopes.
|
26 |
-
* @author Jonathan Parrott <jon.wayne.parrott@gmail.com>
|
27 |
-
*/
|
28 |
-
class Google_Auth_ComputeEngine extends Google_Auth_Abstract
|
29 |
-
{
|
30 |
-
const METADATA_AUTH_URL =
|
31 |
-
'http://metadata/computeMetadata/v1/instance/service-accounts/default/token';
|
32 |
-
private $client;
|
33 |
-
private $token;
|
34 |
-
|
35 |
-
public function __construct(Google_Client $client, $config = null)
|
36 |
-
{
|
37 |
-
$this->client = $client;
|
38 |
-
}
|
39 |
-
|
40 |
-
/**
|
41 |
-
* Perform an authenticated / signed apiHttpRequest.
|
42 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
43 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
44 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
45 |
-
*
|
46 |
-
* @param Google_Http_Request $request
|
47 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
48 |
-
* responseHttpCode, responseHeaders and responseBody.
|
49 |
-
*/
|
50 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
51 |
-
{
|
52 |
-
$request = $this->sign($request);
|
53 |
-
return $this->client->getIo()->makeRequest($request);
|
54 |
-
}
|
55 |
-
|
56 |
-
/**
|
57 |
-
* @param string $token
|
58 |
-
* @throws Google_Auth_Exception
|
59 |
-
*/
|
60 |
-
public function setAccessToken($token)
|
61 |
-
{
|
62 |
-
$token = json_decode($token, true);
|
63 |
-
if ($token == null) {
|
64 |
-
throw new Google_Auth_Exception('Could not json decode the token');
|
65 |
-
}
|
66 |
-
if (! isset($token['access_token'])) {
|
67 |
-
throw new Google_Auth_Exception("Invalid token format");
|
68 |
-
}
|
69 |
-
$token['created'] = time();
|
70 |
-
$this->token = $token;
|
71 |
-
}
|
72 |
-
|
73 |
-
public function getAccessToken()
|
74 |
-
{
|
75 |
-
return json_encode($this->token);
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Acquires a new access token from the compute engine metadata server.
|
80 |
-
* @throws Google_Auth_Exception
|
81 |
-
*/
|
82 |
-
public function acquireAccessToken()
|
83 |
-
{
|
84 |
-
$request = new Google_Http_Request(
|
85 |
-
self::METADATA_AUTH_URL,
|
86 |
-
'GET',
|
87 |
-
array(
|
88 |
-
'Metadata-Flavor' => 'Google'
|
89 |
-
)
|
90 |
-
);
|
91 |
-
$request->disableGzip();
|
92 |
-
$response = $this->client->getIo()->makeRequest($request);
|
93 |
-
|
94 |
-
if ($response->getResponseHttpCode() == 200) {
|
95 |
-
$this->setAccessToken($response->getResponseBody());
|
96 |
-
$this->token['created'] = time();
|
97 |
-
return $this->getAccessToken();
|
98 |
-
} else {
|
99 |
-
throw new Google_Auth_Exception(
|
100 |
-
sprintf(
|
101 |
-
"Error fetching service account access token, message: '%s'",
|
102 |
-
$response->getResponseBody()
|
103 |
-
),
|
104 |
-
$response->getResponseHttpCode()
|
105 |
-
);
|
106 |
-
}
|
107 |
-
}
|
108 |
-
|
109 |
-
/**
|
110 |
-
* Include an accessToken in a given apiHttpRequest.
|
111 |
-
* @param Google_Http_Request $request
|
112 |
-
* @return Google_Http_Request
|
113 |
-
* @throws Google_Auth_Exception
|
114 |
-
*/
|
115 |
-
public function sign(Google_Http_Request $request)
|
116 |
-
{
|
117 |
-
if ($this->isAccessTokenExpired()) {
|
118 |
-
$this->acquireAccessToken();
|
119 |
-
}
|
120 |
-
|
121 |
-
$this->client->getLogger()->debug('Compute engine service account authentication');
|
122 |
-
|
123 |
-
$request->setRequestHeaders(
|
124 |
-
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
125 |
-
);
|
126 |
-
|
127 |
-
return $request;
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Returns if the access_token is expired.
|
132 |
-
* @return bool Returns True if the access_token is expired.
|
133 |
-
*/
|
134 |
-
public function isAccessTokenExpired()
|
135 |
-
{
|
136 |
-
if (!$this->token || !isset($this->token['created'])) {
|
137 |
-
return true;
|
138 |
-
}
|
139 |
-
|
140 |
-
// If the token is set to expire in the next 30 seconds.
|
141 |
-
$expired = ($this->token['created']
|
142 |
-
+ ($this->token['expires_in'] - 30)) < time();
|
143 |
-
|
144 |
-
return $expired;
|
145 |
-
}
|
146 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Authentication via built-in Compute Engine service accounts.
|
24 |
+
* The instance must be pre-configured with a service account
|
25 |
+
* and the appropriate scopes.
|
26 |
+
* @author Jonathan Parrott <jon.wayne.parrott@gmail.com>
|
27 |
+
*/
|
28 |
+
class Google_Auth_ComputeEngine extends Google_Auth_Abstract
|
29 |
+
{
|
30 |
+
const METADATA_AUTH_URL =
|
31 |
+
'http://metadata/computeMetadata/v1/instance/service-accounts/default/token';
|
32 |
+
private $client;
|
33 |
+
private $token;
|
34 |
+
|
35 |
+
public function __construct(Google_Client $client, $config = null)
|
36 |
+
{
|
37 |
+
$this->client = $client;
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Perform an authenticated / signed apiHttpRequest.
|
42 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
43 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
44 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
45 |
+
*
|
46 |
+
* @param Google_Http_Request $request
|
47 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
48 |
+
* responseHttpCode, responseHeaders and responseBody.
|
49 |
+
*/
|
50 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
51 |
+
{
|
52 |
+
$request = $this->sign($request);
|
53 |
+
return $this->client->getIo()->makeRequest($request);
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* @param string $token
|
58 |
+
* @throws Google_Auth_Exception
|
59 |
+
*/
|
60 |
+
public function setAccessToken($token)
|
61 |
+
{
|
62 |
+
$token = json_decode($token, true);
|
63 |
+
if ($token == null) {
|
64 |
+
throw new Google_Auth_Exception('Could not json decode the token');
|
65 |
+
}
|
66 |
+
if (! isset($token['access_token'])) {
|
67 |
+
throw new Google_Auth_Exception("Invalid token format");
|
68 |
+
}
|
69 |
+
$token['created'] = time();
|
70 |
+
$this->token = $token;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function getAccessToken()
|
74 |
+
{
|
75 |
+
return json_encode($this->token);
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Acquires a new access token from the compute engine metadata server.
|
80 |
+
* @throws Google_Auth_Exception
|
81 |
+
*/
|
82 |
+
public function acquireAccessToken()
|
83 |
+
{
|
84 |
+
$request = new Google_Http_Request(
|
85 |
+
self::METADATA_AUTH_URL,
|
86 |
+
'GET',
|
87 |
+
array(
|
88 |
+
'Metadata-Flavor' => 'Google'
|
89 |
+
)
|
90 |
+
);
|
91 |
+
$request->disableGzip();
|
92 |
+
$response = $this->client->getIo()->makeRequest($request);
|
93 |
+
|
94 |
+
if ($response->getResponseHttpCode() == 200) {
|
95 |
+
$this->setAccessToken($response->getResponseBody());
|
96 |
+
$this->token['created'] = time();
|
97 |
+
return $this->getAccessToken();
|
98 |
+
} else {
|
99 |
+
throw new Google_Auth_Exception(
|
100 |
+
sprintf(
|
101 |
+
"Error fetching service account access token, message: '%s'",
|
102 |
+
$response->getResponseBody()
|
103 |
+
),
|
104 |
+
$response->getResponseHttpCode()
|
105 |
+
);
|
106 |
+
}
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Include an accessToken in a given apiHttpRequest.
|
111 |
+
* @param Google_Http_Request $request
|
112 |
+
* @return Google_Http_Request
|
113 |
+
* @throws Google_Auth_Exception
|
114 |
+
*/
|
115 |
+
public function sign(Google_Http_Request $request)
|
116 |
+
{
|
117 |
+
if ($this->isAccessTokenExpired()) {
|
118 |
+
$this->acquireAccessToken();
|
119 |
+
}
|
120 |
+
|
121 |
+
$this->client->getLogger()->debug('Compute engine service account authentication');
|
122 |
+
|
123 |
+
$request->setRequestHeaders(
|
124 |
+
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
125 |
+
);
|
126 |
+
|
127 |
+
return $request;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Returns if the access_token is expired.
|
132 |
+
* @return bool Returns True if the access_token is expired.
|
133 |
+
*/
|
134 |
+
public function isAccessTokenExpired()
|
135 |
+
{
|
136 |
+
if (!$this->token || !isset($this->token['created'])) {
|
137 |
+
return true;
|
138 |
+
}
|
139 |
+
|
140 |
+
// If the token is set to expire in the next 30 seconds.
|
141 |
+
$expired = ($this->token['created']
|
142 |
+
+ ($this->token['expires_in'] - 30)) < time();
|
143 |
+
|
144 |
+
return $expired;
|
145 |
+
}
|
146 |
+
}
|
app/api/Google/Auth/Exception.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_Auth_Exception extends Google_Exception
|
23 |
-
{
|
24 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_Auth_Exception extends Google_Exception
|
23 |
+
{
|
24 |
+
}
|
app/api/Google/Auth/LoginTicket.php
CHANGED
@@ -1,71 +1,71 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Class to hold information about an authenticated login.
|
24 |
-
*
|
25 |
-
* @author Brian Eaton <beaton@google.com>
|
26 |
-
*/
|
27 |
-
class Google_Auth_LoginTicket
|
28 |
-
{
|
29 |
-
const USER_ATTR = "sub";
|
30 |
-
|
31 |
-
// Information from id token envelope.
|
32 |
-
private $envelope;
|
33 |
-
|
34 |
-
// Information from id token payload.
|
35 |
-
private $payload;
|
36 |
-
|
37 |
-
/**
|
38 |
-
* Creates a user based on the supplied token.
|
39 |
-
*
|
40 |
-
* @param string $envelope Header from a verified authentication token.
|
41 |
-
* @param string $payload Information from a verified authentication token.
|
42 |
-
*/
|
43 |
-
public function __construct($envelope, $payload)
|
44 |
-
{
|
45 |
-
$this->envelope = $envelope;
|
46 |
-
$this->payload = $payload;
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Returns the numeric identifier for the user.
|
51 |
-
* @throws Google_Auth_Exception
|
52 |
-
* @return
|
53 |
-
*/
|
54 |
-
public function getUserId()
|
55 |
-
{
|
56 |
-
if (array_key_exists(self::USER_ATTR, $this->payload)) {
|
57 |
-
return $this->payload[self::USER_ATTR];
|
58 |
-
}
|
59 |
-
throw new Google_Auth_Exception("No user_id in token");
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Returns attributes from the login ticket. This can contain
|
64 |
-
* various information about the user session.
|
65 |
-
* @return array
|
66 |
-
*/
|
67 |
-
public function getAttributes()
|
68 |
-
{
|
69 |
-
return array("envelope" => $this->envelope, "payload" => $this->payload);
|
70 |
-
}
|
71 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Class to hold information about an authenticated login.
|
24 |
+
*
|
25 |
+
* @author Brian Eaton <beaton@google.com>
|
26 |
+
*/
|
27 |
+
class Google_Auth_LoginTicket
|
28 |
+
{
|
29 |
+
const USER_ATTR = "sub";
|
30 |
+
|
31 |
+
// Information from id token envelope.
|
32 |
+
private $envelope;
|
33 |
+
|
34 |
+
// Information from id token payload.
|
35 |
+
private $payload;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Creates a user based on the supplied token.
|
39 |
+
*
|
40 |
+
* @param string $envelope Header from a verified authentication token.
|
41 |
+
* @param string $payload Information from a verified authentication token.
|
42 |
+
*/
|
43 |
+
public function __construct($envelope, $payload)
|
44 |
+
{
|
45 |
+
$this->envelope = $envelope;
|
46 |
+
$this->payload = $payload;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Returns the numeric identifier for the user.
|
51 |
+
* @throws Google_Auth_Exception
|
52 |
+
* @return
|
53 |
+
*/
|
54 |
+
public function getUserId()
|
55 |
+
{
|
56 |
+
if (array_key_exists(self::USER_ATTR, $this->payload)) {
|
57 |
+
return $this->payload[self::USER_ATTR];
|
58 |
+
}
|
59 |
+
throw new Google_Auth_Exception("No user_id in token");
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Returns attributes from the login ticket. This can contain
|
64 |
+
* various information about the user session.
|
65 |
+
* @return array
|
66 |
+
*/
|
67 |
+
public function getAttributes()
|
68 |
+
{
|
69 |
+
return array("envelope" => $this->envelope, "payload" => $this->payload);
|
70 |
+
}
|
71 |
+
}
|
app/api/Google/Auth/OAuth2.php
CHANGED
@@ -1,646 +1,646 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Authentication class that deals with the OAuth 2 web-server authentication flow
|
24 |
-
*
|
25 |
-
*/
|
26 |
-
class Google_Auth_OAuth2 extends Google_Auth_Abstract
|
27 |
-
{
|
28 |
-
const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
|
29 |
-
const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
|
30 |
-
const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
31 |
-
const CLOCK_SKEW_SECS = 300; // five minutes in seconds
|
32 |
-
const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds
|
33 |
-
const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds
|
34 |
-
const OAUTH2_ISSUER = 'accounts.google.com';
|
35 |
-
const OAUTH2_ISSUER_HTTPS = 'https://accounts.google.com';
|
36 |
-
|
37 |
-
/** @var Google_Auth_AssertionCredentials $assertionCredentials */
|
38 |
-
private $assertionCredentials;
|
39 |
-
|
40 |
-
/**
|
41 |
-
* @var string The state parameters for CSRF and other forgery protection.
|
42 |
-
*/
|
43 |
-
private $state;
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @var array The token bundle.
|
47 |
-
*/
|
48 |
-
private $token = array();
|
49 |
-
|
50 |
-
/**
|
51 |
-
* @var Google_Client the base client
|
52 |
-
*/
|
53 |
-
private $client;
|
54 |
-
|
55 |
-
/**
|
56 |
-
* Instantiates the class, but does not initiate the login flow, leaving it
|
57 |
-
* to the discretion of the caller.
|
58 |
-
*/
|
59 |
-
public function __construct(Google_Client $client)
|
60 |
-
{
|
61 |
-
$this->client = $client;
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* Perform an authenticated / signed apiHttpRequest.
|
66 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
67 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
68 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
69 |
-
*
|
70 |
-
* @param Google_Http_Request $request
|
71 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
72 |
-
* responseHttpCode, responseHeaders and responseBody.
|
73 |
-
*/
|
74 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
75 |
-
{
|
76 |
-
$request = $this->sign($request);
|
77 |
-
return $this->client->getIo()->makeRequest($request);
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* @param string $code
|
82 |
-
* @param boolean $crossClient
|
83 |
-
* @throws Google_Auth_Exception
|
84 |
-
* @return string
|
85 |
-
*/
|
86 |
-
public function authenticate($code, $crossClient = false)
|
87 |
-
{
|
88 |
-
if (strlen($code) == 0) {
|
89 |
-
throw new Google_Auth_Exception("Invalid code");
|
90 |
-
}
|
91 |
-
|
92 |
-
$arguments = array(
|
93 |
-
'code' => $code,
|
94 |
-
'grant_type' => 'authorization_code',
|
95 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
96 |
-
'client_secret' => $this->client->getClassConfig($this, 'client_secret')
|
97 |
-
);
|
98 |
-
|
99 |
-
if ($crossClient !== true) {
|
100 |
-
$arguments['redirect_uri'] = $this->client->getClassConfig($this, 'redirect_uri');
|
101 |
-
}
|
102 |
-
|
103 |
-
// We got here from the redirect from a successful authorization grant,
|
104 |
-
// fetch the access token
|
105 |
-
$request = new Google_Http_Request(
|
106 |
-
self::OAUTH2_TOKEN_URI,
|
107 |
-
'POST',
|
108 |
-
array(),
|
109 |
-
$arguments
|
110 |
-
);
|
111 |
-
$request->disableGzip();
|
112 |
-
$response = $this->client->getIo()->makeRequest($request);
|
113 |
-
|
114 |
-
if ($response->getResponseHttpCode() == 200) {
|
115 |
-
$this->setAccessToken($response->getResponseBody());
|
116 |
-
$this->token['created'] = time();
|
117 |
-
return $this->getAccessToken();
|
118 |
-
} else {
|
119 |
-
$decodedResponse = json_decode($response->getResponseBody(), true);
|
120 |
-
if ($decodedResponse != null && $decodedResponse['error']) {
|
121 |
-
$errorText = $decodedResponse['error'];
|
122 |
-
if (isset($decodedResponse['error_description'])) {
|
123 |
-
$errorText .= ": " . $decodedResponse['error_description'];
|
124 |
-
}
|
125 |
-
}
|
126 |
-
throw new Google_Auth_Exception(
|
127 |
-
sprintf(
|
128 |
-
"Error fetching OAuth2 access token, message: '%s'",
|
129 |
-
$errorText
|
130 |
-
),
|
131 |
-
$response->getResponseHttpCode()
|
132 |
-
);
|
133 |
-
}
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Create a URL to obtain user authorization.
|
138 |
-
* The authorization endpoint allows the user to first
|
139 |
-
* authenticate, and then grant/deny the access request.
|
140 |
-
* @param string $scope The scope is expressed as a list of space-delimited strings.
|
141 |
-
* @return string
|
142 |
-
*/
|
143 |
-
public function createAuthUrl($scope)
|
144 |
-
{
|
145 |
-
$params = array(
|
146 |
-
'response_type' => 'code',
|
147 |
-
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
148 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
149 |
-
'scope' => $scope,
|
150 |
-
'access_type' => $this->client->getClassConfig($this, 'access_type'),
|
151 |
-
);
|
152 |
-
|
153 |
-
// Prefer prompt to approval prompt.
|
154 |
-
if ($this->client->getClassConfig($this, 'prompt')) {
|
155 |
-
$params = $this->maybeAddParam($params, 'prompt');
|
156 |
-
} else {
|
157 |
-
$params = $this->maybeAddParam($params, 'approval_prompt');
|
158 |
-
}
|
159 |
-
$params = $this->maybeAddParam($params, 'login_hint');
|
160 |
-
$params = $this->maybeAddParam($params, 'hd');
|
161 |
-
$params = $this->maybeAddParam($params, 'openid.realm');
|
162 |
-
$params = $this->maybeAddParam($params, 'include_granted_scopes');
|
163 |
-
|
164 |
-
// If the list of scopes contains plus.login, add request_visible_actions
|
165 |
-
// to auth URL.
|
166 |
-
$rva = $this->client->getClassConfig($this, 'request_visible_actions');
|
167 |
-
if (strpos($scope, 'plus.login') && strlen($rva) > 0) {
|
168 |
-
$params['request_visible_actions'] = $rva;
|
169 |
-
}
|
170 |
-
|
171 |
-
if (isset($this->state)) {
|
172 |
-
$params['state'] = $this->state;
|
173 |
-
}
|
174 |
-
|
175 |
-
return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&');
|
176 |
-
}
|
177 |
-
|
178 |
-
/**
|
179 |
-
* @param string $token
|
180 |
-
* @throws Google_Auth_Exception
|
181 |
-
*/
|
182 |
-
public function setAccessToken($token)
|
183 |
-
{
|
184 |
-
$token = json_decode($token, true);
|
185 |
-
if ($token == null) {
|
186 |
-
throw new Google_Auth_Exception('Could not json decode the token');
|
187 |
-
}
|
188 |
-
if (! isset($token['access_token'])) {
|
189 |
-
throw new Google_Auth_Exception("Invalid token format");
|
190 |
-
}
|
191 |
-
$this->token = $token;
|
192 |
-
}
|
193 |
-
|
194 |
-
public function getAccessToken()
|
195 |
-
{
|
196 |
-
return json_encode($this->token);
|
197 |
-
}
|
198 |
-
|
199 |
-
public function getRefreshToken()
|
200 |
-
{
|
201 |
-
if (array_key_exists('refresh_token', $this->token)) {
|
202 |
-
return $this->token['refresh_token'];
|
203 |
-
} else {
|
204 |
-
return null;
|
205 |
-
}
|
206 |
-
}
|
207 |
-
|
208 |
-
public function setState($state)
|
209 |
-
{
|
210 |
-
$this->state = $state;
|
211 |
-
}
|
212 |
-
|
213 |
-
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
214 |
-
{
|
215 |
-
$this->assertionCredentials = $creds;
|
216 |
-
}
|
217 |
-
|
218 |
-
/**
|
219 |
-
* Include an accessToken in a given apiHttpRequest.
|
220 |
-
* @param Google_Http_Request $request
|
221 |
-
* @return Google_Http_Request
|
222 |
-
* @throws Google_Auth_Exception
|
223 |
-
*/
|
224 |
-
public function sign(Google_Http_Request $request)
|
225 |
-
{
|
226 |
-
// add the developer key to the request before signing it
|
227 |
-
if ($this->client->getClassConfig($this, 'developer_key')) {
|
228 |
-
$request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key'));
|
229 |
-
}
|
230 |
-
|
231 |
-
// Cannot sign the request without an OAuth access token.
|
232 |
-
if (null == $this->token && null == $this->assertionCredentials) {
|
233 |
-
return $request;
|
234 |
-
}
|
235 |
-
|
236 |
-
// Check if the token is set to expire in the next 30 seconds
|
237 |
-
// (or has already expired).
|
238 |
-
if ($this->isAccessTokenExpired()) {
|
239 |
-
if ($this->assertionCredentials) {
|
240 |
-
$this->refreshTokenWithAssertion();
|
241 |
-
} else {
|
242 |
-
$this->client->getLogger()->debug('OAuth2 access token expired');
|
243 |
-
if (! array_key_exists('refresh_token', $this->token)) {
|
244 |
-
$error = "The OAuth 2.0 access token has expired,"
|
245 |
-
." and a refresh token is not available. Refresh tokens"
|
246 |
-
." are not returned for responses that were auto-approved.";
|
247 |
-
|
248 |
-
$this->client->getLogger()->error($error);
|
249 |
-
throw new Google_Auth_Exception($error);
|
250 |
-
}
|
251 |
-
$this->refreshToken($this->token['refresh_token']);
|
252 |
-
}
|
253 |
-
}
|
254 |
-
|
255 |
-
$this->client->getLogger()->debug('OAuth2 authentication');
|
256 |
-
|
257 |
-
// Add the OAuth2 header to the request
|
258 |
-
$request->setRequestHeaders(
|
259 |
-
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
260 |
-
);
|
261 |
-
|
262 |
-
return $request;
|
263 |
-
}
|
264 |
-
|
265 |
-
/**
|
266 |
-
* Fetches a fresh access token with the given refresh token.
|
267 |
-
* @param string $refreshToken
|
268 |
-
* @return void
|
269 |
-
*/
|
270 |
-
public function refreshToken($refreshToken)
|
271 |
-
{
|
272 |
-
$this->refreshTokenRequest(
|
273 |
-
array(
|
274 |
-
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
275 |
-
'client_secret' => $this->client->getClassConfig($this, 'client_secret'),
|
276 |
-
'refresh_token' => $refreshToken,
|
277 |
-
'grant_type' => 'refresh_token'
|
278 |
-
)
|
279 |
-
);
|
280 |
-
}
|
281 |
-
|
282 |
-
/**
|
283 |
-
* Fetches a fresh access token with a given assertion token.
|
284 |
-
* @param Google_Auth_AssertionCredentials $assertionCredentials optional.
|
285 |
-
* @return void
|
286 |
-
*/
|
287 |
-
public function refreshTokenWithAssertion($assertionCredentials = null)
|
288 |
-
{
|
289 |
-
if (!$assertionCredentials) {
|
290 |
-
$assertionCredentials = $this->assertionCredentials;
|
291 |
-
}
|
292 |
-
|
293 |
-
$cacheKey = $assertionCredentials->getCacheKey();
|
294 |
-
|
295 |
-
if ($cacheKey) {
|
296 |
-
// We can check whether we have a token available in the
|
297 |
-
// cache. If it is expired, we can retrieve a new one from
|
298 |
-
// the assertion.
|
299 |
-
$token = $this->client->getCache()->get($cacheKey);
|
300 |
-
if ($token) {
|
301 |
-
$this->setAccessToken($token);
|
302 |
-
}
|
303 |
-
if (!$this->isAccessTokenExpired()) {
|
304 |
-
return;
|
305 |
-
}
|
306 |
-
}
|
307 |
-
|
308 |
-
$this->client->getLogger()->debug('OAuth2 access token expired');
|
309 |
-
$this->refreshTokenRequest(
|
310 |
-
array(
|
311 |
-
'grant_type' => 'assertion',
|
312 |
-
'assertion_type' => $assertionCredentials->assertionType,
|
313 |
-
'assertion' => $assertionCredentials->generateAssertion(),
|
314 |
-
)
|
315 |
-
);
|
316 |
-
|
317 |
-
if ($cacheKey) {
|
318 |
-
// Attempt to cache the token.
|
319 |
-
$this->client->getCache()->set(
|
320 |
-
$cacheKey,
|
321 |
-
$this->getAccessToken()
|
322 |
-
);
|
323 |
-
}
|
324 |
-
}
|
325 |
-
|
326 |
-
private function refreshTokenRequest($params)
|
327 |
-
{
|
328 |
-
if (isset($params['assertion'])) {
|
329 |
-
$this->client->getLogger()->info(
|
330 |
-
'OAuth2 access token refresh with Signed JWT assertion grants.'
|
331 |
-
);
|
332 |
-
} else {
|
333 |
-
$this->client->getLogger()->info('OAuth2 access token refresh');
|
334 |
-
}
|
335 |
-
|
336 |
-
$http = new Google_Http_Request(
|
337 |
-
self::OAUTH2_TOKEN_URI,
|
338 |
-
'POST',
|
339 |
-
array(),
|
340 |
-
$params
|
341 |
-
);
|
342 |
-
$http->disableGzip();
|
343 |
-
$request = $this->client->getIo()->makeRequest($http);
|
344 |
-
|
345 |
-
$code = $request->getResponseHttpCode();
|
346 |
-
$body = $request->getResponseBody();
|
347 |
-
if (200 == $code) {
|
348 |
-
$token = json_decode($body, true);
|
349 |
-
if ($token == null) {
|
350 |
-
throw new Google_Auth_Exception("Could not json decode the access token");
|
351 |
-
}
|
352 |
-
|
353 |
-
if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
|
354 |
-
throw new Google_Auth_Exception("Invalid token format");
|
355 |
-
}
|
356 |
-
|
357 |
-
if (isset($token['id_token'])) {
|
358 |
-
$this->token['id_token'] = $token['id_token'];
|
359 |
-
}
|
360 |
-
$this->token['access_token'] = $token['access_token'];
|
361 |
-
$this->token['expires_in'] = $token['expires_in'];
|
362 |
-
$this->token['created'] = time();
|
363 |
-
} else {
|
364 |
-
throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
|
365 |
-
}
|
366 |
-
}
|
367 |
-
|
368 |
-
/**
|
369 |
-
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
370 |
-
* token, if a token isn't provided.
|
371 |
-
* @throws Google_Auth_Exception
|
372 |
-
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
373 |
-
* @return boolean Returns True if the revocation was successful, otherwise False.
|
374 |
-
*/
|
375 |
-
public function revokeToken($token = null)
|
376 |
-
{
|
377 |
-
if (!$token) {
|
378 |
-
if (!$this->token) {
|
379 |
-
// Not initialized, no token to actually revoke
|
380 |
-
return false;
|
381 |
-
} elseif (array_key_exists('refresh_token', $this->token)) {
|
382 |
-
$token = $this->token['refresh_token'];
|
383 |
-
} else {
|
384 |
-
$token = $this->token['access_token'];
|
385 |
-
}
|
386 |
-
}
|
387 |
-
$request = new Google_Http_Request(
|
388 |
-
self::OAUTH2_REVOKE_URI,
|
389 |
-
'POST',
|
390 |
-
array(),
|
391 |
-
"token=$token"
|
392 |
-
);
|
393 |
-
$request->disableGzip();
|
394 |
-
$response = $this->client->getIo()->makeRequest($request);
|
395 |
-
$code = $response->getResponseHttpCode();
|
396 |
-
if ($code == 200) {
|
397 |
-
$this->token = null;
|
398 |
-
return true;
|
399 |
-
}
|
400 |
-
|
401 |
-
return false;
|
402 |
-
}
|
403 |
-
|
404 |
-
/**
|
405 |
-
* Returns if the access_token is expired.
|
406 |
-
* @return bool Returns True if the access_token is expired.
|
407 |
-
*/
|
408 |
-
public function isAccessTokenExpired()
|
409 |
-
{
|
410 |
-
if (!$this->token || !isset($this->token['created'])) {
|
411 |
-
return true;
|
412 |
-
}
|
413 |
-
|
414 |
-
// If the token is set to expire in the next 30 seconds.
|
415 |
-
$expired = ($this->token['created']
|
416 |
-
+ ($this->token['expires_in'] - 30)) < time();
|
417 |
-
|
418 |
-
return $expired;
|
419 |
-
}
|
420 |
-
|
421 |
-
// Gets federated sign-on certificates to use for verifying identity tokens.
|
422 |
-
// Returns certs as array structure, where keys are key ids, and values
|
423 |
-
// are PEM encoded certificates.
|
424 |
-
private function getFederatedSignOnCerts()
|
425 |
-
{
|
426 |
-
return $this->retrieveCertsFromLocation(
|
427 |
-
$this->client->getClassConfig($this, 'federated_signon_certs_url')
|
428 |
-
);
|
429 |
-
}
|
430 |
-
|
431 |
-
/**
|
432 |
-
* Retrieve and cache a certificates file.
|
433 |
-
*
|
434 |
-
* @param $url string location
|
435 |
-
* @throws Google_Auth_Exception
|
436 |
-
* @return array certificates
|
437 |
-
*/
|
438 |
-
public function retrieveCertsFromLocation($url)
|
439 |
-
{
|
440 |
-
// If we're retrieving a local file, just grab it.
|
441 |
-
if ("http" != substr($url, 0, 4)) {
|
442 |
-
$file = file_get_contents($url);
|
443 |
-
if ($file) {
|
444 |
-
return json_decode($file, true);
|
445 |
-
} else {
|
446 |
-
throw new Google_Auth_Exception(
|
447 |
-
"Failed to retrieve verification certificates: '" .
|
448 |
-
$url . "'."
|
449 |
-
);
|
450 |
-
}
|
451 |
-
}
|
452 |
-
|
453 |
-
// This relies on makeRequest caching certificate responses.
|
454 |
-
$request = $this->client->getIo()->makeRequest(
|
455 |
-
new Google_Http_Request(
|
456 |
-
$url
|
457 |
-
)
|
458 |
-
);
|
459 |
-
if ($request->getResponseHttpCode() == 200) {
|
460 |
-
$certs = json_decode($request->getResponseBody(), true);
|
461 |
-
if ($certs) {
|
462 |
-
return $certs;
|
463 |
-
}
|
464 |
-
}
|
465 |
-
throw new Google_Auth_Exception(
|
466 |
-
"Failed to retrieve verification certificates: '" .
|
467 |
-
$request->getResponseBody() . "'.",
|
468 |
-
$request->getResponseHttpCode()
|
469 |
-
);
|
470 |
-
}
|
471 |
-
|
472 |
-
/**
|
473 |
-
* Verifies an id token and returns the authenticated apiLoginTicket.
|
474 |
-
* Throws an exception if the id token is not valid.
|
475 |
-
* The audience parameter can be used to control which id tokens are
|
476 |
-
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
477 |
-
*
|
478 |
-
* @param $id_token
|
479 |
-
* @param $audience
|
480 |
-
* @return Google_Auth_LoginTicket
|
481 |
-
*/
|
482 |
-
public function verifyIdToken($id_token = null, $audience = null)
|
483 |
-
{
|
484 |
-
if (!$id_token) {
|
485 |
-
$id_token = $this->token['id_token'];
|
486 |
-
}
|
487 |
-
$certs = $this->getFederatedSignonCerts();
|
488 |
-
if (!$audience) {
|
489 |
-
$audience = $this->client->getClassConfig($this, 'client_id');
|
490 |
-
}
|
491 |
-
|
492 |
-
return $this->verifySignedJwtWithCerts(
|
493 |
-
$id_token,
|
494 |
-
$certs,
|
495 |
-
$audience,
|
496 |
-
array(self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS)
|
497 |
-
);
|
498 |
-
}
|
499 |
-
|
500 |
-
/**
|
501 |
-
* Verifies the id token, returns the verified token contents.
|
502 |
-
*
|
503 |
-
* @param $jwt string the token
|
504 |
-
* @param $certs array of certificates
|
505 |
-
* @param $required_audience string the expected consumer of the token
|
506 |
-
* @param [$issuer] the expected issues, defaults to Google
|
507 |
-
* @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
508 |
-
* @throws Google_Auth_Exception
|
509 |
-
* @return mixed token information if valid, false if not
|
510 |
-
*/
|
511 |
-
public function verifySignedJwtWithCerts(
|
512 |
-
$jwt,
|
513 |
-
$certs,
|
514 |
-
$required_audience,
|
515 |
-
$issuer = null,
|
516 |
-
$max_expiry = null
|
517 |
-
) {
|
518 |
-
if (!$max_expiry) {
|
519 |
-
// Set the maximum time we will accept a token for.
|
520 |
-
$max_expiry = self::MAX_TOKEN_LIFETIME_SECS;
|
521 |
-
}
|
522 |
-
|
523 |
-
$segments = explode(".", $jwt);
|
524 |
-
if (count($segments) != 3) {
|
525 |
-
throw new Google_Auth_Exception("Wrong number of segments in token: $jwt");
|
526 |
-
}
|
527 |
-
$signed = $segments[0] . "." . $segments[1];
|
528 |
-
$signature = Google_Utils::urlSafeB64Decode($segments[2]);
|
529 |
-
|
530 |
-
// Parse envelope.
|
531 |
-
$envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true);
|
532 |
-
if (!$envelope) {
|
533 |
-
throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]);
|
534 |
-
}
|
535 |
-
|
536 |
-
// Parse token
|
537 |
-
$json_body = Google_Utils::urlSafeB64Decode($segments[1]);
|
538 |
-
$payload = json_decode($json_body, true);
|
539 |
-
if (!$payload) {
|
540 |
-
throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]);
|
541 |
-
}
|
542 |
-
|
543 |
-
// Check signature
|
544 |
-
$verified = false;
|
545 |
-
foreach ($certs as $keyName => $pem) {
|
546 |
-
$public_key = new Google_Verifier_Pem($pem);
|
547 |
-
if ($public_key->verify($signed, $signature)) {
|
548 |
-
$verified = true;
|
549 |
-
break;
|
550 |
-
}
|
551 |
-
}
|
552 |
-
|
553 |
-
if (!$verified) {
|
554 |
-
throw new Google_Auth_Exception("Invalid token signature: $jwt");
|
555 |
-
}
|
556 |
-
|
557 |
-
// Check issued-at timestamp
|
558 |
-
$iat = 0;
|
559 |
-
if (array_key_exists("iat", $payload)) {
|
560 |
-
$iat = $payload["iat"];
|
561 |
-
}
|
562 |
-
if (!$iat) {
|
563 |
-
throw new Google_Auth_Exception("No issue time in token: $json_body");
|
564 |
-
}
|
565 |
-
$earliest = $iat - self::CLOCK_SKEW_SECS;
|
566 |
-
|
567 |
-
// Check expiration timestamp
|
568 |
-
$now = time();
|
569 |
-
$exp = 0;
|
570 |
-
if (array_key_exists("exp", $payload)) {
|
571 |
-
$exp = $payload["exp"];
|
572 |
-
}
|
573 |
-
if (!$exp) {
|
574 |
-
throw new Google_Auth_Exception("No expiration time in token: $json_body");
|
575 |
-
}
|
576 |
-
if ($exp >= $now + $max_expiry) {
|
577 |
-
throw new Google_Auth_Exception(
|
578 |
-
sprintf("Expiration time too far in future: %s", $json_body)
|
579 |
-
);
|
580 |
-
}
|
581 |
-
|
582 |
-
$latest = $exp + self::CLOCK_SKEW_SECS;
|
583 |
-
if ($now < $earliest) {
|
584 |
-
throw new Google_Auth_Exception(
|
585 |
-
sprintf(
|
586 |
-
"Token used too early, %s < %s: %s",
|
587 |
-
$now,
|
588 |
-
$earliest,
|
589 |
-
$json_body
|
590 |
-
)
|
591 |
-
);
|
592 |
-
}
|
593 |
-
if ($now > $latest) {
|
594 |
-
throw new Google_Auth_Exception(
|
595 |
-
sprintf(
|
596 |
-
"Token used too late, %s > %s: %s",
|
597 |
-
$now,
|
598 |
-
$latest,
|
599 |
-
$json_body
|
600 |
-
)
|
601 |
-
);
|
602 |
-
}
|
603 |
-
|
604 |
-
// support HTTP and HTTPS issuers
|
605 |
-
// @see https://developers.google.com/identity/sign-in/web/backend-auth
|
606 |
-
$iss = $payload['iss'];
|
607 |
-
if ($issuer && !in_array($iss, (array) $issuer)) {
|
608 |
-
throw new Google_Auth_Exception(
|
609 |
-
sprintf(
|
610 |
-
"Invalid issuer, %s not in %s: %s",
|
611 |
-
$iss,
|
612 |
-
"[".implode(",", (array) $issuer)."]",
|
613 |
-
$json_body
|
614 |
-
)
|
615 |
-
);
|
616 |
-
}
|
617 |
-
|
618 |
-
// Check audience
|
619 |
-
$aud = $payload["aud"];
|
620 |
-
if ($aud != $required_audience) {
|
621 |
-
throw new Google_Auth_Exception(
|
622 |
-
sprintf(
|
623 |
-
"Wrong recipient, %s != %s:",
|
624 |
-
$aud,
|
625 |
-
$required_audience,
|
626 |
-
$json_body
|
627 |
-
)
|
628 |
-
);
|
629 |
-
}
|
630 |
-
|
631 |
-
// All good.
|
632 |
-
return new Google_Auth_LoginTicket($envelope, $payload);
|
633 |
-
}
|
634 |
-
|
635 |
-
/**
|
636 |
-
* Add a parameter to the auth params if not empty string.
|
637 |
-
*/
|
638 |
-
private function maybeAddParam($params, $name)
|
639 |
-
{
|
640 |
-
$param = $this->client->getClassConfig($this, $name);
|
641 |
-
if ($param != '') {
|
642 |
-
$params[$name] = $param;
|
643 |
-
}
|
644 |
-
return $params;
|
645 |
-
}
|
646 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Authentication class that deals with the OAuth 2 web-server authentication flow
|
24 |
+
*
|
25 |
+
*/
|
26 |
+
class Google_Auth_OAuth2 extends Google_Auth_Abstract
|
27 |
+
{
|
28 |
+
const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
|
29 |
+
const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
|
30 |
+
const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
31 |
+
const CLOCK_SKEW_SECS = 300; // five minutes in seconds
|
32 |
+
const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds
|
33 |
+
const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds
|
34 |
+
const OAUTH2_ISSUER = 'accounts.google.com';
|
35 |
+
const OAUTH2_ISSUER_HTTPS = 'https://accounts.google.com';
|
36 |
+
|
37 |
+
/** @var Google_Auth_AssertionCredentials $assertionCredentials */
|
38 |
+
private $assertionCredentials;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var string The state parameters for CSRF and other forgery protection.
|
42 |
+
*/
|
43 |
+
private $state;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var array The token bundle.
|
47 |
+
*/
|
48 |
+
private $token = array();
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var Google_Client the base client
|
52 |
+
*/
|
53 |
+
private $client;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Instantiates the class, but does not initiate the login flow, leaving it
|
57 |
+
* to the discretion of the caller.
|
58 |
+
*/
|
59 |
+
public function __construct(Google_Client $client)
|
60 |
+
{
|
61 |
+
$this->client = $client;
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Perform an authenticated / signed apiHttpRequest.
|
66 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
67 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
68 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
69 |
+
*
|
70 |
+
* @param Google_Http_Request $request
|
71 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
72 |
+
* responseHttpCode, responseHeaders and responseBody.
|
73 |
+
*/
|
74 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
75 |
+
{
|
76 |
+
$request = $this->sign($request);
|
77 |
+
return $this->client->getIo()->makeRequest($request);
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @param string $code
|
82 |
+
* @param boolean $crossClient
|
83 |
+
* @throws Google_Auth_Exception
|
84 |
+
* @return string
|
85 |
+
*/
|
86 |
+
public function authenticate($code, $crossClient = false)
|
87 |
+
{
|
88 |
+
if (strlen($code) == 0) {
|
89 |
+
throw new Google_Auth_Exception("Invalid code");
|
90 |
+
}
|
91 |
+
|
92 |
+
$arguments = array(
|
93 |
+
'code' => $code,
|
94 |
+
'grant_type' => 'authorization_code',
|
95 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
96 |
+
'client_secret' => $this->client->getClassConfig($this, 'client_secret')
|
97 |
+
);
|
98 |
+
|
99 |
+
if ($crossClient !== true) {
|
100 |
+
$arguments['redirect_uri'] = $this->client->getClassConfig($this, 'redirect_uri');
|
101 |
+
}
|
102 |
+
|
103 |
+
// We got here from the redirect from a successful authorization grant,
|
104 |
+
// fetch the access token
|
105 |
+
$request = new Google_Http_Request(
|
106 |
+
self::OAUTH2_TOKEN_URI,
|
107 |
+
'POST',
|
108 |
+
array(),
|
109 |
+
$arguments
|
110 |
+
);
|
111 |
+
$request->disableGzip();
|
112 |
+
$response = $this->client->getIo()->makeRequest($request);
|
113 |
+
|
114 |
+
if ($response->getResponseHttpCode() == 200) {
|
115 |
+
$this->setAccessToken($response->getResponseBody());
|
116 |
+
$this->token['created'] = time();
|
117 |
+
return $this->getAccessToken();
|
118 |
+
} else {
|
119 |
+
$decodedResponse = json_decode($response->getResponseBody(), true);
|
120 |
+
if ($decodedResponse != null && $decodedResponse['error']) {
|
121 |
+
$errorText = $decodedResponse['error'];
|
122 |
+
if (isset($decodedResponse['error_description'])) {
|
123 |
+
$errorText .= ": " . $decodedResponse['error_description'];
|
124 |
+
}
|
125 |
+
}
|
126 |
+
throw new Google_Auth_Exception(
|
127 |
+
sprintf(
|
128 |
+
"Error fetching OAuth2 access token, message: '%s'",
|
129 |
+
$errorText
|
130 |
+
),
|
131 |
+
$response->getResponseHttpCode()
|
132 |
+
);
|
133 |
+
}
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Create a URL to obtain user authorization.
|
138 |
+
* The authorization endpoint allows the user to first
|
139 |
+
* authenticate, and then grant/deny the access request.
|
140 |
+
* @param string $scope The scope is expressed as a list of space-delimited strings.
|
141 |
+
* @return string
|
142 |
+
*/
|
143 |
+
public function createAuthUrl($scope)
|
144 |
+
{
|
145 |
+
$params = array(
|
146 |
+
'response_type' => 'code',
|
147 |
+
'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'),
|
148 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
149 |
+
'scope' => $scope,
|
150 |
+
'access_type' => $this->client->getClassConfig($this, 'access_type'),
|
151 |
+
);
|
152 |
+
|
153 |
+
// Prefer prompt to approval prompt.
|
154 |
+
if ($this->client->getClassConfig($this, 'prompt')) {
|
155 |
+
$params = $this->maybeAddParam($params, 'prompt');
|
156 |
+
} else {
|
157 |
+
$params = $this->maybeAddParam($params, 'approval_prompt');
|
158 |
+
}
|
159 |
+
$params = $this->maybeAddParam($params, 'login_hint');
|
160 |
+
$params = $this->maybeAddParam($params, 'hd');
|
161 |
+
$params = $this->maybeAddParam($params, 'openid.realm');
|
162 |
+
$params = $this->maybeAddParam($params, 'include_granted_scopes');
|
163 |
+
|
164 |
+
// If the list of scopes contains plus.login, add request_visible_actions
|
165 |
+
// to auth URL.
|
166 |
+
$rva = $this->client->getClassConfig($this, 'request_visible_actions');
|
167 |
+
if (strpos($scope, 'plus.login') && strlen($rva) > 0) {
|
168 |
+
$params['request_visible_actions'] = $rva;
|
169 |
+
}
|
170 |
+
|
171 |
+
if (isset($this->state)) {
|
172 |
+
$params['state'] = $this->state;
|
173 |
+
}
|
174 |
+
|
175 |
+
return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&');
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* @param string $token
|
180 |
+
* @throws Google_Auth_Exception
|
181 |
+
*/
|
182 |
+
public function setAccessToken($token)
|
183 |
+
{
|
184 |
+
$token = json_decode($token, true);
|
185 |
+
if ($token == null) {
|
186 |
+
throw new Google_Auth_Exception('Could not json decode the token');
|
187 |
+
}
|
188 |
+
if (! isset($token['access_token'])) {
|
189 |
+
throw new Google_Auth_Exception("Invalid token format");
|
190 |
+
}
|
191 |
+
$this->token = $token;
|
192 |
+
}
|
193 |
+
|
194 |
+
public function getAccessToken()
|
195 |
+
{
|
196 |
+
return json_encode($this->token);
|
197 |
+
}
|
198 |
+
|
199 |
+
public function getRefreshToken()
|
200 |
+
{
|
201 |
+
if (array_key_exists('refresh_token', $this->token)) {
|
202 |
+
return $this->token['refresh_token'];
|
203 |
+
} else {
|
204 |
+
return null;
|
205 |
+
}
|
206 |
+
}
|
207 |
+
|
208 |
+
public function setState($state)
|
209 |
+
{
|
210 |
+
$this->state = $state;
|
211 |
+
}
|
212 |
+
|
213 |
+
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
214 |
+
{
|
215 |
+
$this->assertionCredentials = $creds;
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Include an accessToken in a given apiHttpRequest.
|
220 |
+
* @param Google_Http_Request $request
|
221 |
+
* @return Google_Http_Request
|
222 |
+
* @throws Google_Auth_Exception
|
223 |
+
*/
|
224 |
+
public function sign(Google_Http_Request $request)
|
225 |
+
{
|
226 |
+
// add the developer key to the request before signing it
|
227 |
+
if ($this->client->getClassConfig($this, 'developer_key')) {
|
228 |
+
$request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key'));
|
229 |
+
}
|
230 |
+
|
231 |
+
// Cannot sign the request without an OAuth access token.
|
232 |
+
if (null == $this->token && null == $this->assertionCredentials) {
|
233 |
+
return $request;
|
234 |
+
}
|
235 |
+
|
236 |
+
// Check if the token is set to expire in the next 30 seconds
|
237 |
+
// (or has already expired).
|
238 |
+
if ($this->isAccessTokenExpired()) {
|
239 |
+
if ($this->assertionCredentials) {
|
240 |
+
$this->refreshTokenWithAssertion();
|
241 |
+
} else {
|
242 |
+
$this->client->getLogger()->debug('OAuth2 access token expired');
|
243 |
+
if (! array_key_exists('refresh_token', $this->token)) {
|
244 |
+
$error = "The OAuth 2.0 access token has expired,"
|
245 |
+
." and a refresh token is not available. Refresh tokens"
|
246 |
+
." are not returned for responses that were auto-approved.";
|
247 |
+
|
248 |
+
$this->client->getLogger()->error($error);
|
249 |
+
throw new Google_Auth_Exception($error);
|
250 |
+
}
|
251 |
+
$this->refreshToken($this->token['refresh_token']);
|
252 |
+
}
|
253 |
+
}
|
254 |
+
|
255 |
+
$this->client->getLogger()->debug('OAuth2 authentication');
|
256 |
+
|
257 |
+
// Add the OAuth2 header to the request
|
258 |
+
$request->setRequestHeaders(
|
259 |
+
array('Authorization' => 'Bearer ' . $this->token['access_token'])
|
260 |
+
);
|
261 |
+
|
262 |
+
return $request;
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Fetches a fresh access token with the given refresh token.
|
267 |
+
* @param string $refreshToken
|
268 |
+
* @return void
|
269 |
+
*/
|
270 |
+
public function refreshToken($refreshToken)
|
271 |
+
{
|
272 |
+
$this->refreshTokenRequest(
|
273 |
+
array(
|
274 |
+
'client_id' => $this->client->getClassConfig($this, 'client_id'),
|
275 |
+
'client_secret' => $this->client->getClassConfig($this, 'client_secret'),
|
276 |
+
'refresh_token' => $refreshToken,
|
277 |
+
'grant_type' => 'refresh_token'
|
278 |
+
)
|
279 |
+
);
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Fetches a fresh access token with a given assertion token.
|
284 |
+
* @param Google_Auth_AssertionCredentials $assertionCredentials optional.
|
285 |
+
* @return void
|
286 |
+
*/
|
287 |
+
public function refreshTokenWithAssertion($assertionCredentials = null)
|
288 |
+
{
|
289 |
+
if (!$assertionCredentials) {
|
290 |
+
$assertionCredentials = $this->assertionCredentials;
|
291 |
+
}
|
292 |
+
|
293 |
+
$cacheKey = $assertionCredentials->getCacheKey();
|
294 |
+
|
295 |
+
if ($cacheKey) {
|
296 |
+
// We can check whether we have a token available in the
|
297 |
+
// cache. If it is expired, we can retrieve a new one from
|
298 |
+
// the assertion.
|
299 |
+
$token = $this->client->getCache()->get($cacheKey);
|
300 |
+
if ($token) {
|
301 |
+
$this->setAccessToken($token);
|
302 |
+
}
|
303 |
+
if (!$this->isAccessTokenExpired()) {
|
304 |
+
return;
|
305 |
+
}
|
306 |
+
}
|
307 |
+
|
308 |
+
$this->client->getLogger()->debug('OAuth2 access token expired');
|
309 |
+
$this->refreshTokenRequest(
|
310 |
+
array(
|
311 |
+
'grant_type' => 'assertion',
|
312 |
+
'assertion_type' => $assertionCredentials->assertionType,
|
313 |
+
'assertion' => $assertionCredentials->generateAssertion(),
|
314 |
+
)
|
315 |
+
);
|
316 |
+
|
317 |
+
if ($cacheKey) {
|
318 |
+
// Attempt to cache the token.
|
319 |
+
$this->client->getCache()->set(
|
320 |
+
$cacheKey,
|
321 |
+
$this->getAccessToken()
|
322 |
+
);
|
323 |
+
}
|
324 |
+
}
|
325 |
+
|
326 |
+
private function refreshTokenRequest($params)
|
327 |
+
{
|
328 |
+
if (isset($params['assertion'])) {
|
329 |
+
$this->client->getLogger()->info(
|
330 |
+
'OAuth2 access token refresh with Signed JWT assertion grants.'
|
331 |
+
);
|
332 |
+
} else {
|
333 |
+
$this->client->getLogger()->info('OAuth2 access token refresh');
|
334 |
+
}
|
335 |
+
|
336 |
+
$http = new Google_Http_Request(
|
337 |
+
self::OAUTH2_TOKEN_URI,
|
338 |
+
'POST',
|
339 |
+
array(),
|
340 |
+
$params
|
341 |
+
);
|
342 |
+
$http->disableGzip();
|
343 |
+
$request = $this->client->getIo()->makeRequest($http);
|
344 |
+
|
345 |
+
$code = $request->getResponseHttpCode();
|
346 |
+
$body = $request->getResponseBody();
|
347 |
+
if (200 == $code) {
|
348 |
+
$token = json_decode($body, true);
|
349 |
+
if ($token == null) {
|
350 |
+
throw new Google_Auth_Exception("Could not json decode the access token");
|
351 |
+
}
|
352 |
+
|
353 |
+
if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
|
354 |
+
throw new Google_Auth_Exception("Invalid token format");
|
355 |
+
}
|
356 |
+
|
357 |
+
if (isset($token['id_token'])) {
|
358 |
+
$this->token['id_token'] = $token['id_token'];
|
359 |
+
}
|
360 |
+
$this->token['access_token'] = $token['access_token'];
|
361 |
+
$this->token['expires_in'] = $token['expires_in'];
|
362 |
+
$this->token['created'] = time();
|
363 |
+
} else {
|
364 |
+
throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code);
|
365 |
+
}
|
366 |
+
}
|
367 |
+
|
368 |
+
/**
|
369 |
+
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
370 |
+
* token, if a token isn't provided.
|
371 |
+
* @throws Google_Auth_Exception
|
372 |
+
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
373 |
+
* @return boolean Returns True if the revocation was successful, otherwise False.
|
374 |
+
*/
|
375 |
+
public function revokeToken($token = null)
|
376 |
+
{
|
377 |
+
if (!$token) {
|
378 |
+
if (!$this->token) {
|
379 |
+
// Not initialized, no token to actually revoke
|
380 |
+
return false;
|
381 |
+
} elseif (array_key_exists('refresh_token', $this->token)) {
|
382 |
+
$token = $this->token['refresh_token'];
|
383 |
+
} else {
|
384 |
+
$token = $this->token['access_token'];
|
385 |
+
}
|
386 |
+
}
|
387 |
+
$request = new Google_Http_Request(
|
388 |
+
self::OAUTH2_REVOKE_URI,
|
389 |
+
'POST',
|
390 |
+
array(),
|
391 |
+
"token=$token"
|
392 |
+
);
|
393 |
+
$request->disableGzip();
|
394 |
+
$response = $this->client->getIo()->makeRequest($request);
|
395 |
+
$code = $response->getResponseHttpCode();
|
396 |
+
if ($code == 200) {
|
397 |
+
$this->token = null;
|
398 |
+
return true;
|
399 |
+
}
|
400 |
+
|
401 |
+
return false;
|
402 |
+
}
|
403 |
+
|
404 |
+
/**
|
405 |
+
* Returns if the access_token is expired.
|
406 |
+
* @return bool Returns True if the access_token is expired.
|
407 |
+
*/
|
408 |
+
public function isAccessTokenExpired()
|
409 |
+
{
|
410 |
+
if (!$this->token || !isset($this->token['created'])) {
|
411 |
+
return true;
|
412 |
+
}
|
413 |
+
|
414 |
+
// If the token is set to expire in the next 30 seconds.
|
415 |
+
$expired = ($this->token['created']
|
416 |
+
+ ($this->token['expires_in'] - 30)) < time();
|
417 |
+
|
418 |
+
return $expired;
|
419 |
+
}
|
420 |
+
|
421 |
+
// Gets federated sign-on certificates to use for verifying identity tokens.
|
422 |
+
// Returns certs as array structure, where keys are key ids, and values
|
423 |
+
// are PEM encoded certificates.
|
424 |
+
private function getFederatedSignOnCerts()
|
425 |
+
{
|
426 |
+
return $this->retrieveCertsFromLocation(
|
427 |
+
$this->client->getClassConfig($this, 'federated_signon_certs_url')
|
428 |
+
);
|
429 |
+
}
|
430 |
+
|
431 |
+
/**
|
432 |
+
* Retrieve and cache a certificates file.
|
433 |
+
*
|
434 |
+
* @param $url string location
|
435 |
+
* @throws Google_Auth_Exception
|
436 |
+
* @return array certificates
|
437 |
+
*/
|
438 |
+
public function retrieveCertsFromLocation($url)
|
439 |
+
{
|
440 |
+
// If we're retrieving a local file, just grab it.
|
441 |
+
if ("http" != substr($url, 0, 4)) {
|
442 |
+
$file = file_get_contents($url);
|
443 |
+
if ($file) {
|
444 |
+
return json_decode($file, true);
|
445 |
+
} else {
|
446 |
+
throw new Google_Auth_Exception(
|
447 |
+
"Failed to retrieve verification certificates: '" .
|
448 |
+
$url . "'."
|
449 |
+
);
|
450 |
+
}
|
451 |
+
}
|
452 |
+
|
453 |
+
// This relies on makeRequest caching certificate responses.
|
454 |
+
$request = $this->client->getIo()->makeRequest(
|
455 |
+
new Google_Http_Request(
|
456 |
+
$url
|
457 |
+
)
|
458 |
+
);
|
459 |
+
if ($request->getResponseHttpCode() == 200) {
|
460 |
+
$certs = json_decode($request->getResponseBody(), true);
|
461 |
+
if ($certs) {
|
462 |
+
return $certs;
|
463 |
+
}
|
464 |
+
}
|
465 |
+
throw new Google_Auth_Exception(
|
466 |
+
"Failed to retrieve verification certificates: '" .
|
467 |
+
$request->getResponseBody() . "'.",
|
468 |
+
$request->getResponseHttpCode()
|
469 |
+
);
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Verifies an id token and returns the authenticated apiLoginTicket.
|
474 |
+
* Throws an exception if the id token is not valid.
|
475 |
+
* The audience parameter can be used to control which id tokens are
|
476 |
+
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
477 |
+
*
|
478 |
+
* @param $id_token
|
479 |
+
* @param $audience
|
480 |
+
* @return Google_Auth_LoginTicket
|
481 |
+
*/
|
482 |
+
public function verifyIdToken($id_token = null, $audience = null)
|
483 |
+
{
|
484 |
+
if (!$id_token) {
|
485 |
+
$id_token = $this->token['id_token'];
|
486 |
+
}
|
487 |
+
$certs = $this->getFederatedSignonCerts();
|
488 |
+
if (!$audience) {
|
489 |
+
$audience = $this->client->getClassConfig($this, 'client_id');
|
490 |
+
}
|
491 |
+
|
492 |
+
return $this->verifySignedJwtWithCerts(
|
493 |
+
$id_token,
|
494 |
+
$certs,
|
495 |
+
$audience,
|
496 |
+
array(self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS)
|
497 |
+
);
|
498 |
+
}
|
499 |
+
|
500 |
+
/**
|
501 |
+
* Verifies the id token, returns the verified token contents.
|
502 |
+
*
|
503 |
+
* @param $jwt string the token
|
504 |
+
* @param $certs array of certificates
|
505 |
+
* @param $required_audience string the expected consumer of the token
|
506 |
+
* @param [$issuer] the expected issues, defaults to Google
|
507 |
+
* @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
508 |
+
* @throws Google_Auth_Exception
|
509 |
+
* @return mixed token information if valid, false if not
|
510 |
+
*/
|
511 |
+
public function verifySignedJwtWithCerts(
|
512 |
+
$jwt,
|
513 |
+
$certs,
|
514 |
+
$required_audience,
|
515 |
+
$issuer = null,
|
516 |
+
$max_expiry = null
|
517 |
+
) {
|
518 |
+
if (!$max_expiry) {
|
519 |
+
// Set the maximum time we will accept a token for.
|
520 |
+
$max_expiry = self::MAX_TOKEN_LIFETIME_SECS;
|
521 |
+
}
|
522 |
+
|
523 |
+
$segments = explode(".", $jwt);
|
524 |
+
if (count($segments) != 3) {
|
525 |
+
throw new Google_Auth_Exception("Wrong number of segments in token: $jwt");
|
526 |
+
}
|
527 |
+
$signed = $segments[0] . "." . $segments[1];
|
528 |
+
$signature = Google_Utils::urlSafeB64Decode($segments[2]);
|
529 |
+
|
530 |
+
// Parse envelope.
|
531 |
+
$envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true);
|
532 |
+
if (!$envelope) {
|
533 |
+
throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]);
|
534 |
+
}
|
535 |
+
|
536 |
+
// Parse token
|
537 |
+
$json_body = Google_Utils::urlSafeB64Decode($segments[1]);
|
538 |
+
$payload = json_decode($json_body, true);
|
539 |
+
if (!$payload) {
|
540 |
+
throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]);
|
541 |
+
}
|
542 |
+
|
543 |
+
// Check signature
|
544 |
+
$verified = false;
|
545 |
+
foreach ($certs as $keyName => $pem) {
|
546 |
+
$public_key = new Google_Verifier_Pem($pem);
|
547 |
+
if ($public_key->verify($signed, $signature)) {
|
548 |
+
$verified = true;
|
549 |
+
break;
|
550 |
+
}
|
551 |
+
}
|
552 |
+
|
553 |
+
if (!$verified) {
|
554 |
+
throw new Google_Auth_Exception("Invalid token signature: $jwt");
|
555 |
+
}
|
556 |
+
|
557 |
+
// Check issued-at timestamp
|
558 |
+
$iat = 0;
|
559 |
+
if (array_key_exists("iat", $payload)) {
|
560 |
+
$iat = $payload["iat"];
|
561 |
+
}
|
562 |
+
if (!$iat) {
|
563 |
+
throw new Google_Auth_Exception("No issue time in token: $json_body");
|
564 |
+
}
|
565 |
+
$earliest = $iat - self::CLOCK_SKEW_SECS;
|
566 |
+
|
567 |
+
// Check expiration timestamp
|
568 |
+
$now = time();
|
569 |
+
$exp = 0;
|
570 |
+
if (array_key_exists("exp", $payload)) {
|
571 |
+
$exp = $payload["exp"];
|
572 |
+
}
|
573 |
+
if (!$exp) {
|
574 |
+
throw new Google_Auth_Exception("No expiration time in token: $json_body");
|
575 |
+
}
|
576 |
+
if ($exp >= $now + $max_expiry) {
|
577 |
+
throw new Google_Auth_Exception(
|
578 |
+
sprintf("Expiration time too far in future: %s", $json_body)
|
579 |
+
);
|
580 |
+
}
|
581 |
+
|
582 |
+
$latest = $exp + self::CLOCK_SKEW_SECS;
|
583 |
+
if ($now < $earliest) {
|
584 |
+
throw new Google_Auth_Exception(
|
585 |
+
sprintf(
|
586 |
+
"Token used too early, %s < %s: %s",
|
587 |
+
$now,
|
588 |
+
$earliest,
|
589 |
+
$json_body
|
590 |
+
)
|
591 |
+
);
|
592 |
+
}
|
593 |
+
if ($now > $latest) {
|
594 |
+
throw new Google_Auth_Exception(
|
595 |
+
sprintf(
|
596 |
+
"Token used too late, %s > %s: %s",
|
597 |
+
$now,
|
598 |
+
$latest,
|
599 |
+
$json_body
|
600 |
+
)
|
601 |
+
);
|
602 |
+
}
|
603 |
+
|
604 |
+
// support HTTP and HTTPS issuers
|
605 |
+
// @see https://developers.google.com/identity/sign-in/web/backend-auth
|
606 |
+
$iss = $payload['iss'];
|
607 |
+
if ($issuer && !in_array($iss, (array) $issuer)) {
|
608 |
+
throw new Google_Auth_Exception(
|
609 |
+
sprintf(
|
610 |
+
"Invalid issuer, %s not in %s: %s",
|
611 |
+
$iss,
|
612 |
+
"[".implode(",", (array) $issuer)."]",
|
613 |
+
$json_body
|
614 |
+
)
|
615 |
+
);
|
616 |
+
}
|
617 |
+
|
618 |
+
// Check audience
|
619 |
+
$aud = $payload["aud"];
|
620 |
+
if ($aud != $required_audience) {
|
621 |
+
throw new Google_Auth_Exception(
|
622 |
+
sprintf(
|
623 |
+
"Wrong recipient, %s != %s:",
|
624 |
+
$aud,
|
625 |
+
$required_audience,
|
626 |
+
$json_body
|
627 |
+
)
|
628 |
+
);
|
629 |
+
}
|
630 |
+
|
631 |
+
// All good.
|
632 |
+
return new Google_Auth_LoginTicket($envelope, $payload);
|
633 |
+
}
|
634 |
+
|
635 |
+
/**
|
636 |
+
* Add a parameter to the auth params if not empty string.
|
637 |
+
*/
|
638 |
+
private function maybeAddParam($params, $name)
|
639 |
+
{
|
640 |
+
$param = $this->client->getClassConfig($this, $name);
|
641 |
+
if ($param != '') {
|
642 |
+
$params[$name] = $param;
|
643 |
+
}
|
644 |
+
return $params;
|
645 |
+
}
|
646 |
+
}
|
app/api/Google/Auth/Simple.php
CHANGED
@@ -1,63 +1,63 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Simple API access implementation. Can either be used to make requests
|
24 |
-
* completely unauthenticated, or by using a Simple API Access developer
|
25 |
-
* key.
|
26 |
-
*/
|
27 |
-
class Google_Auth_Simple extends Google_Auth_Abstract
|
28 |
-
{
|
29 |
-
private $client;
|
30 |
-
|
31 |
-
public function __construct(Google_Client $client, $config = null)
|
32 |
-
{
|
33 |
-
$this->client = $client;
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Perform an authenticated / signed apiHttpRequest.
|
38 |
-
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
39 |
-
* (which can modify the request in what ever way fits the auth mechanism)
|
40 |
-
* and then calls apiCurlIO::makeRequest on the signed request
|
41 |
-
*
|
42 |
-
* @param Google_Http_Request $request
|
43 |
-
* @return Google_Http_Request The resulting HTTP response including the
|
44 |
-
* responseHttpCode, responseHeaders and responseBody.
|
45 |
-
*/
|
46 |
-
public function authenticatedRequest(Google_Http_Request $request)
|
47 |
-
{
|
48 |
-
$request = $this->sign($request);
|
49 |
-
return $this->io->makeRequest($request);
|
50 |
-
}
|
51 |
-
|
52 |
-
public function sign(Google_Http_Request $request)
|
53 |
-
{
|
54 |
-
$key = $this->client->getClassConfig($this, 'developer_key');
|
55 |
-
if ($key) {
|
56 |
-
$this->client->getLogger()->debug(
|
57 |
-
'Simple API Access developer key authentication'
|
58 |
-
);
|
59 |
-
$request->setQueryParam('key', $key);
|
60 |
-
}
|
61 |
-
return $request;
|
62 |
-
}
|
63 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Simple API access implementation. Can either be used to make requests
|
24 |
+
* completely unauthenticated, or by using a Simple API Access developer
|
25 |
+
* key.
|
26 |
+
*/
|
27 |
+
class Google_Auth_Simple extends Google_Auth_Abstract
|
28 |
+
{
|
29 |
+
private $client;
|
30 |
+
|
31 |
+
public function __construct(Google_Client $client, $config = null)
|
32 |
+
{
|
33 |
+
$this->client = $client;
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Perform an authenticated / signed apiHttpRequest.
|
38 |
+
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
39 |
+
* (which can modify the request in what ever way fits the auth mechanism)
|
40 |
+
* and then calls apiCurlIO::makeRequest on the signed request
|
41 |
+
*
|
42 |
+
* @param Google_Http_Request $request
|
43 |
+
* @return Google_Http_Request The resulting HTTP response including the
|
44 |
+
* responseHttpCode, responseHeaders and responseBody.
|
45 |
+
*/
|
46 |
+
public function authenticatedRequest(Google_Http_Request $request)
|
47 |
+
{
|
48 |
+
$request = $this->sign($request);
|
49 |
+
return $this->io->makeRequest($request);
|
50 |
+
}
|
51 |
+
|
52 |
+
public function sign(Google_Http_Request $request)
|
53 |
+
{
|
54 |
+
$key = $this->client->getClassConfig($this, 'developer_key');
|
55 |
+
if ($key) {
|
56 |
+
$this->client->getLogger()->debug(
|
57 |
+
'Simple API Access developer key authentication'
|
58 |
+
);
|
59 |
+
$request->setQueryParam('key', $key);
|
60 |
+
}
|
61 |
+
return $request;
|
62 |
+
}
|
63 |
+
}
|
app/api/Google/Cache/Abstract.php
CHANGED
@@ -1,53 +1,53 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Abstract storage class
|
20 |
-
*
|
21 |
-
* @author Chris Chabot <chabotc@google.com>
|
22 |
-
*/
|
23 |
-
abstract class Google_Cache_Abstract
|
24 |
-
{
|
25 |
-
|
26 |
-
abstract public function __construct(Google_Client $client);
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Retrieves the data for the given key, or false if they
|
30 |
-
* key is unknown or expired
|
31 |
-
*
|
32 |
-
* @param String $key The key who's data to retrieve
|
33 |
-
* @param boolean|int $expiration Expiration time in seconds
|
34 |
-
*
|
35 |
-
*/
|
36 |
-
abstract public function get($key, $expiration = false);
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Store the key => $value set. The $value is serialized
|
40 |
-
* by this function so can be of any type
|
41 |
-
*
|
42 |
-
* @param string $key Key of the data
|
43 |
-
* @param string $value data
|
44 |
-
*/
|
45 |
-
abstract public function set($key, $value);
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Removes the key/data pair for the given $key
|
49 |
-
*
|
50 |
-
* @param String $key
|
51 |
-
*/
|
52 |
-
abstract public function delete($key);
|
53 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Abstract storage class
|
20 |
+
*
|
21 |
+
* @author Chris Chabot <chabotc@google.com>
|
22 |
+
*/
|
23 |
+
abstract class Google_Cache_Abstract
|
24 |
+
{
|
25 |
+
|
26 |
+
abstract public function __construct(Google_Client $client);
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Retrieves the data for the given key, or false if they
|
30 |
+
* key is unknown or expired
|
31 |
+
*
|
32 |
+
* @param String $key The key who's data to retrieve
|
33 |
+
* @param boolean|int $expiration Expiration time in seconds
|
34 |
+
*
|
35 |
+
*/
|
36 |
+
abstract public function get($key, $expiration = false);
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Store the key => $value set. The $value is serialized
|
40 |
+
* by this function so can be of any type
|
41 |
+
*
|
42 |
+
* @param string $key Key of the data
|
43 |
+
* @param string $value data
|
44 |
+
*/
|
45 |
+
abstract public function set($key, $value);
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Removes the key/data pair for the given $key
|
49 |
+
*
|
50 |
+
* @param String $key
|
51 |
+
*/
|
52 |
+
abstract public function delete($key);
|
53 |
+
}
|
app/api/Google/Cache/Apc.php
CHANGED
@@ -1,113 +1,113 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* A persistent storage class based on the APC cache, which is not
|
24 |
-
* really very persistent, as soon as you restart your web server
|
25 |
-
* the storage will be wiped, however for debugging and/or speed
|
26 |
-
* it can be useful, and cache is a lot cheaper then storage.
|
27 |
-
*
|
28 |
-
* @author Chris Chabot <chabotc@google.com>
|
29 |
-
*/
|
30 |
-
class Google_Cache_Apc extends Google_Cache_Abstract
|
31 |
-
{
|
32 |
-
/**
|
33 |
-
* @var Google_Client the current client
|
34 |
-
*/
|
35 |
-
private $client;
|
36 |
-
|
37 |
-
public function __construct(Google_Client $client)
|
38 |
-
{
|
39 |
-
if (! function_exists('apc_add') ) {
|
40 |
-
$error = "Apc functions not available";
|
41 |
-
|
42 |
-
$client->getLogger()->error($error);
|
43 |
-
throw new Google_Cache_Exception($error);
|
44 |
-
}
|
45 |
-
|
46 |
-
$this->client = $client;
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* @inheritDoc
|
51 |
-
*/
|
52 |
-
public function get($key, $expiration = false)
|
53 |
-
{
|
54 |
-
$ret = apc_fetch($key);
|
55 |
-
if ($ret === false) {
|
56 |
-
$this->client->getLogger()->debug(
|
57 |
-
'APC cache miss',
|
58 |
-
array('key' => $key)
|
59 |
-
);
|
60 |
-
return false;
|
61 |
-
}
|
62 |
-
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
63 |
-
$this->client->getLogger()->debug(
|
64 |
-
'APC cache miss (expired)',
|
65 |
-
array('key' => $key, 'var' => $ret)
|
66 |
-
);
|
67 |
-
$this->delete($key);
|
68 |
-
return false;
|
69 |
-
}
|
70 |
-
|
71 |
-
$this->client->getLogger()->debug(
|
72 |
-
'APC cache hit',
|
73 |
-
array('key' => $key, 'var' => $ret)
|
74 |
-
);
|
75 |
-
|
76 |
-
return $ret['data'];
|
77 |
-
}
|
78 |
-
|
79 |
-
/**
|
80 |
-
* @inheritDoc
|
81 |
-
*/
|
82 |
-
public function set($key, $value)
|
83 |
-
{
|
84 |
-
$var = array('time' => time(), 'data' => $value);
|
85 |
-
$rc = apc_store($key, $var);
|
86 |
-
|
87 |
-
if ($rc == false) {
|
88 |
-
$this->client->getLogger()->error(
|
89 |
-
'APC cache set failed',
|
90 |
-
array('key' => $key, 'var' => $var)
|
91 |
-
);
|
92 |
-
throw new Google_Cache_Exception("Couldn't store data");
|
93 |
-
}
|
94 |
-
|
95 |
-
$this->client->getLogger()->debug(
|
96 |
-
'APC cache set',
|
97 |
-
array('key' => $key, 'var' => $var)
|
98 |
-
);
|
99 |
-
}
|
100 |
-
|
101 |
-
/**
|
102 |
-
* @inheritDoc
|
103 |
-
* @param String $key
|
104 |
-
*/
|
105 |
-
public function delete($key)
|
106 |
-
{
|
107 |
-
$this->client->getLogger()->debug(
|
108 |
-
'APC cache delete',
|
109 |
-
array('key' => $key)
|
110 |
-
);
|
111 |
-
apc_delete($key);
|
112 |
-
}
|
113 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* A persistent storage class based on the APC cache, which is not
|
24 |
+
* really very persistent, as soon as you restart your web server
|
25 |
+
* the storage will be wiped, however for debugging and/or speed
|
26 |
+
* it can be useful, and cache is a lot cheaper then storage.
|
27 |
+
*
|
28 |
+
* @author Chris Chabot <chabotc@google.com>
|
29 |
+
*/
|
30 |
+
class Google_Cache_Apc extends Google_Cache_Abstract
|
31 |
+
{
|
32 |
+
/**
|
33 |
+
* @var Google_Client the current client
|
34 |
+
*/
|
35 |
+
private $client;
|
36 |
+
|
37 |
+
public function __construct(Google_Client $client)
|
38 |
+
{
|
39 |
+
if (! function_exists('apc_add') ) {
|
40 |
+
$error = "Apc functions not available";
|
41 |
+
|
42 |
+
$client->getLogger()->error($error);
|
43 |
+
throw new Google_Cache_Exception($error);
|
44 |
+
}
|
45 |
+
|
46 |
+
$this->client = $client;
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @inheritDoc
|
51 |
+
*/
|
52 |
+
public function get($key, $expiration = false)
|
53 |
+
{
|
54 |
+
$ret = apc_fetch($key);
|
55 |
+
if ($ret === false) {
|
56 |
+
$this->client->getLogger()->debug(
|
57 |
+
'APC cache miss',
|
58 |
+
array('key' => $key)
|
59 |
+
);
|
60 |
+
return false;
|
61 |
+
}
|
62 |
+
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
63 |
+
$this->client->getLogger()->debug(
|
64 |
+
'APC cache miss (expired)',
|
65 |
+
array('key' => $key, 'var' => $ret)
|
66 |
+
);
|
67 |
+
$this->delete($key);
|
68 |
+
return false;
|
69 |
+
}
|
70 |
+
|
71 |
+
$this->client->getLogger()->debug(
|
72 |
+
'APC cache hit',
|
73 |
+
array('key' => $key, 'var' => $ret)
|
74 |
+
);
|
75 |
+
|
76 |
+
return $ret['data'];
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* @inheritDoc
|
81 |
+
*/
|
82 |
+
public function set($key, $value)
|
83 |
+
{
|
84 |
+
$var = array('time' => time(), 'data' => $value);
|
85 |
+
$rc = apc_store($key, $var);
|
86 |
+
|
87 |
+
if ($rc == false) {
|
88 |
+
$this->client->getLogger()->error(
|
89 |
+
'APC cache set failed',
|
90 |
+
array('key' => $key, 'var' => $var)
|
91 |
+
);
|
92 |
+
throw new Google_Cache_Exception("Couldn't store data");
|
93 |
+
}
|
94 |
+
|
95 |
+
$this->client->getLogger()->debug(
|
96 |
+
'APC cache set',
|
97 |
+
array('key' => $key, 'var' => $var)
|
98 |
+
);
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* @inheritDoc
|
103 |
+
* @param String $key
|
104 |
+
*/
|
105 |
+
public function delete($key)
|
106 |
+
{
|
107 |
+
$this->client->getLogger()->debug(
|
108 |
+
'APC cache delete',
|
109 |
+
array('key' => $key)
|
110 |
+
);
|
111 |
+
apc_delete($key);
|
112 |
+
}
|
113 |
+
}
|
app/api/Google/Cache/Exception.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_Cache_Exception extends Google_Exception
|
23 |
-
{
|
24 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_Cache_Exception extends Google_Exception
|
23 |
+
{
|
24 |
+
}
|
app/api/Google/Cache/File.php
CHANGED
@@ -1,209 +1,209 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/*
|
23 |
-
* This class implements a basic on disk storage. While that does
|
24 |
-
* work quite well it's not the most elegant and scalable solution.
|
25 |
-
* It will also get you into a heap of trouble when you try to run
|
26 |
-
* this in a clustered environment.
|
27 |
-
*
|
28 |
-
* @author Chris Chabot <chabotc@google.com>
|
29 |
-
*/
|
30 |
-
class Google_Cache_File extends Google_Cache_Abstract
|
31 |
-
{
|
32 |
-
const MAX_LOCK_RETRIES = 10;
|
33 |
-
private $path;
|
34 |
-
private $fh;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* @var Google_Client the current client
|
38 |
-
*/
|
39 |
-
private $client;
|
40 |
-
|
41 |
-
public function __construct(Google_Client $client)
|
42 |
-
{
|
43 |
-
$this->client = $client;
|
44 |
-
$this->path = $this->client->getClassConfig($this, 'directory');
|
45 |
-
}
|
46 |
-
|
47 |
-
public function get($key, $expiration = false)
|
48 |
-
{
|
49 |
-
$storageFile = $this->getCacheFile($key);
|
50 |
-
$data = false;
|
51 |
-
|
52 |
-
if (!file_exists($storageFile)) {
|
53 |
-
$this->client->getLogger()->debug(
|
54 |
-
'File cache miss',
|
55 |
-
array('key' => $key, 'file' => $storageFile)
|
56 |
-
);
|
57 |
-
return false;
|
58 |
-
}
|
59 |
-
|
60 |
-
if ($expiration) {
|
61 |
-
$mtime = filemtime($storageFile);
|
62 |
-
if ((time() - $mtime) >= $expiration) {
|
63 |
-
$this->client->getLogger()->debug(
|
64 |
-
'File cache miss (expired)',
|
65 |
-
array('key' => $key, 'file' => $storageFile)
|
66 |
-
);
|
67 |
-
$this->delete($key);
|
68 |
-
return false;
|
69 |
-
}
|
70 |
-
}
|
71 |
-
|
72 |
-
if ($this->acquireReadLock($storageFile)) {
|
73 |
-
if (filesize($storageFile) > 0) {
|
74 |
-
$data = fread($this->fh, filesize($storageFile));
|
75 |
-
$data = unserialize($data);
|
76 |
-
} else {
|
77 |
-
$this->client->getLogger()->debug(
|
78 |
-
'Cache file was empty',
|
79 |
-
array('file' => $storageFile)
|
80 |
-
);
|
81 |
-
}
|
82 |
-
$this->unlock($storageFile);
|
83 |
-
}
|
84 |
-
|
85 |
-
$this->client->getLogger()->debug(
|
86 |
-
'File cache hit',
|
87 |
-
array('key' => $key, 'file' => $storageFile, 'var' => $data)
|
88 |
-
);
|
89 |
-
|
90 |
-
return $data;
|
91 |
-
}
|
92 |
-
|
93 |
-
public function set($key, $value)
|
94 |
-
{
|
95 |
-
$storageFile = $this->getWriteableCacheFile($key);
|
96 |
-
if ($this->acquireWriteLock($storageFile)) {
|
97 |
-
// We serialize the whole request object, since we don't only want the
|
98 |
-
// responseContent but also the postBody used, headers, size, etc.
|
99 |
-
$data = serialize($value);
|
100 |
-
$result = fwrite($this->fh, $data);
|
101 |
-
$this->unlock($storageFile);
|
102 |
-
|
103 |
-
$this->client->getLogger()->debug(
|
104 |
-
'File cache set',
|
105 |
-
array('key' => $key, 'file' => $storageFile, 'var' => $value)
|
106 |
-
);
|
107 |
-
} else {
|
108 |
-
$this->client->getLogger()->notice(
|
109 |
-
'File cache set failed',
|
110 |
-
array('key' => $key, 'file' => $storageFile)
|
111 |
-
);
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
public function delete($key)
|
116 |
-
{
|
117 |
-
$file = $this->getCacheFile($key);
|
118 |
-
if (file_exists($file) && !unlink($file)) {
|
119 |
-
$this->client->getLogger()->error(
|
120 |
-
'File cache delete failed',
|
121 |
-
array('key' => $key, 'file' => $file)
|
122 |
-
);
|
123 |
-
throw new Google_Cache_Exception("Cache file could not be deleted");
|
124 |
-
}
|
125 |
-
|
126 |
-
$this->client->getLogger()->debug(
|
127 |
-
'File cache delete',
|
128 |
-
array('key' => $key, 'file' => $file)
|
129 |
-
);
|
130 |
-
}
|
131 |
-
|
132 |
-
private function getWriteableCacheFile($file)
|
133 |
-
{
|
134 |
-
return $this->getCacheFile($file, true);
|
135 |
-
}
|
136 |
-
|
137 |
-
private function getCacheFile($file, $forWrite = false)
|
138 |
-
{
|
139 |
-
return $this->getCacheDir($file, $forWrite) . '/' . md5($file);
|
140 |
-
}
|
141 |
-
|
142 |
-
private function getCacheDir($file, $forWrite)
|
143 |
-
{
|
144 |
-
// use the first 2 characters of the hash as a directory prefix
|
145 |
-
// this should prevent slowdowns due to huge directory listings
|
146 |
-
// and thus give some basic amount of scalability
|
147 |
-
$storageDir = $this->path . '/' . substr(md5($file), 0, 2);
|
148 |
-
if ($forWrite && ! is_dir($storageDir)) {
|
149 |
-
if (! mkdir($storageDir, 0700, true)) {
|
150 |
-
$this->client->getLogger()->error(
|
151 |
-
'File cache creation failed',
|
152 |
-
array('dir' => $storageDir)
|
153 |
-
);
|
154 |
-
throw new Google_Cache_Exception("Could not create storage directory: $storageDir");
|
155 |
-
}
|
156 |
-
}
|
157 |
-
return $storageDir;
|
158 |
-
}
|
159 |
-
|
160 |
-
private function acquireReadLock($storageFile)
|
161 |
-
{
|
162 |
-
return $this->acquireLock(LOCK_SH, $storageFile);
|
163 |
-
}
|
164 |
-
|
165 |
-
private function acquireWriteLock($storageFile)
|
166 |
-
{
|
167 |
-
$rc = $this->acquireLock(LOCK_EX, $storageFile);
|
168 |
-
if (!$rc) {
|
169 |
-
$this->client->getLogger()->notice(
|
170 |
-
'File cache write lock failed',
|
171 |
-
array('file' => $storageFile)
|
172 |
-
);
|
173 |
-
$this->delete($storageFile);
|
174 |
-
}
|
175 |
-
return $rc;
|
176 |
-
}
|
177 |
-
|
178 |
-
private function acquireLock($type, $storageFile)
|
179 |
-
{
|
180 |
-
$mode = $type == LOCK_EX ? "w" : "r";
|
181 |
-
$this->fh = fopen($storageFile, $mode);
|
182 |
-
if (!$this->fh) {
|
183 |
-
$this->client->getLogger()->error(
|
184 |
-
'Failed to open file during lock acquisition',
|
185 |
-
array('file' => $storageFile)
|
186 |
-
);
|
187 |
-
return false;
|
188 |
-
}
|
189 |
-
if ($type == LOCK_EX) {
|
190 |
-
chmod($storageFile, 0600);
|
191 |
-
}
|
192 |
-
$count = 0;
|
193 |
-
while (!flock($this->fh, $type | LOCK_NB)) {
|
194 |
-
// Sleep for 10ms.
|
195 |
-
usleep(10000);
|
196 |
-
if (++$count < self::MAX_LOCK_RETRIES) {
|
197 |
-
return false;
|
198 |
-
}
|
199 |
-
}
|
200 |
-
return true;
|
201 |
-
}
|
202 |
-
|
203 |
-
public function unlock($storageFile)
|
204 |
-
{
|
205 |
-
if ($this->fh) {
|
206 |
-
flock($this->fh, LOCK_UN);
|
207 |
-
}
|
208 |
-
}
|
209 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/*
|
23 |
+
* This class implements a basic on disk storage. While that does
|
24 |
+
* work quite well it's not the most elegant and scalable solution.
|
25 |
+
* It will also get you into a heap of trouble when you try to run
|
26 |
+
* this in a clustered environment.
|
27 |
+
*
|
28 |
+
* @author Chris Chabot <chabotc@google.com>
|
29 |
+
*/
|
30 |
+
class Google_Cache_File extends Google_Cache_Abstract
|
31 |
+
{
|
32 |
+
const MAX_LOCK_RETRIES = 10;
|
33 |
+
private $path;
|
34 |
+
private $fh;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @var Google_Client the current client
|
38 |
+
*/
|
39 |
+
private $client;
|
40 |
+
|
41 |
+
public function __construct(Google_Client $client)
|
42 |
+
{
|
43 |
+
$this->client = $client;
|
44 |
+
$this->path = $this->client->getClassConfig($this, 'directory');
|
45 |
+
}
|
46 |
+
|
47 |
+
public function get($key, $expiration = false)
|
48 |
+
{
|
49 |
+
$storageFile = $this->getCacheFile($key);
|
50 |
+
$data = false;
|
51 |
+
|
52 |
+
if (!file_exists($storageFile)) {
|
53 |
+
$this->client->getLogger()->debug(
|
54 |
+
'File cache miss',
|
55 |
+
array('key' => $key, 'file' => $storageFile)
|
56 |
+
);
|
57 |
+
return false;
|
58 |
+
}
|
59 |
+
|
60 |
+
if ($expiration) {
|
61 |
+
$mtime = filemtime($storageFile);
|
62 |
+
if ((time() - $mtime) >= $expiration) {
|
63 |
+
$this->client->getLogger()->debug(
|
64 |
+
'File cache miss (expired)',
|
65 |
+
array('key' => $key, 'file' => $storageFile)
|
66 |
+
);
|
67 |
+
$this->delete($key);
|
68 |
+
return false;
|
69 |
+
}
|
70 |
+
}
|
71 |
+
|
72 |
+
if ($this->acquireReadLock($storageFile)) {
|
73 |
+
if (filesize($storageFile) > 0) {
|
74 |
+
$data = fread($this->fh, filesize($storageFile));
|
75 |
+
$data = unserialize($data);
|
76 |
+
} else {
|
77 |
+
$this->client->getLogger()->debug(
|
78 |
+
'Cache file was empty',
|
79 |
+
array('file' => $storageFile)
|
80 |
+
);
|
81 |
+
}
|
82 |
+
$this->unlock($storageFile);
|
83 |
+
}
|
84 |
+
|
85 |
+
$this->client->getLogger()->debug(
|
86 |
+
'File cache hit',
|
87 |
+
array('key' => $key, 'file' => $storageFile, 'var' => $data)
|
88 |
+
);
|
89 |
+
|
90 |
+
return $data;
|
91 |
+
}
|
92 |
+
|
93 |
+
public function set($key, $value)
|
94 |
+
{
|
95 |
+
$storageFile = $this->getWriteableCacheFile($key);
|
96 |
+
if ($this->acquireWriteLock($storageFile)) {
|
97 |
+
// We serialize the whole request object, since we don't only want the
|
98 |
+
// responseContent but also the postBody used, headers, size, etc.
|
99 |
+
$data = serialize($value);
|
100 |
+
$result = fwrite($this->fh, $data);
|
101 |
+
$this->unlock($storageFile);
|
102 |
+
|
103 |
+
$this->client->getLogger()->debug(
|
104 |
+
'File cache set',
|
105 |
+
array('key' => $key, 'file' => $storageFile, 'var' => $value)
|
106 |
+
);
|
107 |
+
} else {
|
108 |
+
$this->client->getLogger()->notice(
|
109 |
+
'File cache set failed',
|
110 |
+
array('key' => $key, 'file' => $storageFile)
|
111 |
+
);
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
public function delete($key)
|
116 |
+
{
|
117 |
+
$file = $this->getCacheFile($key);
|
118 |
+
if (file_exists($file) && !unlink($file)) {
|
119 |
+
$this->client->getLogger()->error(
|
120 |
+
'File cache delete failed',
|
121 |
+
array('key' => $key, 'file' => $file)
|
122 |
+
);
|
123 |
+
throw new Google_Cache_Exception("Cache file could not be deleted");
|
124 |
+
}
|
125 |
+
|
126 |
+
$this->client->getLogger()->debug(
|
127 |
+
'File cache delete',
|
128 |
+
array('key' => $key, 'file' => $file)
|
129 |
+
);
|
130 |
+
}
|
131 |
+
|
132 |
+
private function getWriteableCacheFile($file)
|
133 |
+
{
|
134 |
+
return $this->getCacheFile($file, true);
|
135 |
+
}
|
136 |
+
|
137 |
+
private function getCacheFile($file, $forWrite = false)
|
138 |
+
{
|
139 |
+
return $this->getCacheDir($file, $forWrite) . '/' . md5($file);
|
140 |
+
}
|
141 |
+
|
142 |
+
private function getCacheDir($file, $forWrite)
|
143 |
+
{
|
144 |
+
// use the first 2 characters of the hash as a directory prefix
|
145 |
+
// this should prevent slowdowns due to huge directory listings
|
146 |
+
// and thus give some basic amount of scalability
|
147 |
+
$storageDir = $this->path . '/' . substr(md5($file), 0, 2);
|
148 |
+
if ($forWrite && ! is_dir($storageDir)) {
|
149 |
+
if (! mkdir($storageDir, 0700, true)) {
|
150 |
+
$this->client->getLogger()->error(
|
151 |
+
'File cache creation failed',
|
152 |
+
array('dir' => $storageDir)
|
153 |
+
);
|
154 |
+
throw new Google_Cache_Exception("Could not create storage directory: $storageDir");
|
155 |
+
}
|
156 |
+
}
|
157 |
+
return $storageDir;
|
158 |
+
}
|
159 |
+
|
160 |
+
private function acquireReadLock($storageFile)
|
161 |
+
{
|
162 |
+
return $this->acquireLock(LOCK_SH, $storageFile);
|
163 |
+
}
|
164 |
+
|
165 |
+
private function acquireWriteLock($storageFile)
|
166 |
+
{
|
167 |
+
$rc = $this->acquireLock(LOCK_EX, $storageFile);
|
168 |
+
if (!$rc) {
|
169 |
+
$this->client->getLogger()->notice(
|
170 |
+
'File cache write lock failed',
|
171 |
+
array('file' => $storageFile)
|
172 |
+
);
|
173 |
+
$this->delete($storageFile);
|
174 |
+
}
|
175 |
+
return $rc;
|
176 |
+
}
|
177 |
+
|
178 |
+
private function acquireLock($type, $storageFile)
|
179 |
+
{
|
180 |
+
$mode = $type == LOCK_EX ? "w" : "r";
|
181 |
+
$this->fh = fopen($storageFile, $mode);
|
182 |
+
if (!$this->fh) {
|
183 |
+
$this->client->getLogger()->error(
|
184 |
+
'Failed to open file during lock acquisition',
|
185 |
+
array('file' => $storageFile)
|
186 |
+
);
|
187 |
+
return false;
|
188 |
+
}
|
189 |
+
if ($type == LOCK_EX) {
|
190 |
+
chmod($storageFile, 0600);
|
191 |
+
}
|
192 |
+
$count = 0;
|
193 |
+
while (!flock($this->fh, $type | LOCK_NB)) {
|
194 |
+
// Sleep for 10ms.
|
195 |
+
usleep(10000);
|
196 |
+
if (++$count < self::MAX_LOCK_RETRIES) {
|
197 |
+
return false;
|
198 |
+
}
|
199 |
+
}
|
200 |
+
return true;
|
201 |
+
}
|
202 |
+
|
203 |
+
public function unlock($storageFile)
|
204 |
+
{
|
205 |
+
if ($this->fh) {
|
206 |
+
flock($this->fh, LOCK_UN);
|
207 |
+
}
|
208 |
+
}
|
209 |
+
}
|
app/api/Google/Cache/Memcache.php
CHANGED
@@ -1,184 +1,184 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2008 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* A persistent storage class based on the memcache, which is not
|
24 |
-
* really very persistent, as soon as you restart your memcache daemon
|
25 |
-
* the storage will be wiped.
|
26 |
-
*
|
27 |
-
* Will use either the memcache or memcached extensions, preferring
|
28 |
-
* memcached.
|
29 |
-
*
|
30 |
-
* @author Chris Chabot <chabotc@google.com>
|
31 |
-
*/
|
32 |
-
class Google_Cache_Memcache extends Google_Cache_Abstract
|
33 |
-
{
|
34 |
-
private $connection = false;
|
35 |
-
private $mc = false;
|
36 |
-
private $host;
|
37 |
-
private $port;
|
38 |
-
|
39 |
-
/**
|
40 |
-
* @var Google_Client the current client
|
41 |
-
*/
|
42 |
-
private $client;
|
43 |
-
|
44 |
-
public function __construct(Google_Client $client)
|
45 |
-
{
|
46 |
-
if (!function_exists('memcache_connect') && !class_exists("Memcached")) {
|
47 |
-
$error = "Memcache functions not available";
|
48 |
-
|
49 |
-
$client->getLogger()->error($error);
|
50 |
-
throw new Google_Cache_Exception($error);
|
51 |
-
}
|
52 |
-
|
53 |
-
$this->client = $client;
|
54 |
-
|
55 |
-
if ($client->isAppEngine()) {
|
56 |
-
// No credentials needed for GAE.
|
57 |
-
$this->mc = new Memcached();
|
58 |
-
$this->connection = true;
|
59 |
-
} else {
|
60 |
-
$this->host = $client->getClassConfig($this, 'host');
|
61 |
-
$this->port = $client->getClassConfig($this, 'port');
|
62 |
-
if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) {
|
63 |
-
$error = "You need to supply a valid memcache host and port";
|
64 |
-
|
65 |
-
$client->getLogger()->error($error);
|
66 |
-
throw new Google_Cache_Exception($error);
|
67 |
-
}
|
68 |
-
}
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* @inheritDoc
|
73 |
-
*/
|
74 |
-
public function get($key, $expiration = false)
|
75 |
-
{
|
76 |
-
$this->connect();
|
77 |
-
$ret = false;
|
78 |
-
if ($this->mc) {
|
79 |
-
$ret = $this->mc->get($key);
|
80 |
-
} else {
|
81 |
-
$ret = memcache_get($this->connection, $key);
|
82 |
-
}
|
83 |
-
if ($ret === false) {
|
84 |
-
$this->client->getLogger()->debug(
|
85 |
-
'Memcache cache miss',
|
86 |
-
array('key' => $key)
|
87 |
-
);
|
88 |
-
return false;
|
89 |
-
}
|
90 |
-
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
91 |
-
$this->client->getLogger()->debug(
|
92 |
-
'Memcache cache miss (expired)',
|
93 |
-
array('key' => $key, 'var' => $ret)
|
94 |
-
);
|
95 |
-
$this->delete($key);
|
96 |
-
return false;
|
97 |
-
}
|
98 |
-
|
99 |
-
$this->client->getLogger()->debug(
|
100 |
-
'Memcache cache hit',
|
101 |
-
array('key' => $key, 'var' => $ret)
|
102 |
-
);
|
103 |
-
|
104 |
-
return $ret['data'];
|
105 |
-
}
|
106 |
-
|
107 |
-
/**
|
108 |
-
* @inheritDoc
|
109 |
-
* @param string $key
|
110 |
-
* @param string $value
|
111 |
-
* @throws Google_Cache_Exception
|
112 |
-
*/
|
113 |
-
public function set($key, $value)
|
114 |
-
{
|
115 |
-
$this->connect();
|
116 |
-
// we store it with the cache_time default expiration so objects will at
|
117 |
-
// least get cleaned eventually.
|
118 |
-
$data = array('time' => time(), 'data' => $value);
|
119 |
-
$rc = false;
|
120 |
-
if ($this->mc) {
|
121 |
-
$rc = $this->mc->set($key, $data);
|
122 |
-
} else {
|
123 |
-
$rc = memcache_set($this->connection, $key, $data, false);
|
124 |
-
}
|
125 |
-
if ($rc == false) {
|
126 |
-
$this->client->getLogger()->error(
|
127 |
-
'Memcache cache set failed',
|
128 |
-
array('key' => $key, 'var' => $data)
|
129 |
-
);
|
130 |
-
|
131 |
-
throw new Google_Cache_Exception("Couldn't store data in cache");
|
132 |
-
}
|
133 |
-
|
134 |
-
$this->client->getLogger()->debug(
|
135 |
-
'Memcache cache set',
|
136 |
-
array('key' => $key, 'var' => $data)
|
137 |
-
);
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* @inheritDoc
|
142 |
-
* @param String $key
|
143 |
-
*/
|
144 |
-
public function delete($key)
|
145 |
-
{
|
146 |
-
$this->connect();
|
147 |
-
if ($this->mc) {
|
148 |
-
$this->mc->delete($key, 0);
|
149 |
-
} else {
|
150 |
-
memcache_delete($this->connection, $key, 0);
|
151 |
-
}
|
152 |
-
|
153 |
-
$this->client->getLogger()->debug(
|
154 |
-
'Memcache cache delete',
|
155 |
-
array('key' => $key)
|
156 |
-
);
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Lazy initialiser for memcache connection. Uses pconnect for to take
|
161 |
-
* advantage of the persistence pool where possible.
|
162 |
-
*/
|
163 |
-
private function connect()
|
164 |
-
{
|
165 |
-
if ($this->connection) {
|
166 |
-
return;
|
167 |
-
}
|
168 |
-
|
169 |
-
if (class_exists("Memcached")) {
|
170 |
-
$this->mc = new Memcached();
|
171 |
-
$this->mc->addServer($this->host, $this->port);
|
172 |
-
$this->connection = true;
|
173 |
-
} else {
|
174 |
-
$this->connection = memcache_pconnect($this->host, $this->port);
|
175 |
-
}
|
176 |
-
|
177 |
-
if (! $this->connection) {
|
178 |
-
$error = "Couldn't connect to memcache server";
|
179 |
-
|
180 |
-
$this->client->getLogger()->error($error);
|
181 |
-
throw new Google_Cache_Exception($error);
|
182 |
-
}
|
183 |
-
}
|
184 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2008 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* A persistent storage class based on the memcache, which is not
|
24 |
+
* really very persistent, as soon as you restart your memcache daemon
|
25 |
+
* the storage will be wiped.
|
26 |
+
*
|
27 |
+
* Will use either the memcache or memcached extensions, preferring
|
28 |
+
* memcached.
|
29 |
+
*
|
30 |
+
* @author Chris Chabot <chabotc@google.com>
|
31 |
+
*/
|
32 |
+
class Google_Cache_Memcache extends Google_Cache_Abstract
|
33 |
+
{
|
34 |
+
private $connection = false;
|
35 |
+
private $mc = false;
|
36 |
+
private $host;
|
37 |
+
private $port;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @var Google_Client the current client
|
41 |
+
*/
|
42 |
+
private $client;
|
43 |
+
|
44 |
+
public function __construct(Google_Client $client)
|
45 |
+
{
|
46 |
+
if (!function_exists('memcache_connect') && !class_exists("Memcached")) {
|
47 |
+
$error = "Memcache functions not available";
|
48 |
+
|
49 |
+
$client->getLogger()->error($error);
|
50 |
+
throw new Google_Cache_Exception($error);
|
51 |
+
}
|
52 |
+
|
53 |
+
$this->client = $client;
|
54 |
+
|
55 |
+
if ($client->isAppEngine()) {
|
56 |
+
// No credentials needed for GAE.
|
57 |
+
$this->mc = new Memcached();
|
58 |
+
$this->connection = true;
|
59 |
+
} else {
|
60 |
+
$this->host = $client->getClassConfig($this, 'host');
|
61 |
+
$this->port = $client->getClassConfig($this, 'port');
|
62 |
+
if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) {
|
63 |
+
$error = "You need to supply a valid memcache host and port";
|
64 |
+
|
65 |
+
$client->getLogger()->error($error);
|
66 |
+
throw new Google_Cache_Exception($error);
|
67 |
+
}
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @inheritDoc
|
73 |
+
*/
|
74 |
+
public function get($key, $expiration = false)
|
75 |
+
{
|
76 |
+
$this->connect();
|
77 |
+
$ret = false;
|
78 |
+
if ($this->mc) {
|
79 |
+
$ret = $this->mc->get($key);
|
80 |
+
} else {
|
81 |
+
$ret = memcache_get($this->connection, $key);
|
82 |
+
}
|
83 |
+
if ($ret === false) {
|
84 |
+
$this->client->getLogger()->debug(
|
85 |
+
'Memcache cache miss',
|
86 |
+
array('key' => $key)
|
87 |
+
);
|
88 |
+
return false;
|
89 |
+
}
|
90 |
+
if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) {
|
91 |
+
$this->client->getLogger()->debug(
|
92 |
+
'Memcache cache miss (expired)',
|
93 |
+
array('key' => $key, 'var' => $ret)
|
94 |
+
);
|
95 |
+
$this->delete($key);
|
96 |
+
return false;
|
97 |
+
}
|
98 |
+
|
99 |
+
$this->client->getLogger()->debug(
|
100 |
+
'Memcache cache hit',
|
101 |
+
array('key' => $key, 'var' => $ret)
|
102 |
+
);
|
103 |
+
|
104 |
+
return $ret['data'];
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @inheritDoc
|
109 |
+
* @param string $key
|
110 |
+
* @param string $value
|
111 |
+
* @throws Google_Cache_Exception
|
112 |
+
*/
|
113 |
+
public function set($key, $value)
|
114 |
+
{
|
115 |
+
$this->connect();
|
116 |
+
// we store it with the cache_time default expiration so objects will at
|
117 |
+
// least get cleaned eventually.
|
118 |
+
$data = array('time' => time(), 'data' => $value);
|
119 |
+
$rc = false;
|
120 |
+
if ($this->mc) {
|
121 |
+
$rc = $this->mc->set($key, $data);
|
122 |
+
} else {
|
123 |
+
$rc = memcache_set($this->connection, $key, $data, false);
|
124 |
+
}
|
125 |
+
if ($rc == false) {
|
126 |
+
$this->client->getLogger()->error(
|
127 |
+
'Memcache cache set failed',
|
128 |
+
array('key' => $key, 'var' => $data)
|
129 |
+
);
|
130 |
+
|
131 |
+
throw new Google_Cache_Exception("Couldn't store data in cache");
|
132 |
+
}
|
133 |
+
|
134 |
+
$this->client->getLogger()->debug(
|
135 |
+
'Memcache cache set',
|
136 |
+
array('key' => $key, 'var' => $data)
|
137 |
+
);
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* @inheritDoc
|
142 |
+
* @param String $key
|
143 |
+
*/
|
144 |
+
public function delete($key)
|
145 |
+
{
|
146 |
+
$this->connect();
|
147 |
+
if ($this->mc) {
|
148 |
+
$this->mc->delete($key, 0);
|
149 |
+
} else {
|
150 |
+
memcache_delete($this->connection, $key, 0);
|
151 |
+
}
|
152 |
+
|
153 |
+
$this->client->getLogger()->debug(
|
154 |
+
'Memcache cache delete',
|
155 |
+
array('key' => $key)
|
156 |
+
);
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Lazy initialiser for memcache connection. Uses pconnect for to take
|
161 |
+
* advantage of the persistence pool where possible.
|
162 |
+
*/
|
163 |
+
private function connect()
|
164 |
+
{
|
165 |
+
if ($this->connection) {
|
166 |
+
return;
|
167 |
+
}
|
168 |
+
|
169 |
+
if (class_exists("Memcached")) {
|
170 |
+
$this->mc = new Memcached();
|
171 |
+
$this->mc->addServer($this->host, $this->port);
|
172 |
+
$this->connection = true;
|
173 |
+
} else {
|
174 |
+
$this->connection = memcache_pconnect($this->host, $this->port);
|
175 |
+
}
|
176 |
+
|
177 |
+
if (! $this->connection) {
|
178 |
+
$error = "Couldn't connect to memcache server";
|
179 |
+
|
180 |
+
$this->client->getLogger()->error($error);
|
181 |
+
throw new Google_Cache_Exception($error);
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}
|
app/api/Google/Cache/Null.php
CHANGED
@@ -1,57 +1,57 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* A blank storage class, for cases where caching is not
|
24 |
-
* required.
|
25 |
-
*/
|
26 |
-
class Google_Cache_Null extends Google_Cache_Abstract
|
27 |
-
{
|
28 |
-
public function __construct(Google_Client $client)
|
29 |
-
{
|
30 |
-
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* @inheritDoc
|
35 |
-
*/
|
36 |
-
public function get($key, $expiration = false)
|
37 |
-
{
|
38 |
-
return false;
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* @inheritDoc
|
43 |
-
*/
|
44 |
-
public function set($key, $value)
|
45 |
-
{
|
46 |
-
// Nop.
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* @inheritDoc
|
51 |
-
* @param String $key
|
52 |
-
*/
|
53 |
-
public function delete($key)
|
54 |
-
{
|
55 |
-
// Nop.
|
56 |
-
}
|
57 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* A blank storage class, for cases where caching is not
|
24 |
+
* required.
|
25 |
+
*/
|
26 |
+
class Google_Cache_Null extends Google_Cache_Abstract
|
27 |
+
{
|
28 |
+
public function __construct(Google_Client $client)
|
29 |
+
{
|
30 |
+
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @inheritDoc
|
35 |
+
*/
|
36 |
+
public function get($key, $expiration = false)
|
37 |
+
{
|
38 |
+
return false;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @inheritDoc
|
43 |
+
*/
|
44 |
+
public function set($key, $value)
|
45 |
+
{
|
46 |
+
// Nop.
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @inheritDoc
|
51 |
+
* @param String $key
|
52 |
+
*/
|
53 |
+
public function delete($key)
|
54 |
+
{
|
55 |
+
// Nop.
|
56 |
+
}
|
57 |
+
}
|
app/api/Google/Client.php
CHANGED
@@ -1,715 +1,715 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* The Google API Client
|
24 |
-
* https://github.com/google/google-api-php-client
|
25 |
-
*/
|
26 |
-
class Google_Client
|
27 |
-
{
|
28 |
-
const LIBVER = "1.1.5";
|
29 |
-
const USER_AGENT_SUFFIX = "google-api-php-client/";
|
30 |
-
/**
|
31 |
-
* @var Google_Auth_Abstract $auth
|
32 |
-
*/
|
33 |
-
private $auth;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @var Google_IO_Abstract $io
|
37 |
-
*/
|
38 |
-
private $io;
|
39 |
-
|
40 |
-
/**
|
41 |
-
* @var Google_Cache_Abstract $cache
|
42 |
-
*/
|
43 |
-
private $cache;
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @var Google_Config $config
|
47 |
-
*/
|
48 |
-
private $config;
|
49 |
-
|
50 |
-
/**
|
51 |
-
* @var Google_Logger_Abstract $logger
|
52 |
-
*/
|
53 |
-
private $logger;
|
54 |
-
|
55 |
-
/**
|
56 |
-
* @var boolean $deferExecution
|
57 |
-
*/
|
58 |
-
private $deferExecution = false;
|
59 |
-
|
60 |
-
/** @var array $scopes */
|
61 |
-
// Scopes requested by the client
|
62 |
-
protected $requestedScopes = array();
|
63 |
-
|
64 |
-
// definitions of services that are discovered.
|
65 |
-
protected $services = array();
|
66 |
-
|
67 |
-
// Used to track authenticated state, can't discover services after doing authenticate()
|
68 |
-
private $authenticated = false;
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Construct the Google Client.
|
72 |
-
*
|
73 |
-
* @param $config Google_Config or string for the ini file to load
|
74 |
-
*/
|
75 |
-
public function __construct($config = null)
|
76 |
-
{
|
77 |
-
if (is_string($config) && strlen($config)) {
|
78 |
-
$config = new Google_Config($config);
|
79 |
-
} else if ( !($config instanceof Google_Config)) {
|
80 |
-
$config = new Google_Config();
|
81 |
-
|
82 |
-
if ($this->isAppEngine()) {
|
83 |
-
// Automatically use Memcache if we're in AppEngine.
|
84 |
-
$config->setCacheClass('Google_Cache_Memcache');
|
85 |
-
}
|
86 |
-
|
87 |
-
if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) {
|
88 |
-
// Automatically disable compress.zlib, as currently unsupported.
|
89 |
-
$config->setClassConfig('Google_Http_Request', 'disable_gzip', true);
|
90 |
-
}
|
91 |
-
}
|
92 |
-
|
93 |
-
if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) {
|
94 |
-
if (function_exists('curl_version') && function_exists('curl_exec')
|
95 |
-
&& !$this->isAppEngine()) {
|
96 |
-
$config->setIoClass("Google_IO_Curl");
|
97 |
-
} else {
|
98 |
-
$config->setIoClass("Google_IO_Stream");
|
99 |
-
}
|
100 |
-
}
|
101 |
-
|
102 |
-
$this->config = $config;
|
103 |
-
}
|
104 |
-
|
105 |
-
/**
|
106 |
-
* Get a string containing the version of the library.
|
107 |
-
*
|
108 |
-
* @return string
|
109 |
-
*/
|
110 |
-
public function getLibraryVersion()
|
111 |
-
{
|
112 |
-
return self::LIBVER;
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* Attempt to exchange a code for an valid authentication token.
|
117 |
-
* If $crossClient is set to true, the request body will not include
|
118 |
-
* the request_uri argument
|
119 |
-
* Helper wrapped around the OAuth 2.0 implementation.
|
120 |
-
*
|
121 |
-
* @param $code string code from accounts.google.com
|
122 |
-
* @param $crossClient boolean, whether this is a cross-client authentication
|
123 |
-
* @return string token
|
124 |
-
*/
|
125 |
-
public function authenticate($code, $crossClient = false)
|
126 |
-
{
|
127 |
-
$this->authenticated = true;
|
128 |
-
return $this->getAuth()->authenticate($code, $crossClient);
|
129 |
-
}
|
130 |
-
|
131 |
-
/**
|
132 |
-
* Loads a service account key and parameters from a JSON
|
133 |
-
* file from the Google Developer Console. Uses that and the
|
134 |
-
* given array of scopes to return an assertion credential for
|
135 |
-
* use with refreshTokenWithAssertionCredential.
|
136 |
-
*
|
137 |
-
* @param string $jsonLocation File location of the project-key.json.
|
138 |
-
* @param array $scopes The scopes to assert.
|
139 |
-
* @return Google_Auth_AssertionCredentials.
|
140 |
-
* @
|
141 |
-
*/
|
142 |
-
public function loadServiceAccountJson($jsonLocation, $scopes)
|
143 |
-
{
|
144 |
-
$data = json_decode(file_get_contents($jsonLocation));
|
145 |
-
if (isset($data->type) && $data->type == 'service_account') {
|
146 |
-
// Service Account format.
|
147 |
-
$cred = new Google_Auth_AssertionCredentials(
|
148 |
-
$data->client_email,
|
149 |
-
$scopes,
|
150 |
-
$data->private_key
|
151 |
-
);
|
152 |
-
return $cred;
|
153 |
-
} else {
|
154 |
-
throw new Google_Exception("Invalid service account JSON file.");
|
155 |
-
}
|
156 |
-
}
|
157 |
-
|
158 |
-
/**
|
159 |
-
* Set the auth config from the JSON string provided.
|
160 |
-
* This structure should match the file downloaded from
|
161 |
-
* the "Download JSON" button on in the Google Developer
|
162 |
-
* Console.
|
163 |
-
* @param string $json the configuration json
|
164 |
-
* @throws Google_Exception
|
165 |
-
*/
|
166 |
-
public function setAuthConfig($json)
|
167 |
-
{
|
168 |
-
$data = json_decode($json);
|
169 |
-
$key = isset($data->installed) ? 'installed' : 'web';
|
170 |
-
if (!isset($data->$key)) {
|
171 |
-
throw new Google_Exception("Invalid client secret JSON file.");
|
172 |
-
}
|
173 |
-
$this->setClientId($data->$key->client_id);
|
174 |
-
$this->setClientSecret($data->$key->client_secret);
|
175 |
-
if (isset($data->$key->redirect_uris)) {
|
176 |
-
$this->setRedirectUri($data->$key->redirect_uris[0]);
|
177 |
-
}
|
178 |
-
}
|
179 |
-
|
180 |
-
/**
|
181 |
-
* Set the auth config from the JSON file in the path
|
182 |
-
* provided. This should match the file downloaded from
|
183 |
-
* the "Download JSON" button on in the Google Developer
|
184 |
-
* Console.
|
185 |
-
* @param string $file the file location of the client json
|
186 |
-
*/
|
187 |
-
public function setAuthConfigFile($file)
|
188 |
-
{
|
189 |
-
$this->setAuthConfig(file_get_contents($file));
|
190 |
-
}
|
191 |
-
|
192 |
-
/**
|
193 |
-
* @throws Google_Auth_Exception
|
194 |
-
* @return array
|
195 |
-
* @visible For Testing
|
196 |
-
*/
|
197 |
-
public function prepareScopes()
|
198 |
-
{
|
199 |
-
if (empty($this->requestedScopes)) {
|
200 |
-
throw new Google_Auth_Exception("No scopes specified");
|
201 |
-
}
|
202 |
-
$scopes = implode(' ', $this->requestedScopes);
|
203 |
-
return $scopes;
|
204 |
-
}
|
205 |
-
|
206 |
-
/**
|
207 |
-
* Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl()
|
208 |
-
* or Google_Client#getAccessToken().
|
209 |
-
* @param string $accessToken JSON encoded string containing in the following format:
|
210 |
-
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
211 |
-
* "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
|
212 |
-
*/
|
213 |
-
public function setAccessToken($accessToken)
|
214 |
-
{
|
215 |
-
if ($accessToken == 'null') {
|
216 |
-
$accessToken = null;
|
217 |
-
}
|
218 |
-
$this->getAuth()->setAccessToken($accessToken);
|
219 |
-
}
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
/**
|
224 |
-
* Set the authenticator object
|
225 |
-
* @param Google_Auth_Abstract $auth
|
226 |
-
*/
|
227 |
-
public function setAuth(Google_Auth_Abstract $auth)
|
228 |
-
{
|
229 |
-
$this->config->setAuthClass(get_class($auth));
|
230 |
-
$this->auth = $auth;
|
231 |
-
}
|
232 |
-
|
233 |
-
/**
|
234 |
-
* Set the IO object
|
235 |
-
* @param Google_IO_Abstract $io
|
236 |
-
*/
|
237 |
-
public function setIo(Google_IO_Abstract $io)
|
238 |
-
{
|
239 |
-
$this->config->setIoClass(get_class($io));
|
240 |
-
$this->io = $io;
|
241 |
-
}
|
242 |
-
|
243 |
-
/**
|
244 |
-
* Set the Cache object
|
245 |
-
* @param Google_Cache_Abstract $cache
|
246 |
-
*/
|
247 |
-
public function setCache(Google_Cache_Abstract $cache)
|
248 |
-
{
|
249 |
-
$this->config->setCacheClass(get_class($cache));
|
250 |
-
$this->cache = $cache;
|
251 |
-
}
|
252 |
-
|
253 |
-
/**
|
254 |
-
* Set the Logger object
|
255 |
-
* @param Google_Logger_Abstract $logger
|
256 |
-
*/
|
257 |
-
public function setLogger(Google_Logger_Abstract $logger)
|
258 |
-
{
|
259 |
-
$this->config->setLoggerClass(get_class($logger));
|
260 |
-
$this->logger = $logger;
|
261 |
-
}
|
262 |
-
|
263 |
-
/**
|
264 |
-
* Construct the OAuth 2.0 authorization request URI.
|
265 |
-
* @return string
|
266 |
-
*/
|
267 |
-
public function createAuthUrl()
|
268 |
-
{
|
269 |
-
$scopes = $this->prepareScopes();
|
270 |
-
return $this->getAuth()->createAuthUrl($scopes);
|
271 |
-
}
|
272 |
-
|
273 |
-
/**
|
274 |
-
* Get the OAuth 2.0 access token.
|
275 |
-
* @return string $accessToken JSON encoded string in the following format:
|
276 |
-
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
277 |
-
* "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
|
278 |
-
*/
|
279 |
-
public function getAccessToken()
|
280 |
-
{
|
281 |
-
$token = $this->getAuth()->getAccessToken();
|
282 |
-
// The response is json encoded, so could be the string null.
|
283 |
-
// It is arguable whether this check should be here or lower
|
284 |
-
// in the library.
|
285 |
-
return (null == $token || 'null' == $token || '[]' == $token) ? null : $token;
|
286 |
-
}
|
287 |
-
|
288 |
-
/**
|
289 |
-
* Get the OAuth 2.0 refresh token.
|
290 |
-
* @return string $refreshToken refresh token or null if not available
|
291 |
-
*/
|
292 |
-
public function getRefreshToken()
|
293 |
-
{
|
294 |
-
return $this->getAuth()->getRefreshToken();
|
295 |
-
}
|
296 |
-
|
297 |
-
/**
|
298 |
-
* Returns if the access_token is expired.
|
299 |
-
* @return bool Returns True if the access_token is expired.
|
300 |
-
*/
|
301 |
-
public function isAccessTokenExpired()
|
302 |
-
{
|
303 |
-
return $this->getAuth()->isAccessTokenExpired();
|
304 |
-
}
|
305 |
-
|
306 |
-
/**
|
307 |
-
* Set OAuth 2.0 "state" parameter to achieve per-request customization.
|
308 |
-
* @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
|
309 |
-
* @param string $state
|
310 |
-
*/
|
311 |
-
public function setState($state)
|
312 |
-
{
|
313 |
-
$this->getAuth()->setState($state);
|
314 |
-
}
|
315 |
-
|
316 |
-
/**
|
317 |
-
* @param string $accessType Possible values for access_type include:
|
318 |
-
* {@code "offline"} to request offline access from the user.
|
319 |
-
* {@code "online"} to request online access from the user.
|
320 |
-
*/
|
321 |
-
public function setAccessType($accessType)
|
322 |
-
{
|
323 |
-
$this->config->setAccessType($accessType);
|
324 |
-
}
|
325 |
-
|
326 |
-
/**
|
327 |
-
* @param string $approvalPrompt Possible values for approval_prompt include:
|
328 |
-
* {@code "force"} to force the approval UI to appear. (This is the default value)
|
329 |
-
* {@code "auto"} to request auto-approval when possible.
|
330 |
-
*/
|
331 |
-
public function setApprovalPrompt($approvalPrompt)
|
332 |
-
{
|
333 |
-
$this->config->setApprovalPrompt($approvalPrompt);
|
334 |
-
}
|
335 |
-
|
336 |
-
/**
|
337 |
-
* Set the login hint, email address or sub id.
|
338 |
-
* @param string $loginHint
|
339 |
-
*/
|
340 |
-
public function setLoginHint($loginHint)
|
341 |
-
{
|
342 |
-
$this->config->setLoginHint($loginHint);
|
343 |
-
}
|
344 |
-
|
345 |
-
/**
|
346 |
-
* Set the application name, this is included in the User-Agent HTTP header.
|
347 |
-
* @param string $applicationName
|
348 |
-
*/
|
349 |
-
public function setApplicationName($applicationName)
|
350 |
-
{
|
351 |
-
$this->config->setApplicationName($applicationName);
|
352 |
-
}
|
353 |
-
|
354 |
-
/**
|
355 |
-
* Set the OAuth 2.0 Client ID.
|
356 |
-
* @param string $clientId
|
357 |
-
*/
|
358 |
-
public function setClientId($clientId)
|
359 |
-
{
|
360 |
-
$this->config->setClientId($clientId);
|
361 |
-
}
|
362 |
-
|
363 |
-
/**
|
364 |
-
* Set the OAuth 2.0 Client Secret.
|
365 |
-
* @param string $clientSecret
|
366 |
-
*/
|
367 |
-
public function setClientSecret($clientSecret)
|
368 |
-
{
|
369 |
-
$this->config->setClientSecret($clientSecret);
|
370 |
-
}
|
371 |
-
|
372 |
-
/**
|
373 |
-
* Set the OAuth 2.0 Redirect URI.
|
374 |
-
* @param string $redirectUri
|
375 |
-
*/
|
376 |
-
public function setRedirectUri($redirectUri)
|
377 |
-
{
|
378 |
-
$this->config->setRedirectUri($redirectUri);
|
379 |
-
}
|
380 |
-
|
381 |
-
/**
|
382 |
-
* If 'plus.login' is included in the list of requested scopes, you can use
|
383 |
-
* this method to define types of app activities that your app will write.
|
384 |
-
* You can find a list of available types here:
|
385 |
-
* @link https://developers.google.com/+/api/moment-types
|
386 |
-
*
|
387 |
-
* @param array $requestVisibleActions Array of app activity types
|
388 |
-
*/
|
389 |
-
public function setRequestVisibleActions($requestVisibleActions)
|
390 |
-
{
|
391 |
-
if (is_array($requestVisibleActions)) {
|
392 |
-
$requestVisibleActions = join(" ", $requestVisibleActions);
|
393 |
-
}
|
394 |
-
$this->config->setRequestVisibleActions($requestVisibleActions);
|
395 |
-
}
|
396 |
-
|
397 |
-
/**
|
398 |
-
* Set the developer key to use, these are obtained through the API Console.
|
399 |
-
* @see http://code.google.com/apis/console-help/#generatingdevkeys
|
400 |
-
* @param string $developerKey
|
401 |
-
*/
|
402 |
-
public function setDeveloperKey($developerKey)
|
403 |
-
{
|
404 |
-
$this->config->setDeveloperKey($developerKey);
|
405 |
-
}
|
406 |
-
|
407 |
-
/**
|
408 |
-
* Set the hd (hosted domain) parameter streamlines the login process for
|
409 |
-
* Google Apps hosted accounts. By including the domain of the user, you
|
410 |
-
* restrict sign-in to accounts at that domain.
|
411 |
-
* @param $hd string - the domain to use.
|
412 |
-
*/
|
413 |
-
public function setHostedDomain($hd)
|
414 |
-
{
|
415 |
-
$this->config->setHostedDomain($hd);
|
416 |
-
}
|
417 |
-
|
418 |
-
/**
|
419 |
-
* Set the prompt hint. Valid values are none, consent and select_account.
|
420 |
-
* If no value is specified and the user has not previously authorized
|
421 |
-
* access, then the user is shown a consent screen.
|
422 |
-
* @param $prompt string
|
423 |
-
*/
|
424 |
-
public function setPrompt($prompt)
|
425 |
-
{
|
426 |
-
$this->config->setPrompt($prompt);
|
427 |
-
}
|
428 |
-
|
429 |
-
/**
|
430 |
-
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
431 |
-
* 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
|
432 |
-
* an authentication request is valid.
|
433 |
-
* @param $realm string - the URL-space to use.
|
434 |
-
*/
|
435 |
-
public function setOpenidRealm($realm)
|
436 |
-
{
|
437 |
-
$this->config->setOpenidRealm($realm);
|
438 |
-
}
|
439 |
-
|
440 |
-
/**
|
441 |
-
* If this is provided with the value true, and the authorization request is
|
442 |
-
* granted, the authorization will include any previous authorizations
|
443 |
-
* granted to this user/application combination for other scopes.
|
444 |
-
* @param $include boolean - the URL-space to use.
|
445 |
-
*/
|
446 |
-
public function setIncludeGrantedScopes($include)
|
447 |
-
{
|
448 |
-
$this->config->setIncludeGrantedScopes($include);
|
449 |
-
}
|
450 |
-
|
451 |
-
/**
|
452 |
-
* Fetches a fresh OAuth 2.0 access token with the given refresh token.
|
453 |
-
* @param string $refreshToken
|
454 |
-
*/
|
455 |
-
public function refreshToken($refreshToken)
|
456 |
-
{
|
457 |
-
$this->getAuth()->refreshToken($refreshToken);
|
458 |
-
}
|
459 |
-
|
460 |
-
/**
|
461 |
-
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
462 |
-
* token, if a token isn't provided.
|
463 |
-
* @throws Google_Auth_Exception
|
464 |
-
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
465 |
-
* @return boolean Returns True if the revocation was successful, otherwise False.
|
466 |
-
*/
|
467 |
-
public function revokeToken($token = null)
|
468 |
-
{
|
469 |
-
return $this->getAuth()->revokeToken($token);
|
470 |
-
}
|
471 |
-
|
472 |
-
/**
|
473 |
-
* Verify an id_token. This method will verify the current id_token, if one
|
474 |
-
* isn't provided.
|
475 |
-
* @throws Google_Auth_Exception
|
476 |
-
* @param string|null $token The token (id_token) that should be verified.
|
477 |
-
* @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was
|
478 |
-
* successful.
|
479 |
-
*/
|
480 |
-
public function verifyIdToken($token = null)
|
481 |
-
{
|
482 |
-
return $this->getAuth()->verifyIdToken($token);
|
483 |
-
}
|
484 |
-
|
485 |
-
/**
|
486 |
-
* Verify a JWT that was signed with your own certificates.
|
487 |
-
*
|
488 |
-
* @param $id_token string The JWT token
|
489 |
-
* @param $cert_location array of certificates
|
490 |
-
* @param $audience string the expected consumer of the token
|
491 |
-
* @param $issuer string the expected issuer, defaults to Google
|
492 |
-
* @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
493 |
-
* @return mixed token information if valid, false if not
|
494 |
-
*/
|
495 |
-
public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null)
|
496 |
-
{
|
497 |
-
$auth = new Google_Auth_OAuth2($this);
|
498 |
-
$certs = $auth->retrieveCertsFromLocation($cert_location);
|
499 |
-
return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry);
|
500 |
-
}
|
501 |
-
|
502 |
-
/**
|
503 |
-
* @param $creds Google_Auth_AssertionCredentials
|
504 |
-
*/
|
505 |
-
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
506 |
-
{
|
507 |
-
$this->getAuth()->setAssertionCredentials($creds);
|
508 |
-
}
|
509 |
-
|
510 |
-
/**
|
511 |
-
* Set the scopes to be requested. Must be called before createAuthUrl().
|
512 |
-
* Will remove any previously configured scopes.
|
513 |
-
* @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login',
|
514 |
-
* 'https://www.googleapis.com/auth/moderator')
|
515 |
-
*/
|
516 |
-
public function setScopes($scopes)
|
517 |
-
{
|
518 |
-
$this->requestedScopes = array();
|
519 |
-
$this->addScope($scopes);
|
520 |
-
}
|
521 |
-
|
522 |
-
/**
|
523 |
-
* This functions adds a scope to be requested as part of the OAuth2.0 flow.
|
524 |
-
* Will append any scopes not previously requested to the scope parameter.
|
525 |
-
* A single string will be treated as a scope to request. An array of strings
|
526 |
-
* will each be appended.
|
527 |
-
* @param $scope_or_scopes string|array e.g. "profile"
|
528 |
-
*/
|
529 |
-
public function addScope($scope_or_scopes)
|
530 |
-
{
|
531 |
-
if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) {
|
532 |
-
$this->requestedScopes[] = $scope_or_scopes;
|
533 |
-
} else if (is_array($scope_or_scopes)) {
|
534 |
-
foreach ($scope_or_scopes as $scope) {
|
535 |
-
$this->addScope($scope);
|
536 |
-
}
|
537 |
-
}
|
538 |
-
}
|
539 |
-
|
540 |
-
/**
|
541 |
-
* Returns the list of scopes requested by the client
|
542 |
-
* @return array the list of scopes
|
543 |
-
*
|
544 |
-
*/
|
545 |
-
public function getScopes()
|
546 |
-
{
|
547 |
-
return $this->requestedScopes;
|
548 |
-
}
|
549 |
-
|
550 |
-
/**
|
551 |
-
* Declare whether batch calls should be used. This may increase throughput
|
552 |
-
* by making multiple requests in one connection.
|
553 |
-
*
|
554 |
-
* @param boolean $useBatch True if the batch support should
|
555 |
-
* be enabled. Defaults to False.
|
556 |
-
*/
|
557 |
-
public function setUseBatch($useBatch)
|
558 |
-
{
|
559 |
-
// This is actually an alias for setDefer.
|
560 |
-
$this->setDefer($useBatch);
|
561 |
-
}
|
562 |
-
|
563 |
-
/**
|
564 |
-
* Declare whether making API calls should make the call immediately, or
|
565 |
-
* return a request which can be called with ->execute();
|
566 |
-
*
|
567 |
-
* @param boolean $defer True if calls should not be executed right away.
|
568 |
-
*/
|
569 |
-
public function setDefer($defer)
|
570 |
-
{
|
571 |
-
$this->deferExecution = $defer;
|
572 |
-
}
|
573 |
-
|
574 |
-
/**
|
575 |
-
* Helper method to execute deferred HTTP requests.
|
576 |
-
*
|
577 |
-
* @param $request Google_Http_Request|Google_Http_Batch
|
578 |
-
* @throws Google_Exception
|
579 |
-
* @return object of the type of the expected class or array.
|
580 |
-
*/
|
581 |
-
public function execute($request)
|
582 |
-
{
|
583 |
-
if ($request instanceof Google_Http_Request) {
|
584 |
-
$request->setUserAgent(
|
585 |
-
$this->getApplicationName()
|
586 |
-
. " " . self::USER_AGENT_SUFFIX
|
587 |
-
. $this->getLibraryVersion()
|
588 |
-
);
|
589 |
-
if (!$this->getClassConfig("Google_Http_Request", "disable_gzip")) {
|
590 |
-
$request->enableGzip();
|
591 |
-
}
|
592 |
-
$request->maybeMoveParametersToBody();
|
593 |
-
return Google_Http_REST::execute($this, $request);
|
594 |
-
} else if ($request instanceof Google_Http_Batch) {
|
595 |
-
return $request->execute();
|
596 |
-
} else {
|
597 |
-
throw new Google_Exception("Do not know how to execute this type of object.");
|
598 |
-
}
|
599 |
-
}
|
600 |
-
|
601 |
-
/**
|
602 |
-
* Whether or not to return raw requests
|
603 |
-
* @return boolean
|
604 |
-
*/
|
605 |
-
public function shouldDefer()
|
606 |
-
{
|
607 |
-
return $this->deferExecution;
|
608 |
-
}
|
609 |
-
|
610 |
-
/**
|
611 |
-
* @return Google_Auth_Abstract Authentication implementation
|
612 |
-
*/
|
613 |
-
public function getAuth()
|
614 |
-
{
|
615 |
-
if (!isset($this->auth)) {
|
616 |
-
$class = $this->config->getAuthClass();
|
617 |
-
$this->auth = new $class($this);
|
618 |
-
}
|
619 |
-
return $this->auth;
|
620 |
-
}
|
621 |
-
|
622 |
-
/**
|
623 |
-
* @return Google_IO_Abstract IO implementation
|
624 |
-
*/
|
625 |
-
public function getIo()
|
626 |
-
{
|
627 |
-
if (!isset($this->io)) {
|
628 |
-
$class = $this->config->getIoClass();
|
629 |
-
$this->io = new $class($this);
|
630 |
-
}
|
631 |
-
return $this->io;
|
632 |
-
}
|
633 |
-
|
634 |
-
/**
|
635 |
-
* @return Google_Cache_Abstract Cache implementation
|
636 |
-
*/
|
637 |
-
public function getCache()
|
638 |
-
{
|
639 |
-
if (!isset($this->cache)) {
|
640 |
-
$class = $this->config->getCacheClass();
|
641 |
-
$this->cache = new $class($this);
|
642 |
-
}
|
643 |
-
return $this->cache;
|
644 |
-
}
|
645 |
-
|
646 |
-
/**
|
647 |
-
* @return Google_Logger_Abstract Logger implementation
|
648 |
-
*/
|
649 |
-
public function getLogger()
|
650 |
-
{
|
651 |
-
if (!isset($this->logger)) {
|
652 |
-
$class = $this->config->getLoggerClass();
|
653 |
-
$this->logger = new $class($this);
|
654 |
-
}
|
655 |
-
return $this->logger;
|
656 |
-
}
|
657 |
-
|
658 |
-
/**
|
659 |
-
* Retrieve custom configuration for a specific class.
|
660 |
-
* @param $class string|object - class or instance of class to retrieve
|
661 |
-
* @param $key string optional - key to retrieve
|
662 |
-
* @return array
|
663 |
-
*/
|
664 |
-
public function getClassConfig($class, $key = null)
|
665 |
-
{
|
666 |
-
if (!is_string($class)) {
|
667 |
-
$class = get_class($class);
|
668 |
-
}
|
669 |
-
return $this->config->getClassConfig($class, $key);
|
670 |
-
}
|
671 |
-
|
672 |
-
/**
|
673 |
-
* Set configuration specific to a given class.
|
674 |
-
* $config->setClassConfig('Google_Cache_File',
|
675 |
-
* array('directory' => '/tmp/cache'));
|
676 |
-
* @param $class string|object - The class name for the configuration
|
677 |
-
* @param $config string key or an array of configuration values
|
678 |
-
* @param $value string optional - if $config is a key, the value
|
679 |
-
*
|
680 |
-
*/
|
681 |
-
public function setClassConfig($class, $config, $value = null)
|
682 |
-
{
|
683 |
-
if (!is_string($class)) {
|
684 |
-
$class = get_class($class);
|
685 |
-
}
|
686 |
-
$this->config->setClassConfig($class, $config, $value);
|
687 |
-
|
688 |
-
}
|
689 |
-
|
690 |
-
/**
|
691 |
-
* @return string the base URL to use for calls to the APIs
|
692 |
-
*/
|
693 |
-
public function getBasePath()
|
694 |
-
{
|
695 |
-
return $this->config->getBasePath();
|
696 |
-
}
|
697 |
-
|
698 |
-
/**
|
699 |
-
* @return string the name of the application
|
700 |
-
*/
|
701 |
-
public function getApplicationName()
|
702 |
-
{
|
703 |
-
return $this->config->getApplicationName();
|
704 |
-
}
|
705 |
-
|
706 |
-
/**
|
707 |
-
* Are we running in Google AppEngine?
|
708 |
-
* return bool
|
709 |
-
*/
|
710 |
-
public function isAppEngine()
|
711 |
-
{
|
712 |
-
return (isset($_SERVER['SERVER_SOFTWARE']) &&
|
713 |
-
strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false);
|
714 |
-
}
|
715 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* The Google API Client
|
24 |
+
* https://github.com/google/google-api-php-client
|
25 |
+
*/
|
26 |
+
class Google_Client
|
27 |
+
{
|
28 |
+
const LIBVER = "1.1.5";
|
29 |
+
const USER_AGENT_SUFFIX = "google-api-php-client/";
|
30 |
+
/**
|
31 |
+
* @var Google_Auth_Abstract $auth
|
32 |
+
*/
|
33 |
+
private $auth;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @var Google_IO_Abstract $io
|
37 |
+
*/
|
38 |
+
private $io;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var Google_Cache_Abstract $cache
|
42 |
+
*/
|
43 |
+
private $cache;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var Google_Config $config
|
47 |
+
*/
|
48 |
+
private $config;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var Google_Logger_Abstract $logger
|
52 |
+
*/
|
53 |
+
private $logger;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @var boolean $deferExecution
|
57 |
+
*/
|
58 |
+
private $deferExecution = false;
|
59 |
+
|
60 |
+
/** @var array $scopes */
|
61 |
+
// Scopes requested by the client
|
62 |
+
protected $requestedScopes = array();
|
63 |
+
|
64 |
+
// definitions of services that are discovered.
|
65 |
+
protected $services = array();
|
66 |
+
|
67 |
+
// Used to track authenticated state, can't discover services after doing authenticate()
|
68 |
+
private $authenticated = false;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Construct the Google Client.
|
72 |
+
*
|
73 |
+
* @param $config Google_Config or string for the ini file to load
|
74 |
+
*/
|
75 |
+
public function __construct($config = null)
|
76 |
+
{
|
77 |
+
if (is_string($config) && strlen($config)) {
|
78 |
+
$config = new Google_Config($config);
|
79 |
+
} else if ( !($config instanceof Google_Config)) {
|
80 |
+
$config = new Google_Config();
|
81 |
+
|
82 |
+
if ($this->isAppEngine()) {
|
83 |
+
// Automatically use Memcache if we're in AppEngine.
|
84 |
+
$config->setCacheClass('Google_Cache_Memcache');
|
85 |
+
}
|
86 |
+
|
87 |
+
if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) {
|
88 |
+
// Automatically disable compress.zlib, as currently unsupported.
|
89 |
+
$config->setClassConfig('Google_Http_Request', 'disable_gzip', true);
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) {
|
94 |
+
if (function_exists('curl_version') && function_exists('curl_exec')
|
95 |
+
&& !$this->isAppEngine()) {
|
96 |
+
$config->setIoClass("Google_IO_Curl");
|
97 |
+
} else {
|
98 |
+
$config->setIoClass("Google_IO_Stream");
|
99 |
+
}
|
100 |
+
}
|
101 |
+
|
102 |
+
$this->config = $config;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Get a string containing the version of the library.
|
107 |
+
*
|
108 |
+
* @return string
|
109 |
+
*/
|
110 |
+
public function getLibraryVersion()
|
111 |
+
{
|
112 |
+
return self::LIBVER;
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Attempt to exchange a code for an valid authentication token.
|
117 |
+
* If $crossClient is set to true, the request body will not include
|
118 |
+
* the request_uri argument
|
119 |
+
* Helper wrapped around the OAuth 2.0 implementation.
|
120 |
+
*
|
121 |
+
* @param $code string code from accounts.google.com
|
122 |
+
* @param $crossClient boolean, whether this is a cross-client authentication
|
123 |
+
* @return string token
|
124 |
+
*/
|
125 |
+
public function authenticate($code, $crossClient = false)
|
126 |
+
{
|
127 |
+
$this->authenticated = true;
|
128 |
+
return $this->getAuth()->authenticate($code, $crossClient);
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Loads a service account key and parameters from a JSON
|
133 |
+
* file from the Google Developer Console. Uses that and the
|
134 |
+
* given array of scopes to return an assertion credential for
|
135 |
+
* use with refreshTokenWithAssertionCredential.
|
136 |
+
*
|
137 |
+
* @param string $jsonLocation File location of the project-key.json.
|
138 |
+
* @param array $scopes The scopes to assert.
|
139 |
+
* @return Google_Auth_AssertionCredentials.
|
140 |
+
* @
|
141 |
+
*/
|
142 |
+
public function loadServiceAccountJson($jsonLocation, $scopes)
|
143 |
+
{
|
144 |
+
$data = json_decode(file_get_contents($jsonLocation));
|
145 |
+
if (isset($data->type) && $data->type == 'service_account') {
|
146 |
+
// Service Account format.
|
147 |
+
$cred = new Google_Auth_AssertionCredentials(
|
148 |
+
$data->client_email,
|
149 |
+
$scopes,
|
150 |
+
$data->private_key
|
151 |
+
);
|
152 |
+
return $cred;
|
153 |
+
} else {
|
154 |
+
throw new Google_Exception("Invalid service account JSON file.");
|
155 |
+
}
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Set the auth config from the JSON string provided.
|
160 |
+
* This structure should match the file downloaded from
|
161 |
+
* the "Download JSON" button on in the Google Developer
|
162 |
+
* Console.
|
163 |
+
* @param string $json the configuration json
|
164 |
+
* @throws Google_Exception
|
165 |
+
*/
|
166 |
+
public function setAuthConfig($json)
|
167 |
+
{
|
168 |
+
$data = json_decode($json);
|
169 |
+
$key = isset($data->installed) ? 'installed' : 'web';
|
170 |
+
if (!isset($data->$key)) {
|
171 |
+
throw new Google_Exception("Invalid client secret JSON file.");
|
172 |
+
}
|
173 |
+
$this->setClientId($data->$key->client_id);
|
174 |
+
$this->setClientSecret($data->$key->client_secret);
|
175 |
+
if (isset($data->$key->redirect_uris)) {
|
176 |
+
$this->setRedirectUri($data->$key->redirect_uris[0]);
|
177 |
+
}
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Set the auth config from the JSON file in the path
|
182 |
+
* provided. This should match the file downloaded from
|
183 |
+
* the "Download JSON" button on in the Google Developer
|
184 |
+
* Console.
|
185 |
+
* @param string $file the file location of the client json
|
186 |
+
*/
|
187 |
+
public function setAuthConfigFile($file)
|
188 |
+
{
|
189 |
+
$this->setAuthConfig(file_get_contents($file));
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* @throws Google_Auth_Exception
|
194 |
+
* @return array
|
195 |
+
* @visible For Testing
|
196 |
+
*/
|
197 |
+
public function prepareScopes()
|
198 |
+
{
|
199 |
+
if (empty($this->requestedScopes)) {
|
200 |
+
throw new Google_Auth_Exception("No scopes specified");
|
201 |
+
}
|
202 |
+
$scopes = implode(' ', $this->requestedScopes);
|
203 |
+
return $scopes;
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl()
|
208 |
+
* or Google_Client#getAccessToken().
|
209 |
+
* @param string $accessToken JSON encoded string containing in the following format:
|
210 |
+
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
211 |
+
* "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
|
212 |
+
*/
|
213 |
+
public function setAccessToken($accessToken)
|
214 |
+
{
|
215 |
+
if ($accessToken == 'null') {
|
216 |
+
$accessToken = null;
|
217 |
+
}
|
218 |
+
$this->getAuth()->setAccessToken($accessToken);
|
219 |
+
}
|
220 |
+
|
221 |
+
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Set the authenticator object
|
225 |
+
* @param Google_Auth_Abstract $auth
|
226 |
+
*/
|
227 |
+
public function setAuth(Google_Auth_Abstract $auth)
|
228 |
+
{
|
229 |
+
$this->config->setAuthClass(get_class($auth));
|
230 |
+
$this->auth = $auth;
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Set the IO object
|
235 |
+
* @param Google_IO_Abstract $io
|
236 |
+
*/
|
237 |
+
public function setIo(Google_IO_Abstract $io)
|
238 |
+
{
|
239 |
+
$this->config->setIoClass(get_class($io));
|
240 |
+
$this->io = $io;
|
241 |
+
}
|
242 |
+
|
243 |
+
/**
|
244 |
+
* Set the Cache object
|
245 |
+
* @param Google_Cache_Abstract $cache
|
246 |
+
*/
|
247 |
+
public function setCache(Google_Cache_Abstract $cache)
|
248 |
+
{
|
249 |
+
$this->config->setCacheClass(get_class($cache));
|
250 |
+
$this->cache = $cache;
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Set the Logger object
|
255 |
+
* @param Google_Logger_Abstract $logger
|
256 |
+
*/
|
257 |
+
public function setLogger(Google_Logger_Abstract $logger)
|
258 |
+
{
|
259 |
+
$this->config->setLoggerClass(get_class($logger));
|
260 |
+
$this->logger = $logger;
|
261 |
+
}
|
262 |
+
|
263 |
+
/**
|
264 |
+
* Construct the OAuth 2.0 authorization request URI.
|
265 |
+
* @return string
|
266 |
+
*/
|
267 |
+
public function createAuthUrl()
|
268 |
+
{
|
269 |
+
$scopes = $this->prepareScopes();
|
270 |
+
return $this->getAuth()->createAuthUrl($scopes);
|
271 |
+
}
|
272 |
+
|
273 |
+
/**
|
274 |
+
* Get the OAuth 2.0 access token.
|
275 |
+
* @return string $accessToken JSON encoded string in the following format:
|
276 |
+
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
277 |
+
* "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
|
278 |
+
*/
|
279 |
+
public function getAccessToken()
|
280 |
+
{
|
281 |
+
$token = $this->getAuth()->getAccessToken();
|
282 |
+
// The response is json encoded, so could be the string null.
|
283 |
+
// It is arguable whether this check should be here or lower
|
284 |
+
// in the library.
|
285 |
+
return (null == $token || 'null' == $token || '[]' == $token) ? null : $token;
|
286 |
+
}
|
287 |
+
|
288 |
+
/**
|
289 |
+
* Get the OAuth 2.0 refresh token.
|
290 |
+
* @return string $refreshToken refresh token or null if not available
|
291 |
+
*/
|
292 |
+
public function getRefreshToken()
|
293 |
+
{
|
294 |
+
return $this->getAuth()->getRefreshToken();
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* Returns if the access_token is expired.
|
299 |
+
* @return bool Returns True if the access_token is expired.
|
300 |
+
*/
|
301 |
+
public function isAccessTokenExpired()
|
302 |
+
{
|
303 |
+
return $this->getAuth()->isAccessTokenExpired();
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Set OAuth 2.0 "state" parameter to achieve per-request customization.
|
308 |
+
* @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
|
309 |
+
* @param string $state
|
310 |
+
*/
|
311 |
+
public function setState($state)
|
312 |
+
{
|
313 |
+
$this->getAuth()->setState($state);
|
314 |
+
}
|
315 |
+
|
316 |
+
/**
|
317 |
+
* @param string $accessType Possible values for access_type include:
|
318 |
+
* {@code "offline"} to request offline access from the user.
|
319 |
+
* {@code "online"} to request online access from the user.
|
320 |
+
*/
|
321 |
+
public function setAccessType($accessType)
|
322 |
+
{
|
323 |
+
$this->config->setAccessType($accessType);
|
324 |
+
}
|
325 |
+
|
326 |
+
/**
|
327 |
+
* @param string $approvalPrompt Possible values for approval_prompt include:
|
328 |
+
* {@code "force"} to force the approval UI to appear. (This is the default value)
|
329 |
+
* {@code "auto"} to request auto-approval when possible.
|
330 |
+
*/
|
331 |
+
public function setApprovalPrompt($approvalPrompt)
|
332 |
+
{
|
333 |
+
$this->config->setApprovalPrompt($approvalPrompt);
|
334 |
+
}
|
335 |
+
|
336 |
+
/**
|
337 |
+
* Set the login hint, email address or sub id.
|
338 |
+
* @param string $loginHint
|
339 |
+
*/
|
340 |
+
public function setLoginHint($loginHint)
|
341 |
+
{
|
342 |
+
$this->config->setLoginHint($loginHint);
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Set the application name, this is included in the User-Agent HTTP header.
|
347 |
+
* @param string $applicationName
|
348 |
+
*/
|
349 |
+
public function setApplicationName($applicationName)
|
350 |
+
{
|
351 |
+
$this->config->setApplicationName($applicationName);
|
352 |
+
}
|
353 |
+
|
354 |
+
/**
|
355 |
+
* Set the OAuth 2.0 Client ID.
|
356 |
+
* @param string $clientId
|
357 |
+
*/
|
358 |
+
public function setClientId($clientId)
|
359 |
+
{
|
360 |
+
$this->config->setClientId($clientId);
|
361 |
+
}
|
362 |
+
|
363 |
+
/**
|
364 |
+
* Set the OAuth 2.0 Client Secret.
|
365 |
+
* @param string $clientSecret
|
366 |
+
*/
|
367 |
+
public function setClientSecret($clientSecret)
|
368 |
+
{
|
369 |
+
$this->config->setClientSecret($clientSecret);
|
370 |
+
}
|
371 |
+
|
372 |
+
/**
|
373 |
+
* Set the OAuth 2.0 Redirect URI.
|
374 |
+
* @param string $redirectUri
|
375 |
+
*/
|
376 |
+
public function setRedirectUri($redirectUri)
|
377 |
+
{
|
378 |
+
$this->config->setRedirectUri($redirectUri);
|
379 |
+
}
|
380 |
+
|
381 |
+
/**
|
382 |
+
* If 'plus.login' is included in the list of requested scopes, you can use
|
383 |
+
* this method to define types of app activities that your app will write.
|
384 |
+
* You can find a list of available types here:
|
385 |
+
* @link https://developers.google.com/+/api/moment-types
|
386 |
+
*
|
387 |
+
* @param array $requestVisibleActions Array of app activity types
|
388 |
+
*/
|
389 |
+
public function setRequestVisibleActions($requestVisibleActions)
|
390 |
+
{
|
391 |
+
if (is_array($requestVisibleActions)) {
|
392 |
+
$requestVisibleActions = join(" ", $requestVisibleActions);
|
393 |
+
}
|
394 |
+
$this->config->setRequestVisibleActions($requestVisibleActions);
|
395 |
+
}
|
396 |
+
|
397 |
+
/**
|
398 |
+
* Set the developer key to use, these are obtained through the API Console.
|
399 |
+
* @see http://code.google.com/apis/console-help/#generatingdevkeys
|
400 |
+
* @param string $developerKey
|
401 |
+
*/
|
402 |
+
public function setDeveloperKey($developerKey)
|
403 |
+
{
|
404 |
+
$this->config->setDeveloperKey($developerKey);
|
405 |
+
}
|
406 |
+
|
407 |
+
/**
|
408 |
+
* Set the hd (hosted domain) parameter streamlines the login process for
|
409 |
+
* Google Apps hosted accounts. By including the domain of the user, you
|
410 |
+
* restrict sign-in to accounts at that domain.
|
411 |
+
* @param $hd string - the domain to use.
|
412 |
+
*/
|
413 |
+
public function setHostedDomain($hd)
|
414 |
+
{
|
415 |
+
$this->config->setHostedDomain($hd);
|
416 |
+
}
|
417 |
+
|
418 |
+
/**
|
419 |
+
* Set the prompt hint. Valid values are none, consent and select_account.
|
420 |
+
* If no value is specified and the user has not previously authorized
|
421 |
+
* access, then the user is shown a consent screen.
|
422 |
+
* @param $prompt string
|
423 |
+
*/
|
424 |
+
public function setPrompt($prompt)
|
425 |
+
{
|
426 |
+
$this->config->setPrompt($prompt);
|
427 |
+
}
|
428 |
+
|
429 |
+
/**
|
430 |
+
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
431 |
+
* 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
|
432 |
+
* an authentication request is valid.
|
433 |
+
* @param $realm string - the URL-space to use.
|
434 |
+
*/
|
435 |
+
public function setOpenidRealm($realm)
|
436 |
+
{
|
437 |
+
$this->config->setOpenidRealm($realm);
|
438 |
+
}
|
439 |
+
|
440 |
+
/**
|
441 |
+
* If this is provided with the value true, and the authorization request is
|
442 |
+
* granted, the authorization will include any previous authorizations
|
443 |
+
* granted to this user/application combination for other scopes.
|
444 |
+
* @param $include boolean - the URL-space to use.
|
445 |
+
*/
|
446 |
+
public function setIncludeGrantedScopes($include)
|
447 |
+
{
|
448 |
+
$this->config->setIncludeGrantedScopes($include);
|
449 |
+
}
|
450 |
+
|
451 |
+
/**
|
452 |
+
* Fetches a fresh OAuth 2.0 access token with the given refresh token.
|
453 |
+
* @param string $refreshToken
|
454 |
+
*/
|
455 |
+
public function refreshToken($refreshToken)
|
456 |
+
{
|
457 |
+
$this->getAuth()->refreshToken($refreshToken);
|
458 |
+
}
|
459 |
+
|
460 |
+
/**
|
461 |
+
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
462 |
+
* token, if a token isn't provided.
|
463 |
+
* @throws Google_Auth_Exception
|
464 |
+
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
465 |
+
* @return boolean Returns True if the revocation was successful, otherwise False.
|
466 |
+
*/
|
467 |
+
public function revokeToken($token = null)
|
468 |
+
{
|
469 |
+
return $this->getAuth()->revokeToken($token);
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Verify an id_token. This method will verify the current id_token, if one
|
474 |
+
* isn't provided.
|
475 |
+
* @throws Google_Auth_Exception
|
476 |
+
* @param string|null $token The token (id_token) that should be verified.
|
477 |
+
* @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was
|
478 |
+
* successful.
|
479 |
+
*/
|
480 |
+
public function verifyIdToken($token = null)
|
481 |
+
{
|
482 |
+
return $this->getAuth()->verifyIdToken($token);
|
483 |
+
}
|
484 |
+
|
485 |
+
/**
|
486 |
+
* Verify a JWT that was signed with your own certificates.
|
487 |
+
*
|
488 |
+
* @param $id_token string The JWT token
|
489 |
+
* @param $cert_location array of certificates
|
490 |
+
* @param $audience string the expected consumer of the token
|
491 |
+
* @param $issuer string the expected issuer, defaults to Google
|
492 |
+
* @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS
|
493 |
+
* @return mixed token information if valid, false if not
|
494 |
+
*/
|
495 |
+
public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null)
|
496 |
+
{
|
497 |
+
$auth = new Google_Auth_OAuth2($this);
|
498 |
+
$certs = $auth->retrieveCertsFromLocation($cert_location);
|
499 |
+
return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry);
|
500 |
+
}
|
501 |
+
|
502 |
+
/**
|
503 |
+
* @param $creds Google_Auth_AssertionCredentials
|
504 |
+
*/
|
505 |
+
public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds)
|
506 |
+
{
|
507 |
+
$this->getAuth()->setAssertionCredentials($creds);
|
508 |
+
}
|
509 |
+
|
510 |
+
/**
|
511 |
+
* Set the scopes to be requested. Must be called before createAuthUrl().
|
512 |
+
* Will remove any previously configured scopes.
|
513 |
+
* @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login',
|
514 |
+
* 'https://www.googleapis.com/auth/moderator')
|
515 |
+
*/
|
516 |
+
public function setScopes($scopes)
|
517 |
+
{
|
518 |
+
$this->requestedScopes = array();
|
519 |
+
$this->addScope($scopes);
|
520 |
+
}
|
521 |
+
|
522 |
+
/**
|
523 |
+
* This functions adds a scope to be requested as part of the OAuth2.0 flow.
|
524 |
+
* Will append any scopes not previously requested to the scope parameter.
|
525 |
+
* A single string will be treated as a scope to request. An array of strings
|
526 |
+
* will each be appended.
|
527 |
+
* @param $scope_or_scopes string|array e.g. "profile"
|
528 |
+
*/
|
529 |
+
public function addScope($scope_or_scopes)
|
530 |
+
{
|
531 |
+
if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) {
|
532 |
+
$this->requestedScopes[] = $scope_or_scopes;
|
533 |
+
} else if (is_array($scope_or_scopes)) {
|
534 |
+
foreach ($scope_or_scopes as $scope) {
|
535 |
+
$this->addScope($scope);
|
536 |
+
}
|
537 |
+
}
|
538 |
+
}
|
539 |
+
|
540 |
+
/**
|
541 |
+
* Returns the list of scopes requested by the client
|
542 |
+
* @return array the list of scopes
|
543 |
+
*
|
544 |
+
*/
|
545 |
+
public function getScopes()
|
546 |
+
{
|
547 |
+
return $this->requestedScopes;
|
548 |
+
}
|
549 |
+
|
550 |
+
/**
|
551 |
+
* Declare whether batch calls should be used. This may increase throughput
|
552 |
+
* by making multiple requests in one connection.
|
553 |
+
*
|
554 |
+
* @param boolean $useBatch True if the batch support should
|
555 |
+
* be enabled. Defaults to False.
|
556 |
+
*/
|
557 |
+
public function setUseBatch($useBatch)
|
558 |
+
{
|
559 |
+
// This is actually an alias for setDefer.
|
560 |
+
$this->setDefer($useBatch);
|
561 |
+
}
|
562 |
+
|
563 |
+
/**
|
564 |
+
* Declare whether making API calls should make the call immediately, or
|
565 |
+
* return a request which can be called with ->execute();
|
566 |
+
*
|
567 |
+
* @param boolean $defer True if calls should not be executed right away.
|
568 |
+
*/
|
569 |
+
public function setDefer($defer)
|
570 |
+
{
|
571 |
+
$this->deferExecution = $defer;
|
572 |
+
}
|
573 |
+
|
574 |
+
/**
|
575 |
+
* Helper method to execute deferred HTTP requests.
|
576 |
+
*
|
577 |
+
* @param $request Google_Http_Request|Google_Http_Batch
|
578 |
+
* @throws Google_Exception
|
579 |
+
* @return object of the type of the expected class or array.
|
580 |
+
*/
|
581 |
+
public function execute($request)
|
582 |
+
{
|
583 |
+
if ($request instanceof Google_Http_Request) {
|
584 |
+
$request->setUserAgent(
|
585 |
+
$this->getApplicationName()
|
586 |
+
. " " . self::USER_AGENT_SUFFIX
|
587 |
+
. $this->getLibraryVersion()
|
588 |
+
);
|
589 |
+
if (!$this->getClassConfig("Google_Http_Request", "disable_gzip")) {
|
590 |
+
$request->enableGzip();
|
591 |
+
}
|
592 |
+
$request->maybeMoveParametersToBody();
|
593 |
+
return Google_Http_REST::execute($this, $request);
|
594 |
+
} else if ($request instanceof Google_Http_Batch) {
|
595 |
+
return $request->execute();
|
596 |
+
} else {
|
597 |
+
throw new Google_Exception("Do not know how to execute this type of object.");
|
598 |
+
}
|
599 |
+
}
|
600 |
+
|
601 |
+
/**
|
602 |
+
* Whether or not to return raw requests
|
603 |
+
* @return boolean
|
604 |
+
*/
|
605 |
+
public function shouldDefer()
|
606 |
+
{
|
607 |
+
return $this->deferExecution;
|
608 |
+
}
|
609 |
+
|
610 |
+
/**
|
611 |
+
* @return Google_Auth_Abstract Authentication implementation
|
612 |
+
*/
|
613 |
+
public function getAuth()
|
614 |
+
{
|
615 |
+
if (!isset($this->auth)) {
|
616 |
+
$class = $this->config->getAuthClass();
|
617 |
+
$this->auth = new $class($this);
|
618 |
+
}
|
619 |
+
return $this->auth;
|
620 |
+
}
|
621 |
+
|
622 |
+
/**
|
623 |
+
* @return Google_IO_Abstract IO implementation
|
624 |
+
*/
|
625 |
+
public function getIo()
|
626 |
+
{
|
627 |
+
if (!isset($this->io)) {
|
628 |
+
$class = $this->config->getIoClass();
|
629 |
+
$this->io = new $class($this);
|
630 |
+
}
|
631 |
+
return $this->io;
|
632 |
+
}
|
633 |
+
|
634 |
+
/**
|
635 |
+
* @return Google_Cache_Abstract Cache implementation
|
636 |
+
*/
|
637 |
+
public function getCache()
|
638 |
+
{
|
639 |
+
if (!isset($this->cache)) {
|
640 |
+
$class = $this->config->getCacheClass();
|
641 |
+
$this->cache = new $class($this);
|
642 |
+
}
|
643 |
+
return $this->cache;
|
644 |
+
}
|
645 |
+
|
646 |
+
/**
|
647 |
+
* @return Google_Logger_Abstract Logger implementation
|
648 |
+
*/
|
649 |
+
public function getLogger()
|
650 |
+
{
|
651 |
+
if (!isset($this->logger)) {
|
652 |
+
$class = $this->config->getLoggerClass();
|
653 |
+
$this->logger = new $class($this);
|
654 |
+
}
|
655 |
+
return $this->logger;
|
656 |
+
}
|
657 |
+
|
658 |
+
/**
|
659 |
+
* Retrieve custom configuration for a specific class.
|
660 |
+
* @param $class string|object - class or instance of class to retrieve
|
661 |
+
* @param $key string optional - key to retrieve
|
662 |
+
* @return array
|
663 |
+
*/
|
664 |
+
public function getClassConfig($class, $key = null)
|
665 |
+
{
|
666 |
+
if (!is_string($class)) {
|
667 |
+
$class = get_class($class);
|
668 |
+
}
|
669 |
+
return $this->config->getClassConfig($class, $key);
|
670 |
+
}
|
671 |
+
|
672 |
+
/**
|
673 |
+
* Set configuration specific to a given class.
|
674 |
+
* $config->setClassConfig('Google_Cache_File',
|
675 |
+
* array('directory' => '/tmp/cache'));
|
676 |
+
* @param $class string|object - The class name for the configuration
|
677 |
+
* @param $config string key or an array of configuration values
|
678 |
+
* @param $value string optional - if $config is a key, the value
|
679 |
+
*
|
680 |
+
*/
|
681 |
+
public function setClassConfig($class, $config, $value = null)
|
682 |
+
{
|
683 |
+
if (!is_string($class)) {
|
684 |
+
$class = get_class($class);
|
685 |
+
}
|
686 |
+
$this->config->setClassConfig($class, $config, $value);
|
687 |
+
|
688 |
+
}
|
689 |
+
|
690 |
+
/**
|
691 |
+
* @return string the base URL to use for calls to the APIs
|
692 |
+
*/
|
693 |
+
public function getBasePath()
|
694 |
+
{
|
695 |
+
return $this->config->getBasePath();
|
696 |
+
}
|
697 |
+
|
698 |
+
/**
|
699 |
+
* @return string the name of the application
|
700 |
+
*/
|
701 |
+
public function getApplicationName()
|
702 |
+
{
|
703 |
+
return $this->config->getApplicationName();
|
704 |
+
}
|
705 |
+
|
706 |
+
/**
|
707 |
+
* Are we running in Google AppEngine?
|
708 |
+
* return bool
|
709 |
+
*/
|
710 |
+
public function isAppEngine()
|
711 |
+
{
|
712 |
+
return (isset($_SERVER['SERVER_SOFTWARE']) &&
|
713 |
+
strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false);
|
714 |
+
}
|
715 |
+
}
|
app/api/Google/Collection.php
CHANGED
@@ -1,101 +1,101 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
if (!class_exists('Google_Client')) {
|
4 |
-
require_once dirname(__FILE__) . '/autoload.php';
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Extension to the regular Google_Model that automatically
|
9 |
-
* exposes the items array for iteration, so you can just
|
10 |
-
* iterate over the object rather than a reference inside.
|
11 |
-
*/
|
12 |
-
class Google_Collection extends Google_Model implements Iterator, Countable
|
13 |
-
{
|
14 |
-
protected $collection_key = 'items';
|
15 |
-
|
16 |
-
public function rewind()
|
17 |
-
{
|
18 |
-
if (isset($this->modelData[$this->collection_key])
|
19 |
-
&& is_array($this->modelData[$this->collection_key])) {
|
20 |
-
reset($this->modelData[$this->collection_key]);
|
21 |
-
}
|
22 |
-
}
|
23 |
-
|
24 |
-
public function current()
|
25 |
-
{
|
26 |
-
$this->coerceType($this->key());
|
27 |
-
if (is_array($this->modelData[$this->collection_key])) {
|
28 |
-
return current($this->modelData[$this->collection_key]);
|
29 |
-
}
|
30 |
-
}
|
31 |
-
|
32 |
-
public function key()
|
33 |
-
{
|
34 |
-
if (isset($this->modelData[$this->collection_key])
|
35 |
-
&& is_array($this->modelData[$this->collection_key])) {
|
36 |
-
return key($this->modelData[$this->collection_key]);
|
37 |
-
}
|
38 |
-
}
|
39 |
-
|
40 |
-
public function next()
|
41 |
-
{
|
42 |
-
return next($this->modelData[$this->collection_key]);
|
43 |
-
}
|
44 |
-
|
45 |
-
public function valid()
|
46 |
-
{
|
47 |
-
$key = $this->key();
|
48 |
-
return $key !== null && $key !== false;
|
49 |
-
}
|
50 |
-
|
51 |
-
public function count()
|
52 |
-
{
|
53 |
-
if (!isset($this->modelData[$this->collection_key])) {
|
54 |
-
return 0;
|
55 |
-
}
|
56 |
-
return count($this->modelData[$this->collection_key]);
|
57 |
-
}
|
58 |
-
|
59 |
-
public function offsetExists($offset)
|
60 |
-
{
|
61 |
-
if (!is_numeric($offset)) {
|
62 |
-
return parent::offsetExists($offset);
|
63 |
-
}
|
64 |
-
return isset($this->modelData[$this->collection_key][$offset]);
|
65 |
-
}
|
66 |
-
|
67 |
-
public function offsetGet($offset)
|
68 |
-
{
|
69 |
-
if (!is_numeric($offset)) {
|
70 |
-
return parent::offsetGet($offset);
|
71 |
-
}
|
72 |
-
$this->coerceType($offset);
|
73 |
-
return $this->modelData[$this->collection_key][$offset];
|
74 |
-
}
|
75 |
-
|
76 |
-
public function offsetSet($offset, $value)
|
77 |
-
{
|
78 |
-
if (!is_numeric($offset)) {
|
79 |
-
return parent::offsetSet($offset, $value);
|
80 |
-
}
|
81 |
-
$this->modelData[$this->collection_key][$offset] = $value;
|
82 |
-
}
|
83 |
-
|
84 |
-
public function offsetUnset($offset)
|
85 |
-
{
|
86 |
-
if (!is_numeric($offset)) {
|
87 |
-
return parent::offsetUnset($offset);
|
88 |
-
}
|
89 |
-
unset($this->modelData[$this->collection_key][$offset]);
|
90 |
-
}
|
91 |
-
|
92 |
-
private function coerceType($offset)
|
93 |
-
{
|
94 |
-
$typeKey = $this->keyType($this->collection_key);
|
95 |
-
if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) {
|
96 |
-
$type = $this->$typeKey;
|
97 |
-
$this->modelData[$this->collection_key][$offset] =
|
98 |
-
new $type($this->modelData[$this->collection_key][$offset]);
|
99 |
-
}
|
100 |
-
}
|
101 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if (!class_exists('Google_Client')) {
|
4 |
+
require_once dirname(__FILE__) . '/autoload.php';
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Extension to the regular Google_Model that automatically
|
9 |
+
* exposes the items array for iteration, so you can just
|
10 |
+
* iterate over the object rather than a reference inside.
|
11 |
+
*/
|
12 |
+
class Google_Collection extends Google_Model implements Iterator, Countable
|
13 |
+
{
|
14 |
+
protected $collection_key = 'items';
|
15 |
+
|
16 |
+
public function rewind()
|
17 |
+
{
|
18 |
+
if (isset($this->modelData[$this->collection_key])
|
19 |
+
&& is_array($this->modelData[$this->collection_key])) {
|
20 |
+
reset($this->modelData[$this->collection_key]);
|
21 |
+
}
|
22 |
+
}
|
23 |
+
|
24 |
+
public function current()
|
25 |
+
{
|
26 |
+
$this->coerceType($this->key());
|
27 |
+
if (is_array($this->modelData[$this->collection_key])) {
|
28 |
+
return current($this->modelData[$this->collection_key]);
|
29 |
+
}
|
30 |
+
}
|
31 |
+
|
32 |
+
public function key()
|
33 |
+
{
|
34 |
+
if (isset($this->modelData[$this->collection_key])
|
35 |
+
&& is_array($this->modelData[$this->collection_key])) {
|
36 |
+
return key($this->modelData[$this->collection_key]);
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
public function next()
|
41 |
+
{
|
42 |
+
return next($this->modelData[$this->collection_key]);
|
43 |
+
}
|
44 |
+
|
45 |
+
public function valid()
|
46 |
+
{
|
47 |
+
$key = $this->key();
|
48 |
+
return $key !== null && $key !== false;
|
49 |
+
}
|
50 |
+
|
51 |
+
public function count()
|
52 |
+
{
|
53 |
+
if (!isset($this->modelData[$this->collection_key])) {
|
54 |
+
return 0;
|
55 |
+
}
|
56 |
+
return count($this->modelData[$this->collection_key]);
|
57 |
+
}
|
58 |
+
|
59 |
+
public function offsetExists($offset)
|
60 |
+
{
|
61 |
+
if (!is_numeric($offset)) {
|
62 |
+
return parent::offsetExists($offset);
|
63 |
+
}
|
64 |
+
return isset($this->modelData[$this->collection_key][$offset]);
|
65 |
+
}
|
66 |
+
|
67 |
+
public function offsetGet($offset)
|
68 |
+
{
|
69 |
+
if (!is_numeric($offset)) {
|
70 |
+
return parent::offsetGet($offset);
|
71 |
+
}
|
72 |
+
$this->coerceType($offset);
|
73 |
+
return $this->modelData[$this->collection_key][$offset];
|
74 |
+
}
|
75 |
+
|
76 |
+
public function offsetSet($offset, $value)
|
77 |
+
{
|
78 |
+
if (!is_numeric($offset)) {
|
79 |
+
return parent::offsetSet($offset, $value);
|
80 |
+
}
|
81 |
+
$this->modelData[$this->collection_key][$offset] = $value;
|
82 |
+
}
|
83 |
+
|
84 |
+
public function offsetUnset($offset)
|
85 |
+
{
|
86 |
+
if (!is_numeric($offset)) {
|
87 |
+
return parent::offsetUnset($offset);
|
88 |
+
}
|
89 |
+
unset($this->modelData[$this->collection_key][$offset]);
|
90 |
+
}
|
91 |
+
|
92 |
+
private function coerceType($offset)
|
93 |
+
{
|
94 |
+
$typeKey = $this->keyType($this->collection_key);
|
95 |
+
if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) {
|
96 |
+
$type = $this->$typeKey;
|
97 |
+
$this->modelData[$this->collection_key][$offset] =
|
98 |
+
new $type($this->modelData[$this->collection_key][$offset]);
|
99 |
+
}
|
100 |
+
}
|
101 |
+
}
|
app/api/Google/Config.php
CHANGED
@@ -1,456 +1,456 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* A class to contain the library configuration for the Google API client.
|
20 |
-
*/
|
21 |
-
class Google_Config
|
22 |
-
{
|
23 |
-
const GZIP_DISABLED = true;
|
24 |
-
const GZIP_ENABLED = false;
|
25 |
-
const GZIP_UPLOADS_ENABLED = true;
|
26 |
-
const GZIP_UPLOADS_DISABLED = false;
|
27 |
-
const USE_AUTO_IO_SELECTION = "auto";
|
28 |
-
const TASK_RETRY_NEVER = 0;
|
29 |
-
const TASK_RETRY_ONCE = 1;
|
30 |
-
const TASK_RETRY_ALWAYS = -1;
|
31 |
-
protected $configuration;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Create a new Google_Config. Can accept an ini file location with the
|
35 |
-
* local configuration. For example:
|
36 |
-
* application_name="My App"
|
37 |
-
*
|
38 |
-
* @param [$ini_file_location] - optional - The location of the ini file to load
|
39 |
-
*/
|
40 |
-
public function __construct($ini_file_location = null)
|
41 |
-
{
|
42 |
-
$this->configuration = array(
|
43 |
-
// The application_name is included in the User-Agent HTTP header.
|
44 |
-
'application_name' => '',
|
45 |
-
|
46 |
-
// Which Authentication, Storage and HTTP IO classes to use.
|
47 |
-
'auth_class' => 'Google_Auth_OAuth2',
|
48 |
-
'io_class' => self::USE_AUTO_IO_SELECTION,
|
49 |
-
'cache_class' => 'Google_Cache_File',
|
50 |
-
'logger_class' => 'Google_Logger_Null',
|
51 |
-
|
52 |
-
// Don't change these unless you're working against a special development
|
53 |
-
// or testing environment.
|
54 |
-
'base_path' => 'https://www.googleapis.com',
|
55 |
-
|
56 |
-
// Definition of class specific values, like file paths and so on.
|
57 |
-
'classes' => array(
|
58 |
-
'Google_IO_Abstract' => array(
|
59 |
-
'request_timeout_seconds' => 100,
|
60 |
-
),
|
61 |
-
'Google_IO_Curl' => array(
|
62 |
-
'disable_proxy_workaround' => false,
|
63 |
-
'options' => null,
|
64 |
-
),
|
65 |
-
'Google_Logger_Abstract' => array(
|
66 |
-
'level' => 'debug',
|
67 |
-
'log_format' => "[%datetime%] %level%: %message% %context%\n",
|
68 |
-
'date_format' => 'd/M/Y:H:i:s O',
|
69 |
-
'allow_newlines' => true
|
70 |
-
),
|
71 |
-
'Google_Logger_File' => array(
|
72 |
-
'file' => 'php://stdout',
|
73 |
-
'mode' => 0640,
|
74 |
-
'lock' => false,
|
75 |
-
),
|
76 |
-
'Google_Http_Request' => array(
|
77 |
-
// Disable the use of gzip on calls if set to true. Defaults to false.
|
78 |
-
'disable_gzip' => self::GZIP_ENABLED,
|
79 |
-
|
80 |
-
// We default gzip to disabled on uploads even if gzip is otherwise
|
81 |
-
// enabled, due to some issues seen with small packet sizes for uploads.
|
82 |
-
// Please test with this option before enabling gzip for uploads in
|
83 |
-
// a production environment.
|
84 |
-
'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED,
|
85 |
-
),
|
86 |
-
// If you want to pass in OAuth 2.0 settings, they will need to be
|
87 |
-
// structured like this.
|
88 |
-
'Google_Auth_OAuth2' => array(
|
89 |
-
// Keys for OAuth 2.0 access, see the API console at
|
90 |
-
// https://developers.google.com/console
|
91 |
-
'client_id' => '',
|
92 |
-
'client_secret' => '',
|
93 |
-
'redirect_uri' => '',
|
94 |
-
|
95 |
-
// Simple API access key, also from the API console. Ensure you get
|
96 |
-
// a Server key, and not a Browser key.
|
97 |
-
'developer_key' => '',
|
98 |
-
|
99 |
-
// Other parameters.
|
100 |
-
'hd' => '',
|
101 |
-
'prompt' => '',
|
102 |
-
'openid.realm' => '',
|
103 |
-
'include_granted_scopes' => '',
|
104 |
-
'login_hint' => '',
|
105 |
-
'request_visible_actions' => '',
|
106 |
-
'access_type' => 'online',
|
107 |
-
'approval_prompt' => 'auto',
|
108 |
-
'federated_signon_certs_url' =>
|
109 |
-
'https://www.googleapis.com/oauth2/v1/certs',
|
110 |
-
),
|
111 |
-
'Google_Task_Runner' => array(
|
112 |
-
// Delays are specified in seconds
|
113 |
-
'initial_delay' => 1,
|
114 |
-
'max_delay' => 60,
|
115 |
-
// Base number for exponential backoff
|
116 |
-
'factor' => 2,
|
117 |
-
// A random number between -jitter and jitter will be added to the
|
118 |
-
// factor on each iteration to allow for better distribution of
|
119 |
-
// retries.
|
120 |
-
'jitter' => .5,
|
121 |
-
// Maximum number of retries allowed
|
122 |
-
'retries' => 0
|
123 |
-
),
|
124 |
-
'Google_Service_Exception' => array(
|
125 |
-
'retry_map' => array(
|
126 |
-
'500' => self::TASK_RETRY_ALWAYS,
|
127 |
-
'503' => self::TASK_RETRY_ALWAYS,
|
128 |
-
'rateLimitExceeded' => self::TASK_RETRY_ALWAYS,
|
129 |
-
'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS
|
130 |
-
)
|
131 |
-
),
|
132 |
-
'Google_IO_Exception' => array(
|
133 |
-
'retry_map' => !extension_loaded('curl') ? array() : array(
|
134 |
-
CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS,
|
135 |
-
CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS,
|
136 |
-
CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS,
|
137 |
-
CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS,
|
138 |
-
CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS
|
139 |
-
)
|
140 |
-
),
|
141 |
-
// Set a default directory for the file cache.
|
142 |
-
'Google_Cache_File' => array(
|
143 |
-
'directory' => sys_get_temp_dir() . '/Google_Client'
|
144 |
-
)
|
145 |
-
),
|
146 |
-
);
|
147 |
-
if ($ini_file_location) {
|
148 |
-
$ini = parse_ini_file($ini_file_location, true);
|
149 |
-
if (is_array($ini) && count($ini)) {
|
150 |
-
$merged_configuration = $ini + $this->configuration;
|
151 |
-
if (isset($ini['classes']) && isset($this->configuration['classes'])) {
|
152 |
-
$merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
|
153 |
-
}
|
154 |
-
$this->configuration = $merged_configuration;
|
155 |
-
}
|
156 |
-
}
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Set configuration specific to a given class.
|
161 |
-
* $config->setClassConfig('Google_Cache_File',
|
162 |
-
* array('directory' => '/tmp/cache'));
|
163 |
-
* @param $class string The class name for the configuration
|
164 |
-
* @param $config string key or an array of configuration values
|
165 |
-
* @param $value string optional - if $config is a key, the value
|
166 |
-
*/
|
167 |
-
public function setClassConfig($class, $config, $value = null)
|
168 |
-
{
|
169 |
-
if (!is_array($config)) {
|
170 |
-
if (!isset($this->configuration['classes'][$class])) {
|
171 |
-
$this->configuration['classes'][$class] = array();
|
172 |
-
}
|
173 |
-
$this->configuration['classes'][$class][$config] = $value;
|
174 |
-
} else {
|
175 |
-
$this->configuration['classes'][$class] = $config;
|
176 |
-
}
|
177 |
-
}
|
178 |
-
|
179 |
-
public function getClassConfig($class, $key = null)
|
180 |
-
{
|
181 |
-
if (!isset($this->configuration['classes'][$class])) {
|
182 |
-
return null;
|
183 |
-
}
|
184 |
-
if ($key === null) {
|
185 |
-
return $this->configuration['classes'][$class];
|
186 |
-
} else {
|
187 |
-
return $this->configuration['classes'][$class][$key];
|
188 |
-
}
|
189 |
-
}
|
190 |
-
|
191 |
-
/**
|
192 |
-
* Return the configured cache class.
|
193 |
-
* @return string
|
194 |
-
*/
|
195 |
-
public function getCacheClass()
|
196 |
-
{
|
197 |
-
return $this->configuration['cache_class'];
|
198 |
-
}
|
199 |
-
|
200 |
-
/**
|
201 |
-
* Return the configured logger class.
|
202 |
-
* @return string
|
203 |
-
*/
|
204 |
-
public function getLoggerClass()
|
205 |
-
{
|
206 |
-
return $this->configuration['logger_class'];
|
207 |
-
}
|
208 |
-
|
209 |
-
/**
|
210 |
-
* Return the configured Auth class.
|
211 |
-
* @return string
|
212 |
-
*/
|
213 |
-
public function getAuthClass()
|
214 |
-
{
|
215 |
-
return $this->configuration['auth_class'];
|
216 |
-
}
|
217 |
-
|
218 |
-
/**
|
219 |
-
* Set the auth class.
|
220 |
-
*
|
221 |
-
* @param $class string the class name to set
|
222 |
-
*/
|
223 |
-
public function setAuthClass($class)
|
224 |
-
{
|
225 |
-
$prev = $this->configuration['auth_class'];
|
226 |
-
if (!isset($this->configuration['classes'][$class]) &&
|
227 |
-
isset($this->configuration['classes'][$prev])) {
|
228 |
-
$this->configuration['classes'][$class] =
|
229 |
-
$this->configuration['classes'][$prev];
|
230 |
-
}
|
231 |
-
$this->configuration['auth_class'] = $class;
|
232 |
-
}
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Set the IO class.
|
236 |
-
*
|
237 |
-
* @param $class string the class name to set
|
238 |
-
*/
|
239 |
-
public function setIoClass($class)
|
240 |
-
{
|
241 |
-
$prev = $this->configuration['io_class'];
|
242 |
-
if (!isset($this->configuration['classes'][$class]) &&
|
243 |
-
isset($this->configuration['classes'][$prev])) {
|
244 |
-
$this->configuration['classes'][$class] =
|
245 |
-
$this->configuration['classes'][$prev];
|
246 |
-
}
|
247 |
-
$this->configuration['io_class'] = $class;
|
248 |
-
}
|
249 |
-
|
250 |
-
/**
|
251 |
-
* Set the cache class.
|
252 |
-
*
|
253 |
-
* @param $class string the class name to set
|
254 |
-
*/
|
255 |
-
public function setCacheClass($class)
|
256 |
-
{
|
257 |
-
$prev = $this->configuration['cache_class'];
|
258 |
-
if (!isset($this->configuration['classes'][$class]) &&
|
259 |
-
isset($this->configuration['classes'][$prev])) {
|
260 |
-
$this->configuration['classes'][$class] =
|
261 |
-
$this->configuration['classes'][$prev];
|
262 |
-
}
|
263 |
-
$this->configuration['cache_class'] = $class;
|
264 |
-
}
|
265 |
-
|
266 |
-
/**
|
267 |
-
* Set the logger class.
|
268 |
-
*
|
269 |
-
* @param $class string the class name to set
|
270 |
-
*/
|
271 |
-
public function setLoggerClass($class)
|
272 |
-
{
|
273 |
-
$prev = $this->configuration['logger_class'];
|
274 |
-
if (!isset($this->configuration['classes'][$class]) &&
|
275 |
-
isset($this->configuration['classes'][$prev])) {
|
276 |
-
$this->configuration['classes'][$class] =
|
277 |
-
$this->configuration['classes'][$prev];
|
278 |
-
}
|
279 |
-
$this->configuration['logger_class'] = $class;
|
280 |
-
}
|
281 |
-
|
282 |
-
/**
|
283 |
-
* Return the configured IO class.
|
284 |
-
*
|
285 |
-
* @return string
|
286 |
-
*/
|
287 |
-
public function getIoClass()
|
288 |
-
{
|
289 |
-
return $this->configuration['io_class'];
|
290 |
-
}
|
291 |
-
|
292 |
-
/**
|
293 |
-
* Set the application name, this is included in the User-Agent HTTP header.
|
294 |
-
* @param string $name
|
295 |
-
*/
|
296 |
-
public function setApplicationName($name)
|
297 |
-
{
|
298 |
-
$this->configuration['application_name'] = $name;
|
299 |
-
}
|
300 |
-
|
301 |
-
/**
|
302 |
-
* @return string the name of the application
|
303 |
-
*/
|
304 |
-
public function getApplicationName()
|
305 |
-
{
|
306 |
-
return $this->configuration['application_name'];
|
307 |
-
}
|
308 |
-
|
309 |
-
/**
|
310 |
-
* Set the client ID for the auth class.
|
311 |
-
* @param $clientId string - the API console client ID
|
312 |
-
*/
|
313 |
-
public function setClientId($clientId)
|
314 |
-
{
|
315 |
-
$this->setAuthConfig('client_id', $clientId);
|
316 |
-
}
|
317 |
-
|
318 |
-
/**
|
319 |
-
* Set the client secret for the auth class.
|
320 |
-
* @param $secret string - the API console client secret
|
321 |
-
*/
|
322 |
-
public function setClientSecret($secret)
|
323 |
-
{
|
324 |
-
$this->setAuthConfig('client_secret', $secret);
|
325 |
-
}
|
326 |
-
|
327 |
-
/**
|
328 |
-
* Set the redirect uri for the auth class. Note that if using the
|
329 |
-
* Javascript based sign in flow, this should be the string 'postmessage'.
|
330 |
-
*
|
331 |
-
* @param $uri string - the URI that users should be redirected to
|
332 |
-
*/
|
333 |
-
public function setRedirectUri($uri)
|
334 |
-
{
|
335 |
-
$this->setAuthConfig('redirect_uri', $uri);
|
336 |
-
}
|
337 |
-
|
338 |
-
/**
|
339 |
-
* Set the app activities for the auth class.
|
340 |
-
* @param $rva string a space separated list of app activity types
|
341 |
-
*/
|
342 |
-
public function setRequestVisibleActions($rva)
|
343 |
-
{
|
344 |
-
$this->setAuthConfig('request_visible_actions', $rva);
|
345 |
-
}
|
346 |
-
|
347 |
-
/**
|
348 |
-
* Set the the access type requested (offline or online.)
|
349 |
-
* @param $access string - the access type
|
350 |
-
*/
|
351 |
-
public function setAccessType($access)
|
352 |
-
{
|
353 |
-
$this->setAuthConfig('access_type', $access);
|
354 |
-
}
|
355 |
-
|
356 |
-
/**
|
357 |
-
* Set when to show the approval prompt (auto or force)
|
358 |
-
* @param $approval string - the approval request
|
359 |
-
*/
|
360 |
-
public function setApprovalPrompt($approval)
|
361 |
-
{
|
362 |
-
$this->setAuthConfig('approval_prompt', $approval);
|
363 |
-
}
|
364 |
-
|
365 |
-
/**
|
366 |
-
* Set the login hint (email address or sub identifier)
|
367 |
-
* @param $hint string
|
368 |
-
*/
|
369 |
-
public function setLoginHint($hint)
|
370 |
-
{
|
371 |
-
$this->setAuthConfig('login_hint', $hint);
|
372 |
-
}
|
373 |
-
|
374 |
-
/**
|
375 |
-
* Set the developer key for the auth class. Note that this is separate value
|
376 |
-
* from the client ID - if it looks like a URL, its a client ID!
|
377 |
-
* @param $key string - the API console developer key
|
378 |
-
*/
|
379 |
-
public function setDeveloperKey($key)
|
380 |
-
{
|
381 |
-
$this->setAuthConfig('developer_key', $key);
|
382 |
-
}
|
383 |
-
|
384 |
-
/**
|
385 |
-
* Set the hd (hosted domain) parameter streamlines the login process for
|
386 |
-
* Google Apps hosted accounts. By including the domain of the user, you
|
387 |
-
* restrict sign-in to accounts at that domain.
|
388 |
-
*
|
389 |
-
* This should not be used to ensure security on your application - check
|
390 |
-
* the hd values within an id token (@see Google_Auth_LoginTicket) after sign
|
391 |
-
* in to ensure that the user is from the domain you were expecting.
|
392 |
-
*
|
393 |
-
* @param $hd string - the domain to use.
|
394 |
-
*/
|
395 |
-
public function setHostedDomain($hd)
|
396 |
-
{
|
397 |
-
$this->setAuthConfig('hd', $hd);
|
398 |
-
}
|
399 |
-
|
400 |
-
/**
|
401 |
-
* Set the prompt hint. Valid values are none, consent and select_account.
|
402 |
-
* If no value is specified and the user has not previously authorized
|
403 |
-
* access, then the user is shown a consent screen.
|
404 |
-
* @param $prompt string
|
405 |
-
*/
|
406 |
-
public function setPrompt($prompt)
|
407 |
-
{
|
408 |
-
$this->setAuthConfig('prompt', $prompt);
|
409 |
-
}
|
410 |
-
|
411 |
-
/**
|
412 |
-
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
413 |
-
* 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
|
414 |
-
* an authentication request is valid.
|
415 |
-
* @param $realm string - the URL-space to use.
|
416 |
-
*/
|
417 |
-
public function setOpenidRealm($realm)
|
418 |
-
{
|
419 |
-
$this->setAuthConfig('openid.realm', $realm);
|
420 |
-
}
|
421 |
-
|
422 |
-
/**
|
423 |
-
* If this is provided with the value true, and the authorization request is
|
424 |
-
* granted, the authorization will include any previous authorizations
|
425 |
-
* granted to this user/application combination for other scopes.
|
426 |
-
* @param $include boolean - the URL-space to use.
|
427 |
-
*/
|
428 |
-
public function setIncludeGrantedScopes($include)
|
429 |
-
{
|
430 |
-
$this->setAuthConfig(
|
431 |
-
'include_granted_scopes',
|
432 |
-
$include ? "true" : "false"
|
433 |
-
);
|
434 |
-
}
|
435 |
-
|
436 |
-
/**
|
437 |
-
* @return string the base URL to use for API calls
|
438 |
-
*/
|
439 |
-
public function getBasePath()
|
440 |
-
{
|
441 |
-
return $this->configuration['base_path'];
|
442 |
-
}
|
443 |
-
|
444 |
-
/**
|
445 |
-
* Set the auth configuration for the current auth class.
|
446 |
-
* @param $key - the key to set
|
447 |
-
* @param $value - the parameter value
|
448 |
-
*/
|
449 |
-
private function setAuthConfig($key, $value)
|
450 |
-
{
|
451 |
-
if (!isset($this->configuration['classes'][$this->getAuthClass()])) {
|
452 |
-
$this->configuration['classes'][$this->getAuthClass()] = array();
|
453 |
-
}
|
454 |
-
$this->configuration['classes'][$this->getAuthClass()][$key] = $value;
|
455 |
-
}
|
456 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* A class to contain the library configuration for the Google API client.
|
20 |
+
*/
|
21 |
+
class Google_Config
|
22 |
+
{
|
23 |
+
const GZIP_DISABLED = true;
|
24 |
+
const GZIP_ENABLED = false;
|
25 |
+
const GZIP_UPLOADS_ENABLED = true;
|
26 |
+
const GZIP_UPLOADS_DISABLED = false;
|
27 |
+
const USE_AUTO_IO_SELECTION = "auto";
|
28 |
+
const TASK_RETRY_NEVER = 0;
|
29 |
+
const TASK_RETRY_ONCE = 1;
|
30 |
+
const TASK_RETRY_ALWAYS = -1;
|
31 |
+
protected $configuration;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Create a new Google_Config. Can accept an ini file location with the
|
35 |
+
* local configuration. For example:
|
36 |
+
* application_name="My App"
|
37 |
+
*
|
38 |
+
* @param [$ini_file_location] - optional - The location of the ini file to load
|
39 |
+
*/
|
40 |
+
public function __construct($ini_file_location = null)
|
41 |
+
{
|
42 |
+
$this->configuration = array(
|
43 |
+
// The application_name is included in the User-Agent HTTP header.
|
44 |
+
'application_name' => '',
|
45 |
+
|
46 |
+
// Which Authentication, Storage and HTTP IO classes to use.
|
47 |
+
'auth_class' => 'Google_Auth_OAuth2',
|
48 |
+
'io_class' => self::USE_AUTO_IO_SELECTION,
|
49 |
+
'cache_class' => 'Google_Cache_File',
|
50 |
+
'logger_class' => 'Google_Logger_Null',
|
51 |
+
|
52 |
+
// Don't change these unless you're working against a special development
|
53 |
+
// or testing environment.
|
54 |
+
'base_path' => 'https://www.googleapis.com',
|
55 |
+
|
56 |
+
// Definition of class specific values, like file paths and so on.
|
57 |
+
'classes' => array(
|
58 |
+
'Google_IO_Abstract' => array(
|
59 |
+
'request_timeout_seconds' => 100,
|
60 |
+
),
|
61 |
+
'Google_IO_Curl' => array(
|
62 |
+
'disable_proxy_workaround' => false,
|
63 |
+
'options' => null,
|
64 |
+
),
|
65 |
+
'Google_Logger_Abstract' => array(
|
66 |
+
'level' => 'debug',
|
67 |
+
'log_format' => "[%datetime%] %level%: %message% %context%\n",
|
68 |
+
'date_format' => 'd/M/Y:H:i:s O',
|
69 |
+
'allow_newlines' => true
|
70 |
+
),
|
71 |
+
'Google_Logger_File' => array(
|
72 |
+
'file' => 'php://stdout',
|
73 |
+
'mode' => 0640,
|
74 |
+
'lock' => false,
|
75 |
+
),
|
76 |
+
'Google_Http_Request' => array(
|
77 |
+
// Disable the use of gzip on calls if set to true. Defaults to false.
|
78 |
+
'disable_gzip' => self::GZIP_ENABLED,
|
79 |
+
|
80 |
+
// We default gzip to disabled on uploads even if gzip is otherwise
|
81 |
+
// enabled, due to some issues seen with small packet sizes for uploads.
|
82 |
+
// Please test with this option before enabling gzip for uploads in
|
83 |
+
// a production environment.
|
84 |
+
'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED,
|
85 |
+
),
|
86 |
+
// If you want to pass in OAuth 2.0 settings, they will need to be
|
87 |
+
// structured like this.
|
88 |
+
'Google_Auth_OAuth2' => array(
|
89 |
+
// Keys for OAuth 2.0 access, see the API console at
|
90 |
+
// https://developers.google.com/console
|
91 |
+
'client_id' => '',
|
92 |
+
'client_secret' => '',
|
93 |
+
'redirect_uri' => '',
|
94 |
+
|
95 |
+
// Simple API access key, also from the API console. Ensure you get
|
96 |
+
// a Server key, and not a Browser key.
|
97 |
+
'developer_key' => '',
|
98 |
+
|
99 |
+
// Other parameters.
|
100 |
+
'hd' => '',
|
101 |
+
'prompt' => '',
|
102 |
+
'openid.realm' => '',
|
103 |
+
'include_granted_scopes' => '',
|
104 |
+
'login_hint' => '',
|
105 |
+
'request_visible_actions' => '',
|
106 |
+
'access_type' => 'online',
|
107 |
+
'approval_prompt' => 'auto',
|
108 |
+
'federated_signon_certs_url' =>
|
109 |
+
'https://www.googleapis.com/oauth2/v1/certs',
|
110 |
+
),
|
111 |
+
'Google_Task_Runner' => array(
|
112 |
+
// Delays are specified in seconds
|
113 |
+
'initial_delay' => 1,
|
114 |
+
'max_delay' => 60,
|
115 |
+
// Base number for exponential backoff
|
116 |
+
'factor' => 2,
|
117 |
+
// A random number between -jitter and jitter will be added to the
|
118 |
+
// factor on each iteration to allow for better distribution of
|
119 |
+
// retries.
|
120 |
+
'jitter' => .5,
|
121 |
+
// Maximum number of retries allowed
|
122 |
+
'retries' => 0
|
123 |
+
),
|
124 |
+
'Google_Service_Exception' => array(
|
125 |
+
'retry_map' => array(
|
126 |
+
'500' => self::TASK_RETRY_ALWAYS,
|
127 |
+
'503' => self::TASK_RETRY_ALWAYS,
|
128 |
+
'rateLimitExceeded' => self::TASK_RETRY_ALWAYS,
|
129 |
+
'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS
|
130 |
+
)
|
131 |
+
),
|
132 |
+
'Google_IO_Exception' => array(
|
133 |
+
'retry_map' => !extension_loaded('curl') ? array() : array(
|
134 |
+
CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS,
|
135 |
+
CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS,
|
136 |
+
CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS,
|
137 |
+
CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS,
|
138 |
+
CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS
|
139 |
+
)
|
140 |
+
),
|
141 |
+
// Set a default directory for the file cache.
|
142 |
+
'Google_Cache_File' => array(
|
143 |
+
'directory' => sys_get_temp_dir() . '/Google_Client'
|
144 |
+
)
|
145 |
+
),
|
146 |
+
);
|
147 |
+
if ($ini_file_location) {
|
148 |
+
$ini = parse_ini_file($ini_file_location, true);
|
149 |
+
if (is_array($ini) && count($ini)) {
|
150 |
+
$merged_configuration = $ini + $this->configuration;
|
151 |
+
if (isset($ini['classes']) && isset($this->configuration['classes'])) {
|
152 |
+
$merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
|
153 |
+
}
|
154 |
+
$this->configuration = $merged_configuration;
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Set configuration specific to a given class.
|
161 |
+
* $config->setClassConfig('Google_Cache_File',
|
162 |
+
* array('directory' => '/tmp/cache'));
|
163 |
+
* @param $class string The class name for the configuration
|
164 |
+
* @param $config string key or an array of configuration values
|
165 |
+
* @param $value string optional - if $config is a key, the value
|
166 |
+
*/
|
167 |
+
public function setClassConfig($class, $config, $value = null)
|
168 |
+
{
|
169 |
+
if (!is_array($config)) {
|
170 |
+
if (!isset($this->configuration['classes'][$class])) {
|
171 |
+
$this->configuration['classes'][$class] = array();
|
172 |
+
}
|
173 |
+
$this->configuration['classes'][$class][$config] = $value;
|
174 |
+
} else {
|
175 |
+
$this->configuration['classes'][$class] = $config;
|
176 |
+
}
|
177 |
+
}
|
178 |
+
|
179 |
+
public function getClassConfig($class, $key = null)
|
180 |
+
{
|
181 |
+
if (!isset($this->configuration['classes'][$class])) {
|
182 |
+
return null;
|
183 |
+
}
|
184 |
+
if ($key === null) {
|
185 |
+
return $this->configuration['classes'][$class];
|
186 |
+
} else {
|
187 |
+
return $this->configuration['classes'][$class][$key];
|
188 |
+
}
|
189 |
+
}
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Return the configured cache class.
|
193 |
+
* @return string
|
194 |
+
*/
|
195 |
+
public function getCacheClass()
|
196 |
+
{
|
197 |
+
return $this->configuration['cache_class'];
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Return the configured logger class.
|
202 |
+
* @return string
|
203 |
+
*/
|
204 |
+
public function getLoggerClass()
|
205 |
+
{
|
206 |
+
return $this->configuration['logger_class'];
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* Return the configured Auth class.
|
211 |
+
* @return string
|
212 |
+
*/
|
213 |
+
public function getAuthClass()
|
214 |
+
{
|
215 |
+
return $this->configuration['auth_class'];
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Set the auth class.
|
220 |
+
*
|
221 |
+
* @param $class string the class name to set
|
222 |
+
*/
|
223 |
+
public function setAuthClass($class)
|
224 |
+
{
|
225 |
+
$prev = $this->configuration['auth_class'];
|
226 |
+
if (!isset($this->configuration['classes'][$class]) &&
|
227 |
+
isset($this->configuration['classes'][$prev])) {
|
228 |
+
$this->configuration['classes'][$class] =
|
229 |
+
$this->configuration['classes'][$prev];
|
230 |
+
}
|
231 |
+
$this->configuration['auth_class'] = $class;
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* Set the IO class.
|
236 |
+
*
|
237 |
+
* @param $class string the class name to set
|
238 |
+
*/
|
239 |
+
public function setIoClass($class)
|
240 |
+
{
|
241 |
+
$prev = $this->configuration['io_class'];
|
242 |
+
if (!isset($this->configuration['classes'][$class]) &&
|
243 |
+
isset($this->configuration['classes'][$prev])) {
|
244 |
+
$this->configuration['classes'][$class] =
|
245 |
+
$this->configuration['classes'][$prev];
|
246 |
+
}
|
247 |
+
$this->configuration['io_class'] = $class;
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Set the cache class.
|
252 |
+
*
|
253 |
+
* @param $class string the class name to set
|
254 |
+
*/
|
255 |
+
public function setCacheClass($class)
|
256 |
+
{
|
257 |
+
$prev = $this->configuration['cache_class'];
|
258 |
+
if (!isset($this->configuration['classes'][$class]) &&
|
259 |
+
isset($this->configuration['classes'][$prev])) {
|
260 |
+
$this->configuration['classes'][$class] =
|
261 |
+
$this->configuration['classes'][$prev];
|
262 |
+
}
|
263 |
+
$this->configuration['cache_class'] = $class;
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Set the logger class.
|
268 |
+
*
|
269 |
+
* @param $class string the class name to set
|
270 |
+
*/
|
271 |
+
public function setLoggerClass($class)
|
272 |
+
{
|
273 |
+
$prev = $this->configuration['logger_class'];
|
274 |
+
if (!isset($this->configuration['classes'][$class]) &&
|
275 |
+
isset($this->configuration['classes'][$prev])) {
|
276 |
+
$this->configuration['classes'][$class] =
|
277 |
+
$this->configuration['classes'][$prev];
|
278 |
+
}
|
279 |
+
$this->configuration['logger_class'] = $class;
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Return the configured IO class.
|
284 |
+
*
|
285 |
+
* @return string
|
286 |
+
*/
|
287 |
+
public function getIoClass()
|
288 |
+
{
|
289 |
+
return $this->configuration['io_class'];
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Set the application name, this is included in the User-Agent HTTP header.
|
294 |
+
* @param string $name
|
295 |
+
*/
|
296 |
+
public function setApplicationName($name)
|
297 |
+
{
|
298 |
+
$this->configuration['application_name'] = $name;
|
299 |
+
}
|
300 |
+
|
301 |
+
/**
|
302 |
+
* @return string the name of the application
|
303 |
+
*/
|
304 |
+
public function getApplicationName()
|
305 |
+
{
|
306 |
+
return $this->configuration['application_name'];
|
307 |
+
}
|
308 |
+
|
309 |
+
/**
|
310 |
+
* Set the client ID for the auth class.
|
311 |
+
* @param $clientId string - the API console client ID
|
312 |
+
*/
|
313 |
+
public function setClientId($clientId)
|
314 |
+
{
|
315 |
+
$this->setAuthConfig('client_id', $clientId);
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Set the client secret for the auth class.
|
320 |
+
* @param $secret string - the API console client secret
|
321 |
+
*/
|
322 |
+
public function setClientSecret($secret)
|
323 |
+
{
|
324 |
+
$this->setAuthConfig('client_secret', $secret);
|
325 |
+
}
|
326 |
+
|
327 |
+
/**
|
328 |
+
* Set the redirect uri for the auth class. Note that if using the
|
329 |
+
* Javascript based sign in flow, this should be the string 'postmessage'.
|
330 |
+
*
|
331 |
+
* @param $uri string - the URI that users should be redirected to
|
332 |
+
*/
|
333 |
+
public function setRedirectUri($uri)
|
334 |
+
{
|
335 |
+
$this->setAuthConfig('redirect_uri', $uri);
|
336 |
+
}
|
337 |
+
|
338 |
+
/**
|
339 |
+
* Set the app activities for the auth class.
|
340 |
+
* @param $rva string a space separated list of app activity types
|
341 |
+
*/
|
342 |
+
public function setRequestVisibleActions($rva)
|
343 |
+
{
|
344 |
+
$this->setAuthConfig('request_visible_actions', $rva);
|
345 |
+
}
|
346 |
+
|
347 |
+
/**
|
348 |
+
* Set the the access type requested (offline or online.)
|
349 |
+
* @param $access string - the access type
|
350 |
+
*/
|
351 |
+
public function setAccessType($access)
|
352 |
+
{
|
353 |
+
$this->setAuthConfig('access_type', $access);
|
354 |
+
}
|
355 |
+
|
356 |
+
/**
|
357 |
+
* Set when to show the approval prompt (auto or force)
|
358 |
+
* @param $approval string - the approval request
|
359 |
+
*/
|
360 |
+
public function setApprovalPrompt($approval)
|
361 |
+
{
|
362 |
+
$this->setAuthConfig('approval_prompt', $approval);
|
363 |
+
}
|
364 |
+
|
365 |
+
/**
|
366 |
+
* Set the login hint (email address or sub identifier)
|
367 |
+
* @param $hint string
|
368 |
+
*/
|
369 |
+
public function setLoginHint($hint)
|
370 |
+
{
|
371 |
+
$this->setAuthConfig('login_hint', $hint);
|
372 |
+
}
|
373 |
+
|
374 |
+
/**
|
375 |
+
* Set the developer key for the auth class. Note that this is separate value
|
376 |
+
* from the client ID - if it looks like a URL, its a client ID!
|
377 |
+
* @param $key string - the API console developer key
|
378 |
+
*/
|
379 |
+
public function setDeveloperKey($key)
|
380 |
+
{
|
381 |
+
$this->setAuthConfig('developer_key', $key);
|
382 |
+
}
|
383 |
+
|
384 |
+
/**
|
385 |
+
* Set the hd (hosted domain) parameter streamlines the login process for
|
386 |
+
* Google Apps hosted accounts. By including the domain of the user, you
|
387 |
+
* restrict sign-in to accounts at that domain.
|
388 |
+
*
|
389 |
+
* This should not be used to ensure security on your application - check
|
390 |
+
* the hd values within an id token (@see Google_Auth_LoginTicket) after sign
|
391 |
+
* in to ensure that the user is from the domain you were expecting.
|
392 |
+
*
|
393 |
+
* @param $hd string - the domain to use.
|
394 |
+
*/
|
395 |
+
public function setHostedDomain($hd)
|
396 |
+
{
|
397 |
+
$this->setAuthConfig('hd', $hd);
|
398 |
+
}
|
399 |
+
|
400 |
+
/**
|
401 |
+
* Set the prompt hint. Valid values are none, consent and select_account.
|
402 |
+
* If no value is specified and the user has not previously authorized
|
403 |
+
* access, then the user is shown a consent screen.
|
404 |
+
* @param $prompt string
|
405 |
+
*/
|
406 |
+
public function setPrompt($prompt)
|
407 |
+
{
|
408 |
+
$this->setAuthConfig('prompt', $prompt);
|
409 |
+
}
|
410 |
+
|
411 |
+
/**
|
412 |
+
* openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
|
413 |
+
* 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
|
414 |
+
* an authentication request is valid.
|
415 |
+
* @param $realm string - the URL-space to use.
|
416 |
+
*/
|
417 |
+
public function setOpenidRealm($realm)
|
418 |
+
{
|
419 |
+
$this->setAuthConfig('openid.realm', $realm);
|
420 |
+
}
|
421 |
+
|
422 |
+
/**
|
423 |
+
* If this is provided with the value true, and the authorization request is
|
424 |
+
* granted, the authorization will include any previous authorizations
|
425 |
+
* granted to this user/application combination for other scopes.
|
426 |
+
* @param $include boolean - the URL-space to use.
|
427 |
+
*/
|
428 |
+
public function setIncludeGrantedScopes($include)
|
429 |
+
{
|
430 |
+
$this->setAuthConfig(
|
431 |
+
'include_granted_scopes',
|
432 |
+
$include ? "true" : "false"
|
433 |
+
);
|
434 |
+
}
|
435 |
+
|
436 |
+
/**
|
437 |
+
* @return string the base URL to use for API calls
|
438 |
+
*/
|
439 |
+
public function getBasePath()
|
440 |
+
{
|
441 |
+
return $this->configuration['base_path'];
|
442 |
+
}
|
443 |
+
|
444 |
+
/**
|
445 |
+
* Set the auth configuration for the current auth class.
|
446 |
+
* @param $key - the key to set
|
447 |
+
* @param $value - the parameter value
|
448 |
+
*/
|
449 |
+
private function setAuthConfig($key, $value)
|
450 |
+
{
|
451 |
+
if (!isset($this->configuration['classes'][$this->getAuthClass()])) {
|
452 |
+
$this->configuration['classes'][$this->getAuthClass()] = array();
|
453 |
+
}
|
454 |
+
$this->configuration['classes'][$this->getAuthClass()][$key] = $value;
|
455 |
+
}
|
456 |
+
}
|
app/api/Google/Exception.php
CHANGED
@@ -1,20 +1,20 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
class Google_Exception extends Exception
|
19 |
-
{
|
20 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
class Google_Exception extends Exception
|
19 |
+
{
|
20 |
+
}
|
app/api/Google/Http/Batch.php
CHANGED
@@ -1,145 +1,145 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Class to handle batched requests to the Google API service.
|
24 |
-
*/
|
25 |
-
class Google_Http_Batch
|
26 |
-
{
|
27 |
-
/** @var string Multipart Boundary. */
|
28 |
-
private $boundary;
|
29 |
-
|
30 |
-
/** @var array service requests to be executed. */
|
31 |
-
private $requests = array();
|
32 |
-
|
33 |
-
/** @var Google_Client */
|
34 |
-
private $client;
|
35 |
-
|
36 |
-
private $expected_classes = array();
|
37 |
-
|
38 |
-
private $root_url;
|
39 |
-
|
40 |
-
private $batch_path;
|
41 |
-
|
42 |
-
public function __construct(Google_Client $client, $boundary = false, $rootUrl = '', $batchPath = '')
|
43 |
-
{
|
44 |
-
$this->client = $client;
|
45 |
-
$this->root_url = rtrim($rootUrl ? $rootUrl : $this->client->getBasePath(), '/');
|
46 |
-
$this->batch_path = $batchPath ? $batchPath : 'batch';
|
47 |
-
$this->expected_classes = array();
|
48 |
-
$boundary = (false == $boundary) ? mt_rand() : $boundary;
|
49 |
-
$this->boundary = str_replace('"', '', $boundary);
|
50 |
-
}
|
51 |
-
|
52 |
-
public function add(Google_Http_Request $request, $key = false)
|
53 |
-
{
|
54 |
-
if (false == $key) {
|
55 |
-
$key = mt_rand();
|
56 |
-
}
|
57 |
-
|
58 |
-
$this->requests[$key] = $request;
|
59 |
-
}
|
60 |
-
|
61 |
-
public function execute()
|
62 |
-
{
|
63 |
-
$body = '';
|
64 |
-
|
65 |
-
/** @var Google_Http_Request $req */
|
66 |
-
foreach ($this->requests as $key => $req) {
|
67 |
-
$body .= "--{$this->boundary}\n";
|
68 |
-
$body .= $req->toBatchString($key) . "\n\n";
|
69 |
-
$this->expected_classes["response-" . $key] = $req->getExpectedClass();
|
70 |
-
}
|
71 |
-
|
72 |
-
$body .= "--{$this->boundary}--";
|
73 |
-
|
74 |
-
$url = $this->root_url . '/' . $this->batch_path;
|
75 |
-
$httpRequest = new Google_Http_Request($url, 'POST');
|
76 |
-
$httpRequest->setRequestHeaders(
|
77 |
-
array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary)
|
78 |
-
);
|
79 |
-
|
80 |
-
$httpRequest->setPostBody($body);
|
81 |
-
$response = $this->client->getIo()->makeRequest($httpRequest);
|
82 |
-
|
83 |
-
return $this->parseResponse($response);
|
84 |
-
}
|
85 |
-
|
86 |
-
public function parseResponse(Google_Http_Request $response)
|
87 |
-
{
|
88 |
-
$contentType = $response->getResponseHeader('content-type');
|
89 |
-
$contentType = explode(';', $contentType);
|
90 |
-
$boundary = false;
|
91 |
-
foreach ($contentType as $part) {
|
92 |
-
$part = (explode('=', $part, 2));
|
93 |
-
if (isset($part[0]) && 'boundary' == trim($part[0])) {
|
94 |
-
$boundary = $part[1];
|
95 |
-
}
|
96 |
-
}
|
97 |
-
|
98 |
-
$body = $response->getResponseBody();
|
99 |
-
if ($body) {
|
100 |
-
$body = str_replace("--$boundary--", "--$boundary", $body);
|
101 |
-
$parts = explode("--$boundary", $body);
|
102 |
-
$responses = array();
|
103 |
-
|
104 |
-
foreach ($parts as $part) {
|
105 |
-
$part = trim($part);
|
106 |
-
if (!empty($part)) {
|
107 |
-
list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2);
|
108 |
-
$metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders);
|
109 |
-
|
110 |
-
$status = substr($part, 0, strpos($part, "\n"));
|
111 |
-
$status = explode(" ", $status);
|
112 |
-
$status = $status[1];
|
113 |
-
|
114 |
-
list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false);
|
115 |
-
$response = new Google_Http_Request("");
|
116 |
-
$response->setResponseHttpCode($status);
|
117 |
-
$response->setResponseHeaders($partHeaders);
|
118 |
-
$response->setResponseBody($partBody);
|
119 |
-
|
120 |
-
// Need content id.
|
121 |
-
$key = $metaHeaders['content-id'];
|
122 |
-
|
123 |
-
if (isset($this->expected_classes[$key]) &&
|
124 |
-
strlen($this->expected_classes[$key]) > 0) {
|
125 |
-
$class = $this->expected_classes[$key];
|
126 |
-
$response->setExpectedClass($class);
|
127 |
-
}
|
128 |
-
|
129 |
-
try {
|
130 |
-
$response = Google_Http_REST::decodeHttpResponse($response, $this->client);
|
131 |
-
$responses[$key] = $response;
|
132 |
-
} catch (Google_Service_Exception $e) {
|
133 |
-
// Store the exception as the response, so successful responses
|
134 |
-
// can be processed.
|
135 |
-
$responses[$key] = $e;
|
136 |
-
}
|
137 |
-
}
|
138 |
-
}
|
139 |
-
|
140 |
-
return $responses;
|
141 |
-
}
|
142 |
-
|
143 |
-
return null;
|
144 |
-
}
|
145 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Class to handle batched requests to the Google API service.
|
24 |
+
*/
|
25 |
+
class Google_Http_Batch
|
26 |
+
{
|
27 |
+
/** @var string Multipart Boundary. */
|
28 |
+
private $boundary;
|
29 |
+
|
30 |
+
/** @var array service requests to be executed. */
|
31 |
+
private $requests = array();
|
32 |
+
|
33 |
+
/** @var Google_Client */
|
34 |
+
private $client;
|
35 |
+
|
36 |
+
private $expected_classes = array();
|
37 |
+
|
38 |
+
private $root_url;
|
39 |
+
|
40 |
+
private $batch_path;
|
41 |
+
|
42 |
+
public function __construct(Google_Client $client, $boundary = false, $rootUrl = '', $batchPath = '')
|
43 |
+
{
|
44 |
+
$this->client = $client;
|
45 |
+
$this->root_url = rtrim($rootUrl ? $rootUrl : $this->client->getBasePath(), '/');
|
46 |
+
$this->batch_path = $batchPath ? $batchPath : 'batch';
|
47 |
+
$this->expected_classes = array();
|
48 |
+
$boundary = (false == $boundary) ? mt_rand() : $boundary;
|
49 |
+
$this->boundary = str_replace('"', '', $boundary);
|
50 |
+
}
|
51 |
+
|
52 |
+
public function add(Google_Http_Request $request, $key = false)
|
53 |
+
{
|
54 |
+
if (false == $key) {
|
55 |
+
$key = mt_rand();
|
56 |
+
}
|
57 |
+
|
58 |
+
$this->requests[$key] = $request;
|
59 |
+
}
|
60 |
+
|
61 |
+
public function execute()
|
62 |
+
{
|
63 |
+
$body = '';
|
64 |
+
|
65 |
+
/** @var Google_Http_Request $req */
|
66 |
+
foreach ($this->requests as $key => $req) {
|
67 |
+
$body .= "--{$this->boundary}\n";
|
68 |
+
$body .= $req->toBatchString($key) . "\n\n";
|
69 |
+
$this->expected_classes["response-" . $key] = $req->getExpectedClass();
|
70 |
+
}
|
71 |
+
|
72 |
+
$body .= "--{$this->boundary}--";
|
73 |
+
|
74 |
+
$url = $this->root_url . '/' . $this->batch_path;
|
75 |
+
$httpRequest = new Google_Http_Request($url, 'POST');
|
76 |
+
$httpRequest->setRequestHeaders(
|
77 |
+
array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary)
|
78 |
+
);
|
79 |
+
|
80 |
+
$httpRequest->setPostBody($body);
|
81 |
+
$response = $this->client->getIo()->makeRequest($httpRequest);
|
82 |
+
|
83 |
+
return $this->parseResponse($response);
|
84 |
+
}
|
85 |
+
|
86 |
+
public function parseResponse(Google_Http_Request $response)
|
87 |
+
{
|
88 |
+
$contentType = $response->getResponseHeader('content-type');
|
89 |
+
$contentType = explode(';', $contentType);
|
90 |
+
$boundary = false;
|
91 |
+
foreach ($contentType as $part) {
|
92 |
+
$part = (explode('=', $part, 2));
|
93 |
+
if (isset($part[0]) && 'boundary' == trim($part[0])) {
|
94 |
+
$boundary = $part[1];
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
$body = $response->getResponseBody();
|
99 |
+
if ($body) {
|
100 |
+
$body = str_replace("--$boundary--", "--$boundary", $body);
|
101 |
+
$parts = explode("--$boundary", $body);
|
102 |
+
$responses = array();
|
103 |
+
|
104 |
+
foreach ($parts as $part) {
|
105 |
+
$part = trim($part);
|
106 |
+
if (!empty($part)) {
|
107 |
+
list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2);
|
108 |
+
$metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders);
|
109 |
+
|
110 |
+
$status = substr($part, 0, strpos($part, "\n"));
|
111 |
+
$status = explode(" ", $status);
|
112 |
+
$status = $status[1];
|
113 |
+
|
114 |
+
list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false);
|
115 |
+
$response = new Google_Http_Request("");
|
116 |
+
$response->setResponseHttpCode($status);
|
117 |
+
$response->setResponseHeaders($partHeaders);
|
118 |
+
$response->setResponseBody($partBody);
|
119 |
+
|
120 |
+
// Need content id.
|
121 |
+
$key = $metaHeaders['content-id'];
|
122 |
+
|
123 |
+
if (isset($this->expected_classes[$key]) &&
|
124 |
+
strlen($this->expected_classes[$key]) > 0) {
|
125 |
+
$class = $this->expected_classes[$key];
|
126 |
+
$response->setExpectedClass($class);
|
127 |
+
}
|
128 |
+
|
129 |
+
try {
|
130 |
+
$response = Google_Http_REST::decodeHttpResponse($response, $this->client);
|
131 |
+
$responses[$key] = $response;
|
132 |
+
} catch (Google_Service_Exception $e) {
|
133 |
+
// Store the exception as the response, so successful responses
|
134 |
+
// can be processed.
|
135 |
+
$responses[$key] = $e;
|
136 |
+
}
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
return $responses;
|
141 |
+
}
|
142 |
+
|
143 |
+
return null;
|
144 |
+
}
|
145 |
+
}
|
app/api/Google/Http/CacheParser.php
CHANGED
@@ -1,185 +1,185 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Implement the caching directives specified in rfc2616. This
|
24 |
-
* implementation is guided by the guidance offered in rfc2616-sec13.
|
25 |
-
*/
|
26 |
-
class Google_Http_CacheParser
|
27 |
-
{
|
28 |
-
public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD');
|
29 |
-
public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301');
|
30 |
-
|
31 |
-
/**
|
32 |
-
* Check if an HTTP request can be cached by a private local cache.
|
33 |
-
*
|
34 |
-
* @static
|
35 |
-
* @param Google_Http_Request $resp
|
36 |
-
* @return bool True if the request is cacheable.
|
37 |
-
* False if the request is uncacheable.
|
38 |
-
*/
|
39 |
-
public static function isRequestCacheable(Google_Http_Request $resp)
|
40 |
-
{
|
41 |
-
$method = $resp->getRequestMethod();
|
42 |
-
if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
|
43 |
-
return false;
|
44 |
-
}
|
45 |
-
|
46 |
-
// Don't cache authorized requests/responses.
|
47 |
-
// [rfc2616-14.8] When a shared cache receives a request containing an
|
48 |
-
// Authorization field, it MUST NOT return the corresponding response
|
49 |
-
// as a reply to any other request...
|
50 |
-
if ($resp->getRequestHeader("authorization")) {
|
51 |
-
return false;
|
52 |
-
}
|
53 |
-
|
54 |
-
return true;
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Check if an HTTP response can be cached by a private local cache.
|
59 |
-
*
|
60 |
-
* @static
|
61 |
-
* @param Google_Http_Request $resp
|
62 |
-
* @return bool True if the response is cacheable.
|
63 |
-
* False if the response is un-cacheable.
|
64 |
-
*/
|
65 |
-
public static function isResponseCacheable(Google_Http_Request $resp)
|
66 |
-
{
|
67 |
-
// First, check if the HTTP request was cacheable before inspecting the
|
68 |
-
// HTTP response.
|
69 |
-
if (false == self::isRequestCacheable($resp)) {
|
70 |
-
return false;
|
71 |
-
}
|
72 |
-
|
73 |
-
$code = $resp->getResponseHttpCode();
|
74 |
-
if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
|
75 |
-
return false;
|
76 |
-
}
|
77 |
-
|
78 |
-
// The resource is uncacheable if the resource is already expired and
|
79 |
-
// the resource doesn't have an ETag for revalidation.
|
80 |
-
$etag = $resp->getResponseHeader("etag");
|
81 |
-
if (self::isExpired($resp) && $etag == false) {
|
82 |
-
return false;
|
83 |
-
}
|
84 |
-
|
85 |
-
// [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
|
86 |
-
// store any part of either this response or the request that elicited it.
|
87 |
-
$cacheControl = $resp->getParsedCacheControl();
|
88 |
-
if (isset($cacheControl['no-store'])) {
|
89 |
-
return false;
|
90 |
-
}
|
91 |
-
|
92 |
-
// Pragma: no-cache is an http request directive, but is occasionally
|
93 |
-
// used as a response header incorrectly.
|
94 |
-
$pragma = $resp->getResponseHeader('pragma');
|
95 |
-
if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
|
96 |
-
return false;
|
97 |
-
}
|
98 |
-
|
99 |
-
// [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
|
100 |
-
// a cache cannot determine from the request headers of a subsequent request
|
101 |
-
// whether this response is the appropriate representation."
|
102 |
-
// Given this, we deem responses with the Vary header as uncacheable.
|
103 |
-
$vary = $resp->getResponseHeader('vary');
|
104 |
-
if ($vary) {
|
105 |
-
return false;
|
106 |
-
}
|
107 |
-
|
108 |
-
return true;
|
109 |
-
}
|
110 |
-
|
111 |
-
/**
|
112 |
-
* @static
|
113 |
-
* @param Google_Http_Request $resp
|
114 |
-
* @return bool True if the HTTP response is considered to be expired.
|
115 |
-
* False if it is considered to be fresh.
|
116 |
-
*/
|
117 |
-
public static function isExpired(Google_Http_Request $resp)
|
118 |
-
{
|
119 |
-
// HTTP/1.1 clients and caches MUST treat other invalid date formats,
|
120 |
-
// especially including the value “0”, as in the past.
|
121 |
-
$parsedExpires = false;
|
122 |
-
$responseHeaders = $resp->getResponseHeaders();
|
123 |
-
|
124 |
-
if (isset($responseHeaders['expires'])) {
|
125 |
-
$rawExpires = $responseHeaders['expires'];
|
126 |
-
// Check for a malformed expires header first.
|
127 |
-
if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
|
128 |
-
return true;
|
129 |
-
}
|
130 |
-
|
131 |
-
// See if we can parse the expires header.
|
132 |
-
$parsedExpires = strtotime($rawExpires);
|
133 |
-
if (false == $parsedExpires || $parsedExpires <= 0) {
|
134 |
-
return true;
|
135 |
-
}
|
136 |
-
}
|
137 |
-
|
138 |
-
// Calculate the freshness of an http response.
|
139 |
-
$freshnessLifetime = false;
|
140 |
-
$cacheControl = $resp->getParsedCacheControl();
|
141 |
-
if (isset($cacheControl['max-age'])) {
|
142 |
-
$freshnessLifetime = $cacheControl['max-age'];
|
143 |
-
}
|
144 |
-
|
145 |
-
$rawDate = $resp->getResponseHeader('date');
|
146 |
-
$parsedDate = strtotime($rawDate);
|
147 |
-
|
148 |
-
if (empty($rawDate) || false == $parsedDate) {
|
149 |
-
// We can't default this to now, as that means future cache reads
|
150 |
-
// will always pass with the logic below, so we will require a
|
151 |
-
// date be injected if not supplied.
|
152 |
-
throw new Google_Exception("All cacheable requests must have creation dates.");
|
153 |
-
}
|
154 |
-
|
155 |
-
if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
|
156 |
-
$freshnessLifetime = $parsedExpires - $parsedDate;
|
157 |
-
}
|
158 |
-
|
159 |
-
if (false == $freshnessLifetime) {
|
160 |
-
return true;
|
161 |
-
}
|
162 |
-
|
163 |
-
// Calculate the age of an http response.
|
164 |
-
$age = max(0, time() - $parsedDate);
|
165 |
-
if (isset($responseHeaders['age'])) {
|
166 |
-
$age = max($age, strtotime($responseHeaders['age']));
|
167 |
-
}
|
168 |
-
|
169 |
-
return $freshnessLifetime <= $age;
|
170 |
-
}
|
171 |
-
|
172 |
-
/**
|
173 |
-
* Determine if a cache entry should be revalidated with by the origin.
|
174 |
-
*
|
175 |
-
* @param Google_Http_Request $response
|
176 |
-
* @return bool True if the entry is expired, else return false.
|
177 |
-
*/
|
178 |
-
public static function mustRevalidate(Google_Http_Request $response)
|
179 |
-
{
|
180 |
-
// [13.3] When a cache has a stale entry that it would like to use as a
|
181 |
-
// response to a client's request, it first has to check with the origin
|
182 |
-
// server to see if its cached entry is still usable.
|
183 |
-
return self::isExpired($response);
|
184 |
-
}
|
185 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Implement the caching directives specified in rfc2616. This
|
24 |
+
* implementation is guided by the guidance offered in rfc2616-sec13.
|
25 |
+
*/
|
26 |
+
class Google_Http_CacheParser
|
27 |
+
{
|
28 |
+
public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD');
|
29 |
+
public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301');
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Check if an HTTP request can be cached by a private local cache.
|
33 |
+
*
|
34 |
+
* @static
|
35 |
+
* @param Google_Http_Request $resp
|
36 |
+
* @return bool True if the request is cacheable.
|
37 |
+
* False if the request is uncacheable.
|
38 |
+
*/
|
39 |
+
public static function isRequestCacheable(Google_Http_Request $resp)
|
40 |
+
{
|
41 |
+
$method = $resp->getRequestMethod();
|
42 |
+
if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
|
43 |
+
return false;
|
44 |
+
}
|
45 |
+
|
46 |
+
// Don't cache authorized requests/responses.
|
47 |
+
// [rfc2616-14.8] When a shared cache receives a request containing an
|
48 |
+
// Authorization field, it MUST NOT return the corresponding response
|
49 |
+
// as a reply to any other request...
|
50 |
+
if ($resp->getRequestHeader("authorization")) {
|
51 |
+
return false;
|
52 |
+
}
|
53 |
+
|
54 |
+
return true;
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Check if an HTTP response can be cached by a private local cache.
|
59 |
+
*
|
60 |
+
* @static
|
61 |
+
* @param Google_Http_Request $resp
|
62 |
+
* @return bool True if the response is cacheable.
|
63 |
+
* False if the response is un-cacheable.
|
64 |
+
*/
|
65 |
+
public static function isResponseCacheable(Google_Http_Request $resp)
|
66 |
+
{
|
67 |
+
// First, check if the HTTP request was cacheable before inspecting the
|
68 |
+
// HTTP response.
|
69 |
+
if (false == self::isRequestCacheable($resp)) {
|
70 |
+
return false;
|
71 |
+
}
|
72 |
+
|
73 |
+
$code = $resp->getResponseHttpCode();
|
74 |
+
if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
|
75 |
+
return false;
|
76 |
+
}
|
77 |
+
|
78 |
+
// The resource is uncacheable if the resource is already expired and
|
79 |
+
// the resource doesn't have an ETag for revalidation.
|
80 |
+
$etag = $resp->getResponseHeader("etag");
|
81 |
+
if (self::isExpired($resp) && $etag == false) {
|
82 |
+
return false;
|
83 |
+
}
|
84 |
+
|
85 |
+
// [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
|
86 |
+
// store any part of either this response or the request that elicited it.
|
87 |
+
$cacheControl = $resp->getParsedCacheControl();
|
88 |
+
if (isset($cacheControl['no-store'])) {
|
89 |
+
return false;
|
90 |
+
}
|
91 |
+
|
92 |
+
// Pragma: no-cache is an http request directive, but is occasionally
|
93 |
+
// used as a response header incorrectly.
|
94 |
+
$pragma = $resp->getResponseHeader('pragma');
|
95 |
+
if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
|
96 |
+
return false;
|
97 |
+
}
|
98 |
+
|
99 |
+
// [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
|
100 |
+
// a cache cannot determine from the request headers of a subsequent request
|
101 |
+
// whether this response is the appropriate representation."
|
102 |
+
// Given this, we deem responses with the Vary header as uncacheable.
|
103 |
+
$vary = $resp->getResponseHeader('vary');
|
104 |
+
if ($vary) {
|
105 |
+
return false;
|
106 |
+
}
|
107 |
+
|
108 |
+
return true;
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* @static
|
113 |
+
* @param Google_Http_Request $resp
|
114 |
+
* @return bool True if the HTTP response is considered to be expired.
|
115 |
+
* False if it is considered to be fresh.
|
116 |
+
*/
|
117 |
+
public static function isExpired(Google_Http_Request $resp)
|
118 |
+
{
|
119 |
+
// HTTP/1.1 clients and caches MUST treat other invalid date formats,
|
120 |
+
// especially including the value “0”, as in the past.
|
121 |
+
$parsedExpires = false;
|
122 |
+
$responseHeaders = $resp->getResponseHeaders();
|
123 |
+
|
124 |
+
if (isset($responseHeaders['expires'])) {
|
125 |
+
$rawExpires = $responseHeaders['expires'];
|
126 |
+
// Check for a malformed expires header first.
|
127 |
+
if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
|
128 |
+
return true;
|
129 |
+
}
|
130 |
+
|
131 |
+
// See if we can parse the expires header.
|
132 |
+
$parsedExpires = strtotime($rawExpires);
|
133 |
+
if (false == $parsedExpires || $parsedExpires <= 0) {
|
134 |
+
return true;
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
// Calculate the freshness of an http response.
|
139 |
+
$freshnessLifetime = false;
|
140 |
+
$cacheControl = $resp->getParsedCacheControl();
|
141 |
+
if (isset($cacheControl['max-age'])) {
|
142 |
+
$freshnessLifetime = $cacheControl['max-age'];
|
143 |
+
}
|
144 |
+
|
145 |
+
$rawDate = $resp->getResponseHeader('date');
|
146 |
+
$parsedDate = strtotime($rawDate);
|
147 |
+
|
148 |
+
if (empty($rawDate) || false == $parsedDate) {
|
149 |
+
// We can't default this to now, as that means future cache reads
|
150 |
+
// will always pass with the logic below, so we will require a
|
151 |
+
// date be injected if not supplied.
|
152 |
+
throw new Google_Exception("All cacheable requests must have creation dates.");
|
153 |
+
}
|
154 |
+
|
155 |
+
if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
|
156 |
+
$freshnessLifetime = $parsedExpires - $parsedDate;
|
157 |
+
}
|
158 |
+
|
159 |
+
if (false == $freshnessLifetime) {
|
160 |
+
return true;
|
161 |
+
}
|
162 |
+
|
163 |
+
// Calculate the age of an http response.
|
164 |
+
$age = max(0, time() - $parsedDate);
|
165 |
+
if (isset($responseHeaders['age'])) {
|
166 |
+
$age = max($age, strtotime($responseHeaders['age']));
|
167 |
+
}
|
168 |
+
|
169 |
+
return $freshnessLifetime <= $age;
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Determine if a cache entry should be revalidated with by the origin.
|
174 |
+
*
|
175 |
+
* @param Google_Http_Request $response
|
176 |
+
* @return bool True if the entry is expired, else return false.
|
177 |
+
*/
|
178 |
+
public static function mustRevalidate(Google_Http_Request $response)
|
179 |
+
{
|
180 |
+
// [13.3] When a cache has a stale entry that it would like to use as a
|
181 |
+
// response to a client's request, it first has to check with the origin
|
182 |
+
// server to see if its cached entry is still usable.
|
183 |
+
return self::isExpired($response);
|
184 |
+
}
|
185 |
+
}
|
app/api/Google/Http/MediaFileUpload.php
CHANGED
@@ -1,341 +1,341 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Copyright 2012 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Manage large file uploads, which may be media but can be any type
|
24 |
-
* of sizable data.
|
25 |
-
*/
|
26 |
-
class Google_Http_MediaFileUpload
|
27 |
-
{
|
28 |
-
const UPLOAD_MEDIA_TYPE = 'media';
|
29 |
-
const UPLOAD_MULTIPART_TYPE = 'multipart';
|
30 |
-
const UPLOAD_RESUMABLE_TYPE = 'resumable';
|
31 |
-
|
32 |
-
/** @var string $mimeType */
|
33 |
-
private $mimeType;
|
34 |
-
|
35 |
-
/** @var string $data */
|
36 |
-
private $data;
|
37 |
-
|
38 |
-
/** @var bool $resumable */
|
39 |
-
private $resumable;
|
40 |
-
|
41 |
-
/** @var int $chunkSize */
|
42 |
-
private $chunkSize;
|
43 |
-
|
44 |
-
/** @var int $size */
|
45 |
-
private $size;
|
46 |
-
|
47 |
-
/** @var string $resumeUri */
|
48 |
-
private $resumeUri;
|
49 |
-
|
50 |
-
/** @var int $progress */
|
51 |
-
private $progress;
|
52 |
-
|
53 |
-
/** @var Google_Client */
|
54 |
-
private $client;
|
55 |
-
|
56 |
-
/** @var Google_Http_Request */
|
57 |
-
private $request;
|
58 |
-
|
59 |
-
/** @var string */
|
60 |
-
private $boundary;
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Result code from last HTTP call
|
64 |
-
* @var int
|
65 |
-
*/
|
66 |
-
private $httpResultCode;
|
67 |
-
|
68 |
-
/**
|
69 |
-
* @param $mimeType string
|
70 |
-
* @param $data string The bytes you want to upload.
|
71 |
-
* @param $resumable bool
|
72 |
-
* @param bool $chunkSize File will be uploaded in chunks of this many bytes.
|
73 |
-
* only used if resumable=True
|
74 |
-
*/
|
75 |
-
public function __construct(
|
76 |
-
Google_Client $client,
|
77 |
-
Google_Http_Request $request,
|
78 |
-
$mimeType,
|
79 |
-
$data,
|
80 |
-
$resumable = false,
|
81 |
-
$chunkSize = false,
|
82 |
-
$boundary = false
|
83 |
-
) {
|
84 |
-
$this->client = $client;
|
85 |
-
$this->request = $request;
|
86 |
-
$this->mimeType = $mimeType;
|
87 |
-
$this->data = $data;
|
88 |
-
$this->size = strlen($this->data);
|
89 |
-
$this->resumable = $resumable;
|
90 |
-
if (!$chunkSize) {
|
91 |
-
$chunkSize = 256 * 1024;
|
92 |
-
}
|
93 |
-
$this->chunkSize = $chunkSize;
|
94 |
-
$this->progress = 0;
|
95 |
-
$this->boundary = $boundary;
|
96 |
-
|
97 |
-
// Process Media Request
|
98 |
-
$this->process();
|
99 |
-
}
|
100 |
-
|
101 |
-
/**
|
102 |
-
* Set the size of the file that is being uploaded.
|
103 |
-
* @param $size - int file size in bytes
|
104 |
-
*/
|
105 |
-
public function setFileSize($size)
|
106 |
-
{
|
107 |
-
$this->size = $size;
|
108 |
-
}
|
109 |
-
|
110 |
-
/**
|
111 |
-
* Return the progress on the upload
|
112 |
-
* @return int progress in bytes uploaded.
|
113 |
-
*/
|
114 |
-
public function getProgress()
|
115 |
-
{
|
116 |
-
return $this->progress;
|
117 |
-
}
|
118 |
-
|
119 |
-
/**
|
120 |
-
* Return the HTTP result code from the last call made.
|
121 |
-
* @return int code
|
122 |
-
*/
|
123 |
-
public function getHttpResultCode()
|
124 |
-
{
|
125 |
-
return $this->httpResultCode;
|
126 |
-
}
|
127 |
-
|
128 |
-
/**
|
129 |
-
* Sends a PUT-Request to google drive and parses the response,
|
130 |
-
* setting the appropiate variables from the response()
|
131 |
-
*
|
132 |
-
* @param Google_Http_Request $httpRequest the Reuqest which will be send
|
133 |
-
*
|
134 |
-
* @return false|mixed false when the upload is unfinished or the decoded http response
|
135 |
-
*
|
136 |
-
*/
|
137 |
-
private function makePutRequest(Google_Http_Request $httpRequest)
|
138 |
-
{
|
139 |
-
if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) {
|
140 |
-
$httpRequest->enableGzip();
|
141 |
-
} else {
|
142 |
-
$httpRequest->disableGzip();
|
143 |
-
}
|
144 |
-
|
145 |
-
$response = $this->client->getIo()->makeRequest($httpRequest);
|
146 |
-
$response->setExpectedClass($this->request->getExpectedClass());
|
147 |
-
$code = $response->getResponseHttpCode();
|
148 |
-
$this->httpResultCode = $code;
|
149 |
-
|
150 |
-
if (308 == $code) {
|
151 |
-
// Track the amount uploaded.
|
152 |
-
$range = explode('-', $response->getResponseHeader('range'));
|
153 |
-
$this->progress = $range[1] + 1;
|
154 |
-
|
155 |
-
// Allow for changing upload URLs.
|
156 |
-
$location = $response->getResponseHeader('location');
|
157 |
-
if ($location) {
|
158 |
-
$this->resumeUri = $location;
|
159 |
-
}
|
160 |
-
|
161 |
-
// No problems, but upload not complete.
|
162 |
-
return false;
|
163 |
-
} else {
|
164 |
-
return Google_Http_REST::decodeHttpResponse($response, $this->client);
|
165 |
-
}
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* Send the next part of the file to upload.
|
170 |
-
* @param [$chunk] the next set of bytes to send. If false will used $data passed
|
171 |
-
* at construct time.
|
172 |
-
*/
|
173 |
-
public function nextChunk($chunk = false)
|
174 |
-
{
|
175 |
-
if (false == $this->resumeUri) {
|
176 |
-
$this->resumeUri = $this->fetchResumeUri();
|
177 |
-
}
|
178 |
-
|
179 |
-
if (false == $chunk) {
|
180 |
-
$chunk = substr($this->data, $this->progress, $this->chunkSize);
|
181 |
-
}
|
182 |
-
$lastBytePos = $this->progress + strlen($chunk) - 1;
|
183 |
-
$headers = array(
|
184 |
-
'content-range' => "bytes $this->progress-$lastBytePos/$this->size",
|
185 |
-
'content-type' => $this->request->getRequestHeader('content-type'),
|
186 |
-
'content-length' => $this->chunkSize,
|
187 |
-
'expect' => '',
|
188 |
-
);
|
189 |
-
|
190 |
-
$httpRequest = new Google_Http_Request(
|
191 |
-
$this->resumeUri,
|
192 |
-
'PUT',
|
193 |
-
$headers,
|
194 |
-
$chunk
|
195 |
-
);
|
196 |
-
return $this->makePutRequest($httpRequest);
|
197 |
-
}
|
198 |
-
|
199 |
-
/**
|
200 |
-
* Resume a previously unfinished upload
|
201 |
-
* @param $resumeUri the resume-URI of the unfinished, resumable upload.
|
202 |
-
*/
|
203 |
-
public function resume($resumeUri)
|
204 |
-
{
|
205 |
-
$this->resumeUri = $resumeUri;
|
206 |
-
$headers = array(
|
207 |
-
'content-range' => "bytes */$this->size",
|
208 |
-
'content-length' => 0,
|
209 |
-
);
|
210 |
-
$httpRequest = new Google_Http_Request(
|
211 |
-
$this->resumeUri,
|
212 |
-
'PUT',
|
213 |
-
$headers
|
214 |
-
);
|
215 |
-
return $this->makePutRequest($httpRequest);
|
216 |
-
}
|
217 |
-
|
218 |
-
/**
|
219 |
-
* @return array|bool
|
220 |
-
* @visible for testing
|
221 |
-
*/
|
222 |
-
private function process()
|
223 |
-
{
|
224 |
-
$postBody = false;
|
225 |
-
$contentType = false;
|
226 |
-
|
227 |
-
$meta = $this->request->getPostBody();
|
228 |
-
$meta = is_string($meta) ? json_decode($meta, true) : $meta;
|
229 |
-
|
230 |
-
$uploadType = $this->getUploadType($meta);
|
231 |
-
$this->request->setQueryParam('uploadType', $uploadType);
|
232 |
-
$this->transformToUploadUrl();
|
233 |
-
$mimeType = $this->mimeType ?
|
234 |
-
$this->mimeType :
|
235 |
-
$this->request->getRequestHeader('content-type');
|
236 |
-
|
237 |
-
if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) {
|
238 |
-
$contentType = $mimeType;
|
239 |
-
$postBody = is_string($meta) ? $meta : json_encode($meta);
|
240 |
-
} else if (self::UPLOAD_MEDIA_TYPE == $uploadType) {
|
241 |
-
$contentType = $mimeType;
|
242 |
-
$postBody = $this->data;
|
243 |
-
} else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) {
|
244 |
-
// This is a multipart/related upload.
|
245 |
-
$boundary = $this->boundary ? $this->boundary : mt_rand();
|
246 |
-
$boundary = str_replace('"', '', $boundary);
|
247 |
-
$contentType = 'multipart/related; boundary=' . $boundary;
|
248 |
-
$related = "--$boundary\r\n";
|
249 |
-
$related .= "Content-Type: application/json; charset=UTF-8\r\n";
|
250 |
-
$related .= "\r\n" . json_encode($meta) . "\r\n";
|
251 |
-
$related .= "--$boundary\r\n";
|
252 |
-
$related .= "Content-Type: $mimeType\r\n";
|
253 |
-
$related .= "Content-Transfer-Encoding: base64\r\n";
|
254 |
-
$related .= "\r\n" . base64_encode($this->data) . "\r\n";
|
255 |
-
$related .= "--$boundary--";
|
256 |
-
$postBody = $related;
|
257 |
-
}
|
258 |
-
|
259 |
-
$this->request->setPostBody($postBody);
|
260 |
-
|
261 |
-
if (isset($contentType) && $contentType) {
|
262 |
-
$contentTypeHeader['content-type'] = $contentType;
|
263 |
-
$this->request->setRequestHeaders($contentTypeHeader);
|
264 |
-
}
|
265 |
-
}
|
266 |
-
|
267 |
-
private function transformToUploadUrl()
|
268 |
-
{
|
269 |
-
$base = $this->request->getBaseComponent();
|
270 |
-
$this->request->setBaseComponent($base . '/upload');
|
271 |
-
}
|
272 |
-
|
273 |
-
/**
|
274 |
-
* Valid upload types:
|
275 |
-
* - resumable (UPLOAD_RESUMABLE_TYPE)
|
276 |
-
* - media (UPLOAD_MEDIA_TYPE)
|
277 |
-
* - multipart (UPLOAD_MULTIPART_TYPE)
|
278 |
-
* @param $meta
|
279 |
-
* @return string
|
280 |
-
* @visible for testing
|
281 |
-
*/
|
282 |
-
public function getUploadType($meta)
|
283 |
-
{
|
284 |
-
if ($this->resumable) {
|
285 |
-
return self::UPLOAD_RESUMABLE_TYPE;
|
286 |
-
}
|
287 |
-
|
288 |
-
if (false == $meta && $this->data) {
|
289 |
-
return self::UPLOAD_MEDIA_TYPE;
|
290 |
-
}
|
291 |
-
|
292 |
-
return self::UPLOAD_MULTIPART_TYPE;
|
293 |
-
}
|
294 |
-
|
295 |
-
public function getResumeUri()
|
296 |
-
{
|
297 |
-
return ( $this->resumeUri !== null ? $this->resumeUri : $this->fetchResumeUri() );
|
298 |
-
}
|
299 |
-
|
300 |
-
private function fetchResumeUri()
|
301 |
-
{
|
302 |
-
$result = null;
|
303 |
-
$body = $this->request->getPostBody();
|
304 |
-
if ($body) {
|
305 |
-
$headers = array(
|
306 |
-
'content-type' => 'application/json; charset=UTF-8',
|
307 |
-
'content-length' => Google_Utils::getStrLen($body),
|
308 |
-
'x-upload-content-type' => $this->mimeType,
|
309 |
-
'x-upload-content-length' => $this->size,
|
310 |
-
'expect' => '',
|
311 |
-
);
|
312 |
-
$this->request->setRequestHeaders($headers);
|
313 |
-
}
|
314 |
-
|
315 |
-
$response = $this->client->getIo()->makeRequest($this->request);
|
316 |
-
$location = $response->getResponseHeader('location');
|
317 |
-
$code = $response->getResponseHttpCode();
|
318 |
-
|
319 |
-
if (200 == $code && true == $location) {
|
320 |
-
return $location;
|
321 |
-
}
|
322 |
-
$message = $code;
|
323 |
-
$body = @json_decode($response->getResponseBody());
|
324 |
-
if (!empty($body->error->errors) ) {
|
325 |
-
$message .= ': ';
|
326 |
-
foreach ($body->error->errors as $error) {
|
327 |
-
$message .= "{$error->domain}, {$error->message};";
|
328 |
-
}
|
329 |
-
$message = rtrim($message, ';');
|
330 |
-
}
|
331 |
-
|
332 |
-
$error = "Failed to start the resumable upload (HTTP {$message})";
|
333 |
-
$this->client->getLogger()->error($error);
|
334 |
-
throw new Google_Exception($error);
|
335 |
-
}
|
336 |
-
|
337 |
-
public function setChunkSize($chunkSize)
|
338 |
-
{
|
339 |
-
$this->chunkSize = $chunkSize;
|
340 |
-
}
|
341 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2012 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Manage large file uploads, which may be media but can be any type
|
24 |
+
* of sizable data.
|
25 |
+
*/
|
26 |
+
class Google_Http_MediaFileUpload
|
27 |
+
{
|
28 |
+
const UPLOAD_MEDIA_TYPE = 'media';
|
29 |
+
const UPLOAD_MULTIPART_TYPE = 'multipart';
|
30 |
+
const UPLOAD_RESUMABLE_TYPE = 'resumable';
|
31 |
+
|
32 |
+
/** @var string $mimeType */
|
33 |
+
private $mimeType;
|
34 |
+
|
35 |
+
/** @var string $data */
|
36 |
+
private $data;
|
37 |
+
|
38 |
+
/** @var bool $resumable */
|
39 |
+
private $resumable;
|
40 |
+
|
41 |
+
/** @var int $chunkSize */
|
42 |
+
private $chunkSize;
|
43 |
+
|
44 |
+
/** @var int $size */
|
45 |
+
private $size;
|
46 |
+
|
47 |
+
/** @var string $resumeUri */
|
48 |
+
private $resumeUri;
|
49 |
+
|
50 |
+
/** @var int $progress */
|
51 |
+
private $progress;
|
52 |
+
|
53 |
+
/** @var Google_Client */
|
54 |
+
private $client;
|
55 |
+
|
56 |
+
/** @var Google_Http_Request */
|
57 |
+
private $request;
|
58 |
+
|
59 |
+
/** @var string */
|
60 |
+
private $boundary;
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Result code from last HTTP call
|
64 |
+
* @var int
|
65 |
+
*/
|
66 |
+
private $httpResultCode;
|
67 |
+
|
68 |
+
/**
|
69 |
+
* @param $mimeType string
|
70 |
+
* @param $data string The bytes you want to upload.
|
71 |
+
* @param $resumable bool
|
72 |
+
* @param bool $chunkSize File will be uploaded in chunks of this many bytes.
|
73 |
+
* only used if resumable=True
|
74 |
+
*/
|
75 |
+
public function __construct(
|
76 |
+
Google_Client $client,
|
77 |
+
Google_Http_Request $request,
|
78 |
+
$mimeType,
|
79 |
+
$data,
|
80 |
+
$resumable = false,
|
81 |
+
$chunkSize = false,
|
82 |
+
$boundary = false
|
83 |
+
) {
|
84 |
+
$this->client = $client;
|
85 |
+
$this->request = $request;
|
86 |
+
$this->mimeType = $mimeType;
|
87 |
+
$this->data = $data;
|
88 |
+
$this->size = strlen($this->data);
|
89 |
+
$this->resumable = $resumable;
|
90 |
+
if (!$chunkSize) {
|
91 |
+
$chunkSize = 256 * 1024;
|
92 |
+
}
|
93 |
+
$this->chunkSize = $chunkSize;
|
94 |
+
$this->progress = 0;
|
95 |
+
$this->boundary = $boundary;
|
96 |
+
|
97 |
+
// Process Media Request
|
98 |
+
$this->process();
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Set the size of the file that is being uploaded.
|
103 |
+
* @param $size - int file size in bytes
|
104 |
+
*/
|
105 |
+
public function setFileSize($size)
|
106 |
+
{
|
107 |
+
$this->size = $size;
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Return the progress on the upload
|
112 |
+
* @return int progress in bytes uploaded.
|
113 |
+
*/
|
114 |
+
public function getProgress()
|
115 |
+
{
|
116 |
+
return $this->progress;
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* Return the HTTP result code from the last call made.
|
121 |
+
* @return int code
|
122 |
+
*/
|
123 |
+
public function getHttpResultCode()
|
124 |
+
{
|
125 |
+
return $this->httpResultCode;
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Sends a PUT-Request to google drive and parses the response,
|
130 |
+
* setting the appropiate variables from the response()
|
131 |
+
*
|
132 |
+
* @param Google_Http_Request $httpRequest the Reuqest which will be send
|
133 |
+
*
|
134 |
+
* @return false|mixed false when the upload is unfinished or the decoded http response
|
135 |
+
*
|
136 |
+
*/
|
137 |
+
private function makePutRequest(Google_Http_Request $httpRequest)
|
138 |
+
{
|
139 |
+
if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) {
|
140 |
+
$httpRequest->enableGzip();
|
141 |
+
} else {
|
142 |
+
$httpRequest->disableGzip();
|
143 |
+
}
|
144 |
+
|
145 |
+
$response = $this->client->getIo()->makeRequest($httpRequest);
|
146 |
+
$response->setExpectedClass($this->request->getExpectedClass());
|
147 |
+
$code = $response->getResponseHttpCode();
|
148 |
+
$this->httpResultCode = $code;
|
149 |
+
|
150 |
+
if (308 == $code) {
|
151 |
+
// Track the amount uploaded.
|
152 |
+
$range = explode('-', $response->getResponseHeader('range'));
|
153 |
+
$this->progress = $range[1] + 1;
|
154 |
+
|
155 |
+
// Allow for changing upload URLs.
|
156 |
+
$location = $response->getResponseHeader('location');
|
157 |
+
if ($location) {
|
158 |
+
$this->resumeUri = $location;
|
159 |
+
}
|
160 |
+
|
161 |
+
// No problems, but upload not complete.
|
162 |
+
return false;
|
163 |
+
} else {
|
164 |
+
return Google_Http_REST::decodeHttpResponse($response, $this->client);
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Send the next part of the file to upload.
|
170 |
+
* @param [$chunk] the next set of bytes to send. If false will used $data passed
|
171 |
+
* at construct time.
|
172 |
+
*/
|
173 |
+
public function nextChunk($chunk = false)
|
174 |
+
{
|
175 |
+
if (false == $this->resumeUri) {
|
176 |
+
$this->resumeUri = $this->fetchResumeUri();
|
177 |
+
}
|
178 |
+
|
179 |
+
if (false == $chunk) {
|
180 |
+
$chunk = substr($this->data, $this->progress, $this->chunkSize);
|
181 |
+
}
|
182 |
+
$lastBytePos = $this->progress + strlen($chunk) - 1;
|
183 |
+
$headers = array(
|
184 |
+
'content-range' => "bytes $this->progress-$lastBytePos/$this->size",
|
185 |
+
'content-type' => $this->request->getRequestHeader('content-type'),
|
186 |
+
'content-length' => $this->chunkSize,
|
187 |
+
'expect' => '',
|
188 |
+
);
|
189 |
+
|
190 |
+
$httpRequest = new Google_Http_Request(
|
191 |
+
$this->resumeUri,
|
192 |
+
'PUT',
|
193 |
+
$headers,
|
194 |
+
$chunk
|
195 |
+
);
|
196 |
+
return $this->makePutRequest($httpRequest);
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Resume a previously unfinished upload
|
201 |
+
* @param $resumeUri the resume-URI of the unfinished, resumable upload.
|
202 |
+
*/
|
203 |
+
public function resume($resumeUri)
|
204 |
+
{
|
205 |
+
$this->resumeUri = $resumeUri;
|
206 |
+
$headers = array(
|
207 |
+
'content-range' => "bytes */$this->size",
|
208 |
+
'content-length' => 0,
|
209 |
+
);
|
210 |
+
$httpRequest = new Google_Http_Request(
|
211 |
+
$this->resumeUri,
|
212 |
+
'PUT',
|
213 |
+
$headers
|
214 |
+
);
|
215 |
+
return $this->makePutRequest($httpRequest);
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* @return array|bool
|
220 |
+
* @visible for testing
|
221 |
+
*/
|
222 |
+
private function process()
|
223 |
+
{
|
224 |
+
$postBody = false;
|
225 |
+
$contentType = false;
|
226 |
+
|
227 |
+
$meta = $this->request->getPostBody();
|
228 |
+
$meta = is_string($meta) ? json_decode($meta, true) : $meta;
|
229 |
+
|
230 |
+
$uploadType = $this->getUploadType($meta);
|
231 |
+
$this->request->setQueryParam('uploadType', $uploadType);
|
232 |
+
$this->transformToUploadUrl();
|
233 |
+
$mimeType = $this->mimeType ?
|
234 |
+
$this->mimeType :
|
235 |
+
$this->request->getRequestHeader('content-type');
|
236 |
+
|
237 |
+
if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) {
|
238 |
+
$contentType = $mimeType;
|
239 |
+
$postBody = is_string($meta) ? $meta : json_encode($meta);
|
240 |
+
} else if (self::UPLOAD_MEDIA_TYPE == $uploadType) {
|
241 |
+
$contentType = $mimeType;
|
242 |
+
$postBody = $this->data;
|
243 |
+
} else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) {
|
244 |
+
// This is a multipart/related upload.
|
245 |
+
$boundary = $this->boundary ? $this->boundary : mt_rand();
|
246 |
+
$boundary = str_replace('"', '', $boundary);
|
247 |
+
$contentType = 'multipart/related; boundary=' . $boundary;
|
248 |
+
$related = "--$boundary\r\n";
|
249 |
+
$related .= "Content-Type: application/json; charset=UTF-8\r\n";
|
250 |
+
$related .= "\r\n" . json_encode($meta) . "\r\n";
|
251 |
+
$related .= "--$boundary\r\n";
|
252 |
+
$related .= "Content-Type: $mimeType\r\n";
|
253 |
+
$related .= "Content-Transfer-Encoding: base64\r\n";
|
254 |
+
$related .= "\r\n" . base64_encode($this->data) . "\r\n";
|
255 |
+
$related .= "--$boundary--";
|
256 |
+
$postBody = $related;
|
257 |
+
}
|
258 |
+
|
259 |
+
$this->request->setPostBody($postBody);
|
260 |
+
|
261 |
+
if (isset($contentType) && $contentType) {
|
262 |
+
$contentTypeHeader['content-type'] = $contentType;
|
263 |
+
$this->request->setRequestHeaders($contentTypeHeader);
|
264 |
+
}
|
265 |
+
}
|
266 |
+
|
267 |
+
private function transformToUploadUrl()
|
268 |
+
{
|
269 |
+
$base = $this->request->getBaseComponent();
|
270 |
+
$this->request->setBaseComponent($base . '/upload');
|
271 |
+
}
|
272 |
+
|
273 |
+
/**
|
274 |
+
* Valid upload types:
|
275 |
+
* - resumable (UPLOAD_RESUMABLE_TYPE)
|
276 |
+
* - media (UPLOAD_MEDIA_TYPE)
|
277 |
+
* - multipart (UPLOAD_MULTIPART_TYPE)
|
278 |
+
* @param $meta
|
279 |
+
* @return string
|
280 |
+
* @visible for testing
|
281 |
+
*/
|
282 |
+
public function getUploadType($meta)
|
283 |
+
{
|
284 |
+
if ($this->resumable) {
|
285 |
+
return self::UPLOAD_RESUMABLE_TYPE;
|
286 |
+
}
|
287 |
+
|
288 |
+
if (false == $meta && $this->data) {
|
289 |
+
return self::UPLOAD_MEDIA_TYPE;
|
290 |
+
}
|
291 |
+
|
292 |
+
return self::UPLOAD_MULTIPART_TYPE;
|
293 |
+
}
|
294 |
+
|
295 |
+
public function getResumeUri()
|
296 |
+
{
|
297 |
+
return ( $this->resumeUri !== null ? $this->resumeUri : $this->fetchResumeUri() );
|
298 |
+
}
|
299 |
+
|
300 |
+
private function fetchResumeUri()
|
301 |
+
{
|
302 |
+
$result = null;
|
303 |
+
$body = $this->request->getPostBody();
|
304 |
+
if ($body) {
|
305 |
+
$headers = array(
|
306 |
+
'content-type' => 'application/json; charset=UTF-8',
|
307 |
+
'content-length' => Google_Utils::getStrLen($body),
|
308 |
+
'x-upload-content-type' => $this->mimeType,
|
309 |
+
'x-upload-content-length' => $this->size,
|
310 |
+
'expect' => '',
|
311 |
+
);
|
312 |
+
$this->request->setRequestHeaders($headers);
|
313 |
+
}
|
314 |
+
|
315 |
+
$response = $this->client->getIo()->makeRequest($this->request);
|
316 |
+
$location = $response->getResponseHeader('location');
|
317 |
+
$code = $response->getResponseHttpCode();
|
318 |
+
|
319 |
+
if (200 == $code && true == $location) {
|
320 |
+
return $location;
|
321 |
+
}
|
322 |
+
$message = $code;
|
323 |
+
$body = @json_decode($response->getResponseBody());
|
324 |
+
if (!empty($body->error->errors) ) {
|
325 |
+
$message .= ': ';
|
326 |
+
foreach ($body->error->errors as $error) {
|
327 |
+
$message .= "{$error->domain}, {$error->message};";
|
328 |
+
}
|
329 |
+
$message = rtrim($message, ';');
|
330 |
+
}
|
331 |
+
|
332 |
+
$error = "Failed to start the resumable upload (HTTP {$message})";
|
333 |
+
$this->client->getLogger()->error($error);
|
334 |
+
throw new Google_Exception($error);
|
335 |
+
}
|
336 |
+
|
337 |
+
public function setChunkSize($chunkSize)
|
338 |
+
{
|
339 |
+
$this->chunkSize = $chunkSize;
|
340 |
+
}
|
341 |
+
}
|
app/api/Google/Http/REST.php
CHANGED
@@ -1,178 +1,178 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* This class implements the RESTful transport of apiServiceRequest()'s
|
24 |
-
*/
|
25 |
-
class Google_Http_REST
|
26 |
-
{
|
27 |
-
/**
|
28 |
-
* Executes a Google_Http_Request and (if applicable) automatically retries
|
29 |
-
* when errors occur.
|
30 |
-
*
|
31 |
-
* @param Google_Client $client
|
32 |
-
* @param Google_Http_Request $req
|
33 |
-
* @return array decoded result
|
34 |
-
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
35 |
-
* invalid or malformed post body, invalid url)
|
36 |
-
*/
|
37 |
-
public static function execute(Google_Client $client, Google_Http_Request $req)
|
38 |
-
{
|
39 |
-
$runner = new Google_Task_Runner(
|
40 |
-
$client,
|
41 |
-
sprintf('%s %s', $req->getRequestMethod(), $req->getUrl()),
|
42 |
-
array(get_class(), 'doExecute'),
|
43 |
-
array($client, $req)
|
44 |
-
);
|
45 |
-
|
46 |
-
return $runner->run();
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Executes a Google_Http_Request
|
51 |
-
*
|
52 |
-
* @param Google_Client $client
|
53 |
-
* @param Google_Http_Request $req
|
54 |
-
* @return array decoded result
|
55 |
-
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
56 |
-
* invalid or malformed post body, invalid url)
|
57 |
-
*/
|
58 |
-
public static function doExecute(Google_Client $client, Google_Http_Request $req)
|
59 |
-
{
|
60 |
-
$httpRequest = $client->getIo()->makeRequest($req);
|
61 |
-
$httpRequest->setExpectedClass($req->getExpectedClass());
|
62 |
-
return self::decodeHttpResponse($httpRequest, $client);
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Decode an HTTP Response.
|
67 |
-
* @static
|
68 |
-
* @throws Google_Service_Exception
|
69 |
-
* @param Google_Http_Request $response The http response to be decoded.
|
70 |
-
* @param Google_Client $client
|
71 |
-
* @return mixed|null
|
72 |
-
*/
|
73 |
-
public static function decodeHttpResponse($response, Google_Client $client = null)
|
74 |
-
{
|
75 |
-
$code = $response->getResponseHttpCode();
|
76 |
-
$body = $response->getResponseBody();
|
77 |
-
$decoded = null;
|
78 |
-
|
79 |
-
if ((intVal($code)) >= 300) {
|
80 |
-
$decoded = json_decode($body, true);
|
81 |
-
$err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
|
82 |
-
if (isset($decoded['error']) &&
|
83 |
-
isset($decoded['error']['message']) &&
|
84 |
-
isset($decoded['error']['code'])) {
|
85 |
-
// if we're getting a json encoded error definition, use that instead of the raw response
|
86 |
-
// body for improved readability
|
87 |
-
$err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
|
88 |
-
} else {
|
89 |
-
$err .= ": ($code) $body";
|
90 |
-
}
|
91 |
-
|
92 |
-
$errors = null;
|
93 |
-
// Specific check for APIs which don't return error details, such as Blogger.
|
94 |
-
if (isset($decoded['error']) && isset($decoded['error']['errors'])) {
|
95 |
-
$errors = $decoded['error']['errors'];
|
96 |
-
}
|
97 |
-
|
98 |
-
$map = null;
|
99 |
-
if ($client) {
|
100 |
-
$client->getLogger()->error(
|
101 |
-
$err,
|
102 |
-
array('code' => $code, 'errors' => $errors)
|
103 |
-
);
|
104 |
-
|
105 |
-
$map = $client->getClassConfig(
|
106 |
-
'Google_Service_Exception',
|
107 |
-
'retry_map'
|
108 |
-
);
|
109 |
-
}
|
110 |
-
throw new Google_Service_Exception($err, $code, null, $errors, $map);
|
111 |
-
}
|
112 |
-
|
113 |
-
// Only attempt to decode the response, if the response code wasn't (204) 'no content'
|
114 |
-
if ($code != '204') {
|
115 |
-
if ($response->getExpectedRaw()) {
|
116 |
-
return $body;
|
117 |
-
}
|
118 |
-
|
119 |
-
$decoded = json_decode($body, true);
|
120 |
-
if ($decoded === null || $decoded === "") {
|
121 |
-
$error = "Invalid json in service response: $body";
|
122 |
-
if ($client) {
|
123 |
-
$client->getLogger()->error($error);
|
124 |
-
}
|
125 |
-
throw new Google_Service_Exception($error);
|
126 |
-
}
|
127 |
-
|
128 |
-
if ($response->getExpectedClass()) {
|
129 |
-
$class = $response->getExpectedClass();
|
130 |
-
$decoded = new $class($decoded);
|
131 |
-
}
|
132 |
-
}
|
133 |
-
return $decoded;
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Parse/expand request parameters and create a fully qualified
|
138 |
-
* request uri.
|
139 |
-
* @static
|
140 |
-
* @param string $servicePath
|
141 |
-
* @param string $restPath
|
142 |
-
* @param array $params
|
143 |
-
* @return string $requestUrl
|
144 |
-
*/
|
145 |
-
public static function createRequestUri($servicePath, $restPath, $params)
|
146 |
-
{
|
147 |
-
$requestUrl = $servicePath . $restPath;
|
148 |
-
$uriTemplateVars = array();
|
149 |
-
$queryVars = array();
|
150 |
-
foreach ($params as $paramName => $paramSpec) {
|
151 |
-
if ($paramSpec['type'] == 'boolean') {
|
152 |
-
$paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
|
153 |
-
}
|
154 |
-
if ($paramSpec['location'] == 'path') {
|
155 |
-
$uriTemplateVars[$paramName] = $paramSpec['value'];
|
156 |
-
} else if ($paramSpec['location'] == 'query') {
|
157 |
-
if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
|
158 |
-
foreach ($paramSpec['value'] as $value) {
|
159 |
-
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value));
|
160 |
-
}
|
161 |
-
} else {
|
162 |
-
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value']));
|
163 |
-
}
|
164 |
-
}
|
165 |
-
}
|
166 |
-
|
167 |
-
if (count($uriTemplateVars)) {
|
168 |
-
$uriTemplateParser = new Google_Utils_URITemplate();
|
169 |
-
$requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars);
|
170 |
-
}
|
171 |
-
|
172 |
-
if (count($queryVars)) {
|
173 |
-
$requestUrl .= '?' . implode($queryVars, '&');
|
174 |
-
}
|
175 |
-
|
176 |
-
return $requestUrl;
|
177 |
-
}
|
178 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* This class implements the RESTful transport of apiServiceRequest()'s
|
24 |
+
*/
|
25 |
+
class Google_Http_REST
|
26 |
+
{
|
27 |
+
/**
|
28 |
+
* Executes a Google_Http_Request and (if applicable) automatically retries
|
29 |
+
* when errors occur.
|
30 |
+
*
|
31 |
+
* @param Google_Client $client
|
32 |
+
* @param Google_Http_Request $req
|
33 |
+
* @return array decoded result
|
34 |
+
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
35 |
+
* invalid or malformed post body, invalid url)
|
36 |
+
*/
|
37 |
+
public static function execute(Google_Client $client, Google_Http_Request $req)
|
38 |
+
{
|
39 |
+
$runner = new Google_Task_Runner(
|
40 |
+
$client,
|
41 |
+
sprintf('%s %s', $req->getRequestMethod(), $req->getUrl()),
|
42 |
+
array(get_class(), 'doExecute'),
|
43 |
+
array($client, $req)
|
44 |
+
);
|
45 |
+
|
46 |
+
return $runner->run();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Executes a Google_Http_Request
|
51 |
+
*
|
52 |
+
* @param Google_Client $client
|
53 |
+
* @param Google_Http_Request $req
|
54 |
+
* @return array decoded result
|
55 |
+
* @throws Google_Service_Exception on server side error (ie: not authenticated,
|
56 |
+
* invalid or malformed post body, invalid url)
|
57 |
+
*/
|
58 |
+
public static function doExecute(Google_Client $client, Google_Http_Request $req)
|
59 |
+
{
|
60 |
+
$httpRequest = $client->getIo()->makeRequest($req);
|
61 |
+
$httpRequest->setExpectedClass($req->getExpectedClass());
|
62 |
+
return self::decodeHttpResponse($httpRequest, $client);
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Decode an HTTP Response.
|
67 |
+
* @static
|
68 |
+
* @throws Google_Service_Exception
|
69 |
+
* @param Google_Http_Request $response The http response to be decoded.
|
70 |
+
* @param Google_Client $client
|
71 |
+
* @return mixed|null
|
72 |
+
*/
|
73 |
+
public static function decodeHttpResponse($response, Google_Client $client = null)
|
74 |
+
{
|
75 |
+
$code = $response->getResponseHttpCode();
|
76 |
+
$body = $response->getResponseBody();
|
77 |
+
$decoded = null;
|
78 |
+
|
79 |
+
if ((intVal($code)) >= 300) {
|
80 |
+
$decoded = json_decode($body, true);
|
81 |
+
$err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
|
82 |
+
if (isset($decoded['error']) &&
|
83 |
+
isset($decoded['error']['message']) &&
|
84 |
+
isset($decoded['error']['code'])) {
|
85 |
+
// if we're getting a json encoded error definition, use that instead of the raw response
|
86 |
+
// body for improved readability
|
87 |
+
$err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
|
88 |
+
} else {
|
89 |
+
$err .= ": ($code) $body";
|
90 |
+
}
|
91 |
+
|
92 |
+
$errors = null;
|
93 |
+
// Specific check for APIs which don't return error details, such as Blogger.
|
94 |
+
if (isset($decoded['error']) && isset($decoded['error']['errors'])) {
|
95 |
+
$errors = $decoded['error']['errors'];
|
96 |
+
}
|
97 |
+
|
98 |
+
$map = null;
|
99 |
+
if ($client) {
|
100 |
+
$client->getLogger()->error(
|
101 |
+
$err,
|
102 |
+
array('code' => $code, 'errors' => $errors)
|
103 |
+
);
|
104 |
+
|
105 |
+
$map = $client->getClassConfig(
|
106 |
+
'Google_Service_Exception',
|
107 |
+
'retry_map'
|
108 |
+
);
|
109 |
+
}
|
110 |
+
throw new Google_Service_Exception($err, $code, null, $errors, $map);
|
111 |
+
}
|
112 |
+
|
113 |
+
// Only attempt to decode the response, if the response code wasn't (204) 'no content'
|
114 |
+
if ($code != '204') {
|
115 |
+
if ($response->getExpectedRaw()) {
|
116 |
+
return $body;
|
117 |
+
}
|
118 |
+
|
119 |
+
$decoded = json_decode($body, true);
|
120 |
+
if ($decoded === null || $decoded === "") {
|
121 |
+
$error = "Invalid json in service response: $body";
|
122 |
+
if ($client) {
|
123 |
+
$client->getLogger()->error($error);
|
124 |
+
}
|
125 |
+
throw new Google_Service_Exception($error);
|
126 |
+
}
|
127 |
+
|
128 |
+
if ($response->getExpectedClass()) {
|
129 |
+
$class = $response->getExpectedClass();
|
130 |
+
$decoded = new $class($decoded);
|
131 |
+
}
|
132 |
+
}
|
133 |
+
return $decoded;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Parse/expand request parameters and create a fully qualified
|
138 |
+
* request uri.
|
139 |
+
* @static
|
140 |
+
* @param string $servicePath
|
141 |
+
* @param string $restPath
|
142 |
+
* @param array $params
|
143 |
+
* @return string $requestUrl
|
144 |
+
*/
|
145 |
+
public static function createRequestUri($servicePath, $restPath, $params)
|
146 |
+
{
|
147 |
+
$requestUrl = $servicePath . $restPath;
|
148 |
+
$uriTemplateVars = array();
|
149 |
+
$queryVars = array();
|
150 |
+
foreach ($params as $paramName => $paramSpec) {
|
151 |
+
if ($paramSpec['type'] == 'boolean') {
|
152 |
+
$paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
|
153 |
+
}
|
154 |
+
if ($paramSpec['location'] == 'path') {
|
155 |
+
$uriTemplateVars[$paramName] = $paramSpec['value'];
|
156 |
+
} else if ($paramSpec['location'] == 'query') {
|
157 |
+
if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
|
158 |
+
foreach ($paramSpec['value'] as $value) {
|
159 |
+
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($value));
|
160 |
+
}
|
161 |
+
} else {
|
162 |
+
$queryVars[] = $paramName . '=' . rawurlencode(rawurldecode($paramSpec['value']));
|
163 |
+
}
|
164 |
+
}
|
165 |
+
}
|
166 |
+
|
167 |
+
if (count($uriTemplateVars)) {
|
168 |
+
$uriTemplateParser = new Google_Utils_URITemplate();
|
169 |
+
$requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars);
|
170 |
+
}
|
171 |
+
|
172 |
+
if (count($queryVars)) {
|
173 |
+
$requestUrl .= '?' . implode($queryVars, '&');
|
174 |
+
}
|
175 |
+
|
176 |
+
return $requestUrl;
|
177 |
+
}
|
178 |
+
}
|
app/api/Google/Http/Request.php
CHANGED
@@ -1,504 +1,504 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* HTTP Request to be executed by IO classes. Upon execution, the
|
24 |
-
* responseHttpCode, responseHeaders and responseBody will be filled in.
|
25 |
-
*
|
26 |
-
* @author Chris Chabot <chabotc@google.com>
|
27 |
-
* @author Chirag Shah <chirags@google.com>
|
28 |
-
*
|
29 |
-
*/
|
30 |
-
class Google_Http_Request
|
31 |
-
{
|
32 |
-
const GZIP_UA = " (gzip)";
|
33 |
-
|
34 |
-
private $batchHeaders = array(
|
35 |
-
'Content-Type' => 'application/http',
|
36 |
-
'Content-Transfer-Encoding' => 'binary',
|
37 |
-
'MIME-Version' => '1.0',
|
38 |
-
);
|
39 |
-
|
40 |
-
protected $queryParams;
|
41 |
-
protected $requestMethod;
|
42 |
-
protected $requestHeaders;
|
43 |
-
protected $baseComponent = null;
|
44 |
-
protected $path;
|
45 |
-
protected $postBody;
|
46 |
-
protected $userAgent;
|
47 |
-
protected $canGzip = null;
|
48 |
-
|
49 |
-
protected $responseHttpCode;
|
50 |
-
protected $responseHeaders;
|
51 |
-
protected $responseBody;
|
52 |
-
|
53 |
-
protected $expectedClass;
|
54 |
-
protected $expectedRaw = false;
|
55 |
-
|
56 |
-
public $accessKey;
|
57 |
-
|
58 |
-
public function __construct(
|
59 |
-
$url,
|
60 |
-
$method = 'GET',
|
61 |
-
$headers = array(),
|
62 |
-
$postBody = null
|
63 |
-
) {
|
64 |
-
$this->setUrl($url);
|
65 |
-
$this->setRequestMethod($method);
|
66 |
-
$this->setRequestHeaders($headers);
|
67 |
-
$this->setPostBody($postBody);
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* Misc function that returns the base url component of the $url
|
72 |
-
* used by the OAuth signing class to calculate the base string
|
73 |
-
* @return string The base url component of the $url.
|
74 |
-
*/
|
75 |
-
public function getBaseComponent()
|
76 |
-
{
|
77 |
-
return $this->baseComponent;
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* Set the base URL that path and query parameters will be added to.
|
82 |
-
* @param $baseComponent string
|
83 |
-
*/
|
84 |
-
public function setBaseComponent($baseComponent)
|
85 |
-
{
|
86 |
-
$this->baseComponent = rtrim($baseComponent, '/');
|
87 |
-
}
|
88 |
-
|
89 |
-
/**
|
90 |
-
* Enable support for gzipped responses with this request.
|
91 |
-
*/
|
92 |
-
public function enableGzip()
|
93 |
-
{
|
94 |
-
$this->setRequestHeaders(array("Accept-Encoding" => "gzip"));
|
95 |
-
$this->canGzip = true;
|
96 |
-
$this->setUserAgent($this->userAgent);
|
97 |
-
}
|
98 |
-
|
99 |
-
/**
|
100 |
-
* Disable support for gzip responses with this request.
|
101 |
-
*/
|
102 |
-
public function disableGzip()
|
103 |
-
{
|
104 |
-
if (
|
105 |
-
isset($this->requestHeaders['accept-encoding']) &&
|
106 |
-
$this->requestHeaders['accept-encoding'] == "gzip"
|
107 |
-
) {
|
108 |
-
unset($this->requestHeaders['accept-encoding']);
|
109 |
-
}
|
110 |
-
$this->canGzip = false;
|
111 |
-
$this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent);
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Can this request accept a gzip response?
|
116 |
-
* @return bool
|
117 |
-
*/
|
118 |
-
public function canGzip()
|
119 |
-
{
|
120 |
-
return $this->canGzip;
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Misc function that returns an array of the query parameters of the current
|
125 |
-
* url used by the OAuth signing class to calculate the signature
|
126 |
-
* @return array Query parameters in the query string.
|
127 |
-
*/
|
128 |
-
public function getQueryParams()
|
129 |
-
{
|
130 |
-
return $this->queryParams;
|
131 |
-
}
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Set a new query parameter.
|
135 |
-
* @param $key - string to set, does not need to be URL encoded
|
136 |
-
* @param $value - string to set, does not need to be URL encoded
|
137 |
-
*/
|
138 |
-
public function setQueryParam($key, $value)
|
139 |
-
{
|
140 |
-
$this->queryParams[$key] = $value;
|
141 |
-
}
|
142 |
-
|
143 |
-
/**
|
144 |
-
* @return string HTTP Response Code.
|
145 |
-
*/
|
146 |
-
public function getResponseHttpCode()
|
147 |
-
{
|
148 |
-
return (int) $this->responseHttpCode;
|
149 |
-
}
|
150 |
-
|
151 |
-
/**
|
152 |
-
* @param int $responseHttpCode HTTP Response Code.
|
153 |
-
*/
|
154 |
-
public function setResponseHttpCode($responseHttpCode)
|
155 |
-
{
|
156 |
-
$this->responseHttpCode = $responseHttpCode;
|
157 |
-
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* @return $responseHeaders (array) HTTP Response Headers.
|
161 |
-
*/
|
162 |
-
public function getResponseHeaders()
|
163 |
-
{
|
164 |
-
return $this->responseHeaders;
|
165 |
-
}
|
166 |
-
|
167 |
-
/**
|
168 |
-
* @return string HTTP Response Body
|
169 |
-
*/
|
170 |
-
public function getResponseBody()
|
171 |
-
{
|
172 |
-
return $this->responseBody;
|
173 |
-
}
|
174 |
-
|
175 |
-
/**
|
176 |
-
* Set the class the response to this request should expect.
|
177 |
-
*
|
178 |
-
* @param $class string the class name
|
179 |
-
*/
|
180 |
-
public function setExpectedClass($class)
|
181 |
-
{
|
182 |
-
$this->expectedClass = $class;
|
183 |
-
}
|
184 |
-
|
185 |
-
/**
|
186 |
-
* Retrieve the expected class the response should expect.
|
187 |
-
* @return string class name
|
188 |
-
*/
|
189 |
-
public function getExpectedClass()
|
190 |
-
{
|
191 |
-
return $this->expectedClass;
|
192 |
-
}
|
193 |
-
|
194 |
-
/**
|
195 |
-
* Enable expected raw response
|
196 |
-
*/
|
197 |
-
public function enableExpectedRaw()
|
198 |
-
{
|
199 |
-
$this->expectedRaw = true;
|
200 |
-
}
|
201 |
-
|
202 |
-
/**
|
203 |
-
* Disable expected raw response
|
204 |
-
*/
|
205 |
-
public function disableExpectedRaw()
|
206 |
-
{
|
207 |
-
$this->expectedRaw = false;
|
208 |
-
}
|
209 |
-
|
210 |
-
/**
|
211 |
-
* Expected raw response or not.
|
212 |
-
* @return boolean expected raw response
|
213 |
-
*/
|
214 |
-
public function getExpectedRaw()
|
215 |
-
{
|
216 |
-
return $this->expectedRaw;
|
217 |
-
}
|
218 |
-
|
219 |
-
/**
|
220 |
-
* @param array $headers The HTTP response headers
|
221 |
-
* to be normalized.
|
222 |
-
*/
|
223 |
-
public function setResponseHeaders($headers)
|
224 |
-
{
|
225 |
-
$headers = Google_Utils::normalize($headers);
|
226 |
-
if ($this->responseHeaders) {
|
227 |
-
$headers = array_merge($this->responseHeaders, $headers);
|
228 |
-
}
|
229 |
-
|
230 |
-
$this->responseHeaders = $headers;
|
231 |
-
}
|
232 |
-
|
233 |
-
/**
|
234 |
-
* @param string $key
|
235 |
-
* @return array|boolean Returns the requested HTTP header or
|
236 |
-
* false if unavailable.
|
237 |
-
*/
|
238 |
-
public function getResponseHeader($key)
|
239 |
-
{
|
240 |
-
return isset($this->responseHeaders[$key])
|
241 |
-
? $this->responseHeaders[$key]
|
242 |
-
: false;
|
243 |
-
}
|
244 |
-
|
245 |
-
/**
|
246 |
-
* @param string $responseBody The HTTP response body.
|
247 |
-
*/
|
248 |
-
public function setResponseBody($responseBody)
|
249 |
-
{
|
250 |
-
$this->responseBody = $responseBody;
|
251 |
-
}
|
252 |
-
|
253 |
-
/**
|
254 |
-
* @return string $url The request URL.
|
255 |
-
*/
|
256 |
-
public function getUrl()
|
257 |
-
{
|
258 |
-
return $this->baseComponent . $this->path .
|
259 |
-
(count($this->queryParams) ?
|
260 |
-
"?" . $this->buildQuery($this->queryParams) :
|
261 |
-
'');
|
262 |
-
}
|
263 |
-
|
264 |
-
/**
|
265 |
-
* @return string $method HTTP Request Method.
|
266 |
-
*/
|
267 |
-
public function getRequestMethod()
|
268 |
-
{
|
269 |
-
return $this->requestMethod;
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* @return array $headers HTTP Request Headers.
|
274 |
-
*/
|
275 |
-
public function getRequestHeaders()
|
276 |
-
{
|
277 |
-
return $this->requestHeaders;
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* @param string $key
|
282 |
-
* @return array|boolean Returns the requested HTTP header or
|
283 |
-
* false if unavailable.
|
284 |
-
*/
|
285 |
-
public function getRequestHeader($key)
|
286 |
-
{
|
287 |
-
return isset($this->requestHeaders[$key])
|
288 |
-
? $this->requestHeaders[$key]
|
289 |
-
: false;
|
290 |
-
}
|
291 |
-
|
292 |
-
/**
|
293 |
-
* @return string $postBody HTTP Request Body.
|
294 |
-
*/
|
295 |
-
public function getPostBody()
|
296 |
-
{
|
297 |
-
return $this->postBody;
|
298 |
-
}
|
299 |
-
|
300 |
-
/**
|
301 |
-
* @param string $url the url to set
|
302 |
-
*/
|
303 |
-
public function setUrl($url)
|
304 |
-
{
|
305 |
-
if (substr($url, 0, 4) != 'http') {
|
306 |
-
// Force the path become relative.
|
307 |
-
if (substr($url, 0, 1) !== '/') {
|
308 |
-
$url = '/' . $url;
|
309 |
-
}
|
310 |
-
}
|
311 |
-
$parts = parse_url($url);
|
312 |
-
if (isset($parts['host'])) {
|
313 |
-
$this->baseComponent = sprintf(
|
314 |
-
"%s%s%s",
|
315 |
-
isset($parts['scheme']) ? $parts['scheme'] . "://" : '',
|
316 |
-
isset($parts['host']) ? $parts['host'] : '',
|
317 |
-
isset($parts['port']) ? ":" . $parts['port'] : ''
|
318 |
-
);
|
319 |
-
}
|
320 |
-
$this->path = isset($parts['path']) ? $parts['path'] : '';
|
321 |
-
$this->queryParams = array();
|
322 |
-
if (isset($parts['query'])) {
|
323 |
-
$this->queryParams = $this->parseQuery($parts['query']);
|
324 |
-
}
|
325 |
-
}
|
326 |
-
|
327 |
-
/**
|
328 |
-
* @param string $method Set he HTTP Method and normalize
|
329 |
-
* it to upper-case, as required by HTTP.
|
330 |
-
*
|
331 |
-
*/
|
332 |
-
public function setRequestMethod($method)
|
333 |
-
{
|
334 |
-
$this->requestMethod = strtoupper($method);
|
335 |
-
}
|
336 |
-
|
337 |
-
/**
|
338 |
-
* @param array $headers The HTTP request headers
|
339 |
-
* to be set and normalized.
|
340 |
-
*/
|
341 |
-
public function setRequestHeaders($headers)
|
342 |
-
{
|
343 |
-
$headers = Google_Utils::normalize($headers);
|
344 |
-
if ($this->requestHeaders) {
|
345 |
-
$headers = array_merge($this->requestHeaders, $headers);
|
346 |
-
}
|
347 |
-
$this->requestHeaders = $headers;
|
348 |
-
}
|
349 |
-
|
350 |
-
/**
|
351 |
-
* @param string $postBody the postBody to set
|
352 |
-
*/
|
353 |
-
public function setPostBody($postBody)
|
354 |
-
{
|
355 |
-
$this->postBody = $postBody;
|
356 |
-
}
|
357 |
-
|
358 |
-
/**
|
359 |
-
* Set the User-Agent Header.
|
360 |
-
* @param string $userAgent The User-Agent.
|
361 |
-
*/
|
362 |
-
public function setUserAgent($userAgent)
|
363 |
-
{
|
364 |
-
$this->userAgent = $userAgent;
|
365 |
-
if ($this->canGzip) {
|
366 |
-
$this->userAgent = $userAgent . self::GZIP_UA;
|
367 |
-
}
|
368 |
-
}
|
369 |
-
|
370 |
-
/**
|
371 |
-
* @return string The User-Agent.
|
372 |
-
*/
|
373 |
-
public function getUserAgent()
|
374 |
-
{
|
375 |
-
return $this->userAgent;
|
376 |
-
}
|
377 |
-
|
378 |
-
/**
|
379 |
-
* Returns a cache key depending on if this was an OAuth signed request
|
380 |
-
* in which case it will use the non-signed url and access key to make this
|
381 |
-
* cache key unique per authenticated user, else use the plain request url
|
382 |
-
* @return string The md5 hash of the request cache key.
|
383 |
-
*/
|
384 |
-
public function getCacheKey()
|
385 |
-
{
|
386 |
-
$key = $this->getUrl();
|
387 |
-
|
388 |
-
if (isset($this->accessKey)) {
|
389 |
-
$key .= $this->accessKey;
|
390 |
-
}
|
391 |
-
|
392 |
-
if (isset($this->requestHeaders['authorization'])) {
|
393 |
-
$key .= $this->requestHeaders['authorization'];
|
394 |
-
}
|
395 |
-
|
396 |
-
return md5($key);
|
397 |
-
}
|
398 |
-
|
399 |
-
public function getParsedCacheControl()
|
400 |
-
{
|
401 |
-
$parsed = array();
|
402 |
-
$rawCacheControl = $this->getResponseHeader('cache-control');
|
403 |
-
if ($rawCacheControl) {
|
404 |
-
$rawCacheControl = str_replace(', ', '&', $rawCacheControl);
|
405 |
-
parse_str($rawCacheControl, $parsed);
|
406 |
-
}
|
407 |
-
|
408 |
-
return $parsed;
|
409 |
-
}
|
410 |
-
|
411 |
-
/**
|
412 |
-
* @param string $id
|
413 |
-
* @return string A string representation of the HTTP Request.
|
414 |
-
*/
|
415 |
-
public function toBatchString($id)
|
416 |
-
{
|
417 |
-
$str = '';
|
418 |
-
$path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" .
|
419 |
-
http_build_query($this->queryParams);
|
420 |
-
$str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n";
|
421 |
-
|
422 |
-
foreach ($this->getRequestHeaders() as $key => $val) {
|
423 |
-
$str .= $key . ': ' . $val . "\n";
|
424 |
-
}
|
425 |
-
|
426 |
-
if ($this->getPostBody()) {
|
427 |
-
$str .= "\n";
|
428 |
-
$str .= $this->getPostBody();
|
429 |
-
}
|
430 |
-
|
431 |
-
$headers = '';
|
432 |
-
foreach ($this->batchHeaders as $key => $val) {
|
433 |
-
$headers .= $key . ': ' . $val . "\n";
|
434 |
-
}
|
435 |
-
|
436 |
-
$headers .= "Content-ID: $id\n";
|
437 |
-
$str = $headers . "\n" . $str;
|
438 |
-
|
439 |
-
return $str;
|
440 |
-
}
|
441 |
-
|
442 |
-
/**
|
443 |
-
* Our own version of parse_str that allows for multiple variables
|
444 |
-
* with the same name.
|
445 |
-
* @param $string - the query string to parse
|
446 |
-
*/
|
447 |
-
private function parseQuery($string)
|
448 |
-
{
|
449 |
-
$return = array();
|
450 |
-
$parts = explode("&", $string);
|
451 |
-
foreach ($parts as $part) {
|
452 |
-
list($key, $value) = explode('=', $part, 2);
|
453 |
-
$value = urldecode($value);
|
454 |
-
if (isset($return[$key])) {
|
455 |
-
if (!is_array($return[$key])) {
|
456 |
-
$return[$key] = array($return[$key]);
|
457 |
-
}
|
458 |
-
$return[$key][] = $value;
|
459 |
-
} else {
|
460 |
-
$return[$key] = $value;
|
461 |
-
}
|
462 |
-
}
|
463 |
-
return $return;
|
464 |
-
}
|
465 |
-
|
466 |
-
/**
|
467 |
-
* A version of build query that allows for multiple
|
468 |
-
* duplicate keys.
|
469 |
-
* @param $parts array of key value pairs
|
470 |
-
*/
|
471 |
-
private function buildQuery($parts)
|
472 |
-
{
|
473 |
-
$return = array();
|
474 |
-
foreach ($parts as $key => $value) {
|
475 |
-
if (is_array($value)) {
|
476 |
-
foreach ($value as $v) {
|
477 |
-
$return[] = urlencode($key) . "=" . urlencode($v);
|
478 |
-
}
|
479 |
-
} else {
|
480 |
-
$return[] = urlencode($key) . "=" . urlencode($value);
|
481 |
-
}
|
482 |
-
}
|
483 |
-
return implode('&', $return);
|
484 |
-
}
|
485 |
-
|
486 |
-
/**
|
487 |
-
* If we're POSTing and have no body to send, we can send the query
|
488 |
-
* parameters in there, which avoids length issues with longer query
|
489 |
-
* params.
|
490 |
-
*/
|
491 |
-
public function maybeMoveParametersToBody()
|
492 |
-
{
|
493 |
-
if ($this->getRequestMethod() == "POST" && empty($this->postBody)) {
|
494 |
-
$this->setRequestHeaders(
|
495 |
-
array(
|
496 |
-
"content-type" =>
|
497 |
-
"application/x-www-form-urlencoded; charset=UTF-8"
|
498 |
-
)
|
499 |
-
);
|
500 |
-
$this->setPostBody($this->buildQuery($this->queryParams));
|
501 |
-
$this->queryParams = array();
|
502 |
-
}
|
503 |
-
}
|
504 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* HTTP Request to be executed by IO classes. Upon execution, the
|
24 |
+
* responseHttpCode, responseHeaders and responseBody will be filled in.
|
25 |
+
*
|
26 |
+
* @author Chris Chabot <chabotc@google.com>
|
27 |
+
* @author Chirag Shah <chirags@google.com>
|
28 |
+
*
|
29 |
+
*/
|
30 |
+
class Google_Http_Request
|
31 |
+
{
|
32 |
+
const GZIP_UA = " (gzip)";
|
33 |
+
|
34 |
+
private $batchHeaders = array(
|
35 |
+
'Content-Type' => 'application/http',
|
36 |
+
'Content-Transfer-Encoding' => 'binary',
|
37 |
+
'MIME-Version' => '1.0',
|
38 |
+
);
|
39 |
+
|
40 |
+
protected $queryParams;
|
41 |
+
protected $requestMethod;
|
42 |
+
protected $requestHeaders;
|
43 |
+
protected $baseComponent = null;
|
44 |
+
protected $path;
|
45 |
+
protected $postBody;
|
46 |
+
protected $userAgent;
|
47 |
+
protected $canGzip = null;
|
48 |
+
|
49 |
+
protected $responseHttpCode;
|
50 |
+
protected $responseHeaders;
|
51 |
+
protected $responseBody;
|
52 |
+
|
53 |
+
protected $expectedClass;
|
54 |
+
protected $expectedRaw = false;
|
55 |
+
|
56 |
+
public $accessKey;
|
57 |
+
|
58 |
+
public function __construct(
|
59 |
+
$url,
|
60 |
+
$method = 'GET',
|
61 |
+
$headers = array(),
|
62 |
+
$postBody = null
|
63 |
+
) {
|
64 |
+
$this->setUrl($url);
|
65 |
+
$this->setRequestMethod($method);
|
66 |
+
$this->setRequestHeaders($headers);
|
67 |
+
$this->setPostBody($postBody);
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Misc function that returns the base url component of the $url
|
72 |
+
* used by the OAuth signing class to calculate the base string
|
73 |
+
* @return string The base url component of the $url.
|
74 |
+
*/
|
75 |
+
public function getBaseComponent()
|
76 |
+
{
|
77 |
+
return $this->baseComponent;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Set the base URL that path and query parameters will be added to.
|
82 |
+
* @param $baseComponent string
|
83 |
+
*/
|
84 |
+
public function setBaseComponent($baseComponent)
|
85 |
+
{
|
86 |
+
$this->baseComponent = rtrim($baseComponent, '/');
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Enable support for gzipped responses with this request.
|
91 |
+
*/
|
92 |
+
public function enableGzip()
|
93 |
+
{
|
94 |
+
$this->setRequestHeaders(array("Accept-Encoding" => "gzip"));
|
95 |
+
$this->canGzip = true;
|
96 |
+
$this->setUserAgent($this->userAgent);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Disable support for gzip responses with this request.
|
101 |
+
*/
|
102 |
+
public function disableGzip()
|
103 |
+
{
|
104 |
+
if (
|
105 |
+
isset($this->requestHeaders['accept-encoding']) &&
|
106 |
+
$this->requestHeaders['accept-encoding'] == "gzip"
|
107 |
+
) {
|
108 |
+
unset($this->requestHeaders['accept-encoding']);
|
109 |
+
}
|
110 |
+
$this->canGzip = false;
|
111 |
+
$this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent);
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Can this request accept a gzip response?
|
116 |
+
* @return bool
|
117 |
+
*/
|
118 |
+
public function canGzip()
|
119 |
+
{
|
120 |
+
return $this->canGzip;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Misc function that returns an array of the query parameters of the current
|
125 |
+
* url used by the OAuth signing class to calculate the signature
|
126 |
+
* @return array Query parameters in the query string.
|
127 |
+
*/
|
128 |
+
public function getQueryParams()
|
129 |
+
{
|
130 |
+
return $this->queryParams;
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Set a new query parameter.
|
135 |
+
* @param $key - string to set, does not need to be URL encoded
|
136 |
+
* @param $value - string to set, does not need to be URL encoded
|
137 |
+
*/
|
138 |
+
public function setQueryParam($key, $value)
|
139 |
+
{
|
140 |
+
$this->queryParams[$key] = $value;
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* @return string HTTP Response Code.
|
145 |
+
*/
|
146 |
+
public function getResponseHttpCode()
|
147 |
+
{
|
148 |
+
return (int) $this->responseHttpCode;
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* @param int $responseHttpCode HTTP Response Code.
|
153 |
+
*/
|
154 |
+
public function setResponseHttpCode($responseHttpCode)
|
155 |
+
{
|
156 |
+
$this->responseHttpCode = $responseHttpCode;
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* @return $responseHeaders (array) HTTP Response Headers.
|
161 |
+
*/
|
162 |
+
public function getResponseHeaders()
|
163 |
+
{
|
164 |
+
return $this->responseHeaders;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* @return string HTTP Response Body
|
169 |
+
*/
|
170 |
+
public function getResponseBody()
|
171 |
+
{
|
172 |
+
return $this->responseBody;
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Set the class the response to this request should expect.
|
177 |
+
*
|
178 |
+
* @param $class string the class name
|
179 |
+
*/
|
180 |
+
public function setExpectedClass($class)
|
181 |
+
{
|
182 |
+
$this->expectedClass = $class;
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Retrieve the expected class the response should expect.
|
187 |
+
* @return string class name
|
188 |
+
*/
|
189 |
+
public function getExpectedClass()
|
190 |
+
{
|
191 |
+
return $this->expectedClass;
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Enable expected raw response
|
196 |
+
*/
|
197 |
+
public function enableExpectedRaw()
|
198 |
+
{
|
199 |
+
$this->expectedRaw = true;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Disable expected raw response
|
204 |
+
*/
|
205 |
+
public function disableExpectedRaw()
|
206 |
+
{
|
207 |
+
$this->expectedRaw = false;
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* Expected raw response or not.
|
212 |
+
* @return boolean expected raw response
|
213 |
+
*/
|
214 |
+
public function getExpectedRaw()
|
215 |
+
{
|
216 |
+
return $this->expectedRaw;
|
217 |
+
}
|
218 |
+
|
219 |
+
/**
|
220 |
+
* @param array $headers The HTTP response headers
|
221 |
+
* to be normalized.
|
222 |
+
*/
|
223 |
+
public function setResponseHeaders($headers)
|
224 |
+
{
|
225 |
+
$headers = Google_Utils::normalize($headers);
|
226 |
+
if ($this->responseHeaders) {
|
227 |
+
$headers = array_merge($this->responseHeaders, $headers);
|
228 |
+
}
|
229 |
+
|
230 |
+
$this->responseHeaders = $headers;
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* @param string $key
|
235 |
+
* @return array|boolean Returns the requested HTTP header or
|
236 |
+
* false if unavailable.
|
237 |
+
*/
|
238 |
+
public function getResponseHeader($key)
|
239 |
+
{
|
240 |
+
return isset($this->responseHeaders[$key])
|
241 |
+
? $this->responseHeaders[$key]
|
242 |
+
: false;
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* @param string $responseBody The HTTP response body.
|
247 |
+
*/
|
248 |
+
public function setResponseBody($responseBody)
|
249 |
+
{
|
250 |
+
$this->responseBody = $responseBody;
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* @return string $url The request URL.
|
255 |
+
*/
|
256 |
+
public function getUrl()
|
257 |
+
{
|
258 |
+
return $this->baseComponent . $this->path .
|
259 |
+
(count($this->queryParams) ?
|
260 |
+
"?" . $this->buildQuery($this->queryParams) :
|
261 |
+
'');
|
262 |
+
}
|
263 |
+
|
264 |
+
/**
|
265 |
+
* @return string $method HTTP Request Method.
|
266 |
+
*/
|
267 |
+
public function getRequestMethod()
|
268 |
+
{
|
269 |
+
return $this->requestMethod;
|
270 |
+
}
|
271 |
+
|
272 |
+
/**
|
273 |
+
* @return array $headers HTTP Request Headers.
|
274 |
+
*/
|
275 |
+
public function getRequestHeaders()
|
276 |
+
{
|
277 |
+
return $this->requestHeaders;
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* @param string $key
|
282 |
+
* @return array|boolean Returns the requested HTTP header or
|
283 |
+
* false if unavailable.
|
284 |
+
*/
|
285 |
+
public function getRequestHeader($key)
|
286 |
+
{
|
287 |
+
return isset($this->requestHeaders[$key])
|
288 |
+
? $this->requestHeaders[$key]
|
289 |
+
: false;
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* @return string $postBody HTTP Request Body.
|
294 |
+
*/
|
295 |
+
public function getPostBody()
|
296 |
+
{
|
297 |
+
return $this->postBody;
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* @param string $url the url to set
|
302 |
+
*/
|
303 |
+
public function setUrl($url)
|
304 |
+
{
|
305 |
+
if (substr($url, 0, 4) != 'http') {
|
306 |
+
// Force the path become relative.
|
307 |
+
if (substr($url, 0, 1) !== '/') {
|
308 |
+
$url = '/' . $url;
|
309 |
+
}
|
310 |
+
}
|
311 |
+
$parts = parse_url($url);
|
312 |
+
if (isset($parts['host'])) {
|
313 |
+
$this->baseComponent = sprintf(
|
314 |
+
"%s%s%s",
|
315 |
+
isset($parts['scheme']) ? $parts['scheme'] . "://" : '',
|
316 |
+
isset($parts['host']) ? $parts['host'] : '',
|
317 |
+
isset($parts['port']) ? ":" . $parts['port'] : ''
|
318 |
+
);
|
319 |
+
}
|
320 |
+
$this->path = isset($parts['path']) ? $parts['path'] : '';
|
321 |
+
$this->queryParams = array();
|
322 |
+
if (isset($parts['query'])) {
|
323 |
+
$this->queryParams = $this->parseQuery($parts['query']);
|
324 |
+
}
|
325 |
+
}
|
326 |
+
|
327 |
+
/**
|
328 |
+
* @param string $method Set he HTTP Method and normalize
|
329 |
+
* it to upper-case, as required by HTTP.
|
330 |
+
*
|
331 |
+
*/
|
332 |
+
public function setRequestMethod($method)
|
333 |
+
{
|
334 |
+
$this->requestMethod = strtoupper($method);
|
335 |
+
}
|
336 |
+
|
337 |
+
/**
|
338 |
+
* @param array $headers The HTTP request headers
|
339 |
+
* to be set and normalized.
|
340 |
+
*/
|
341 |
+
public function setRequestHeaders($headers)
|
342 |
+
{
|
343 |
+
$headers = Google_Utils::normalize($headers);
|
344 |
+
if ($this->requestHeaders) {
|
345 |
+
$headers = array_merge($this->requestHeaders, $headers);
|
346 |
+
}
|
347 |
+
$this->requestHeaders = $headers;
|
348 |
+
}
|
349 |
+
|
350 |
+
/**
|
351 |
+
* @param string $postBody the postBody to set
|
352 |
+
*/
|
353 |
+
public function setPostBody($postBody)
|
354 |
+
{
|
355 |
+
$this->postBody = $postBody;
|
356 |
+
}
|
357 |
+
|
358 |
+
/**
|
359 |
+
* Set the User-Agent Header.
|
360 |
+
* @param string $userAgent The User-Agent.
|
361 |
+
*/
|
362 |
+
public function setUserAgent($userAgent)
|
363 |
+
{
|
364 |
+
$this->userAgent = $userAgent;
|
365 |
+
if ($this->canGzip) {
|
366 |
+
$this->userAgent = $userAgent . self::GZIP_UA;
|
367 |
+
}
|
368 |
+
}
|
369 |
+
|
370 |
+
/**
|
371 |
+
* @return string The User-Agent.
|
372 |
+
*/
|
373 |
+
public function getUserAgent()
|
374 |
+
{
|
375 |
+
return $this->userAgent;
|
376 |
+
}
|
377 |
+
|
378 |
+
/**
|
379 |
+
* Returns a cache key depending on if this was an OAuth signed request
|
380 |
+
* in which case it will use the non-signed url and access key to make this
|
381 |
+
* cache key unique per authenticated user, else use the plain request url
|
382 |
+
* @return string The md5 hash of the request cache key.
|
383 |
+
*/
|
384 |
+
public function getCacheKey()
|
385 |
+
{
|
386 |
+
$key = $this->getUrl();
|
387 |
+
|
388 |
+
if (isset($this->accessKey)) {
|
389 |
+
$key .= $this->accessKey;
|
390 |
+
}
|
391 |
+
|
392 |
+
if (isset($this->requestHeaders['authorization'])) {
|
393 |
+
$key .= $this->requestHeaders['authorization'];
|
394 |
+
}
|
395 |
+
|
396 |
+
return md5($key);
|
397 |
+
}
|
398 |
+
|
399 |
+
public function getParsedCacheControl()
|
400 |
+
{
|
401 |
+
$parsed = array();
|
402 |
+
$rawCacheControl = $this->getResponseHeader('cache-control');
|
403 |
+
if ($rawCacheControl) {
|
404 |
+
$rawCacheControl = str_replace(', ', '&', $rawCacheControl);
|
405 |
+
parse_str($rawCacheControl, $parsed);
|
406 |
+
}
|
407 |
+
|
408 |
+
return $parsed;
|
409 |
+
}
|
410 |
+
|
411 |
+
/**
|
412 |
+
* @param string $id
|
413 |
+
* @return string A string representation of the HTTP Request.
|
414 |
+
*/
|
415 |
+
public function toBatchString($id)
|
416 |
+
{
|
417 |
+
$str = '';
|
418 |
+
$path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" .
|
419 |
+
http_build_query($this->queryParams);
|
420 |
+
$str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n";
|
421 |
+
|
422 |
+
foreach ($this->getRequestHeaders() as $key => $val) {
|
423 |
+
$str .= $key . ': ' . $val . "\n";
|
424 |
+
}
|
425 |
+
|
426 |
+
if ($this->getPostBody()) {
|
427 |
+
$str .= "\n";
|
428 |
+
$str .= $this->getPostBody();
|
429 |
+
}
|
430 |
+
|
431 |
+
$headers = '';
|
432 |
+
foreach ($this->batchHeaders as $key => $val) {
|
433 |
+
$headers .= $key . ': ' . $val . "\n";
|
434 |
+
}
|
435 |
+
|
436 |
+
$headers .= "Content-ID: $id\n";
|
437 |
+
$str = $headers . "\n" . $str;
|
438 |
+
|
439 |
+
return $str;
|
440 |
+
}
|
441 |
+
|
442 |
+
/**
|
443 |
+
* Our own version of parse_str that allows for multiple variables
|
444 |
+
* with the same name.
|
445 |
+
* @param $string - the query string to parse
|
446 |
+
*/
|
447 |
+
private function parseQuery($string)
|
448 |
+
{
|
449 |
+
$return = array();
|
450 |
+
$parts = explode("&", $string);
|
451 |
+
foreach ($parts as $part) {
|
452 |
+
list($key, $value) = explode('=', $part, 2);
|
453 |
+
$value = urldecode($value);
|
454 |
+
if (isset($return[$key])) {
|
455 |
+
if (!is_array($return[$key])) {
|
456 |
+
$return[$key] = array($return[$key]);
|
457 |
+
}
|
458 |
+
$return[$key][] = $value;
|
459 |
+
} else {
|
460 |
+
$return[$key] = $value;
|
461 |
+
}
|
462 |
+
}
|
463 |
+
return $return;
|
464 |
+
}
|
465 |
+
|
466 |
+
/**
|
467 |
+
* A version of build query that allows for multiple
|
468 |
+
* duplicate keys.
|
469 |
+
* @param $parts array of key value pairs
|
470 |
+
*/
|
471 |
+
private function buildQuery($parts)
|
472 |
+
{
|
473 |
+
$return = array();
|
474 |
+
foreach ($parts as $key => $value) {
|
475 |
+
if (is_array($value)) {
|
476 |
+
foreach ($value as $v) {
|
477 |
+
$return[] = urlencode($key) . "=" . urlencode($v);
|
478 |
+
}
|
479 |
+
} else {
|
480 |
+
$return[] = urlencode($key) . "=" . urlencode($value);
|
481 |
+
}
|
482 |
+
}
|
483 |
+
return implode('&', $return);
|
484 |
+
}
|
485 |
+
|
486 |
+
/**
|
487 |
+
* If we're POSTing and have no body to send, we can send the query
|
488 |
+
* parameters in there, which avoids length issues with longer query
|
489 |
+
* params.
|
490 |
+
*/
|
491 |
+
public function maybeMoveParametersToBody()
|
492 |
+
{
|
493 |
+
if ($this->getRequestMethod() == "POST" && empty($this->postBody)) {
|
494 |
+
$this->setRequestHeaders(
|
495 |
+
array(
|
496 |
+
"content-type" =>
|
497 |
+
"application/x-www-form-urlencoded; charset=UTF-8"
|
498 |
+
)
|
499 |
+
);
|
500 |
+
$this->setPostBody($this->buildQuery($this->queryParams));
|
501 |
+
$this->queryParams = array();
|
502 |
+
}
|
503 |
+
}
|
504 |
+
}
|
app/api/Google/IO/Abstract.php
CHANGED
@@ -1,339 +1,339 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Abstract IO base class
|
20 |
-
*/
|
21 |
-
|
22 |
-
if (!class_exists('Google_Client')) {
|
23 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
24 |
-
}
|
25 |
-
|
26 |
-
abstract class Google_IO_Abstract
|
27 |
-
{
|
28 |
-
const UNKNOWN_CODE = 0;
|
29 |
-
const FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
30 |
-
private static $CONNECTION_ESTABLISHED_HEADERS = array(
|
31 |
-
"HTTP/1.0 200 Connection established\r\n\r\n",
|
32 |
-
"HTTP/1.1 200 Connection established\r\n\r\n",
|
33 |
-
);
|
34 |
-
private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null);
|
35 |
-
private static $HOP_BY_HOP = array(
|
36 |
-
'connection' => true,
|
37 |
-
'keep-alive' => true,
|
38 |
-
'proxy-authenticate' => true,
|
39 |
-
'proxy-authorization' => true,
|
40 |
-
'te' => true,
|
41 |
-
'trailers' => true,
|
42 |
-
'transfer-encoding' => true,
|
43 |
-
'upgrade' => true
|
44 |
-
);
|
45 |
-
|
46 |
-
|
47 |
-
/** @var Google_Client */
|
48 |
-
protected $client;
|
49 |
-
|
50 |
-
public function __construct(Google_Client $client)
|
51 |
-
{
|
52 |
-
$this->client = $client;
|
53 |
-
$timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds');
|
54 |
-
if ($timeout > 0) {
|
55 |
-
$this->setTimeout($timeout);
|
56 |
-
}
|
57 |
-
}
|
58 |
-
|
59 |
-
/**
|
60 |
-
* Executes a Google_Http_Request
|
61 |
-
* @param Google_Http_Request $request the http request to be executed
|
62 |
-
* @return array containing response headers, body, and http code
|
63 |
-
* @throws Google_IO_Exception on curl or IO error
|
64 |
-
*/
|
65 |
-
abstract public function executeRequest(Google_Http_Request $request);
|
66 |
-
|
67 |
-
/**
|
68 |
-
* Set options that update the transport implementation's behavior.
|
69 |
-
* @param $options
|
70 |
-
*/
|
71 |
-
abstract public function setOptions($options);
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Set the maximum request time in seconds.
|
75 |
-
* @param $timeout in seconds
|
76 |
-
*/
|
77 |
-
abstract public function setTimeout($timeout);
|
78 |
-
|
79 |
-
/**
|
80 |
-
* Get the maximum request time in seconds.
|
81 |
-
* @return timeout in seconds
|
82 |
-
*/
|
83 |
-
abstract public function getTimeout();
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Test for the presence of a cURL header processing bug
|
87 |
-
*
|
88 |
-
* The cURL bug was present in versions prior to 7.30.0 and caused the header
|
89 |
-
* length to be miscalculated when a "Connection established" header added by
|
90 |
-
* some proxies was present.
|
91 |
-
*
|
92 |
-
* @return boolean
|
93 |
-
*/
|
94 |
-
abstract protected function needsQuirk();
|
95 |
-
|
96 |
-
/**
|
97 |
-
* @visible for testing.
|
98 |
-
* Cache the response to an HTTP request if it is cacheable.
|
99 |
-
* @param Google_Http_Request $request
|
100 |
-
* @return bool Returns true if the insertion was successful.
|
101 |
-
* Otherwise, return false.
|
102 |
-
*/
|
103 |
-
public function setCachedRequest(Google_Http_Request $request)
|
104 |
-
{
|
105 |
-
// Determine if the request is cacheable.
|
106 |
-
if (Google_Http_CacheParser::isResponseCacheable($request)) {
|
107 |
-
$this->client->getCache()->set($request->getCacheKey(), $request);
|
108 |
-
return true;
|
109 |
-
}
|
110 |
-
|
111 |
-
return false;
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Execute an HTTP Request
|
116 |
-
*
|
117 |
-
* @param Google_Http_Request $request the http request to be executed
|
118 |
-
* @return Google_Http_Request http request with the response http code,
|
119 |
-
* response headers and response body filled in
|
120 |
-
* @throws Google_IO_Exception on curl or IO error
|
121 |
-
*/
|
122 |
-
public function makeRequest(Google_Http_Request $request)
|
123 |
-
{
|
124 |
-
// First, check to see if we have a valid cached version.
|
125 |
-
$cached = $this->getCachedRequest($request);
|
126 |
-
if ($cached !== false && $cached instanceof Google_Http_Request) {
|
127 |
-
if (!$this->checkMustRevalidateCachedRequest($cached, $request)) {
|
128 |
-
return $cached;
|
129 |
-
}
|
130 |
-
}
|
131 |
-
|
132 |
-
if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) {
|
133 |
-
$request = $this->processEntityRequest($request);
|
134 |
-
}
|
135 |
-
|
136 |
-
list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request);
|
137 |
-
|
138 |
-
if ($respHttpCode == 304 && $cached) {
|
139 |
-
// If the server responded NOT_MODIFIED, return the cached request.
|
140 |
-
$this->updateCachedRequest($cached, $responseHeaders);
|
141 |
-
return $cached;
|
142 |
-
}
|
143 |
-
|
144 |
-
if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) {
|
145 |
-
$responseHeaders['date'] = date("r");
|
146 |
-
}
|
147 |
-
|
148 |
-
$request->setResponseHttpCode($respHttpCode);
|
149 |
-
$request->setResponseHeaders($responseHeaders);
|
150 |
-
$request->setResponseBody($responseData);
|
151 |
-
// Store the request in cache (the function checks to see if the request
|
152 |
-
// can actually be cached)
|
153 |
-
$this->setCachedRequest($request);
|
154 |
-
return $request;
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* @visible for testing.
|
159 |
-
* @param Google_Http_Request $request
|
160 |
-
* @return Google_Http_Request|bool Returns the cached object or
|
161 |
-
* false if the operation was unsuccessful.
|
162 |
-
*/
|
163 |
-
public function getCachedRequest(Google_Http_Request $request)
|
164 |
-
{
|
165 |
-
if (false === Google_Http_CacheParser::isRequestCacheable($request)) {
|
166 |
-
return false;
|
167 |
-
}
|
168 |
-
|
169 |
-
return $this->client->getCache()->get($request->getCacheKey());
|
170 |
-
}
|
171 |
-
|
172 |
-
/**
|
173 |
-
* @visible for testing
|
174 |
-
* Process an http request that contains an enclosed entity.
|
175 |
-
* @param Google_Http_Request $request
|
176 |
-
* @return Google_Http_Request Processed request with the enclosed entity.
|
177 |
-
*/
|
178 |
-
public function processEntityRequest(Google_Http_Request $request)
|
179 |
-
{
|
180 |
-
$postBody = $request->getPostBody();
|
181 |
-
$contentType = $request->getRequestHeader("content-type");
|
182 |
-
|
183 |
-
// Set the default content-type as application/x-www-form-urlencoded.
|
184 |
-
if (false == $contentType) {
|
185 |
-
$contentType = self::FORM_URLENCODED;
|
186 |
-
$request->setRequestHeaders(array('content-type' => $contentType));
|
187 |
-
}
|
188 |
-
|
189 |
-
// Force the payload to match the content-type asserted in the header.
|
190 |
-
if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
|
191 |
-
$postBody = http_build_query($postBody, '', '&');
|
192 |
-
$request->setPostBody($postBody);
|
193 |
-
}
|
194 |
-
|
195 |
-
// Make sure the content-length header is set.
|
196 |
-
if (!$postBody || is_string($postBody)) {
|
197 |
-
$postsLength = strlen($postBody);
|
198 |
-
$request->setRequestHeaders(array('content-length' => $postsLength));
|
199 |
-
}
|
200 |
-
|
201 |
-
return $request;
|
202 |
-
}
|
203 |
-
|
204 |
-
/**
|
205 |
-
* Check if an already cached request must be revalidated, and if so update
|
206 |
-
* the request with the correct ETag headers.
|
207 |
-
* @param Google_Http_Request $cached A previously cached response.
|
208 |
-
* @param Google_Http_Request $request The outbound request.
|
209 |
-
* return bool If the cached object needs to be revalidated, false if it is
|
210 |
-
* still current and can be re-used.
|
211 |
-
*/
|
212 |
-
protected function checkMustRevalidateCachedRequest($cached, $request)
|
213 |
-
{
|
214 |
-
if (Google_Http_CacheParser::mustRevalidate($cached)) {
|
215 |
-
$addHeaders = array();
|
216 |
-
if ($cached->getResponseHeader('etag')) {
|
217 |
-
// [13.3.4] If an entity tag has been provided by the origin server,
|
218 |
-
// we must use that entity tag in any cache-conditional request.
|
219 |
-
$addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
|
220 |
-
} elseif ($cached->getResponseHeader('date')) {
|
221 |
-
$addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
|
222 |
-
}
|
223 |
-
|
224 |
-
$request->setRequestHeaders($addHeaders);
|
225 |
-
return true;
|
226 |
-
} else {
|
227 |
-
return false;
|
228 |
-
}
|
229 |
-
}
|
230 |
-
|
231 |
-
/**
|
232 |
-
* Update a cached request, using the headers from the last response.
|
233 |
-
* @param Google_Http_Request $cached A previously cached response.
|
234 |
-
* @param mixed Associative array of response headers from the last request.
|
235 |
-
*/
|
236 |
-
protected function updateCachedRequest($cached, $responseHeaders)
|
237 |
-
{
|
238 |
-
$hopByHop = self::$HOP_BY_HOP;
|
239 |
-
if (!empty($responseHeaders['connection'])) {
|
240 |
-
$connectionHeaders = array_map(
|
241 |
-
'strtolower',
|
242 |
-
array_filter(
|
243 |
-
array_map('trim', explode(',', $responseHeaders['connection']))
|
244 |
-
)
|
245 |
-
);
|
246 |
-
$hopByHop += array_fill_keys($connectionHeaders, true);
|
247 |
-
}
|
248 |
-
|
249 |
-
$endToEnd = array_diff_key($responseHeaders, $hopByHop);
|
250 |
-
$cached->setResponseHeaders($endToEnd);
|
251 |
-
}
|
252 |
-
|
253 |
-
/**
|
254 |
-
* Used by the IO lib and also the batch processing.
|
255 |
-
*
|
256 |
-
* @param $respData
|
257 |
-
* @param $headerSize
|
258 |
-
* @return array
|
259 |
-
*/
|
260 |
-
public function parseHttpResponse($respData, $headerSize)
|
261 |
-
{
|
262 |
-
// check proxy header
|
263 |
-
foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) {
|
264 |
-
if (stripos($respData, $established_header) !== false) {
|
265 |
-
// existed, remove it
|
266 |
-
$respData = str_ireplace($established_header, '', $respData);
|
267 |
-
// Subtract the proxy header size unless the cURL bug prior to 7.30.0
|
268 |
-
// is present which prevented the proxy header size from being taken into
|
269 |
-
// account.
|
270 |
-
if (!$this->needsQuirk()) {
|
271 |
-
$headerSize -= strlen($established_header);
|
272 |
-
}
|
273 |
-
break;
|
274 |
-
}
|
275 |
-
}
|
276 |
-
|
277 |
-
if ($headerSize) {
|
278 |
-
$responseBody = substr($respData, $headerSize);
|
279 |
-
$responseHeaders = substr($respData, 0, $headerSize);
|
280 |
-
} else {
|
281 |
-
$responseSegments = explode("\r\n\r\n", $respData, 2);
|
282 |
-
$responseHeaders = $responseSegments[0];
|
283 |
-
$responseBody = isset($responseSegments[1]) ? $responseSegments[1] :
|
284 |
-
null;
|
285 |
-
}
|
286 |
-
|
287 |
-
$responseHeaders = $this->getHttpResponseHeaders($responseHeaders);
|
288 |
-
return array($responseHeaders, $responseBody);
|
289 |
-
}
|
290 |
-
|
291 |
-
/**
|
292 |
-
* Parse out headers from raw headers
|
293 |
-
* @param rawHeaders array or string
|
294 |
-
* @return array
|
295 |
-
*/
|
296 |
-
public function getHttpResponseHeaders($rawHeaders)
|
297 |
-
{
|
298 |
-
if (is_array($rawHeaders)) {
|
299 |
-
return $this->parseArrayHeaders($rawHeaders);
|
300 |
-
} else {
|
301 |
-
return $this->parseStringHeaders($rawHeaders);
|
302 |
-
}
|
303 |
-
}
|
304 |
-
|
305 |
-
private function parseStringHeaders($rawHeaders)
|
306 |
-
{
|
307 |
-
$headers = array();
|
308 |
-
$responseHeaderLines = explode("\r\n", $rawHeaders);
|
309 |
-
foreach ($responseHeaderLines as $headerLine) {
|
310 |
-
if ($headerLine && strpos($headerLine, ':') !== false) {
|
311 |
-
list($header, $value) = explode(': ', $headerLine, 2);
|
312 |
-
$header = strtolower($header);
|
313 |
-
if (isset($headers[$header])) {
|
314 |
-
$headers[$header] .= "\n" . $value;
|
315 |
-
} else {
|
316 |
-
$headers[$header] = $value;
|
317 |
-
}
|
318 |
-
}
|
319 |
-
}
|
320 |
-
return $headers;
|
321 |
-
}
|
322 |
-
|
323 |
-
private function parseArrayHeaders($rawHeaders)
|
324 |
-
{
|
325 |
-
$header_count = count($rawHeaders);
|
326 |
-
$headers = array();
|
327 |
-
|
328 |
-
for ($i = 0; $i < $header_count; $i++) {
|
329 |
-
$header = $rawHeaders[$i];
|
330 |
-
// Times will have colons in - so we just want the first match.
|
331 |
-
$header_parts = explode(': ', $header, 2);
|
332 |
-
if (count($header_parts) == 2) {
|
333 |
-
$headers[strtolower($header_parts[0])] = $header_parts[1];
|
334 |
-
}
|
335 |
-
}
|
336 |
-
|
337 |
-
return $headers;
|
338 |
-
}
|
339 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Abstract IO base class
|
20 |
+
*/
|
21 |
+
|
22 |
+
if (!class_exists('Google_Client')) {
|
23 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
24 |
+
}
|
25 |
+
|
26 |
+
abstract class Google_IO_Abstract
|
27 |
+
{
|
28 |
+
const UNKNOWN_CODE = 0;
|
29 |
+
const FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
30 |
+
private static $CONNECTION_ESTABLISHED_HEADERS = array(
|
31 |
+
"HTTP/1.0 200 Connection established\r\n\r\n",
|
32 |
+
"HTTP/1.1 200 Connection established\r\n\r\n",
|
33 |
+
);
|
34 |
+
private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null);
|
35 |
+
private static $HOP_BY_HOP = array(
|
36 |
+
'connection' => true,
|
37 |
+
'keep-alive' => true,
|
38 |
+
'proxy-authenticate' => true,
|
39 |
+
'proxy-authorization' => true,
|
40 |
+
'te' => true,
|
41 |
+
'trailers' => true,
|
42 |
+
'transfer-encoding' => true,
|
43 |
+
'upgrade' => true
|
44 |
+
);
|
45 |
+
|
46 |
+
|
47 |
+
/** @var Google_Client */
|
48 |
+
protected $client;
|
49 |
+
|
50 |
+
public function __construct(Google_Client $client)
|
51 |
+
{
|
52 |
+
$this->client = $client;
|
53 |
+
$timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds');
|
54 |
+
if ($timeout > 0) {
|
55 |
+
$this->setTimeout($timeout);
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Executes a Google_Http_Request
|
61 |
+
* @param Google_Http_Request $request the http request to be executed
|
62 |
+
* @return array containing response headers, body, and http code
|
63 |
+
* @throws Google_IO_Exception on curl or IO error
|
64 |
+
*/
|
65 |
+
abstract public function executeRequest(Google_Http_Request $request);
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Set options that update the transport implementation's behavior.
|
69 |
+
* @param $options
|
70 |
+
*/
|
71 |
+
abstract public function setOptions($options);
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Set the maximum request time in seconds.
|
75 |
+
* @param $timeout in seconds
|
76 |
+
*/
|
77 |
+
abstract public function setTimeout($timeout);
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Get the maximum request time in seconds.
|
81 |
+
* @return timeout in seconds
|
82 |
+
*/
|
83 |
+
abstract public function getTimeout();
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Test for the presence of a cURL header processing bug
|
87 |
+
*
|
88 |
+
* The cURL bug was present in versions prior to 7.30.0 and caused the header
|
89 |
+
* length to be miscalculated when a "Connection established" header added by
|
90 |
+
* some proxies was present.
|
91 |
+
*
|
92 |
+
* @return boolean
|
93 |
+
*/
|
94 |
+
abstract protected function needsQuirk();
|
95 |
+
|
96 |
+
/**
|
97 |
+
* @visible for testing.
|
98 |
+
* Cache the response to an HTTP request if it is cacheable.
|
99 |
+
* @param Google_Http_Request $request
|
100 |
+
* @return bool Returns true if the insertion was successful.
|
101 |
+
* Otherwise, return false.
|
102 |
+
*/
|
103 |
+
public function setCachedRequest(Google_Http_Request $request)
|
104 |
+
{
|
105 |
+
// Determine if the request is cacheable.
|
106 |
+
if (Google_Http_CacheParser::isResponseCacheable($request)) {
|
107 |
+
$this->client->getCache()->set($request->getCacheKey(), $request);
|
108 |
+
return true;
|
109 |
+
}
|
110 |
+
|
111 |
+
return false;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Execute an HTTP Request
|
116 |
+
*
|
117 |
+
* @param Google_Http_Request $request the http request to be executed
|
118 |
+
* @return Google_Http_Request http request with the response http code,
|
119 |
+
* response headers and response body filled in
|
120 |
+
* @throws Google_IO_Exception on curl or IO error
|
121 |
+
*/
|
122 |
+
public function makeRequest(Google_Http_Request $request)
|
123 |
+
{
|
124 |
+
// First, check to see if we have a valid cached version.
|
125 |
+
$cached = $this->getCachedRequest($request);
|
126 |
+
if ($cached !== false && $cached instanceof Google_Http_Request) {
|
127 |
+
if (!$this->checkMustRevalidateCachedRequest($cached, $request)) {
|
128 |
+
return $cached;
|
129 |
+
}
|
130 |
+
}
|
131 |
+
|
132 |
+
if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) {
|
133 |
+
$request = $this->processEntityRequest($request);
|
134 |
+
}
|
135 |
+
|
136 |
+
list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request);
|
137 |
+
|
138 |
+
if ($respHttpCode == 304 && $cached) {
|
139 |
+
// If the server responded NOT_MODIFIED, return the cached request.
|
140 |
+
$this->updateCachedRequest($cached, $responseHeaders);
|
141 |
+
return $cached;
|
142 |
+
}
|
143 |
+
|
144 |
+
if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) {
|
145 |
+
$responseHeaders['date'] = date("r");
|
146 |
+
}
|
147 |
+
|
148 |
+
$request->setResponseHttpCode($respHttpCode);
|
149 |
+
$request->setResponseHeaders($responseHeaders);
|
150 |
+
$request->setResponseBody($responseData);
|
151 |
+
// Store the request in cache (the function checks to see if the request
|
152 |
+
// can actually be cached)
|
153 |
+
$this->setCachedRequest($request);
|
154 |
+
return $request;
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* @visible for testing.
|
159 |
+
* @param Google_Http_Request $request
|
160 |
+
* @return Google_Http_Request|bool Returns the cached object or
|
161 |
+
* false if the operation was unsuccessful.
|
162 |
+
*/
|
163 |
+
public function getCachedRequest(Google_Http_Request $request)
|
164 |
+
{
|
165 |
+
if (false === Google_Http_CacheParser::isRequestCacheable($request)) {
|
166 |
+
return false;
|
167 |
+
}
|
168 |
+
|
169 |
+
return $this->client->getCache()->get($request->getCacheKey());
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* @visible for testing
|
174 |
+
* Process an http request that contains an enclosed entity.
|
175 |
+
* @param Google_Http_Request $request
|
176 |
+
* @return Google_Http_Request Processed request with the enclosed entity.
|
177 |
+
*/
|
178 |
+
public function processEntityRequest(Google_Http_Request $request)
|
179 |
+
{
|
180 |
+
$postBody = $request->getPostBody();
|
181 |
+
$contentType = $request->getRequestHeader("content-type");
|
182 |
+
|
183 |
+
// Set the default content-type as application/x-www-form-urlencoded.
|
184 |
+
if (false == $contentType) {
|
185 |
+
$contentType = self::FORM_URLENCODED;
|
186 |
+
$request->setRequestHeaders(array('content-type' => $contentType));
|
187 |
+
}
|
188 |
+
|
189 |
+
// Force the payload to match the content-type asserted in the header.
|
190 |
+
if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
|
191 |
+
$postBody = http_build_query($postBody, '', '&');
|
192 |
+
$request->setPostBody($postBody);
|
193 |
+
}
|
194 |
+
|
195 |
+
// Make sure the content-length header is set.
|
196 |
+
if (!$postBody || is_string($postBody)) {
|
197 |
+
$postsLength = strlen($postBody);
|
198 |
+
$request->setRequestHeaders(array('content-length' => $postsLength));
|
199 |
+
}
|
200 |
+
|
201 |
+
return $request;
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Check if an already cached request must be revalidated, and if so update
|
206 |
+
* the request with the correct ETag headers.
|
207 |
+
* @param Google_Http_Request $cached A previously cached response.
|
208 |
+
* @param Google_Http_Request $request The outbound request.
|
209 |
+
* return bool If the cached object needs to be revalidated, false if it is
|
210 |
+
* still current and can be re-used.
|
211 |
+
*/
|
212 |
+
protected function checkMustRevalidateCachedRequest($cached, $request)
|
213 |
+
{
|
214 |
+
if (Google_Http_CacheParser::mustRevalidate($cached)) {
|
215 |
+
$addHeaders = array();
|
216 |
+
if ($cached->getResponseHeader('etag')) {
|
217 |
+
// [13.3.4] If an entity tag has been provided by the origin server,
|
218 |
+
// we must use that entity tag in any cache-conditional request.
|
219 |
+
$addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
|
220 |
+
} elseif ($cached->getResponseHeader('date')) {
|
221 |
+
$addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
|
222 |
+
}
|
223 |
+
|
224 |
+
$request->setRequestHeaders($addHeaders);
|
225 |
+
return true;
|
226 |
+
} else {
|
227 |
+
return false;
|
228 |
+
}
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Update a cached request, using the headers from the last response.
|
233 |
+
* @param Google_Http_Request $cached A previously cached response.
|
234 |
+
* @param mixed Associative array of response headers from the last request.
|
235 |
+
*/
|
236 |
+
protected function updateCachedRequest($cached, $responseHeaders)
|
237 |
+
{
|
238 |
+
$hopByHop = self::$HOP_BY_HOP;
|
239 |
+
if (!empty($responseHeaders['connection'])) {
|
240 |
+
$connectionHeaders = array_map(
|
241 |
+
'strtolower',
|
242 |
+
array_filter(
|
243 |
+
array_map('trim', explode(',', $responseHeaders['connection']))
|
244 |
+
)
|
245 |
+
);
|
246 |
+
$hopByHop += array_fill_keys($connectionHeaders, true);
|
247 |
+
}
|
248 |
+
|
249 |
+
$endToEnd = array_diff_key($responseHeaders, $hopByHop);
|
250 |
+
$cached->setResponseHeaders($endToEnd);
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Used by the IO lib and also the batch processing.
|
255 |
+
*
|
256 |
+
* @param $respData
|
257 |
+
* @param $headerSize
|
258 |
+
* @return array
|
259 |
+
*/
|
260 |
+
public function parseHttpResponse($respData, $headerSize)
|
261 |
+
{
|
262 |
+
// check proxy header
|
263 |
+
foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) {
|
264 |
+
if (stripos($respData, $established_header) !== false) {
|
265 |
+
// existed, remove it
|
266 |
+
$respData = str_ireplace($established_header, '', $respData);
|
267 |
+
// Subtract the proxy header size unless the cURL bug prior to 7.30.0
|
268 |
+
// is present which prevented the proxy header size from being taken into
|
269 |
+
// account.
|
270 |
+
if (!$this->needsQuirk()) {
|
271 |
+
$headerSize -= strlen($established_header);
|
272 |
+
}
|
273 |
+
break;
|
274 |
+
}
|
275 |
+
}
|
276 |
+
|
277 |
+
if ($headerSize) {
|
278 |
+
$responseBody = substr($respData, $headerSize);
|
279 |
+
$responseHeaders = substr($respData, 0, $headerSize);
|
280 |
+
} else {
|
281 |
+
$responseSegments = explode("\r\n\r\n", $respData, 2);
|
282 |
+
$responseHeaders = $responseSegments[0];
|
283 |
+
$responseBody = isset($responseSegments[1]) ? $responseSegments[1] :
|
284 |
+
null;
|
285 |
+
}
|
286 |
+
|
287 |
+
$responseHeaders = $this->getHttpResponseHeaders($responseHeaders);
|
288 |
+
return array($responseHeaders, $responseBody);
|
289 |
+
}
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Parse out headers from raw headers
|
293 |
+
* @param rawHeaders array or string
|
294 |
+
* @return array
|
295 |
+
*/
|
296 |
+
public function getHttpResponseHeaders($rawHeaders)
|
297 |
+
{
|
298 |
+
if (is_array($rawHeaders)) {
|
299 |
+
return $this->parseArrayHeaders($rawHeaders);
|
300 |
+
} else {
|
301 |
+
return $this->parseStringHeaders($rawHeaders);
|
302 |
+
}
|
303 |
+
}
|
304 |
+
|
305 |
+
private function parseStringHeaders($rawHeaders)
|
306 |
+
{
|
307 |
+
$headers = array();
|
308 |
+
$responseHeaderLines = explode("\r\n", $rawHeaders);
|
309 |
+
foreach ($responseHeaderLines as $headerLine) {
|
310 |
+
if ($headerLine && strpos($headerLine, ':') !== false) {
|
311 |
+
list($header, $value) = explode(': ', $headerLine, 2);
|
312 |
+
$header = strtolower($header);
|
313 |
+
if (isset($headers[$header])) {
|
314 |
+
$headers[$header] .= "\n" . $value;
|
315 |
+
} else {
|
316 |
+
$headers[$header] = $value;
|
317 |
+
}
|
318 |
+
}
|
319 |
+
}
|
320 |
+
return $headers;
|
321 |
+
}
|
322 |
+
|
323 |
+
private function parseArrayHeaders($rawHeaders)
|
324 |
+
{
|
325 |
+
$header_count = count($rawHeaders);
|
326 |
+
$headers = array();
|
327 |
+
|
328 |
+
for ($i = 0; $i < $header_count; $i++) {
|
329 |
+
$header = $rawHeaders[$i];
|
330 |
+
// Times will have colons in - so we just want the first match.
|
331 |
+
$header_parts = explode(': ', $header, 2);
|
332 |
+
if (count($header_parts) == 2) {
|
333 |
+
$headers[strtolower($header_parts[0])] = $header_parts[1];
|
334 |
+
}
|
335 |
+
}
|
336 |
+
|
337 |
+
return $headers;
|
338 |
+
}
|
339 |
+
}
|
app/api/Google/IO/Curl.php
CHANGED
@@ -1,194 +1,194 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Curl based implementation of Google_IO.
|
20 |
-
*
|
21 |
-
* @author Stuart Langley <slangley@google.com>
|
22 |
-
*/
|
23 |
-
|
24 |
-
if (!class_exists('Google_Client')) {
|
25 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
26 |
-
}
|
27 |
-
|
28 |
-
class Google_IO_Curl extends Google_IO_Abstract
|
29 |
-
{
|
30 |
-
// cURL hex representation of version 7.30.0
|
31 |
-
const NO_QUIRK_VERSION = 0x071E00;
|
32 |
-
|
33 |
-
private $options = array();
|
34 |
-
|
35 |
-
/** @var bool $disableProxyWorkaround */
|
36 |
-
private $disableProxyWorkaround;
|
37 |
-
|
38 |
-
public function __construct(Google_Client $client)
|
39 |
-
{
|
40 |
-
if (!extension_loaded('curl')) {
|
41 |
-
$error = 'The cURL IO handler requires the cURL extension to be enabled';
|
42 |
-
$client->getLogger()->critical($error);
|
43 |
-
throw new Google_IO_Exception($error);
|
44 |
-
}
|
45 |
-
|
46 |
-
parent::__construct($client);
|
47 |
-
|
48 |
-
$this->disableProxyWorkaround = $this->client->getClassConfig(
|
49 |
-
'Google_IO_Curl',
|
50 |
-
'disable_proxy_workaround'
|
51 |
-
);
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Execute an HTTP Request
|
56 |
-
*
|
57 |
-
* @param Google_Http_Request $request the http request to be executed
|
58 |
-
* @return array containing response headers, body, and http code
|
59 |
-
* @throws Google_IO_Exception on curl or IO error
|
60 |
-
*/
|
61 |
-
public function executeRequest(Google_Http_Request $request)
|
62 |
-
{
|
63 |
-
$curl = curl_init();
|
64 |
-
|
65 |
-
if ($request->getPostBody()) {
|
66 |
-
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
|
67 |
-
}
|
68 |
-
|
69 |
-
$requestHeaders = $request->getRequestHeaders();
|
70 |
-
if ($requestHeaders && is_array($requestHeaders)) {
|
71 |
-
$curlHeaders = array();
|
72 |
-
foreach ($requestHeaders as $k => $v) {
|
73 |
-
$curlHeaders[] = "$k: $v";
|
74 |
-
}
|
75 |
-
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
|
76 |
-
}
|
77 |
-
curl_setopt($curl, CURLOPT_URL, $request->getUrl());
|
78 |
-
|
79 |
-
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
|
80 |
-
curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
|
81 |
-
|
82 |
-
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
|
83 |
-
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
84 |
-
|
85 |
-
// The SSL version will be determined by the underlying library
|
86 |
-
// @see https://github.com/google/google-api-php-client/pull/644
|
87 |
-
//curl_setopt($curl, CURLOPT_SSLVERSION, 1);
|
88 |
-
|
89 |
-
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
90 |
-
curl_setopt($curl, CURLOPT_HEADER, true);
|
91 |
-
|
92 |
-
if ($request->canGzip()) {
|
93 |
-
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
|
94 |
-
}
|
95 |
-
|
96 |
-
$options = $this->client->getClassConfig('Google_IO_Curl', 'options');
|
97 |
-
if (is_array($options)) {
|
98 |
-
$this->setOptions($options);
|
99 |
-
}
|
100 |
-
|
101 |
-
foreach ($this->options as $key => $var) {
|
102 |
-
curl_setopt($curl, $key, $var);
|
103 |
-
}
|
104 |
-
|
105 |
-
if (!isset($this->options[CURLOPT_CAINFO])) {
|
106 |
-
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
|
107 |
-
}
|
108 |
-
|
109 |
-
$this->client->getLogger()->debug(
|
110 |
-
'cURL request',
|
111 |
-
array(
|
112 |
-
'url' => $request->getUrl(),
|
113 |
-
'method' => $request->getRequestMethod(),
|
114 |
-
'headers' => $requestHeaders,
|
115 |
-
'body' => $request->getPostBody()
|
116 |
-
)
|
117 |
-
);
|
118 |
-
|
119 |
-
$response = curl_exec($curl);
|
120 |
-
if ($response === false) {
|
121 |
-
$error = curl_error($curl);
|
122 |
-
$code = curl_errno($curl);
|
123 |
-
$map = $this->client->getClassConfig('Google_IO_Exception', 'retry_map');
|
124 |
-
|
125 |
-
$this->client->getLogger()->error('cURL ' . $error);
|
126 |
-
throw new Google_IO_Exception($error, $code, null, $map);
|
127 |
-
}
|
128 |
-
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
|
129 |
-
|
130 |
-
list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
|
131 |
-
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
132 |
-
|
133 |
-
$this->client->getLogger()->debug(
|
134 |
-
'cURL response',
|
135 |
-
array(
|
136 |
-
'code' => $responseCode,
|
137 |
-
'headers' => $responseHeaders,
|
138 |
-
'body' => $responseBody,
|
139 |
-
)
|
140 |
-
);
|
141 |
-
|
142 |
-
return array($responseBody, $responseHeaders, $responseCode);
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Set options that update the transport implementation's behavior.
|
147 |
-
* @param $options
|
148 |
-
*/
|
149 |
-
public function setOptions($options)
|
150 |
-
{
|
151 |
-
$this->options = $options + $this->options;
|
152 |
-
}
|
153 |
-
|
154 |
-
/**
|
155 |
-
* Set the maximum request time in seconds.
|
156 |
-
* @param $timeout in seconds
|
157 |
-
*/
|
158 |
-
public function setTimeout($timeout)
|
159 |
-
{
|
160 |
-
// Since this timeout is really for putting a bound on the time
|
161 |
-
// we'll set them both to the same. If you need to specify a longer
|
162 |
-
// CURLOPT_TIMEOUT, or a higher CONNECTTIMEOUT, the best thing to
|
163 |
-
// do is use the setOptions method for the values individually.
|
164 |
-
$this->options[CURLOPT_CONNECTTIMEOUT] = $timeout;
|
165 |
-
$this->options[CURLOPT_TIMEOUT] = $timeout;
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* Get the maximum request time in seconds.
|
170 |
-
* @return timeout in seconds
|
171 |
-
*/
|
172 |
-
public function getTimeout()
|
173 |
-
{
|
174 |
-
return $this->options[CURLOPT_TIMEOUT];
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* Test for the presence of a cURL header processing bug
|
179 |
-
*
|
180 |
-
* {@inheritDoc}
|
181 |
-
*
|
182 |
-
* @return boolean
|
183 |
-
*/
|
184 |
-
protected function needsQuirk()
|
185 |
-
{
|
186 |
-
if ($this->disableProxyWorkaround) {
|
187 |
-
return false;
|
188 |
-
}
|
189 |
-
|
190 |
-
$ver = curl_version();
|
191 |
-
$versionNum = $ver['version_number'];
|
192 |
-
return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION;
|
193 |
-
}
|
194 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Curl based implementation of Google_IO.
|
20 |
+
*
|
21 |
+
* @author Stuart Langley <slangley@google.com>
|
22 |
+
*/
|
23 |
+
|
24 |
+
if (!class_exists('Google_Client')) {
|
25 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
26 |
+
}
|
27 |
+
|
28 |
+
class Google_IO_Curl extends Google_IO_Abstract
|
29 |
+
{
|
30 |
+
// cURL hex representation of version 7.30.0
|
31 |
+
const NO_QUIRK_VERSION = 0x071E00;
|
32 |
+
|
33 |
+
private $options = array();
|
34 |
+
|
35 |
+
/** @var bool $disableProxyWorkaround */
|
36 |
+
private $disableProxyWorkaround;
|
37 |
+
|
38 |
+
public function __construct(Google_Client $client)
|
39 |
+
{
|
40 |
+
if (!extension_loaded('curl')) {
|
41 |
+
$error = 'The cURL IO handler requires the cURL extension to be enabled';
|
42 |
+
$client->getLogger()->critical($error);
|
43 |
+
throw new Google_IO_Exception($error);
|
44 |
+
}
|
45 |
+
|
46 |
+
parent::__construct($client);
|
47 |
+
|
48 |
+
$this->disableProxyWorkaround = $this->client->getClassConfig(
|
49 |
+
'Google_IO_Curl',
|
50 |
+
'disable_proxy_workaround'
|
51 |
+
);
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Execute an HTTP Request
|
56 |
+
*
|
57 |
+
* @param Google_Http_Request $request the http request to be executed
|
58 |
+
* @return array containing response headers, body, and http code
|
59 |
+
* @throws Google_IO_Exception on curl or IO error
|
60 |
+
*/
|
61 |
+
public function executeRequest(Google_Http_Request $request)
|
62 |
+
{
|
63 |
+
$curl = curl_init();
|
64 |
+
|
65 |
+
if ($request->getPostBody()) {
|
66 |
+
curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
|
67 |
+
}
|
68 |
+
|
69 |
+
$requestHeaders = $request->getRequestHeaders();
|
70 |
+
if ($requestHeaders && is_array($requestHeaders)) {
|
71 |
+
$curlHeaders = array();
|
72 |
+
foreach ($requestHeaders as $k => $v) {
|
73 |
+
$curlHeaders[] = "$k: $v";
|
74 |
+
}
|
75 |
+
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
|
76 |
+
}
|
77 |
+
curl_setopt($curl, CURLOPT_URL, $request->getUrl());
|
78 |
+
|
79 |
+
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
|
80 |
+
curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
|
81 |
+
|
82 |
+
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
|
83 |
+
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
|
84 |
+
|
85 |
+
// The SSL version will be determined by the underlying library
|
86 |
+
// @see https://github.com/google/google-api-php-client/pull/644
|
87 |
+
//curl_setopt($curl, CURLOPT_SSLVERSION, 1);
|
88 |
+
|
89 |
+
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
90 |
+
curl_setopt($curl, CURLOPT_HEADER, true);
|
91 |
+
|
92 |
+
if ($request->canGzip()) {
|
93 |
+
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
|
94 |
+
}
|
95 |
+
|
96 |
+
$options = $this->client->getClassConfig('Google_IO_Curl', 'options');
|
97 |
+
if (is_array($options)) {
|
98 |
+
$this->setOptions($options);
|
99 |
+
}
|
100 |
+
|
101 |
+
foreach ($this->options as $key => $var) {
|
102 |
+
curl_setopt($curl, $key, $var);
|
103 |
+
}
|
104 |
+
|
105 |
+
if (!isset($this->options[CURLOPT_CAINFO])) {
|
106 |
+
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
|
107 |
+
}
|
108 |
+
|
109 |
+
$this->client->getLogger()->debug(
|
110 |
+
'cURL request',
|
111 |
+
array(
|
112 |
+
'url' => $request->getUrl(),
|
113 |
+
'method' => $request->getRequestMethod(),
|
114 |
+
'headers' => $requestHeaders,
|
115 |
+
'body' => $request->getPostBody()
|
116 |
+
)
|
117 |
+
);
|
118 |
+
|
119 |
+
$response = curl_exec($curl);
|
120 |
+
if ($response === false) {
|
121 |
+
$error = curl_error($curl);
|
122 |
+
$code = curl_errno($curl);
|
123 |
+
$map = $this->client->getClassConfig('Google_IO_Exception', 'retry_map');
|
124 |
+
|
125 |
+
$this->client->getLogger()->error('cURL ' . $error);
|
126 |
+
throw new Google_IO_Exception($error, $code, null, $map);
|
127 |
+
}
|
128 |
+
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
|
129 |
+
|
130 |
+
list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
|
131 |
+
$responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
132 |
+
|
133 |
+
$this->client->getLogger()->debug(
|
134 |
+
'cURL response',
|
135 |
+
array(
|
136 |
+
'code' => $responseCode,
|
137 |
+
'headers' => $responseHeaders,
|
138 |
+
'body' => $responseBody,
|
139 |
+
)
|
140 |
+
);
|
141 |
+
|
142 |
+
return array($responseBody, $responseHeaders, $responseCode);
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Set options that update the transport implementation's behavior.
|
147 |
+
* @param $options
|
148 |
+
*/
|
149 |
+
public function setOptions($options)
|
150 |
+
{
|
151 |
+
$this->options = $options + $this->options;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Set the maximum request time in seconds.
|
156 |
+
* @param $timeout in seconds
|
157 |
+
*/
|
158 |
+
public function setTimeout($timeout)
|
159 |
+
{
|
160 |
+
// Since this timeout is really for putting a bound on the time
|
161 |
+
// we'll set them both to the same. If you need to specify a longer
|
162 |
+
// CURLOPT_TIMEOUT, or a higher CONNECTTIMEOUT, the best thing to
|
163 |
+
// do is use the setOptions method for the values individually.
|
164 |
+
$this->options[CURLOPT_CONNECTTIMEOUT] = $timeout;
|
165 |
+
$this->options[CURLOPT_TIMEOUT] = $timeout;
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* Get the maximum request time in seconds.
|
170 |
+
* @return timeout in seconds
|
171 |
+
*/
|
172 |
+
public function getTimeout()
|
173 |
+
{
|
174 |
+
return $this->options[CURLOPT_TIMEOUT];
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Test for the presence of a cURL header processing bug
|
179 |
+
*
|
180 |
+
* {@inheritDoc}
|
181 |
+
*
|
182 |
+
* @return boolean
|
183 |
+
*/
|
184 |
+
protected function needsQuirk()
|
185 |
+
{
|
186 |
+
if ($this->disableProxyWorkaround) {
|
187 |
+
return false;
|
188 |
+
}
|
189 |
+
|
190 |
+
$ver = curl_version();
|
191 |
+
$versionNum = $ver['version_number'];
|
192 |
+
return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION;
|
193 |
+
}
|
194 |
+
}
|
app/api/Google/IO/Exception.php
CHANGED
@@ -1,69 +1,69 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_IO_Exception extends Google_Exception implements Google_Task_Retryable
|
23 |
-
{
|
24 |
-
/**
|
25 |
-
* @var array $retryMap Map of errors with retry counts.
|
26 |
-
*/
|
27 |
-
private $retryMap = array();
|
28 |
-
|
29 |
-
/**
|
30 |
-
* Creates a new IO exception with an optional retry map.
|
31 |
-
*
|
32 |
-
* @param string $message
|
33 |
-
* @param int $code
|
34 |
-
* @param Exception|null $previous
|
35 |
-
* @param array|null $retryMap Map of errors with retry counts.
|
36 |
-
*/
|
37 |
-
public function __construct(
|
38 |
-
$message,
|
39 |
-
$code = 0,
|
40 |
-
Exception $previous = null,
|
41 |
-
array $retryMap = null
|
42 |
-
) {
|
43 |
-
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
|
44 |
-
parent::__construct($message, $code, $previous);
|
45 |
-
} else {
|
46 |
-
parent::__construct($message, $code);
|
47 |
-
}
|
48 |
-
|
49 |
-
if (is_array($retryMap)) {
|
50 |
-
$this->retryMap = $retryMap;
|
51 |
-
}
|
52 |
-
}
|
53 |
-
|
54 |
-
/**
|
55 |
-
* Gets the number of times the associated task can be retried.
|
56 |
-
*
|
57 |
-
* NOTE: -1 is returned if the task can be retried indefinitely
|
58 |
-
*
|
59 |
-
* @return integer
|
60 |
-
*/
|
61 |
-
public function allowedRetries()
|
62 |
-
{
|
63 |
-
if (isset($this->retryMap[$this->code])) {
|
64 |
-
return $this->retryMap[$this->code];
|
65 |
-
}
|
66 |
-
|
67 |
-
return 0;
|
68 |
-
}
|
69 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_IO_Exception extends Google_Exception implements Google_Task_Retryable
|
23 |
+
{
|
24 |
+
/**
|
25 |
+
* @var array $retryMap Map of errors with retry counts.
|
26 |
+
*/
|
27 |
+
private $retryMap = array();
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Creates a new IO exception with an optional retry map.
|
31 |
+
*
|
32 |
+
* @param string $message
|
33 |
+
* @param int $code
|
34 |
+
* @param Exception|null $previous
|
35 |
+
* @param array|null $retryMap Map of errors with retry counts.
|
36 |
+
*/
|
37 |
+
public function __construct(
|
38 |
+
$message,
|
39 |
+
$code = 0,
|
40 |
+
Exception $previous = null,
|
41 |
+
array $retryMap = null
|
42 |
+
) {
|
43 |
+
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
|
44 |
+
parent::__construct($message, $code, $previous);
|
45 |
+
} else {
|
46 |
+
parent::__construct($message, $code);
|
47 |
+
}
|
48 |
+
|
49 |
+
if (is_array($retryMap)) {
|
50 |
+
$this->retryMap = $retryMap;
|
51 |
+
}
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Gets the number of times the associated task can be retried.
|
56 |
+
*
|
57 |
+
* NOTE: -1 is returned if the task can be retried indefinitely
|
58 |
+
*
|
59 |
+
* @return integer
|
60 |
+
*/
|
61 |
+
public function allowedRetries()
|
62 |
+
{
|
63 |
+
if (isset($this->retryMap[$this->code])) {
|
64 |
+
return $this->retryMap[$this->code];
|
65 |
+
}
|
66 |
+
|
67 |
+
return 0;
|
68 |
+
}
|
69 |
+
}
|
app/api/Google/IO/Stream.php
CHANGED
@@ -1,243 +1,243 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Http Streams based implementation of Google_IO.
|
20 |
-
*
|
21 |
-
* @author Stuart Langley <slangley@google.com>
|
22 |
-
*/
|
23 |
-
|
24 |
-
if (!class_exists('Google_Client')) {
|
25 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
26 |
-
}
|
27 |
-
|
28 |
-
class Google_IO_Stream extends Google_IO_Abstract
|
29 |
-
{
|
30 |
-
const TIMEOUT = "timeout";
|
31 |
-
const ZLIB = "compress.zlib://";
|
32 |
-
private $options = array();
|
33 |
-
private $trappedErrorNumber;
|
34 |
-
private $trappedErrorString;
|
35 |
-
|
36 |
-
private static $DEFAULT_HTTP_CONTEXT = array(
|
37 |
-
"follow_location" => 0,
|
38 |
-
"ignore_errors" => 1,
|
39 |
-
);
|
40 |
-
|
41 |
-
private static $DEFAULT_SSL_CONTEXT = array(
|
42 |
-
"verify_peer" => true,
|
43 |
-
);
|
44 |
-
|
45 |
-
public function __construct(Google_Client $client)
|
46 |
-
{
|
47 |
-
if (!ini_get('allow_url_fopen')) {
|
48 |
-
$error = 'The stream IO handler requires the allow_url_fopen runtime ' .
|
49 |
-
'configuration to be enabled';
|
50 |
-
$client->getLogger()->critical($error);
|
51 |
-
throw new Google_IO_Exception($error);
|
52 |
-
}
|
53 |
-
|
54 |
-
parent::__construct($client);
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Execute an HTTP Request
|
59 |
-
*
|
60 |
-
* @param Google_Http_Request $request the http request to be executed
|
61 |
-
* @return array containing response headers, body, and http code
|
62 |
-
* @throws Google_IO_Exception on curl or IO error
|
63 |
-
*/
|
64 |
-
public function executeRequest(Google_Http_Request $request)
|
65 |
-
{
|
66 |
-
$default_options = stream_context_get_options(stream_context_get_default());
|
67 |
-
|
68 |
-
$requestHttpContext = array_key_exists('http', $default_options) ?
|
69 |
-
$default_options['http'] : array();
|
70 |
-
|
71 |
-
if ($request->getPostBody()) {
|
72 |
-
$requestHttpContext["content"] = $request->getPostBody();
|
73 |
-
}
|
74 |
-
|
75 |
-
$requestHeaders = $request->getRequestHeaders();
|
76 |
-
if ($requestHeaders && is_array($requestHeaders)) {
|
77 |
-
$headers = "";
|
78 |
-
foreach ($requestHeaders as $k => $v) {
|
79 |
-
$headers .= "$k: $v\r\n";
|
80 |
-
}
|
81 |
-
$requestHttpContext["header"] = $headers;
|
82 |
-
}
|
83 |
-
|
84 |
-
$requestHttpContext["method"] = $request->getRequestMethod();
|
85 |
-
$requestHttpContext["user_agent"] = $request->getUserAgent();
|
86 |
-
|
87 |
-
$requestSslContext = array_key_exists('ssl', $default_options) ?
|
88 |
-
$default_options['ssl'] : array();
|
89 |
-
|
90 |
-
if (!$this->client->isAppEngine() && !array_key_exists("cafile", $requestSslContext)) {
|
91 |
-
$requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
|
92 |
-
}
|
93 |
-
|
94 |
-
$options = array(
|
95 |
-
"http" => array_merge(
|
96 |
-
self::$DEFAULT_HTTP_CONTEXT,
|
97 |
-
$requestHttpContext
|
98 |
-
),
|
99 |
-
"ssl" => array_merge(
|
100 |
-
self::$DEFAULT_SSL_CONTEXT,
|
101 |
-
$requestSslContext
|
102 |
-
)
|
103 |
-
);
|
104 |
-
|
105 |
-
$context = stream_context_create($options);
|
106 |
-
|
107 |
-
$url = $request->getUrl();
|
108 |
-
|
109 |
-
if ($request->canGzip()) {
|
110 |
-
$url = self::ZLIB . $url;
|
111 |
-
}
|
112 |
-
|
113 |
-
$this->client->getLogger()->debug(
|
114 |
-
'Stream request',
|
115 |
-
array(
|
116 |
-
'url' => $url,
|
117 |
-
'method' => $request->getRequestMethod(),
|
118 |
-
'headers' => $requestHeaders,
|
119 |
-
'body' => $request->getPostBody()
|
120 |
-
)
|
121 |
-
);
|
122 |
-
|
123 |
-
// We are trapping any thrown errors in this method only and
|
124 |
-
// throwing an exception.
|
125 |
-
$this->trappedErrorNumber = null;
|
126 |
-
$this->trappedErrorString = null;
|
127 |
-
|
128 |
-
// START - error trap.
|
129 |
-
set_error_handler(array($this, 'trapError'));
|
130 |
-
$fh = fopen($url, 'r', false, $context);
|
131 |
-
restore_error_handler();
|
132 |
-
// END - error trap.
|
133 |
-
|
134 |
-
if ($this->trappedErrorNumber) {
|
135 |
-
$error = sprintf(
|
136 |
-
"HTTP Error: Unable to connect: '%s'",
|
137 |
-
$this->trappedErrorString
|
138 |
-
);
|
139 |
-
|
140 |
-
$this->client->getLogger()->error('Stream ' . $error);
|
141 |
-
throw new Google_IO_Exception($error, $this->trappedErrorNumber);
|
142 |
-
}
|
143 |
-
|
144 |
-
$response_data = false;
|
145 |
-
$respHttpCode = self::UNKNOWN_CODE;
|
146 |
-
if ($fh) {
|
147 |
-
if (isset($this->options[self::TIMEOUT])) {
|
148 |
-
stream_set_timeout($fh, $this->options[self::TIMEOUT]);
|
149 |
-
}
|
150 |
-
|
151 |
-
$response_data = stream_get_contents($fh);
|
152 |
-
fclose($fh);
|
153 |
-
|
154 |
-
$respHttpCode = $this->getHttpResponseCode($http_response_header);
|
155 |
-
}
|
156 |
-
|
157 |
-
if (false === $response_data) {
|
158 |
-
$error = sprintf(
|
159 |
-
"HTTP Error: Unable to connect: '%s'",
|
160 |
-
$respHttpCode
|
161 |
-
);
|
162 |
-
|
163 |
-
$this->client->getLogger()->error('Stream ' . $error);
|
164 |
-
throw new Google_IO_Exception($error, $respHttpCode);
|
165 |
-
}
|
166 |
-
|
167 |
-
$responseHeaders = $this->getHttpResponseHeaders($http_response_header);
|
168 |
-
|
169 |
-
$this->client->getLogger()->debug(
|
170 |
-
'Stream response',
|
171 |
-
array(
|
172 |
-
'code' => $respHttpCode,
|
173 |
-
'headers' => $responseHeaders,
|
174 |
-
'body' => $response_data,
|
175 |
-
)
|
176 |
-
);
|
177 |
-
|
178 |
-
return array($response_data, $responseHeaders, $respHttpCode);
|
179 |
-
}
|
180 |
-
|
181 |
-
/**
|
182 |
-
* Set options that update the transport implementation's behavior.
|
183 |
-
* @param $options
|
184 |
-
*/
|
185 |
-
public function setOptions($options)
|
186 |
-
{
|
187 |
-
$this->options = $options + $this->options;
|
188 |
-
}
|
189 |
-
|
190 |
-
/**
|
191 |
-
* Method to handle errors, used for error handling around
|
192 |
-
* stream connection methods.
|
193 |
-
*/
|
194 |
-
public function trapError($errno, $errstr)
|
195 |
-
{
|
196 |
-
$this->trappedErrorNumber = $errno;
|
197 |
-
$this->trappedErrorString = $errstr;
|
198 |
-
}
|
199 |
-
|
200 |
-
/**
|
201 |
-
* Set the maximum request time in seconds.
|
202 |
-
* @param $timeout in seconds
|
203 |
-
*/
|
204 |
-
public function setTimeout($timeout)
|
205 |
-
{
|
206 |
-
$this->options[self::TIMEOUT] = $timeout;
|
207 |
-
}
|
208 |
-
|
209 |
-
/**
|
210 |
-
* Get the maximum request time in seconds.
|
211 |
-
* @return timeout in seconds
|
212 |
-
*/
|
213 |
-
public function getTimeout()
|
214 |
-
{
|
215 |
-
return $this->options[self::TIMEOUT];
|
216 |
-
}
|
217 |
-
|
218 |
-
/**
|
219 |
-
* Test for the presence of a cURL header processing bug
|
220 |
-
*
|
221 |
-
* {@inheritDoc}
|
222 |
-
*
|
223 |
-
* @return boolean
|
224 |
-
*/
|
225 |
-
protected function needsQuirk()
|
226 |
-
{
|
227 |
-
return false;
|
228 |
-
}
|
229 |
-
|
230 |
-
protected function getHttpResponseCode($response_headers)
|
231 |
-
{
|
232 |
-
$header_count = count($response_headers);
|
233 |
-
|
234 |
-
for ($i = 0; $i < $header_count; $i++) {
|
235 |
-
$header = $response_headers[$i];
|
236 |
-
if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) {
|
237 |
-
$response = explode(' ', $header);
|
238 |
-
return $response[1];
|
239 |
-
}
|
240 |
-
}
|
241 |
-
return self::UNKNOWN_CODE;
|
242 |
-
}
|
243 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Http Streams based implementation of Google_IO.
|
20 |
+
*
|
21 |
+
* @author Stuart Langley <slangley@google.com>
|
22 |
+
*/
|
23 |
+
|
24 |
+
if (!class_exists('Google_Client')) {
|
25 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
26 |
+
}
|
27 |
+
|
28 |
+
class Google_IO_Stream extends Google_IO_Abstract
|
29 |
+
{
|
30 |
+
const TIMEOUT = "timeout";
|
31 |
+
const ZLIB = "compress.zlib://";
|
32 |
+
private $options = array();
|
33 |
+
private $trappedErrorNumber;
|
34 |
+
private $trappedErrorString;
|
35 |
+
|
36 |
+
private static $DEFAULT_HTTP_CONTEXT = array(
|
37 |
+
"follow_location" => 0,
|
38 |
+
"ignore_errors" => 1,
|
39 |
+
);
|
40 |
+
|
41 |
+
private static $DEFAULT_SSL_CONTEXT = array(
|
42 |
+
"verify_peer" => true,
|
43 |
+
);
|
44 |
+
|
45 |
+
public function __construct(Google_Client $client)
|
46 |
+
{
|
47 |
+
if (!ini_get('allow_url_fopen')) {
|
48 |
+
$error = 'The stream IO handler requires the allow_url_fopen runtime ' .
|
49 |
+
'configuration to be enabled';
|
50 |
+
$client->getLogger()->critical($error);
|
51 |
+
throw new Google_IO_Exception($error);
|
52 |
+
}
|
53 |
+
|
54 |
+
parent::__construct($client);
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Execute an HTTP Request
|
59 |
+
*
|
60 |
+
* @param Google_Http_Request $request the http request to be executed
|
61 |
+
* @return array containing response headers, body, and http code
|
62 |
+
* @throws Google_IO_Exception on curl or IO error
|
63 |
+
*/
|
64 |
+
public function executeRequest(Google_Http_Request $request)
|
65 |
+
{
|
66 |
+
$default_options = stream_context_get_options(stream_context_get_default());
|
67 |
+
|
68 |
+
$requestHttpContext = array_key_exists('http', $default_options) ?
|
69 |
+
$default_options['http'] : array();
|
70 |
+
|
71 |
+
if ($request->getPostBody()) {
|
72 |
+
$requestHttpContext["content"] = $request->getPostBody();
|
73 |
+
}
|
74 |
+
|
75 |
+
$requestHeaders = $request->getRequestHeaders();
|
76 |
+
if ($requestHeaders && is_array($requestHeaders)) {
|
77 |
+
$headers = "";
|
78 |
+
foreach ($requestHeaders as $k => $v) {
|
79 |
+
$headers .= "$k: $v\r\n";
|
80 |
+
}
|
81 |
+
$requestHttpContext["header"] = $headers;
|
82 |
+
}
|
83 |
+
|
84 |
+
$requestHttpContext["method"] = $request->getRequestMethod();
|
85 |
+
$requestHttpContext["user_agent"] = $request->getUserAgent();
|
86 |
+
|
87 |
+
$requestSslContext = array_key_exists('ssl', $default_options) ?
|
88 |
+
$default_options['ssl'] : array();
|
89 |
+
|
90 |
+
if (!$this->client->isAppEngine() && !array_key_exists("cafile", $requestSslContext)) {
|
91 |
+
$requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
|
92 |
+
}
|
93 |
+
|
94 |
+
$options = array(
|
95 |
+
"http" => array_merge(
|
96 |
+
self::$DEFAULT_HTTP_CONTEXT,
|
97 |
+
$requestHttpContext
|
98 |
+
),
|
99 |
+
"ssl" => array_merge(
|
100 |
+
self::$DEFAULT_SSL_CONTEXT,
|
101 |
+
$requestSslContext
|
102 |
+
)
|
103 |
+
);
|
104 |
+
|
105 |
+
$context = stream_context_create($options);
|
106 |
+
|
107 |
+
$url = $request->getUrl();
|
108 |
+
|
109 |
+
if ($request->canGzip()) {
|
110 |
+
$url = self::ZLIB . $url;
|
111 |
+
}
|
112 |
+
|
113 |
+
$this->client->getLogger()->debug(
|
114 |
+
'Stream request',
|
115 |
+
array(
|
116 |
+
'url' => $url,
|
117 |
+
'method' => $request->getRequestMethod(),
|
118 |
+
'headers' => $requestHeaders,
|
119 |
+
'body' => $request->getPostBody()
|
120 |
+
)
|
121 |
+
);
|
122 |
+
|
123 |
+
// We are trapping any thrown errors in this method only and
|
124 |
+
// throwing an exception.
|
125 |
+
$this->trappedErrorNumber = null;
|
126 |
+
$this->trappedErrorString = null;
|
127 |
+
|
128 |
+
// START - error trap.
|
129 |
+
set_error_handler(array($this, 'trapError'));
|
130 |
+
$fh = fopen($url, 'r', false, $context);
|
131 |
+
restore_error_handler();
|
132 |
+
// END - error trap.
|
133 |
+
|
134 |
+
if ($this->trappedErrorNumber) {
|
135 |
+
$error = sprintf(
|
136 |
+
"HTTP Error: Unable to connect: '%s'",
|
137 |
+
$this->trappedErrorString
|
138 |
+
);
|
139 |
+
|
140 |
+
$this->client->getLogger()->error('Stream ' . $error);
|
141 |
+
throw new Google_IO_Exception($error, $this->trappedErrorNumber);
|
142 |
+
}
|
143 |
+
|
144 |
+
$response_data = false;
|
145 |
+
$respHttpCode = self::UNKNOWN_CODE;
|
146 |
+
if ($fh) {
|
147 |
+
if (isset($this->options[self::TIMEOUT])) {
|
148 |
+
stream_set_timeout($fh, $this->options[self::TIMEOUT]);
|
149 |
+
}
|
150 |
+
|
151 |
+
$response_data = stream_get_contents($fh);
|
152 |
+
fclose($fh);
|
153 |
+
|
154 |
+
$respHttpCode = $this->getHttpResponseCode($http_response_header);
|
155 |
+
}
|
156 |
+
|
157 |
+
if (false === $response_data) {
|
158 |
+
$error = sprintf(
|
159 |
+
"HTTP Error: Unable to connect: '%s'",
|
160 |
+
$respHttpCode
|
161 |
+
);
|
162 |
+
|
163 |
+
$this->client->getLogger()->error('Stream ' . $error);
|
164 |
+
throw new Google_IO_Exception($error, $respHttpCode);
|
165 |
+
}
|
166 |
+
|
167 |
+
$responseHeaders = $this->getHttpResponseHeaders($http_response_header);
|
168 |
+
|
169 |
+
$this->client->getLogger()->debug(
|
170 |
+
'Stream response',
|
171 |
+
array(
|
172 |
+
'code' => $respHttpCode,
|
173 |
+
'headers' => $responseHeaders,
|
174 |
+
'body' => $response_data,
|
175 |
+
)
|
176 |
+
);
|
177 |
+
|
178 |
+
return array($response_data, $responseHeaders, $respHttpCode);
|
179 |
+
}
|
180 |
+
|
181 |
+
/**
|
182 |
+
* Set options that update the transport implementation's behavior.
|
183 |
+
* @param $options
|
184 |
+
*/
|
185 |
+
public function setOptions($options)
|
186 |
+
{
|
187 |
+
$this->options = $options + $this->options;
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Method to handle errors, used for error handling around
|
192 |
+
* stream connection methods.
|
193 |
+
*/
|
194 |
+
public function trapError($errno, $errstr)
|
195 |
+
{
|
196 |
+
$this->trappedErrorNumber = $errno;
|
197 |
+
$this->trappedErrorString = $errstr;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Set the maximum request time in seconds.
|
202 |
+
* @param $timeout in seconds
|
203 |
+
*/
|
204 |
+
public function setTimeout($timeout)
|
205 |
+
{
|
206 |
+
$this->options[self::TIMEOUT] = $timeout;
|
207 |
+
}
|
208 |
+
|
209 |
+
/**
|
210 |
+
* Get the maximum request time in seconds.
|
211 |
+
* @return timeout in seconds
|
212 |
+
*/
|
213 |
+
public function getTimeout()
|
214 |
+
{
|
215 |
+
return $this->options[self::TIMEOUT];
|
216 |
+
}
|
217 |
+
|
218 |
+
/**
|
219 |
+
* Test for the presence of a cURL header processing bug
|
220 |
+
*
|
221 |
+
* {@inheritDoc}
|
222 |
+
*
|
223 |
+
* @return boolean
|
224 |
+
*/
|
225 |
+
protected function needsQuirk()
|
226 |
+
{
|
227 |
+
return false;
|
228 |
+
}
|
229 |
+
|
230 |
+
protected function getHttpResponseCode($response_headers)
|
231 |
+
{
|
232 |
+
$header_count = count($response_headers);
|
233 |
+
|
234 |
+
for ($i = 0; $i < $header_count; $i++) {
|
235 |
+
$header = $response_headers[$i];
|
236 |
+
if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) {
|
237 |
+
$response = explode(' ', $header);
|
238 |
+
return $response[1];
|
239 |
+
}
|
240 |
+
}
|
241 |
+
return self::UNKNOWN_CODE;
|
242 |
+
}
|
243 |
+
}
|
app/api/Google/IO/cacerts.pem
CHANGED
@@ -1,2183 +1,2183 @@
|
|
1 |
-
# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
|
2 |
-
# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
|
3 |
-
# Label: "GTE CyberTrust Global Root"
|
4 |
-
# Serial: 421
|
5 |
-
# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
|
6 |
-
# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
|
7 |
-
# 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
|
8 |
-
-----BEGIN CERTIFICATE-----
|
9 |
-
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
|
10 |
-
VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
|
11 |
-
bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
|
12 |
-
b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
|
13 |
-
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
|
14 |
-
cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
|
15 |
-
b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
|
16 |
-
iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
|
17 |
-
r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
|
18 |
-
04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
|
19 |
-
GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
|
20 |
-
3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
|
21 |
-
lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
|
22 |
-
-----END CERTIFICATE-----
|
23 |
-
|
24 |
-
# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
|
25 |
-
# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
|
26 |
-
# Label: "Thawte Server CA"
|
27 |
-
# Serial: 1
|
28 |
-
# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
|
29 |
-
# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
|
30 |
-
# 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
|
31 |
-
-----BEGIN CERTIFICATE-----
|
32 |
-
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
|
33 |
-
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
34 |
-
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
35 |
-
biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
|
36 |
-
MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
|
37 |
-
MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
|
38 |
-
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
|
39 |
-
dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
|
40 |
-
cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
|
41 |
-
DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
|
42 |
-
gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
|
43 |
-
yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
|
44 |
-
L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
|
45 |
-
EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
|
46 |
-
7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
|
47 |
-
QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
|
48 |
-
qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
|
49 |
-
-----END CERTIFICATE-----
|
50 |
-
|
51 |
-
# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
|
52 |
-
# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
|
53 |
-
# Label: "Thawte Premium Server CA"
|
54 |
-
# Serial: 1
|
55 |
-
# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
|
56 |
-
# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
|
57 |
-
# 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
|
58 |
-
-----BEGIN CERTIFICATE-----
|
59 |
-
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
|
60 |
-
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
61 |
-
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
62 |
-
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
|
63 |
-
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
|
64 |
-
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
|
65 |
-
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
|
66 |
-
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
|
67 |
-
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
|
68 |
-
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
|
69 |
-
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
|
70 |
-
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
|
71 |
-
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
|
72 |
-
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
|
73 |
-
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
|
74 |
-
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
|
75 |
-
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
|
76 |
-
-----END CERTIFICATE-----
|
77 |
-
|
78 |
-
# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
|
79 |
-
# Subject: O=Equifax OU=Equifax Secure Certificate Authority
|
80 |
-
# Label: "Equifax Secure CA"
|
81 |
-
# Serial: 903804111
|
82 |
-
# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
|
83 |
-
# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
|
84 |
-
# 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
|
85 |
-
-----BEGIN CERTIFICATE-----
|
86 |
-
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
87 |
-
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
88 |
-
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
89 |
-
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
90 |
-
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
91 |
-
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
92 |
-
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
93 |
-
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
94 |
-
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
95 |
-
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
96 |
-
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
97 |
-
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
98 |
-
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
99 |
-
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
100 |
-
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
101 |
-
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
102 |
-
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
103 |
-
-----END CERTIFICATE-----
|
104 |
-
|
105 |
-
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
106 |
-
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
107 |
-
# Label: "Verisign Class 3 Public Primary Certification Authority"
|
108 |
-
# Serial: 149843929435818692848040365716851702463
|
109 |
-
# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
|
110 |
-
# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
|
111 |
-
# 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
|
112 |
-
-----BEGIN CERTIFICATE-----
|
113 |
-
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
|
114 |
-
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
115 |
-
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
116 |
-
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
117 |
-
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
118 |
-
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
119 |
-
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
120 |
-
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
121 |
-
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
122 |
-
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
|
123 |
-
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
|
124 |
-
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
|
125 |
-
-----END CERTIFICATE-----
|
126 |
-
|
127 |
-
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
|
128 |
-
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
|
129 |
-
# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
|
130 |
-
# Serial: 167285380242319648451154478808036881606
|
131 |
-
# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
|
132 |
-
# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
|
133 |
-
# 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
|
134 |
-
-----BEGIN CERTIFICATE-----
|
135 |
-
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
136 |
-
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
137 |
-
c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
138 |
-
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
139 |
-
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
140 |
-
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
141 |
-
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
|
142 |
-
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
143 |
-
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
144 |
-
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
145 |
-
AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
|
146 |
-
pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
|
147 |
-
13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
|
148 |
-
AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
|
149 |
-
U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
|
150 |
-
F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
|
151 |
-
oJ2daZH9
|
152 |
-
-----END CERTIFICATE-----
|
153 |
-
|
154 |
-
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
155 |
-
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
156 |
-
# Label: "GlobalSign Root CA"
|
157 |
-
# Serial: 4835703278459707669005204
|
158 |
-
# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
|
159 |
-
# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
|
160 |
-
# 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
|
161 |
-
-----BEGIN CERTIFICATE-----
|
162 |
-
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
|
163 |
-
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
|
164 |
-
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
|
165 |
-
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
|
166 |
-
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
|
167 |
-
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
|
168 |
-
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
|
169 |
-
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
|
170 |
-
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
|
171 |
-
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
|
172 |
-
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
|
173 |
-
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
|
174 |
-
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
|
175 |
-
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
|
176 |
-
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
|
177 |
-
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
|
178 |
-
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
|
179 |
-
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
|
180 |
-
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
|
181 |
-
-----END CERTIFICATE-----
|
182 |
-
|
183 |
-
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
|
184 |
-
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
|
185 |
-
# Label: "GlobalSign Root CA - R2"
|
186 |
-
# Serial: 4835703278459682885658125
|
187 |
-
# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
|
188 |
-
# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
|
189 |
-
# 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
|
190 |
-
-----BEGIN CERTIFICATE-----
|
191 |
-
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
|
192 |
-
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
|
193 |
-
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
|
194 |
-
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
|
195 |
-
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
|
196 |
-
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
|
197 |
-
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
|
198 |
-
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
|
199 |
-
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
|
200 |
-
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
|
201 |
-
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
|
202 |
-
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
|
203 |
-
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
|
204 |
-
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
|
205 |
-
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
|
206 |
-
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
|
207 |
-
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
|
208 |
-
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
|
209 |
-
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
|
210 |
-
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
|
211 |
-
-----END CERTIFICATE-----
|
212 |
-
|
213 |
-
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
|
214 |
-
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
|
215 |
-
# Label: "ValiCert Class 1 VA"
|
216 |
-
# Serial: 1
|
217 |
-
# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
|
218 |
-
# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
|
219 |
-
# 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
|
220 |
-
-----BEGIN CERTIFICATE-----
|
221 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
222 |
-
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
223 |
-
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
224 |
-
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
225 |
-
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
|
226 |
-
NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
227 |
-
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
228 |
-
YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
229 |
-
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
230 |
-
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
|
231 |
-
LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
|
232 |
-
TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
|
233 |
-
TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
|
234 |
-
LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
|
235 |
-
I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
|
236 |
-
nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
|
237 |
-
-----END CERTIFICATE-----
|
238 |
-
|
239 |
-
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
|
240 |
-
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
|
241 |
-
# Label: "ValiCert Class 2 VA"
|
242 |
-
# Serial: 1
|
243 |
-
# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
|
244 |
-
# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
|
245 |
-
# 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
|
246 |
-
-----BEGIN CERTIFICATE-----
|
247 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
248 |
-
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
249 |
-
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
250 |
-
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
251 |
-
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
|
252 |
-
NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
253 |
-
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
254 |
-
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
255 |
-
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
256 |
-
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
|
257 |
-
dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
|
258 |
-
WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
|
259 |
-
v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
|
260 |
-
UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
|
261 |
-
IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
|
262 |
-
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
|
263 |
-
-----END CERTIFICATE-----
|
264 |
-
|
265 |
-
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
|
266 |
-
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
|
267 |
-
# Label: "RSA Root Certificate 1"
|
268 |
-
# Serial: 1
|
269 |
-
# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
|
270 |
-
# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
|
271 |
-
# 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
|
272 |
-
-----BEGIN CERTIFICATE-----
|
273 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
274 |
-
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
275 |
-
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
276 |
-
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
277 |
-
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
|
278 |
-
NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
279 |
-
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
280 |
-
YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
281 |
-
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
282 |
-
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
|
283 |
-
cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
|
284 |
-
2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
|
285 |
-
JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
|
286 |
-
Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
|
287 |
-
n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
|
288 |
-
PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
|
289 |
-
-----END CERTIFICATE-----
|
290 |
-
|
291 |
-
# 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
|
292 |
-
# 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
|
293 |
-
# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
|
294 |
-
# Serial: 206684696279472310254277870180966723415
|
295 |
-
# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
|
296 |
-
# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
|
297 |
-
# 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
|
298 |
-
-----BEGIN CERTIFICATE-----
|
299 |
-
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
300 |
-
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
301 |
-
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
302 |
-
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
303 |
-
aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
304 |
-
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
305 |
-
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
306 |
-
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
307 |
-
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
308 |
-
IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
309 |
-
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
|
310 |
-
N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
|
311 |
-
KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
|
312 |
-
kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
|
313 |
-
CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
|
314 |
-
Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
|
315 |
-
imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
|
316 |
-
2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
|
317 |
-
DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
318 |
-
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
|
319 |
-
F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
|
320 |
-
TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
321 |
-
-----END CERTIFICATE-----
|
322 |
-
|
323 |
-
# 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
|
324 |
-
# 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
|
325 |
-
# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
|
326 |
-
# Serial: 314531972711909413743075096039378935511
|
327 |
-
# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
|
328 |
-
# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
|
329 |
-
# 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
|
330 |
-
-----BEGIN CERTIFICATE-----
|
331 |
-
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
332 |
-
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
333 |
-
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
334 |
-
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
335 |
-
aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
336 |
-
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
337 |
-
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
338 |
-
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
339 |
-
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
340 |
-
IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
341 |
-
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
|
342 |
-
GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
|
343 |
-
+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
|
344 |
-
U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
|
345 |
-
NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
|
346 |
-
ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
|
347 |
-
ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
|
348 |
-
CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
|
349 |
-
g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
350 |
-
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
|
351 |
-
2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
|
352 |
-
bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
353 |
-
-----END CERTIFICATE-----
|
354 |
-
|
355 |
-
# 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
|
356 |
-
# 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
|
357 |
-
# Label: "Entrust.net Secure Server CA"
|
358 |
-
# Serial: 927650371
|
359 |
-
# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
|
360 |
-
# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
|
361 |
-
# 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
|
362 |
-
-----BEGIN CERTIFICATE-----
|
363 |
-
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
364 |
-
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
365 |
-
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
366 |
-
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
367 |
-
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
|
368 |
-
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
|
369 |
-
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
|
370 |
-
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
371 |
-
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
|
372 |
-
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
|
373 |
-
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
|
374 |
-
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
|
375 |
-
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
|
376 |
-
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
|
377 |
-
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
|
378 |
-
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
|
379 |
-
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
|
380 |
-
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
|
381 |
-
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
382 |
-
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
|
383 |
-
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
|
384 |
-
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
|
385 |
-
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
|
386 |
-
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
|
387 |
-
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
|
388 |
-
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
389 |
-
-----END CERTIFICATE-----
|
390 |
-
|
391 |
-
# 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
|
392 |
-
# 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
|
393 |
-
# Label: "Entrust.net Premium 2048 Secure Server CA"
|
394 |
-
# Serial: 946059622
|
395 |
-
# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc
|
396 |
-
# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe
|
397 |
-
# 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
|
398 |
-
-----BEGIN CERTIFICATE-----
|
399 |
-
MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
400 |
-
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
401 |
-
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
402 |
-
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
403 |
-
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
|
404 |
-
MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
405 |
-
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
406 |
-
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
407 |
-
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
408 |
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
409 |
-
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
410 |
-
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
411 |
-
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
412 |
-
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
413 |
-
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
414 |
-
4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
|
415 |
-
vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
|
416 |
-
CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
|
417 |
-
WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
|
418 |
-
oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
|
419 |
-
h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
|
420 |
-
f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
|
421 |
-
B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
|
422 |
-
vUxFnmG6v4SBkgPR0ml8xQ==
|
423 |
-
-----END CERTIFICATE-----
|
424 |
-
|
425 |
-
# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
426 |
-
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
427 |
-
# Label: "Baltimore CyberTrust Root"
|
428 |
-
# Serial: 33554617
|
429 |
-
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
|
430 |
-
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
|
431 |
-
# 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
|
432 |
-
-----BEGIN CERTIFICATE-----
|
433 |
-
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
|
434 |
-
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
|
435 |
-
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
|
436 |
-
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
|
437 |
-
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
|
438 |
-
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
|
439 |
-
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
|
440 |
-
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
|
441 |
-
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
|
442 |
-
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
|
443 |
-
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
|
444 |
-
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
|
445 |
-
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
|
446 |
-
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
|
447 |
-
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
|
448 |
-
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
|
449 |
-
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
|
450 |
-
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
|
451 |
-
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
452 |
-
-----END CERTIFICATE-----
|
453 |
-
|
454 |
-
# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
|
455 |
-
# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
|
456 |
-
# Label: "Equifax Secure Global eBusiness CA"
|
457 |
-
# Serial: 1
|
458 |
-
# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
|
459 |
-
# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
|
460 |
-
# 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
|
461 |
-
-----BEGIN CERTIFICATE-----
|
462 |
-
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
|
463 |
-
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
|
464 |
-
ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
|
465 |
-
MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
|
466 |
-
dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
|
467 |
-
c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
|
468 |
-
UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
|
469 |
-
58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
|
470 |
-
o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
|
471 |
-
MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
|
472 |
-
aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
|
473 |
-
A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
|
474 |
-
Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
|
475 |
-
8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
|
476 |
-
-----END CERTIFICATE-----
|
477 |
-
|
478 |
-
# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
|
479 |
-
# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
|
480 |
-
# Label: "Equifax Secure eBusiness CA 1"
|
481 |
-
# Serial: 4
|
482 |
-
# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
|
483 |
-
# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
|
484 |
-
# 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
|
485 |
-
-----BEGIN CERTIFICATE-----
|
486 |
-
MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
|
487 |
-
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
|
488 |
-
ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
|
489 |
-
MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
|
490 |
-
LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
|
491 |
-
KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
|
492 |
-
RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
|
493 |
-
WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
|
494 |
-
Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
|
495 |
-
AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
|
496 |
-
eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
|
497 |
-
zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
|
498 |
-
WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
|
499 |
-
/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
|
500 |
-
-----END CERTIFICATE-----
|
501 |
-
|
502 |
-
# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
|
503 |
-
# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
|
504 |
-
# Label: "Equifax Secure eBusiness CA 2"
|
505 |
-
# Serial: 930140085
|
506 |
-
# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca
|
507 |
-
# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc
|
508 |
-
# 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
|
509 |
-
-----BEGIN CERTIFICATE-----
|
510 |
-
MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
511 |
-
UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
|
512 |
-
dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
|
513 |
-
NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
|
514 |
-
VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
|
515 |
-
AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
|
516 |
-
vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
|
517 |
-
BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
|
518 |
-
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
|
519 |
-
MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
|
520 |
-
IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
|
521 |
-
NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
|
522 |
-
y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
|
523 |
-
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
524 |
-
A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
|
525 |
-
0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
|
526 |
-
E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
|
527 |
-
-----END CERTIFICATE-----
|
528 |
-
|
529 |
-
# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
|
530 |
-
# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
|
531 |
-
# Label: "AddTrust Low-Value Services Root"
|
532 |
-
# Serial: 1
|
533 |
-
# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
|
534 |
-
# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
|
535 |
-
# 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
|
536 |
-
-----BEGIN CERTIFICATE-----
|
537 |
-
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
|
538 |
-
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
539 |
-
b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
|
540 |
-
MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
541 |
-
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
|
542 |
-
VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
|
543 |
-
A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
|
544 |
-
CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
|
545 |
-
tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
|
546 |
-
dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
|
547 |
-
PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
|
548 |
-
+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
|
549 |
-
BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
|
550 |
-
BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
|
551 |
-
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
|
552 |
-
ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
|
553 |
-
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
|
554 |
-
7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
|
555 |
-
43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
|
556 |
-
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
|
557 |
-
pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
|
558 |
-
WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
|
559 |
-
-----END CERTIFICATE-----
|
560 |
-
|
561 |
-
# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
|
562 |
-
# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
|
563 |
-
# Label: "AddTrust External Root"
|
564 |
-
# Serial: 1
|
565 |
-
# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
|
566 |
-
# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
|
567 |
-
# 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
|
568 |
-
-----BEGIN CERTIFICATE-----
|
569 |
-
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
|
570 |
-
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
|
571 |
-
IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
|
572 |
-
MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
|
573 |
-
FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
|
574 |
-
bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
|
575 |
-
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
|
576 |
-
H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
|
577 |
-
uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
|
578 |
-
mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
|
579 |
-
a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
|
580 |
-
E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
|
581 |
-
WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
|
582 |
-
VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
|
583 |
-
Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
|
584 |
-
cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
|
585 |
-
IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
|
586 |
-
AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
|
587 |
-
YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
588 |
-
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
|
589 |
-
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
|
590 |
-
c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
|
591 |
-
mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
592 |
-
-----END CERTIFICATE-----
|
593 |
-
|
594 |
-
# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
|
595 |
-
# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
|
596 |
-
# Label: "AddTrust Public Services Root"
|
597 |
-
# Serial: 1
|
598 |
-
# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
|
599 |
-
# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
|
600 |
-
# 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
|
601 |
-
-----BEGIN CERTIFICATE-----
|
602 |
-
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
|
603 |
-
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
604 |
-
b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
|
605 |
-
MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
|
606 |
-
ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
|
607 |
-
BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
|
608 |
-
AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
|
609 |
-
6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
|
610 |
-
GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
|
611 |
-
dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
|
612 |
-
1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
|
613 |
-
62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
|
614 |
-
BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
|
615 |
-
AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
|
616 |
-
MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
|
617 |
-
cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
|
618 |
-
b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
|
619 |
-
IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
|
620 |
-
iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
|
621 |
-
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
|
622 |
-
4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
|
623 |
-
XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
|
624 |
-
-----END CERTIFICATE-----
|
625 |
-
|
626 |
-
# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
|
627 |
-
# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
|
628 |
-
# Label: "AddTrust Qualified Certificates Root"
|
629 |
-
# Serial: 1
|
630 |
-
# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
|
631 |
-
# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
|
632 |
-
# 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
|
633 |
-
-----BEGIN CERTIFICATE-----
|
634 |
-
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
|
635 |
-
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
636 |
-
b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
|
637 |
-
MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
|
638 |
-
EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
|
639 |
-
BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
|
640 |
-
AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
|
641 |
-
xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
|
642 |
-
87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
|
643 |
-
2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
|
644 |
-
WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
|
645 |
-
0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
|
646 |
-
A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
|
647 |
-
AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
|
648 |
-
pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
|
649 |
-
ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
|
650 |
-
aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
|
651 |
-
hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
|
652 |
-
hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
|
653 |
-
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
|
654 |
-
P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
|
655 |
-
iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
|
656 |
-
xqE=
|
657 |
-
-----END CERTIFICATE-----
|
658 |
-
|
659 |
-
# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
660 |
-
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
661 |
-
# Label: "Entrust Root Certification Authority"
|
662 |
-
# Serial: 1164660820
|
663 |
-
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
|
664 |
-
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
|
665 |
-
# 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
|
666 |
-
-----BEGIN CERTIFICATE-----
|
667 |
-
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
|
668 |
-
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
669 |
-
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
670 |
-
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
671 |
-
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
|
672 |
-
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
|
673 |
-
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
|
674 |
-
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
|
675 |
-
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
|
676 |
-
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
|
677 |
-
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
|
678 |
-
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
|
679 |
-
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
|
680 |
-
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
|
681 |
-
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
|
682 |
-
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
|
683 |
-
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
|
684 |
-
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
|
685 |
-
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
686 |
-
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
|
687 |
-
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
|
688 |
-
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
|
689 |
-
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
|
690 |
-
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
|
691 |
-
0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
692 |
-
-----END CERTIFICATE-----
|
693 |
-
|
694 |
-
# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
|
695 |
-
# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
|
696 |
-
# Label: "GeoTrust Global CA"
|
697 |
-
# Serial: 144470
|
698 |
-
# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
|
699 |
-
# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
|
700 |
-
# 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
|
701 |
-
-----BEGIN CERTIFICATE-----
|
702 |
-
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
|
703 |
-
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
|
704 |
-
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
|
705 |
-
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
|
706 |
-
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
|
707 |
-
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
|
708 |
-
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
|
709 |
-
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
|
710 |
-
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
|
711 |
-
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
|
712 |
-
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
|
713 |
-
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
|
714 |
-
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
|
715 |
-
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
|
716 |
-
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
|
717 |
-
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
|
718 |
-
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
|
719 |
-
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
|
720 |
-
-----END CERTIFICATE-----
|
721 |
-
|
722 |
-
# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
|
723 |
-
# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
|
724 |
-
# Label: "GeoTrust Global CA 2"
|
725 |
-
# Serial: 1
|
726 |
-
# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
|
727 |
-
# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
|
728 |
-
# 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
|
729 |
-
-----BEGIN CERTIFICATE-----
|
730 |
-
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
|
731 |
-
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
|
732 |
-
IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
|
733 |
-
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
|
734 |
-
R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
|
735 |
-
PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
|
736 |
-
Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
|
737 |
-
TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
|
738 |
-
5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
|
739 |
-
S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
|
740 |
-
2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
|
741 |
-
FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
|
742 |
-
EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
|
743 |
-
EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
|
744 |
-
/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
|
745 |
-
A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
|
746 |
-
abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
|
747 |
-
I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
|
748 |
-
4iIprn2DQKi6bA==
|
749 |
-
-----END CERTIFICATE-----
|
750 |
-
|
751 |
-
# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
|
752 |
-
# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
|
753 |
-
# Label: "GeoTrust Universal CA"
|
754 |
-
# Serial: 1
|
755 |
-
# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
|
756 |
-
# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
|
757 |
-
# 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
|
758 |
-
-----BEGIN CERTIFICATE-----
|
759 |
-
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
|
760 |
-
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
|
761 |
-
c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
|
762 |
-
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
|
763 |
-
IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
|
764 |
-
VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
|
765 |
-
cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
|
766 |
-
QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
|
767 |
-
F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
|
768 |
-
c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
|
769 |
-
mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
|
770 |
-
VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
|
771 |
-
teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
|
772 |
-
f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
|
773 |
-
Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
|
774 |
-
nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
|
775 |
-
/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
|
776 |
-
MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
|
777 |
-
9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
|
778 |
-
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
|
779 |
-
IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
|
780 |
-
ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
|
781 |
-
uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
|
782 |
-
Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
|
783 |
-
QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
|
784 |
-
koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
|
785 |
-
ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
|
786 |
-
DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
|
787 |
-
bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
|
788 |
-
-----END CERTIFICATE-----
|
789 |
-
|
790 |
-
# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
|
791 |
-
# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
|
792 |
-
# Label: "GeoTrust Universal CA 2"
|
793 |
-
# Serial: 1
|
794 |
-
# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
|
795 |
-
# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
|
796 |
-
# 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
|
797 |
-
-----BEGIN CERTIFICATE-----
|
798 |
-
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
|
799 |
-
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
|
800 |
-
c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
|
801 |
-
VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
|
802 |
-
c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
803 |
-
AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
|
804 |
-
WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
|
805 |
-
FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
|
806 |
-
XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
|
807 |
-
se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
|
808 |
-
KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
|
809 |
-
IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
|
810 |
-
y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
|
811 |
-
hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
|
812 |
-
QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
|
813 |
-
Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
|
814 |
-
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
|
815 |
-
HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
|
816 |
-
KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
|
817 |
-
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
|
818 |
-
L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
|
819 |
-
Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
|
820 |
-
ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
|
821 |
-
T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
|
822 |
-
GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
|
823 |
-
1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
|
824 |
-
OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
|
825 |
-
6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
|
826 |
-
QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
|
827 |
-
-----END CERTIFICATE-----
|
828 |
-
|
829 |
-
# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
|
830 |
-
# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
|
831 |
-
# Label: "America Online Root Certification Authority 1"
|
832 |
-
# Serial: 1
|
833 |
-
# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
|
834 |
-
# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
|
835 |
-
# 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
|
836 |
-
-----BEGIN CERTIFICATE-----
|
837 |
-
MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
|
838 |
-
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
|
839 |
-
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
|
840 |
-
MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
|
841 |
-
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
|
842 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
843 |
-
ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
|
844 |
-
hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
|
845 |
-
1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
|
846 |
-
OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
|
847 |
-
2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
|
848 |
-
O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
|
849 |
-
AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
|
850 |
-
AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
|
851 |
-
BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
|
852 |
-
Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
|
853 |
-
LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
|
854 |
-
oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
|
855 |
-
MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
|
856 |
-
sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
|
857 |
-
-----END CERTIFICATE-----
|
858 |
-
|
859 |
-
# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
|
860 |
-
# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
|
861 |
-
# Label: "America Online Root Certification Authority 2"
|
862 |
-
# Serial: 1
|
863 |
-
# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
|
864 |
-
# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
|
865 |
-
# 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
|
866 |
-
-----BEGIN CERTIFICATE-----
|
867 |
-
MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
|
868 |
-
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
|
869 |
-
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
|
870 |
-
MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
|
871 |
-
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
|
872 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
873 |
-
ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
|
874 |
-
206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
|
875 |
-
KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
|
876 |
-
JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
|
877 |
-
BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
|
878 |
-
Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
|
879 |
-
PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
|
880 |
-
Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
|
881 |
-
Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
|
882 |
-
o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
|
883 |
-
+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
|
884 |
-
YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
|
885 |
-
FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
|
886 |
-
AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
|
887 |
-
xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
|
888 |
-
LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
|
889 |
-
obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
|
890 |
-
CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
|
891 |
-
IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
|
892 |
-
DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
|
893 |
-
AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
|
894 |
-
Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
|
895 |
-
AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
|
896 |
-
Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
|
897 |
-
RY8mkaKO/qk=
|
898 |
-
-----END CERTIFICATE-----
|
899 |
-
|
900 |
-
# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
|
901 |
-
# Subject: CN=AAA Certificate Services O=Comodo CA Limited
|
902 |
-
# Label: "Comodo AAA Services root"
|
903 |
-
# Serial: 1
|
904 |
-
# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
|
905 |
-
# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
|
906 |
-
# 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
|
907 |
-
-----BEGIN CERTIFICATE-----
|
908 |
-
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
|
909 |
-
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
910 |
-
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
|
911 |
-
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
|
912 |
-
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
|
913 |
-
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
|
914 |
-
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
915 |
-
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
|
916 |
-
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
|
917 |
-
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
|
918 |
-
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
|
919 |
-
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
|
920 |
-
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
|
921 |
-
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
|
922 |
-
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
|
923 |
-
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
|
924 |
-
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
|
925 |
-
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
|
926 |
-
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
|
927 |
-
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
|
928 |
-
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
|
929 |
-
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
|
930 |
-
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
|
931 |
-
-----END CERTIFICATE-----
|
932 |
-
|
933 |
-
# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
|
934 |
-
# Subject: CN=Secure Certificate Services O=Comodo CA Limited
|
935 |
-
# Label: "Comodo Secure Services root"
|
936 |
-
# Serial: 1
|
937 |
-
# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
|
938 |
-
# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
|
939 |
-
# 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
|
940 |
-
-----BEGIN CERTIFICATE-----
|
941 |
-
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
|
942 |
-
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
943 |
-
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
|
944 |
-
ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
|
945 |
-
fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
946 |
-
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
|
947 |
-
BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
|
948 |
-
BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
|
949 |
-
cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
|
950 |
-
HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
|
951 |
-
CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
|
952 |
-
3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
|
953 |
-
6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
|
954 |
-
HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
|
955 |
-
EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
|
956 |
-
Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
|
957 |
-
Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
|
958 |
-
DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
|
959 |
-
5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
|
960 |
-
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
|
961 |
-
gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
|
962 |
-
aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
|
963 |
-
izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
|
964 |
-
-----END CERTIFICATE-----
|
965 |
-
|
966 |
-
# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
|
967 |
-
# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
|
968 |
-
# Label: "Comodo Trusted Services root"
|
969 |
-
# Serial: 1
|
970 |
-
# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
|
971 |
-
# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
|
972 |
-
# 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
|
973 |
-
-----BEGIN CERTIFICATE-----
|
974 |
-
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
|
975 |
-
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
976 |
-
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
|
977 |
-
aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
|
978 |
-
MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
979 |
-
BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
|
980 |
-
VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
|
981 |
-
AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
|
982 |
-
fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
|
983 |
-
TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
|
984 |
-
fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
|
985 |
-
1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
|
986 |
-
kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
|
987 |
-
A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
|
988 |
-
VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
|
989 |
-
ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
|
990 |
-
dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
|
991 |
-
Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
|
992 |
-
HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
|
993 |
-
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
|
994 |
-
jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
|
995 |
-
xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
|
996 |
-
dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
|
997 |
-
-----END CERTIFICATE-----
|
998 |
-
|
999 |
-
# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
|
1000 |
-
# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
|
1001 |
-
# Label: "UTN DATACorp SGC Root CA"
|
1002 |
-
# Serial: 91374294542884689855167577680241077609
|
1003 |
-
# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
|
1004 |
-
# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
|
1005 |
-
# 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
|
1006 |
-
-----BEGIN CERTIFICATE-----
|
1007 |
-
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
|
1008 |
-
kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
|
1009 |
-
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
|
1010 |
-
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
|
1011 |
-
IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
|
1012 |
-
EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
|
1013 |
-
VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
|
1014 |
-
dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
|
1015 |
-
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
|
1016 |
-
E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
|
1017 |
-
D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
|
1018 |
-
4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
|
1019 |
-
lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
|
1020 |
-
bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
|
1021 |
-
o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
|
1022 |
-
MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
|
1023 |
-
LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
|
1024 |
-
BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
|
1025 |
-
AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
|
1026 |
-
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
|
1027 |
-
j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
|
1028 |
-
KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
|
1029 |
-
2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
|
1030 |
-
mfnGV/TJVTl4uix5yaaIK/QI
|
1031 |
-
-----END CERTIFICATE-----
|
1032 |
-
|
1033 |
-
# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
|
1034 |
-
# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
|
1035 |
-
# Label: "UTN USERFirst Hardware Root CA"
|
1036 |
-
# Serial: 91374294542884704022267039221184531197
|
1037 |
-
# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
|
1038 |
-
# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
|
1039 |
-
# 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
|
1040 |
-
-----BEGIN CERTIFICATE-----
|
1041 |
-
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
|
1042 |
-
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
|
1043 |
-
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
|
1044 |
-
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
|
1045 |
-
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
|
1046 |
-
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
|
1047 |
-
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
|
1048 |
-
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
|
1049 |
-
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
|
1050 |
-
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
|
1051 |
-
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
|
1052 |
-
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
|
1053 |
-
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
|
1054 |
-
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
|
1055 |
-
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
|
1056 |
-
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
|
1057 |
-
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
|
1058 |
-
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
|
1059 |
-
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
|
1060 |
-
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
|
1061 |
-
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
|
1062 |
-
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
|
1063 |
-
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
|
1064 |
-
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
|
1065 |
-
-----END CERTIFICATE-----
|
1066 |
-
|
1067 |
-
# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
|
1068 |
-
# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
|
1069 |
-
# Label: "XRamp Global CA Root"
|
1070 |
-
# Serial: 107108908803651509692980124233745014957
|
1071 |
-
# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
|
1072 |
-
# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
|
1073 |
-
# 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
|
1074 |
-
-----BEGIN CERTIFICATE-----
|
1075 |
-
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
|
1076 |
-
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
|
1077 |
-
MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
|
1078 |
-
UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
|
1079 |
-
NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
|
1080 |
-
dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
|
1081 |
-
dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
|
1082 |
-
dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
|
1083 |
-
38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
|
1084 |
-
KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
|
1085 |
-
DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
|
1086 |
-
qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
|
1087 |
-
JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
|
1088 |
-
PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
|
1089 |
-
BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
|
1090 |
-
jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
|
1091 |
-
eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
|
1092 |
-
ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
|
1093 |
-
vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
|
1094 |
-
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
|
1095 |
-
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
|
1096 |
-
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
|
1097 |
-
O+7ETPTsJ3xCwnR8gooJybQDJbw=
|
1098 |
-
-----END CERTIFICATE-----
|
1099 |
-
|
1100 |
-
# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
|
1101 |
-
# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
|
1102 |
-
# Label: "Go Daddy Class 2 CA"
|
1103 |
-
# Serial: 0
|
1104 |
-
# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
|
1105 |
-
# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
|
1106 |
-
# 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
|
1107 |
-
-----BEGIN CERTIFICATE-----
|
1108 |
-
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
|
1109 |
-
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
|
1110 |
-
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
|
1111 |
-
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
|
1112 |
-
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
|
1113 |
-
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
|
1114 |
-
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
|
1115 |
-
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
|
1116 |
-
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
|
1117 |
-
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
|
1118 |
-
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
|
1119 |
-
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
|
1120 |
-
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
|
1121 |
-
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
|
1122 |
-
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
|
1123 |
-
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
|
1124 |
-
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
|
1125 |
-
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
|
1126 |
-
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
|
1127 |
-
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
|
1128 |
-
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
|
1129 |
-
ReYNnyicsbkqWletNw+vHX/bvZ8=
|
1130 |
-
-----END CERTIFICATE-----
|
1131 |
-
|
1132 |
-
# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
|
1133 |
-
# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
|
1134 |
-
# Label: "Starfield Class 2 CA"
|
1135 |
-
# Serial: 0
|
1136 |
-
# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
|
1137 |
-
# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
|
1138 |
-
# 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
|
1139 |
-
-----BEGIN CERTIFICATE-----
|
1140 |
-
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
|
1141 |
-
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
|
1142 |
-
U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
|
1143 |
-
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
|
1144 |
-
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
|
1145 |
-
ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
|
1146 |
-
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
|
1147 |
-
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
|
1148 |
-
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
|
1149 |
-
X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
|
1150 |
-
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
|
1151 |
-
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
|
1152 |
-
A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
|
1153 |
-
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
|
1154 |
-
YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
|
1155 |
-
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
|
1156 |
-
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
|
1157 |
-
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
|
1158 |
-
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
|
1159 |
-
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
|
1160 |
-
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
|
1161 |
-
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
|
1162 |
-
-----END CERTIFICATE-----
|
1163 |
-
|
1164 |
-
# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
1165 |
-
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
1166 |
-
# Label: "StartCom Certification Authority"
|
1167 |
-
# Serial: 1
|
1168 |
-
# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
|
1169 |
-
# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
|
1170 |
-
# 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
|
1171 |
-
-----BEGIN CERTIFICATE-----
|
1172 |
-
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
|
1173 |
-
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
|
1174 |
-
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
|
1175 |
-
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
|
1176 |
-
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
|
1177 |
-
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
|
1178 |
-
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
|
1179 |
-
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
|
1180 |
-
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
|
1181 |
-
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
|
1182 |
-
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
|
1183 |
-
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
|
1184 |
-
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
|
1185 |
-
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
|
1186 |
-
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
|
1187 |
-
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
|
1188 |
-
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
|
1189 |
-
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
|
1190 |
-
AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
|
1191 |
-
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
|
1192 |
-
ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
|
1193 |
-
LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
|
1194 |
-
BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
|
1195 |
-
Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
|
1196 |
-
dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
|
1197 |
-
cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
|
1198 |
-
YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
|
1199 |
-
dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
|
1200 |
-
bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
|
1201 |
-
YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
|
1202 |
-
TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
|
1203 |
-
9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
|
1204 |
-
jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
|
1205 |
-
FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
|
1206 |
-
ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
|
1207 |
-
ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
|
1208 |
-
EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
|
1209 |
-
L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
|
1210 |
-
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
|
1211 |
-
O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
|
1212 |
-
um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
|
1213 |
-
NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
|
1214 |
-
-----END CERTIFICATE-----
|
1215 |
-
|
1216 |
-
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
1217 |
-
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
1218 |
-
# Label: "DigiCert Assured ID Root CA"
|
1219 |
-
# Serial: 17154717934120587862167794914071425081
|
1220 |
-
# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
|
1221 |
-
# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
|
1222 |
-
# 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
|
1223 |
-
-----BEGIN CERTIFICATE-----
|
1224 |
-
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
|
1225 |
-
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1226 |
-
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
|
1227 |
-
b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
|
1228 |
-
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
|
1229 |
-
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
|
1230 |
-
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
|
1231 |
-
JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
|
1232 |
-
mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
|
1233 |
-
wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
|
1234 |
-
VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
|
1235 |
-
AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
|
1236 |
-
AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
|
1237 |
-
BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
|
1238 |
-
pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
|
1239 |
-
dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
|
1240 |
-
fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
|
1241 |
-
NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
|
1242 |
-
H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
|
1243 |
-
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
|
1244 |
-
-----END CERTIFICATE-----
|
1245 |
-
|
1246 |
-
# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
|
1247 |
-
# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
|
1248 |
-
# Label: "DigiCert Global Root CA"
|
1249 |
-
# Serial: 10944719598952040374951832963794454346
|
1250 |
-
# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
|
1251 |
-
# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
|
1252 |
-
# 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
|
1253 |
-
-----BEGIN CERTIFICATE-----
|
1254 |
-
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
1255 |
-
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1256 |
-
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
1257 |
-
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
1258 |
-
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
1259 |
-
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
1260 |
-
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
1261 |
-
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
1262 |
-
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
1263 |
-
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
1264 |
-
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
1265 |
-
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
1266 |
-
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
1267 |
-
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
1268 |
-
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
1269 |
-
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
1270 |
-
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
1271 |
-
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
1272 |
-
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
1273 |
-
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
1274 |
-
-----END CERTIFICATE-----
|
1275 |
-
|
1276 |
-
# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
|
1277 |
-
# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
|
1278 |
-
# Label: "DigiCert High Assurance EV Root CA"
|
1279 |
-
# Serial: 3553400076410547919724730734378100087
|
1280 |
-
# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
|
1281 |
-
# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
|
1282 |
-
# 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
|
1283 |
-
-----BEGIN CERTIFICATE-----
|
1284 |
-
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
|
1285 |
-
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1286 |
-
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
|
1287 |
-
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
|
1288 |
-
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
|
1289 |
-
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
|
1290 |
-
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
|
1291 |
-
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
|
1292 |
-
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
|
1293 |
-
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
|
1294 |
-
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
|
1295 |
-
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
|
1296 |
-
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
|
1297 |
-
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
|
1298 |
-
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
|
1299 |
-
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
|
1300 |
-
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
|
1301 |
-
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
|
1302 |
-
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
1303 |
-
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
|
1304 |
-
+OkuE6N36B9K
|
1305 |
-
-----END CERTIFICATE-----
|
1306 |
-
|
1307 |
-
# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
|
1308 |
-
# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
|
1309 |
-
# Label: "GeoTrust Primary Certification Authority"
|
1310 |
-
# Serial: 32798226551256963324313806436981982369
|
1311 |
-
# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
|
1312 |
-
# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
|
1313 |
-
# 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
|
1314 |
-
-----BEGIN CERTIFICATE-----
|
1315 |
-
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
|
1316 |
-
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
|
1317 |
-
R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
|
1318 |
-
MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
|
1319 |
-
Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
|
1320 |
-
ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
1321 |
-
AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
|
1322 |
-
AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
|
1323 |
-
ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
|
1324 |
-
7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
|
1325 |
-
kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
|
1326 |
-
mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
|
1327 |
-
A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
|
1328 |
-
KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
|
1329 |
-
6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
|
1330 |
-
4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
|
1331 |
-
oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
|
1332 |
-
UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
|
1333 |
-
AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
|
1334 |
-
-----END CERTIFICATE-----
|
1335 |
-
|
1336 |
-
# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
|
1337 |
-
# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
|
1338 |
-
# Label: "thawte Primary Root CA"
|
1339 |
-
# Serial: 69529181992039203566298953787712940909
|
1340 |
-
# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
|
1341 |
-
# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
|
1342 |
-
# 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
|
1343 |
-
-----BEGIN CERTIFICATE-----
|
1344 |
-
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
|
1345 |
-
qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
|
1346 |
-
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
|
1347 |
-
MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
|
1348 |
-
BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
|
1349 |
-
NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
|
1350 |
-
LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
|
1351 |
-
A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
1352 |
-
IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
|
1353 |
-
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
|
1354 |
-
W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
|
1355 |
-
3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
|
1356 |
-
6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
|
1357 |
-
Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
|
1358 |
-
NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
|
1359 |
-
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
|
1360 |
-
r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
|
1361 |
-
DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
|
1362 |
-
YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
|
1363 |
-
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
|
1364 |
-
/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
|
1365 |
-
LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
|
1366 |
-
jVaMaA==
|
1367 |
-
-----END CERTIFICATE-----
|
1368 |
-
|
1369 |
-
# 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
|
1370 |
-
# 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
|
1371 |
-
# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
|
1372 |
-
# Serial: 33037644167568058970164719475676101450
|
1373 |
-
# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
|
1374 |
-
# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
|
1375 |
-
# 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
|
1376 |
-
-----BEGIN CERTIFICATE-----
|
1377 |
-
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
|
1378 |
-
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
1379 |
-
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
|
1380 |
-
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
|
1381 |
-
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
|
1382 |
-
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
|
1383 |
-
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
|
1384 |
-
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
|
1385 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
|
1386 |
-
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
|
1387 |
-
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
|
1388 |
-
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
|
1389 |
-
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
|
1390 |
-
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
|
1391 |
-
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
|
1392 |
-
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
|
1393 |
-
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
|
1394 |
-
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
|
1395 |
-
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
1396 |
-
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
|
1397 |
-
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
|
1398 |
-
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
|
1399 |
-
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
|
1400 |
-
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
|
1401 |
-
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
|
1402 |
-
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
1403 |
-
-----END CERTIFICATE-----
|
1404 |
-
|
1405 |
-
# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
|
1406 |
-
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
|
1407 |
-
# Label: "COMODO Certification Authority"
|
1408 |
-
# Serial: 104350513648249232941998508985834464573
|
1409 |
-
# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
|
1410 |
-
# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
|
1411 |
-
# 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
|
1412 |
-
-----BEGIN CERTIFICATE-----
|
1413 |
-
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
|
1414 |
-
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
1415 |
-
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
|
1416 |
-
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
|
1417 |
-
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
|
1418 |
-
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
|
1419 |
-
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
|
1420 |
-
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
|
1421 |
-
UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
|
1422 |
-
2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
|
1423 |
-
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
|
1424 |
-
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
|
1425 |
-
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
|
1426 |
-
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
|
1427 |
-
/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
|
1428 |
-
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
|
1429 |
-
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
|
1430 |
-
SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
|
1431 |
-
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
|
1432 |
-
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
|
1433 |
-
zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
|
1434 |
-
BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
|
1435 |
-
ZQ==
|
1436 |
-
-----END CERTIFICATE-----
|
1437 |
-
|
1438 |
-
# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
1439 |
-
# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
1440 |
-
# Label: "Network Solutions Certificate Authority"
|
1441 |
-
# Serial: 116697915152937497490437556386812487904
|
1442 |
-
# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
|
1443 |
-
# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
|
1444 |
-
# 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
|
1445 |
-
-----BEGIN CERTIFICATE-----
|
1446 |
-
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
|
1447 |
-
MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
|
1448 |
-
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
|
1449 |
-
dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
|
1450 |
-
UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
|
1451 |
-
ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
|
1452 |
-
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
|
1453 |
-
c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
|
1454 |
-
OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
|
1455 |
-
mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
|
1456 |
-
BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
|
1457 |
-
qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
|
1458 |
-
gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
|
1459 |
-
BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
|
1460 |
-
bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
|
1461 |
-
dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
|
1462 |
-
6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
|
1463 |
-
h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
|
1464 |
-
/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
|
1465 |
-
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
|
1466 |
-
pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
|
1467 |
-
-----END CERTIFICATE-----
|
1468 |
-
|
1469 |
-
# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
1470 |
-
# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
1471 |
-
# Label: "COMODO ECC Certification Authority"
|
1472 |
-
# Serial: 41578283867086692638256921589707938090
|
1473 |
-
# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
|
1474 |
-
# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
|
1475 |
-
# 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
|
1476 |
-
-----BEGIN CERTIFICATE-----
|
1477 |
-
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
|
1478 |
-
MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
|
1479 |
-
BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
|
1480 |
-
IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
|
1481 |
-
MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
|
1482 |
-
ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
|
1483 |
-
T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
|
1484 |
-
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
|
1485 |
-
FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
|
1486 |
-
cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
|
1487 |
-
BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
|
1488 |
-
BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
|
1489 |
-
fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
|
1490 |
-
GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
|
1491 |
-
-----END CERTIFICATE-----
|
1492 |
-
|
1493 |
-
# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
|
1494 |
-
# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
|
1495 |
-
# Label: "TC TrustCenter Class 2 CA II"
|
1496 |
-
# Serial: 941389028203453866782103406992443
|
1497 |
-
# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
|
1498 |
-
# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
|
1499 |
-
# 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
|
1500 |
-
-----BEGIN CERTIFICATE-----
|
1501 |
-
MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
|
1502 |
-
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
|
1503 |
-
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
|
1504 |
-
Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
|
1505 |
-
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
|
1506 |
-
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
|
1507 |
-
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
1508 |
-
ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
|
1509 |
-
tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
|
1510 |
-
uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
|
1511 |
-
XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
|
1512 |
-
8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
|
1513 |
-
5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
|
1514 |
-
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
|
1515 |
-
kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
|
1516 |
-
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
|
1517 |
-
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
|
1518 |
-
JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
|
1519 |
-
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
1520 |
-
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
|
1521 |
-
GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
|
1522 |
-
ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
|
1523 |
-
au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
|
1524 |
-
hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
|
1525 |
-
dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
|
1526 |
-
-----END CERTIFICATE-----
|
1527 |
-
|
1528 |
-
# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
|
1529 |
-
# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
|
1530 |
-
# Label: "TC TrustCenter Class 3 CA II"
|
1531 |
-
# Serial: 1506523511417715638772220530020799
|
1532 |
-
# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
|
1533 |
-
# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
|
1534 |
-
# 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
|
1535 |
-
-----BEGIN CERTIFICATE-----
|
1536 |
-
MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
|
1537 |
-
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
|
1538 |
-
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
|
1539 |
-
Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
|
1540 |
-
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
|
1541 |
-
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
|
1542 |
-
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
1543 |
-
ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
|
1544 |
-
Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
|
1545 |
-
Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
|
1546 |
-
1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
|
1547 |
-
ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
|
1548 |
-
Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
|
1549 |
-
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
|
1550 |
-
XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
|
1551 |
-
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
|
1552 |
-
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
|
1553 |
-
JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
|
1554 |
-
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
1555 |
-
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
|
1556 |
-
irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
|
1557 |
-
TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
|
1558 |
-
g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
|
1559 |
-
95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
|
1560 |
-
S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
|
1561 |
-
-----END CERTIFICATE-----
|
1562 |
-
|
1563 |
-
# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1564 |
-
# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1565 |
-
# Label: "TC TrustCenter Universal CA I"
|
1566 |
-
# Serial: 601024842042189035295619584734726
|
1567 |
-
# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
|
1568 |
-
# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
|
1569 |
-
# 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
|
1570 |
-
-----BEGIN CERTIFICATE-----
|
1571 |
-
MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
|
1572 |
-
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
|
1573 |
-
BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
|
1574 |
-
c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
|
1575 |
-
MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
|
1576 |
-
R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
|
1577 |
-
VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
|
1578 |
-
AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
|
1579 |
-
JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
|
1580 |
-
fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
|
1581 |
-
jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
|
1582 |
-
wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
|
1583 |
-
fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
|
1584 |
-
VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
|
1585 |
-
BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
|
1586 |
-
CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
|
1587 |
-
7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
|
1588 |
-
8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
|
1589 |
-
ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
|
1590 |
-
ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
|
1591 |
-
2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
|
1592 |
-
-----END CERTIFICATE-----
|
1593 |
-
|
1594 |
-
# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
|
1595 |
-
# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
|
1596 |
-
# Label: "Cybertrust Global Root"
|
1597 |
-
# Serial: 4835703278459682877484360
|
1598 |
-
# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
|
1599 |
-
# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
|
1600 |
-
# 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
|
1601 |
-
-----BEGIN CERTIFICATE-----
|
1602 |
-
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
|
1603 |
-
A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
|
1604 |
-
bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
|
1605 |
-
ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
|
1606 |
-
b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
|
1607 |
-
7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
|
1608 |
-
J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
|
1609 |
-
HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
|
1610 |
-
t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
|
1611 |
-
FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
|
1612 |
-
XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
|
1613 |
-
MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
|
1614 |
-
hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
|
1615 |
-
MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
|
1616 |
-
A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
|
1617 |
-
Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
|
1618 |
-
XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
|
1619 |
-
omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
|
1620 |
-
A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
|
1621 |
-
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
|
1622 |
-
-----END CERTIFICATE-----
|
1623 |
-
|
1624 |
-
# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
|
1625 |
-
# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
|
1626 |
-
# Label: "GeoTrust Primary Certification Authority - G3"
|
1627 |
-
# Serial: 28809105769928564313984085209975885599
|
1628 |
-
# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
|
1629 |
-
# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
|
1630 |
-
# 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
|
1631 |
-
-----BEGIN CERTIFICATE-----
|
1632 |
-
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
|
1633 |
-
mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
|
1634 |
-
MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
1635 |
-
eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
1636 |
-
cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
|
1637 |
-
BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
|
1638 |
-
MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
|
1639 |
-
BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
1640 |
-
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
|
1641 |
-
+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
|
1642 |
-
hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
|
1643 |
-
5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
|
1644 |
-
JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
|
1645 |
-
DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
|
1646 |
-
huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
|
1647 |
-
HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
|
1648 |
-
AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
|
1649 |
-
zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
|
1650 |
-
kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
|
1651 |
-
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
|
1652 |
-
SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
|
1653 |
-
spki4cErx5z481+oghLrGREt
|
1654 |
-
-----END CERTIFICATE-----
|
1655 |
-
|
1656 |
-
# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
|
1657 |
-
# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
|
1658 |
-
# Label: "thawte Primary Root CA - G2"
|
1659 |
-
# Serial: 71758320672825410020661621085256472406
|
1660 |
-
# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
|
1661 |
-
# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
|
1662 |
-
# 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
|
1663 |
-
-----BEGIN CERTIFICATE-----
|
1664 |
-
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
|
1665 |
-
MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
|
1666 |
-
IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
|
1667 |
-
BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
|
1668 |
-
MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
|
1669 |
-
d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
|
1670 |
-
YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
|
1671 |
-
dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
|
1672 |
-
BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
|
1673 |
-
papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
|
1674 |
-
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
|
1675 |
-
DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
|
1676 |
-
KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
|
1677 |
-
XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
|
1678 |
-
-----END CERTIFICATE-----
|
1679 |
-
|
1680 |
-
# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
|
1681 |
-
# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
|
1682 |
-
# Label: "thawte Primary Root CA - G3"
|
1683 |
-
# Serial: 127614157056681299805556476275995414779
|
1684 |
-
# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
|
1685 |
-
# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
|
1686 |
-
# 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
|
1687 |
-
-----BEGIN CERTIFICATE-----
|
1688 |
-
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
|
1689 |
-
rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
|
1690 |
-
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
|
1691 |
-
MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
|
1692 |
-
BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
|
1693 |
-
Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
|
1694 |
-
LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
|
1695 |
-
MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
|
1696 |
-
ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
|
1697 |
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
|
1698 |
-
gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
|
1699 |
-
YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
|
1700 |
-
b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
|
1701 |
-
9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
|
1702 |
-
zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
|
1703 |
-
OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
|
1704 |
-
HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
|
1705 |
-
2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
|
1706 |
-
oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
|
1707 |
-
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
|
1708 |
-
KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
|
1709 |
-
m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
|
1710 |
-
MdRAGmI0Nj81Aa6sY6A=
|
1711 |
-
-----END CERTIFICATE-----
|
1712 |
-
|
1713 |
-
# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
|
1714 |
-
# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
|
1715 |
-
# Label: "GeoTrust Primary Certification Authority - G2"
|
1716 |
-
# Serial: 80682863203381065782177908751794619243
|
1717 |
-
# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
|
1718 |
-
# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
|
1719 |
-
# 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
|
1720 |
-
-----BEGIN CERTIFICATE-----
|
1721 |
-
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
|
1722 |
-
MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
|
1723 |
-
KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
|
1724 |
-
MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
1725 |
-
eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
|
1726 |
-
BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
|
1727 |
-
NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
|
1728 |
-
BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
|
1729 |
-
MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
|
1730 |
-
So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
|
1731 |
-
tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
|
1732 |
-
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
|
1733 |
-
CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
|
1734 |
-
qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
|
1735 |
-
rD6ogRLQy7rQkgu2npaqBA+K
|
1736 |
-
-----END CERTIFICATE-----
|
1737 |
-
|
1738 |
-
# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
|
1739 |
-
# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
|
1740 |
-
# Label: "VeriSign Universal Root Certification Authority"
|
1741 |
-
# Serial: 85209574734084581917763752644031726877
|
1742 |
-
# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
|
1743 |
-
# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
|
1744 |
-
# 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
|
1745 |
-
-----BEGIN CERTIFICATE-----
|
1746 |
-
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
|
1747 |
-
vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
1748 |
-
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
|
1749 |
-
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
|
1750 |
-
ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
|
1751 |
-
Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
|
1752 |
-
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
|
1753 |
-
IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
|
1754 |
-
IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
|
1755 |
-
bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
|
1756 |
-
AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
|
1757 |
-
9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
|
1758 |
-
H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
|
1759 |
-
LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
|
1760 |
-
/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
|
1761 |
-
rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
|
1762 |
-
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
|
1763 |
-
WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
|
1764 |
-
exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
|
1765 |
-
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
|
1766 |
-
sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
|
1767 |
-
seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
|
1768 |
-
4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
|
1769 |
-
BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
|
1770 |
-
lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
|
1771 |
-
7M2CYfE45k+XmCpajQ==
|
1772 |
-
-----END CERTIFICATE-----
|
1773 |
-
|
1774 |
-
# 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
|
1775 |
-
# 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
|
1776 |
-
# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
|
1777 |
-
# Serial: 63143484348153506665311985501458640051
|
1778 |
-
# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
|
1779 |
-
# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
|
1780 |
-
# 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
|
1781 |
-
-----BEGIN CERTIFICATE-----
|
1782 |
-
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
|
1783 |
-
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
|
1784 |
-
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
|
1785 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
|
1786 |
-
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
|
1787 |
-
aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
|
1788 |
-
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
|
1789 |
-
U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
|
1790 |
-
SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
|
1791 |
-
biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
1792 |
-
IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
|
1793 |
-
GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
|
1794 |
-
fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
|
1795 |
-
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
|
1796 |
-
aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
|
1797 |
-
aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
|
1798 |
-
kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
|
1799 |
-
4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
|
1800 |
-
FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
|
1801 |
-
-----END CERTIFICATE-----
|
1802 |
-
|
1803 |
-
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
1804 |
-
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
1805 |
-
# Label: "Verisign Class 3 Public Primary Certification Authority"
|
1806 |
-
# Serial: 80507572722862485515306429940691309246
|
1807 |
-
# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
|
1808 |
-
# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
|
1809 |
-
# 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
|
1810 |
-
-----BEGIN CERTIFICATE-----
|
1811 |
-
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
|
1812 |
-
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
1813 |
-
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
1814 |
-
MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
1815 |
-
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
1816 |
-
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
1817 |
-
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
1818 |
-
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
1819 |
-
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
1820 |
-
CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
|
1821 |
-
2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
|
1822 |
-
2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
|
1823 |
-
-----END CERTIFICATE-----
|
1824 |
-
|
1825 |
-
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
|
1826 |
-
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
|
1827 |
-
# Label: "GlobalSign Root CA - R3"
|
1828 |
-
# Serial: 4835703278459759426209954
|
1829 |
-
# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
|
1830 |
-
# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
|
1831 |
-
# 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
|
1832 |
-
-----BEGIN CERTIFICATE-----
|
1833 |
-
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
|
1834 |
-
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
|
1835 |
-
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
|
1836 |
-
MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
|
1837 |
-
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
|
1838 |
-
hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
|
1839 |
-
RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
|
1840 |
-
gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
|
1841 |
-
KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
|
1842 |
-
QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
|
1843 |
-
XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
|
1844 |
-
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
|
1845 |
-
LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
|
1846 |
-
RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
|
1847 |
-
jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
|
1848 |
-
6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
|
1849 |
-
mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
|
1850 |
-
Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
|
1851 |
-
WD9f
|
1852 |
-
-----END CERTIFICATE-----
|
1853 |
-
|
1854 |
-
# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1855 |
-
# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1856 |
-
# Label: "TC TrustCenter Universal CA III"
|
1857 |
-
# Serial: 2010889993983507346460533407902964
|
1858 |
-
# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b
|
1859 |
-
# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87
|
1860 |
-
# 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
|
1861 |
-
-----BEGIN CERTIFICATE-----
|
1862 |
-
MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
|
1863 |
-
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
|
1864 |
-
BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
|
1865 |
-
c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
|
1866 |
-
MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
|
1867 |
-
ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
|
1868 |
-
BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
|
1869 |
-
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
|
1870 |
-
5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
|
1871 |
-
DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
|
1872 |
-
zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
|
1873 |
-
yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
|
1874 |
-
dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
|
1875 |
-
MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
|
1876 |
-
Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
|
1877 |
-
4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
|
1878 |
-
dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
|
1879 |
-
aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
|
1880 |
-
DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
|
1881 |
-
CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
|
1882 |
-
LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
|
1883 |
-
-----END CERTIFICATE-----
|
1884 |
-
|
1885 |
-
# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
|
1886 |
-
# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
|
1887 |
-
# Label: "Go Daddy Root Certificate Authority - G2"
|
1888 |
-
# Serial: 0
|
1889 |
-
# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
|
1890 |
-
# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
|
1891 |
-
# 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
|
1892 |
-
-----BEGIN CERTIFICATE-----
|
1893 |
-
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
|
1894 |
-
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
|
1895 |
-
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
|
1896 |
-
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
|
1897 |
-
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
|
1898 |
-
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
|
1899 |
-
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
|
1900 |
-
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
|
1901 |
-
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
|
1902 |
-
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
|
1903 |
-
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
|
1904 |
-
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
|
1905 |
-
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
|
1906 |
-
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
|
1907 |
-
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
|
1908 |
-
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
|
1909 |
-
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
|
1910 |
-
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
|
1911 |
-
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
|
1912 |
-
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
|
1913 |
-
4uJEvlz36hz1
|
1914 |
-
-----END CERTIFICATE-----
|
1915 |
-
|
1916 |
-
# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1917 |
-
# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1918 |
-
# Label: "Starfield Root Certificate Authority - G2"
|
1919 |
-
# Serial: 0
|
1920 |
-
# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
|
1921 |
-
# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
|
1922 |
-
# 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
|
1923 |
-
-----BEGIN CERTIFICATE-----
|
1924 |
-
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
|
1925 |
-
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
|
1926 |
-
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
|
1927 |
-
ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
|
1928 |
-
MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
|
1929 |
-
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
|
1930 |
-
aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
|
1931 |
-
Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
1932 |
-
ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
|
1933 |
-
nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
|
1934 |
-
HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
|
1935 |
-
Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
|
1936 |
-
dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
|
1937 |
-
HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
|
1938 |
-
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
|
1939 |
-
CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
|
1940 |
-
sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
|
1941 |
-
4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
|
1942 |
-
8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
|
1943 |
-
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
|
1944 |
-
mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
|
1945 |
-
-----END CERTIFICATE-----
|
1946 |
-
|
1947 |
-
# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1948 |
-
# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1949 |
-
# Label: "Starfield Services Root Certificate Authority - G2"
|
1950 |
-
# Serial: 0
|
1951 |
-
# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
|
1952 |
-
# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
|
1953 |
-
# 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
|
1954 |
-
-----BEGIN CERTIFICATE-----
|
1955 |
-
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
|
1956 |
-
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
|
1957 |
-
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
|
1958 |
-
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
|
1959 |
-
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
|
1960 |
-
VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
|
1961 |
-
ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
|
1962 |
-
dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
|
1963 |
-
hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
|
1964 |
-
OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
|
1965 |
-
8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
|
1966 |
-
Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
|
1967 |
-
hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
|
1968 |
-
6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
|
1969 |
-
DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
|
1970 |
-
AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
|
1971 |
-
bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
|
1972 |
-
ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
|
1973 |
-
qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
|
1974 |
-
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
|
1975 |
-
0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
|
1976 |
-
sSi6
|
1977 |
-
-----END CERTIFICATE-----
|
1978 |
-
|
1979 |
-
# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
|
1980 |
-
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
|
1981 |
-
# Label: "AffirmTrust Commercial"
|
1982 |
-
# Serial: 8608355977964138876
|
1983 |
-
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
|
1984 |
-
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
|
1985 |
-
# 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
|
1986 |
-
-----BEGIN CERTIFICATE-----
|
1987 |
-
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
|
1988 |
-
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
1989 |
-
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
|
1990 |
-
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
1991 |
-
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
1992 |
-
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
|
1993 |
-
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
|
1994 |
-
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
|
1995 |
-
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
|
1996 |
-
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
|
1997 |
-
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
|
1998 |
-
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
1999 |
-
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
|
2000 |
-
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
|
2001 |
-
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
|
2002 |
-
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
|
2003 |
-
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
|
2004 |
-
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
2005 |
-
-----END CERTIFICATE-----
|
2006 |
-
|
2007 |
-
# Issuer: CN=AffirmTrust Networking O=AffirmTrust
|
2008 |
-
# Subject: CN=AffirmTrust Networking O=AffirmTrust
|
2009 |
-
# Label: "AffirmTrust Networking"
|
2010 |
-
# Serial: 8957382827206547757
|
2011 |
-
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
|
2012 |
-
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
|
2013 |
-
# 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
|
2014 |
-
-----BEGIN CERTIFICATE-----
|
2015 |
-
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
|
2016 |
-
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
2017 |
-
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
|
2018 |
-
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
2019 |
-
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
2020 |
-
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
|
2021 |
-
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
|
2022 |
-
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
|
2023 |
-
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
|
2024 |
-
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
|
2025 |
-
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
|
2026 |
-
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
2027 |
-
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
|
2028 |
-
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
|
2029 |
-
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
|
2030 |
-
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
|
2031 |
-
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
|
2032 |
-
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
2033 |
-
-----END CERTIFICATE-----
|
2034 |
-
|
2035 |
-
# Issuer: CN=AffirmTrust Premium O=AffirmTrust
|
2036 |
-
# Subject: CN=AffirmTrust Premium O=AffirmTrust
|
2037 |
-
# Label: "AffirmTrust Premium"
|
2038 |
-
# Serial: 7893706540734352110
|
2039 |
-
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
|
2040 |
-
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
|
2041 |
-
# 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
|
2042 |
-
-----BEGIN CERTIFICATE-----
|
2043 |
-
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
|
2044 |
-
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
|
2045 |
-
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
|
2046 |
-
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
|
2047 |
-
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
|
2048 |
-
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
|
2049 |
-
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
|
2050 |
-
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
|
2051 |
-
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
|
2052 |
-
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
|
2053 |
-
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
|
2054 |
-
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
|
2055 |
-
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
|
2056 |
-
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
|
2057 |
-
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
|
2058 |
-
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
|
2059 |
-
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
|
2060 |
-
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
|
2061 |
-
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
|
2062 |
-
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
|
2063 |
-
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
|
2064 |
-
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
|
2065 |
-
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
|
2066 |
-
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
|
2067 |
-
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
|
2068 |
-
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
|
2069 |
-
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
|
2070 |
-
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
|
2071 |
-
KeC2uAloGRwYQw==
|
2072 |
-
-----END CERTIFICATE-----
|
2073 |
-
|
2074 |
-
# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
|
2075 |
-
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
|
2076 |
-
# Label: "AffirmTrust Premium ECC"
|
2077 |
-
# Serial: 8401224907861490260
|
2078 |
-
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
|
2079 |
-
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
|
2080 |
-
# 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
|
2081 |
-
-----BEGIN CERTIFICATE-----
|
2082 |
-
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
|
2083 |
-
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
|
2084 |
-
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
|
2085 |
-
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
|
2086 |
-
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
|
2087 |
-
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
|
2088 |
-
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
|
2089 |
-
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
|
2090 |
-
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
|
2091 |
-
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
|
2092 |
-
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
|
2093 |
-
-----END CERTIFICATE-----
|
2094 |
-
|
2095 |
-
# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
2096 |
-
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
2097 |
-
# Label: "StartCom Certification Authority"
|
2098 |
-
# Serial: 45
|
2099 |
-
# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
|
2100 |
-
# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
|
2101 |
-
# 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
|
2102 |
-
-----BEGIN CERTIFICATE-----
|
2103 |
-
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
|
2104 |
-
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
|
2105 |
-
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
|
2106 |
-
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
|
2107 |
-
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
|
2108 |
-
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
|
2109 |
-
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
|
2110 |
-
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
|
2111 |
-
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
|
2112 |
-
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
|
2113 |
-
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
|
2114 |
-
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
|
2115 |
-
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
|
2116 |
-
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
|
2117 |
-
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
|
2118 |
-
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
|
2119 |
-
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
|
2120 |
-
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
|
2121 |
-
AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
|
2122 |
-
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
|
2123 |
-
F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
|
2124 |
-
ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
|
2125 |
-
ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
|
2126 |
-
aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
|
2127 |
-
YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
|
2128 |
-
c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
|
2129 |
-
aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
|
2130 |
-
d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
|
2131 |
-
CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
|
2132 |
-
dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
|
2133 |
-
wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
|
2134 |
-
Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
|
2135 |
-
0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
|
2136 |
-
pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
|
2137 |
-
CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
|
2138 |
-
P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
|
2139 |
-
1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
|
2140 |
-
KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
|
2141 |
-
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
|
2142 |
-
8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
|
2143 |
-
fyWl8kgAwKQB2j8=
|
2144 |
-
-----END CERTIFICATE-----
|
2145 |
-
|
2146 |
-
# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
|
2147 |
-
# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
|
2148 |
-
# Label: "StartCom Certification Authority G2"
|
2149 |
-
# Serial: 59
|
2150 |
-
# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
|
2151 |
-
# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
|
2152 |
-
# 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
|
2153 |
-
-----BEGIN CERTIFICATE-----
|
2154 |
-
MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
|
2155 |
-
MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
|
2156 |
-
aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
|
2157 |
-
OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
|
2158 |
-
A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
|
2159 |
-
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
|
2160 |
-
JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
|
2161 |
-
vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
|
2162 |
-
D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
|
2163 |
-
Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
|
2164 |
-
RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
|
2165 |
-
HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
|
2166 |
-
nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
|
2167 |
-
0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
|
2168 |
-
UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
|
2169 |
-
Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
|
2170 |
-
TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
|
2171 |
-
AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
|
2172 |
-
BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
|
2173 |
-
2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
|
2174 |
-
UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
|
2175 |
-
6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
|
2176 |
-
9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
|
2177 |
-
HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
|
2178 |
-
wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
|
2179 |
-
XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
|
2180 |
-
IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
|
2181 |
-
hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
|
2182 |
-
so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
|
2183 |
-
-----END CERTIFICATE-----
|
1 |
+
# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
|
2 |
+
# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
|
3 |
+
# Label: "GTE CyberTrust Global Root"
|
4 |
+
# Serial: 421
|
5 |
+
# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
|
6 |
+
# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
|
7 |
+
# 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
|
8 |
+
-----BEGIN CERTIFICATE-----
|
9 |
+
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
|
10 |
+
VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
|
11 |
+
bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
|
12 |
+
b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
|
13 |
+
UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
|
14 |
+
cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
|
15 |
+
b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
|
16 |
+
iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
|
17 |
+
r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
|
18 |
+
04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
|
19 |
+
GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
|
20 |
+
3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
|
21 |
+
lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
|
22 |
+
-----END CERTIFICATE-----
|
23 |
+
|
24 |
+
# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
|
25 |
+
# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
|
26 |
+
# Label: "Thawte Server CA"
|
27 |
+
# Serial: 1
|
28 |
+
# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
|
29 |
+
# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
|
30 |
+
# 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
|
31 |
+
-----BEGIN CERTIFICATE-----
|
32 |
+
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
|
33 |
+
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
34 |
+
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
35 |
+
biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
|
36 |
+
MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
|
37 |
+
MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
|
38 |
+
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
|
39 |
+
dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
|
40 |
+
cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
|
41 |
+
DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
|
42 |
+
gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
|
43 |
+
yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
|
44 |
+
L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
|
45 |
+
EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
|
46 |
+
7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
|
47 |
+
QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
|
48 |
+
qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
|
49 |
+
-----END CERTIFICATE-----
|
50 |
+
|
51 |
+
# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
|
52 |
+
# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
|
53 |
+
# Label: "Thawte Premium Server CA"
|
54 |
+
# Serial: 1
|
55 |
+
# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
|
56 |
+
# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
|
57 |
+
# 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
|
58 |
+
-----BEGIN CERTIFICATE-----
|
59 |
+
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
|
60 |
+
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
61 |
+
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
62 |
+
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
|
63 |
+
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
|
64 |
+
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
|
65 |
+
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
|
66 |
+
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
|
67 |
+
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
|
68 |
+
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
|
69 |
+
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
|
70 |
+
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
|
71 |
+
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
|
72 |
+
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
|
73 |
+
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
|
74 |
+
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
|
75 |
+
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
|
76 |
+
-----END CERTIFICATE-----
|
77 |
+
|
78 |
+
# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
|
79 |
+
# Subject: O=Equifax OU=Equifax Secure Certificate Authority
|
80 |
+
# Label: "Equifax Secure CA"
|
81 |
+
# Serial: 903804111
|
82 |
+
# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
|
83 |
+
# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
|
84 |
+
# 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
|
85 |
+
-----BEGIN CERTIFICATE-----
|
86 |
+
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
87 |
+
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
88 |
+
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
89 |
+
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
90 |
+
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
91 |
+
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
92 |
+
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
93 |
+
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
94 |
+
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
95 |
+
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
96 |
+
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
97 |
+
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
98 |
+
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
99 |
+
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
100 |
+
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
101 |
+
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
102 |
+
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
103 |
+
-----END CERTIFICATE-----
|
104 |
+
|
105 |
+
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
106 |
+
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
107 |
+
# Label: "Verisign Class 3 Public Primary Certification Authority"
|
108 |
+
# Serial: 149843929435818692848040365716851702463
|
109 |
+
# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
|
110 |
+
# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
|
111 |
+
# 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
|
112 |
+
-----BEGIN CERTIFICATE-----
|
113 |
+
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
|
114 |
+
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
115 |
+
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
116 |
+
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
117 |
+
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
118 |
+
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
119 |
+
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
120 |
+
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
121 |
+
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
122 |
+
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
|
123 |
+
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
|
124 |
+
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
|
125 |
+
-----END CERTIFICATE-----
|
126 |
+
|
127 |
+
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
|
128 |
+
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
|
129 |
+
# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
|
130 |
+
# Serial: 167285380242319648451154478808036881606
|
131 |
+
# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
|
132 |
+
# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
|
133 |
+
# 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
|
134 |
+
-----BEGIN CERTIFICATE-----
|
135 |
+
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
136 |
+
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
137 |
+
c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
138 |
+
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
139 |
+
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
140 |
+
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
141 |
+
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
|
142 |
+
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
143 |
+
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
144 |
+
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
145 |
+
AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
|
146 |
+
pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
|
147 |
+
13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
|
148 |
+
AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
|
149 |
+
U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
|
150 |
+
F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
|
151 |
+
oJ2daZH9
|
152 |
+
-----END CERTIFICATE-----
|
153 |
+
|
154 |
+
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
155 |
+
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
156 |
+
# Label: "GlobalSign Root CA"
|
157 |
+
# Serial: 4835703278459707669005204
|
158 |
+
# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
|
159 |
+
# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
|
160 |
+
# 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
|
161 |
+
-----BEGIN CERTIFICATE-----
|
162 |
+
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
|
163 |
+
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
|
164 |
+
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
|
165 |
+
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
|
166 |
+
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
|
167 |
+
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
|
168 |
+
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
|
169 |
+
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
|
170 |
+
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
|
171 |
+
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
|
172 |
+
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
|
173 |
+
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
|
174 |
+
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
|
175 |
+
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
|
176 |
+
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
|
177 |
+
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
|
178 |
+
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
|
179 |
+
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
|
180 |
+
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
|
181 |
+
-----END CERTIFICATE-----
|
182 |
+
|
183 |
+
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
|
184 |
+
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
|
185 |
+
# Label: "GlobalSign Root CA - R2"
|
186 |
+
# Serial: 4835703278459682885658125
|
187 |
+
# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
|
188 |
+
# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
|
189 |
+
# 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
|
190 |
+
-----BEGIN CERTIFICATE-----
|
191 |
+
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
|
192 |
+
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
|
193 |
+
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
|
194 |
+
MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
|
195 |
+
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
|
196 |
+
hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
|
197 |
+
v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
|
198 |
+
eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
|
199 |
+
tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
|
200 |
+
C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
|
201 |
+
zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
|
202 |
+
mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
|
203 |
+
V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
|
204 |
+
bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
|
205 |
+
3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
|
206 |
+
J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
|
207 |
+
291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
|
208 |
+
ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
|
209 |
+
AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
|
210 |
+
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
|
211 |
+
-----END CERTIFICATE-----
|
212 |
+
|
213 |
+
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
|
214 |
+
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
|
215 |
+
# Label: "ValiCert Class 1 VA"
|
216 |
+
# Serial: 1
|
217 |
+
# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
|
218 |
+
# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
|
219 |
+
# 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
|
220 |
+
-----BEGIN CERTIFICATE-----
|
221 |
+
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
222 |
+
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
223 |
+
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
224 |
+
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
225 |
+
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
|
226 |
+
NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
227 |
+
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
228 |
+
YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
229 |
+
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
230 |
+
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
|
231 |
+
LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
|
232 |
+
TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
|
233 |
+
TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
|
234 |
+
LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
|
235 |
+
I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
|
236 |
+
nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
|
237 |
+
-----END CERTIFICATE-----
|
238 |
+
|
239 |
+
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
|
240 |
+
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
|
241 |
+
# Label: "ValiCert Class 2 VA"
|
242 |
+
# Serial: 1
|
243 |
+
# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
|
244 |
+
# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
|
245 |
+
# 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
|
246 |
+
-----BEGIN CERTIFICATE-----
|
247 |
+
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
248 |
+
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
249 |
+
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
250 |
+
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
251 |
+
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
|
252 |
+
NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
253 |
+
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
254 |
+
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
255 |
+
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
256 |
+
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
|
257 |
+
dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
|
258 |
+
WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
|
259 |
+
v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
|
260 |
+
UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
|
261 |
+
IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
|
262 |
+
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
|
263 |
+
-----END CERTIFICATE-----
|
264 |
+
|
265 |
+
# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
|
266 |
+
# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
|
267 |
+
# Label: "RSA Root Certificate 1"
|
268 |
+
# Serial: 1
|
269 |
+
# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
|
270 |
+
# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
|
271 |
+
# 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
|
272 |
+
-----BEGIN CERTIFICATE-----
|
273 |
+
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
274 |
+
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
275 |
+
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
276 |
+
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
277 |
+
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
|
278 |
+
NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
279 |
+
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
280 |
+
YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
281 |
+
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
282 |
+
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
|
283 |
+
cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
|
284 |
+
2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
|
285 |
+
JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
|
286 |
+
Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
|
287 |
+
n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
|
288 |
+
PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
|
289 |
+
-----END CERTIFICATE-----
|
290 |
+
|
291 |
+
# 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
|
292 |
+
# 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
|
293 |
+
# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
|
294 |
+
# Serial: 206684696279472310254277870180966723415
|
295 |
+
# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
|
296 |
+
# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
|
297 |
+
# 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
|
298 |
+
-----BEGIN CERTIFICATE-----
|
299 |
+
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
300 |
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
301 |
+
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
302 |
+
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
303 |
+
aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
304 |
+
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
305 |
+
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
306 |
+
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
307 |
+
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
308 |
+
IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
309 |
+
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
|
310 |
+
N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
|
311 |
+
KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
|
312 |
+
kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
|
313 |
+
CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
|
314 |
+
Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
|
315 |
+
imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
|
316 |
+
2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
|
317 |
+
DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
318 |
+
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
|
319 |
+
F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
|
320 |
+
TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
321 |
+
-----END CERTIFICATE-----
|
322 |
+
|
323 |
+
# 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
|
324 |
+
# 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
|
325 |
+
# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
|
326 |
+
# Serial: 314531972711909413743075096039378935511
|
327 |
+
# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
|
328 |
+
# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
|
329 |
+
# 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
|
330 |
+
-----BEGIN CERTIFICATE-----
|
331 |
+
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
332 |
+
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
333 |
+
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
334 |
+
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
335 |
+
aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
336 |
+
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
337 |
+
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
338 |
+
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
339 |
+
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
340 |
+
IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
341 |
+
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
|
342 |
+
GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
|
343 |
+
+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
|
344 |
+
U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
|
345 |
+
NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
|
346 |
+
ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
|
347 |
+
ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
|
348 |
+
CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
|
349 |
+
g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
350 |
+
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
|
351 |
+
2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
|
352 |
+
bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
353 |
+
-----END CERTIFICATE-----
|
354 |
+
|
355 |
+
# 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
|
356 |
+
# 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
|
357 |
+
# Label: "Entrust.net Secure Server CA"
|
358 |
+
# Serial: 927650371
|
359 |
+
# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
|
360 |
+
# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
|
361 |
+
# 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
|
362 |
+
-----BEGIN CERTIFICATE-----
|
363 |
+
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
364 |
+
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
365 |
+
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
366 |
+
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
367 |
+
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
|
368 |
+
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
|
369 |
+
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
|
370 |
+
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
371 |
+
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
|
372 |
+
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
|
373 |
+
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
|
374 |
+
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
|
375 |
+
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
|
376 |
+
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
|
377 |
+
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
|
378 |
+
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
|
379 |
+
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
|
380 |
+
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
|
381 |
+
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
382 |
+
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
|
383 |
+
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
|
384 |
+
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
|
385 |
+
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
|
386 |
+
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
|
387 |
+
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
|
388 |
+
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
389 |
+
-----END CERTIFICATE-----
|
390 |
+
|
391 |
+
# 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
|
392 |
+
# 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
|
393 |
+
# Label: "Entrust.net Premium 2048 Secure Server CA"
|
394 |
+
# Serial: 946059622
|
395 |
+
# MD5 Fingerprint: ba:21:ea:20:d6:dd:db:8f:c1:57:8b:40:ad:a1:fc:fc
|
396 |
+
# SHA1 Fingerprint: 80:1d:62:d0:7b:44:9d:5c:5c:03:5c:98:ea:61:fa:44:3c:2a:58:fe
|
397 |
+
# 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
|
398 |
+
-----BEGIN CERTIFICATE-----
|
399 |
+
MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
400 |
+
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
401 |
+
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
402 |
+
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
403 |
+
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
|
404 |
+
MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
405 |
+
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
406 |
+
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
407 |
+
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
408 |
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
409 |
+
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
410 |
+
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
411 |
+
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
412 |
+
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
413 |
+
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
414 |
+
4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
|
415 |
+
vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
|
416 |
+
CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
|
417 |
+
WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
|
418 |
+
oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
|
419 |
+
h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
|
420 |
+
f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
|
421 |
+
B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
|
422 |
+
vUxFnmG6v4SBkgPR0ml8xQ==
|
423 |
+
-----END CERTIFICATE-----
|
424 |
+
|
425 |
+
# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
426 |
+
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
427 |
+
# Label: "Baltimore CyberTrust Root"
|
428 |
+
# Serial: 33554617
|
429 |
+
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
|
430 |
+
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
|
431 |
+
# 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
|
432 |
+
-----BEGIN CERTIFICATE-----
|
433 |
+
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
|
434 |
+
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
|
435 |
+
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
|
436 |
+
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
|
437 |
+
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
|
438 |
+
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
|
439 |
+
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
|
440 |
+
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
|
441 |
+
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
|
442 |
+
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
|
443 |
+
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
|
444 |
+
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
|
445 |
+
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
|
446 |
+
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
|
447 |
+
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
|
448 |
+
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
|
449 |
+
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
|
450 |
+
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
|
451 |
+
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
452 |
+
-----END CERTIFICATE-----
|
453 |
+
|
454 |
+
# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
|
455 |
+
# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
|
456 |
+
# Label: "Equifax Secure Global eBusiness CA"
|
457 |
+
# Serial: 1
|
458 |
+
# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
|
459 |
+
# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
|
460 |
+
# 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
|
461 |
+
-----BEGIN CERTIFICATE-----
|
462 |
+
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
|
463 |
+
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
|
464 |
+
ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
|
465 |
+
MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
|
466 |
+
dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
|
467 |
+
c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
|
468 |
+
UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
|
469 |
+
58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
|
470 |
+
o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
|
471 |
+
MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
|
472 |
+
aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
|
473 |
+
A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
|
474 |
+
Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
|
475 |
+
8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
|
476 |
+
-----END CERTIFICATE-----
|
477 |
+
|
478 |
+
# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
|
479 |
+
# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
|
480 |
+
# Label: "Equifax Secure eBusiness CA 1"
|
481 |
+
# Serial: 4
|
482 |
+
# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
|
483 |
+
# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
|
484 |
+
# 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
|
485 |
+
-----BEGIN CERTIFICATE-----
|
486 |
+
MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
|
487 |
+
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
|
488 |
+
ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
|
489 |
+
MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
|
490 |
+
LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
|
491 |
+
KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
|
492 |
+
RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
|
493 |
+
WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
|
494 |
+
Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
|
495 |
+
AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
|
496 |
+
eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
|
497 |
+
zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
|
498 |
+
WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
|
499 |
+
/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
|
500 |
+
-----END CERTIFICATE-----
|
501 |
+
|
502 |
+
# Issuer: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
|
503 |
+
# Subject: O=Equifax Secure OU=Equifax Secure eBusiness CA-2
|
504 |
+
# Label: "Equifax Secure eBusiness CA 2"
|
505 |
+
# Serial: 930140085
|
506 |
+
# MD5 Fingerprint: aa:bf:bf:64:97:da:98:1d:6f:c6:08:3a:95:70:33:ca
|
507 |
+
# SHA1 Fingerprint: 39:4f:f6:85:0b:06:be:52:e5:18:56:cc:10:e1:80:e8:82:b3:85:cc
|
508 |
+
# 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
|
509 |
+
-----BEGIN CERTIFICATE-----
|
510 |
+
MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
511 |
+
UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
|
512 |
+
dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
|
513 |
+
NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
|
514 |
+
VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
|
515 |
+
AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
|
516 |
+
vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
|
517 |
+
BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
|
518 |
+
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
|
519 |
+
MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
|
520 |
+
IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
|
521 |
+
NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
|
522 |
+
y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
|
523 |
+
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
524 |
+
A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
|
525 |
+
0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
|
526 |
+
E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
|
527 |
+
-----END CERTIFICATE-----
|
528 |
+
|
529 |
+
# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
|
530 |
+
# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
|
531 |
+
# Label: "AddTrust Low-Value Services Root"
|
532 |
+
# Serial: 1
|
533 |
+
# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
|
534 |
+
# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
|
535 |
+
# 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
|
536 |
+
-----BEGIN CERTIFICATE-----
|
537 |
+
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
|
538 |
+
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
539 |
+
b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
|
540 |
+
MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
541 |
+
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
|
542 |
+
VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
|
543 |
+
A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
|
544 |
+
CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
|
545 |
+
tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
|
546 |
+
dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
|
547 |
+
PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
|
548 |
+
+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
|
549 |
+
BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
|
550 |
+
BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
|
551 |
+
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
|
552 |
+
ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
|
553 |
+
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
|
554 |
+
7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
|
555 |
+
43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
|
556 |
+
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
|
557 |
+
pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
|
558 |
+
WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
|
559 |
+
-----END CERTIFICATE-----
|
560 |
+
|
561 |
+
# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
|
562 |
+
# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
|
563 |
+
# Label: "AddTrust External Root"
|
564 |
+
# Serial: 1
|
565 |
+
# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
|
566 |
+
# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
|
567 |
+
# 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
|
568 |
+
-----BEGIN CERTIFICATE-----
|
569 |
+
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
|
570 |
+
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
|
571 |
+
IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
|
572 |
+
MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
|
573 |
+
FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
|
574 |
+
bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
|
575 |
+
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
|
576 |
+
H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
|
577 |
+
uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
|
578 |
+
mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
|
579 |
+
a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
|
580 |
+
E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
|
581 |
+
WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
|
582 |
+
VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
|
583 |
+
Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
|
584 |
+
cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
|
585 |
+
IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
|
586 |
+
AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
|
587 |
+
YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
588 |
+
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
|
589 |
+
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
|
590 |
+
c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
|
591 |
+
mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
592 |
+
-----END CERTIFICATE-----
|
593 |
+
|
594 |
+
# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
|
595 |
+
# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
|
596 |
+
# Label: "AddTrust Public Services Root"
|
597 |
+
# Serial: 1
|
598 |
+
# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
|
599 |
+
# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
|
600 |
+
# 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
|
601 |
+
-----BEGIN CERTIFICATE-----
|
602 |
+
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
|
603 |
+
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
604 |
+
b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
|
605 |
+
MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
|
606 |
+
ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
|
607 |
+
BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
|
608 |
+
AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
|
609 |
+
6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
|
610 |
+
GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
|
611 |
+
dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
|
612 |
+
1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
|
613 |
+
62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
|
614 |
+
BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
|
615 |
+
AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
|
616 |
+
MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
|
617 |
+
cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
|
618 |
+
b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
|
619 |
+
IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
|
620 |
+
iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
|
621 |
+
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
|
622 |
+
4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
|
623 |
+
XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
|
624 |
+
-----END CERTIFICATE-----
|
625 |
+
|
626 |
+
# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
|
627 |
+
# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
|
628 |
+
# Label: "AddTrust Qualified Certificates Root"
|
629 |
+
# Serial: 1
|
630 |
+
# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
|
631 |
+
# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
|
632 |
+
# 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
|
633 |
+
-----BEGIN CERTIFICATE-----
|
634 |
+
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
|
635 |
+
MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
|
636 |
+
b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
|
637 |
+
MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
|
638 |
+
EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
|
639 |
+
BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
|
640 |
+
AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
|
641 |
+
xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
|
642 |
+
87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
|
643 |
+
2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
|
644 |
+
WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
|
645 |
+
0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
|
646 |
+
A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
|
647 |
+
AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
|
648 |
+
pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
|
649 |
+
ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
|
650 |
+
aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
|
651 |
+
hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
|
652 |
+
hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
|
653 |
+
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
|
654 |
+
P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
|
655 |
+
iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
|
656 |
+
xqE=
|
657 |
+
-----END CERTIFICATE-----
|
658 |
+
|
659 |
+
# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
660 |
+
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
661 |
+
# Label: "Entrust Root Certification Authority"
|
662 |
+
# Serial: 1164660820
|
663 |
+
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
|
664 |
+
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
|
665 |
+
# 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
|
666 |
+
-----BEGIN CERTIFICATE-----
|
667 |
+
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
|
668 |
+
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
669 |
+
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
670 |
+
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
671 |
+
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
|
672 |
+
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
|
673 |
+
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
|
674 |
+
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
|
675 |
+
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
|
676 |
+
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
|
677 |
+
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
|
678 |
+
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
|
679 |
+
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
|
680 |
+
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
|
681 |
+
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
|
682 |
+
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
|
683 |
+
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
|
684 |
+
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
|
685 |
+
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
686 |
+
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
|
687 |
+
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
|
688 |
+
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
|
689 |
+
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
|
690 |
+
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
|
691 |
+
0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
692 |
+
-----END CERTIFICATE-----
|
693 |
+
|
694 |
+
# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
|
695 |
+
# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
|
696 |
+
# Label: "GeoTrust Global CA"
|
697 |
+
# Serial: 144470
|
698 |
+
# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
|
699 |
+
# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
|
700 |
+
# 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
|
701 |
+
-----BEGIN CERTIFICATE-----
|
702 |
+
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
|
703 |
+
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
|
704 |
+
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
|
705 |
+
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
|
706 |
+
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
|
707 |
+
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
|
708 |
+
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
|
709 |
+
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
|
710 |
+
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
|
711 |
+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
|
712 |
+
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
|
713 |
+
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
|
714 |
+
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
|
715 |
+
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
|
716 |
+
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
|
717 |
+
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
|
718 |
+
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
|
719 |
+
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
|
720 |
+
-----END CERTIFICATE-----
|
721 |
+
|
722 |
+
# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
|
723 |
+
# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
|
724 |
+
# Label: "GeoTrust Global CA 2"
|
725 |
+
# Serial: 1
|
726 |
+
# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
|
727 |
+
# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
|
728 |
+
# 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
|
729 |
+
-----BEGIN CERTIFICATE-----
|
730 |
+
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
|
731 |
+
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
|
732 |
+
IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
|
733 |
+
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
|
734 |
+
R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
|
735 |
+
PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
|
736 |
+
Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
|
737 |
+
TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
|
738 |
+
5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
|
739 |
+
S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
|
740 |
+
2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
|
741 |
+
FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
|
742 |
+
EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
|
743 |
+
EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
|
744 |
+
/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
|
745 |
+
A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
|
746 |
+
abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
|
747 |
+
I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
|
748 |
+
4iIprn2DQKi6bA==
|
749 |
+
-----END CERTIFICATE-----
|
750 |
+
|
751 |
+
# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
|
752 |
+
# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
|
753 |
+
# Label: "GeoTrust Universal CA"
|
754 |
+
# Serial: 1
|
755 |
+
# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
|
756 |
+
# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
|
757 |
+
# 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
|
758 |
+
-----BEGIN CERTIFICATE-----
|
759 |
+
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
|
760 |
+
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
|
761 |
+
c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
|
762 |
+
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
|
763 |
+
IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
|
764 |
+
VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
|
765 |
+
cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
|
766 |
+
QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
|
767 |
+
F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
|
768 |
+
c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
|
769 |
+
mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
|
770 |
+
VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
|
771 |
+
teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
|
772 |
+
f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
|
773 |
+
Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
|
774 |
+
nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
|
775 |
+
/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
|
776 |
+
MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
|
777 |
+
9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
|
778 |
+
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
|
779 |
+
IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
|
780 |
+
ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
|
781 |
+
uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
|
782 |
+
Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
|
783 |
+
QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
|
784 |
+
koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
|
785 |
+
ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
|
786 |
+
DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
|
787 |
+
bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
|
788 |
+
-----END CERTIFICATE-----
|
789 |
+
|
790 |
+
# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
|
791 |
+
# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
|
792 |
+
# Label: "GeoTrust Universal CA 2"
|
793 |
+
# Serial: 1
|
794 |
+
# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
|
795 |
+
# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
|
796 |
+
# 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
|
797 |
+
-----BEGIN CERTIFICATE-----
|
798 |
+
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
|
799 |
+
MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
|
800 |
+
c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
|
801 |
+
VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
|
802 |
+
c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
803 |
+
AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
|
804 |
+
WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
|
805 |
+
FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
|
806 |
+
XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
|
807 |
+
se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
|
808 |
+
KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
|
809 |
+
IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
|
810 |
+
y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
|
811 |
+
hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
|
812 |
+
QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
|
813 |
+
Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
|
814 |
+
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
|
815 |
+
HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
|
816 |
+
KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
|
817 |
+
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
|
818 |
+
L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
|
819 |
+
Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
|
820 |
+
ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
|
821 |
+
T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
|
822 |
+
GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
|
823 |
+
1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
|
824 |
+
OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
|
825 |
+
6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
|
826 |
+
QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
|
827 |
+
-----END CERTIFICATE-----
|
828 |
+
|
829 |
+
# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
|
830 |
+
# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
|
831 |
+
# Label: "America Online Root Certification Authority 1"
|
832 |
+
# Serial: 1
|
833 |
+
# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
|
834 |
+
# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
|
835 |
+
# 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
|
836 |
+
-----BEGIN CERTIFICATE-----
|
837 |
+
MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
|
838 |
+
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
|
839 |
+
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
|
840 |
+
MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
|
841 |
+
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
|
842 |
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
843 |
+
ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
|
844 |
+
hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
|
845 |
+
1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
|
846 |
+
OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
|
847 |
+
2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
|
848 |
+
O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
|
849 |
+
AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
|
850 |
+
AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
|
851 |
+
BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
|
852 |
+
Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
|
853 |
+
LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
|
854 |
+
oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
|
855 |
+
MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
|
856 |
+
sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
|
857 |
+
-----END CERTIFICATE-----
|
858 |
+
|
859 |
+
# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
|
860 |
+
# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
|
861 |
+
# Label: "America Online Root Certification Authority 2"
|
862 |
+
# Serial: 1
|
863 |
+
# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
|
864 |
+
# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
|
865 |
+
# 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
|
866 |
+
-----BEGIN CERTIFICATE-----
|
867 |
+
MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
|
868 |
+
MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
|
869 |
+
bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
|
870 |
+
MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
|
871 |
+
ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
|
872 |
+
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
873 |
+
ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
|
874 |
+
206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
|
875 |
+
KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
|
876 |
+
JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
|
877 |
+
BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
|
878 |
+
Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
|
879 |
+
PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
|
880 |
+
Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
|
881 |
+
Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
|
882 |
+
o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
|
883 |
+
+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
|
884 |
+
YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
|
885 |
+
FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
|
886 |
+
AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
|
887 |
+
xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
|
888 |
+
LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
|
889 |
+
obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
|
890 |
+
CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
|
891 |
+
IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
|
892 |
+
DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
|
893 |
+
AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
|
894 |
+
Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
|
895 |
+
AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
|
896 |
+
Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
|
897 |
+
RY8mkaKO/qk=
|
898 |
+
-----END CERTIFICATE-----
|
899 |
+
|
900 |
+
# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
|
901 |
+
# Subject: CN=AAA Certificate Services O=Comodo CA Limited
|
902 |
+
# Label: "Comodo AAA Services root"
|
903 |
+
# Serial: 1
|
904 |
+
# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
|
905 |
+
# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
|
906 |
+
# 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
|
907 |
+
-----BEGIN CERTIFICATE-----
|
908 |
+
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
|
909 |
+
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
910 |
+
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
|
911 |
+
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
|
912 |
+
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
|
913 |
+
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
|
914 |
+
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
915 |
+
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
|
916 |
+
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
|
917 |
+
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
|
918 |
+
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
|
919 |
+
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
|
920 |
+
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
|
921 |
+
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
|
922 |
+
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
|
923 |
+
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
|
924 |
+
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
|
925 |
+
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
|
926 |
+
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
|
927 |
+
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
|
928 |
+
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
|
929 |
+
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
|
930 |
+
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
|
931 |
+
-----END CERTIFICATE-----
|
932 |
+
|
933 |
+
# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
|
934 |
+
# Subject: CN=Secure Certificate Services O=Comodo CA Limited
|
935 |
+
# Label: "Comodo Secure Services root"
|
936 |
+
# Serial: 1
|
937 |
+
# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
|
938 |
+
# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
|
939 |
+
# 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
|
940 |
+
-----BEGIN CERTIFICATE-----
|
941 |
+
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
|
942 |
+
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
943 |
+
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
|
944 |
+
ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
|
945 |
+
fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
946 |
+
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
|
947 |
+
BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
|
948 |
+
BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
|
949 |
+
cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
|
950 |
+
HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
|
951 |
+
CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
|
952 |
+
3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
|
953 |
+
6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
|
954 |
+
HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
|
955 |
+
EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
|
956 |
+
Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
|
957 |
+
Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
|
958 |
+
DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
|
959 |
+
5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
|
960 |
+
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
|
961 |
+
gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
|
962 |
+
aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
|
963 |
+
izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
|
964 |
+
-----END CERTIFICATE-----
|
965 |
+
|
966 |
+
# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
|
967 |
+
# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
|
968 |
+
# Label: "Comodo Trusted Services root"
|
969 |
+
# Serial: 1
|
970 |
+
# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
|
971 |
+
# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
|
972 |
+
# 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
|
973 |
+
-----BEGIN CERTIFICATE-----
|
974 |
+
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
|
975 |
+
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
|
976 |
+
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
|
977 |
+
aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
|
978 |
+
MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
979 |
+
BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
|
980 |
+
VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
|
981 |
+
AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
|
982 |
+
fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
|
983 |
+
TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
|
984 |
+
fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
|
985 |
+
1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
|
986 |
+
kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
|
987 |
+
A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
|
988 |
+
VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
|
989 |
+
ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
|
990 |
+
dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
|
991 |
+
Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
|
992 |
+
HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
|
993 |
+
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
|
994 |
+
jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
|
995 |
+
xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
|
996 |
+
dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
|
997 |
+
-----END CERTIFICATE-----
|
998 |
+
|
999 |
+
# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
|
1000 |
+
# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
|
1001 |
+
# Label: "UTN DATACorp SGC Root CA"
|
1002 |
+
# Serial: 91374294542884689855167577680241077609
|
1003 |
+
# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
|
1004 |
+
# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
|
1005 |
+
# 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
|
1006 |
+
-----BEGIN CERTIFICATE-----
|
1007 |
+
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
|
1008 |
+
kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
|
1009 |
+
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
|
1010 |
+
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
|
1011 |
+
IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
|
1012 |
+
EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
|
1013 |
+
VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
|
1014 |
+
dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
|
1015 |
+
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
|
1016 |
+
E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
|
1017 |
+
D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
|
1018 |
+
4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
|
1019 |
+
lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
|
1020 |
+
bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
|
1021 |
+
o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
|
1022 |
+
MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
|
1023 |
+
LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
|
1024 |
+
BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
|
1025 |
+
AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
|
1026 |
+
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
|
1027 |
+
j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
|
1028 |
+
KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
|
1029 |
+
2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
|
1030 |
+
mfnGV/TJVTl4uix5yaaIK/QI
|
1031 |
+
-----END CERTIFICATE-----
|
1032 |
+
|
1033 |
+
# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
|
1034 |
+
# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
|
1035 |
+
# Label: "UTN USERFirst Hardware Root CA"
|
1036 |
+
# Serial: 91374294542884704022267039221184531197
|
1037 |
+
# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
|
1038 |
+
# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
|
1039 |
+
# 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
|
1040 |
+
-----BEGIN CERTIFICATE-----
|
1041 |
+
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
|
1042 |
+
lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
|
1043 |
+
Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
|
1044 |
+
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
|
1045 |
+
SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
|
1046 |
+
A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
|
1047 |
+
MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
|
1048 |
+
d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
|
1049 |
+
cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
|
1050 |
+
0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
|
1051 |
+
M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
|
1052 |
+
MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
|
1053 |
+
oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
|
1054 |
+
DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
|
1055 |
+
oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
|
1056 |
+
VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
|
1057 |
+
dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
|
1058 |
+
bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
|
1059 |
+
BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
|
1060 |
+
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
|
1061 |
+
CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
|
1062 |
+
CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
|
1063 |
+
3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
|
1064 |
+
KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
|
1065 |
+
-----END CERTIFICATE-----
|
1066 |
+
|
1067 |
+
# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
|
1068 |
+
# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
|
1069 |
+
# Label: "XRamp Global CA Root"
|
1070 |
+
# Serial: 107108908803651509692980124233745014957
|
1071 |
+
# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
|
1072 |
+
# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
|
1073 |
+
# 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
|
1074 |
+
-----BEGIN CERTIFICATE-----
|
1075 |
+
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
|
1076 |
+
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
|
1077 |
+
MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
|
1078 |
+
UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
|
1079 |
+
NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
|
1080 |
+
dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
|
1081 |
+
dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
|
1082 |
+
dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
|
1083 |
+
38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
|
1084 |
+
KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
|
1085 |
+
DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
|
1086 |
+
qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
|
1087 |
+
JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
|
1088 |
+
PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
|
1089 |
+
BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
|
1090 |
+
jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
|
1091 |
+
eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
|
1092 |
+
ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
|
1093 |
+
vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
|
1094 |
+
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
|
1095 |
+
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
|
1096 |
+
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
|
1097 |
+
O+7ETPTsJ3xCwnR8gooJybQDJbw=
|
1098 |
+
-----END CERTIFICATE-----
|
1099 |
+
|
1100 |
+
# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
|
1101 |
+
# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
|
1102 |
+
# Label: "Go Daddy Class 2 CA"
|
1103 |
+
# Serial: 0
|
1104 |
+
# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
|
1105 |
+
# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
|
1106 |
+
# 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
|
1107 |
+
-----BEGIN CERTIFICATE-----
|
1108 |
+
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
|
1109 |
+
MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
|
1110 |
+
YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
|
1111 |
+
MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
|
1112 |
+
ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
|
1113 |
+
MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
|
1114 |
+
ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
|
1115 |
+
PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
|
1116 |
+
wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
|
1117 |
+
EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
|
1118 |
+
avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
|
1119 |
+
YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
|
1120 |
+
sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
|
1121 |
+
/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
|
1122 |
+
IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
|
1123 |
+
YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
|
1124 |
+
ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
|
1125 |
+
OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
|
1126 |
+
TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
|
1127 |
+
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
|
1128 |
+
dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
|
1129 |
+
ReYNnyicsbkqWletNw+vHX/bvZ8=
|
1130 |
+
-----END CERTIFICATE-----
|
1131 |
+
|
1132 |
+
# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
|
1133 |
+
# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
|
1134 |
+
# Label: "Starfield Class 2 CA"
|
1135 |
+
# Serial: 0
|
1136 |
+
# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
|
1137 |
+
# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
|
1138 |
+
# 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
|
1139 |
+
-----BEGIN CERTIFICATE-----
|
1140 |
+
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
|
1141 |
+
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
|
1142 |
+
U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
|
1143 |
+
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
|
1144 |
+
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
|
1145 |
+
ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
|
1146 |
+
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
|
1147 |
+
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
|
1148 |
+
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
|
1149 |
+
X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
|
1150 |
+
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
|
1151 |
+
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
|
1152 |
+
A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
|
1153 |
+
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
|
1154 |
+
YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
|
1155 |
+
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
|
1156 |
+
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
|
1157 |
+
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
|
1158 |
+
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
|
1159 |
+
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
|
1160 |
+
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
|
1161 |
+
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
|
1162 |
+
-----END CERTIFICATE-----
|
1163 |
+
|
1164 |
+
# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
1165 |
+
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
1166 |
+
# Label: "StartCom Certification Authority"
|
1167 |
+
# Serial: 1
|
1168 |
+
# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
|
1169 |
+
# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
|
1170 |
+
# 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
|
1171 |
+
-----BEGIN CERTIFICATE-----
|
1172 |
+
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
|
1173 |
+
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
|
1174 |
+
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
|
1175 |
+
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
|
1176 |
+
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
|
1177 |
+
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
|
1178 |
+
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
|
1179 |
+
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
|
1180 |
+
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
|
1181 |
+
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
|
1182 |
+
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
|
1183 |
+
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
|
1184 |
+
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
|
1185 |
+
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
|
1186 |
+
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
|
1187 |
+
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
|
1188 |
+
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
|
1189 |
+
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
|
1190 |
+
AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
|
1191 |
+
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
|
1192 |
+
ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
|
1193 |
+
LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
|
1194 |
+
BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
|
1195 |
+
Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
|
1196 |
+
dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
|
1197 |
+
cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
|
1198 |
+
YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
|
1199 |
+
dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
|
1200 |
+
bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
|
1201 |
+
YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
|
1202 |
+
TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
|
1203 |
+
9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
|
1204 |
+
jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
|
1205 |
+
FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
|
1206 |
+
ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
|
1207 |
+
ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
|
1208 |
+
EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
|
1209 |
+
L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
|
1210 |
+
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
|
1211 |
+
O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
|
1212 |
+
um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
|
1213 |
+
NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
|
1214 |
+
-----END CERTIFICATE-----
|
1215 |
+
|
1216 |
+
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
1217 |
+
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
1218 |
+
# Label: "DigiCert Assured ID Root CA"
|
1219 |
+
# Serial: 17154717934120587862167794914071425081
|
1220 |
+
# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
|
1221 |
+
# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
|
1222 |
+
# 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
|
1223 |
+
-----BEGIN CERTIFICATE-----
|
1224 |
+
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
|
1225 |
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1226 |
+
d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
|
1227 |
+
b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
|
1228 |
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
|
1229 |
+
cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
|
1230 |
+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
|
1231 |
+
JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
|
1232 |
+
mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
|
1233 |
+
wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
|
1234 |
+
VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
|
1235 |
+
AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
|
1236 |
+
AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
|
1237 |
+
BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
|
1238 |
+
pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
|
1239 |
+
dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
|
1240 |
+
fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
|
1241 |
+
NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
|
1242 |
+
H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
|
1243 |
+
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
|
1244 |
+
-----END CERTIFICATE-----
|
1245 |
+
|
1246 |
+
# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
|
1247 |
+
# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
|
1248 |
+
# Label: "DigiCert Global Root CA"
|
1249 |
+
# Serial: 10944719598952040374951832963794454346
|
1250 |
+
# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
|
1251 |
+
# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
|
1252 |
+
# 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
|
1253 |
+
-----BEGIN CERTIFICATE-----
|
1254 |
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
1255 |
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1256 |
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
1257 |
+
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
1258 |
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
1259 |
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
1260 |
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
1261 |
+
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
1262 |
+
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
1263 |
+
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
1264 |
+
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
1265 |
+
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
1266 |
+
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
1267 |
+
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
1268 |
+
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
1269 |
+
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
1270 |
+
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
1271 |
+
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
1272 |
+
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
1273 |
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
1274 |
+
-----END CERTIFICATE-----
|
1275 |
+
|
1276 |
+
# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
|
1277 |
+
# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
|
1278 |
+
# Label: "DigiCert High Assurance EV Root CA"
|
1279 |
+
# Serial: 3553400076410547919724730734378100087
|
1280 |
+
# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
|
1281 |
+
# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
|
1282 |
+
# 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
|
1283 |
+
-----BEGIN CERTIFICATE-----
|
1284 |
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
|
1285 |
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
1286 |
+
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
|
1287 |
+
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
|
1288 |
+
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
|
1289 |
+
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
|
1290 |
+
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
|
1291 |
+
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
|
1292 |
+
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
|
1293 |
+
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
|
1294 |
+
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
|
1295 |
+
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
|
1296 |
+
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
|
1297 |
+
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
|
1298 |
+
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
|
1299 |
+
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
|
1300 |
+
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
|
1301 |
+
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
|
1302 |
+
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
1303 |
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
|
1304 |
+
+OkuE6N36B9K
|
1305 |
+
-----END CERTIFICATE-----
|
1306 |
+
|
1307 |
+
# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
|
1308 |
+
# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
|
1309 |
+
# Label: "GeoTrust Primary Certification Authority"
|
1310 |
+
# Serial: 32798226551256963324313806436981982369
|
1311 |
+
# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
|
1312 |
+
# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
|
1313 |
+
# 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
|
1314 |
+
-----BEGIN CERTIFICATE-----
|
1315 |
+
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
|
1316 |
+
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
|
1317 |
+
R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
|
1318 |
+
MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
|
1319 |
+
Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
|
1320 |
+
ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
1321 |
+
AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
|
1322 |
+
AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
|
1323 |
+
ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
|
1324 |
+
7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
|
1325 |
+
kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
|
1326 |
+
mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
|
1327 |
+
A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
|
1328 |
+
KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
|
1329 |
+
6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
|
1330 |
+
4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
|
1331 |
+
oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
|
1332 |
+
UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
|
1333 |
+
AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
|
1334 |
+
-----END CERTIFICATE-----
|
1335 |
+
|
1336 |
+
# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
|
1337 |
+
# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
|
1338 |
+
# Label: "thawte Primary Root CA"
|
1339 |
+
# Serial: 69529181992039203566298953787712940909
|
1340 |
+
# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
|
1341 |
+
# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
|
1342 |
+
# 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
|
1343 |
+
-----BEGIN CERTIFICATE-----
|
1344 |
+
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
|
1345 |
+
qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
|
1346 |
+
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
|
1347 |
+
MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
|
1348 |
+
BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
|
1349 |
+
NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
|
1350 |
+
LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
|
1351 |
+
A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
1352 |
+
IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
|
1353 |
+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
|
1354 |
+
W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
|
1355 |
+
3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
|
1356 |
+
6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
|
1357 |
+
Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
|
1358 |
+
NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
|
1359 |
+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
|
1360 |
+
r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
|
1361 |
+
DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
|
1362 |
+
YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
|
1363 |
+
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
|
1364 |
+
/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
|
1365 |
+
LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
|
1366 |
+
jVaMaA==
|
1367 |
+
-----END CERTIFICATE-----
|
1368 |
+
|
1369 |
+
# 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
|
1370 |
+
# 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
|
1371 |
+
# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
|
1372 |
+
# Serial: 33037644167568058970164719475676101450
|
1373 |
+
# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
|
1374 |
+
# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
|
1375 |
+
# 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
|
1376 |
+
-----BEGIN CERTIFICATE-----
|
1377 |
+
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
|
1378 |
+
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
1379 |
+
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
|
1380 |
+
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
|
1381 |
+
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
|
1382 |
+
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
|
1383 |
+
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
|
1384 |
+
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
|
1385 |
+
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
|
1386 |
+
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
|
1387 |
+
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
|
1388 |
+
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
|
1389 |
+
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
|
1390 |
+
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
|
1391 |
+
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
|
1392 |
+
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
|
1393 |
+
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
|
1394 |
+
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
|
1395 |
+
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
1396 |
+
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
|
1397 |
+
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
|
1398 |
+
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
|
1399 |
+
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
|
1400 |
+
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
|
1401 |
+
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
|
1402 |
+
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
1403 |
+
-----END CERTIFICATE-----
|
1404 |
+
|
1405 |
+
# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
|
1406 |
+
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
|
1407 |
+
# Label: "COMODO Certification Authority"
|
1408 |
+
# Serial: 104350513648249232941998508985834464573
|
1409 |
+
# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
|
1410 |
+
# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
|
1411 |
+
# 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
|
1412 |
+
-----BEGIN CERTIFICATE-----
|
1413 |
+
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
|
1414 |
+
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
1415 |
+
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
|
1416 |
+
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
|
1417 |
+
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
|
1418 |
+
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
|
1419 |
+
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
|
1420 |
+
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
|
1421 |
+
UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
|
1422 |
+
2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
|
1423 |
+
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
|
1424 |
+
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
|
1425 |
+
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
|
1426 |
+
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
|
1427 |
+
/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
|
1428 |
+
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
|
1429 |
+
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
|
1430 |
+
SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
|
1431 |
+
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
|
1432 |
+
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
|
1433 |
+
zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
|
1434 |
+
BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
|
1435 |
+
ZQ==
|
1436 |
+
-----END CERTIFICATE-----
|
1437 |
+
|
1438 |
+
# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
1439 |
+
# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
1440 |
+
# Label: "Network Solutions Certificate Authority"
|
1441 |
+
# Serial: 116697915152937497490437556386812487904
|
1442 |
+
# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
|
1443 |
+
# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
|
1444 |
+
# 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
|
1445 |
+
-----BEGIN CERTIFICATE-----
|
1446 |
+
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
|
1447 |
+
MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
|
1448 |
+
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
|
1449 |
+
dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
|
1450 |
+
UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
|
1451 |
+
ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
|
1452 |
+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
|
1453 |
+
c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
|
1454 |
+
OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
|
1455 |
+
mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
|
1456 |
+
BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
|
1457 |
+
qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
|
1458 |
+
gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
|
1459 |
+
BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
|
1460 |
+
bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
|
1461 |
+
dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
|
1462 |
+
6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
|
1463 |
+
h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
|
1464 |
+
/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
|
1465 |
+
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
|
1466 |
+
pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
|
1467 |
+
-----END CERTIFICATE-----
|
1468 |
+
|
1469 |
+
# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
1470 |
+
# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
1471 |
+
# Label: "COMODO ECC Certification Authority"
|
1472 |
+
# Serial: 41578283867086692638256921589707938090
|
1473 |
+
# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
|
1474 |
+
# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
|
1475 |
+
# 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
|
1476 |
+
-----BEGIN CERTIFICATE-----
|
1477 |
+
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
|
1478 |
+
MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
|
1479 |
+
BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
|
1480 |
+
IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
|
1481 |
+
MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
|
1482 |
+
ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
|
1483 |
+
T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
|
1484 |
+
biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
|
1485 |
+
FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
|
1486 |
+
cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
|
1487 |
+
BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
|
1488 |
+
BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
|
1489 |
+
fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
|
1490 |
+
GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
|
1491 |
+
-----END CERTIFICATE-----
|
1492 |
+
|
1493 |
+
# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
|
1494 |
+
# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
|
1495 |
+
# Label: "TC TrustCenter Class 2 CA II"
|
1496 |
+
# Serial: 941389028203453866782103406992443
|
1497 |
+
# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
|
1498 |
+
# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
|
1499 |
+
# 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
|
1500 |
+
-----BEGIN CERTIFICATE-----
|
1501 |
+
MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
|
1502 |
+
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
|
1503 |
+
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
|
1504 |
+
Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
|
1505 |
+
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
|
1506 |
+
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
|
1507 |
+
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
1508 |
+
ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
|
1509 |
+
tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
|
1510 |
+
uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
|
1511 |
+
XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
|
1512 |
+
8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
|
1513 |
+
5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
|
1514 |
+
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
|
1515 |
+
kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
|
1516 |
+
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
|
1517 |
+
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
|
1518 |
+
JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
|
1519 |
+
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
1520 |
+
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
|
1521 |
+
GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
|
1522 |
+
ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
|
1523 |
+
au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
|
1524 |
+
hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
|
1525 |
+
dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
|
1526 |
+
-----END CERTIFICATE-----
|
1527 |
+
|
1528 |
+
# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
|
1529 |
+
# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
|
1530 |
+
# Label: "TC TrustCenter Class 3 CA II"
|
1531 |
+
# Serial: 1506523511417715638772220530020799
|
1532 |
+
# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
|
1533 |
+
# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
|
1534 |
+
# 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
|
1535 |
+
-----BEGIN CERTIFICATE-----
|
1536 |
+
MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
|
1537 |
+
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
|
1538 |
+
BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
|
1539 |
+
Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
|
1540 |
+
OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
|
1541 |
+
SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
|
1542 |
+
VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
1543 |
+
ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
|
1544 |
+
Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
|
1545 |
+
Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
|
1546 |
+
1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
|
1547 |
+
ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
|
1548 |
+
Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
|
1549 |
+
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
|
1550 |
+
XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
|
1551 |
+
dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
|
1552 |
+
Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
|
1553 |
+
JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
|
1554 |
+
Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
1555 |
+
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
|
1556 |
+
irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
|
1557 |
+
TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
|
1558 |
+
g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
|
1559 |
+
95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
|
1560 |
+
S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
|
1561 |
+
-----END CERTIFICATE-----
|
1562 |
+
|
1563 |
+
# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1564 |
+
# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1565 |
+
# Label: "TC TrustCenter Universal CA I"
|
1566 |
+
# Serial: 601024842042189035295619584734726
|
1567 |
+
# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
|
1568 |
+
# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
|
1569 |
+
# 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
|
1570 |
+
-----BEGIN CERTIFICATE-----
|
1571 |
+
MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
|
1572 |
+
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
|
1573 |
+
BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
|
1574 |
+
c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
|
1575 |
+
MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
|
1576 |
+
R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
|
1577 |
+
VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
|
1578 |
+
AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
|
1579 |
+
JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
|
1580 |
+
fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
|
1581 |
+
jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
|
1582 |
+
wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
|
1583 |
+
fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
|
1584 |
+
VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
|
1585 |
+
BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
|
1586 |
+
CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
|
1587 |
+
7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
|
1588 |
+
8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
|
1589 |
+
ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
|
1590 |
+
ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
|
1591 |
+
2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
|
1592 |
+
-----END CERTIFICATE-----
|
1593 |
+
|
1594 |
+
# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
|
1595 |
+
# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
|
1596 |
+
# Label: "Cybertrust Global Root"
|
1597 |
+
# Serial: 4835703278459682877484360
|
1598 |
+
# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
|
1599 |
+
# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
|
1600 |
+
# 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
|
1601 |
+
-----BEGIN CERTIFICATE-----
|
1602 |
+
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
|
1603 |
+
A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
|
1604 |
+
bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
|
1605 |
+
ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
|
1606 |
+
b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
|
1607 |
+
7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
|
1608 |
+
J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
|
1609 |
+
HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
|
1610 |
+
t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
|
1611 |
+
FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
|
1612 |
+
XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
|
1613 |
+
MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
|
1614 |
+
hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
|
1615 |
+
MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
|
1616 |
+
A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
|
1617 |
+
Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
|
1618 |
+
XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
|
1619 |
+
omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
|
1620 |
+
A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
|
1621 |
+
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
|
1622 |
+
-----END CERTIFICATE-----
|
1623 |
+
|
1624 |
+
# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
|
1625 |
+
# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
|
1626 |
+
# Label: "GeoTrust Primary Certification Authority - G3"
|
1627 |
+
# Serial: 28809105769928564313984085209975885599
|
1628 |
+
# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
|
1629 |
+
# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
|
1630 |
+
# 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
|
1631 |
+
-----BEGIN CERTIFICATE-----
|
1632 |
+
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
|
1633 |
+
mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
|
1634 |
+
MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
1635 |
+
eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
1636 |
+
cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
|
1637 |
+
BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
|
1638 |
+
MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
|
1639 |
+
BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
1640 |
+
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
|
1641 |
+
+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
|
1642 |
+
hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
|
1643 |
+
5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
|
1644 |
+
JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
|
1645 |
+
DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
|
1646 |
+
huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
|
1647 |
+
HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
|
1648 |
+
AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
|
1649 |
+
zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
|
1650 |
+
kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
|
1651 |
+
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
|
1652 |
+
SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
|
1653 |
+
spki4cErx5z481+oghLrGREt
|
1654 |
+
-----END CERTIFICATE-----
|
1655 |
+
|
1656 |
+
# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
|
1657 |
+
# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
|
1658 |
+
# Label: "thawte Primary Root CA - G2"
|
1659 |
+
# Serial: 71758320672825410020661621085256472406
|
1660 |
+
# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
|
1661 |
+
# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
|
1662 |
+
# 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
|
1663 |
+
-----BEGIN CERTIFICATE-----
|
1664 |
+
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
|
1665 |
+
MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
|
1666 |
+
IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
|
1667 |
+
BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
|
1668 |
+
MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
|
1669 |
+
d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
|
1670 |
+
YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
|
1671 |
+
dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
|
1672 |
+
BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
|
1673 |
+
papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
|
1674 |
+
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
|
1675 |
+
DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
|
1676 |
+
KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
|
1677 |
+
XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
|
1678 |
+
-----END CERTIFICATE-----
|
1679 |
+
|
1680 |
+
# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
|
1681 |
+
# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
|
1682 |
+
# Label: "thawte Primary Root CA - G3"
|
1683 |
+
# Serial: 127614157056681299805556476275995414779
|
1684 |
+
# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
|
1685 |
+
# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
|
1686 |
+
# 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
|
1687 |
+
-----BEGIN CERTIFICATE-----
|
1688 |
+
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
|
1689 |
+
rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
|
1690 |
+
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
|
1691 |
+
MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
|
1692 |
+
BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
|
1693 |
+
Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
|
1694 |
+
LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
|
1695 |
+
MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
|
1696 |
+
ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
|
1697 |
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
|
1698 |
+
gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
|
1699 |
+
YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
|
1700 |
+
b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
|
1701 |
+
9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
|
1702 |
+
zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
|
1703 |
+
OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
|
1704 |
+
HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
|
1705 |
+
2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
|
1706 |
+
oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
|
1707 |
+
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
|
1708 |
+
KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
|
1709 |
+
m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
|
1710 |
+
MdRAGmI0Nj81Aa6sY6A=
|
1711 |
+
-----END CERTIFICATE-----
|
1712 |
+
|
1713 |
+
# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
|
1714 |
+
# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
|
1715 |
+
# Label: "GeoTrust Primary Certification Authority - G2"
|
1716 |
+
# Serial: 80682863203381065782177908751794619243
|
1717 |
+
# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
|
1718 |
+
# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
|
1719 |
+
# 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
|
1720 |
+
-----BEGIN CERTIFICATE-----
|
1721 |
+
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
|
1722 |
+
MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
|
1723 |
+
KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
|
1724 |
+
MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
1725 |
+
eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
|
1726 |
+
BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
|
1727 |
+
NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
|
1728 |
+
BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
|
1729 |
+
MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
|
1730 |
+
So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
|
1731 |
+
tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
|
1732 |
+
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
|
1733 |
+
CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
|
1734 |
+
qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
|
1735 |
+
rD6ogRLQy7rQkgu2npaqBA+K
|
1736 |
+
-----END CERTIFICATE-----
|
1737 |
+
|
1738 |
+
# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
|
1739 |
+
# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
|
1740 |
+
# Label: "VeriSign Universal Root Certification Authority"
|
1741 |
+
# Serial: 85209574734084581917763752644031726877
|
1742 |
+
# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
|
1743 |
+
# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
|
1744 |
+
# 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
|
1745 |
+
-----BEGIN CERTIFICATE-----
|
1746 |
+
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
|
1747 |
+
vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
1748 |
+
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
|
1749 |
+
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
|
1750 |
+
ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
|
1751 |
+
Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
|
1752 |
+
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
|
1753 |
+
IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
|
1754 |
+
IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
|
1755 |
+
bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
|
1756 |
+
AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
|
1757 |
+
9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
|
1758 |
+
H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
|
1759 |
+
LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
|
1760 |
+
/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
|
1761 |
+
rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
|
1762 |
+
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
|
1763 |
+
WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
|
1764 |
+
exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
|
1765 |
+
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
|
1766 |
+
sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
|
1767 |
+
seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
|
1768 |
+
4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
|
1769 |
+
BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
|
1770 |
+
lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
|
1771 |
+
7M2CYfE45k+XmCpajQ==
|
1772 |
+
-----END CERTIFICATE-----
|
1773 |
+
|
1774 |
+
# 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
|
1775 |
+
# 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
|
1776 |
+
# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
|
1777 |
+
# Serial: 63143484348153506665311985501458640051
|
1778 |
+
# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
|
1779 |
+
# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
|
1780 |
+
# 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
|
1781 |
+
-----BEGIN CERTIFICATE-----
|
1782 |
+
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
|
1783 |
+
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
|
1784 |
+
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
|
1785 |
+
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
|
1786 |
+
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
|
1787 |
+
aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
|
1788 |
+
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
|
1789 |
+
U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
|
1790 |
+
SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
|
1791 |
+
biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
1792 |
+
IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
|
1793 |
+
GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
|
1794 |
+
fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
|
1795 |
+
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
|
1796 |
+
aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
|
1797 |
+
aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
|
1798 |
+
kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
|
1799 |
+
4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
|
1800 |
+
FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
|
1801 |
+
-----END CERTIFICATE-----
|
1802 |
+
|
1803 |
+
# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
1804 |
+
# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
|
1805 |
+
# Label: "Verisign Class 3 Public Primary Certification Authority"
|
1806 |
+
# Serial: 80507572722862485515306429940691309246
|
1807 |
+
# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
|
1808 |
+
# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
|
1809 |
+
# 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
|
1810 |
+
-----BEGIN CERTIFICATE-----
|
1811 |
+
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
|
1812 |
+
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
1813 |
+
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
1814 |
+
MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
1815 |
+
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
1816 |
+
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
1817 |
+
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
1818 |
+
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
1819 |
+
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
1820 |
+
CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
|
1821 |
+
2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
|
1822 |
+
2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
|
1823 |
+
-----END CERTIFICATE-----
|
1824 |
+
|
1825 |
+
# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
|
1826 |
+
# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
|
1827 |
+
# Label: "GlobalSign Root CA - R3"
|
1828 |
+
# Serial: 4835703278459759426209954
|
1829 |
+
# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
|
1830 |
+
# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
|
1831 |
+
# 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
|
1832 |
+
-----BEGIN CERTIFICATE-----
|
1833 |
+
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
|
1834 |
+
A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
|
1835 |
+
Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
|
1836 |
+
MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
|
1837 |
+
A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
|
1838 |
+
hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
|
1839 |
+
RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
|
1840 |
+
gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
|
1841 |
+
KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
|
1842 |
+
QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
|
1843 |
+
XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
|
1844 |
+
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
|
1845 |
+
LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
|
1846 |
+
RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
|
1847 |
+
jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
|
1848 |
+
6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
|
1849 |
+
mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
|
1850 |
+
Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
|
1851 |
+
WD9f
|
1852 |
+
-----END CERTIFICATE-----
|
1853 |
+
|
1854 |
+
# Issuer: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1855 |
+
# Subject: CN=TC TrustCenter Universal CA III O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
|
1856 |
+
# Label: "TC TrustCenter Universal CA III"
|
1857 |
+
# Serial: 2010889993983507346460533407902964
|
1858 |
+
# MD5 Fingerprint: 9f:dd:db:ab:ff:8e:ff:45:21:5f:f0:6c:9d:8f:fe:2b
|
1859 |
+
# SHA1 Fingerprint: 96:56:cd:7b:57:96:98:95:d0:e1:41:46:68:06:fb:b8:c6:11:06:87
|
1860 |
+
# 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
|
1861 |
+
-----BEGIN CERTIFICATE-----
|
1862 |
+
MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL
|
1863 |
+
MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
|
1864 |
+
BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1
|
1865 |
+
c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy
|
1866 |
+
MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl
|
1867 |
+
ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm
|
1868 |
+
BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG
|
1869 |
+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF
|
1870 |
+
5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv
|
1871 |
+
DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v
|
1872 |
+
zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT
|
1873 |
+
yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj
|
1874 |
+
dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh
|
1875 |
+
MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB
|
1876 |
+
Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI
|
1877 |
+
4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz
|
1878 |
+
dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY
|
1879 |
+
aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G
|
1880 |
+
DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
|
1881 |
+
CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH
|
1882 |
+
LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
|
1883 |
+
-----END CERTIFICATE-----
|
1884 |
+
|
1885 |
+
# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
|
1886 |
+
# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
|
1887 |
+
# Label: "Go Daddy Root Certificate Authority - G2"
|
1888 |
+
# Serial: 0
|
1889 |
+
# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
|
1890 |
+
# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
|
1891 |
+
# 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
|
1892 |
+
-----BEGIN CERTIFICATE-----
|
1893 |
+
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
|
1894 |
+
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
|
1895 |
+
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
|
1896 |
+
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
|
1897 |
+
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
|
1898 |
+
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
|
1899 |
+
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
|
1900 |
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
|
1901 |
+
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
|
1902 |
+
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
|
1903 |
+
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
|
1904 |
+
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
|
1905 |
+
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
|
1906 |
+
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
|
1907 |
+
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
|
1908 |
+
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
|
1909 |
+
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
|
1910 |
+
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
|
1911 |
+
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
|
1912 |
+
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
|
1913 |
+
4uJEvlz36hz1
|
1914 |
+
-----END CERTIFICATE-----
|
1915 |
+
|
1916 |
+
# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1917 |
+
# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1918 |
+
# Label: "Starfield Root Certificate Authority - G2"
|
1919 |
+
# Serial: 0
|
1920 |
+
# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
|
1921 |
+
# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
|
1922 |
+
# 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
|
1923 |
+
-----BEGIN CERTIFICATE-----
|
1924 |
+
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
|
1925 |
+
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
|
1926 |
+
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
|
1927 |
+
ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
|
1928 |
+
MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
|
1929 |
+
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
|
1930 |
+
aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
|
1931 |
+
Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
1932 |
+
ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
|
1933 |
+
nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
|
1934 |
+
HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
|
1935 |
+
Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
|
1936 |
+
dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
|
1937 |
+
HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
|
1938 |
+
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
|
1939 |
+
CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
|
1940 |
+
sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
|
1941 |
+
4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
|
1942 |
+
8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
|
1943 |
+
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
|
1944 |
+
mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
|
1945 |
+
-----END CERTIFICATE-----
|
1946 |
+
|
1947 |
+
# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1948 |
+
# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
|
1949 |
+
# Label: "Starfield Services Root Certificate Authority - G2"
|
1950 |
+
# Serial: 0
|
1951 |
+
# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
|
1952 |
+
# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
|
1953 |
+
# 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
|
1954 |
+
-----BEGIN CERTIFICATE-----
|
1955 |
+
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
|
1956 |
+
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
|
1957 |
+
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
|
1958 |
+
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
|
1959 |
+
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
|
1960 |
+
VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
|
1961 |
+
ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
|
1962 |
+
dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
|
1963 |
+
hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
|
1964 |
+
OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
|
1965 |
+
8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
|
1966 |
+
Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
|
1967 |
+
hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
|
1968 |
+
6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
|
1969 |
+
DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
|
1970 |
+
AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
|
1971 |
+
bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
|
1972 |
+
ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
|
1973 |
+
qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
|
1974 |
+
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
|
1975 |
+
0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
|
1976 |
+
sSi6
|
1977 |
+
-----END CERTIFICATE-----
|
1978 |
+
|
1979 |
+
# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
|
1980 |
+
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
|
1981 |
+
# Label: "AffirmTrust Commercial"
|
1982 |
+
# Serial: 8608355977964138876
|
1983 |
+
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
|
1984 |
+
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
|
1985 |
+
# 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
|
1986 |
+
-----BEGIN CERTIFICATE-----
|
1987 |
+
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
|
1988 |
+
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
1989 |
+
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
|
1990 |
+
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
1991 |
+
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
1992 |
+
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
|
1993 |
+
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
|
1994 |
+
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
|
1995 |
+
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
|
1996 |
+
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
|
1997 |
+
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
|
1998 |
+
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
1999 |
+
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
|
2000 |
+
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
|
2001 |
+
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
|
2002 |
+
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
|
2003 |
+
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
|
2004 |
+
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
2005 |
+
-----END CERTIFICATE-----
|
2006 |
+
|
2007 |
+
# Issuer: CN=AffirmTrust Networking O=AffirmTrust
|
2008 |
+
# Subject: CN=AffirmTrust Networking O=AffirmTrust
|
2009 |
+
# Label: "AffirmTrust Networking"
|
2010 |
+
# Serial: 8957382827206547757
|
2011 |
+
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
|
2012 |
+
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
|
2013 |
+
# 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
|
2014 |
+
-----BEGIN CERTIFICATE-----
|
2015 |
+
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
|
2016 |
+
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
2017 |
+
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
|
2018 |
+
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
2019 |
+
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
2020 |
+
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
|
2021 |
+
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
|
2022 |
+
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
|
2023 |
+
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
|
2024 |
+
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
|
2025 |
+
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
|
2026 |
+
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
2027 |
+
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
|
2028 |
+
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
|
2029 |
+
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
|
2030 |
+
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
|
2031 |
+
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
|
2032 |
+
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
2033 |
+
-----END CERTIFICATE-----
|
2034 |
+
|
2035 |
+
# Issuer: CN=AffirmTrust Premium O=AffirmTrust
|
2036 |
+
# Subject: CN=AffirmTrust Premium O=AffirmTrust
|
2037 |
+
# Label: "AffirmTrust Premium"
|
2038 |
+
# Serial: 7893706540734352110
|
2039 |
+
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
|
2040 |
+
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
|
2041 |
+
# 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
|
2042 |
+
-----BEGIN CERTIFICATE-----
|
2043 |
+
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
|
2044 |
+
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
|
2045 |
+
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
|
2046 |
+
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
|
2047 |
+
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
|
2048 |
+
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
|
2049 |
+
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
|
2050 |
+
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
|
2051 |
+
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
|
2052 |
+
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
|
2053 |
+
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
|
2054 |
+
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
|
2055 |
+
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
|
2056 |
+
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
|
2057 |
+
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
|
2058 |
+
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
|
2059 |
+
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
|
2060 |
+
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
|
2061 |
+
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
|
2062 |
+
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
|
2063 |
+
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
|
2064 |
+
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
|
2065 |
+
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
|
2066 |
+
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
|
2067 |
+
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
|
2068 |
+
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
|
2069 |
+
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
|
2070 |
+
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
|
2071 |
+
KeC2uAloGRwYQw==
|
2072 |
+
-----END CERTIFICATE-----
|
2073 |
+
|
2074 |
+
# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
|
2075 |
+
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
|
2076 |
+
# Label: "AffirmTrust Premium ECC"
|
2077 |
+
# Serial: 8401224907861490260
|
2078 |
+
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
|
2079 |
+
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
|
2080 |
+
# 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
|
2081 |
+
-----BEGIN CERTIFICATE-----
|
2082 |
+
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
|
2083 |
+
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
|
2084 |
+
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
|
2085 |
+
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
|
2086 |
+
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
|
2087 |
+
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
|
2088 |
+
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
|
2089 |
+
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
|
2090 |
+
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
|
2091 |
+
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
|
2092 |
+
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
|
2093 |
+
-----END CERTIFICATE-----
|
2094 |
+
|
2095 |
+
# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
2096 |
+
# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
|
2097 |
+
# Label: "StartCom Certification Authority"
|
2098 |
+
# Serial: 45
|
2099 |
+
# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
|
2100 |
+
# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
|
2101 |
+
# 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
|
2102 |
+
-----BEGIN CERTIFICATE-----
|
2103 |
+
MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
|
2104 |
+
MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
|
2105 |
+
Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
|
2106 |
+
dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
|
2107 |
+
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
|
2108 |
+
U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
|
2109 |
+
cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
|
2110 |
+
A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
|
2111 |
+
pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
|
2112 |
+
OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
|
2113 |
+
Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
|
2114 |
+
Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
|
2115 |
+
HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
|
2116 |
+
Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
|
2117 |
+
+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
|
2118 |
+
Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
|
2119 |
+
Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
|
2120 |
+
26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
|
2121 |
+
AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
|
2122 |
+
VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
|
2123 |
+
F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
|
2124 |
+
ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
|
2125 |
+
ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
|
2126 |
+
aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
|
2127 |
+
YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
|
2128 |
+
c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
|
2129 |
+
aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
|
2130 |
+
d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
|
2131 |
+
CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
|
2132 |
+
dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
|
2133 |
+
wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
|
2134 |
+
Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
|
2135 |
+
0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
|
2136 |
+
pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
|
2137 |
+
CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
|
2138 |
+
P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
|
2139 |
+
1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
|
2140 |
+
KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
|
2141 |
+
JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
|
2142 |
+
8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
|
2143 |
+
fyWl8kgAwKQB2j8=
|
2144 |
+
-----END CERTIFICATE-----
|
2145 |
+
|
2146 |
+
# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
|
2147 |
+
# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
|
2148 |
+
# Label: "StartCom Certification Authority G2"
|
2149 |
+
# Serial: 59
|
2150 |
+
# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
|
2151 |
+
# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
|
2152 |
+
# 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
|
2153 |
+
-----BEGIN CERTIFICATE-----
|
2154 |
+
MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
|
2155 |
+
MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
|
2156 |
+
aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
|
2157 |
+
OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
|
2158 |
+
A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
|
2159 |
+
CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
|
2160 |
+
JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
|
2161 |
+
vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
|
2162 |
+
D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
|
2163 |
+
Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
|
2164 |
+
RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
|
2165 |
+
HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
|
2166 |
+
nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
|
2167 |
+
0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
|
2168 |
+
UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
|
2169 |
+
Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
|
2170 |
+
TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
|
2171 |
+
AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
|
2172 |
+
BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
|
2173 |
+
2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
|
2174 |
+
UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
|
2175 |
+
6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
|
2176 |
+
9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
|
2177 |
+
HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
|
2178 |
+
wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
|
2179 |
+
XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
|
2180 |
+
IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
|
2181 |
+
hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
|
2182 |
+
so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
|
2183 |
+
-----END CERTIFICATE-----
|
app/api/Google/Logger/Abstract.php
CHANGED
@@ -1,408 +1,408 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Abstract logging class based on the PSR-3 standard.
|
24 |
-
*
|
25 |
-
* NOTE: We don't implement `Psr\Log\LoggerInterface` because we need to
|
26 |
-
* maintain PHP 5.2 support.
|
27 |
-
*
|
28 |
-
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
|
29 |
-
*/
|
30 |
-
abstract class Google_Logger_Abstract
|
31 |
-
{
|
32 |
-
/**
|
33 |
-
* Default log format
|
34 |
-
*/
|
35 |
-
const DEFAULT_LOG_FORMAT = "[%datetime%] %level%: %message% %context%\n";
|
36 |
-
/**
|
37 |
-
* Default date format
|
38 |
-
*
|
39 |
-
* Example: 16/Nov/2014:03:26:16 -0500
|
40 |
-
*/
|
41 |
-
const DEFAULT_DATE_FORMAT = 'd/M/Y:H:i:s O';
|
42 |
-
|
43 |
-
/**
|
44 |
-
* System is unusable
|
45 |
-
*/
|
46 |
-
const EMERGENCY = 'emergency';
|
47 |
-
/**
|
48 |
-
* Action must be taken immediately
|
49 |
-
*
|
50 |
-
* Example: Entire website down, database unavailable, etc. This should
|
51 |
-
* trigger the SMS alerts and wake you up.
|
52 |
-
*/
|
53 |
-
const ALERT = 'alert';
|
54 |
-
/**
|
55 |
-
* Critical conditions
|
56 |
-
*
|
57 |
-
* Example: Application component unavailable, unexpected exception.
|
58 |
-
*/
|
59 |
-
const CRITICAL = 'critical';
|
60 |
-
/**
|
61 |
-
* Runtime errors that do not require immediate action but should typically
|
62 |
-
* be logged and monitored.
|
63 |
-
*/
|
64 |
-
const ERROR = 'error';
|
65 |
-
/**
|
66 |
-
* Exceptional occurrences that are not errors.
|
67 |
-
*
|
68 |
-
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
69 |
-
* that are not necessarily wrong.
|
70 |
-
*/
|
71 |
-
const WARNING = 'warning';
|
72 |
-
/**
|
73 |
-
* Normal but significant events.
|
74 |
-
*/
|
75 |
-
const NOTICE = 'notice';
|
76 |
-
/**
|
77 |
-
* Interesting events.
|
78 |
-
*
|
79 |
-
* Example: User logs in, SQL logs.
|
80 |
-
*/
|
81 |
-
const INFO = 'info';
|
82 |
-
/**
|
83 |
-
* Detailed debug information.
|
84 |
-
*/
|
85 |
-
const DEBUG = 'debug';
|
86 |
-
|
87 |
-
/**
|
88 |
-
* @var array $levels Logging levels
|
89 |
-
*/
|
90 |
-
protected static $levels = array(
|
91 |
-
self::EMERGENCY => 600,
|
92 |
-
self::ALERT => 550,
|
93 |
-
self::CRITICAL => 500,
|
94 |
-
self::ERROR => 400,
|
95 |
-
self::WARNING => 300,
|
96 |
-
self::NOTICE => 250,
|
97 |
-
self::INFO => 200,
|
98 |
-
self::DEBUG => 100,
|
99 |
-
);
|
100 |
-
|
101 |
-
/**
|
102 |
-
* @var integer $level The minimum logging level
|
103 |
-
*/
|
104 |
-
protected $level = self::DEBUG;
|
105 |
-
|
106 |
-
/**
|
107 |
-
* @var string $logFormat The current log format
|
108 |
-
*/
|
109 |
-
protected $logFormat = self::DEFAULT_LOG_FORMAT;
|
110 |
-
/**
|
111 |
-
* @var string $dateFormat The current date format
|
112 |
-
*/
|
113 |
-
protected $dateFormat = self::DEFAULT_DATE_FORMAT;
|
114 |
-
|
115 |
-
/**
|
116 |
-
* @var boolean $allowNewLines If newlines are allowed
|
117 |
-
*/
|
118 |
-
protected $allowNewLines = false;
|
119 |
-
|
120 |
-
/**
|
121 |
-
* @param Google_Client $client The current Google client
|
122 |
-
*/
|
123 |
-
public function __construct(Google_Client $client)
|
124 |
-
{
|
125 |
-
$this->setLevel(
|
126 |
-
$client->getClassConfig('Google_Logger_Abstract', 'level')
|
127 |
-
);
|
128 |
-
|
129 |
-
$format = $client->getClassConfig('Google_Logger_Abstract', 'log_format');
|
130 |
-
$this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT;
|
131 |
-
|
132 |
-
$format = $client->getClassConfig('Google_Logger_Abstract', 'date_format');
|
133 |
-
$this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT;
|
134 |
-
|
135 |
-
$this->allowNewLines = (bool) $client->getClassConfig(
|
136 |
-
'Google_Logger_Abstract',
|
137 |
-
'allow_newlines'
|
138 |
-
);
|
139 |
-
}
|
140 |
-
|
141 |
-
/**
|
142 |
-
* Sets the minimum logging level that this logger handles.
|
143 |
-
*
|
144 |
-
* @param integer $level
|
145 |
-
*/
|
146 |
-
public function setLevel($level)
|
147 |
-
{
|
148 |
-
$this->level = $this->normalizeLevel($level);
|
149 |
-
}
|
150 |
-
|
151 |
-
/**
|
152 |
-
* Checks if the logger should handle messages at the provided level.
|
153 |
-
*
|
154 |
-
* @param integer $level
|
155 |
-
* @return boolean
|
156 |
-
*/
|
157 |
-
public function shouldHandle($level)
|
158 |
-
{
|
159 |
-
return $this->normalizeLevel($level) >= $this->level;
|
160 |
-
}
|
161 |
-
|
162 |
-
/**
|
163 |
-
* System is unusable.
|
164 |
-
*
|
165 |
-
* @param string $message The log message
|
166 |
-
* @param array $context The log context
|
167 |
-
*/
|
168 |
-
public function emergency($message, array $context = array())
|
169 |
-
{
|
170 |
-
$this->log(self::EMERGENCY, $message, $context);
|
171 |
-
}
|
172 |
-
|
173 |
-
/**
|
174 |
-
* Action must be taken immediately.
|
175 |
-
*
|
176 |
-
* Example: Entire website down, database unavailable, etc. This should
|
177 |
-
* trigger the SMS alerts and wake you up.
|
178 |
-
*
|
179 |
-
* @param string $message The log message
|
180 |
-
* @param array $context The log context
|
181 |
-
*/
|
182 |
-
public function alert($message, array $context = array())
|
183 |
-
{
|
184 |
-
$this->log(self::ALERT, $message, $context);
|
185 |
-
}
|
186 |
-
|
187 |
-
/**
|
188 |
-
* Critical conditions.
|
189 |
-
*
|
190 |
-
* Example: Application component unavailable, unexpected exception.
|
191 |
-
*
|
192 |
-
* @param string $message The log message
|
193 |
-
* @param array $context The log context
|
194 |
-
*/
|
195 |
-
public function critical($message, array $context = array())
|
196 |
-
{
|
197 |
-
$this->log(self::CRITICAL, $message, $context);
|
198 |
-
}
|
199 |
-
|
200 |
-
/**
|
201 |
-
* Runtime errors that do not require immediate action but should typically
|
202 |
-
* be logged and monitored.
|
203 |
-
*
|
204 |
-
* @param string $message The log message
|
205 |
-
* @param array $context The log context
|
206 |
-
*/
|
207 |
-
public function error($message, array $context = array())
|
208 |
-
{
|
209 |
-
$this->log(self::ERROR, $message, $context);
|
210 |
-
}
|
211 |
-
|
212 |
-
/**
|
213 |
-
* Exceptional occurrences that are not errors.
|
214 |
-
*
|
215 |
-
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
216 |
-
* that are not necessarily wrong.
|
217 |
-
*
|
218 |
-
* @param string $message The log message
|
219 |
-
* @param array $context The log context
|
220 |
-
*/
|
221 |
-
public function warning($message, array $context = array())
|
222 |
-
{
|
223 |
-
$this->log(self::WARNING, $message, $context);
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Normal but significant events.
|
228 |
-
*
|
229 |
-
* @param string $message The log message
|
230 |
-
* @param array $context The log context
|
231 |
-
*/
|
232 |
-
public function notice($message, array $context = array())
|
233 |
-
{
|
234 |
-
$this->log(self::NOTICE, $message, $context);
|
235 |
-
}
|
236 |
-
|
237 |
-
/**
|
238 |
-
* Interesting events.
|
239 |
-
*
|
240 |
-
* Example: User logs in, SQL logs.
|
241 |
-
*
|
242 |
-
* @param string $message The log message
|
243 |
-
* @param array $context The log context
|
244 |
-
*/
|
245 |
-
public function info($message, array $context = array())
|
246 |
-
{
|
247 |
-
$this->log(self::INFO, $message, $context);
|
248 |
-
}
|
249 |
-
|
250 |
-
/**
|
251 |
-
* Detailed debug information.
|
252 |
-
*
|
253 |
-
* @param string $message The log message
|
254 |
-
* @param array $context The log context
|
255 |
-
*/
|
256 |
-
public function debug($message, array $context = array())
|
257 |
-
{
|
258 |
-
$this->log(self::DEBUG, $message, $context);
|
259 |
-
}
|
260 |
-
|
261 |
-
/**
|
262 |
-
* Logs with an arbitrary level.
|
263 |
-
*
|
264 |
-
* @param mixed $level The log level
|
265 |
-
* @param string $message The log message
|
266 |
-
* @param array $context The log context
|
267 |
-
*/
|
268 |
-
public function log($level, $message, array $context = array())
|
269 |
-
{
|
270 |
-
if (!$this->shouldHandle($level)) {
|
271 |
-
return false;
|
272 |
-
}
|
273 |
-
|
274 |
-
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
275 |
-
$message = $this->interpolate(
|
276 |
-
array(
|
277 |
-
'message' => $message,
|
278 |
-
'context' => $context,
|
279 |
-
'level' => strtoupper($levelName),
|
280 |
-
'datetime' => new DateTime(),
|
281 |
-
)
|
282 |
-
);
|
283 |
-
|
284 |
-
$this->write($message);
|
285 |
-
}
|
286 |
-
|
287 |
-
/**
|
288 |
-
* Interpolates log variables into the defined log format.
|
289 |
-
*
|
290 |
-
* @param array $variables The log variables.
|
291 |
-
* @return string
|
292 |
-
*/
|
293 |
-
protected function interpolate(array $variables = array())
|
294 |
-
{
|
295 |
-
$template = $this->logFormat;
|
296 |
-
|
297 |
-
if (!$variables['context']) {
|
298 |
-
$template = str_replace('%context%', '', $template);
|
299 |
-
unset($variables['context']);
|
300 |
-
} else {
|
301 |
-
$this->reverseJsonInContext($variables['context']);
|
302 |
-
}
|
303 |
-
|
304 |
-
foreach ($variables as $key => $value) {
|
305 |
-
if (strpos($template, '%'. $key .'%') !== false) {
|
306 |
-
$template = str_replace(
|
307 |
-
'%' . $key . '%',
|
308 |
-
$this->export($value),
|
309 |
-
$template
|
310 |
-
);
|
311 |
-
}
|
312 |
-
}
|
313 |
-
|
314 |
-
return $template;
|
315 |
-
}
|
316 |
-
|
317 |
-
/**
|
318 |
-
* Reverses JSON encoded PHP arrays and objects so that they log better.
|
319 |
-
*
|
320 |
-
* @param array $context The log context
|
321 |
-
*/
|
322 |
-
protected function reverseJsonInContext(array &$context)
|
323 |
-
{
|
324 |
-
if (!$context) {
|
325 |
-
return;
|
326 |
-
}
|
327 |
-
|
328 |
-
foreach ($context as $key => $val) {
|
329 |
-
if (!$val || !is_string($val) || !($val[0] == '{' || $val[0] == '[')) {
|
330 |
-
continue;
|
331 |
-
}
|
332 |
-
|
333 |
-
$json = @json_decode($val);
|
334 |
-
if (is_object($json) || is_array($json)) {
|
335 |
-
$context[$key] = $json;
|
336 |
-
}
|
337 |
-
}
|
338 |
-
}
|
339 |
-
|
340 |
-
/**
|
341 |
-
* Exports a PHP value for logging to a string.
|
342 |
-
*
|
343 |
-
* @param mixed $value The value to
|
344 |
-
*/
|
345 |
-
protected function export($value)
|
346 |
-
{
|
347 |
-
if (is_string($value)) {
|
348 |
-
if ($this->allowNewLines) {
|
349 |
-
return $value;
|
350 |
-
}
|
351 |
-
|
352 |
-
return preg_replace('/[\r\n]+/', ' ', $value);
|
353 |
-
}
|
354 |
-
|
355 |
-
if (is_resource($value)) {
|
356 |
-
return sprintf(
|
357 |
-
'resource(%d) of type (%s)',
|
358 |
-
$value,
|
359 |
-
get_resource_type($value)
|
360 |
-
);
|
361 |
-
}
|
362 |
-
|
363 |
-
if ($value instanceof DateTime) {
|
364 |
-
return $value->format($this->dateFormat);
|
365 |
-
}
|
366 |
-
|
367 |
-
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
368 |
-
$options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
|
369 |
-
|
370 |
-
if ($this->allowNewLines) {
|
371 |
-
$options |= JSON_PRETTY_PRINT;
|
372 |
-
}
|
373 |
-
|
374 |
-
return @json_encode($value, $options);
|
375 |
-
}
|
376 |
-
|
377 |
-
return str_replace('\\/', '/', @json_encode($value));
|
378 |
-
}
|
379 |
-
|
380 |
-
/**
|
381 |
-
* Converts a given log level to the integer form.
|
382 |
-
*
|
383 |
-
* @param mixed $level The logging level
|
384 |
-
* @return integer $level The normalized level
|
385 |
-
* @throws Google_Logger_Exception If $level is invalid
|
386 |
-
*/
|
387 |
-
protected function normalizeLevel($level)
|
388 |
-
{
|
389 |
-
if (is_int($level) && array_search($level, self::$levels) !== false) {
|
390 |
-
return $level;
|
391 |
-
}
|
392 |
-
|
393 |
-
if (is_string($level) && isset(self::$levels[$level])) {
|
394 |
-
return self::$levels[$level];
|
395 |
-
}
|
396 |
-
|
397 |
-
throw new Google_Logger_Exception(
|
398 |
-
sprintf("Unknown LogLevel: '%s'", $level)
|
399 |
-
);
|
400 |
-
}
|
401 |
-
|
402 |
-
/**
|
403 |
-
* Writes a message to the current log implementation.
|
404 |
-
*
|
405 |
-
* @param string $message The message
|
406 |
-
*/
|
407 |
-
abstract protected function write($message);
|
408 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Abstract logging class based on the PSR-3 standard.
|
24 |
+
*
|
25 |
+
* NOTE: We don't implement `Psr\Log\LoggerInterface` because we need to
|
26 |
+
* maintain PHP 5.2 support.
|
27 |
+
*
|
28 |
+
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
|
29 |
+
*/
|
30 |
+
abstract class Google_Logger_Abstract
|
31 |
+
{
|
32 |
+
/**
|
33 |
+
* Default log format
|
34 |
+
*/
|
35 |
+
const DEFAULT_LOG_FORMAT = "[%datetime%] %level%: %message% %context%\n";
|
36 |
+
/**
|
37 |
+
* Default date format
|
38 |
+
*
|
39 |
+
* Example: 16/Nov/2014:03:26:16 -0500
|
40 |
+
*/
|
41 |
+
const DEFAULT_DATE_FORMAT = 'd/M/Y:H:i:s O';
|
42 |
+
|
43 |
+
/**
|
44 |
+
* System is unusable
|
45 |
+
*/
|
46 |
+
const EMERGENCY = 'emergency';
|
47 |
+
/**
|
48 |
+
* Action must be taken immediately
|
49 |
+
*
|
50 |
+
* Example: Entire website down, database unavailable, etc. This should
|
51 |
+
* trigger the SMS alerts and wake you up.
|
52 |
+
*/
|
53 |
+
const ALERT = 'alert';
|
54 |
+
/**
|
55 |
+
* Critical conditions
|
56 |
+
*
|
57 |
+
* Example: Application component unavailable, unexpected exception.
|
58 |
+
*/
|
59 |
+
const CRITICAL = 'critical';
|
60 |
+
/**
|
61 |
+
* Runtime errors that do not require immediate action but should typically
|
62 |
+
* be logged and monitored.
|
63 |
+
*/
|
64 |
+
const ERROR = 'error';
|
65 |
+
/**
|
66 |
+
* Exceptional occurrences that are not errors.
|
67 |
+
*
|
68 |
+
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
69 |
+
* that are not necessarily wrong.
|
70 |
+
*/
|
71 |
+
const WARNING = 'warning';
|
72 |
+
/**
|
73 |
+
* Normal but significant events.
|
74 |
+
*/
|
75 |
+
const NOTICE = 'notice';
|
76 |
+
/**
|
77 |
+
* Interesting events.
|
78 |
+
*
|
79 |
+
* Example: User logs in, SQL logs.
|
80 |
+
*/
|
81 |
+
const INFO = 'info';
|
82 |
+
/**
|
83 |
+
* Detailed debug information.
|
84 |
+
*/
|
85 |
+
const DEBUG = 'debug';
|
86 |
+
|
87 |
+
/**
|
88 |
+
* @var array $levels Logging levels
|
89 |
+
*/
|
90 |
+
protected static $levels = array(
|
91 |
+
self::EMERGENCY => 600,
|
92 |
+
self::ALERT => 550,
|
93 |
+
self::CRITICAL => 500,
|
94 |
+
self::ERROR => 400,
|
95 |
+
self::WARNING => 300,
|
96 |
+
self::NOTICE => 250,
|
97 |
+
self::INFO => 200,
|
98 |
+
self::DEBUG => 100,
|
99 |
+
);
|
100 |
+
|
101 |
+
/**
|
102 |
+
* @var integer $level The minimum logging level
|
103 |
+
*/
|
104 |
+
protected $level = self::DEBUG;
|
105 |
+
|
106 |
+
/**
|
107 |
+
* @var string $logFormat The current log format
|
108 |
+
*/
|
109 |
+
protected $logFormat = self::DEFAULT_LOG_FORMAT;
|
110 |
+
/**
|
111 |
+
* @var string $dateFormat The current date format
|
112 |
+
*/
|
113 |
+
protected $dateFormat = self::DEFAULT_DATE_FORMAT;
|
114 |
+
|
115 |
+
/**
|
116 |
+
* @var boolean $allowNewLines If newlines are allowed
|
117 |
+
*/
|
118 |
+
protected $allowNewLines = false;
|
119 |
+
|
120 |
+
/**
|
121 |
+
* @param Google_Client $client The current Google client
|
122 |
+
*/
|
123 |
+
public function __construct(Google_Client $client)
|
124 |
+
{
|
125 |
+
$this->setLevel(
|
126 |
+
$client->getClassConfig('Google_Logger_Abstract', 'level')
|
127 |
+
);
|
128 |
+
|
129 |
+
$format = $client->getClassConfig('Google_Logger_Abstract', 'log_format');
|
130 |
+
$this->logFormat = $format ? $format : self::DEFAULT_LOG_FORMAT;
|
131 |
+
|
132 |
+
$format = $client->getClassConfig('Google_Logger_Abstract', 'date_format');
|
133 |
+
$this->dateFormat = $format ? $format : self::DEFAULT_DATE_FORMAT;
|
134 |
+
|
135 |
+
$this->allowNewLines = (bool) $client->getClassConfig(
|
136 |
+
'Google_Logger_Abstract',
|
137 |
+
'allow_newlines'
|
138 |
+
);
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Sets the minimum logging level that this logger handles.
|
143 |
+
*
|
144 |
+
* @param integer $level
|
145 |
+
*/
|
146 |
+
public function setLevel($level)
|
147 |
+
{
|
148 |
+
$this->level = $this->normalizeLevel($level);
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Checks if the logger should handle messages at the provided level.
|
153 |
+
*
|
154 |
+
* @param integer $level
|
155 |
+
* @return boolean
|
156 |
+
*/
|
157 |
+
public function shouldHandle($level)
|
158 |
+
{
|
159 |
+
return $this->normalizeLevel($level) >= $this->level;
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* System is unusable.
|
164 |
+
*
|
165 |
+
* @param string $message The log message
|
166 |
+
* @param array $context The log context
|
167 |
+
*/
|
168 |
+
public function emergency($message, array $context = array())
|
169 |
+
{
|
170 |
+
$this->log(self::EMERGENCY, $message, $context);
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Action must be taken immediately.
|
175 |
+
*
|
176 |
+
* Example: Entire website down, database unavailable, etc. This should
|
177 |
+
* trigger the SMS alerts and wake you up.
|
178 |
+
*
|
179 |
+
* @param string $message The log message
|
180 |
+
* @param array $context The log context
|
181 |
+
*/
|
182 |
+
public function alert($message, array $context = array())
|
183 |
+
{
|
184 |
+
$this->log(self::ALERT, $message, $context);
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Critical conditions.
|
189 |
+
*
|
190 |
+
* Example: Application component unavailable, unexpected exception.
|
191 |
+
*
|
192 |
+
* @param string $message The log message
|
193 |
+
* @param array $context The log context
|
194 |
+
*/
|
195 |
+
public function critical($message, array $context = array())
|
196 |
+
{
|
197 |
+
$this->log(self::CRITICAL, $message, $context);
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Runtime errors that do not require immediate action but should typically
|
202 |
+
* be logged and monitored.
|
203 |
+
*
|
204 |
+
* @param string $message The log message
|
205 |
+
* @param array $context The log context
|
206 |
+
*/
|
207 |
+
public function error($message, array $context = array())
|
208 |
+
{
|
209 |
+
$this->log(self::ERROR, $message, $context);
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Exceptional occurrences that are not errors.
|
214 |
+
*
|
215 |
+
* Example: Use of deprecated APIs, poor use of an API, undesirable things
|
216 |
+
* that are not necessarily wrong.
|
217 |
+
*
|
218 |
+
* @param string $message The log message
|
219 |
+
* @param array $context The log context
|
220 |
+
*/
|
221 |
+
public function warning($message, array $context = array())
|
222 |
+
{
|
223 |
+
$this->log(self::WARNING, $message, $context);
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Normal but significant events.
|
228 |
+
*
|
229 |
+
* @param string $message The log message
|
230 |
+
* @param array $context The log context
|
231 |
+
*/
|
232 |
+
public function notice($message, array $context = array())
|
233 |
+
{
|
234 |
+
$this->log(self::NOTICE, $message, $context);
|
235 |
+
}
|
236 |
+
|
237 |
+
/**
|
238 |
+
* Interesting events.
|
239 |
+
*
|
240 |
+
* Example: User logs in, SQL logs.
|
241 |
+
*
|
242 |
+
* @param string $message The log message
|
243 |
+
* @param array $context The log context
|
244 |
+
*/
|
245 |
+
public function info($message, array $context = array())
|
246 |
+
{
|
247 |
+
$this->log(self::INFO, $message, $context);
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Detailed debug information.
|
252 |
+
*
|
253 |
+
* @param string $message The log message
|
254 |
+
* @param array $context The log context
|
255 |
+
*/
|
256 |
+
public function debug($message, array $context = array())
|
257 |
+
{
|
258 |
+
$this->log(self::DEBUG, $message, $context);
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Logs with an arbitrary level.
|
263 |
+
*
|
264 |
+
* @param mixed $level The log level
|
265 |
+
* @param string $message The log message
|
266 |
+
* @param array $context The log context
|
267 |
+
*/
|
268 |
+
public function log($level, $message, array $context = array())
|
269 |
+
{
|
270 |
+
if (!$this->shouldHandle($level)) {
|
271 |
+
return false;
|
272 |
+
}
|
273 |
+
|
274 |
+
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
275 |
+
$message = $this->interpolate(
|
276 |
+
array(
|
277 |
+
'message' => $message,
|
278 |
+
'context' => $context,
|
279 |
+
'level' => strtoupper($levelName),
|
280 |
+
'datetime' => new DateTime(),
|
281 |
+
)
|
282 |
+
);
|
283 |
+
|
284 |
+
$this->write($message);
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Interpolates log variables into the defined log format.
|
289 |
+
*
|
290 |
+
* @param array $variables The log variables.
|
291 |
+
* @return string
|
292 |
+
*/
|
293 |
+
protected function interpolate(array $variables = array())
|
294 |
+
{
|
295 |
+
$template = $this->logFormat;
|
296 |
+
|
297 |
+
if (!$variables['context']) {
|
298 |
+
$template = str_replace('%context%', '', $template);
|
299 |
+
unset($variables['context']);
|
300 |
+
} else {
|
301 |
+
$this->reverseJsonInContext($variables['context']);
|
302 |
+
}
|
303 |
+
|
304 |
+
foreach ($variables as $key => $value) {
|
305 |
+
if (strpos($template, '%'. $key .'%') !== false) {
|
306 |
+
$template = str_replace(
|
307 |
+
'%' . $key . '%',
|
308 |
+
$this->export($value),
|
309 |
+
$template
|
310 |
+
);
|
311 |
+
}
|
312 |
+
}
|
313 |
+
|
314 |
+
return $template;
|
315 |
+
}
|
316 |
+
|
317 |
+
/**
|
318 |
+
* Reverses JSON encoded PHP arrays and objects so that they log better.
|
319 |
+
*
|
320 |
+
* @param array $context The log context
|
321 |
+
*/
|
322 |
+
protected function reverseJsonInContext(array &$context)
|
323 |
+
{
|
324 |
+
if (!$context) {
|
325 |
+
return;
|
326 |
+
}
|
327 |
+
|
328 |
+
foreach ($context as $key => $val) {
|
329 |
+
if (!$val || !is_string($val) || !($val[0] == '{' || $val[0] == '[')) {
|
330 |
+
continue;
|
331 |
+
}
|
332 |
+
|
333 |
+
$json = @json_decode($val);
|
334 |
+
if (is_object($json) || is_array($json)) {
|
335 |
+
$context[$key] = $json;
|
336 |
+
}
|
337 |
+
}
|
338 |
+
}
|
339 |
+
|
340 |
+
/**
|
341 |
+
* Exports a PHP value for logging to a string.
|
342 |
+
*
|
343 |
+
* @param mixed $value The value to
|
344 |
+
*/
|
345 |
+
protected function export($value)
|
346 |
+
{
|
347 |
+
if (is_string($value)) {
|
348 |
+
if ($this->allowNewLines) {
|
349 |
+
return $value;
|
350 |
+
}
|
351 |
+
|
352 |
+
return preg_replace('/[\r\n]+/', ' ', $value);
|
353 |
+
}
|
354 |
+
|
355 |
+
if (is_resource($value)) {
|
356 |
+
return sprintf(
|
357 |
+
'resource(%d) of type (%s)',
|
358 |
+
$value,
|
359 |
+
get_resource_type($value)
|
360 |
+
);
|
361 |
+
}
|
362 |
+
|
363 |
+
if ($value instanceof DateTime) {
|
364 |
+
return $value->format($this->dateFormat);
|
365 |
+
}
|
366 |
+
|
367 |
+
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
|
368 |
+
$options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
|
369 |
+
|
370 |
+
if ($this->allowNewLines) {
|
371 |
+
$options |= JSON_PRETTY_PRINT;
|
372 |
+
}
|
373 |
+
|
374 |
+
return @json_encode($value, $options);
|
375 |
+
}
|
376 |
+
|
377 |
+
return str_replace('\\/', '/', @json_encode($value));
|
378 |
+
}
|
379 |
+
|
380 |
+
/**
|
381 |
+
* Converts a given log level to the integer form.
|
382 |
+
*
|
383 |
+
* @param mixed $level The logging level
|
384 |
+
* @return integer $level The normalized level
|
385 |
+
* @throws Google_Logger_Exception If $level is invalid
|
386 |
+
*/
|
387 |
+
protected function normalizeLevel($level)
|
388 |
+
{
|
389 |
+
if (is_int($level) && array_search($level, self::$levels) !== false) {
|
390 |
+
return $level;
|
391 |
+
}
|
392 |
+
|
393 |
+
if (is_string($level) && isset(self::$levels[$level])) {
|
394 |
+
return self::$levels[$level];
|
395 |
+
}
|
396 |
+
|
397 |
+
throw new Google_Logger_Exception(
|
398 |
+
sprintf("Unknown LogLevel: '%s'", $level)
|
399 |
+
);
|
400 |
+
}
|
401 |
+
|
402 |
+
/**
|
403 |
+
* Writes a message to the current log implementation.
|
404 |
+
*
|
405 |
+
* @param string $message The message
|
406 |
+
*/
|
407 |
+
abstract protected function write($message);
|
408 |
+
}
|
app/api/Google/Logger/Exception.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_Logger_Exception extends Google_Exception
|
23 |
-
{
|
24 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_Logger_Exception extends Google_Exception
|
23 |
+
{
|
24 |
+
}
|
app/api/Google/Logger/File.php
CHANGED
@@ -1,158 +1,158 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* File logging class based on the PSR-3 standard.
|
24 |
-
*
|
25 |
-
* This logger writes to a PHP stream resource.
|
26 |
-
*/
|
27 |
-
class Google_Logger_File extends Google_Logger_Abstract
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* @var string|resource $file Where logs are written
|
31 |
-
*/
|
32 |
-
private $file;
|
33 |
-
/**
|
34 |
-
* @var integer $mode The mode to use if the log file needs to be created
|
35 |
-
*/
|
36 |
-
private $mode = 0640;
|
37 |
-
/**
|
38 |
-
* @var boolean $lock If a lock should be attempted before writing to the log
|
39 |
-
*/
|
40 |
-
private $lock = false;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* @var integer $trappedErrorNumber Trapped error number
|
44 |
-
*/
|
45 |
-
private $trappedErrorNumber;
|
46 |
-
/**
|
47 |
-
* @var string $trappedErrorString Trapped error string
|
48 |
-
*/
|
49 |
-
private $trappedErrorString;
|
50 |
-
|
51 |
-
/**
|
52 |
-
* {@inheritdoc}
|
53 |
-
*/
|
54 |
-
public function __construct(Google_Client $client)
|
55 |
-
{
|
56 |
-
parent::__construct($client);
|
57 |
-
|
58 |
-
$file = $client->getClassConfig('Google_Logger_File', 'file');
|
59 |
-
if (!is_string($file) && !is_resource($file)) {
|
60 |
-
throw new Google_Logger_Exception(
|
61 |
-
'File logger requires a filename or a valid file pointer'
|
62 |
-
);
|
63 |
-
}
|
64 |
-
|
65 |
-
$mode = $client->getClassConfig('Google_Logger_File', 'mode');
|
66 |
-
if (!$mode) {
|
67 |
-
$this->mode = $mode;
|
68 |
-
}
|
69 |
-
|
70 |
-
$this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock');
|
71 |
-
$this->file = $file;
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* {@inheritdoc}
|
76 |
-
*/
|
77 |
-
protected function write($message)
|
78 |
-
{
|
79 |
-
if (is_string($this->file)) {
|
80 |
-
$this->open();
|
81 |
-
} elseif (!is_resource($this->file)) {
|
82 |
-
throw new Google_Logger_Exception('File pointer is no longer available');
|
83 |
-
}
|
84 |
-
|
85 |
-
if ($this->lock) {
|
86 |
-
flock($this->file, LOCK_EX);
|
87 |
-
}
|
88 |
-
|
89 |
-
fwrite($this->file, (string) $message);
|
90 |
-
|
91 |
-
if ($this->lock) {
|
92 |
-
flock($this->file, LOCK_UN);
|
93 |
-
}
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Opens the log for writing.
|
98 |
-
*
|
99 |
-
* @return resource
|
100 |
-
*/
|
101 |
-
private function open()
|
102 |
-
{
|
103 |
-
// Used for trapping `fopen()` errors.
|
104 |
-
$this->trappedErrorNumber = null;
|
105 |
-
$this->trappedErrorString = null;
|
106 |
-
|
107 |
-
$old = set_error_handler(array($this, 'trapError'));
|
108 |
-
|
109 |
-
$needsChmod = !file_exists($this->file);
|
110 |
-
$fh = fopen($this->file, 'a');
|
111 |
-
|
112 |
-
restore_error_handler();
|
113 |
-
|
114 |
-
// Handles trapped `fopen()` errors.
|
115 |
-
if ($this->trappedErrorNumber) {
|
116 |
-
throw new Google_Logger_Exception(
|
117 |
-
sprintf(
|
118 |
-
"Logger Error: '%s'",
|
119 |
-
$this->trappedErrorString
|
120 |
-
),
|
121 |
-
$this->trappedErrorNumber
|
122 |
-
);
|
123 |
-
}
|
124 |
-
|
125 |
-
if ($needsChmod) {
|
126 |
-
@chmod($this->file, $this->mode & ~umask());
|
127 |
-
}
|
128 |
-
|
129 |
-
return $this->file = $fh;
|
130 |
-
}
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Closes the log stream resource.
|
134 |
-
*/
|
135 |
-
private function close()
|
136 |
-
{
|
137 |
-
if (is_resource($this->file)) {
|
138 |
-
fclose($this->file);
|
139 |
-
}
|
140 |
-
}
|
141 |
-
|
142 |
-
/**
|
143 |
-
* Traps `fopen()` errors.
|
144 |
-
*
|
145 |
-
* @param integer $errno The error number
|
146 |
-
* @param string $errstr The error string
|
147 |
-
*/
|
148 |
-
private function trapError($errno, $errstr)
|
149 |
-
{
|
150 |
-
$this->trappedErrorNumber = $errno;
|
151 |
-
$this->trappedErrorString = $errstr;
|
152 |
-
}
|
153 |
-
|
154 |
-
public function __destruct()
|
155 |
-
{
|
156 |
-
$this->close();
|
157 |
-
}
|
158 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* File logging class based on the PSR-3 standard.
|
24 |
+
*
|
25 |
+
* This logger writes to a PHP stream resource.
|
26 |
+
*/
|
27 |
+
class Google_Logger_File extends Google_Logger_Abstract
|
28 |
+
{
|
29 |
+
/**
|
30 |
+
* @var string|resource $file Where logs are written
|
31 |
+
*/
|
32 |
+
private $file;
|
33 |
+
/**
|
34 |
+
* @var integer $mode The mode to use if the log file needs to be created
|
35 |
+
*/
|
36 |
+
private $mode = 0640;
|
37 |
+
/**
|
38 |
+
* @var boolean $lock If a lock should be attempted before writing to the log
|
39 |
+
*/
|
40 |
+
private $lock = false;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @var integer $trappedErrorNumber Trapped error number
|
44 |
+
*/
|
45 |
+
private $trappedErrorNumber;
|
46 |
+
/**
|
47 |
+
* @var string $trappedErrorString Trapped error string
|
48 |
+
*/
|
49 |
+
private $trappedErrorString;
|
50 |
+
|
51 |
+
/**
|
52 |
+
* {@inheritdoc}
|
53 |
+
*/
|
54 |
+
public function __construct(Google_Client $client)
|
55 |
+
{
|
56 |
+
parent::__construct($client);
|
57 |
+
|
58 |
+
$file = $client->getClassConfig('Google_Logger_File', 'file');
|
59 |
+
if (!is_string($file) && !is_resource($file)) {
|
60 |
+
throw new Google_Logger_Exception(
|
61 |
+
'File logger requires a filename or a valid file pointer'
|
62 |
+
);
|
63 |
+
}
|
64 |
+
|
65 |
+
$mode = $client->getClassConfig('Google_Logger_File', 'mode');
|
66 |
+
if (!$mode) {
|
67 |
+
$this->mode = $mode;
|
68 |
+
}
|
69 |
+
|
70 |
+
$this->lock = (bool) $client->getClassConfig('Google_Logger_File', 'lock');
|
71 |
+
$this->file = $file;
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* {@inheritdoc}
|
76 |
+
*/
|
77 |
+
protected function write($message)
|
78 |
+
{
|
79 |
+
if (is_string($this->file)) {
|
80 |
+
$this->open();
|
81 |
+
} elseif (!is_resource($this->file)) {
|
82 |
+
throw new Google_Logger_Exception('File pointer is no longer available');
|
83 |
+
}
|
84 |
+
|
85 |
+
if ($this->lock) {
|
86 |
+
flock($this->file, LOCK_EX);
|
87 |
+
}
|
88 |
+
|
89 |
+
fwrite($this->file, (string) $message);
|
90 |
+
|
91 |
+
if ($this->lock) {
|
92 |
+
flock($this->file, LOCK_UN);
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Opens the log for writing.
|
98 |
+
*
|
99 |
+
* @return resource
|
100 |
+
*/
|
101 |
+
private function open()
|
102 |
+
{
|
103 |
+
// Used for trapping `fopen()` errors.
|
104 |
+
$this->trappedErrorNumber = null;
|
105 |
+
$this->trappedErrorString = null;
|
106 |
+
|
107 |
+
$old = set_error_handler(array($this, 'trapError'));
|
108 |
+
|
109 |
+
$needsChmod = !file_exists($this->file);
|
110 |
+
$fh = fopen($this->file, 'a');
|
111 |
+
|
112 |
+
restore_error_handler();
|
113 |
+
|
114 |
+
// Handles trapped `fopen()` errors.
|
115 |
+
if ($this->trappedErrorNumber) {
|
116 |
+
throw new Google_Logger_Exception(
|
117 |
+
sprintf(
|
118 |
+
"Logger Error: '%s'",
|
119 |
+
$this->trappedErrorString
|
120 |
+
),
|
121 |
+
$this->trappedErrorNumber
|
122 |
+
);
|
123 |
+
}
|
124 |
+
|
125 |
+
if ($needsChmod) {
|
126 |
+
@chmod($this->file, $this->mode & ~umask());
|
127 |
+
}
|
128 |
+
|
129 |
+
return $this->file = $fh;
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Closes the log stream resource.
|
134 |
+
*/
|
135 |
+
private function close()
|
136 |
+
{
|
137 |
+
if (is_resource($this->file)) {
|
138 |
+
fclose($this->file);
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Traps `fopen()` errors.
|
144 |
+
*
|
145 |
+
* @param integer $errno The error number
|
146 |
+
* @param string $errstr The error string
|
147 |
+
*/
|
148 |
+
private function trapError($errno, $errstr)
|
149 |
+
{
|
150 |
+
$this->trappedErrorNumber = $errno;
|
151 |
+
$this->trappedErrorString = $errstr;
|
152 |
+
}
|
153 |
+
|
154 |
+
public function __destruct()
|
155 |
+
{
|
156 |
+
$this->close();
|
157 |
+
}
|
158 |
+
}
|
app/api/Google/Logger/Null.php
CHANGED
@@ -1,43 +1,43 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Null logger based on the PSR-3 standard.
|
24 |
-
*
|
25 |
-
* This logger simply discards all messages.
|
26 |
-
*/
|
27 |
-
class Google_Logger_Null extends Google_Logger_Abstract
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* {@inheritdoc}
|
31 |
-
*/
|
32 |
-
public function shouldHandle($level)
|
33 |
-
{
|
34 |
-
return false;
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* {@inheritdoc}
|
39 |
-
*/
|
40 |
-
protected function write($message, array $context = array())
|
41 |
-
{
|
42 |
-
}
|
43 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Null logger based on the PSR-3 standard.
|
24 |
+
*
|
25 |
+
* This logger simply discards all messages.
|
26 |
+
*/
|
27 |
+
class Google_Logger_Null extends Google_Logger_Abstract
|
28 |
+
{
|
29 |
+
/**
|
30 |
+
* {@inheritdoc}
|
31 |
+
*/
|
32 |
+
public function shouldHandle($level)
|
33 |
+
{
|
34 |
+
return false;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* {@inheritdoc}
|
39 |
+
*/
|
40 |
+
protected function write($message, array $context = array())
|
41 |
+
{
|
42 |
+
}
|
43 |
+
}
|
app/api/Google/Logger/Psr.php
CHANGED
@@ -1,93 +1,93 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Psr logging class based on the PSR-3 standard.
|
24 |
-
*
|
25 |
-
* This logger will delegate all logging to a PSR-3 compatible logger specified
|
26 |
-
* with the `Google_Logger_Psr::setLogger()` method.
|
27 |
-
*/
|
28 |
-
class Google_Logger_Psr extends Google_Logger_Abstract
|
29 |
-
{
|
30 |
-
/**
|
31 |
-
* @param Psr\Log\LoggerInterface $logger The PSR-3 logger
|
32 |
-
*/
|
33 |
-
private $logger;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @param Google_Client $client The current Google client
|
37 |
-
* @param Psr\Log\LoggerInterface $logger PSR-3 logger where logging will be delegated.
|
38 |
-
*/
|
39 |
-
public function __construct(Google_Client $client, /*Psr\Log\LoggerInterface*/ $logger = null)
|
40 |
-
{
|
41 |
-
parent::__construct($client);
|
42 |
-
|
43 |
-
if ($logger) {
|
44 |
-
$this->setLogger($logger);
|
45 |
-
}
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Sets the PSR-3 logger where logging will be delegated.
|
50 |
-
*
|
51 |
-
* NOTE: The `$logger` should technically implement
|
52 |
-
* `Psr\Log\LoggerInterface`, but we don't explicitly require this so that
|
53 |
-
* we can be compatible with PHP 5.2.
|
54 |
-
*
|
55 |
-
* @param Psr\Log\LoggerInterface $logger The PSR-3 logger
|
56 |
-
*/
|
57 |
-
public function setLogger(/*Psr\Log\LoggerInterface*/ $logger)
|
58 |
-
{
|
59 |
-
$this->logger = $logger;
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* {@inheritdoc}
|
64 |
-
*/
|
65 |
-
public function shouldHandle($level)
|
66 |
-
{
|
67 |
-
return isset($this->logger) && parent::shouldHandle($level);
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* {@inheritdoc}
|
72 |
-
*/
|
73 |
-
public function log($level, $message, array $context = array())
|
74 |
-
{
|
75 |
-
if (!$this->shouldHandle($level)) {
|
76 |
-
return false;
|
77 |
-
}
|
78 |
-
|
79 |
-
if ($context) {
|
80 |
-
$this->reverseJsonInContext($context);
|
81 |
-
}
|
82 |
-
|
83 |
-
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
84 |
-
$this->logger->log($levelName, $message, $context);
|
85 |
-
}
|
86 |
-
|
87 |
-
/**
|
88 |
-
* {@inheritdoc}
|
89 |
-
*/
|
90 |
-
protected function write($message, array $context = array())
|
91 |
-
{
|
92 |
-
}
|
93 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Psr logging class based on the PSR-3 standard.
|
24 |
+
*
|
25 |
+
* This logger will delegate all logging to a PSR-3 compatible logger specified
|
26 |
+
* with the `Google_Logger_Psr::setLogger()` method.
|
27 |
+
*/
|
28 |
+
class Google_Logger_Psr extends Google_Logger_Abstract
|
29 |
+
{
|
30 |
+
/**
|
31 |
+
* @param Psr\Log\LoggerInterface $logger The PSR-3 logger
|
32 |
+
*/
|
33 |
+
private $logger;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @param Google_Client $client The current Google client
|
37 |
+
* @param Psr\Log\LoggerInterface $logger PSR-3 logger where logging will be delegated.
|
38 |
+
*/
|
39 |
+
public function __construct(Google_Client $client, /*Psr\Log\LoggerInterface*/ $logger = null)
|
40 |
+
{
|
41 |
+
parent::__construct($client);
|
42 |
+
|
43 |
+
if ($logger) {
|
44 |
+
$this->setLogger($logger);
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Sets the PSR-3 logger where logging will be delegated.
|
50 |
+
*
|
51 |
+
* NOTE: The `$logger` should technically implement
|
52 |
+
* `Psr\Log\LoggerInterface`, but we don't explicitly require this so that
|
53 |
+
* we can be compatible with PHP 5.2.
|
54 |
+
*
|
55 |
+
* @param Psr\Log\LoggerInterface $logger The PSR-3 logger
|
56 |
+
*/
|
57 |
+
public function setLogger(/*Psr\Log\LoggerInterface*/ $logger)
|
58 |
+
{
|
59 |
+
$this->logger = $logger;
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* {@inheritdoc}
|
64 |
+
*/
|
65 |
+
public function shouldHandle($level)
|
66 |
+
{
|
67 |
+
return isset($this->logger) && parent::shouldHandle($level);
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* {@inheritdoc}
|
72 |
+
*/
|
73 |
+
public function log($level, $message, array $context = array())
|
74 |
+
{
|
75 |
+
if (!$this->shouldHandle($level)) {
|
76 |
+
return false;
|
77 |
+
}
|
78 |
+
|
79 |
+
if ($context) {
|
80 |
+
$this->reverseJsonInContext($context);
|
81 |
+
}
|
82 |
+
|
83 |
+
$levelName = is_int($level) ? array_search($level, self::$levels) : $level;
|
84 |
+
$this->logger->log($levelName, $message, $context);
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* {@inheritdoc}
|
89 |
+
*/
|
90 |
+
protected function write($message, array $context = array())
|
91 |
+
{
|
92 |
+
}
|
93 |
+
}
|
app/api/Google/Model.php
CHANGED
@@ -1,295 +1,295 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* This class defines attributes, valid values, and usage which is generated
|
20 |
-
* from a given json schema.
|
21 |
-
* http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
|
22 |
-
*
|
23 |
-
*/
|
24 |
-
class Google_Model implements ArrayAccess
|
25 |
-
{
|
26 |
-
/**
|
27 |
-
* If you need to specify a NULL JSON value, use Google_Model::NULL_VALUE
|
28 |
-
* instead - it will be replaced when converting to JSON with a real null.
|
29 |
-
*/
|
30 |
-
const NULL_VALUE = "{}gapi-php-null";
|
31 |
-
protected $internal_gapi_mappings = array();
|
32 |
-
protected $modelData = array();
|
33 |
-
protected $processed = array();
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Polymorphic - accepts a variable number of arguments dependent
|
37 |
-
* on the type of the model subclass.
|
38 |
-
*/
|
39 |
-
final public function __construct()
|
40 |
-
{
|
41 |
-
if (func_num_args() == 1 && is_array(func_get_arg(0))) {
|
42 |
-
// Initialize the model with the array's contents.
|
43 |
-
$array = func_get_arg(0);
|
44 |
-
$this->mapTypes($array);
|
45 |
-
}
|
46 |
-
$this->gapiInit();
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Getter that handles passthrough access to the data array, and lazy object creation.
|
51 |
-
* @param string $key Property name.
|
52 |
-
* @return mixed The value if any, or null.
|
53 |
-
*/
|
54 |
-
public function __get($key)
|
55 |
-
{
|
56 |
-
$keyTypeName = $this->keyType($key);
|
57 |
-
$keyDataType = $this->dataType($key);
|
58 |
-
if (isset($this->$keyTypeName) && !isset($this->processed[$key])) {
|
59 |
-
if (isset($this->modelData[$key])) {
|
60 |
-
$val = $this->modelData[$key];
|
61 |
-
} else if (isset($this->$keyDataType) &&
|
62 |
-
($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) {
|
63 |
-
$val = array();
|
64 |
-
} else {
|
65 |
-
$val = null;
|
66 |
-
}
|
67 |
-
|
68 |
-
if ($this->isAssociativeArray($val)) {
|
69 |
-
if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
|
70 |
-
foreach ($val as $arrayKey => $arrayItem) {
|
71 |
-
$this->modelData[$key][$arrayKey] =
|
72 |
-
$this->createObjectFromName($keyTypeName, $arrayItem);
|
73 |
-
}
|
74 |
-
} else {
|
75 |
-
$this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val);
|
76 |
-
}
|
77 |
-
} else if (is_array($val)) {
|
78 |
-
$arrayObject = array();
|
79 |
-
foreach ($val as $arrayIndex => $arrayItem) {
|
80 |
-
$arrayObject[$arrayIndex] =
|
81 |
-
$this->createObjectFromName($keyTypeName, $arrayItem);
|
82 |
-
}
|
83 |
-
$this->modelData[$key] = $arrayObject;
|
84 |
-
}
|
85 |
-
$this->processed[$key] = true;
|
86 |
-
}
|
87 |
-
|
88 |
-
return isset($this->modelData[$key]) ? $this->modelData[$key] : null;
|
89 |
-
}
|
90 |
-
|
91 |
-
/**
|
92 |
-
* Initialize this object's properties from an array.
|
93 |
-
*
|
94 |
-
* @param array $array Used to seed this object's properties.
|
95 |
-
* @return void
|
96 |
-
*/
|
97 |
-
protected function mapTypes($array)
|
98 |
-
{
|
99 |
-
// Hard initialise simple types, lazy load more complex ones.
|
100 |
-
foreach ($array as $key => $val) {
|
101 |
-
if ( !property_exists($this, $this->keyType($key)) &&
|
102 |
-
property_exists($this, $key)) {
|
103 |
-
$this->$key = $val;
|
104 |
-
unset($array[$key]);
|
105 |
-
} elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) {
|
106 |
-
// This checks if property exists as camelCase, leaving it in array as snake_case
|
107 |
-
// in case of backwards compatibility issues.
|
108 |
-
$this->$camelKey = $val;
|
109 |
-
}
|
110 |
-
}
|
111 |
-
$this->modelData = $array;
|
112 |
-
}
|
113 |
-
|
114 |
-
/**
|
115 |
-
* Blank initialiser to be used in subclasses to do post-construction initialisation - this
|
116 |
-
* avoids the need for subclasses to have to implement the variadics handling in their
|
117 |
-
* constructors.
|
118 |
-
*/
|
119 |
-
protected function gapiInit()
|
120 |
-
{
|
121 |
-
return;
|
122 |
-
}
|
123 |
-
|
124 |
-
/**
|
125 |
-
* Create a simplified object suitable for straightforward
|
126 |
-
* conversion to JSON. This is relatively expensive
|
127 |
-
* due to the usage of reflection, but shouldn't be called
|
128 |
-
* a whole lot, and is the most straightforward way to filter.
|
129 |
-
*/
|
130 |
-
public function toSimpleObject()
|
131 |
-
{
|
132 |
-
$object = new stdClass();
|
133 |
-
|
134 |
-
// Process all other data.
|
135 |
-
foreach ($this->modelData as $key => $val) {
|
136 |
-
$result = $this->getSimpleValue($val);
|
137 |
-
if ($result !== null) {
|
138 |
-
$object->$key = $this->nullPlaceholderCheck($result);
|
139 |
-
}
|
140 |
-
}
|
141 |
-
|
142 |
-
// Process all public properties.
|
143 |
-
$reflect = new ReflectionObject($this);
|
144 |
-
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);
|
145 |
-
foreach ($props as $member) {
|
146 |
-
$name = $member->getName();
|
147 |
-
$result = $this->getSimpleValue($this->$name);
|
148 |
-
if ($result !== null) {
|
149 |
-
$name = $this->getMappedName($name);
|
150 |
-
$object->$name = $this->nullPlaceholderCheck($result);
|
151 |
-
}
|
152 |
-
}
|
153 |
-
|
154 |
-
return $object;
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Handle different types of values, primarily
|
159 |
-
* other objects and map and array data types.
|
160 |
-
*/
|
161 |
-
private function getSimpleValue($value)
|
162 |
-
{
|
163 |
-
if ($value instanceof Google_Model) {
|
164 |
-
return $value->toSimpleObject();
|
165 |
-
} else if (is_array($value)) {
|
166 |
-
$return = array();
|
167 |
-
foreach ($value as $key => $a_value) {
|
168 |
-
$a_value = $this->getSimpleValue($a_value);
|
169 |
-
if ($a_value !== null) {
|
170 |
-
$key = $this->getMappedName($key);
|
171 |
-
$return[$key] = $this->nullPlaceholderCheck($a_value);
|
172 |
-
}
|
173 |
-
}
|
174 |
-
return $return;
|
175 |
-
}
|
176 |
-
return $value;
|
177 |
-
}
|
178 |
-
|
179 |
-
/**
|
180 |
-
* Check whether the value is the null placeholder and return true null.
|
181 |
-
*/
|
182 |
-
private function nullPlaceholderCheck($value)
|
183 |
-
{
|
184 |
-
if ($value === self::NULL_VALUE) {
|
185 |
-
return null;
|
186 |
-
}
|
187 |
-
return $value;
|
188 |
-
}
|
189 |
-
|
190 |
-
/**
|
191 |
-
* If there is an internal name mapping, use that.
|
192 |
-
*/
|
193 |
-
private function getMappedName($key)
|
194 |
-
{
|
195 |
-
if (isset($this->internal_gapi_mappings) &&
|
196 |
-
isset($this->internal_gapi_mappings[$key])) {
|
197 |
-
$key = $this->internal_gapi_mappings[$key];
|
198 |
-
}
|
199 |
-
return $key;
|
200 |
-
}
|
201 |
-
|
202 |
-
/**
|
203 |
-
* Returns true only if the array is associative.
|
204 |
-
* @param array $array
|
205 |
-
* @return bool True if the array is associative.
|
206 |
-
*/
|
207 |
-
protected function isAssociativeArray($array)
|
208 |
-
{
|
209 |
-
if (!is_array($array)) {
|
210 |
-
return false;
|
211 |
-
}
|
212 |
-
$keys = array_keys($array);
|
213 |
-
foreach ($keys as $key) {
|
214 |
-
if (is_string($key)) {
|
215 |
-
return true;
|
216 |
-
}
|
217 |
-
}
|
218 |
-
return false;
|
219 |
-
}
|
220 |
-
|
221 |
-
/**
|
222 |
-
* Given a variable name, discover its type.
|
223 |
-
*
|
224 |
-
* @param $name
|
225 |
-
* @param $item
|
226 |
-
* @return object The object from the item.
|
227 |
-
*/
|
228 |
-
private function createObjectFromName($name, $item)
|
229 |
-
{
|
230 |
-
$type = $this->$name;
|
231 |
-
return new $type($item);
|
232 |
-
}
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Verify if $obj is an array.
|
236 |
-
* @throws Google_Exception Thrown if $obj isn't an array.
|
237 |
-
* @param array $obj Items that should be validated.
|
238 |
-
* @param string $method Method expecting an array as an argument.
|
239 |
-
*/
|
240 |
-
public function assertIsArray($obj, $method)
|
241 |
-
{
|
242 |
-
if ($obj && !is_array($obj)) {
|
243 |
-
throw new Google_Exception(
|
244 |
-
"Incorrect parameter type passed to $method(). Expected an array."
|
245 |
-
);
|
246 |
-
}
|
247 |
-
}
|
248 |
-
|
249 |
-
public function offsetExists($offset)
|
250 |
-
{
|
251 |
-
return isset($this->$offset) || isset($this->modelData[$offset]);
|
252 |
-
}
|
253 |
-
|
254 |
-
public function offsetGet($offset)
|
255 |
-
{
|
256 |
-
return isset($this->$offset) ?
|
257 |
-
$this->$offset :
|
258 |
-
$this->__get($offset);
|
259 |
-
}
|
260 |
-
|
261 |
-
public function offsetSet($offset, $value)
|
262 |
-
{
|
263 |
-
if (property_exists($this, $offset)) {
|
264 |
-
$this->$offset = $value;
|
265 |
-
} else {
|
266 |
-
$this->modelData[$offset] = $value;
|
267 |
-
$this->processed[$offset] = true;
|
268 |
-
}
|
269 |
-
}
|
270 |
-
|
271 |
-
public function offsetUnset($offset)
|
272 |
-
{
|
273 |
-
unset($this->modelData[$offset]);
|
274 |
-
}
|
275 |
-
|
276 |
-
protected function keyType($key)
|
277 |
-
{
|
278 |
-
return $key . "Type";
|
279 |
-
}
|
280 |
-
|
281 |
-
protected function dataType($key)
|
282 |
-
{
|
283 |
-
return $key . "DataType";
|
284 |
-
}
|
285 |
-
|
286 |
-
public function __isset($key)
|
287 |
-
{
|
288 |
-
return isset($this->modelData[$key]);
|
289 |
-
}
|
290 |
-
|
291 |
-
public function __unset($key)
|
292 |
-
{
|
293 |
-
unset($this->modelData[$key]);
|
294 |
-
}
|
295 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* This class defines attributes, valid values, and usage which is generated
|
20 |
+
* from a given json schema.
|
21 |
+
* http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
class Google_Model implements ArrayAccess
|
25 |
+
{
|
26 |
+
/**
|
27 |
+
* If you need to specify a NULL JSON value, use Google_Model::NULL_VALUE
|
28 |
+
* instead - it will be replaced when converting to JSON with a real null.
|
29 |
+
*/
|
30 |
+
const NULL_VALUE = "{}gapi-php-null";
|
31 |
+
protected $internal_gapi_mappings = array();
|
32 |
+
protected $modelData = array();
|
33 |
+
protected $processed = array();
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Polymorphic - accepts a variable number of arguments dependent
|
37 |
+
* on the type of the model subclass.
|
38 |
+
*/
|
39 |
+
final public function __construct()
|
40 |
+
{
|
41 |
+
if (func_num_args() == 1 && is_array(func_get_arg(0))) {
|
42 |
+
// Initialize the model with the array's contents.
|
43 |
+
$array = func_get_arg(0);
|
44 |
+
$this->mapTypes($array);
|
45 |
+
}
|
46 |
+
$this->gapiInit();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Getter that handles passthrough access to the data array, and lazy object creation.
|
51 |
+
* @param string $key Property name.
|
52 |
+
* @return mixed The value if any, or null.
|
53 |
+
*/
|
54 |
+
public function __get($key)
|
55 |
+
{
|
56 |
+
$keyTypeName = $this->keyType($key);
|
57 |
+
$keyDataType = $this->dataType($key);
|
58 |
+
if (isset($this->$keyTypeName) && !isset($this->processed[$key])) {
|
59 |
+
if (isset($this->modelData[$key])) {
|
60 |
+
$val = $this->modelData[$key];
|
61 |
+
} else if (isset($this->$keyDataType) &&
|
62 |
+
($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) {
|
63 |
+
$val = array();
|
64 |
+
} else {
|
65 |
+
$val = null;
|
66 |
+
}
|
67 |
+
|
68 |
+
if ($this->isAssociativeArray($val)) {
|
69 |
+
if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
|
70 |
+
foreach ($val as $arrayKey => $arrayItem) {
|
71 |
+
$this->modelData[$key][$arrayKey] =
|
72 |
+
$this->createObjectFromName($keyTypeName, $arrayItem);
|
73 |
+
}
|
74 |
+
} else {
|
75 |
+
$this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val);
|
76 |
+
}
|
77 |
+
} else if (is_array($val)) {
|
78 |
+
$arrayObject = array();
|
79 |
+
foreach ($val as $arrayIndex => $arrayItem) {
|
80 |
+
$arrayObject[$arrayIndex] =
|
81 |
+
$this->createObjectFromName($keyTypeName, $arrayItem);
|
82 |
+
}
|
83 |
+
$this->modelData[$key] = $arrayObject;
|
84 |
+
}
|
85 |
+
$this->processed[$key] = true;
|
86 |
+
}
|
87 |
+
|
88 |
+
return isset($this->modelData[$key]) ? $this->modelData[$key] : null;
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Initialize this object's properties from an array.
|
93 |
+
*
|
94 |
+
* @param array $array Used to seed this object's properties.
|
95 |
+
* @return void
|
96 |
+
*/
|
97 |
+
protected function mapTypes($array)
|
98 |
+
{
|
99 |
+
// Hard initialise simple types, lazy load more complex ones.
|
100 |
+
foreach ($array as $key => $val) {
|
101 |
+
if ( !property_exists($this, $this->keyType($key)) &&
|
102 |
+
property_exists($this, $key)) {
|
103 |
+
$this->$key = $val;
|
104 |
+
unset($array[$key]);
|
105 |
+
} elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) {
|
106 |
+
// This checks if property exists as camelCase, leaving it in array as snake_case
|
107 |
+
// in case of backwards compatibility issues.
|
108 |
+
$this->$camelKey = $val;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
$this->modelData = $array;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Blank initialiser to be used in subclasses to do post-construction initialisation - this
|
116 |
+
* avoids the need for subclasses to have to implement the variadics handling in their
|
117 |
+
* constructors.
|
118 |
+
*/
|
119 |
+
protected function gapiInit()
|
120 |
+
{
|
121 |
+
return;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Create a simplified object suitable for straightforward
|
126 |
+
* conversion to JSON. This is relatively expensive
|
127 |
+
* due to the usage of reflection, but shouldn't be called
|
128 |
+
* a whole lot, and is the most straightforward way to filter.
|
129 |
+
*/
|
130 |
+
public function toSimpleObject()
|
131 |
+
{
|
132 |
+
$object = new stdClass();
|
133 |
+
|
134 |
+
// Process all other data.
|
135 |
+
foreach ($this->modelData as $key => $val) {
|
136 |
+
$result = $this->getSimpleValue($val);
|
137 |
+
if ($result !== null) {
|
138 |
+
$object->$key = $this->nullPlaceholderCheck($result);
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
// Process all public properties.
|
143 |
+
$reflect = new ReflectionObject($this);
|
144 |
+
$props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);
|
145 |
+
foreach ($props as $member) {
|
146 |
+
$name = $member->getName();
|
147 |
+
$result = $this->getSimpleValue($this->$name);
|
148 |
+
if ($result !== null) {
|
149 |
+
$name = $this->getMappedName($name);
|
150 |
+
$object->$name = $this->nullPlaceholderCheck($result);
|
151 |
+
}
|
152 |
+
}
|
153 |
+
|
154 |
+
return $object;
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Handle different types of values, primarily
|
159 |
+
* other objects and map and array data types.
|
160 |
+
*/
|
161 |
+
private function getSimpleValue($value)
|
162 |
+
{
|
163 |
+
if ($value instanceof Google_Model) {
|
164 |
+
return $value->toSimpleObject();
|
165 |
+
} else if (is_array($value)) {
|
166 |
+
$return = array();
|
167 |
+
foreach ($value as $key => $a_value) {
|
168 |
+
$a_value = $this->getSimpleValue($a_value);
|
169 |
+
if ($a_value !== null) {
|
170 |
+
$key = $this->getMappedName($key);
|
171 |
+
$return[$key] = $this->nullPlaceholderCheck($a_value);
|
172 |
+
}
|
173 |
+
}
|
174 |
+
return $return;
|
175 |
+
}
|
176 |
+
return $value;
|
177 |
+
}
|
178 |
+
|
179 |
+
/**
|
180 |
+
* Check whether the value is the null placeholder and return true null.
|
181 |
+
*/
|
182 |
+
private function nullPlaceholderCheck($value)
|
183 |
+
{
|
184 |
+
if ($value === self::NULL_VALUE) {
|
185 |
+
return null;
|
186 |
+
}
|
187 |
+
return $value;
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* If there is an internal name mapping, use that.
|
192 |
+
*/
|
193 |
+
private function getMappedName($key)
|
194 |
+
{
|
195 |
+
if (isset($this->internal_gapi_mappings) &&
|
196 |
+
isset($this->internal_gapi_mappings[$key])) {
|
197 |
+
$key = $this->internal_gapi_mappings[$key];
|
198 |
+
}
|
199 |
+
return $key;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Returns true only if the array is associative.
|
204 |
+
* @param array $array
|
205 |
+
* @return bool True if the array is associative.
|
206 |
+
*/
|
207 |
+
protected function isAssociativeArray($array)
|
208 |
+
{
|
209 |
+
if (!is_array($array)) {
|
210 |
+
return false;
|
211 |
+
}
|
212 |
+
$keys = array_keys($array);
|
213 |
+
foreach ($keys as $key) {
|
214 |
+
if (is_string($key)) {
|
215 |
+
return true;
|
216 |
+
}
|
217 |
+
}
|
218 |
+
return false;
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Given a variable name, discover its type.
|
223 |
+
*
|
224 |
+
* @param $name
|
225 |
+
* @param $item
|
226 |
+
* @return object The object from the item.
|
227 |
+
*/
|
228 |
+
private function createObjectFromName($name, $item)
|
229 |
+
{
|
230 |
+
$type = $this->$name;
|
231 |
+
return new $type($item);
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* Verify if $obj is an array.
|
236 |
+
* @throws Google_Exception Thrown if $obj isn't an array.
|
237 |
+
* @param array $obj Items that should be validated.
|
238 |
+
* @param string $method Method expecting an array as an argument.
|
239 |
+
*/
|
240 |
+
public function assertIsArray($obj, $method)
|
241 |
+
{
|
242 |
+
if ($obj && !is_array($obj)) {
|
243 |
+
throw new Google_Exception(
|
244 |
+
"Incorrect parameter type passed to $method(). Expected an array."
|
245 |
+
);
|
246 |
+
}
|
247 |
+
}
|
248 |
+
|
249 |
+
public function offsetExists($offset)
|
250 |
+
{
|
251 |
+
return isset($this->$offset) || isset($this->modelData[$offset]);
|
252 |
+
}
|
253 |
+
|
254 |
+
public function offsetGet($offset)
|
255 |
+
{
|
256 |
+
return isset($this->$offset) ?
|
257 |
+
$this->$offset :
|
258 |
+
$this->__get($offset);
|
259 |
+
}
|
260 |
+
|
261 |
+
public function offsetSet($offset, $value)
|
262 |
+
{
|
263 |
+
if (property_exists($this, $offset)) {
|
264 |
+
$this->$offset = $value;
|
265 |
+
} else {
|
266 |
+
$this->modelData[$offset] = $value;
|
267 |
+
$this->processed[$offset] = true;
|
268 |
+
}
|
269 |
+
}
|
270 |
+
|
271 |
+
public function offsetUnset($offset)
|
272 |
+
{
|
273 |
+
unset($this->modelData[$offset]);
|
274 |
+
}
|
275 |
+
|
276 |
+
protected function keyType($key)
|
277 |
+
{
|
278 |
+
return $key . "Type";
|
279 |
+
}
|
280 |
+
|
281 |
+
protected function dataType($key)
|
282 |
+
{
|
283 |
+
return $key . "DataType";
|
284 |
+
}
|
285 |
+
|
286 |
+
public function __isset($key)
|
287 |
+
{
|
288 |
+
return isset($this->modelData[$key]);
|
289 |
+
}
|
290 |
+
|
291 |
+
public function __unset($key)
|
292 |
+
{
|
293 |
+
unset($this->modelData[$key]);
|
294 |
+
}
|
295 |
+
}
|
app/api/Google/Service.php
CHANGED
@@ -1,56 +1,56 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
class Google_Service
|
19 |
-
{
|
20 |
-
public $batchPath;
|
21 |
-
public $rootUrl;
|
22 |
-
public $version;
|
23 |
-
public $servicePath;
|
24 |
-
public $availableScopes;
|
25 |
-
public $resource;
|
26 |
-
private $client;
|
27 |
-
|
28 |
-
public function __construct(Google_Client $client)
|
29 |
-
{
|
30 |
-
$this->client = $client;
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Return the associated Google_Client class.
|
35 |
-
* @return Google_Client
|
36 |
-
*/
|
37 |
-
public function getClient()
|
38 |
-
{
|
39 |
-
return $this->client;
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Create a new HTTP Batch handler for this service
|
44 |
-
*
|
45 |
-
* @return Google_Http_Batch
|
46 |
-
*/
|
47 |
-
public function createBatch()
|
48 |
-
{
|
49 |
-
return new Google_Http_Batch(
|
50 |
-
$this->client,
|
51 |
-
false,
|
52 |
-
$this->rootUrl,
|
53 |
-
$this->batchPath
|
54 |
-
);
|
55 |
-
}
|
56 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
class Google_Service
|
19 |
+
{
|
20 |
+
public $batchPath;
|
21 |
+
public $rootUrl;
|
22 |
+
public $version;
|
23 |
+
public $servicePath;
|
24 |
+
public $availableScopes;
|
25 |
+
public $resource;
|
26 |
+
private $client;
|
27 |
+
|
28 |
+
public function __construct(Google_Client $client)
|
29 |
+
{
|
30 |
+
$this->client = $client;
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Return the associated Google_Client class.
|
35 |
+
* @return Google_Client
|
36 |
+
*/
|
37 |
+
public function getClient()
|
38 |
+
{
|
39 |
+
return $this->client;
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Create a new HTTP Batch handler for this service
|
44 |
+
*
|
45 |
+
* @return Google_Http_Batch
|
46 |
+
*/
|
47 |
+
public function createBatch()
|
48 |
+
{
|
49 |
+
return new Google_Http_Batch(
|
50 |
+
$this->client,
|
51 |
+
false,
|
52 |
+
$this->rootUrl,
|
53 |
+
$this->batchPath
|
54 |
+
);
|
55 |
+
}
|
56 |
+
}
|
app/api/Google/Service/Calendar.php
CHANGED
@@ -1,3856 +1,3856 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
4 |
-
* use this file except in compliance with the License. You may obtain a copy of
|
5 |
-
* the License at
|
6 |
-
*
|
7 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
8 |
-
*
|
9 |
-
* Unless required by applicable law or agreed to in writing, software
|
10 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12 |
-
* License for the specific language governing permissions and limitations under
|
13 |
-
* the License.
|
14 |
-
*/
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Service definition for Calendar (v3).
|
18 |
-
*
|
19 |
-
* <p>
|
20 |
-
* Lets you manipulate events and other calendar data.</p>
|
21 |
-
*
|
22 |
-
* <p>
|
23 |
-
* For more information about this service, see the API
|
24 |
-
* <a href="https://developers.google.com/google-apps/calendar/firstapp" target="_blank">Documentation</a>
|
25 |
-
* </p>
|
26 |
-
*
|
27 |
-
* @author Google, Inc.
|
28 |
-
*/
|
29 |
-
class Google_Service_Calendar extends Google_Service
|
30 |
-
{
|
31 |
-
/** Manage your calendars. */
|
32 |
-
const CALENDAR =
|
33 |
-
"https://www.googleapis.com/auth/calendar";
|
34 |
-
/** View your calendars. */
|
35 |
-
const CALENDAR_READONLY =
|
36 |
-
"https://www.googleapis.com/auth/calendar.readonly";
|
37 |
-
|
38 |
-
public $acl;
|
39 |
-
public $calendarList;
|
40 |
-
public $calendars;
|
41 |
-
public $channels;
|
42 |
-
public $colors;
|
43 |
-
public $events;
|
44 |
-
public $freebusy;
|
45 |
-
public $settings;
|
46 |
-
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Constructs the internal representation of the Calendar service.
|
50 |
-
*
|
51 |
-
* @param Google_Client $client
|
52 |
-
*/
|
53 |
-
public function __construct(Google_Client $client)
|
54 |
-
{
|
55 |
-
parent::__construct($client);
|
56 |
-
$this->rootUrl = 'https://www.googleapis.com/';
|
57 |
-
$this->servicePath = 'calendar/v3/';
|
58 |
-
$this->version = 'v3';
|
59 |
-
$this->serviceName = 'calendar';
|
60 |
-
|
61 |
-
$this->acl = new Google_Service_Calendar_Acl_Resource(
|
62 |
-
$this,
|
63 |
-
$this->serviceName,
|
64 |
-
'acl',
|
65 |
-
array(
|
66 |
-
'methods' => array(
|
67 |
-
'delete' => array(
|
68 |
-
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
69 |
-
'httpMethod' => 'DELETE',
|
70 |
-
'parameters' => array(
|
71 |
-
'calendarId' => array(
|
72 |
-
'location' => 'path',
|
73 |
-
'type' => 'string',
|
74 |
-
'required' => true,
|
75 |
-
),
|
76 |
-
'ruleId' => array(
|
77 |
-
'location' => 'path',
|
78 |
-
'type' => 'string',
|
79 |
-
'required' => true,
|
80 |
-
),
|
81 |
-
),
|
82 |
-
),'get' => array(
|
83 |
-
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
84 |
-
'httpMethod' => 'GET',
|
85 |
-
'parameters' => array(
|
86 |
-
'calendarId' => array(
|
87 |
-
'location' => 'path',
|
88 |
-
'type' => 'string',
|
89 |
-
'required' => true,
|
90 |
-
),
|
91 |
-
'ruleId' => array(
|
92 |
-
'location' => 'path',
|
93 |
-
'type' => 'string',
|
94 |
-
'required' => true,
|
95 |
-
),
|
96 |
-
),
|
97 |
-
),'insert' => array(
|
98 |
-
'path' => 'calendars/{calendarId}/acl',
|
99 |
-
'httpMethod' => 'POST',
|
100 |
-
'parameters' => array(
|
101 |
-
'calendarId' => array(
|
102 |
-
'location' => 'path',
|
103 |
-
'type' => 'string',
|
104 |
-
'required' => true,
|
105 |
-
),
|
106 |
-
),
|
107 |
-
),'list' => array(
|
108 |
-
'path' => 'calendars/{calendarId}/acl',
|
109 |
-
'httpMethod' => 'GET',
|
110 |
-
'parameters' => array(
|
111 |
-
'calendarId' => array(
|
112 |
-
'location' => 'path',
|
113 |
-
'type' => 'string',
|
114 |
-
'required' => true,
|
115 |
-
),
|
116 |
-
'maxResults' => array(
|
117 |
-
'location' => 'query',
|
118 |
-
'type' => 'integer',
|
119 |
-
),
|
120 |
-
'pageToken' => array(
|
121 |
-
'location' => 'query',
|
122 |
-
'type' => 'string',
|
123 |
-
),
|
124 |
-
'showDeleted' => array(
|
125 |
-
'location' => 'query',
|
126 |
-
'type' => 'boolean',
|
127 |
-
),
|
128 |
-
'syncToken' => array(
|
129 |
-
'location' => 'query',
|
130 |
-
'type' => 'string',
|
131 |
-
),
|
132 |
-
),
|
133 |
-
),'patch' => array(
|
134 |
-
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
135 |
-
'httpMethod' => 'PATCH',
|
136 |
-
'parameters' => array(
|
137 |
-
'calendarId' => array(
|
138 |
-
'location' => 'path',
|
139 |
-
'type' => 'string',
|
140 |
-
'required' => true,
|
141 |
-
),
|
142 |
-
'ruleId' => array(
|
143 |
-
'location' => 'path',
|
144 |
-
'type' => 'string',
|
145 |
-
'required' => true,
|
146 |
-
),
|
147 |
-
),
|
148 |
-
),'update' => array(
|
149 |
-
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
150 |
-
'httpMethod' => 'PUT',
|
151 |
-
'parameters' => array(
|
152 |
-
'calendarId' => array(
|
153 |
-
'location' => 'path',
|
154 |
-
'type' => 'string',
|
155 |
-
'required' => true,
|
156 |
-
),
|
157 |
-
'ruleId' => array(
|
158 |
-
'location' => 'path',
|
159 |
-
'type' => 'string',
|
160 |
-
'required' => true,
|
161 |
-
),
|
162 |
-
),
|
163 |
-
),'watch' => array(
|
164 |
-
'path' => 'calendars/{calendarId}/acl/watch',
|
165 |
-
'httpMethod' => 'POST',
|
166 |
-
'parameters' => array(
|
167 |
-
'calendarId' => array(
|
168 |
-
'location' => 'path',
|
169 |
-
'type' => 'string',
|
170 |
-
'required' => true,
|
171 |
-
),
|
172 |
-
'maxResults' => array(
|
173 |
-
'location' => 'query',
|
174 |
-
'type' => 'integer',
|
175 |
-
),
|
176 |
-
'pageToken' => array(
|
177 |
-
'location' => 'query',
|
178 |
-
'type' => 'string',
|
179 |
-
),
|
180 |
-
'showDeleted' => array(
|
181 |
-
'location' => 'query',
|
182 |
-
'type' => 'boolean',
|
183 |
-
),
|
184 |
-
'syncToken' => array(
|
185 |
-
'location' => 'query',
|
186 |
-
'type' => 'string',
|
187 |
-
),
|
188 |
-
),
|
189 |
-
),
|
190 |
-
)
|
191 |
-
)
|
192 |
-
);
|
193 |
-
$this->calendarList = new Google_Service_Calendar_CalendarList_Resource(
|
194 |
-
$this,
|
195 |
-
$this->serviceName,
|
196 |
-
'calendarList',
|
197 |
-
array(
|
198 |
-
'methods' => array(
|
199 |
-
'delete' => array(
|
200 |
-
'path' => 'users/me/calendarList/{calendarId}',
|
201 |
-
'httpMethod' => 'DELETE',
|
202 |
-
'parameters' => array(
|
203 |
-
'calendarId' => array(
|
204 |
-
'location' => 'path',
|
205 |
-
'type' => 'string',
|
206 |
-
'required' => true,
|
207 |
-
),
|
208 |
-
),
|
209 |
-
),'get' => array(
|
210 |
-
'path' => 'users/me/calendarList/{calendarId}',
|
211 |
-
'httpMethod' => 'GET',
|
212 |
-
'parameters' => array(
|
213 |
-
'calendarId' => array(
|
214 |
-
'location' => 'path',
|
215 |
-
'type' => 'string',
|
216 |
-
'required' => true,
|
217 |
-
),
|
218 |
-
),
|
219 |
-
),'insert' => array(
|
220 |
-
'path' => 'users/me/calendarList',
|
221 |
-
'httpMethod' => 'POST',
|
222 |
-
'parameters' => array(
|
223 |
-
'colorRgbFormat' => array(
|
224 |
-
'location' => 'query',
|
225 |
-
'type' => 'boolean',
|
226 |
-
),
|
227 |
-
),
|
228 |
-
),'list' => array(
|
229 |
-
'path' => 'users/me/calendarList',
|
230 |
-
'httpMethod' => 'GET',
|
231 |
-
'parameters' => array(
|
232 |
-
'maxResults' => array(
|
233 |
-
'location' => 'query',
|
234 |
-
'type' => 'integer',
|
235 |
-
),
|
236 |
-
'minAccessRole' => array(
|
237 |
-
'location' => 'query',
|
238 |
-
'type' => 'string',
|
239 |
-
),
|
240 |
-
'pageToken' => array(
|
241 |
-
'location' => 'query',
|
242 |
-
'type' => 'string',
|
243 |
-
),
|
244 |
-
'showDeleted' => array(
|
245 |
-
'location' => 'query',
|
246 |
-
'type' => 'boolean',
|
247 |
-
),
|
248 |
-
'showHidden' => array(
|
249 |
-
'location' => 'query',
|
250 |
-
'type' => 'boolean',
|
251 |
-
),
|
252 |
-
'syncToken' => array(
|
253 |
-
'location' => 'query',
|
254 |
-
'type' => 'string',
|
255 |
-
),
|
256 |
-
),
|
257 |
-
),'patch' => array(
|
258 |
-
'path' => 'users/me/calendarList/{calendarId}',
|
259 |
-
'httpMethod' => 'PATCH',
|
260 |
-
'parameters' => array(
|
261 |
-
'calendarId' => array(
|
262 |
-
'location' => 'path',
|
263 |
-
'type' => 'string',
|
264 |
-
'required' => true,
|
265 |
-
),
|
266 |
-
'colorRgbFormat' => array(
|
267 |
-
'location' => 'query',
|
268 |
-
'type' => 'boolean',
|
269 |
-
),
|
270 |
-
),
|
271 |
-
),'update' => array(
|
272 |
-
'path' => 'users/me/calendarList/{calendarId}',
|
273 |
-
'httpMethod' => 'PUT',
|
274 |
-
'parameters' => array(
|
275 |
-
'calendarId' => array(
|
276 |
-
'location' => 'path',
|
277 |
-
'type' => 'string',
|
278 |
-
'required' => true,
|
279 |
-
),
|
280 |
-
'colorRgbFormat' => array(
|
281 |
-
'location' => 'query',
|
282 |
-
'type' => 'boolean',
|
283 |
-
),
|
284 |
-
),
|
285 |
-
),'watch' => array(
|
286 |
-
'path' => 'users/me/calendarList/watch',
|
287 |
-
'httpMethod' => 'POST',
|
288 |
-
'parameters' => array(
|
289 |
-
'maxResults' => array(
|
290 |
-
'location' => 'query',
|
291 |
-
'type' => 'integer',
|
292 |
-
),
|
293 |
-
'minAccessRole' => array(
|
294 |
-
'location' => 'query',
|
295 |
-
'type' => 'string',
|
296 |
-
),
|
297 |
-
'pageToken' => array(
|
298 |
-
'location' => 'query',
|
299 |
-
'type' => 'string',
|
300 |
-
),
|
301 |
-
'showDeleted' => array(
|
302 |
-
'location' => 'query',
|
303 |
-
'type' => 'boolean',
|
304 |
-
),
|
305 |
-
'showHidden' => array(
|
306 |
-
'location' => 'query',
|
307 |
-
'type' => 'boolean',
|
308 |
-
),
|
309 |
-
'syncToken' => array(
|
310 |
-
'location' => 'query',
|
311 |
-
'type' => 'string',
|
312 |
-
),
|
313 |
-
),
|
314 |
-
),
|
315 |
-
)
|
316 |
-
)
|
317 |
-
);
|
318 |
-
$this->calendars = new Google_Service_Calendar_Calendars_Resource(
|
319 |
-
$this,
|
320 |
-
$this->serviceName,
|
321 |
-
'calendars',
|
322 |
-
array(
|
323 |
-
'methods' => array(
|
324 |
-
'clear' => array(
|
325 |
-
'path' => 'calendars/{calendarId}/clear',
|
326 |
-
'httpMethod' => 'POST',
|
327 |
-
'parameters' => array(
|
328 |
-
'calendarId' => array(
|
329 |
-
'location' => 'path',
|
330 |
-
'type' => 'string',
|
331 |
-
'required' => true,
|
332 |
-
),
|
333 |
-
),
|
334 |
-
),'delete' => array(
|
335 |
-
'path' => 'calendars/{calendarId}',
|
336 |
-
'httpMethod' => 'DELETE',
|
337 |
-
'parameters' => array(
|
338 |
-
'calendarId' => array(
|
339 |
-
'location' => 'path',
|
340 |
-
'type' => 'string',
|
341 |
-
'required' => true,
|
342 |
-
),
|
343 |
-
),
|
344 |
-
),'get' => array(
|
345 |
-
'path' => 'calendars/{calendarId}',
|
346 |
-
'httpMethod' => 'GET',
|
347 |
-
'parameters' => array(
|
348 |
-
'calendarId' => array(
|
349 |
-
'location' => 'path',
|
350 |
-
'type' => 'string',
|
351 |
-
'required' => true,
|
352 |
-
),
|
353 |
-
),
|
354 |
-
),'insert' => array(
|
355 |
-
'path' => 'calendars',
|
356 |
-
'httpMethod' => 'POST',
|
357 |
-
'parameters' => array(),
|
358 |
-
),'patch' => array(
|
359 |
-
'path' => 'calendars/{calendarId}',
|
360 |
-
'httpMethod' => 'PATCH',
|
361 |
-
'parameters' => array(
|
362 |
-
'calendarId' => array(
|
363 |
-
'location' => 'path',
|
364 |
-
'type' => 'string',
|
365 |
-
'required' => true,
|
366 |
-
),
|
367 |
-
),
|
368 |
-
),'update' => array(
|
369 |
-
'path' => 'calendars/{calendarId}',
|
370 |
-
'httpMethod' => 'PUT',
|
371 |
-
'parameters' => array(
|
372 |
-
'calendarId' => array(
|
373 |
-
'location' => 'path',
|
374 |
-
'type' => 'string',
|
375 |
-
'required' => true,
|
376 |
-
),
|
377 |
-
),
|
378 |
-
),
|
379 |
-
)
|
380 |
-
)
|
381 |
-
);
|
382 |
-
$this->channels = new Google_Service_Calendar_Channels_Resource(
|
383 |
-
$this,
|
384 |
-
$this->serviceName,
|
385 |
-
'channels',
|
386 |
-
array(
|
387 |
-
'methods' => array(
|
388 |
-
'stop' => array(
|
389 |
-
'path' => 'channels/stop',
|
390 |
-
'httpMethod' => 'POST',
|
391 |
-
'parameters' => array(),
|
392 |
-
),
|
393 |
-
)
|
394 |
-
)
|
395 |
-
);
|
396 |
-
$this->colors = new Google_Service_Calendar_Colors_Resource(
|
397 |
-
$this,
|
398 |
-
$this->serviceName,
|
399 |
-
'colors',
|
400 |
-
array(
|
401 |
-
'methods' => array(
|
402 |
-
'get' => array(
|
403 |
-
'path' => 'colors',
|
404 |
-
'httpMethod' => 'GET',
|
405 |
-
'parameters' => array(),
|
406 |
-
),
|
407 |
-
)
|
408 |
-
)
|
409 |
-
);
|
410 |
-
$this->events = new Google_Service_Calendar_Events_Resource(
|
411 |
-
$this,
|
412 |
-
$this->serviceName,
|
413 |
-
'events',
|
414 |
-
array(
|
415 |
-
'methods' => array(
|
416 |
-
'delete' => array(
|
417 |
-
'path' => 'calendars/{calendarId}/events/{eventId}',
|
418 |
-
'httpMethod' => 'DELETE',
|
419 |
-
'parameters' => array(
|
420 |
-
'calendarId' => array(
|
421 |
-
'location' => 'path',
|
422 |
-
'type' => 'string',
|
423 |
-
'required' => true,
|
424 |
-
),
|
425 |
-
'eventId' => array(
|
426 |
-
'location' => 'path',
|
427 |
-
'type' => 'string',
|
428 |
-
'required' => true,
|
429 |
-
),
|
430 |
-
'sendNotifications' => array(
|
431 |
-
'location' => 'query',
|
432 |
-
'type' => 'boolean',
|
433 |
-
),
|
434 |
-
),
|
435 |
-
),'get' => array(
|
436 |
-
'path' => 'calendars/{calendarId}/events/{eventId}',
|
437 |
-
'httpMethod' => 'GET',
|
438 |
-
'parameters' => array(
|
439 |
-
'calendarId' => array(
|
440 |
-
'location' => 'path',
|
441 |
-
'type' => 'string',
|
442 |
-
'required' => true,
|
443 |
-
),
|
444 |
-
'eventId' => array(
|
445 |
-
'location' => 'path',
|
446 |
-
'type' => 'string',
|
447 |
-
'required' => true,
|
448 |
-
),
|
449 |
-
'alwaysIncludeEmail' => array(
|
450 |
-
'location' => 'query',
|
451 |
-
'type' => 'boolean',
|
452 |
-
),
|
453 |
-
'maxAttendees' => array(
|
454 |
-
'location' => 'query',
|
455 |
-
'type' => 'integer',
|
456 |
-
),
|
457 |
-
'timeZone' => array(
|
458 |
-
'location' => 'query',
|
459 |
-
'type' => 'string',
|
460 |
-
),
|
461 |
-
),
|
462 |
-
),'import' => array(
|
463 |
-
'path' => 'calendars/{calendarId}/events/import',
|
464 |
-
'httpMethod' => 'POST',
|
465 |
-
'parameters' => array(
|
466 |
-
'calendarId' => array(
|
467 |
-
'location' => 'path',
|
468 |
-
'type' => 'string',
|
469 |
-
'required' => true,
|
470 |
-
),
|
471 |
-
'supportsAttachments' => array(
|
472 |
-
'location' => 'query',
|
473 |
-
'type' => 'boolean',
|
474 |
-
),
|
475 |
-
),
|
476 |
-
),'insert' => array(
|
477 |
-
'path' => 'calendars/{calendarId}/events',
|
478 |
-
'httpMethod' => 'POST',
|
479 |
-
'parameters' => array(
|
480 |
-
'calendarId' => array(
|
481 |
-
'location' => 'path',
|
482 |
-
'type' => 'string',
|
483 |
-
'required' => true,
|
484 |
-
),
|
485 |
-
'maxAttendees' => array(
|
486 |
-
'location' => 'query',
|
487 |
-
'type' => 'integer',
|
488 |
-
),
|
489 |
-
'sendNotifications' => array(
|
490 |
-
'location' => 'query',
|
491 |
-
'type' => 'boolean',
|
492 |
-
),
|
493 |
-
'supportsAttachments' => array(
|
494 |
-
'location' => 'query',
|
495 |
-
'type' => 'boolean',
|
496 |
-
),
|
497 |
-
),
|
498 |
-
),'instances' => array(
|
499 |
-
'path' => 'calendars/{calendarId}/events/{eventId}/instances',
|
500 |
-
'httpMethod' => 'GET',
|
501 |
-
'parameters' => array(
|
502 |
-
'calendarId' => array(
|
503 |
-
'location' => 'path',
|
504 |
-
'type' => 'string',
|
505 |
-
'required' => true,
|
506 |
-
),
|
507 |
-
'eventId' => array(
|
508 |
-
'location' => 'path',
|
509 |
-
'type' => 'string',
|
510 |
-
'required' => true,
|
511 |
-
),
|
512 |
-
'alwaysIncludeEmail' => array(
|
513 |
-
'location' => 'query',
|
514 |
-
'type' => 'boolean',
|
515 |
-
),
|
516 |
-
'maxAttendees' => array(
|
517 |
-
'location' => 'query',
|
518 |
-
'type' => 'integer',
|
519 |
-
),
|
520 |
-
'maxResults' => array(
|
521 |
-
'location' => 'query',
|
522 |
-
'type' => 'integer',
|
523 |
-
),
|
524 |
-
'originalStart' => array(
|
525 |
-
'location' => 'query',
|
526 |
-
'type' => 'string',
|
527 |
-
),
|
528 |
-
'pageToken' => array(
|
529 |
-
'location' => 'query',
|
530 |
-
'type' => 'string',
|
531 |
-
),
|
532 |
-
'showDeleted' => array(
|
533 |
-
'location' => 'query',
|
534 |
-
'type' => 'boolean',
|
535 |
-
),
|
536 |
-
'timeMax' => array(
|
537 |
-
'location' => 'query',
|
538 |
-
'type' => 'string',
|
539 |
-
),
|
540 |
-
'timeMin' => array(
|
541 |
-
'location' => 'query',
|
542 |
-
'type' => 'string',
|
543 |
-
),
|
544 |
-
'timeZone' => array(
|
545 |
-
'location' => 'query',
|
546 |
-
'type' => 'string',
|
547 |
-
),
|
548 |
-
),
|
549 |
-
),'list' => array(
|
550 |
-
'path' => 'calendars/{calendarId}/events',
|
551 |
-
'httpMethod' => 'GET',
|
552 |
-
'parameters' => array(
|
553 |
-
'calendarId' => array(
|
554 |
-
'location' => 'path',
|
555 |
-
'type' => 'string',
|
556 |
-
'required' => true,
|
557 |
-
),
|
558 |
-
'alwaysIncludeEmail' => array(
|
559 |
-
'location' => 'query',
|
560 |
-
'type' => 'boolean',
|
561 |
-
),
|
562 |
-
'iCalUID' => array(
|
563 |
-
'location' => 'query',
|
564 |
-
'type' => 'string',
|
565 |
-
),
|
566 |
-
'maxAttendees' => array(
|
567 |
-
'location' => 'query',
|
568 |
-
'type' => 'integer',
|
569 |
-
),
|
570 |
-
'maxResults' => array(
|
571 |
-
'location' => 'query',
|
572 |
-
'type' => 'integer',
|
573 |
-
),
|
574 |
-
'orderBy' => array(
|
575 |
-
'location' => 'query',
|
576 |
-
'type' => 'string',
|
577 |
-
),
|
578 |
-
'pageToken' => array(
|
579 |
-
'location' => 'query',
|
580 |
-
'type' => 'string',
|
581 |
-
),
|
582 |
-
'privateExtendedProperty' => array(
|
583 |
-
'location' => 'query',
|
584 |
-
'type' => 'string',
|
585 |
-
'repeated' => true,
|
586 |
-
),
|
587 |
-
'q' => array(
|
588 |
-
'location' => 'query',
|
589 |
-
'type' => 'string',
|
590 |
-
),
|
591 |
-
'sharedExtendedProperty' => array(
|
592 |
-
'location' => 'query',
|
593 |
-
'type' => 'string',
|
594 |
-
'repeated' => true,
|
595 |
-
),
|
596 |
-
'showDeleted' => array(
|
597 |
-
'location' => 'query',
|
598 |
-
'type' => 'boolean',
|
599 |
-
),
|
600 |
-
'showHiddenInvitations' => array(
|
601 |
-
'location' => 'query',
|
602 |
-
'type' => 'boolean',
|
603 |
-
),
|
604 |
-
'singleEvents' => array(
|
605 |
-
'location' => 'query',
|
606 |
-
'type' => 'boolean',
|
607 |
-
),
|
608 |
-
'syncToken' => array(
|
609 |
-
'location' => 'query',
|
610 |
-
'type' => 'string',
|
611 |
-
),
|
612 |
-
'timeMax' => array(
|
613 |
-
'location' => 'query',
|
614 |
-
'type' => 'string',
|
615 |
-
),
|
616 |
-
'timeMin' => array(
|
617 |
-
'location' => 'query',
|
618 |
-
'type' => 'string',
|
619 |
-
),
|
620 |
-
'timeZone' => array(
|
621 |
-
'location' => 'query',
|
622 |
-
'type' => 'string',
|
623 |
-
),
|
624 |
-
'updatedMin' => array(
|
625 |
-
'location' => 'query',
|
626 |
-
'type' => 'string',
|
627 |
-
),
|
628 |
-
),
|
629 |
-
),'move' => array(
|
630 |
-
'path' => 'calendars/{calendarId}/events/{eventId}/move',
|
631 |
-
'httpMethod' => 'POST',
|
632 |
-
'parameters' => array(
|
633 |
-
'calendarId' => array(
|
634 |
-
'location' => 'path',
|
635 |
-
'type' => 'string',
|
636 |
-
'required' => true,
|
637 |
-
),
|
638 |
-
'eventId' => array(
|
639 |
-
'location' => 'path',
|
640 |
-
'type' => 'string',
|
641 |
-
'required' => true,
|
642 |
-
),
|
643 |
-
'destination' => array(
|
644 |
-
'location' => 'query',
|
645 |
-
'type' => 'string',
|
646 |
-
'required' => true,
|
647 |
-
),
|
648 |
-
'sendNotifications' => array(
|
649 |
-
'location' => 'query',
|
650 |
-
'type' => 'boolean',
|
651 |
-
),
|
652 |
-
),
|
653 |
-
),'patch' => array(
|
654 |
-
'path' => 'calendars/{calendarId}/events/{eventId}',
|
655 |
-
'httpMethod' => 'PATCH',
|
656 |
-
'parameters' => array(
|
657 |
-
'calendarId' => array(
|
658 |
-
'location' => 'path',
|
659 |
-
'type' => 'string',
|
660 |
-
'required' => true,
|
661 |
-
),
|
662 |
-
'eventId' => array(
|
663 |
-
'location' => 'path',
|
664 |
-
'type' => 'string',
|
665 |
-
'required' => true,
|
666 |
-
),
|
667 |
-
'alwaysIncludeEmail' => array(
|
668 |
-
'location' => 'query',
|
669 |
-
'type' => 'boolean',
|
670 |
-
),
|
671 |
-
'maxAttendees' => array(
|
672 |
-
'location' => 'query',
|
673 |
-
'type' => 'integer',
|
674 |
-
),
|
675 |
-
'sendNotifications' => array(
|
676 |
-
'location' => 'query',
|
677 |
-
'type' => 'boolean',
|
678 |
-
),
|
679 |
-
'supportsAttachments' => array(
|
680 |
-
'location' => 'query',
|
681 |
-
'type' => 'boolean',
|
682 |
-
),
|
683 |
-
),
|
684 |
-
),'quickAdd' => array(
|
685 |
-
'path' => 'calendars/{calendarId}/events/quickAdd',
|
686 |
-
'httpMethod' => 'POST',
|
687 |
-
'parameters' => array(
|
688 |
-
'calendarId' => array(
|
689 |
-
'location' => 'path',
|
690 |
-
'type' => 'string',
|
691 |
-
'required' => true,
|
692 |
-
),
|
693 |
-
'text' => array(
|
694 |
-
'location' => 'query',
|
695 |
-
'type' => 'string',
|
696 |
-
'required' => true,
|
697 |
-
),
|
698 |
-
'sendNotifications' => array(
|
699 |
-
'location' => 'query',
|
700 |
-
'type' => 'boolean',
|
701 |
-
),
|
702 |
-
),
|
703 |
-
),'update' => array(
|
704 |
-
'path' => 'calendars/{calendarId}/events/{eventId}',
|
705 |
-
'httpMethod' => 'PUT',
|
706 |
-
'parameters' => array(
|
707 |
-
'calendarId' => array(
|
708 |
-
'location' => 'path',
|
709 |
-
'type' => 'string',
|
710 |
-
'required' => true,
|
711 |
-
),
|
712 |
-
'eventId' => array(
|
713 |
-
'location' => 'path',
|
714 |
-
'type' => 'string',
|
715 |
-
'required' => true,
|
716 |
-
),
|
717 |
-
'alwaysIncludeEmail' => array(
|
718 |
-
'location' => 'query',
|
719 |
-
'type' => 'boolean',
|
720 |
-
),
|
721 |
-
'maxAttendees' => array(
|
722 |
-
'location' => 'query',
|
723 |
-
'type' => 'integer',
|
724 |
-
),
|
725 |
-
'sendNotifications' => array(
|
726 |
-
'location' => 'query',
|
727 |
-
'type' => 'boolean',
|
728 |
-
),
|
729 |
-
'supportsAttachments' => array(
|
730 |
-
'location' => 'query',
|
731 |
-
'type' => 'boolean',
|
732 |
-
),
|
733 |
-
),
|
734 |
-
),'watch' => array(
|
735 |
-
'path' => 'calendars/{calendarId}/events/watch',
|
736 |
-
'httpMethod' => 'POST',
|
737 |
-
'parameters' => array(
|
738 |
-
'calendarId' => array(
|
739 |
-
'location' => 'path',
|
740 |
-
'type' => 'string',
|
741 |
-
'required' => true,
|
742 |
-
),
|
743 |
-
'alwaysIncludeEmail' => array(
|
744 |
-
'location' => 'query',
|
745 |
-
'type' => 'boolean',
|
746 |
-
),
|
747 |
-
'iCalUID' => array(
|
748 |
-
'location' => 'query',
|
749 |
-
'type' => 'string',
|
750 |
-
),
|
751 |
-
'maxAttendees' => array(
|
752 |
-
'location' => 'query',
|
753 |
-
'type' => 'integer',
|
754 |
-
),
|
755 |
-
'maxResults' => array(
|
756 |
-
'location' => 'query',
|
757 |
-
'type' => 'integer',
|
758 |
-
),
|
759 |
-
'orderBy' => array(
|
760 |
-
'location' => 'query',
|
761 |
-
'type' => 'string',
|
762 |
-
),
|
763 |
-
'pageToken' => array(
|
764 |
-
'location' => 'query',
|
765 |
-
'type' => 'string',
|
766 |
-
),
|
767 |
-
'privateExtendedProperty' => array(
|
768 |
-
'location' => 'query',
|
769 |
-
'type' => 'string',
|
770 |
-
'repeated' => true,
|
771 |
-
),
|
772 |
-
'q' => array(
|
773 |
-
'location' => 'query',
|
774 |
-
'type' => 'string',
|
775 |
-
),
|
776 |
-
'sharedExtendedProperty' => array(
|
777 |
-
'location' => 'query',
|
778 |
-
'type' => 'string',
|
779 |
-
'repeated' => true,
|
780 |
-
),
|
781 |
-
'showDeleted' => array(
|
782 |
-
'location' => 'query',
|
783 |
-
'type' => 'boolean',
|
784 |
-
),
|
785 |
-
'showHiddenInvitations' => array(
|
786 |
-
'location' => 'query',
|
787 |
-
'type' => 'boolean',
|
788 |
-
),
|
789 |
-
'singleEvents' => array(
|
790 |
-
'location' => 'query',
|
791 |
-
'type' => 'boolean',
|
792 |
-
),
|
793 |
-
'syncToken' => array(
|
794 |
-
'location' => 'query',
|
795 |
-
'type' => 'string',
|
796 |
-
),
|
797 |
-
'timeMax' => array(
|
798 |
-
'location' => 'query',
|
799 |
-
'type' => 'string',
|
800 |
-
),
|
801 |
-
'timeMin' => array(
|
802 |
-
'location' => 'query',
|
803 |
-
'type' => 'string',
|
804 |
-
),
|
805 |
-
'timeZone' => array(
|
806 |
-
'location' => 'query',
|
807 |
-
'type' => 'string',
|
808 |
-
),
|
809 |
-
'updatedMin' => array(
|
810 |
-
'location' => 'query',
|
811 |
-
'type' => 'string',
|
812 |
-
),
|
813 |
-
),
|
814 |
-
),
|
815 |
-
)
|
816 |
-
)
|
817 |
-
);
|
818 |
-
$this->freebusy = new Google_Service_Calendar_Freebusy_Resource(
|
819 |
-
$this,
|
820 |
-
$this->serviceName,
|
821 |
-
'freebusy',
|
822 |
-
array(
|
823 |
-
'methods' => array(
|
824 |
-
'query' => array(
|
825 |
-
'path' => 'freeBusy',
|
826 |
-
'httpMethod' => 'POST',
|
827 |
-
'parameters' => array(),
|
828 |
-
),
|
829 |
-
)
|
830 |
-
)
|
831 |
-
);
|
832 |
-
$this->settings = new Google_Service_Calendar_Settings_Resource(
|
833 |
-
$this,
|
834 |
-
$this->serviceName,
|
835 |
-
'settings',
|
836 |
-
array(
|
837 |
-
'methods' => array(
|
838 |
-
'get' => array(
|
839 |
-
'path' => 'users/me/settings/{setting}',
|
840 |
-
'httpMethod' => 'GET',
|
841 |
-
'parameters' => array(
|
842 |
-
'setting' => array(
|
843 |
-
'location' => 'path',
|
844 |
-
'type' => 'string',
|
845 |
-
'required' => true,
|
846 |
-
),
|
847 |
-
),
|
848 |
-
),'list' => array(
|
849 |
-
'path' => 'users/me/settings',
|
850 |
-
'httpMethod' => 'GET',
|
851 |
-
'parameters' => array(
|
852 |
-
'maxResults' => array(
|
853 |
-
'location' => 'query',
|
854 |
-
'type' => 'integer',
|
855 |
-
),
|
856 |
-
'pageToken' => array(
|
857 |
-
'location' => 'query',
|
858 |
-
'type' => 'string',
|
859 |
-
),
|
860 |
-
'syncToken' => array(
|
861 |
-
'location' => 'query',
|
862 |
-
'type' => 'string',
|
863 |
-
),
|
864 |
-
),
|
865 |
-
),'watch' => array(
|
866 |
-
'path' => 'users/me/settings/watch',
|
867 |
-
'httpMethod' => 'POST',
|
868 |
-
'parameters' => array(
|
869 |
-
'maxResults' => array(
|
870 |
-
'location' => 'query',
|
871 |
-
'type' => 'integer',
|
872 |
-
),
|
873 |
-
'pageToken' => array(
|
874 |
-
'location' => 'query',
|
875 |
-
'type' => 'string',
|
876 |
-
),
|
877 |
-
'syncToken' => array(
|
878 |
-
'location' => 'query',
|
879 |
-
'type' => 'string',
|
880 |
-
),
|
881 |
-
),
|
882 |
-
),
|
883 |
-
)
|
884 |
-
)
|
885 |
-
);
|
886 |
-
}
|
887 |
-
}
|
888 |
-
|
889 |
-
|
890 |
-
/**
|
891 |
-
* The "acl" collection of methods.
|
892 |
-
* Typical usage is:
|
893 |
-
* <code>
|
894 |
-
* $calendarService = new Google_Service_Calendar(...);
|
895 |
-
* $acl = $calendarService->acl;
|
896 |
-
* </code>
|
897 |
-
*/
|
898 |
-
class Google_Service_Calendar_Acl_Resource extends Google_Service_Resource
|
899 |
-
{
|
900 |
-
|
901 |
-
/**
|
902 |
-
* Deletes an access control rule. (acl.delete)
|
903 |
-
*
|
904 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
905 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
906 |
-
* the currently logged in user, use the "primary" keyword.
|
907 |
-
* @param string $ruleId ACL rule identifier.
|
908 |
-
* @param array $optParams Optional parameters.
|
909 |
-
*/
|
910 |
-
public function delete($calendarId, $ruleId, $optParams = array())
|
911 |
-
{
|
912 |
-
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
|
913 |
-
$params = array_merge($params, $optParams);
|
914 |
-
return $this->call('delete', array($params));
|
915 |
-
}
|
916 |
-
|
917 |
-
/**
|
918 |
-
* Returns an access control rule. (acl.get)
|
919 |
-
*
|
920 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
921 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
922 |
-
* the currently logged in user, use the "primary" keyword.
|
923 |
-
* @param string $ruleId ACL rule identifier.
|
924 |
-
* @param array $optParams Optional parameters.
|
925 |
-
* @return Google_Service_Calendar_AclRule
|
926 |
-
*/
|
927 |
-
public function get($calendarId, $ruleId, $optParams = array())
|
928 |
-
{
|
929 |
-
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
|
930 |
-
$params = array_merge($params, $optParams);
|
931 |
-
return $this->call('get', array($params), "Google_Service_Calendar_AclRule");
|
932 |
-
}
|
933 |
-
|
934 |
-
/**
|
935 |
-
* Creates an access control rule. (acl.insert)
|
936 |
-
*
|
937 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
938 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
939 |
-
* the currently logged in user, use the "primary" keyword.
|
940 |
-
* @param Google_AclRule $postBody
|
941 |
-
* @param array $optParams Optional parameters.
|
942 |
-
* @return Google_Service_Calendar_AclRule
|
943 |
-
*/
|
944 |
-
public function insert($calendarId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
945 |
-
{
|
946 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
947 |
-
$params = array_merge($params, $optParams);
|
948 |
-
return $this->call('insert', array($params), "Google_Service_Calendar_AclRule");
|
949 |
-
}
|
950 |
-
|
951 |
-
/**
|
952 |
-
* Returns the rules in the access control list for the calendar. (acl.listAcl)
|
953 |
-
*
|
954 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
955 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
956 |
-
* the currently logged in user, use the "primary" keyword.
|
957 |
-
* @param array $optParams Optional parameters.
|
958 |
-
*
|
959 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
960 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
961 |
-
* than 250 entries. Optional.
|
962 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
963 |
-
* Optional.
|
964 |
-
* @opt_param bool showDeleted Whether to include deleted ACLs in the result.
|
965 |
-
* Deleted ACLs are represented by role equal to "none". Deleted ACLs will
|
966 |
-
* always be included if syncToken is provided. Optional. The default is False.
|
967 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
968 |
-
* returned on the last page of results from the previous list request. It makes
|
969 |
-
* the result of this list request contain only entries that have changed since
|
970 |
-
* then. All entries deleted since the previous list request will always be in
|
971 |
-
* the result set and it is not allowed to set showDeleted to False. If the
|
972 |
-
* syncToken expires, the server will respond with a 410 GONE response code and
|
973 |
-
* the client should clear its storage and perform a full synchronization
|
974 |
-
* without any syncToken. Learn more about incremental synchronization.
|
975 |
-
* Optional. The default is to return all entries.
|
976 |
-
* @return Google_Service_Calendar_Acl
|
977 |
-
*/
|
978 |
-
public function listAcl($calendarId, $optParams = array())
|
979 |
-
{
|
980 |
-
$params = array('calendarId' => $calendarId);
|
981 |
-
$params = array_merge($params, $optParams);
|
982 |
-
return $this->call('list', array($params), "Google_Service_Calendar_Acl");
|
983 |
-
}
|
984 |
-
|
985 |
-
/**
|
986 |
-
* Updates an access control rule. This method supports patch semantics.
|
987 |
-
* (acl.patch)
|
988 |
-
*
|
989 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
990 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
991 |
-
* the currently logged in user, use the "primary" keyword.
|
992 |
-
* @param string $ruleId ACL rule identifier.
|
993 |
-
* @param Google_AclRule $postBody
|
994 |
-
* @param array $optParams Optional parameters.
|
995 |
-
* @return Google_Service_Calendar_AclRule
|
996 |
-
*/
|
997 |
-
public function patch($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
998 |
-
{
|
999 |
-
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
|
1000 |
-
$params = array_merge($params, $optParams);
|
1001 |
-
return $this->call('patch', array($params), "Google_Service_Calendar_AclRule");
|
1002 |
-
}
|
1003 |
-
|
1004 |
-
/**
|
1005 |
-
* Updates an access control rule. (acl.update)
|
1006 |
-
*
|
1007 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1008 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1009 |
-
* the currently logged in user, use the "primary" keyword.
|
1010 |
-
* @param string $ruleId ACL rule identifier.
|
1011 |
-
* @param Google_AclRule $postBody
|
1012 |
-
* @param array $optParams Optional parameters.
|
1013 |
-
* @return Google_Service_Calendar_AclRule
|
1014 |
-
*/
|
1015 |
-
public function update($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
1016 |
-
{
|
1017 |
-
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
|
1018 |
-
$params = array_merge($params, $optParams);
|
1019 |
-
return $this->call('update', array($params), "Google_Service_Calendar_AclRule");
|
1020 |
-
}
|
1021 |
-
|
1022 |
-
/**
|
1023 |
-
* Watch for changes to ACL resources. (acl.watch)
|
1024 |
-
*
|
1025 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1026 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1027 |
-
* the currently logged in user, use the "primary" keyword.
|
1028 |
-
* @param Google_Channel $postBody
|
1029 |
-
* @param array $optParams Optional parameters.
|
1030 |
-
*
|
1031 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
1032 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
1033 |
-
* than 250 entries. Optional.
|
1034 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1035 |
-
* Optional.
|
1036 |
-
* @opt_param bool showDeleted Whether to include deleted ACLs in the result.
|
1037 |
-
* Deleted ACLs are represented by role equal to "none". Deleted ACLs will
|
1038 |
-
* always be included if syncToken is provided. Optional. The default is False.
|
1039 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1040 |
-
* returned on the last page of results from the previous list request. It makes
|
1041 |
-
* the result of this list request contain only entries that have changed since
|
1042 |
-
* then. All entries deleted since the previous list request will always be in
|
1043 |
-
* the result set and it is not allowed to set showDeleted to False. If the
|
1044 |
-
* syncToken expires, the server will respond with a 410 GONE response code and
|
1045 |
-
* the client should clear its storage and perform a full synchronization
|
1046 |
-
* without any syncToken. Learn more about incremental synchronization.
|
1047 |
-
* Optional. The default is to return all entries.
|
1048 |
-
* @return Google_Service_Calendar_Channel
|
1049 |
-
*/
|
1050 |
-
public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1051 |
-
{
|
1052 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1053 |
-
$params = array_merge($params, $optParams);
|
1054 |
-
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1055 |
-
}
|
1056 |
-
}
|
1057 |
-
|
1058 |
-
/**
|
1059 |
-
* The "calendarList" collection of methods.
|
1060 |
-
* Typical usage is:
|
1061 |
-
* <code>
|
1062 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1063 |
-
* $calendarList = $calendarService->calendarList;
|
1064 |
-
* </code>
|
1065 |
-
*/
|
1066 |
-
class Google_Service_Calendar_CalendarList_Resource extends Google_Service_Resource
|
1067 |
-
{
|
1068 |
-
|
1069 |
-
/**
|
1070 |
-
* Deletes an entry on the user's calendar list. (calendarList.delete)
|
1071 |
-
*
|
1072 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1073 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1074 |
-
* the currently logged in user, use the "primary" keyword.
|
1075 |
-
* @param array $optParams Optional parameters.
|
1076 |
-
*/
|
1077 |
-
public function delete($calendarId, $optParams = array())
|
1078 |
-
{
|
1079 |
-
$params = array('calendarId' => $calendarId);
|
1080 |
-
$params = array_merge($params, $optParams);
|
1081 |
-
return $this->call('delete', array($params));
|
1082 |
-
}
|
1083 |
-
|
1084 |
-
/**
|
1085 |
-
* Returns an entry on the user's calendar list. (calendarList.get)
|
1086 |
-
*
|
1087 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1088 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1089 |
-
* the currently logged in user, use the "primary" keyword.
|
1090 |
-
* @param array $optParams Optional parameters.
|
1091 |
-
* @return Google_Service_Calendar_CalendarListEntry
|
1092 |
-
*/
|
1093 |
-
public function get($calendarId, $optParams = array())
|
1094 |
-
{
|
1095 |
-
$params = array('calendarId' => $calendarId);
|
1096 |
-
$params = array_merge($params, $optParams);
|
1097 |
-
return $this->call('get', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1098 |
-
}
|
1099 |
-
|
1100 |
-
/**
|
1101 |
-
* Adds an entry to the user's calendar list. (calendarList.insert)
|
1102 |
-
*
|
1103 |
-
* @param Google_CalendarListEntry $postBody
|
1104 |
-
* @param array $optParams Optional parameters.
|
1105 |
-
*
|
1106 |
-
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1107 |
-
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1108 |
-
* used, the index-based colorId field will be set to the best matching option
|
1109 |
-
* automatically. Optional. The default is False.
|
1110 |
-
* @return Google_Service_Calendar_CalendarListEntry
|
1111 |
-
*/
|
1112 |
-
public function insert(Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1113 |
-
{
|
1114 |
-
$params = array('postBody' => $postBody);
|
1115 |
-
$params = array_merge($params, $optParams);
|
1116 |
-
return $this->call('insert', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1117 |
-
}
|
1118 |
-
|
1119 |
-
/**
|
1120 |
-
* Returns entries on the user's calendar list. (calendarList.listCalendarList)
|
1121 |
-
*
|
1122 |
-
* @param array $optParams Optional parameters.
|
1123 |
-
*
|
1124 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
1125 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
1126 |
-
* than 250 entries. Optional.
|
1127 |
-
* @opt_param string minAccessRole The minimum access role for the user in the
|
1128 |
-
* returned entries. Optional. The default is no restriction.
|
1129 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1130 |
-
* Optional.
|
1131 |
-
* @opt_param bool showDeleted Whether to include deleted calendar list entries
|
1132 |
-
* in the result. Optional. The default is False.
|
1133 |
-
* @opt_param bool showHidden Whether to show hidden entries. Optional. The
|
1134 |
-
* default is False.
|
1135 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1136 |
-
* returned on the last page of results from the previous list request. It makes
|
1137 |
-
* the result of this list request contain only entries that have changed since
|
1138 |
-
* then. If only read-only fields such as calendar properties or ACLs have
|
1139 |
-
* changed, the entry won't be returned. All entries deleted and hidden since
|
1140 |
-
* the previous list request will always be in the result set and it is not
|
1141 |
-
* allowed to set showDeleted neither showHidden to False. To ensure client
|
1142 |
-
* state consistency minAccessRole query parameter cannot be specified together
|
1143 |
-
* with nextSyncToken. If the syncToken expires, the server will respond with a
|
1144 |
-
* 410 GONE response code and the client should clear its storage and perform a
|
1145 |
-
* full synchronization without any syncToken. Learn more about incremental
|
1146 |
-
* synchronization. Optional. The default is to return all entries.
|
1147 |
-
* @return Google_Service_Calendar_CalendarList
|
1148 |
-
*/
|
1149 |
-
public function listCalendarList($optParams = array())
|
1150 |
-
{
|
1151 |
-
$params = array();
|
1152 |
-
$params = array_merge($params, $optParams);
|
1153 |
-
return $this->call('list', array($params), "Google_Service_Calendar_CalendarList");
|
1154 |
-
}
|
1155 |
-
|
1156 |
-
/**
|
1157 |
-
* Updates an entry on the user's calendar list. This method supports patch
|
1158 |
-
* semantics. (calendarList.patch)
|
1159 |
-
*
|
1160 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1161 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1162 |
-
* the currently logged in user, use the "primary" keyword.
|
1163 |
-
* @param Google_CalendarListEntry $postBody
|
1164 |
-
* @param array $optParams Optional parameters.
|
1165 |
-
*
|
1166 |
-
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1167 |
-
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1168 |
-
* used, the index-based colorId field will be set to the best matching option
|
1169 |
-
* automatically. Optional. The default is False.
|
1170 |
-
* @return Google_Service_Calendar_CalendarListEntry
|
1171 |
-
*/
|
1172 |
-
public function patch($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1173 |
-
{
|
1174 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1175 |
-
$params = array_merge($params, $optParams);
|
1176 |
-
return $this->call('patch', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1177 |
-
}
|
1178 |
-
|
1179 |
-
/**
|
1180 |
-
* Updates an entry on the user's calendar list. (calendarList.update)
|
1181 |
-
*
|
1182 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1183 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1184 |
-
* the currently logged in user, use the "primary" keyword.
|
1185 |
-
* @param Google_CalendarListEntry $postBody
|
1186 |
-
* @param array $optParams Optional parameters.
|
1187 |
-
*
|
1188 |
-
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1189 |
-
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1190 |
-
* used, the index-based colorId field will be set to the best matching option
|
1191 |
-
* automatically. Optional. The default is False.
|
1192 |
-
* @return Google_Service_Calendar_CalendarListEntry
|
1193 |
-
*/
|
1194 |
-
public function update($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1195 |
-
{
|
1196 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1197 |
-
$params = array_merge($params, $optParams);
|
1198 |
-
return $this->call('update', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1199 |
-
}
|
1200 |
-
|
1201 |
-
/**
|
1202 |
-
* Watch for changes to CalendarList resources. (calendarList.watch)
|
1203 |
-
*
|
1204 |
-
* @param Google_Channel $postBody
|
1205 |
-
* @param array $optParams Optional parameters.
|
1206 |
-
*
|
1207 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
1208 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
1209 |
-
* than 250 entries. Optional.
|
1210 |
-
* @opt_param string minAccessRole The minimum access role for the user in the
|
1211 |
-
* returned entries. Optional. The default is no restriction.
|
1212 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1213 |
-
* Optional.
|
1214 |
-
* @opt_param bool showDeleted Whether to include deleted calendar list entries
|
1215 |
-
* in the result. Optional. The default is False.
|
1216 |
-
* @opt_param bool showHidden Whether to show hidden entries. Optional. The
|
1217 |
-
* default is False.
|
1218 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1219 |
-
* returned on the last page of results from the previous list request. It makes
|
1220 |
-
* the result of this list request contain only entries that have changed since
|
1221 |
-
* then. If only read-only fields such as calendar properties or ACLs have
|
1222 |
-
* changed, the entry won't be returned. All entries deleted and hidden since
|
1223 |
-
* the previous list request will always be in the result set and it is not
|
1224 |
-
* allowed to set showDeleted neither showHidden to False. To ensure client
|
1225 |
-
* state consistency minAccessRole query parameter cannot be specified together
|
1226 |
-
* with nextSyncToken. If the syncToken expires, the server will respond with a
|
1227 |
-
* 410 GONE response code and the client should clear its storage and perform a
|
1228 |
-
* full synchronization without any syncToken. Learn more about incremental
|
1229 |
-
* synchronization. Optional. The default is to return all entries.
|
1230 |
-
* @return Google_Service_Calendar_Channel
|
1231 |
-
*/
|
1232 |
-
public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1233 |
-
{
|
1234 |
-
$params = array('postBody' => $postBody);
|
1235 |
-
$params = array_merge($params, $optParams);
|
1236 |
-
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1237 |
-
}
|
1238 |
-
}
|
1239 |
-
|
1240 |
-
/**
|
1241 |
-
* The "calendars" collection of methods.
|
1242 |
-
* Typical usage is:
|
1243 |
-
* <code>
|
1244 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1245 |
-
* $calendars = $calendarService->calendars;
|
1246 |
-
* </code>
|
1247 |
-
*/
|
1248 |
-
class Google_Service_Calendar_Calendars_Resource extends Google_Service_Resource
|
1249 |
-
{
|
1250 |
-
|
1251 |
-
/**
|
1252 |
-
* Clears a primary calendar. This operation deletes all events associated with
|
1253 |
-
* the primary calendar of an account. (calendars.clear)
|
1254 |
-
*
|
1255 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1256 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1257 |
-
* the currently logged in user, use the "primary" keyword.
|
1258 |
-
* @param array $optParams Optional parameters.
|
1259 |
-
*/
|
1260 |
-
public function clear($calendarId, $optParams = array())
|
1261 |
-
{
|
1262 |
-
$params = array('calendarId' => $calendarId);
|
1263 |
-
$params = array_merge($params, $optParams);
|
1264 |
-
return $this->call('clear', array($params));
|
1265 |
-
}
|
1266 |
-
|
1267 |
-
/**
|
1268 |
-
* Deletes a secondary calendar. Use calendars.clear for clearing all events on
|
1269 |
-
* primary calendars. (calendars.delete)
|
1270 |
-
*
|
1271 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1272 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1273 |
-
* the currently logged in user, use the "primary" keyword.
|
1274 |
-
* @param array $optParams Optional parameters.
|
1275 |
-
*/
|
1276 |
-
public function delete($calendarId, $optParams = array())
|
1277 |
-
{
|
1278 |
-
$params = array('calendarId' => $calendarId);
|
1279 |
-
$params = array_merge($params, $optParams);
|
1280 |
-
return $this->call('delete', array($params));
|
1281 |
-
}
|
1282 |
-
|
1283 |
-
/**
|
1284 |
-
* Returns metadata for a calendar. (calendars.get)
|
1285 |
-
*
|
1286 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1287 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1288 |
-
* the currently logged in user, use the "primary" keyword.
|
1289 |
-
* @param array $optParams Optional parameters.
|
1290 |
-
* @return Google_Service_Calendar_Calendar
|
1291 |
-
*/
|
1292 |
-
public function get($calendarId, $optParams = array())
|
1293 |
-
{
|
1294 |
-
$params = array('calendarId' => $calendarId);
|
1295 |
-
$params = array_merge($params, $optParams);
|
1296 |
-
return $this->call('get', array($params), "Google_Service_Calendar_Calendar");
|
1297 |
-
}
|
1298 |
-
|
1299 |
-
/**
|
1300 |
-
* Creates a secondary calendar. (calendars.insert)
|
1301 |
-
*
|
1302 |
-
* @param Google_Calendar $postBody
|
1303 |
-
* @param array $optParams Optional parameters.
|
1304 |
-
* @return Google_Service_Calendar_Calendar
|
1305 |
-
*/
|
1306 |
-
public function insert(Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1307 |
-
{
|
1308 |
-
$params = array('postBody' => $postBody);
|
1309 |
-
$params = array_merge($params, $optParams);
|
1310 |
-
return $this->call('insert', array($params), "Google_Service_Calendar_Calendar");
|
1311 |
-
}
|
1312 |
-
|
1313 |
-
/**
|
1314 |
-
* Updates metadata for a calendar. This method supports patch semantics.
|
1315 |
-
* (calendars.patch)
|
1316 |
-
*
|
1317 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1318 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1319 |
-
* the currently logged in user, use the "primary" keyword.
|
1320 |
-
* @param Google_Calendar $postBody
|
1321 |
-
* @param array $optParams Optional parameters.
|
1322 |
-
* @return Google_Service_Calendar_Calendar
|
1323 |
-
*/
|
1324 |
-
public function patch($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1325 |
-
{
|
1326 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1327 |
-
$params = array_merge($params, $optParams);
|
1328 |
-
return $this->call('patch', array($params), "Google_Service_Calendar_Calendar");
|
1329 |
-
}
|
1330 |
-
|
1331 |
-
/**
|
1332 |
-
* Updates metadata for a calendar. (calendars.update)
|
1333 |
-
*
|
1334 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1335 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1336 |
-
* the currently logged in user, use the "primary" keyword.
|
1337 |
-
* @param Google_Calendar $postBody
|
1338 |
-
* @param array $optParams Optional parameters.
|
1339 |
-
* @return Google_Service_Calendar_Calendar
|
1340 |
-
*/
|
1341 |
-
public function update($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1342 |
-
{
|
1343 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1344 |
-
$params = array_merge($params, $optParams);
|
1345 |
-
return $this->call('update', array($params), "Google_Service_Calendar_Calendar");
|
1346 |
-
}
|
1347 |
-
}
|
1348 |
-
|
1349 |
-
/**
|
1350 |
-
* The "channels" collection of methods.
|
1351 |
-
* Typical usage is:
|
1352 |
-
* <code>
|
1353 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1354 |
-
* $channels = $calendarService->channels;
|
1355 |
-
* </code>
|
1356 |
-
*/
|
1357 |
-
class Google_Service_Calendar_Channels_Resource extends Google_Service_Resource
|
1358 |
-
{
|
1359 |
-
|
1360 |
-
/**
|
1361 |
-
* Stop watching resources through this channel (channels.stop)
|
1362 |
-
*
|
1363 |
-
* @param Google_Channel $postBody
|
1364 |
-
* @param array $optParams Optional parameters.
|
1365 |
-
*/
|
1366 |
-
public function stop(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1367 |
-
{
|
1368 |
-
$params = array('postBody' => $postBody);
|
1369 |
-
$params = array_merge($params, $optParams);
|
1370 |
-
return $this->call('stop', array($params));
|
1371 |
-
}
|
1372 |
-
}
|
1373 |
-
|
1374 |
-
/**
|
1375 |
-
* The "colors" collection of methods.
|
1376 |
-
* Typical usage is:
|
1377 |
-
* <code>
|
1378 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1379 |
-
* $colors = $calendarService->colors;
|
1380 |
-
* </code>
|
1381 |
-
*/
|
1382 |
-
class Google_Service_Calendar_Colors_Resource extends Google_Service_Resource
|
1383 |
-
{
|
1384 |
-
|
1385 |
-
/**
|
1386 |
-
* Returns the color definitions for calendars and events. (colors.get)
|
1387 |
-
*
|
1388 |
-
* @param array $optParams Optional parameters.
|
1389 |
-
* @return Google_Service_Calendar_Colors
|
1390 |
-
*/
|
1391 |
-
public function get($optParams = array())
|
1392 |
-
{
|
1393 |
-
$params = array();
|
1394 |
-
$params = array_merge($params, $optParams);
|
1395 |
-
return $this->call('get', array($params), "Google_Service_Calendar_Colors");
|
1396 |
-
}
|
1397 |
-
}
|
1398 |
-
|
1399 |
-
/**
|
1400 |
-
* The "events" collection of methods.
|
1401 |
-
* Typical usage is:
|
1402 |
-
* <code>
|
1403 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1404 |
-
* $events = $calendarService->events;
|
1405 |
-
* </code>
|
1406 |
-
*/
|
1407 |
-
class Google_Service_Calendar_Events_Resource extends Google_Service_Resource
|
1408 |
-
{
|
1409 |
-
|
1410 |
-
/**
|
1411 |
-
* Deletes an event. (events.delete)
|
1412 |
-
*
|
1413 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1414 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1415 |
-
* the currently logged in user, use the "primary" keyword.
|
1416 |
-
* @param string $eventId Event identifier.
|
1417 |
-
* @param array $optParams Optional parameters.
|
1418 |
-
*
|
1419 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1420 |
-
* deletion of the event. Optional. The default is False.
|
1421 |
-
*/
|
1422 |
-
public function delete($calendarId, $eventId, $optParams = array())
|
1423 |
-
{
|
1424 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1425 |
-
$params = array_merge($params, $optParams);
|
1426 |
-
return $this->call('delete', array($params));
|
1427 |
-
}
|
1428 |
-
|
1429 |
-
/**
|
1430 |
-
* Returns an event. (events.get)
|
1431 |
-
*
|
1432 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1433 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1434 |
-
* the currently logged in user, use the "primary" keyword.
|
1435 |
-
* @param string $eventId Event identifier.
|
1436 |
-
* @param array $optParams Optional parameters.
|
1437 |
-
*
|
1438 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1439 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1440 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1441 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1442 |
-
* handle the absence of an email address value in the mentioned places.
|
1443 |
-
* Optional. The default is False.
|
1444 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1445 |
-
* response. If there are more than the specified number of attendees, only the
|
1446 |
-
* participant is returned. Optional.
|
1447 |
-
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1448 |
-
* default is the time zone of the calendar.
|
1449 |
-
* @return Google_Service_Calendar_Event
|
1450 |
-
*/
|
1451 |
-
public function get($calendarId, $eventId, $optParams = array())
|
1452 |
-
{
|
1453 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1454 |
-
$params = array_merge($params, $optParams);
|
1455 |
-
return $this->call('get', array($params), "Google_Service_Calendar_Event");
|
1456 |
-
}
|
1457 |
-
|
1458 |
-
/**
|
1459 |
-
* Imports an event. This operation is used to add a private copy of an existing
|
1460 |
-
* event to a calendar. (events.import)
|
1461 |
-
*
|
1462 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1463 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1464 |
-
* the currently logged in user, use the "primary" keyword.
|
1465 |
-
* @param Google_Event $postBody
|
1466 |
-
* @param array $optParams Optional parameters.
|
1467 |
-
*
|
1468 |
-
* @opt_param bool supportsAttachments Whether API client performing operation
|
1469 |
-
* supports event attachments. Optional. The default is False.
|
1470 |
-
* @return Google_Service_Calendar_Event
|
1471 |
-
*/
|
1472 |
-
public function import($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1473 |
-
{
|
1474 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1475 |
-
$params = array_merge($params, $optParams);
|
1476 |
-
return $this->call('import', array($params), "Google_Service_Calendar_Event");
|
1477 |
-
}
|
1478 |
-
|
1479 |
-
/**
|
1480 |
-
* Creates an event. (events.insert)
|
1481 |
-
*
|
1482 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1483 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1484 |
-
* the currently logged in user, use the "primary" keyword.
|
1485 |
-
* @param Google_Event $postBody
|
1486 |
-
* @param array $optParams Optional parameters.
|
1487 |
-
*
|
1488 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1489 |
-
* response. If there are more than the specified number of attendees, only the
|
1490 |
-
* participant is returned. Optional.
|
1491 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1492 |
-
* creation of the new event. Optional. The default is False.
|
1493 |
-
* @opt_param bool supportsAttachments Whether API client performing operation
|
1494 |
-
* supports event attachments. Optional. The default is False.
|
1495 |
-
* @return Google_Service_Calendar_Event
|
1496 |
-
*/
|
1497 |
-
public function insert($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1498 |
-
{
|
1499 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1500 |
-
$params = array_merge($params, $optParams);
|
1501 |
-
return $this->call('insert', array($params), "Google_Service_Calendar_Event");
|
1502 |
-
}
|
1503 |
-
|
1504 |
-
/**
|
1505 |
-
* Returns instances of the specified recurring event. (events.instances)
|
1506 |
-
*
|
1507 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1508 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1509 |
-
* the currently logged in user, use the "primary" keyword.
|
1510 |
-
* @param string $eventId Recurring event identifier.
|
1511 |
-
* @param array $optParams Optional parameters.
|
1512 |
-
*
|
1513 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1514 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1515 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1516 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1517 |
-
* handle the absence of an email address value in the mentioned places.
|
1518 |
-
* Optional. The default is False.
|
1519 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1520 |
-
* response. If there are more than the specified number of attendees, only the
|
1521 |
-
* participant is returned. Optional.
|
1522 |
-
* @opt_param int maxResults Maximum number of events returned on one result
|
1523 |
-
* page. By default the value is 250 events. The page size can never be larger
|
1524 |
-
* than 2500 events. Optional.
|
1525 |
-
* @opt_param string originalStart The original start time of the instance in
|
1526 |
-
* the result. Optional.
|
1527 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1528 |
-
* Optional.
|
1529 |
-
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1530 |
-
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1531 |
-
* will still be included if singleEvents is False. Optional. The default is
|
1532 |
-
* False.
|
1533 |
-
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1534 |
-
* to filter by. Optional. The default is not to filter by start time. Must be
|
1535 |
-
* an RFC3339 timestamp with mandatory time zone offset.
|
1536 |
-
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1537 |
-
* filter by. Optional. The default is not to filter by end time. Must be an
|
1538 |
-
* RFC3339 timestamp with mandatory time zone offset.
|
1539 |
-
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1540 |
-
* default is the time zone of the calendar.
|
1541 |
-
* @return Google_Service_Calendar_Events
|
1542 |
-
*/
|
1543 |
-
public function instances($calendarId, $eventId, $optParams = array())
|
1544 |
-
{
|
1545 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1546 |
-
$params = array_merge($params, $optParams);
|
1547 |
-
return $this->call('instances', array($params), "Google_Service_Calendar_Events");
|
1548 |
-
}
|
1549 |
-
|
1550 |
-
/**
|
1551 |
-
* Returns events on the specified calendar. (events.listEvents)
|
1552 |
-
*
|
1553 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1554 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1555 |
-
* the currently logged in user, use the "primary" keyword.
|
1556 |
-
* @param array $optParams Optional parameters.
|
1557 |
-
*
|
1558 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1559 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1560 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1561 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1562 |
-
* handle the absence of an email address value in the mentioned places.
|
1563 |
-
* Optional. The default is False.
|
1564 |
-
* @opt_param string iCalUID Specifies event ID in the iCalendar format to be
|
1565 |
-
* included in the response. Optional.
|
1566 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1567 |
-
* response. If there are more than the specified number of attendees, only the
|
1568 |
-
* participant is returned. Optional.
|
1569 |
-
* @opt_param int maxResults Maximum number of events returned on one result
|
1570 |
-
* page. By default the value is 250 events. The page size can never be larger
|
1571 |
-
* than 2500 events. Optional.
|
1572 |
-
* @opt_param string orderBy The order of the events returned in the result.
|
1573 |
-
* Optional. The default is an unspecified, stable order.
|
1574 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1575 |
-
* Optional.
|
1576 |
-
* @opt_param string privateExtendedProperty Extended properties constraint
|
1577 |
-
* specified as propertyName=value. Matches only private properties. This
|
1578 |
-
* parameter might be repeated multiple times to return events that match all
|
1579 |
-
* given constraints.
|
1580 |
-
* @opt_param string q Free text search terms to find events that match these
|
1581 |
-
* terms in any field, except for extended properties. Optional.
|
1582 |
-
* @opt_param string sharedExtendedProperty Extended properties constraint
|
1583 |
-
* specified as propertyName=value. Matches only shared properties. This
|
1584 |
-
* parameter might be repeated multiple times to return events that match all
|
1585 |
-
* given constraints.
|
1586 |
-
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1587 |
-
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1588 |
-
* (but not the underlying recurring event) will still be included if
|
1589 |
-
* showDeleted and singleEvents are both False. If showDeleted and singleEvents
|
1590 |
-
* are both True, only single instances of deleted events (but not the
|
1591 |
-
* underlying recurring events) are returned. Optional. The default is False.
|
1592 |
-
* @opt_param bool showHiddenInvitations Whether to include hidden invitations
|
1593 |
-
* in the result. Optional. The default is False.
|
1594 |
-
* @opt_param bool singleEvents Whether to expand recurring events into
|
1595 |
-
* instances and only return single one-off events and instances of recurring
|
1596 |
-
* events, but not the underlying recurring events themselves. Optional. The
|
1597 |
-
* default is False.
|
1598 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1599 |
-
* returned on the last page of results from the previous list request. It makes
|
1600 |
-
* the result of this list request contain only entries that have changed since
|
1601 |
-
* then. All events deleted since the previous list request will always be in
|
1602 |
-
* the result set and it is not allowed to set showDeleted to False. There are
|
1603 |
-
* several query parameters that cannot be specified together with nextSyncToken
|
1604 |
-
* to ensure consistency of the client state.
|
1605 |
-
*
|
1606 |
-
* These are: - iCalUID - orderBy - privateExtendedProperty - q -
|
1607 |
-
* sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
|
1608 |
-
* expires, the server will respond with a 410 GONE response code and the client
|
1609 |
-
* should clear its storage and perform a full synchronization without any
|
1610 |
-
* syncToken. Learn more about incremental synchronization. Optional. The
|
1611 |
-
* default is to return all entries.
|
1612 |
-
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1613 |
-
* to filter by. Optional. The default is not to filter by start time. Must be
|
1614 |
-
* an RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1615 |
-
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1616 |
-
* but will be ignored.
|
1617 |
-
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1618 |
-
* filter by. Optional. The default is not to filter by end time. Must be an
|
1619 |
-
* RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1620 |
-
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1621 |
-
* but will be ignored.
|
1622 |
-
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1623 |
-
* default is the time zone of the calendar.
|
1624 |
-
* @opt_param string updatedMin Lower bound for an event's last modification
|
1625 |
-
* time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
|
1626 |
-
* since this time will always be included regardless of showDeleted. Optional.
|
1627 |
-
* The default is not to filter by last modification time.
|
1628 |
-
* @return Google_Service_Calendar_Events
|
1629 |
-
*/
|
1630 |
-
public function listEvents($calendarId, $optParams = array())
|
1631 |
-
{
|
1632 |
-
$params = array('calendarId' => $calendarId);
|
1633 |
-
$params = array_merge($params, $optParams);
|
1634 |
-
return $this->call('list', array($params), "Google_Service_Calendar_Events");
|
1635 |
-
}
|
1636 |
-
|
1637 |
-
/**
|
1638 |
-
* Moves an event to another calendar, i.e. changes an event's organizer.
|
1639 |
-
* (events.move)
|
1640 |
-
*
|
1641 |
-
* @param string $calendarId Calendar identifier of the source calendar where
|
1642 |
-
* the event currently is on.
|
1643 |
-
* @param string $eventId Event identifier.
|
1644 |
-
* @param string $destination Calendar identifier of the target calendar where
|
1645 |
-
* the event is to be moved to.
|
1646 |
-
* @param array $optParams Optional parameters.
|
1647 |
-
*
|
1648 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1649 |
-
* change of the event's organizer. Optional. The default is False.
|
1650 |
-
* @return Google_Service_Calendar_Event
|
1651 |
-
*/
|
1652 |
-
public function move($calendarId, $eventId, $destination, $optParams = array())
|
1653 |
-
{
|
1654 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'destination' => $destination);
|
1655 |
-
$params = array_merge($params, $optParams);
|
1656 |
-
return $this->call('move', array($params), "Google_Service_Calendar_Event");
|
1657 |
-
}
|
1658 |
-
|
1659 |
-
/**
|
1660 |
-
* Updates an event. This method supports patch semantics. (events.patch)
|
1661 |
-
*
|
1662 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1663 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1664 |
-
* the currently logged in user, use the "primary" keyword.
|
1665 |
-
* @param string $eventId Event identifier.
|
1666 |
-
* @param Google_Event $postBody
|
1667 |
-
* @param array $optParams Optional parameters.
|
1668 |
-
*
|
1669 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1670 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1671 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1672 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1673 |
-
* handle the absence of an email address value in the mentioned places.
|
1674 |
-
* Optional. The default is False.
|
1675 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1676 |
-
* response. If there are more than the specified number of attendees, only the
|
1677 |
-
* participant is returned. Optional.
|
1678 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1679 |
-
* event update (e.g. attendee's responses, title changes, etc.). Optional. The
|
1680 |
-
* default is False.
|
1681 |
-
* @opt_param bool supportsAttachments Whether API client performing operation
|
1682 |
-
* supports event attachments. Optional. The default is False.
|
1683 |
-
* @return Google_Service_Calendar_Event
|
1684 |
-
*/
|
1685 |
-
public function patch($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1686 |
-
{
|
1687 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
|
1688 |
-
$params = array_merge($params, $optParams);
|
1689 |
-
return $this->call('patch', array($params), "Google_Service_Calendar_Event");
|
1690 |
-
}
|
1691 |
-
|
1692 |
-
/**
|
1693 |
-
* Creates an event based on a simple text string. (events.quickAdd)
|
1694 |
-
*
|
1695 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1696 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1697 |
-
* the currently logged in user, use the "primary" keyword.
|
1698 |
-
* @param string $text The text describing the event to be created.
|
1699 |
-
* @param array $optParams Optional parameters.
|
1700 |
-
*
|
1701 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1702 |
-
* creation of the event. Optional. The default is False.
|
1703 |
-
* @return Google_Service_Calendar_Event
|
1704 |
-
*/
|
1705 |
-
public function quickAdd($calendarId, $text, $optParams = array())
|
1706 |
-
{
|
1707 |
-
$params = array('calendarId' => $calendarId, 'text' => $text);
|
1708 |
-
$params = array_merge($params, $optParams);
|
1709 |
-
return $this->call('quickAdd', array($params), "Google_Service_Calendar_Event");
|
1710 |
-
}
|
1711 |
-
|
1712 |
-
/**
|
1713 |
-
* Updates an event. (events.update)
|
1714 |
-
*
|
1715 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1716 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1717 |
-
* the currently logged in user, use the "primary" keyword.
|
1718 |
-
* @param string $eventId Event identifier.
|
1719 |
-
* @param Google_Event $postBody
|
1720 |
-
* @param array $optParams Optional parameters.
|
1721 |
-
*
|
1722 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1723 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1724 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1725 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1726 |
-
* handle the absence of an email address value in the mentioned places.
|
1727 |
-
* Optional. The default is False.
|
1728 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1729 |
-
* response. If there are more than the specified number of attendees, only the
|
1730 |
-
* participant is returned. Optional.
|
1731 |
-
* @opt_param bool sendNotifications Whether to send notifications about the
|
1732 |
-
* event update (e.g. attendee's responses, title changes, etc.). Optional. The
|
1733 |
-
* default is False.
|
1734 |
-
* @opt_param bool supportsAttachments Whether API client performing operation
|
1735 |
-
* supports event attachments. Optional. The default is False.
|
1736 |
-
* @return Google_Service_Calendar_Event
|
1737 |
-
*/
|
1738 |
-
public function update($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1739 |
-
{
|
1740 |
-
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
|
1741 |
-
$params = array_merge($params, $optParams);
|
1742 |
-
return $this->call('update', array($params), "Google_Service_Calendar_Event");
|
1743 |
-
}
|
1744 |
-
|
1745 |
-
/**
|
1746 |
-
* Watch for changes to Events resources. (events.watch)
|
1747 |
-
*
|
1748 |
-
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1749 |
-
* the calendarList.list method. If you want to access the primary calendar of
|
1750 |
-
* the currently logged in user, use the "primary" keyword.
|
1751 |
-
* @param Google_Channel $postBody
|
1752 |
-
* @param array $optParams Optional parameters.
|
1753 |
-
*
|
1754 |
-
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1755 |
-
* email field for the organizer, creator and attendees, even if no real email
|
1756 |
-
* is available (i.e. a generated, non-working value will be provided). The use
|
1757 |
-
* of this option is discouraged and should only be used by clients which cannot
|
1758 |
-
* handle the absence of an email address value in the mentioned places.
|
1759 |
-
* Optional. The default is False.
|
1760 |
-
* @opt_param string iCalUID Specifies event ID in the iCalendar format to be
|
1761 |
-
* included in the response. Optional.
|
1762 |
-
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1763 |
-
* response. If there are more than the specified number of attendees, only the
|
1764 |
-
* participant is returned. Optional.
|
1765 |
-
* @opt_param int maxResults Maximum number of events returned on one result
|
1766 |
-
* page. By default the value is 250 events. The page size can never be larger
|
1767 |
-
* than 2500 events. Optional.
|
1768 |
-
* @opt_param string orderBy The order of the events returned in the result.
|
1769 |
-
* Optional. The default is an unspecified, stable order.
|
1770 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1771 |
-
* Optional.
|
1772 |
-
* @opt_param string privateExtendedProperty Extended properties constraint
|
1773 |
-
* specified as propertyName=value. Matches only private properties. This
|
1774 |
-
* parameter might be repeated multiple times to return events that match all
|
1775 |
-
* given constraints.
|
1776 |
-
* @opt_param string q Free text search terms to find events that match these
|
1777 |
-
* terms in any field, except for extended properties. Optional.
|
1778 |
-
* @opt_param string sharedExtendedProperty Extended properties constraint
|
1779 |
-
* specified as propertyName=value. Matches only shared properties. This
|
1780 |
-
* parameter might be repeated multiple times to return events that match all
|
1781 |
-
* given constraints.
|
1782 |
-
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1783 |
-
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1784 |
-
* (but not the underlying recurring event) will still be included if
|
1785 |
-
* showDeleted and singleEvents are both False. If showDeleted and singleEvents
|
1786 |
-
* are both True, only single instances of deleted events (but not the
|
1787 |
-
* underlying recurring events) are returned. Optional. The default is False.
|
1788 |
-
* @opt_param bool showHiddenInvitations Whether to include hidden invitations
|
1789 |
-
* in the result. Optional. The default is False.
|
1790 |
-
* @opt_param bool singleEvents Whether to expand recurring events into
|
1791 |
-
* instances and only return single one-off events and instances of recurring
|
1792 |
-
* events, but not the underlying recurring events themselves. Optional. The
|
1793 |
-
* default is False.
|
1794 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1795 |
-
* returned on the last page of results from the previous list request. It makes
|
1796 |
-
* the result of this list request contain only entries that have changed since
|
1797 |
-
* then. All events deleted since the previous list request will always be in
|
1798 |
-
* the result set and it is not allowed to set showDeleted to False. There are
|
1799 |
-
* several query parameters that cannot be specified together with nextSyncToken
|
1800 |
-
* to ensure consistency of the client state.
|
1801 |
-
*
|
1802 |
-
* These are: - iCalUID - orderBy - privateExtendedProperty - q -
|
1803 |
-
* sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
|
1804 |
-
* expires, the server will respond with a 410 GONE response code and the client
|
1805 |
-
* should clear its storage and perform a full synchronization without any
|
1806 |
-
* syncToken. Learn more about incremental synchronization. Optional. The
|
1807 |
-
* default is to return all entries.
|
1808 |
-
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1809 |
-
* to filter by. Optional. The default is not to filter by start time. Must be
|
1810 |
-
* an RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1811 |
-
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1812 |
-
* but will be ignored.
|
1813 |
-
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1814 |
-
* filter by. Optional. The default is not to filter by end time. Must be an
|
1815 |
-
* RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1816 |
-
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1817 |
-
* but will be ignored.
|
1818 |
-
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1819 |
-
* default is the time zone of the calendar.
|
1820 |
-
* @opt_param string updatedMin Lower bound for an event's last modification
|
1821 |
-
* time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
|
1822 |
-
* since this time will always be included regardless of showDeleted. Optional.
|
1823 |
-
* The default is not to filter by last modification time.
|
1824 |
-
* @return Google_Service_Calendar_Channel
|
1825 |
-
*/
|
1826 |
-
public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1827 |
-
{
|
1828 |
-
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1829 |
-
$params = array_merge($params, $optParams);
|
1830 |
-
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1831 |
-
}
|
1832 |
-
}
|
1833 |
-
|
1834 |
-
/**
|
1835 |
-
* The "freebusy" collection of methods.
|
1836 |
-
* Typical usage is:
|
1837 |
-
* <code>
|
1838 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1839 |
-
* $freebusy = $calendarService->freebusy;
|
1840 |
-
* </code>
|
1841 |
-
*/
|
1842 |
-
class Google_Service_Calendar_Freebusy_Resource extends Google_Service_Resource
|
1843 |
-
{
|
1844 |
-
|
1845 |
-
/**
|
1846 |
-
* Returns free/busy information for a set of calendars. (freebusy.query)
|
1847 |
-
*
|
1848 |
-
* @param Google_FreeBusyRequest $postBody
|
1849 |
-
* @param array $optParams Optional parameters.
|
1850 |
-
* @return Google_Service_Calendar_FreeBusyResponse
|
1851 |
-
*/
|
1852 |
-
public function query(Google_Service_Calendar_FreeBusyRequest $postBody, $optParams = array())
|
1853 |
-
{
|
1854 |
-
$params = array('postBody' => $postBody);
|
1855 |
-
$params = array_merge($params, $optParams);
|
1856 |
-
return $this->call('query', array($params), "Google_Service_Calendar_FreeBusyResponse");
|
1857 |
-
}
|
1858 |
-
}
|
1859 |
-
|
1860 |
-
/**
|
1861 |
-
* The "settings" collection of methods.
|
1862 |
-
* Typical usage is:
|
1863 |
-
* <code>
|
1864 |
-
* $calendarService = new Google_Service_Calendar(...);
|
1865 |
-
* $settings = $calendarService->settings;
|
1866 |
-
* </code>
|
1867 |
-
*/
|
1868 |
-
class Google_Service_Calendar_Settings_Resource extends Google_Service_Resource
|
1869 |
-
{
|
1870 |
-
|
1871 |
-
/**
|
1872 |
-
* Returns a single user setting. (settings.get)
|
1873 |
-
*
|
1874 |
-
* @param string $setting The id of the user setting.
|
1875 |
-
* @param array $optParams Optional parameters.
|
1876 |
-
* @return Google_Service_Calendar_Setting
|
1877 |
-
*/
|
1878 |
-
public function get($setting, $optParams = array())
|
1879 |
-
{
|
1880 |
-
$params = array('setting' => $setting);
|
1881 |
-
$params = array_merge($params, $optParams);
|
1882 |
-
return $this->call('get', array($params), "Google_Service_Calendar_Setting");
|
1883 |
-
}
|
1884 |
-
|
1885 |
-
/**
|
1886 |
-
* Returns all user settings for the authenticated user. (settings.listSettings)
|
1887 |
-
*
|
1888 |
-
* @param array $optParams Optional parameters.
|
1889 |
-
*
|
1890 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
1891 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
1892 |
-
* than 250 entries. Optional.
|
1893 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1894 |
-
* Optional.
|
1895 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1896 |
-
* returned on the last page of results from the previous list request. It makes
|
1897 |
-
* the result of this list request contain only entries that have changed since
|
1898 |
-
* then. If the syncToken expires, the server will respond with a 410 GONE
|
1899 |
-
* response code and the client should clear its storage and perform a full
|
1900 |
-
* synchronization without any syncToken. Learn more about incremental
|
1901 |
-
* synchronization. Optional. The default is to return all entries.
|
1902 |
-
* @return Google_Service_Calendar_Settings
|
1903 |
-
*/
|
1904 |
-
public function listSettings($optParams = array())
|
1905 |
-
{
|
1906 |
-
$params = array();
|
1907 |
-
$params = array_merge($params, $optParams);
|
1908 |
-
return $this->call('list', array($params), "Google_Service_Calendar_Settings");
|
1909 |
-
}
|
1910 |
-
|
1911 |
-
/**
|
1912 |
-
* Watch for changes to Settings resources. (settings.watch)
|
1913 |
-
*
|
1914 |
-
* @param Google_Channel $postBody
|
1915 |
-
* @param array $optParams Optional parameters.
|
1916 |
-
*
|
1917 |
-
* @opt_param int maxResults Maximum number of entries returned on one result
|
1918 |
-
* page. By default the value is 100 entries. The page size can never be larger
|
1919 |
-
* than 250 entries. Optional.
|
1920 |
-
* @opt_param string pageToken Token specifying which result page to return.
|
1921 |
-
* Optional.
|
1922 |
-
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1923 |
-
* returned on the last page of results from the previous list request. It makes
|
1924 |
-
* the result of this list request contain only entries that have changed since
|
1925 |
-
* then. If the syncToken expires, the server will respond with a 410 GONE
|
1926 |
-
* response code and the client should clear its storage and perform a full
|
1927 |
-
* synchronization without any syncToken. Learn more about incremental
|
1928 |
-
* synchronization. Optional. The default is to return all entries.
|
1929 |
-
* @return Google_Service_Calendar_Channel
|
1930 |
-
*/
|
1931 |
-
public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1932 |
-
{
|
1933 |
-
$params = array('postBody' => $postBody);
|
1934 |
-
$params = array_merge($params, $optParams);
|
1935 |
-
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1936 |
-
}
|
1937 |
-
}
|
1938 |
-
|
1939 |
-
|
1940 |
-
|
1941 |
-
|
1942 |
-
class Google_Service_Calendar_Acl extends Google_Collection
|
1943 |
-
{
|
1944 |
-
protected $collection_key = 'items';
|
1945 |
-
protected $internal_gapi_mappings = array(
|
1946 |
-
);
|
1947 |
-
public $etag;
|
1948 |
-
protected $itemsType = 'Google_Service_Calendar_AclRule';
|
1949 |
-
protected $itemsDataType = 'array';
|
1950 |
-
public $kind;
|
1951 |
-
public $nextPageToken;
|
1952 |
-
public $nextSyncToken;
|
1953 |
-
|
1954 |
-
|
1955 |
-
public function setEtag($etag)
|
1956 |
-
{
|
1957 |
-
$this->etag = $etag;
|
1958 |
-
}
|
1959 |
-
public function getEtag()
|
1960 |
-
{
|
1961 |
-
return $this->etag;
|
1962 |
-
}
|
1963 |
-
public function setItems($items)
|
1964 |
-
{
|
1965 |
-
$this->items = $items;
|
1966 |
-
}
|
1967 |
-
public function getItems()
|
1968 |
-
{
|
1969 |
-
return $this->items;
|
1970 |
-
}
|
1971 |
-
public function setKind($kind)
|
1972 |
-
{
|
1973 |
-
$this->kind = $kind;
|
1974 |
-
}
|
1975 |
-
public function getKind()
|
1976 |
-
{
|
1977 |
-
return $this->kind;
|
1978 |
-
}
|
1979 |
-
public function setNextPageToken($nextPageToken)
|
1980 |
-
{
|
1981 |
-
$this->nextPageToken = $nextPageToken;
|
1982 |
-
}
|
1983 |
-
public function getNextPageToken()
|
1984 |
-
{
|
1985 |
-
return $this->nextPageToken;
|
1986 |
-
}
|
1987 |
-
public function setNextSyncToken($nextSyncToken)
|
1988 |
-
{
|
1989 |
-
$this->nextSyncToken = $nextSyncToken;
|
1990 |
-
}
|
1991 |
-
public function getNextSyncToken()
|
1992 |
-
{
|
1993 |
-
return $this->nextSyncToken;
|
1994 |
-
}
|
1995 |
-
}
|
1996 |
-
|
1997 |
-
class Google_Service_Calendar_AclRule extends Google_Model
|
1998 |
-
{
|
1999 |
-
protected $internal_gapi_mappings = array(
|
2000 |
-
);
|
2001 |
-
public $etag;
|
2002 |
-
public $id;
|
2003 |
-
public $kind;
|
2004 |
-
public $role;
|
2005 |
-
protected $scopeType = 'Google_Service_Calendar_AclRuleScope';
|
2006 |
-
protected $scopeDataType = '';
|
2007 |
-
|
2008 |
-
|
2009 |
-
public function setEtag($etag)
|
2010 |
-
{
|
2011 |
-
$this->etag = $etag;
|
2012 |
-
}
|
2013 |
-
public function getEtag()
|
2014 |
-
{
|
2015 |
-
return $this->etag;
|
2016 |
-
}
|
2017 |
-
public function setId($id)
|
2018 |
-
{
|
2019 |
-
$this->id = $id;
|
2020 |
-
}
|
2021 |
-
public function getId()
|
2022 |
-
{
|
2023 |
-
return $this->id;
|
2024 |
-
}
|
2025 |
-
public function setKind($kind)
|
2026 |
-
{
|
2027 |
-
$this->kind = $kind;
|
2028 |
-
}
|
2029 |
-
public function getKind()
|
2030 |
-
{
|
2031 |
-
return $this->kind;
|
2032 |
-
}
|
2033 |
-
public function setRole($role)
|
2034 |
-
{
|
2035 |
-
$this->role = $role;
|
2036 |
-
}
|
2037 |
-
public function getRole()
|
2038 |
-
{
|
2039 |
-
return $this->role;
|
2040 |
-
}
|
2041 |
-
public function setScope(Google_Service_Calendar_AclRuleScope $scope)
|
2042 |
-
{
|
2043 |
-
$this->scope = $scope;
|
2044 |
-
}
|
2045 |
-
public function getScope()
|
2046 |
-
{
|
2047 |
-
return $this->scope;
|
2048 |
-
}
|
2049 |
-
}
|
2050 |
-
|
2051 |
-
class Google_Service_Calendar_AclRuleScope extends Google_Model
|
2052 |
-
{
|
2053 |
-
protected $internal_gapi_mappings = array(
|
2054 |
-
);
|
2055 |
-
public $type;
|
2056 |
-
public $value;
|
2057 |
-
|
2058 |
-
|
2059 |
-
public function setType($type)
|
2060 |
-
{
|
2061 |
-
$this->type = $type;
|
2062 |
-
}
|
2063 |
-
public function getType()
|
2064 |
-
{
|
2065 |
-
return $this->type;
|
2066 |
-
}
|
2067 |
-
public function setValue($value)
|
2068 |
-
{
|
2069 |
-
$this->value = $value;
|
2070 |
-
}
|
2071 |
-
public function getValue()
|
2072 |
-
{
|
2073 |
-
return $this->value;
|
2074 |
-
}
|
2075 |
-
}
|
2076 |
-
|
2077 |
-
class Google_Service_Calendar_Calendar extends Google_Model
|
2078 |
-
{
|
2079 |
-
protected $internal_gapi_mappings = array(
|
2080 |
-
);
|
2081 |
-
public $description;
|
2082 |
-
public $etag;
|
2083 |
-
public $id;
|
2084 |
-
public $kind;
|
2085 |
-
public $location;
|
2086 |
-
public $summary;
|
2087 |
-
public $timeZone;
|
2088 |
-
|
2089 |
-
|
2090 |
-
public function setDescription($description)
|
2091 |
-
{
|
2092 |
-
$this->description = $description;
|
2093 |
-
}
|
2094 |
-
public function getDescription()
|
2095 |
-
{
|
2096 |
-
return $this->description;
|
2097 |
-
}
|
2098 |
-
public function setEtag($etag)
|
2099 |
-
{
|
2100 |
-
$this->etag = $etag;
|
2101 |
-
}
|
2102 |
-
public function getEtag()
|
2103 |
-
{
|
2104 |
-
return $this->etag;
|
2105 |
-
}
|
2106 |
-
public function setId($id)
|
2107 |
-
{
|
2108 |
-
$this->id = $id;
|
2109 |
-
}
|
2110 |
-
public function getId()
|
2111 |
-
{
|
2112 |
-
return $this->id;
|
2113 |
-
}
|
2114 |
-
public function setKind($kind)
|
2115 |
-
{
|
2116 |
-
$this->kind = $kind;
|
2117 |
-
}
|
2118 |
-
public function getKind()
|
2119 |
-
{
|
2120 |
-
return $this->kind;
|
2121 |
-
}
|
2122 |
-
public function setLocation($location)
|
2123 |
-
{
|
2124 |
-
$this->location = $location;
|
2125 |
-
}
|
2126 |
-
public function getLocation()
|
2127 |
-
{
|
2128 |
-
return $this->location;
|
2129 |
-
}
|
2130 |
-
public function setSummary($summary)
|
2131 |
-
{
|
2132 |
-
$this->summary = $summary;
|
2133 |
-
}
|
2134 |
-
public function getSummary()
|
2135 |
-
{
|
2136 |
-
return $this->summary;
|
2137 |
-
}
|
2138 |
-
public function setTimeZone($timeZone)
|
2139 |
-
{
|
2140 |
-
$this->timeZone = $timeZone;
|
2141 |
-
}
|
2142 |
-
public function getTimeZone()
|
2143 |
-
{
|
2144 |
-
return $this->timeZone;
|
2145 |
-
}
|
2146 |
-
}
|
2147 |
-
|
2148 |
-
class Google_Service_Calendar_CalendarList extends Google_Collection
|
2149 |
-
{
|
2150 |
-
protected $collection_key = 'items';
|
2151 |
-
protected $internal_gapi_mappings = array(
|
2152 |
-
);
|
2153 |
-
public $etag;
|
2154 |
-
protected $itemsType = 'Google_Service_Calendar_CalendarListEntry';
|
2155 |
-
protected $itemsDataType = 'array';
|
2156 |
-
public $kind;
|
2157 |
-
public $nextPageToken;
|
2158 |
-
public $nextSyncToken;
|
2159 |
-
|
2160 |
-
|
2161 |
-
public function setEtag($etag)
|
2162 |
-
{
|
2163 |
-
$this->etag = $etag;
|
2164 |
-
}
|
2165 |
-
public function getEtag()
|
2166 |
-
{
|
2167 |
-
return $this->etag;
|
2168 |
-
}
|
2169 |
-
public function setItems($items)
|
2170 |
-
{
|
2171 |
-
$this->items = $items;
|
2172 |
-
}
|
2173 |
-
public function getItems()
|
2174 |
-
{
|
2175 |
-
return $this->items;
|
2176 |
-
}
|
2177 |
-
public function setKind($kind)
|
2178 |
-
{
|
2179 |
-
$this->kind = $kind;
|
2180 |
-
}
|
2181 |
-
public function getKind()
|
2182 |
-
{
|
2183 |
-
return $this->kind;
|
2184 |
-
}
|
2185 |
-
public function setNextPageToken($nextPageToken)
|
2186 |
-
{
|
2187 |
-
$this->nextPageToken = $nextPageToken;
|
2188 |
-
}
|
2189 |
-
public function getNextPageToken()
|
2190 |
-
{
|
2191 |
-
return $this->nextPageToken;
|
2192 |
-
}
|
2193 |
-
public function setNextSyncToken($nextSyncToken)
|
2194 |
-
{
|
2195 |
-
$this->nextSyncToken = $nextSyncToken;
|
2196 |
-
}
|
2197 |
-
public function getNextSyncToken()
|
2198 |
-
{
|
2199 |
-
return $this->nextSyncToken;
|
2200 |
-
}
|
2201 |
-
}
|
2202 |
-
|
2203 |
-
class Google_Service_Calendar_CalendarListEntry extends Google_Collection
|
2204 |
-
{
|
2205 |
-
protected $collection_key = 'defaultReminders';
|
2206 |
-
protected $internal_gapi_mappings = array(
|
2207 |
-
);
|
2208 |
-
public $accessRole;
|
2209 |
-
public $backgroundColor;
|
2210 |
-
public $colorId;
|
2211 |
-
protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
|
2212 |
-
protected $defaultRemindersDataType = 'array';
|
2213 |
-
public $deleted;
|
2214 |
-
public $description;
|
2215 |
-
public $etag;
|
2216 |
-
public $foregroundColor;
|
2217 |
-
public $hidden;
|
2218 |
-
public $id;
|
2219 |
-
public $kind;
|
2220 |
-
public $location;
|
2221 |
-
protected $notificationSettingsType = 'Google_Service_Calendar_CalendarListEntryNotificationSettings';
|
2222 |
-
protected $notificationSettingsDataType = '';
|
2223 |
-
public $primary;
|
2224 |
-
public $selected;
|
2225 |
-
public $summary;
|
2226 |
-
public $summaryOverride;
|
2227 |
-
public $timeZone;
|
2228 |
-
|
2229 |
-
|
2230 |
-
public function setAccessRole($accessRole)
|
2231 |
-
{
|
2232 |
-
$this->accessRole = $accessRole;
|
2233 |
-
}
|
2234 |
-
public function getAccessRole()
|
2235 |
-
{
|
2236 |
-
return $this->accessRole;
|
2237 |
-
}
|
2238 |
-
public function setBackgroundColor($backgroundColor)
|
2239 |
-
{
|
2240 |
-
$this->backgroundColor = $backgroundColor;
|
2241 |
-
}
|
2242 |
-
public function getBackgroundColor()
|
2243 |
-
{
|
2244 |
-
return $this->backgroundColor;
|
2245 |
-
}
|
2246 |
-
public function setColorId($colorId)
|
2247 |
-
{
|
2248 |
-
$this->colorId = $colorId;
|
2249 |
-
}
|
2250 |
-
public function getColorId()
|
2251 |
-
{
|
2252 |
-
return $this->colorId;
|
2253 |
-
}
|
2254 |
-
public function setDefaultReminders($defaultReminders)
|
2255 |
-
{
|
2256 |
-
$this->defaultReminders = $defaultReminders;
|
2257 |
-
}
|
2258 |
-
public function getDefaultReminders()
|
2259 |
-
{
|
2260 |
-
return $this->defaultReminders;
|
2261 |
-
}
|
2262 |
-
public function setDeleted($deleted)
|
2263 |
-
{
|
2264 |
-
$this->deleted = $deleted;
|
2265 |
-
}
|
2266 |
-
public function getDeleted()
|
2267 |
-
{
|
2268 |
-
return $this->deleted;
|
2269 |
-
}
|
2270 |
-
public function setDescription($description)
|
2271 |
-
{
|
2272 |
-
$this->description = $description;
|
2273 |
-
}
|
2274 |
-
public function getDescription()
|
2275 |
-
{
|
2276 |
-
return $this->description;
|
2277 |
-
}
|
2278 |
-
public function setEtag($etag)
|
2279 |
-
{
|
2280 |
-
$this->etag = $etag;
|
2281 |
-
}
|
2282 |
-
public function getEtag()
|
2283 |
-
{
|
2284 |
-
return $this->etag;
|
2285 |
-
}
|
2286 |
-
public function setForegroundColor($foregroundColor)
|
2287 |
-
{
|
2288 |
-
$this->foregroundColor = $foregroundColor;
|
2289 |
-
}
|
2290 |
-
public function getForegroundColor()
|
2291 |
-
{
|
2292 |
-
return $this->foregroundColor;
|
2293 |
-
}
|
2294 |
-
public function setHidden($hidden)
|
2295 |
-
{
|
2296 |
-
$this->hidden = $hidden;
|
2297 |
-
}
|
2298 |
-
public function getHidden()
|
2299 |
-
{
|
2300 |
-
return $this->hidden;
|
2301 |
-
}
|
2302 |
-
public function setId($id)
|
2303 |
-
{
|
2304 |
-
$this->id = $id;
|
2305 |
-
}
|
2306 |
-
public function getId()
|
2307 |
-
{
|
2308 |
-
return $this->id;
|
2309 |
-
}
|
2310 |
-
public function setKind($kind)
|
2311 |
-
{
|
2312 |
-
$this->kind = $kind;
|
2313 |
-
}
|
2314 |
-
public function getKind()
|
2315 |
-
{
|
2316 |
-
return $this->kind;
|
2317 |
-
}
|
2318 |
-
public function setLocation($location)
|
2319 |
-
{
|
2320 |
-
$this->location = $location;
|
2321 |
-
}
|
2322 |
-
public function getLocation()
|
2323 |
-
{
|
2324 |
-
return $this->location;
|
2325 |
-
}
|
2326 |
-
public function setNotificationSettings(Google_Service_Calendar_CalendarListEntryNotificationSettings $notificationSettings)
|
2327 |
-
{
|
2328 |
-
$this->notificationSettings = $notificationSettings;
|
2329 |
-
}
|
2330 |
-
public function getNotificationSettings()
|
2331 |
-
{
|
2332 |
-
return $this->notificationSettings;
|
2333 |
-
}
|
2334 |
-
public function setPrimary($primary)
|
2335 |
-
{
|
2336 |
-
$this->primary = $primary;
|
2337 |
-
}
|
2338 |
-
public function getPrimary()
|
2339 |
-
{
|
2340 |
-
return $this->primary;
|
2341 |
-
}
|
2342 |
-
public function setSelected($selected)
|
2343 |
-
{
|
2344 |
-
$this->selected = $selected;
|
2345 |
-
}
|
2346 |
-
public function getSelected()
|
2347 |
-
{
|
2348 |
-
return $this->selected;
|
2349 |
-
}
|
2350 |
-
public function setSummary($summary)
|
2351 |
-
{
|
2352 |
-
$this->summary = $summary;
|
2353 |
-
}
|
2354 |
-
public function getSummary()
|
2355 |
-
{
|
2356 |
-
return $this->summary;
|
2357 |
-
}
|
2358 |
-
public function setSummaryOverride($summaryOverride)
|
2359 |
-
{
|
2360 |
-
$this->summaryOverride = $summaryOverride;
|
2361 |
-
}
|
2362 |
-
public function getSummaryOverride()
|
2363 |
-
{
|
2364 |
-
return $this->summaryOverride;
|
2365 |
-
}
|
2366 |
-
public function setTimeZone($timeZone)
|
2367 |
-
{
|
2368 |
-
$this->timeZone = $timeZone;
|
2369 |
-
}
|
2370 |
-
public function getTimeZone()
|
2371 |
-
{
|
2372 |
-
return $this->timeZone;
|
2373 |
-
}
|
2374 |
-
}
|
2375 |
-
|
2376 |
-
class Google_Service_Calendar_CalendarListEntryNotificationSettings extends Google_Collection
|
2377 |
-
{
|
2378 |
-
protected $collection_key = 'notifications';
|
2379 |
-
protected $internal_gapi_mappings = array(
|
2380 |
-
);
|
2381 |
-
protected $notificationsType = 'Google_Service_Calendar_CalendarNotification';
|
2382 |
-
protected $notificationsDataType = 'array';
|
2383 |
-
|
2384 |
-
|
2385 |
-
public function setNotifications($notifications)
|
2386 |
-
{
|
2387 |
-
$this->notifications = $notifications;
|
2388 |
-
}
|
2389 |
-
public function getNotifications()
|
2390 |
-
{
|
2391 |
-
return $this->notifications;
|
2392 |
-
}
|
2393 |
-
}
|
2394 |
-
|
2395 |
-
class Google_Service_Calendar_CalendarNotification extends Google_Model
|
2396 |
-
{
|
2397 |
-
protected $internal_gapi_mappings = array(
|
2398 |
-
);
|
2399 |
-
public $method;
|
2400 |
-
public $type;
|
2401 |
-
|
2402 |
-
|
2403 |
-
public function setMethod($method)
|
2404 |
-
{
|
2405 |
-
$this->method = $method;
|
2406 |
-
}
|
2407 |
-
public function getMethod()
|
2408 |
-
{
|
2409 |
-
return $this->method;
|
2410 |
-
}
|
2411 |
-
public function setType($type)
|
2412 |
-
{
|
2413 |
-
$this->type = $type;
|
2414 |
-
}
|
2415 |
-
public function getType()
|
2416 |
-
{
|
2417 |
-
return $this->type;
|
2418 |
-
}
|
2419 |
-
}
|
2420 |
-
|
2421 |
-
class Google_Service_Calendar_Channel extends Google_Model
|
2422 |
-
{
|
2423 |
-
protected $internal_gapi_mappings = array(
|
2424 |
-
);
|
2425 |
-
public $address;
|
2426 |
-
public $expiration;
|
2427 |
-
public $id;
|
2428 |
-
public $kind;
|
2429 |
-
public $params;
|
2430 |
-
public $payload;
|
2431 |
-
public $resourceId;
|
2432 |
-
public $resourceUri;
|
2433 |
-
public $token;
|
2434 |
-
public $type;
|
2435 |
-
|
2436 |
-
|
2437 |
-
public function setAddress($address)
|
2438 |
-
{
|
2439 |
-
$this->address = $address;
|
2440 |
-
}
|
2441 |
-
public function getAddress()
|
2442 |
-
{
|
2443 |
-
return $this->address;
|
2444 |
-
}
|
2445 |
-
public function setExpiration($expiration)
|
2446 |
-
{
|
2447 |
-
$this->expiration = $expiration;
|
2448 |
-
}
|
2449 |
-
public function getExpiration()
|
2450 |
-
{
|
2451 |
-
return $this->expiration;
|
2452 |
-
}
|
2453 |
-
public function setId($id)
|
2454 |
-
{
|
2455 |
-
$this->id = $id;
|
2456 |
-
}
|
2457 |
-
public function getId()
|
2458 |
-
{
|
2459 |
-
return $this->id;
|
2460 |
-
}
|
2461 |
-
public function setKind($kind)
|
2462 |
-
{
|
2463 |
-
$this->kind = $kind;
|
2464 |
-
}
|
2465 |
-
public function getKind()
|
2466 |
-
{
|
2467 |
-
return $this->kind;
|
2468 |
-
}
|
2469 |
-
public function setParams($params)
|
2470 |
-
{
|
2471 |
-
$this->params = $params;
|
2472 |
-
}
|
2473 |
-
public function getParams()
|
2474 |
-
{
|
2475 |
-
return $this->params;
|
2476 |
-
}
|
2477 |
-
public function setPayload($payload)
|
2478 |
-
{
|
2479 |
-
$this->payload = $payload;
|
2480 |
-
}
|
2481 |
-
public function getPayload()
|
2482 |
-
{
|
2483 |
-
return $this->payload;
|
2484 |
-
}
|
2485 |
-
public function setResourceId($resourceId)
|
2486 |
-
{
|
2487 |
-
$this->resourceId = $resourceId;
|
2488 |
-
}
|
2489 |
-
public function getResourceId()
|
2490 |
-
{
|
2491 |
-
return $this->resourceId;
|
2492 |
-
}
|
2493 |
-
public function setResourceUri($resourceUri)
|
2494 |
-
{
|
2495 |
-
$this->resourceUri = $resourceUri;
|
2496 |
-
}
|
2497 |
-
public function getResourceUri()
|
2498 |
-
{
|
2499 |
-
return $this->resourceUri;
|
2500 |
-
}
|
2501 |
-
public function setToken($token)
|
2502 |
-
{
|
2503 |
-
$this->token = $token;
|
2504 |
-
}
|
2505 |
-
public function getToken()
|
2506 |
-
{
|
2507 |
-
return $this->token;
|
2508 |
-
}
|
2509 |
-
public function setType($type)
|
2510 |
-
{
|
2511 |
-
$this->type = $type;
|
2512 |
-
}
|
2513 |
-
public function getType()
|
2514 |
-
{
|
2515 |
-
return $this->type;
|
2516 |
-
}
|
2517 |
-
}
|
2518 |
-
|
2519 |
-
class Google_Service_Calendar_ColorDefinition extends Google_Model
|
2520 |
-
{
|
2521 |
-
protected $internal_gapi_mappings = array(
|
2522 |
-
);
|
2523 |
-
public $background;
|
2524 |
-
public $foreground;
|
2525 |
-
|
2526 |
-
|
2527 |
-
public function setBackground($background)
|
2528 |
-
{
|
2529 |
-
$this->background = $background;
|
2530 |
-
}
|
2531 |
-
public function getBackground()
|
2532 |
-
{
|
2533 |
-
return $this->background;
|
2534 |
-
}
|
2535 |
-
public function setForeground($foreground)
|
2536 |
-
{
|
2537 |
-
$this->foreground = $foreground;
|
2538 |
-
}
|
2539 |
-
public function getForeground()
|
2540 |
-
{
|
2541 |
-
return $this->foreground;
|
2542 |
-
}
|
2543 |
-
}
|
2544 |
-
|
2545 |
-
class Google_Service_Calendar_Colors extends Google_Model
|
2546 |
-
{
|
2547 |
-
protected $internal_gapi_mappings = array(
|
2548 |
-
);
|
2549 |
-
protected $calendarType = 'Google_Service_Calendar_ColorDefinition';
|
2550 |
-
protected $calendarDataType = 'map';
|
2551 |
-
protected $eventType = 'Google_Service_Calendar_ColorDefinition';
|
2552 |
-
protected $eventDataType = 'map';
|
2553 |
-
public $kind;
|
2554 |
-
public $updated;
|
2555 |
-
|
2556 |
-
|
2557 |
-
public function setCalendar($calendar)
|
2558 |
-
{
|
2559 |
-
$this->calendar = $calendar;
|
2560 |
-
}
|
2561 |
-
public function getCalendar()
|
2562 |
-
{
|
2563 |
-
return $this->calendar;
|
2564 |
-
}
|
2565 |
-
public function setEvent($event)
|
2566 |
-
{
|
2567 |
-
$this->event = $event;
|
2568 |
-
}
|
2569 |
-
public function getEvent()
|
2570 |
-
{
|
2571 |
-
return $this->event;
|
2572 |
-
}
|
2573 |
-
public function setKind($kind)
|
2574 |
-
{
|
2575 |
-
$this->kind = $kind;
|
2576 |
-
}
|
2577 |
-
public function getKind()
|
2578 |
-
{
|
2579 |
-
return $this->kind;
|
2580 |
-
}
|
2581 |
-
public function setUpdated($updated)
|
2582 |
-
{
|
2583 |
-
$this->updated = $updated;
|
2584 |
-
}
|
2585 |
-
public function getUpdated()
|
2586 |
-
{
|
2587 |
-
return $this->updated;
|
2588 |
-
}
|
2589 |
-
}
|
2590 |
-
|
2591 |
-
class Google_Service_Calendar_Error extends Google_Model
|
2592 |
-
{
|
2593 |
-
protected $internal_gapi_mappings = array(
|
2594 |
-
);
|
2595 |
-
public $domain;
|
2596 |
-
public $reason;
|
2597 |
-
|
2598 |
-
|
2599 |
-
public function setDomain($domain)
|
2600 |
-
{
|
2601 |
-
$this->domain = $domain;
|
2602 |
-
}
|
2603 |
-
public function getDomain()
|
2604 |
-
{
|
2605 |
-
return $this->domain;
|
2606 |
-
}
|
2607 |
-
public function setReason($reason)
|
2608 |
-
{
|
2609 |
-
$this->reason = $reason;
|
2610 |
-
}
|
2611 |
-
public function getReason()
|
2612 |
-
{
|
2613 |
-
return $this->reason;
|
2614 |
-
}
|
2615 |
-
}
|
2616 |
-
|
2617 |
-
class Google_Service_Calendar_Event extends Google_Collection
|
2618 |
-
{
|
2619 |
-
protected $collection_key = 'recurrence';
|
2620 |
-
protected $internal_gapi_mappings = array(
|
2621 |
-
);
|
2622 |
-
public $anyoneCanAddSelf;
|
2623 |
-
protected $attachmentsType = 'Google_Service_Calendar_EventAttachment';
|
2624 |
-
protected $attachmentsDataType = 'array';
|
2625 |
-
protected $attendeesType = 'Google_Service_Calendar_EventAttendee';
|
2626 |
-
protected $attendeesDataType = 'array';
|
2627 |
-
public $attendeesOmitted;
|
2628 |
-
public $colorId;
|
2629 |
-
public $created;
|
2630 |
-
protected $creatorType = 'Google_Service_Calendar_EventCreator';
|
2631 |
-
protected $creatorDataType = '';
|
2632 |
-
public $description;
|
2633 |
-
protected $endType = 'Google_Service_Calendar_EventDateTime';
|
2634 |
-
protected $endDataType = '';
|
2635 |
-
public $endTimeUnspecified;
|
2636 |
-
public $etag;
|
2637 |
-
protected $extendedPropertiesType = 'Google_Service_Calendar_EventExtendedProperties';
|
2638 |
-
protected $extendedPropertiesDataType = '';
|
2639 |
-
protected $gadgetType = 'Google_Service_Calendar_EventGadget';
|
2640 |
-
protected $gadgetDataType = '';
|
2641 |
-
public $guestsCanInviteOthers;
|
2642 |
-
public $guestsCanModify;
|
2643 |
-
public $guestsCanSeeOtherGuests;
|
2644 |
-
public $hangoutLink;
|
2645 |
-
public $htmlLink;
|
2646 |
-
public $iCalUID;
|
2647 |
-
public $id;
|
2648 |
-
public $kind;
|
2649 |
-
public $location;
|
2650 |
-
public $locked;
|
2651 |
-
protected $organizerType = 'Google_Service_Calendar_EventOrganizer';
|
2652 |
-
protected $organizerDataType = '';
|
2653 |
-
protected $originalStartTimeType = 'Google_Service_Calendar_EventDateTime';
|
2654 |
-
protected $originalStartTimeDataType = '';
|
2655 |
-
public $privateCopy;
|
2656 |
-
public $recurrence;
|
2657 |
-
public $recurringEventId;
|
2658 |
-
protected $remindersType = 'Google_Service_Calendar_EventReminders';
|
2659 |
-
protected $remindersDataType = '';
|
2660 |
-
public $sequence;
|
2661 |
-
protected $sourceType = 'Google_Service_Calendar_EventSource';
|
2662 |
-
protected $sourceDataType = '';
|
2663 |
-
protected $startType = 'Google_Service_Calendar_EventDateTime';
|
2664 |
-
protected $startDataType = '';
|
2665 |
-
public $status;
|
2666 |
-
public $summary;
|
2667 |
-
public $transparency;
|
2668 |
-
public $updated;
|
2669 |
-
public $visibility;
|
2670 |
-
|
2671 |
-
|
2672 |
-
public function setAnyoneCanAddSelf($anyoneCanAddSelf)
|
2673 |
-
{
|
2674 |
-
$this->anyoneCanAddSelf = $anyoneCanAddSelf;
|
2675 |
-
}
|
2676 |
-
public function getAnyoneCanAddSelf()
|
2677 |
-
{
|
2678 |
-
return $this->anyoneCanAddSelf;
|
2679 |
-
}
|
2680 |
-
public function setAttachments($attachments)
|
2681 |
-
{
|
2682 |
-
$this->attachments = $attachments;
|
2683 |
-
}
|
2684 |
-
public function getAttachments()
|
2685 |
-
{
|
2686 |
-
return $this->attachments;
|
2687 |
-
}
|
2688 |
-
public function setAttendees($attendees)
|
2689 |
-
{
|
2690 |
-
$this->attendees = $attendees;
|
2691 |
-
}
|
2692 |
-
public function getAttendees()
|
2693 |
-
{
|
2694 |
-
return $this->attendees;
|
2695 |
-
}
|
2696 |
-
public function setAttendeesOmitted($attendeesOmitted)
|
2697 |
-
{
|
2698 |
-
$this->attendeesOmitted = $attendeesOmitted;
|
2699 |
-
}
|
2700 |
-
public function getAttendeesOmitted()
|
2701 |
-
{
|
2702 |
-
return $this->attendeesOmitted;
|
2703 |
-
}
|
2704 |
-
public function setColorId($colorId)
|
2705 |
-
{
|
2706 |
-
$this->colorId = $colorId;
|
2707 |
-
}
|
2708 |
-
public function getColorId()
|
2709 |
-
{
|
2710 |
-
return $this->colorId;
|
2711 |
-
}
|
2712 |
-
public function setCreated($created)
|
2713 |
-
{
|
2714 |
-
$this->created = $created;
|
2715 |
-
}
|
2716 |
-
public function getCreated()
|
2717 |
-
{
|
2718 |
-
return $this->created;
|
2719 |
-
}
|
2720 |
-
public function setCreator(Google_Service_Calendar_EventCreator $creator)
|
2721 |
-
{
|
2722 |
-
$this->creator = $creator;
|
2723 |
-
}
|
2724 |
-
public function getCreator()
|
2725 |
-
{
|
2726 |
-
return $this->creator;
|
2727 |
-
}
|
2728 |
-
public function setDescription($description)
|
2729 |
-
{
|
2730 |
-
$this->description = $description;
|
2731 |
-
}
|
2732 |
-
public function getDescription()
|
2733 |
-
{
|
2734 |
-
return $this->description;
|
2735 |
-
}
|
2736 |
-
public function setEnd(Google_Service_Calendar_EventDateTime $end)
|
2737 |
-
{
|
2738 |
-
$this->end = $end;
|
2739 |
-
}
|
2740 |
-
public function getEnd()
|
2741 |
-
{
|
2742 |
-
return $this->end;
|
2743 |
-
}
|
2744 |
-
public function setEndTimeUnspecified($endTimeUnspecified)
|
2745 |
-
{
|
2746 |
-
$this->endTimeUnspecified = $endTimeUnspecified;
|
2747 |
-
}
|
2748 |
-
public function getEndTimeUnspecified()
|
2749 |
-
{
|
2750 |
-
return $this->endTimeUnspecified;
|
2751 |
-
}
|
2752 |
-
public function setEtag($etag)
|
2753 |
-
{
|
2754 |
-
$this->etag = $etag;
|
2755 |
-
}
|
2756 |
-
public function getEtag()
|
2757 |
-
{
|
2758 |
-
return $this->etag;
|
2759 |
-
}
|
2760 |
-
public function setExtendedProperties(Google_Service_Calendar_EventExtendedProperties $extendedProperties)
|
2761 |
-
{
|
2762 |
-
$this->extendedProperties = $extendedProperties;
|
2763 |
-
}
|
2764 |
-
public function getExtendedProperties()
|
2765 |
-
{
|
2766 |
-
return $this->extendedProperties;
|
2767 |
-
}
|
2768 |
-
public function setGadget(Google_Service_Calendar_EventGadget $gadget)
|
2769 |
-
{
|
2770 |
-
$this->gadget = $gadget;
|
2771 |
-
}
|
2772 |
-
public function getGadget()
|
2773 |
-
{
|
2774 |
-
return $this->gadget;
|
2775 |
-
}
|
2776 |
-
public function setGuestsCanInviteOthers($guestsCanInviteOthers)
|
2777 |
-
{
|
2778 |
-
$this->guestsCanInviteOthers = $guestsCanInviteOthers;
|
2779 |
-
}
|
2780 |
-
public function getGuestsCanInviteOthers()
|
2781 |
-
{
|
2782 |
-
return $this->guestsCanInviteOthers;
|
2783 |
-
}
|
2784 |
-
public function setGuestsCanModify($guestsCanModify)
|
2785 |
-
{
|
2786 |
-
$this->guestsCanModify = $guestsCanModify;
|
2787 |
-
}
|
2788 |
-
public function getGuestsCanModify()
|
2789 |
-
{
|
2790 |
-
return $this->guestsCanModify;
|
2791 |
-
}
|
2792 |
-
public function setGuestsCanSeeOtherGuests($guestsCanSeeOtherGuests)
|
2793 |
-
{
|
2794 |
-
$this->guestsCanSeeOtherGuests = $guestsCanSeeOtherGuests;
|
2795 |
-
}
|
2796 |
-
public function getGuestsCanSeeOtherGuests()
|
2797 |
-
{
|
2798 |
-
return $this->guestsCanSeeOtherGuests;
|
2799 |
-
}
|
2800 |
-
public function setHangoutLink($hangoutLink)
|
2801 |
-
{
|
2802 |
-
$this->hangoutLink = $hangoutLink;
|
2803 |
-
}
|
2804 |
-
public function getHangoutLink()
|
2805 |
-
{
|
2806 |
-
return $this->hangoutLink;
|
2807 |
-
}
|
2808 |
-
public function setHtmlLink($htmlLink)
|
2809 |
-
{
|
2810 |
-
$this->htmlLink = $htmlLink;
|
2811 |
-
}
|
2812 |
-
public function getHtmlLink()
|
2813 |
-
{
|
2814 |
-
return $this->htmlLink;
|
2815 |
-
}
|
2816 |
-
public function setICalUID($iCalUID)
|
2817 |
-
{
|
2818 |
-
$this->iCalUID = $iCalUID;
|
2819 |
-
}
|
2820 |
-
public function getICalUID()
|
2821 |
-
{
|
2822 |
-
return $this->iCalUID;
|
2823 |
-
}
|
2824 |
-
public function setId($id)
|
2825 |
-
{
|
2826 |
-
$this->id = $id;
|
2827 |
-
}
|
2828 |
-
public function getId()
|
2829 |
-
{
|
2830 |
-
return $this->id;
|
2831 |
-
}
|
2832 |
-
public function setKind($kind)
|
2833 |
-
{
|
2834 |
-
$this->kind = $kind;
|
2835 |
-
}
|
2836 |
-
public function getKind()
|
2837 |
-
{
|
2838 |
-
return $this->kind;
|
2839 |
-
}
|
2840 |
-
public function setLocation($location)
|
2841 |
-
{
|
2842 |
-
$this->location = $location;
|
2843 |
-
}
|
2844 |
-
public function getLocation()
|
2845 |
-
{
|
2846 |
-
return $this->location;
|
2847 |
-
}
|
2848 |
-
public function setLocked($locked)
|
2849 |
-
{
|
2850 |
-
$this->locked = $locked;
|
2851 |
-
}
|
2852 |
-
public function getLocked()
|
2853 |
-
{
|
2854 |
-
return $this->locked;
|
2855 |
-
}
|
2856 |
-
public function setOrganizer(Google_Service_Calendar_EventOrganizer $organizer)
|
2857 |
-
{
|
2858 |
-
$this->organizer = $organizer;
|
2859 |
-
}
|
2860 |
-
public function getOrganizer()
|
2861 |
-
{
|
2862 |
-
return $this->organizer;
|
2863 |
-
}
|
2864 |
-
public function setOriginalStartTime(Google_Service_Calendar_EventDateTime $originalStartTime)
|
2865 |
-
{
|
2866 |
-
$this->originalStartTime = $originalStartTime;
|
2867 |
-
}
|
2868 |
-
public function getOriginalStartTime()
|
2869 |
-
{
|
2870 |
-
return $this->originalStartTime;
|
2871 |
-
}
|
2872 |
-
public function setPrivateCopy($privateCopy)
|
2873 |
-
{
|
2874 |
-
$this->privateCopy = $privateCopy;
|
2875 |
-
}
|
2876 |
-
public function getPrivateCopy()
|
2877 |
-
{
|
2878 |
-
return $this->privateCopy;
|
2879 |
-
}
|
2880 |
-
public function setRecurrence($recurrence)
|
2881 |
-
{
|
2882 |
-
$this->recurrence = $recurrence;
|
2883 |
-
}
|
2884 |
-
public function getRecurrence()
|
2885 |
-
{
|
2886 |
-
return $this->recurrence;
|
2887 |
-
}
|
2888 |
-
public function setRecurringEventId($recurringEventId)
|
2889 |
-
{
|
2890 |
-
$this->recurringEventId = $recurringEventId;
|
2891 |
-
}
|
2892 |
-
public function getRecurringEventId()
|
2893 |
-
{
|
2894 |
-
return $this->recurringEventId;
|
2895 |
-
}
|
2896 |
-
public function setReminders(Google_Service_Calendar_EventReminders $reminders)
|
2897 |
-
{
|
2898 |
-
$this->reminders = $reminders;
|
2899 |
-
}
|
2900 |
-
public function getReminders()
|
2901 |
-
{
|
2902 |
-
return $this->reminders;
|
2903 |
-
}
|
2904 |
-
public function setSequence($sequence)
|
2905 |
-
{
|
2906 |
-
$this->sequence = $sequence;
|
2907 |
-
}
|
2908 |
-
public function getSequence()
|
2909 |
-
{
|
2910 |
-
return $this->sequence;
|
2911 |
-
}
|
2912 |
-
public function setSource(Google_Service_Calendar_EventSource $source)
|
2913 |
-
{
|
2914 |
-
$this->source = $source;
|
2915 |
-
}
|
2916 |
-
public function getSource()
|
2917 |
-
{
|
2918 |
-
return $this->source;
|
2919 |
-
}
|
2920 |
-
public function setStart(Google_Service_Calendar_EventDateTime $start)
|
2921 |
-
{
|
2922 |
-
$this->start = $start;
|
2923 |
-
}
|
2924 |
-
public function getStart()
|
2925 |
-
{
|
2926 |
-
return $this->start;
|
2927 |
-
}
|
2928 |
-
public function setStatus($status)
|
2929 |
-
{
|
2930 |
-
$this->status = $status;
|
2931 |
-
}
|
2932 |
-
public function getStatus()
|
2933 |
-
{
|
2934 |
-
return $this->status;
|
2935 |
-
}
|
2936 |
-
public function setSummary($summary)
|
2937 |
-
{
|
2938 |
-
$this->summary = $summary;
|
2939 |
-
}
|
2940 |
-
public function getSummary()
|
2941 |
-
{
|
2942 |
-
return $this->summary;
|
2943 |
-
}
|
2944 |
-
public function setTransparency($transparency)
|
2945 |
-
{
|
2946 |
-
$this->transparency = $transparency;
|
2947 |
-
}
|
2948 |
-
public function getTransparency()
|
2949 |
-
{
|
2950 |
-
return $this->transparency;
|
2951 |
-
}
|
2952 |
-
public function setUpdated($updated)
|
2953 |
-
{
|
2954 |
-
$this->updated = $updated;
|
2955 |
-
}
|
2956 |
-
public function getUpdated()
|
2957 |
-
{
|
2958 |
-
return $this->updated;
|
2959 |
-
}
|
2960 |
-
public function setVisibility($visibility)
|
2961 |
-
{
|
2962 |
-
$this->visibility = $visibility;
|
2963 |
-
}
|
2964 |
-
public function getVisibility()
|
2965 |
-
{
|
2966 |
-
return $this->visibility;
|
2967 |
-
}
|
2968 |
-
}
|
2969 |
-
|
2970 |
-
class Google_Service_Calendar_EventAttachment extends Google_Model
|
2971 |
-
{
|
2972 |
-
protected $internal_gapi_mappings = array(
|
2973 |
-
);
|
2974 |
-
public $fileId;
|
2975 |
-
public $fileUrl;
|
2976 |
-
public $iconLink;
|
2977 |
-
public $mimeType;
|
2978 |
-
public $title;
|
2979 |
-
|
2980 |
-
|
2981 |
-
public function setFileId($fileId)
|
2982 |
-
{
|
2983 |
-
$this->fileId = $fileId;
|
2984 |
-
}
|
2985 |
-
public function getFileId()
|
2986 |
-
{
|
2987 |
-
return $this->fileId;
|
2988 |
-
}
|
2989 |
-
public function setFileUrl($fileUrl)
|
2990 |
-
{
|
2991 |
-
$this->fileUrl = $fileUrl;
|
2992 |
-
}
|
2993 |
-
public function getFileUrl()
|
2994 |
-
{
|
2995 |
-
return $this->fileUrl;
|
2996 |
-
}
|
2997 |
-
public function setIconLink($iconLink)
|
2998 |
-
{
|
2999 |
-
$this->iconLink = $iconLink;
|
3000 |
-
}
|
3001 |
-
public function getIconLink()
|
3002 |
-
{
|
3003 |
-
return $this->iconLink;
|
3004 |
-
}
|
3005 |
-
public function setMimeType($mimeType)
|
3006 |
-
{
|
3007 |
-
$this->mimeType = $mimeType;
|
3008 |
-
}
|
3009 |
-
public function getMimeType()
|
3010 |
-
{
|
3011 |
-
return $this->mimeType;
|
3012 |
-
}
|
3013 |
-
public function setTitle($title)
|
3014 |
-
{
|
3015 |
-
$this->title = $title;
|
3016 |
-
}
|
3017 |
-
public function getTitle()
|
3018 |
-
{
|
3019 |
-
return $this->title;
|
3020 |
-
}
|
3021 |
-
}
|
3022 |
-
|
3023 |
-
class Google_Service_Calendar_EventAttendee extends Google_Model
|
3024 |
-
{
|
3025 |
-
protected $internal_gapi_mappings = array(
|
3026 |
-
);
|
3027 |
-
public $additionalGuests;
|
3028 |
-
public $comment;
|
3029 |
-
public $displayName;
|
3030 |
-
public $email;
|
3031 |
-
public $id;
|
3032 |
-
public $optional;
|
3033 |
-
public $organizer;
|
3034 |
-
public $resource;
|
3035 |
-
public $responseStatus;
|
3036 |
-
public $self;
|
3037 |
-
|
3038 |
-
|
3039 |
-
public function setAdditionalGuests($additionalGuests)
|
3040 |
-
{
|
3041 |
-
$this->additionalGuests = $additionalGuests;
|
3042 |
-
}
|
3043 |
-
public function getAdditionalGuests()
|
3044 |
-
{
|
3045 |
-
return $this->additionalGuests;
|
3046 |
-
}
|
3047 |
-
public function setComment($comment)
|
3048 |
-
{
|
3049 |
-
$this->comment = $comment;
|
3050 |
-
}
|
3051 |
-
public function getComment()
|
3052 |
-
{
|
3053 |
-
return $this->comment;
|
3054 |
-
}
|
3055 |
-
public function setDisplayName($displayName)
|
3056 |
-
{
|
3057 |
-
$this->displayName = $displayName;
|
3058 |
-
}
|
3059 |
-
public function getDisplayName()
|
3060 |
-
{
|
3061 |
-
return $this->displayName;
|
3062 |
-
}
|
3063 |
-
public function setEmail($email)
|
3064 |
-
{
|
3065 |
-
$this->email = $email;
|
3066 |
-
}
|
3067 |
-
public function getEmail()
|
3068 |
-
{
|
3069 |
-
return $this->email;
|
3070 |
-
}
|
3071 |
-
public function setId($id)
|
3072 |
-
{
|
3073 |
-
$this->id = $id;
|
3074 |
-
}
|
3075 |
-
public function getId()
|
3076 |
-
{
|
3077 |
-
return $this->id;
|
3078 |
-
}
|
3079 |
-
public function setOptional($optional)
|
3080 |
-
{
|
3081 |
-
$this->optional = $optional;
|
3082 |
-
}
|
3083 |
-
public function getOptional()
|
3084 |
-
{
|
3085 |
-
return $this->optional;
|
3086 |
-
}
|
3087 |
-
public function setOrganizer($organizer)
|
3088 |
-
{
|
3089 |
-
$this->organizer = $organizer;
|
3090 |
-
}
|
3091 |
-
public function getOrganizer()
|
3092 |
-
{
|
3093 |
-
return $this->organizer;
|
3094 |
-
}
|
3095 |
-
public function setResource($resource)
|
3096 |
-
{
|
3097 |
-
$this->resource = $resource;
|
3098 |
-
}
|
3099 |
-
public function getResource()
|
3100 |
-
{
|
3101 |
-
return $this->resource;
|
3102 |
-
}
|
3103 |
-
public function setResponseStatus($responseStatus)
|
3104 |
-
{
|
3105 |
-
$this->responseStatus = $responseStatus;
|
3106 |
-
}
|
3107 |
-
public function getResponseStatus()
|
3108 |
-
{
|
3109 |
-
return $this->responseStatus;
|
3110 |
-
}
|
3111 |
-
public function setSelf($self)
|
3112 |
-
{
|
3113 |
-
$this->self = $self;
|
3114 |
-
}
|
3115 |
-
public function getSelf()
|
3116 |
-
{
|
3117 |
-
return $this->self;
|
3118 |
-
}
|
3119 |
-
}
|
3120 |
-
|
3121 |
-
class Google_Service_Calendar_EventCreator extends Google_Model
|
3122 |
-
{
|
3123 |
-
protected $internal_gapi_mappings = array(
|
3124 |
-
);
|
3125 |
-
public $displayName;
|
3126 |
-
public $email;
|
3127 |
-
public $id;
|
3128 |
-
public $self;
|
3129 |
-
|
3130 |
-
|
3131 |
-
public function setDisplayName($displayName)
|
3132 |
-
{
|
3133 |
-
$this->displayName = $displayName;
|
3134 |
-
}
|
3135 |
-
public function getDisplayName()
|
3136 |
-
{
|
3137 |
-
return $this->displayName;
|
3138 |
-
}
|
3139 |
-
public function setEmail($email)
|
3140 |
-
{
|
3141 |
-
$this->email = $email;
|
3142 |
-
}
|
3143 |
-
public function getEmail()
|
3144 |
-
{
|
3145 |
-
return $this->email;
|
3146 |
-
}
|
3147 |
-
public function setId($id)
|
3148 |
-
{
|
3149 |
-
$this->id = $id;
|
3150 |
-
}
|
3151 |
-
public function getId()
|
3152 |
-
{
|
3153 |
-
return $this->id;
|
3154 |
-
}
|
3155 |
-
public function setSelf($self)
|
3156 |
-
{
|
3157 |
-
$this->self = $self;
|
3158 |
-
}
|
3159 |
-
public function getSelf()
|
3160 |
-
{
|
3161 |
-
return $this->self;
|
3162 |
-
}
|
3163 |
-
}
|
3164 |
-
|
3165 |
-
class Google_Service_Calendar_EventDateTime extends Google_Model
|
3166 |
-
{
|
3167 |
-
protected $internal_gapi_mappings = array(
|
3168 |
-
);
|
3169 |
-
public $date;
|
3170 |
-
public $dateTime;
|
3171 |
-
public $timeZone;
|
3172 |
-
|
3173 |
-
|
3174 |
-
public function setDate($date)
|
3175 |
-
{
|
3176 |
-
$this->date = $date;
|
3177 |
-
}
|
3178 |
-
public function getDate()
|
3179 |
-
{
|
3180 |
-
return $this->date;
|
3181 |
-
}
|
3182 |
-
public function setDateTime($dateTime)
|
3183 |
-
{
|
3184 |
-
$this->dateTime = $dateTime;
|
3185 |
-
}
|
3186 |
-
public function getDateTime()
|
3187 |
-
{
|
3188 |
-
return $this->dateTime;
|
3189 |
-
}
|
3190 |
-
public function setTimeZone($timeZone)
|
3191 |
-
{
|
3192 |
-
$this->timeZone = $timeZone;
|
3193 |
-
}
|
3194 |
-
public function getTimeZone()
|
3195 |
-
{
|
3196 |
-
return $this->timeZone;
|
3197 |
-
}
|
3198 |
-
}
|
3199 |
-
|
3200 |
-
class Google_Service_Calendar_EventExtendedProperties extends Google_Model
|
3201 |
-
{
|
3202 |
-
protected $internal_gapi_mappings = array(
|
3203 |
-
);
|
3204 |
-
public $private;
|
3205 |
-
public $shared;
|
3206 |
-
|
3207 |
-
|
3208 |
-
public function setPrivate($private)
|
3209 |
-
{
|
3210 |
-
$this->private = $private;
|
3211 |
-
}
|
3212 |
-
public function getPrivate()
|
3213 |
-
{
|
3214 |
-
return $this->private;
|
3215 |
-
}
|
3216 |
-
public function setShared($shared)
|
3217 |
-
{
|
3218 |
-
$this->shared = $shared;
|
3219 |
-
}
|
3220 |
-
public function getShared()
|
3221 |
-
{
|
3222 |
-
return $this->shared;
|
3223 |
-
}
|
3224 |
-
}
|
3225 |
-
|
3226 |
-
class Google_Service_Calendar_EventGadget extends Google_Model
|
3227 |
-
{
|
3228 |
-
protected $internal_gapi_mappings = array(
|
3229 |
-
);
|
3230 |
-
public $display;
|
3231 |
-
public $height;
|
3232 |
-
public $iconLink;
|
3233 |
-
public $link;
|
3234 |
-
public $preferences;
|
3235 |
-
public $title;
|
3236 |
-
public $type;
|
3237 |
-
public $width;
|
3238 |
-
|
3239 |
-
|
3240 |
-
public function setDisplay($display)
|
3241 |
-
{
|
3242 |
-
$this->display = $display;
|
3243 |
-
}
|
3244 |
-
public function getDisplay()
|
3245 |
-
{
|
3246 |
-
return $this->display;
|
3247 |
-
}
|
3248 |
-
public function setHeight($height)
|
3249 |
-
{
|
3250 |
-
$this->height = $height;
|
3251 |
-
}
|
3252 |
-
public function getHeight()
|
3253 |
-
{
|
3254 |
-
return $this->height;
|
3255 |
-
}
|
3256 |
-
public function setIconLink($iconLink)
|
3257 |
-
{
|
3258 |
-
$this->iconLink = $iconLink;
|
3259 |
-
}
|
3260 |
-
public function getIconLink()
|
3261 |
-
{
|
3262 |
-
return $this->iconLink;
|
3263 |
-
}
|
3264 |
-
public function setLink($link)
|
3265 |
-
{
|
3266 |
-
$this->link = $link;
|
3267 |
-
}
|
3268 |
-
public function getLink()
|
3269 |
-
{
|
3270 |
-
return $this->link;
|
3271 |
-
}
|
3272 |
-
public function setPreferences($preferences)
|
3273 |
-
{
|
3274 |
-
$this->preferences = $preferences;
|
3275 |
-
}
|
3276 |
-
public function getPreferences()
|
3277 |
-
{
|
3278 |
-
return $this->preferences;
|
3279 |
-
}
|
3280 |
-
public function setTitle($title)
|
3281 |
-
{
|
3282 |
-
$this->title = $title;
|
3283 |
-
}
|
3284 |
-
public function getTitle()
|
3285 |
-
{
|
3286 |
-
return $this->title;
|
3287 |
-
}
|
3288 |
-
public function setType($type)
|
3289 |
-
{
|
3290 |
-
$this->type = $type;
|
3291 |
-
}
|
3292 |
-
public function getType()
|
3293 |
-
{
|
3294 |
-
return $this->type;
|
3295 |
-
}
|
3296 |
-
public function setWidth($width)
|
3297 |
-
{
|
3298 |
-
$this->width = $width;
|
3299 |
-
}
|
3300 |
-
public function getWidth()
|
3301 |
-
{
|
3302 |
-
return $this->width;
|
3303 |
-
}
|
3304 |
-
}
|
3305 |
-
|
3306 |
-
class Google_Service_Calendar_EventOrganizer extends Google_Model
|
3307 |
-
{
|
3308 |
-
protected $internal_gapi_mappings = array(
|
3309 |
-
);
|
3310 |
-
public $displayName;
|
3311 |
-
public $email;
|
3312 |
-
public $id;
|
3313 |
-
public $self;
|
3314 |
-
|
3315 |
-
|
3316 |
-
public function setDisplayName($displayName)
|
3317 |
-
{
|
3318 |
-
$this->displayName = $displayName;
|
3319 |
-
}
|
3320 |
-
public function getDisplayName()
|
3321 |
-
{
|
3322 |
-
return $this->displayName;
|
3323 |
-
}
|
3324 |
-
public function setEmail($email)
|
3325 |
-
{
|
3326 |
-
$this->email = $email;
|
3327 |
-
}
|
3328 |
-
public function getEmail()
|
3329 |
-
{
|
3330 |
-
return $this->email;
|
3331 |
-
}
|
3332 |
-
public function setId($id)
|
3333 |
-
{
|
3334 |
-
$this->id = $id;
|
3335 |
-
}
|
3336 |
-
public function getId()
|
3337 |
-
{
|
3338 |
-
return $this->id;
|
3339 |
-
}
|
3340 |
-
public function setSelf($self)
|
3341 |
-
{
|
3342 |
-
$this->self = $self;
|
3343 |
-
}
|
3344 |
-
public function getSelf()
|
3345 |
-
{
|
3346 |
-
return $this->self;
|
3347 |
-
}
|
3348 |
-
}
|
3349 |
-
|
3350 |
-
class Google_Service_Calendar_EventReminder extends Google_Model
|
3351 |
-
{
|
3352 |
-
protected $internal_gapi_mappings = array(
|
3353 |
-
);
|
3354 |
-
public $method;
|
3355 |
-
public $minutes;
|
3356 |
-
|
3357 |
-
|
3358 |
-
public function setMethod($method)
|
3359 |
-
{
|
3360 |
-
$this->method = $method;
|
3361 |
-
}
|
3362 |
-
public function getMethod()
|
3363 |
-
{
|
3364 |
-
return $this->method;
|
3365 |
-
}
|
3366 |
-
public function setMinutes($minutes)
|
3367 |
-
{
|
3368 |
-
$this->minutes = $minutes;
|
3369 |
-
}
|
3370 |
-
public function getMinutes()
|
3371 |
-
{
|
3372 |
-
return $this->minutes;
|
3373 |
-
}
|
3374 |
-
}
|
3375 |
-
|
3376 |
-
class Google_Service_Calendar_EventReminders extends Google_Collection
|
3377 |
-
{
|
3378 |
-
protected $collection_key = 'overrides';
|
3379 |
-
protected $internal_gapi_mappings = array(
|
3380 |
-
);
|
3381 |
-
protected $overridesType = 'Google_Service_Calendar_EventReminder';
|
3382 |
-
protected $overridesDataType = 'array';
|
3383 |
-
public $useDefault;
|
3384 |
-
|
3385 |
-
|
3386 |
-
public function setOverrides($overrides)
|
3387 |
-
{
|
3388 |
-
$this->overrides = $overrides;
|
3389 |
-
}
|
3390 |
-
public function getOverrides()
|
3391 |
-
{
|
3392 |
-
return $this->overrides;
|
3393 |
-
}
|
3394 |
-
public function setUseDefault($useDefault)
|
3395 |
-
{
|
3396 |
-
$this->useDefault = $useDefault;
|
3397 |
-
}
|
3398 |
-
public function getUseDefault()
|
3399 |
-
{
|
3400 |
-
return $this->useDefault;
|
3401 |
-
}
|
3402 |
-
}
|
3403 |
-
|
3404 |
-
class Google_Service_Calendar_EventSource extends Google_Model
|
3405 |
-
{
|
3406 |
-
protected $internal_gapi_mappings = array(
|
3407 |
-
);
|
3408 |
-
public $title;
|
3409 |
-
public $url;
|
3410 |
-
|
3411 |
-
|
3412 |
-
public function setTitle($title)
|
3413 |
-
{
|
3414 |
-
$this->title = $title;
|
3415 |
-
}
|
3416 |
-
public function getTitle()
|
3417 |
-
{
|
3418 |
-
return $this->title;
|
3419 |
-
}
|
3420 |
-
public function setUrl($url)
|
3421 |
-
{
|
3422 |
-
$this->url = $url;
|
3423 |
-
}
|
3424 |
-
public function getUrl()
|
3425 |
-
{
|
3426 |
-
return $this->url;
|
3427 |
-
}
|
3428 |
-
}
|
3429 |
-
|
3430 |
-
class Google_Service_Calendar_Events extends Google_Collection
|
3431 |
-
{
|
3432 |
-
protected $collection_key = 'items';
|
3433 |
-
protected $internal_gapi_mappings = array(
|
3434 |
-
);
|
3435 |
-
public $accessRole;
|
3436 |
-
protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
|
3437 |
-
protected $defaultRemindersDataType = 'array';
|
3438 |
-
public $description;
|
3439 |
-
public $etag;
|
3440 |
-
protected $itemsType = 'Google_Service_Calendar_Event';
|
3441 |
-
protected $itemsDataType = 'array';
|
3442 |
-
public $kind;
|
3443 |
-
public $nextPageToken;
|
3444 |
-
public $nextSyncToken;
|
3445 |
-
public $summary;
|
3446 |
-
public $timeZone;
|
3447 |
-
public $updated;
|
3448 |
-
|
3449 |
-
|
3450 |
-
public function setAccessRole($accessRole)
|
3451 |
-
{
|
3452 |
-
$this->accessRole = $accessRole;
|
3453 |
-
}
|
3454 |
-
public function getAccessRole()
|
3455 |
-
{
|
3456 |
-
return $this->accessRole;
|
3457 |
-
}
|
3458 |
-
public function setDefaultReminders($defaultReminders)
|
3459 |
-
{
|
3460 |
-
$this->defaultReminders = $defaultReminders;
|
3461 |
-
}
|
3462 |
-
public function getDefaultReminders()
|
3463 |
-
{
|
3464 |
-
return $this->defaultReminders;
|
3465 |
-
}
|
3466 |
-
public function setDescription($description)
|
3467 |
-
{
|
3468 |
-
$this->description = $description;
|
3469 |
-
}
|
3470 |
-
public function getDescription()
|
3471 |
-
{
|
3472 |
-
return $this->description;
|
3473 |
-
}
|
3474 |
-
public function setEtag($etag)
|
3475 |
-
{
|
3476 |
-
$this->etag = $etag;
|
3477 |
-
}
|
3478 |
-
public function getEtag()
|
3479 |
-
{
|
3480 |
-
return $this->etag;
|
3481 |
-
}
|
3482 |
-
public function setItems($items)
|
3483 |
-
{
|
3484 |
-
$this->items = $items;
|
3485 |
-
}
|
3486 |
-
public function getItems()
|
3487 |
-
{
|
3488 |
-
return $this->items;
|
3489 |
-
}
|
3490 |
-
public function setKind($kind)
|
3491 |
-
{
|
3492 |
-
$this->kind = $kind;
|
3493 |
-
}
|
3494 |
-
public function getKind()
|
3495 |
-
{
|
3496 |
-
return $this->kind;
|
3497 |
-
}
|
3498 |
-
public function setNextPageToken($nextPageToken)
|
3499 |
-
{
|
3500 |
-
$this->nextPageToken = $nextPageToken;
|
3501 |
-
}
|
3502 |
-
public function getNextPageToken()
|
3503 |
-
{
|
3504 |
-
return $this->nextPageToken;
|
3505 |
-
}
|
3506 |
-
public function setNextSyncToken($nextSyncToken)
|
3507 |
-
{
|
3508 |
-
$this->nextSyncToken = $nextSyncToken;
|
3509 |
-
}
|
3510 |
-
public function getNextSyncToken()
|
3511 |
-
{
|
3512 |
-
return $this->nextSyncToken;
|
3513 |
-
}
|
3514 |
-
public function setSummary($summary)
|
3515 |
-
{
|
3516 |
-
$this->summary = $summary;
|
3517 |
-
}
|
3518 |
-
public function getSummary()
|
3519 |
-
{
|
3520 |
-
return $this->summary;
|
3521 |
-
}
|
3522 |
-
public function setTimeZone($timeZone)
|
3523 |
-
{
|
3524 |
-
$this->timeZone = $timeZone;
|
3525 |
-
}
|
3526 |
-
public function getTimeZone()
|
3527 |
-
{
|
3528 |
-
return $this->timeZone;
|
3529 |
-
}
|
3530 |
-
public function setUpdated($updated)
|
3531 |
-
{
|
3532 |
-
$this->updated = $updated;
|
3533 |
-
}
|
3534 |
-
public function getUpdated()
|
3535 |
-
{
|
3536 |
-
return $this->updated;
|
3537 |
-
}
|
3538 |
-
}
|
3539 |
-
|
3540 |
-
class Google_Service_Calendar_FreeBusyCalendar extends Google_Collection
|
3541 |
-
{
|
3542 |
-
protected $collection_key = 'errors';
|
3543 |
-
protected $internal_gapi_mappings = array(
|
3544 |
-
);
|
3545 |
-
protected $busyType = 'Google_Service_Calendar_TimePeriod';
|
3546 |
-
protected $busyDataType = 'array';
|
3547 |
-
protected $errorsType = 'Google_Service_Calendar_Error';
|
3548 |
-
protected $errorsDataType = 'array';
|
3549 |
-
|
3550 |
-
|
3551 |
-
public function setBusy($busy)
|
3552 |
-
{
|
3553 |
-
$this->busy = $busy;
|
3554 |
-
}
|
3555 |
-
public function getBusy()
|
3556 |
-
{
|
3557 |
-
return $this->busy;
|
3558 |
-
}
|
3559 |
-
public function setErrors($errors)
|
3560 |
-
{
|
3561 |
-
$this->errors = $errors;
|
3562 |
-
}
|
3563 |
-
public function getErrors()
|
3564 |
-
{
|
3565 |
-
return $this->errors;
|
3566 |
-
}
|
3567 |
-
}
|
3568 |
-
|
3569 |
-
class Google_Service_Calendar_FreeBusyGroup extends Google_Collection
|
3570 |
-
{
|
3571 |
-
protected $collection_key = 'errors';
|
3572 |
-
protected $internal_gapi_mappings = array(
|
3573 |
-
);
|
3574 |
-
public $calendars;
|
3575 |
-
protected $errorsType = 'Google_Service_Calendar_Error';
|
3576 |
-
protected $errorsDataType = 'array';
|
3577 |
-
|
3578 |
-
|
3579 |
-
public function setCalendars($calendars)
|
3580 |
-
{
|
3581 |
-
$this->calendars = $calendars;
|
3582 |
-
}
|
3583 |
-
public function getCalendars()
|
3584 |
-
{
|
3585 |
-
return $this->calendars;
|
3586 |
-
}
|
3587 |
-
public function setErrors($errors)
|
3588 |
-
{
|
3589 |
-
$this->errors = $errors;
|
3590 |
-
}
|
3591 |
-
public function getErrors()
|
3592 |
-
{
|
3593 |
-
return $this->errors;
|
3594 |
-
}
|
3595 |
-
}
|
3596 |
-
|
3597 |
-
class Google_Service_Calendar_FreeBusyRequest extends Google_Collection
|
3598 |
-
{
|
3599 |
-
protected $collection_key = 'items';
|
3600 |
-
protected $internal_gapi_mappings = array(
|
3601 |
-
);
|
3602 |
-
public $calendarExpansionMax;
|
3603 |
-
public $groupExpansionMax;
|
3604 |
-
protected $itemsType = 'Google_Service_Calendar_FreeBusyRequestItem';
|
3605 |
-
protected $itemsDataType = 'array';
|
3606 |
-
public $timeMax;
|
3607 |
-
public $timeMin;
|
3608 |
-
public $timeZone;
|
3609 |
-
|
3610 |
-
|
3611 |
-
public function setCalendarExpansionMax($calendarExpansionMax)
|
3612 |
-
{
|
3613 |
-
$this->calendarExpansionMax = $calendarExpansionMax;
|
3614 |
-
}
|
3615 |
-
public function getCalendarExpansionMax()
|
3616 |
-
{
|
3617 |
-
return $this->calendarExpansionMax;
|
3618 |
-
}
|
3619 |
-
public function setGroupExpansionMax($groupExpansionMax)
|
3620 |
-
{
|
3621 |
-
$this->groupExpansionMax = $groupExpansionMax;
|
3622 |
-
}
|
3623 |
-
public function getGroupExpansionMax()
|
3624 |
-
{
|
3625 |
-
return $this->groupExpansionMax;
|
3626 |
-
}
|
3627 |
-
public function setItems($items)
|
3628 |
-
{
|
3629 |
-
$this->items = $items;
|
3630 |
-
}
|
3631 |
-
public function getItems()
|
3632 |
-
{
|
3633 |
-
return $this->items;
|
3634 |
-
}
|
3635 |
-
public function setTimeMax($timeMax)
|
3636 |
-
{
|
3637 |
-
$this->timeMax = $timeMax;
|
3638 |
-
}
|
3639 |
-
public function getTimeMax()
|
3640 |
-
{
|
3641 |
-
return $this->timeMax;
|
3642 |
-
}
|
3643 |
-
public function setTimeMin($timeMin)
|
3644 |
-
{
|
3645 |
-
$this->timeMin = $timeMin;
|
3646 |
-
}
|
3647 |
-
public function getTimeMin()
|
3648 |
-
{
|
3649 |
-
return $this->timeMin;
|
3650 |
-
}
|
3651 |
-
public function setTimeZone($timeZone)
|
3652 |
-
{
|
3653 |
-
$this->timeZone = $timeZone;
|
3654 |
-
}
|
3655 |
-
public function getTimeZone()
|
3656 |
-
{
|
3657 |
-
return $this->timeZone;
|
3658 |
-
}
|
3659 |
-
}
|
3660 |
-
|
3661 |
-
class Google_Service_Calendar_FreeBusyRequestItem extends Google_Model
|
3662 |
-
{
|
3663 |
-
protected $internal_gapi_mappings = array(
|
3664 |
-
);
|
3665 |
-
public $id;
|
3666 |
-
|
3667 |
-
|
3668 |
-
public function setId($id)
|
3669 |
-
{
|
3670 |
-
$this->id = $id;
|
3671 |
-
}
|
3672 |
-
public function getId()
|
3673 |
-
{
|
3674 |
-
return $this->id;
|
3675 |
-
}
|
3676 |
-
}
|
3677 |
-
|
3678 |
-
class Google_Service_Calendar_FreeBusyResponse extends Google_Model
|
3679 |
-
{
|
3680 |
-
protected $internal_gapi_mappings = array(
|
3681 |
-
);
|
3682 |
-
protected $calendarsType = 'Google_Service_Calendar_FreeBusyCalendar';
|
3683 |
-
protected $calendarsDataType = 'map';
|
3684 |
-
protected $groupsType = 'Google_Service_Calendar_FreeBusyGroup';
|
3685 |
-
protected $groupsDataType = 'map';
|
3686 |
-
public $kind;
|
3687 |
-
public $timeMax;
|
3688 |
-
public $timeMin;
|
3689 |
-
|
3690 |
-
|
3691 |
-
public function setCalendars($calendars)
|
3692 |
-
{
|
3693 |
-
$this->calendars = $calendars;
|
3694 |
-
}
|
3695 |
-
public function getCalendars()
|
3696 |
-
{
|
3697 |
-
return $this->calendars;
|
3698 |
-
}
|
3699 |
-
public function setGroups($groups)
|
3700 |
-
{
|
3701 |
-
$this->groups = $groups;
|
3702 |
-
}
|
3703 |
-
public function getGroups()
|
3704 |
-
{
|
3705 |
-
return $this->groups;
|
3706 |
-
}
|
3707 |
-
public function setKind($kind)
|
3708 |
-
{
|
3709 |
-
$this->kind = $kind;
|
3710 |
-
}
|
3711 |
-
public function getKind()
|
3712 |
-
{
|
3713 |
-
return $this->kind;
|
3714 |
-
}
|
3715 |
-
public function setTimeMax($timeMax)
|
3716 |
-
{
|
3717 |
-
$this->timeMax = $timeMax;
|
3718 |
-
}
|
3719 |
-
public function getTimeMax()
|
3720 |
-
{
|
3721 |
-
return $this->timeMax;
|
3722 |
-
}
|
3723 |
-
public function setTimeMin($timeMin)
|
3724 |
-
{
|
3725 |
-
$this->timeMin = $timeMin;
|
3726 |
-
}
|
3727 |
-
public function getTimeMin()
|
3728 |
-
{
|
3729 |
-
return $this->timeMin;
|
3730 |
-
}
|
3731 |
-
}
|
3732 |
-
|
3733 |
-
class Google_Service_Calendar_Setting extends Google_Model
|
3734 |
-
{
|
3735 |
-
protected $internal_gapi_mappings = array(
|
3736 |
-
);
|
3737 |
-
public $etag;
|
3738 |
-
public $id;
|
3739 |
-
public $kind;
|
3740 |
-
public $value;
|
3741 |
-
|
3742 |
-
|
3743 |
-
public function setEtag($etag)
|
3744 |
-
{
|
3745 |
-
$this->etag = $etag;
|
3746 |
-
}
|
3747 |
-
public function getEtag()
|
3748 |
-
{
|
3749 |
-
return $this->etag;
|
3750 |
-
}
|
3751 |
-
public function setId($id)
|
3752 |
-
{
|
3753 |
-
$this->id = $id;
|
3754 |
-
}
|
3755 |
-
public function getId()
|
3756 |
-
{
|
3757 |
-
return $this->id;
|
3758 |
-
}
|
3759 |
-
public function setKind($kind)
|
3760 |
-
{
|
3761 |
-
$this->kind = $kind;
|
3762 |
-
}
|
3763 |
-
public function getKind()
|
3764 |
-
{
|
3765 |
-
return $this->kind;
|
3766 |
-
}
|
3767 |
-
public function setValue($value)
|
3768 |
-
{
|
3769 |
-
$this->value = $value;
|
3770 |
-
}
|
3771 |
-
public function getValue()
|
3772 |
-
{
|
3773 |
-
return $this->value;
|
3774 |
-
}
|
3775 |
-
}
|
3776 |
-
|
3777 |
-
class Google_Service_Calendar_Settings extends Google_Collection
|
3778 |
-
{
|
3779 |
-
protected $collection_key = 'items';
|
3780 |
-
protected $internal_gapi_mappings = array(
|
3781 |
-
);
|
3782 |
-
public $etag;
|
3783 |
-
protected $itemsType = 'Google_Service_Calendar_Setting';
|
3784 |
-
protected $itemsDataType = 'array';
|
3785 |
-
public $kind;
|
3786 |
-
public $nextPageToken;
|
3787 |
-
public $nextSyncToken;
|
3788 |
-
|
3789 |
-
|
3790 |
-
public function setEtag($etag)
|
3791 |
-
{
|
3792 |
-
$this->etag = $etag;
|
3793 |
-
}
|
3794 |
-
public function getEtag()
|
3795 |
-
{
|
3796 |
-
return $this->etag;
|
3797 |
-
}
|
3798 |
-
public function setItems($items)
|
3799 |
-
{
|
3800 |
-
$this->items = $items;
|
3801 |
-
}
|
3802 |
-
public function getItems()
|
3803 |
-
{
|
3804 |
-
return $this->items;
|
3805 |
-
}
|
3806 |
-
public function setKind($kind)
|
3807 |
-
{
|
3808 |
-
$this->kind = $kind;
|
3809 |
-
}
|
3810 |
-
public function getKind()
|
3811 |
-
{
|
3812 |
-
return $this->kind;
|
3813 |
-
}
|
3814 |
-
public function setNextPageToken($nextPageToken)
|
3815 |
-
{
|
3816 |
-
$this->nextPageToken = $nextPageToken;
|
3817 |
-
}
|
3818 |
-
public function getNextPageToken()
|
3819 |
-
{
|
3820 |
-
return $this->nextPageToken;
|
3821 |
-
}
|
3822 |
-
public function setNextSyncToken($nextSyncToken)
|
3823 |
-
{
|
3824 |
-
$this->nextSyncToken = $nextSyncToken;
|
3825 |
-
}
|
3826 |
-
public function getNextSyncToken()
|
3827 |
-
{
|
3828 |
-
return $this->nextSyncToken;
|
3829 |
-
}
|
3830 |
-
}
|
3831 |
-
|
3832 |
-
class Google_Service_Calendar_TimePeriod extends Google_Model
|
3833 |
-
{
|
3834 |
-
protected $internal_gapi_mappings = array(
|
3835 |
-
);
|
3836 |
-
public $end;
|
3837 |
-
public $start;
|
3838 |
-
|
3839 |
-
|
3840 |
-
public function setEnd($end)
|
3841 |
-
{
|
3842 |
-
$this->end = $end;
|
3843 |
-
}
|
3844 |
-
public function getEnd()
|
3845 |
-
{
|
3846 |
-
return $this->end;
|
3847 |
-
}
|
3848 |
-
public function setStart($start)
|
3849 |
-
{
|
3850 |
-
$this->start = $start;
|
3851 |
-
}
|
3852 |
-
public function getStart()
|
3853 |
-
{
|
3854 |
-
return $this->start;
|
3855 |
-
}
|
3856 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
4 |
+
* use this file except in compliance with the License. You may obtain a copy of
|
5 |
+
* the License at
|
6 |
+
*
|
7 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
8 |
+
*
|
9 |
+
* Unless required by applicable law or agreed to in writing, software
|
10 |
+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11 |
+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12 |
+
* License for the specific language governing permissions and limitations under
|
13 |
+
* the License.
|
14 |
+
*/
|
15 |
+
|
16 |
+
/**
|
17 |
+
* Service definition for Calendar (v3).
|
18 |
+
*
|
19 |
+
* <p>
|
20 |
+
* Lets you manipulate events and other calendar data.</p>
|
21 |
+
*
|
22 |
+
* <p>
|
23 |
+
* For more information about this service, see the API
|
24 |
+
* <a href="https://developers.google.com/google-apps/calendar/firstapp" target="_blank">Documentation</a>
|
25 |
+
* </p>
|
26 |
+
*
|
27 |
+
* @author Google, Inc.
|
28 |
+
*/
|
29 |
+
class Google_Service_Calendar extends Google_Service
|
30 |
+
{
|
31 |
+
/** Manage your calendars. */
|
32 |
+
const CALENDAR =
|
33 |
+
"https://www.googleapis.com/auth/calendar";
|
34 |
+
/** View your calendars. */
|
35 |
+
const CALENDAR_READONLY =
|
36 |
+
"https://www.googleapis.com/auth/calendar.readonly";
|
37 |
+
|
38 |
+
public $acl;
|
39 |
+
public $calendarList;
|
40 |
+
public $calendars;
|
41 |
+
public $channels;
|
42 |
+
public $colors;
|
43 |
+
public $events;
|
44 |
+
public $freebusy;
|
45 |
+
public $settings;
|
46 |
+
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Constructs the internal representation of the Calendar service.
|
50 |
+
*
|
51 |
+
* @param Google_Client $client
|
52 |
+
*/
|
53 |
+
public function __construct(Google_Client $client)
|
54 |
+
{
|
55 |
+
parent::__construct($client);
|
56 |
+
$this->rootUrl = 'https://www.googleapis.com/';
|
57 |
+
$this->servicePath = 'calendar/v3/';
|
58 |
+
$this->version = 'v3';
|
59 |
+
$this->serviceName = 'calendar';
|
60 |
+
|
61 |
+
$this->acl = new Google_Service_Calendar_Acl_Resource(
|
62 |
+
$this,
|
63 |
+
$this->serviceName,
|
64 |
+
'acl',
|
65 |
+
array(
|
66 |
+
'methods' => array(
|
67 |
+
'delete' => array(
|
68 |
+
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
69 |
+
'httpMethod' => 'DELETE',
|
70 |
+
'parameters' => array(
|
71 |
+
'calendarId' => array(
|
72 |
+
'location' => 'path',
|
73 |
+
'type' => 'string',
|
74 |
+
'required' => true,
|
75 |
+
),
|
76 |
+
'ruleId' => array(
|
77 |
+
'location' => 'path',
|
78 |
+
'type' => 'string',
|
79 |
+
'required' => true,
|
80 |
+
),
|
81 |
+
),
|
82 |
+
),'get' => array(
|
83 |
+
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
84 |
+
'httpMethod' => 'GET',
|
85 |
+
'parameters' => array(
|
86 |
+
'calendarId' => array(
|
87 |
+
'location' => 'path',
|
88 |
+
'type' => 'string',
|
89 |
+
'required' => true,
|
90 |
+
),
|
91 |
+
'ruleId' => array(
|
92 |
+
'location' => 'path',
|
93 |
+
'type' => 'string',
|
94 |
+
'required' => true,
|
95 |
+
),
|
96 |
+
),
|
97 |
+
),'insert' => array(
|
98 |
+
'path' => 'calendars/{calendarId}/acl',
|
99 |
+
'httpMethod' => 'POST',
|
100 |
+
'parameters' => array(
|
101 |
+
'calendarId' => array(
|
102 |
+
'location' => 'path',
|
103 |
+
'type' => 'string',
|
104 |
+
'required' => true,
|
105 |
+
),
|
106 |
+
),
|
107 |
+
),'list' => array(
|
108 |
+
'path' => 'calendars/{calendarId}/acl',
|
109 |
+
'httpMethod' => 'GET',
|
110 |
+
'parameters' => array(
|
111 |
+
'calendarId' => array(
|
112 |
+
'location' => 'path',
|
113 |
+
'type' => 'string',
|
114 |
+
'required' => true,
|
115 |
+
),
|
116 |
+
'maxResults' => array(
|
117 |
+
'location' => 'query',
|
118 |
+
'type' => 'integer',
|
119 |
+
),
|
120 |
+
'pageToken' => array(
|
121 |
+
'location' => 'query',
|
122 |
+
'type' => 'string',
|
123 |
+
),
|
124 |
+
'showDeleted' => array(
|
125 |
+
'location' => 'query',
|
126 |
+
'type' => 'boolean',
|
127 |
+
),
|
128 |
+
'syncToken' => array(
|
129 |
+
'location' => 'query',
|
130 |
+
'type' => 'string',
|
131 |
+
),
|
132 |
+
),
|
133 |
+
),'patch' => array(
|
134 |
+
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
135 |
+
'httpMethod' => 'PATCH',
|
136 |
+
'parameters' => array(
|
137 |
+
'calendarId' => array(
|
138 |
+
'location' => 'path',
|
139 |
+
'type' => 'string',
|
140 |
+
'required' => true,
|
141 |
+
),
|
142 |
+
'ruleId' => array(
|
143 |
+
'location' => 'path',
|
144 |
+
'type' => 'string',
|
145 |
+
'required' => true,
|
146 |
+
),
|
147 |
+
),
|
148 |
+
),'update' => array(
|
149 |
+
'path' => 'calendars/{calendarId}/acl/{ruleId}',
|
150 |
+
'httpMethod' => 'PUT',
|
151 |
+
'parameters' => array(
|
152 |
+
'calendarId' => array(
|
153 |
+
'location' => 'path',
|
154 |
+
'type' => 'string',
|
155 |
+
'required' => true,
|
156 |
+
),
|
157 |
+
'ruleId' => array(
|
158 |
+
'location' => 'path',
|
159 |
+
'type' => 'string',
|
160 |
+
'required' => true,
|
161 |
+
),
|
162 |
+
),
|
163 |
+
),'watch' => array(
|
164 |
+
'path' => 'calendars/{calendarId}/acl/watch',
|
165 |
+
'httpMethod' => 'POST',
|
166 |
+
'parameters' => array(
|
167 |
+
'calendarId' => array(
|
168 |
+
'location' => 'path',
|
169 |
+
'type' => 'string',
|
170 |
+
'required' => true,
|
171 |
+
),
|
172 |
+
'maxResults' => array(
|
173 |
+
'location' => 'query',
|
174 |
+
'type' => 'integer',
|
175 |
+
),
|
176 |
+
'pageToken' => array(
|
177 |
+
'location' => 'query',
|
178 |
+
'type' => 'string',
|
179 |
+
),
|
180 |
+
'showDeleted' => array(
|
181 |
+
'location' => 'query',
|
182 |
+
'type' => 'boolean',
|
183 |
+
),
|
184 |
+
'syncToken' => array(
|
185 |
+
'location' => 'query',
|
186 |
+
'type' => 'string',
|
187 |
+
),
|
188 |
+
),
|
189 |
+
),
|
190 |
+
)
|
191 |
+
)
|
192 |
+
);
|
193 |
+
$this->calendarList = new Google_Service_Calendar_CalendarList_Resource(
|
194 |
+
$this,
|
195 |
+
$this->serviceName,
|
196 |
+
'calendarList',
|
197 |
+
array(
|
198 |
+
'methods' => array(
|
199 |
+
'delete' => array(
|
200 |
+
'path' => 'users/me/calendarList/{calendarId}',
|
201 |
+
'httpMethod' => 'DELETE',
|
202 |
+
'parameters' => array(
|
203 |
+
'calendarId' => array(
|
204 |
+
'location' => 'path',
|
205 |
+
'type' => 'string',
|
206 |
+
'required' => true,
|
207 |
+
),
|
208 |
+
),
|
209 |
+
),'get' => array(
|
210 |
+
'path' => 'users/me/calendarList/{calendarId}',
|
211 |
+
'httpMethod' => 'GET',
|
212 |
+
'parameters' => array(
|
213 |
+
'calendarId' => array(
|
214 |
+
'location' => 'path',
|
215 |
+
'type' => 'string',
|
216 |
+
'required' => true,
|
217 |
+
),
|
218 |
+
),
|
219 |
+
),'insert' => array(
|
220 |
+
'path' => 'users/me/calendarList',
|
221 |
+
'httpMethod' => 'POST',
|
222 |
+
'parameters' => array(
|
223 |
+
'colorRgbFormat' => array(
|
224 |
+
'location' => 'query',
|
225 |
+
'type' => 'boolean',
|
226 |
+
),
|
227 |
+
),
|
228 |
+
),'list' => array(
|
229 |
+
'path' => 'users/me/calendarList',
|
230 |
+
'httpMethod' => 'GET',
|
231 |
+
'parameters' => array(
|
232 |
+
'maxResults' => array(
|
233 |
+
'location' => 'query',
|
234 |
+
'type' => 'integer',
|
235 |
+
),
|
236 |
+
'minAccessRole' => array(
|
237 |
+
'location' => 'query',
|
238 |
+
'type' => 'string',
|
239 |
+
),
|
240 |
+
'pageToken' => array(
|
241 |
+
'location' => 'query',
|
242 |
+
'type' => 'string',
|
243 |
+
),
|
244 |
+
'showDeleted' => array(
|
245 |
+
'location' => 'query',
|
246 |
+
'type' => 'boolean',
|
247 |
+
),
|
248 |
+
'showHidden' => array(
|
249 |
+
'location' => 'query',
|
250 |
+
'type' => 'boolean',
|
251 |
+
),
|
252 |
+
'syncToken' => array(
|
253 |
+
'location' => 'query',
|
254 |
+
'type' => 'string',
|
255 |
+
),
|
256 |
+
),
|
257 |
+
),'patch' => array(
|
258 |
+
'path' => 'users/me/calendarList/{calendarId}',
|
259 |
+
'httpMethod' => 'PATCH',
|
260 |
+
'parameters' => array(
|
261 |
+
'calendarId' => array(
|
262 |
+
'location' => 'path',
|
263 |
+
'type' => 'string',
|
264 |
+
'required' => true,
|
265 |
+
),
|
266 |
+
'colorRgbFormat' => array(
|
267 |
+
'location' => 'query',
|
268 |
+
'type' => 'boolean',
|
269 |
+
),
|
270 |
+
),
|
271 |
+
),'update' => array(
|
272 |
+
'path' => 'users/me/calendarList/{calendarId}',
|
273 |
+
'httpMethod' => 'PUT',
|
274 |
+
'parameters' => array(
|
275 |
+
'calendarId' => array(
|
276 |
+
'location' => 'path',
|
277 |
+
'type' => 'string',
|
278 |
+
'required' => true,
|
279 |
+
),
|
280 |
+
'colorRgbFormat' => array(
|
281 |
+
'location' => 'query',
|
282 |
+
'type' => 'boolean',
|
283 |
+
),
|
284 |
+
),
|
285 |
+
),'watch' => array(
|
286 |
+
'path' => 'users/me/calendarList/watch',
|
287 |
+
'httpMethod' => 'POST',
|
288 |
+
'parameters' => array(
|
289 |
+
'maxResults' => array(
|
290 |
+
'location' => 'query',
|
291 |
+
'type' => 'integer',
|
292 |
+
),
|
293 |
+
'minAccessRole' => array(
|
294 |
+
'location' => 'query',
|
295 |
+
'type' => 'string',
|
296 |
+
),
|
297 |
+
'pageToken' => array(
|
298 |
+
'location' => 'query',
|
299 |
+
'type' => 'string',
|
300 |
+
),
|
301 |
+
'showDeleted' => array(
|
302 |
+
'location' => 'query',
|
303 |
+
'type' => 'boolean',
|
304 |
+
),
|
305 |
+
'showHidden' => array(
|
306 |
+
'location' => 'query',
|
307 |
+
'type' => 'boolean',
|
308 |
+
),
|
309 |
+
'syncToken' => array(
|
310 |
+
'location' => 'query',
|
311 |
+
'type' => 'string',
|
312 |
+
),
|
313 |
+
),
|
314 |
+
),
|
315 |
+
)
|
316 |
+
)
|
317 |
+
);
|
318 |
+
$this->calendars = new Google_Service_Calendar_Calendars_Resource(
|
319 |
+
$this,
|
320 |
+
$this->serviceName,
|
321 |
+
'calendars',
|
322 |
+
array(
|
323 |
+
'methods' => array(
|
324 |
+
'clear' => array(
|
325 |
+
'path' => 'calendars/{calendarId}/clear',
|
326 |
+
'httpMethod' => 'POST',
|
327 |
+
'parameters' => array(
|
328 |
+
'calendarId' => array(
|
329 |
+
'location' => 'path',
|
330 |
+
'type' => 'string',
|
331 |
+
'required' => true,
|
332 |
+
),
|
333 |
+
),
|
334 |
+
),'delete' => array(
|
335 |
+
'path' => 'calendars/{calendarId}',
|
336 |
+
'httpMethod' => 'DELETE',
|
337 |
+
'parameters' => array(
|
338 |
+
'calendarId' => array(
|
339 |
+
'location' => 'path',
|
340 |
+
'type' => 'string',
|
341 |
+
'required' => true,
|
342 |
+
),
|
343 |
+
),
|
344 |
+
),'get' => array(
|
345 |
+
'path' => 'calendars/{calendarId}',
|
346 |
+
'httpMethod' => 'GET',
|
347 |
+
'parameters' => array(
|
348 |
+
'calendarId' => array(
|
349 |
+
'location' => 'path',
|
350 |
+
'type' => 'string',
|
351 |
+
'required' => true,
|
352 |
+
),
|
353 |
+
),
|
354 |
+
),'insert' => array(
|
355 |
+
'path' => 'calendars',
|
356 |
+
'httpMethod' => 'POST',
|
357 |
+
'parameters' => array(),
|
358 |
+
),'patch' => array(
|
359 |
+
'path' => 'calendars/{calendarId}',
|
360 |
+
'httpMethod' => 'PATCH',
|
361 |
+
'parameters' => array(
|
362 |
+
'calendarId' => array(
|
363 |
+
'location' => 'path',
|
364 |
+
'type' => 'string',
|
365 |
+
'required' => true,
|
366 |
+
),
|
367 |
+
),
|
368 |
+
),'update' => array(
|
369 |
+
'path' => 'calendars/{calendarId}',
|
370 |
+
'httpMethod' => 'PUT',
|
371 |
+
'parameters' => array(
|
372 |
+
'calendarId' => array(
|
373 |
+
'location' => 'path',
|
374 |
+
'type' => 'string',
|
375 |
+
'required' => true,
|
376 |
+
),
|
377 |
+
),
|
378 |
+
),
|
379 |
+
)
|
380 |
+
)
|
381 |
+
);
|
382 |
+
$this->channels = new Google_Service_Calendar_Channels_Resource(
|
383 |
+
$this,
|
384 |
+
$this->serviceName,
|
385 |
+
'channels',
|
386 |
+
array(
|
387 |
+
'methods' => array(
|
388 |
+
'stop' => array(
|
389 |
+
'path' => 'channels/stop',
|
390 |
+
'httpMethod' => 'POST',
|
391 |
+
'parameters' => array(),
|
392 |
+
),
|
393 |
+
)
|
394 |
+
)
|
395 |
+
);
|
396 |
+
$this->colors = new Google_Service_Calendar_Colors_Resource(
|
397 |
+
$this,
|
398 |
+
$this->serviceName,
|
399 |
+
'colors',
|
400 |
+
array(
|
401 |
+
'methods' => array(
|
402 |
+
'get' => array(
|
403 |
+
'path' => 'colors',
|
404 |
+
'httpMethod' => 'GET',
|
405 |
+
'parameters' => array(),
|
406 |
+
),
|
407 |
+
)
|
408 |
+
)
|
409 |
+
);
|
410 |
+
$this->events = new Google_Service_Calendar_Events_Resource(
|
411 |
+
$this,
|
412 |
+
$this->serviceName,
|
413 |
+
'events',
|
414 |
+
array(
|
415 |
+
'methods' => array(
|
416 |
+
'delete' => array(
|
417 |
+
'path' => 'calendars/{calendarId}/events/{eventId}',
|
418 |
+
'httpMethod' => 'DELETE',
|
419 |
+
'parameters' => array(
|
420 |
+
'calendarId' => array(
|
421 |
+
'location' => 'path',
|
422 |
+
'type' => 'string',
|
423 |
+
'required' => true,
|
424 |
+
),
|
425 |
+
'eventId' => array(
|
426 |
+
'location' => 'path',
|
427 |
+
'type' => 'string',
|
428 |
+
'required' => true,
|
429 |
+
),
|
430 |
+
'sendNotifications' => array(
|
431 |
+
'location' => 'query',
|
432 |
+
'type' => 'boolean',
|
433 |
+
),
|
434 |
+
),
|
435 |
+
),'get' => array(
|
436 |
+
'path' => 'calendars/{calendarId}/events/{eventId}',
|
437 |
+
'httpMethod' => 'GET',
|
438 |
+
'parameters' => array(
|
439 |
+
'calendarId' => array(
|
440 |
+
'location' => 'path',
|
441 |
+
'type' => 'string',
|
442 |
+
'required' => true,
|
443 |
+
),
|
444 |
+
'eventId' => array(
|
445 |
+
'location' => 'path',
|
446 |
+
'type' => 'string',
|
447 |
+
'required' => true,
|
448 |
+
),
|
449 |
+
'alwaysIncludeEmail' => array(
|
450 |
+
'location' => 'query',
|
451 |
+
'type' => 'boolean',
|
452 |
+
),
|
453 |
+
'maxAttendees' => array(
|
454 |
+
'location' => 'query',
|
455 |
+
'type' => 'integer',
|
456 |
+
),
|
457 |
+
'timeZone' => array(
|
458 |
+
'location' => 'query',
|
459 |
+
'type' => 'string',
|
460 |
+
),
|
461 |
+
),
|
462 |
+
),'import' => array(
|
463 |
+
'path' => 'calendars/{calendarId}/events/import',
|
464 |
+
'httpMethod' => 'POST',
|
465 |
+
'parameters' => array(
|
466 |
+
'calendarId' => array(
|
467 |
+
'location' => 'path',
|
468 |
+
'type' => 'string',
|
469 |
+
'required' => true,
|
470 |
+
),
|
471 |
+
'supportsAttachments' => array(
|
472 |
+
'location' => 'query',
|
473 |
+
'type' => 'boolean',
|
474 |
+
),
|
475 |
+
),
|
476 |
+
),'insert' => array(
|
477 |
+
'path' => 'calendars/{calendarId}/events',
|
478 |
+
'httpMethod' => 'POST',
|
479 |
+
'parameters' => array(
|
480 |
+
'calendarId' => array(
|
481 |
+
'location' => 'path',
|
482 |
+
'type' => 'string',
|
483 |
+
'required' => true,
|
484 |
+
),
|
485 |
+
'maxAttendees' => array(
|
486 |
+
'location' => 'query',
|
487 |
+
'type' => 'integer',
|
488 |
+
),
|
489 |
+
'sendNotifications' => array(
|
490 |
+
'location' => 'query',
|
491 |
+
'type' => 'boolean',
|
492 |
+
),
|
493 |
+
'supportsAttachments' => array(
|
494 |
+
'location' => 'query',
|
495 |
+
'type' => 'boolean',
|
496 |
+
),
|
497 |
+
),
|
498 |
+
),'instances' => array(
|
499 |
+
'path' => 'calendars/{calendarId}/events/{eventId}/instances',
|
500 |
+
'httpMethod' => 'GET',
|
501 |
+
'parameters' => array(
|
502 |
+
'calendarId' => array(
|
503 |
+
'location' => 'path',
|
504 |
+
'type' => 'string',
|
505 |
+
'required' => true,
|
506 |
+
),
|
507 |
+
'eventId' => array(
|
508 |
+
'location' => 'path',
|
509 |
+
'type' => 'string',
|
510 |
+
'required' => true,
|
511 |
+
),
|
512 |
+
'alwaysIncludeEmail' => array(
|
513 |
+
'location' => 'query',
|
514 |
+
'type' => 'boolean',
|
515 |
+
),
|
516 |
+
'maxAttendees' => array(
|
517 |
+
'location' => 'query',
|
518 |
+
'type' => 'integer',
|
519 |
+
),
|
520 |
+
'maxResults' => array(
|
521 |
+
'location' => 'query',
|
522 |
+
'type' => 'integer',
|
523 |
+
),
|
524 |
+
'originalStart' => array(
|
525 |
+
'location' => 'query',
|
526 |
+
'type' => 'string',
|
527 |
+
),
|
528 |
+
'pageToken' => array(
|
529 |
+
'location' => 'query',
|
530 |
+
'type' => 'string',
|
531 |
+
),
|
532 |
+
'showDeleted' => array(
|
533 |
+
'location' => 'query',
|
534 |
+
'type' => 'boolean',
|
535 |
+
),
|
536 |
+
'timeMax' => array(
|
537 |
+
'location' => 'query',
|
538 |
+
'type' => 'string',
|
539 |
+
),
|
540 |
+
'timeMin' => array(
|
541 |
+
'location' => 'query',
|
542 |
+
'type' => 'string',
|
543 |
+
),
|
544 |
+
'timeZone' => array(
|
545 |
+
'location' => 'query',
|
546 |
+
'type' => 'string',
|
547 |
+
),
|
548 |
+
),
|
549 |
+
),'list' => array(
|
550 |
+
'path' => 'calendars/{calendarId}/events',
|
551 |
+
'httpMethod' => 'GET',
|
552 |
+
'parameters' => array(
|
553 |
+
'calendarId' => array(
|
554 |
+
'location' => 'path',
|
555 |
+
'type' => 'string',
|
556 |
+
'required' => true,
|
557 |
+
),
|
558 |
+
'alwaysIncludeEmail' => array(
|
559 |
+
'location' => 'query',
|
560 |
+
'type' => 'boolean',
|
561 |
+
),
|
562 |
+
'iCalUID' => array(
|
563 |
+
'location' => 'query',
|
564 |
+
'type' => 'string',
|
565 |
+
),
|
566 |
+
'maxAttendees' => array(
|
567 |
+
'location' => 'query',
|
568 |
+
'type' => 'integer',
|
569 |
+
),
|
570 |
+
'maxResults' => array(
|
571 |
+
'location' => 'query',
|
572 |
+
'type' => 'integer',
|
573 |
+
),
|
574 |
+
'orderBy' => array(
|
575 |
+
'location' => 'query',
|
576 |
+
'type' => 'string',
|
577 |
+
),
|
578 |
+
'pageToken' => array(
|
579 |
+
'location' => 'query',
|
580 |
+
'type' => 'string',
|
581 |
+
),
|
582 |
+
'privateExtendedProperty' => array(
|
583 |
+
'location' => 'query',
|
584 |
+
'type' => 'string',
|
585 |
+
'repeated' => true,
|
586 |
+
),
|
587 |
+
'q' => array(
|
588 |
+
'location' => 'query',
|
589 |
+
'type' => 'string',
|
590 |
+
),
|
591 |
+
'sharedExtendedProperty' => array(
|
592 |
+
'location' => 'query',
|
593 |
+
'type' => 'string',
|
594 |
+
'repeated' => true,
|
595 |
+
),
|
596 |
+
'showDeleted' => array(
|
597 |
+
'location' => 'query',
|
598 |
+
'type' => 'boolean',
|
599 |
+
),
|
600 |
+
'showHiddenInvitations' => array(
|
601 |
+
'location' => 'query',
|
602 |
+
'type' => 'boolean',
|
603 |
+
),
|
604 |
+
'singleEvents' => array(
|
605 |
+
'location' => 'query',
|
606 |
+
'type' => 'boolean',
|
607 |
+
),
|
608 |
+
'syncToken' => array(
|
609 |
+
'location' => 'query',
|
610 |
+
'type' => 'string',
|
611 |
+
),
|
612 |
+
'timeMax' => array(
|
613 |
+
'location' => 'query',
|
614 |
+
'type' => 'string',
|
615 |
+
),
|
616 |
+
'timeMin' => array(
|
617 |
+
'location' => 'query',
|
618 |
+
'type' => 'string',
|
619 |
+
),
|
620 |
+
'timeZone' => array(
|
621 |
+
'location' => 'query',
|
622 |
+
'type' => 'string',
|
623 |
+
),
|
624 |
+
'updatedMin' => array(
|
625 |
+
'location' => 'query',
|
626 |
+
'type' => 'string',
|
627 |
+
),
|
628 |
+
),
|
629 |
+
),'move' => array(
|
630 |
+
'path' => 'calendars/{calendarId}/events/{eventId}/move',
|
631 |
+
'httpMethod' => 'POST',
|
632 |
+
'parameters' => array(
|
633 |
+
'calendarId' => array(
|
634 |
+
'location' => 'path',
|
635 |
+
'type' => 'string',
|
636 |
+
'required' => true,
|
637 |
+
),
|
638 |
+
'eventId' => array(
|
639 |
+
'location' => 'path',
|
640 |
+
'type' => 'string',
|
641 |
+
'required' => true,
|
642 |
+
),
|
643 |
+
'destination' => array(
|
644 |
+
'location' => 'query',
|
645 |
+
'type' => 'string',
|
646 |
+
'required' => true,
|
647 |
+
),
|
648 |
+
'sendNotifications' => array(
|
649 |
+
'location' => 'query',
|
650 |
+
'type' => 'boolean',
|
651 |
+
),
|
652 |
+
),
|
653 |
+
),'patch' => array(
|
654 |
+
'path' => 'calendars/{calendarId}/events/{eventId}',
|
655 |
+
'httpMethod' => 'PATCH',
|
656 |
+
'parameters' => array(
|
657 |
+
'calendarId' => array(
|
658 |
+
'location' => 'path',
|
659 |
+
'type' => 'string',
|
660 |
+
'required' => true,
|
661 |
+
),
|
662 |
+
'eventId' => array(
|
663 |
+
'location' => 'path',
|
664 |
+
'type' => 'string',
|
665 |
+
'required' => true,
|
666 |
+
),
|
667 |
+
'alwaysIncludeEmail' => array(
|
668 |
+
'location' => 'query',
|
669 |
+
'type' => 'boolean',
|
670 |
+
),
|
671 |
+
'maxAttendees' => array(
|
672 |
+
'location' => 'query',
|
673 |
+
'type' => 'integer',
|
674 |
+
),
|
675 |
+
'sendNotifications' => array(
|
676 |
+
'location' => 'query',
|
677 |
+
'type' => 'boolean',
|
678 |
+
),
|
679 |
+
'supportsAttachments' => array(
|
680 |
+
'location' => 'query',
|
681 |
+
'type' => 'boolean',
|
682 |
+
),
|
683 |
+
),
|
684 |
+
),'quickAdd' => array(
|
685 |
+
'path' => 'calendars/{calendarId}/events/quickAdd',
|
686 |
+
'httpMethod' => 'POST',
|
687 |
+
'parameters' => array(
|
688 |
+
'calendarId' => array(
|
689 |
+
'location' => 'path',
|
690 |
+
'type' => 'string',
|
691 |
+
'required' => true,
|
692 |
+
),
|
693 |
+
'text' => array(
|
694 |
+
'location' => 'query',
|
695 |
+
'type' => 'string',
|
696 |
+
'required' => true,
|
697 |
+
),
|
698 |
+
'sendNotifications' => array(
|
699 |
+
'location' => 'query',
|
700 |
+
'type' => 'boolean',
|
701 |
+
),
|
702 |
+
),
|
703 |
+
),'update' => array(
|
704 |
+
'path' => 'calendars/{calendarId}/events/{eventId}',
|
705 |
+
'httpMethod' => 'PUT',
|
706 |
+
'parameters' => array(
|
707 |
+
'calendarId' => array(
|
708 |
+
'location' => 'path',
|
709 |
+
'type' => 'string',
|
710 |
+
'required' => true,
|
711 |
+
),
|
712 |
+
'eventId' => array(
|
713 |
+
'location' => 'path',
|
714 |
+
'type' => 'string',
|
715 |
+
'required' => true,
|
716 |
+
),
|
717 |
+
'alwaysIncludeEmail' => array(
|
718 |
+
'location' => 'query',
|
719 |
+
'type' => 'boolean',
|
720 |
+
),
|
721 |
+
'maxAttendees' => array(
|
722 |
+
'location' => 'query',
|
723 |
+
'type' => 'integer',
|
724 |
+
),
|
725 |
+
'sendNotifications' => array(
|
726 |
+
'location' => 'query',
|
727 |
+
'type' => 'boolean',
|
728 |
+
),
|
729 |
+
'supportsAttachments' => array(
|
730 |
+
'location' => 'query',
|
731 |
+
'type' => 'boolean',
|
732 |
+
),
|
733 |
+
),
|
734 |
+
),'watch' => array(
|
735 |
+
'path' => 'calendars/{calendarId}/events/watch',
|
736 |
+
'httpMethod' => 'POST',
|
737 |
+
'parameters' => array(
|
738 |
+
'calendarId' => array(
|
739 |
+
'location' => 'path',
|
740 |
+
'type' => 'string',
|
741 |
+
'required' => true,
|
742 |
+
),
|
743 |
+
'alwaysIncludeEmail' => array(
|
744 |
+
'location' => 'query',
|
745 |
+
'type' => 'boolean',
|
746 |
+
),
|
747 |
+
'iCalUID' => array(
|
748 |
+
'location' => 'query',
|
749 |
+
'type' => 'string',
|
750 |
+
),
|
751 |
+
'maxAttendees' => array(
|
752 |
+
'location' => 'query',
|
753 |
+
'type' => 'integer',
|
754 |
+
),
|
755 |
+
'maxResults' => array(
|
756 |
+
'location' => 'query',
|
757 |
+
'type' => 'integer',
|
758 |
+
),
|
759 |
+
'orderBy' => array(
|
760 |
+
'location' => 'query',
|
761 |
+
'type' => 'string',
|
762 |
+
),
|
763 |
+
'pageToken' => array(
|
764 |
+
'location' => 'query',
|
765 |
+
'type' => 'string',
|
766 |
+
),
|
767 |
+
'privateExtendedProperty' => array(
|
768 |
+
'location' => 'query',
|
769 |
+
'type' => 'string',
|
770 |
+
'repeated' => true,
|
771 |
+
),
|
772 |
+
'q' => array(
|
773 |
+
'location' => 'query',
|
774 |
+
'type' => 'string',
|
775 |
+
),
|
776 |
+
'sharedExtendedProperty' => array(
|
777 |
+
'location' => 'query',
|
778 |
+
'type' => 'string',
|
779 |
+
'repeated' => true,
|
780 |
+
),
|
781 |
+
'showDeleted' => array(
|
782 |
+
'location' => 'query',
|
783 |
+
'type' => 'boolean',
|
784 |
+
),
|
785 |
+
'showHiddenInvitations' => array(
|
786 |
+
'location' => 'query',
|
787 |
+
'type' => 'boolean',
|
788 |
+
),
|
789 |
+
'singleEvents' => array(
|
790 |
+
'location' => 'query',
|
791 |
+
'type' => 'boolean',
|
792 |
+
),
|
793 |
+
'syncToken' => array(
|
794 |
+
'location' => 'query',
|
795 |
+
'type' => 'string',
|
796 |
+
),
|
797 |
+
'timeMax' => array(
|
798 |
+
'location' => 'query',
|
799 |
+
'type' => 'string',
|
800 |
+
),
|
801 |
+
'timeMin' => array(
|
802 |
+
'location' => 'query',
|
803 |
+
'type' => 'string',
|
804 |
+
),
|
805 |
+
'timeZone' => array(
|
806 |
+
'location' => 'query',
|
807 |
+
'type' => 'string',
|
808 |
+
),
|
809 |
+
'updatedMin' => array(
|
810 |
+
'location' => 'query',
|
811 |
+
'type' => 'string',
|
812 |
+
),
|
813 |
+
),
|
814 |
+
),
|
815 |
+
)
|
816 |
+
)
|
817 |
+
);
|
818 |
+
$this->freebusy = new Google_Service_Calendar_Freebusy_Resource(
|
819 |
+
$this,
|
820 |
+
$this->serviceName,
|
821 |
+
'freebusy',
|
822 |
+
array(
|
823 |
+
'methods' => array(
|
824 |
+
'query' => array(
|
825 |
+
'path' => 'freeBusy',
|
826 |
+
'httpMethod' => 'POST',
|
827 |
+
'parameters' => array(),
|
828 |
+
),
|
829 |
+
)
|
830 |
+
)
|
831 |
+
);
|
832 |
+
$this->settings = new Google_Service_Calendar_Settings_Resource(
|
833 |
+
$this,
|
834 |
+
$this->serviceName,
|
835 |
+
'settings',
|
836 |
+
array(
|
837 |
+
'methods' => array(
|
838 |
+
'get' => array(
|
839 |
+
'path' => 'users/me/settings/{setting}',
|
840 |
+
'httpMethod' => 'GET',
|
841 |
+
'parameters' => array(
|
842 |
+
'setting' => array(
|
843 |
+
'location' => 'path',
|
844 |
+
'type' => 'string',
|
845 |
+
'required' => true,
|
846 |
+
),
|
847 |
+
),
|
848 |
+
),'list' => array(
|
849 |
+
'path' => 'users/me/settings',
|
850 |
+
'httpMethod' => 'GET',
|
851 |
+
'parameters' => array(
|
852 |
+
'maxResults' => array(
|
853 |
+
'location' => 'query',
|
854 |
+
'type' => 'integer',
|
855 |
+
),
|
856 |
+
'pageToken' => array(
|
857 |
+
'location' => 'query',
|
858 |
+
'type' => 'string',
|
859 |
+
),
|
860 |
+
'syncToken' => array(
|
861 |
+
'location' => 'query',
|
862 |
+
'type' => 'string',
|
863 |
+
),
|
864 |
+
),
|
865 |
+
),'watch' => array(
|
866 |
+
'path' => 'users/me/settings/watch',
|
867 |
+
'httpMethod' => 'POST',
|
868 |
+
'parameters' => array(
|
869 |
+
'maxResults' => array(
|
870 |
+
'location' => 'query',
|
871 |
+
'type' => 'integer',
|
872 |
+
),
|
873 |
+
'pageToken' => array(
|
874 |
+
'location' => 'query',
|
875 |
+
'type' => 'string',
|
876 |
+
),
|
877 |
+
'syncToken' => array(
|
878 |
+
'location' => 'query',
|
879 |
+
'type' => 'string',
|
880 |
+
),
|
881 |
+
),
|
882 |
+
),
|
883 |
+
)
|
884 |
+
)
|
885 |
+
);
|
886 |
+
}
|
887 |
+
}
|
888 |
+
|
889 |
+
|
890 |
+
/**
|
891 |
+
* The "acl" collection of methods.
|
892 |
+
* Typical usage is:
|
893 |
+
* <code>
|
894 |
+
* $calendarService = new Google_Service_Calendar(...);
|
895 |
+
* $acl = $calendarService->acl;
|
896 |
+
* </code>
|
897 |
+
*/
|
898 |
+
class Google_Service_Calendar_Acl_Resource extends Google_Service_Resource
|
899 |
+
{
|
900 |
+
|
901 |
+
/**
|
902 |
+
* Deletes an access control rule. (acl.delete)
|
903 |
+
*
|
904 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
905 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
906 |
+
* the currently logged in user, use the "primary" keyword.
|
907 |
+
* @param string $ruleId ACL rule identifier.
|
908 |
+
* @param array $optParams Optional parameters.
|
909 |
+
*/
|
910 |
+
public function delete($calendarId, $ruleId, $optParams = array())
|
911 |
+
{
|
912 |
+
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
|
913 |
+
$params = array_merge($params, $optParams);
|
914 |
+
return $this->call('delete', array($params));
|
915 |
+
}
|
916 |
+
|
917 |
+
/**
|
918 |
+
* Returns an access control rule. (acl.get)
|
919 |
+
*
|
920 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
921 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
922 |
+
* the currently logged in user, use the "primary" keyword.
|
923 |
+
* @param string $ruleId ACL rule identifier.
|
924 |
+
* @param array $optParams Optional parameters.
|
925 |
+
* @return Google_Service_Calendar_AclRule
|
926 |
+
*/
|
927 |
+
public function get($calendarId, $ruleId, $optParams = array())
|
928 |
+
{
|
929 |
+
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId);
|
930 |
+
$params = array_merge($params, $optParams);
|
931 |
+
return $this->call('get', array($params), "Google_Service_Calendar_AclRule");
|
932 |
+
}
|
933 |
+
|
934 |
+
/**
|
935 |
+
* Creates an access control rule. (acl.insert)
|
936 |
+
*
|
937 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
938 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
939 |
+
* the currently logged in user, use the "primary" keyword.
|
940 |
+
* @param Google_AclRule $postBody
|
941 |
+
* @param array $optParams Optional parameters.
|
942 |
+
* @return Google_Service_Calendar_AclRule
|
943 |
+
*/
|
944 |
+
public function insert($calendarId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
945 |
+
{
|
946 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
947 |
+
$params = array_merge($params, $optParams);
|
948 |
+
return $this->call('insert', array($params), "Google_Service_Calendar_AclRule");
|
949 |
+
}
|
950 |
+
|
951 |
+
/**
|
952 |
+
* Returns the rules in the access control list for the calendar. (acl.listAcl)
|
953 |
+
*
|
954 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
955 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
956 |
+
* the currently logged in user, use the "primary" keyword.
|
957 |
+
* @param array $optParams Optional parameters.
|
958 |
+
*
|
959 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
960 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
961 |
+
* than 250 entries. Optional.
|
962 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
963 |
+
* Optional.
|
964 |
+
* @opt_param bool showDeleted Whether to include deleted ACLs in the result.
|
965 |
+
* Deleted ACLs are represented by role equal to "none". Deleted ACLs will
|
966 |
+
* always be included if syncToken is provided. Optional. The default is False.
|
967 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
968 |
+
* returned on the last page of results from the previous list request. It makes
|
969 |
+
* the result of this list request contain only entries that have changed since
|
970 |
+
* then. All entries deleted since the previous list request will always be in
|
971 |
+
* the result set and it is not allowed to set showDeleted to False. If the
|
972 |
+
* syncToken expires, the server will respond with a 410 GONE response code and
|
973 |
+
* the client should clear its storage and perform a full synchronization
|
974 |
+
* without any syncToken. Learn more about incremental synchronization.
|
975 |
+
* Optional. The default is to return all entries.
|
976 |
+
* @return Google_Service_Calendar_Acl
|
977 |
+
*/
|
978 |
+
public function listAcl($calendarId, $optParams = array())
|
979 |
+
{
|
980 |
+
$params = array('calendarId' => $calendarId);
|
981 |
+
$params = array_merge($params, $optParams);
|
982 |
+
return $this->call('list', array($params), "Google_Service_Calendar_Acl");
|
983 |
+
}
|
984 |
+
|
985 |
+
/**
|
986 |
+
* Updates an access control rule. This method supports patch semantics.
|
987 |
+
* (acl.patch)
|
988 |
+
*
|
989 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
990 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
991 |
+
* the currently logged in user, use the "primary" keyword.
|
992 |
+
* @param string $ruleId ACL rule identifier.
|
993 |
+
* @param Google_AclRule $postBody
|
994 |
+
* @param array $optParams Optional parameters.
|
995 |
+
* @return Google_Service_Calendar_AclRule
|
996 |
+
*/
|
997 |
+
public function patch($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
998 |
+
{
|
999 |
+
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
|
1000 |
+
$params = array_merge($params, $optParams);
|
1001 |
+
return $this->call('patch', array($params), "Google_Service_Calendar_AclRule");
|
1002 |
+
}
|
1003 |
+
|
1004 |
+
/**
|
1005 |
+
* Updates an access control rule. (acl.update)
|
1006 |
+
*
|
1007 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1008 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1009 |
+
* the currently logged in user, use the "primary" keyword.
|
1010 |
+
* @param string $ruleId ACL rule identifier.
|
1011 |
+
* @param Google_AclRule $postBody
|
1012 |
+
* @param array $optParams Optional parameters.
|
1013 |
+
* @return Google_Service_Calendar_AclRule
|
1014 |
+
*/
|
1015 |
+
public function update($calendarId, $ruleId, Google_Service_Calendar_AclRule $postBody, $optParams = array())
|
1016 |
+
{
|
1017 |
+
$params = array('calendarId' => $calendarId, 'ruleId' => $ruleId, 'postBody' => $postBody);
|
1018 |
+
$params = array_merge($params, $optParams);
|
1019 |
+
return $this->call('update', array($params), "Google_Service_Calendar_AclRule");
|
1020 |
+
}
|
1021 |
+
|
1022 |
+
/**
|
1023 |
+
* Watch for changes to ACL resources. (acl.watch)
|
1024 |
+
*
|
1025 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1026 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1027 |
+
* the currently logged in user, use the "primary" keyword.
|
1028 |
+
* @param Google_Channel $postBody
|
1029 |
+
* @param array $optParams Optional parameters.
|
1030 |
+
*
|
1031 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
1032 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
1033 |
+
* than 250 entries. Optional.
|
1034 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1035 |
+
* Optional.
|
1036 |
+
* @opt_param bool showDeleted Whether to include deleted ACLs in the result.
|
1037 |
+
* Deleted ACLs are represented by role equal to "none". Deleted ACLs will
|
1038 |
+
* always be included if syncToken is provided. Optional. The default is False.
|
1039 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1040 |
+
* returned on the last page of results from the previous list request. It makes
|
1041 |
+
* the result of this list request contain only entries that have changed since
|
1042 |
+
* then. All entries deleted since the previous list request will always be in
|
1043 |
+
* the result set and it is not allowed to set showDeleted to False. If the
|
1044 |
+
* syncToken expires, the server will respond with a 410 GONE response code and
|
1045 |
+
* the client should clear its storage and perform a full synchronization
|
1046 |
+
* without any syncToken. Learn more about incremental synchronization.
|
1047 |
+
* Optional. The default is to return all entries.
|
1048 |
+
* @return Google_Service_Calendar_Channel
|
1049 |
+
*/
|
1050 |
+
public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1051 |
+
{
|
1052 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1053 |
+
$params = array_merge($params, $optParams);
|
1054 |
+
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1055 |
+
}
|
1056 |
+
}
|
1057 |
+
|
1058 |
+
/**
|
1059 |
+
* The "calendarList" collection of methods.
|
1060 |
+
* Typical usage is:
|
1061 |
+
* <code>
|
1062 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1063 |
+
* $calendarList = $calendarService->calendarList;
|
1064 |
+
* </code>
|
1065 |
+
*/
|
1066 |
+
class Google_Service_Calendar_CalendarList_Resource extends Google_Service_Resource
|
1067 |
+
{
|
1068 |
+
|
1069 |
+
/**
|
1070 |
+
* Deletes an entry on the user's calendar list. (calendarList.delete)
|
1071 |
+
*
|
1072 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1073 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1074 |
+
* the currently logged in user, use the "primary" keyword.
|
1075 |
+
* @param array $optParams Optional parameters.
|
1076 |
+
*/
|
1077 |
+
public function delete($calendarId, $optParams = array())
|
1078 |
+
{
|
1079 |
+
$params = array('calendarId' => $calendarId);
|
1080 |
+
$params = array_merge($params, $optParams);
|
1081 |
+
return $this->call('delete', array($params));
|
1082 |
+
}
|
1083 |
+
|
1084 |
+
/**
|
1085 |
+
* Returns an entry on the user's calendar list. (calendarList.get)
|
1086 |
+
*
|
1087 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1088 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1089 |
+
* the currently logged in user, use the "primary" keyword.
|
1090 |
+
* @param array $optParams Optional parameters.
|
1091 |
+
* @return Google_Service_Calendar_CalendarListEntry
|
1092 |
+
*/
|
1093 |
+
public function get($calendarId, $optParams = array())
|
1094 |
+
{
|
1095 |
+
$params = array('calendarId' => $calendarId);
|
1096 |
+
$params = array_merge($params, $optParams);
|
1097 |
+
return $this->call('get', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1098 |
+
}
|
1099 |
+
|
1100 |
+
/**
|
1101 |
+
* Adds an entry to the user's calendar list. (calendarList.insert)
|
1102 |
+
*
|
1103 |
+
* @param Google_CalendarListEntry $postBody
|
1104 |
+
* @param array $optParams Optional parameters.
|
1105 |
+
*
|
1106 |
+
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1107 |
+
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1108 |
+
* used, the index-based colorId field will be set to the best matching option
|
1109 |
+
* automatically. Optional. The default is False.
|
1110 |
+
* @return Google_Service_Calendar_CalendarListEntry
|
1111 |
+
*/
|
1112 |
+
public function insert(Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1113 |
+
{
|
1114 |
+
$params = array('postBody' => $postBody);
|
1115 |
+
$params = array_merge($params, $optParams);
|
1116 |
+
return $this->call('insert', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1117 |
+
}
|
1118 |
+
|
1119 |
+
/**
|
1120 |
+
* Returns entries on the user's calendar list. (calendarList.listCalendarList)
|
1121 |
+
*
|
1122 |
+
* @param array $optParams Optional parameters.
|
1123 |
+
*
|
1124 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
1125 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
1126 |
+
* than 250 entries. Optional.
|
1127 |
+
* @opt_param string minAccessRole The minimum access role for the user in the
|
1128 |
+
* returned entries. Optional. The default is no restriction.
|
1129 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1130 |
+
* Optional.
|
1131 |
+
* @opt_param bool showDeleted Whether to include deleted calendar list entries
|
1132 |
+
* in the result. Optional. The default is False.
|
1133 |
+
* @opt_param bool showHidden Whether to show hidden entries. Optional. The
|
1134 |
+
* default is False.
|
1135 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1136 |
+
* returned on the last page of results from the previous list request. It makes
|
1137 |
+
* the result of this list request contain only entries that have changed since
|
1138 |
+
* then. If only read-only fields such as calendar properties or ACLs have
|
1139 |
+
* changed, the entry won't be returned. All entries deleted and hidden since
|
1140 |
+
* the previous list request will always be in the result set and it is not
|
1141 |
+
* allowed to set showDeleted neither showHidden to False. To ensure client
|
1142 |
+
* state consistency minAccessRole query parameter cannot be specified together
|
1143 |
+
* with nextSyncToken. If the syncToken expires, the server will respond with a
|
1144 |
+
* 410 GONE response code and the client should clear its storage and perform a
|
1145 |
+
* full synchronization without any syncToken. Learn more about incremental
|
1146 |
+
* synchronization. Optional. The default is to return all entries.
|
1147 |
+
* @return Google_Service_Calendar_CalendarList
|
1148 |
+
*/
|
1149 |
+
public function listCalendarList($optParams = array())
|
1150 |
+
{
|
1151 |
+
$params = array();
|
1152 |
+
$params = array_merge($params, $optParams);
|
1153 |
+
return $this->call('list', array($params), "Google_Service_Calendar_CalendarList");
|
1154 |
+
}
|
1155 |
+
|
1156 |
+
/**
|
1157 |
+
* Updates an entry on the user's calendar list. This method supports patch
|
1158 |
+
* semantics. (calendarList.patch)
|
1159 |
+
*
|
1160 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1161 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1162 |
+
* the currently logged in user, use the "primary" keyword.
|
1163 |
+
* @param Google_CalendarListEntry $postBody
|
1164 |
+
* @param array $optParams Optional parameters.
|
1165 |
+
*
|
1166 |
+
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1167 |
+
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1168 |
+
* used, the index-based colorId field will be set to the best matching option
|
1169 |
+
* automatically. Optional. The default is False.
|
1170 |
+
* @return Google_Service_Calendar_CalendarListEntry
|
1171 |
+
*/
|
1172 |
+
public function patch($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1173 |
+
{
|
1174 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1175 |
+
$params = array_merge($params, $optParams);
|
1176 |
+
return $this->call('patch', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1177 |
+
}
|
1178 |
+
|
1179 |
+
/**
|
1180 |
+
* Updates an entry on the user's calendar list. (calendarList.update)
|
1181 |
+
*
|
1182 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1183 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1184 |
+
* the currently logged in user, use the "primary" keyword.
|
1185 |
+
* @param Google_CalendarListEntry $postBody
|
1186 |
+
* @param array $optParams Optional parameters.
|
1187 |
+
*
|
1188 |
+
* @opt_param bool colorRgbFormat Whether to use the foregroundColor and
|
1189 |
+
* backgroundColor fields to write the calendar colors (RGB). If this feature is
|
1190 |
+
* used, the index-based colorId field will be set to the best matching option
|
1191 |
+
* automatically. Optional. The default is False.
|
1192 |
+
* @return Google_Service_Calendar_CalendarListEntry
|
1193 |
+
*/
|
1194 |
+
public function update($calendarId, Google_Service_Calendar_CalendarListEntry $postBody, $optParams = array())
|
1195 |
+
{
|
1196 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1197 |
+
$params = array_merge($params, $optParams);
|
1198 |
+
return $this->call('update', array($params), "Google_Service_Calendar_CalendarListEntry");
|
1199 |
+
}
|
1200 |
+
|
1201 |
+
/**
|
1202 |
+
* Watch for changes to CalendarList resources. (calendarList.watch)
|
1203 |
+
*
|
1204 |
+
* @param Google_Channel $postBody
|
1205 |
+
* @param array $optParams Optional parameters.
|
1206 |
+
*
|
1207 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
1208 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
1209 |
+
* than 250 entries. Optional.
|
1210 |
+
* @opt_param string minAccessRole The minimum access role for the user in the
|
1211 |
+
* returned entries. Optional. The default is no restriction.
|
1212 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1213 |
+
* Optional.
|
1214 |
+
* @opt_param bool showDeleted Whether to include deleted calendar list entries
|
1215 |
+
* in the result. Optional. The default is False.
|
1216 |
+
* @opt_param bool showHidden Whether to show hidden entries. Optional. The
|
1217 |
+
* default is False.
|
1218 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1219 |
+
* returned on the last page of results from the previous list request. It makes
|
1220 |
+
* the result of this list request contain only entries that have changed since
|
1221 |
+
* then. If only read-only fields such as calendar properties or ACLs have
|
1222 |
+
* changed, the entry won't be returned. All entries deleted and hidden since
|
1223 |
+
* the previous list request will always be in the result set and it is not
|
1224 |
+
* allowed to set showDeleted neither showHidden to False. To ensure client
|
1225 |
+
* state consistency minAccessRole query parameter cannot be specified together
|
1226 |
+
* with nextSyncToken. If the syncToken expires, the server will respond with a
|
1227 |
+
* 410 GONE response code and the client should clear its storage and perform a
|
1228 |
+
* full synchronization without any syncToken. Learn more about incremental
|
1229 |
+
* synchronization. Optional. The default is to return all entries.
|
1230 |
+
* @return Google_Service_Calendar_Channel
|
1231 |
+
*/
|
1232 |
+
public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1233 |
+
{
|
1234 |
+
$params = array('postBody' => $postBody);
|
1235 |
+
$params = array_merge($params, $optParams);
|
1236 |
+
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1237 |
+
}
|
1238 |
+
}
|
1239 |
+
|
1240 |
+
/**
|
1241 |
+
* The "calendars" collection of methods.
|
1242 |
+
* Typical usage is:
|
1243 |
+
* <code>
|
1244 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1245 |
+
* $calendars = $calendarService->calendars;
|
1246 |
+
* </code>
|
1247 |
+
*/
|
1248 |
+
class Google_Service_Calendar_Calendars_Resource extends Google_Service_Resource
|
1249 |
+
{
|
1250 |
+
|
1251 |
+
/**
|
1252 |
+
* Clears a primary calendar. This operation deletes all events associated with
|
1253 |
+
* the primary calendar of an account. (calendars.clear)
|
1254 |
+
*
|
1255 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1256 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1257 |
+
* the currently logged in user, use the "primary" keyword.
|
1258 |
+
* @param array $optParams Optional parameters.
|
1259 |
+
*/
|
1260 |
+
public function clear($calendarId, $optParams = array())
|
1261 |
+
{
|
1262 |
+
$params = array('calendarId' => $calendarId);
|
1263 |
+
$params = array_merge($params, $optParams);
|
1264 |
+
return $this->call('clear', array($params));
|
1265 |
+
}
|
1266 |
+
|
1267 |
+
/**
|
1268 |
+
* Deletes a secondary calendar. Use calendars.clear for clearing all events on
|
1269 |
+
* primary calendars. (calendars.delete)
|
1270 |
+
*
|
1271 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1272 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1273 |
+
* the currently logged in user, use the "primary" keyword.
|
1274 |
+
* @param array $optParams Optional parameters.
|
1275 |
+
*/
|
1276 |
+
public function delete($calendarId, $optParams = array())
|
1277 |
+
{
|
1278 |
+
$params = array('calendarId' => $calendarId);
|
1279 |
+
$params = array_merge($params, $optParams);
|
1280 |
+
return $this->call('delete', array($params));
|
1281 |
+
}
|
1282 |
+
|
1283 |
+
/**
|
1284 |
+
* Returns metadata for a calendar. (calendars.get)
|
1285 |
+
*
|
1286 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1287 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1288 |
+
* the currently logged in user, use the "primary" keyword.
|
1289 |
+
* @param array $optParams Optional parameters.
|
1290 |
+
* @return Google_Service_Calendar_Calendar
|
1291 |
+
*/
|
1292 |
+
public function get($calendarId, $optParams = array())
|
1293 |
+
{
|
1294 |
+
$params = array('calendarId' => $calendarId);
|
1295 |
+
$params = array_merge($params, $optParams);
|
1296 |
+
return $this->call('get', array($params), "Google_Service_Calendar_Calendar");
|
1297 |
+
}
|
1298 |
+
|
1299 |
+
/**
|
1300 |
+
* Creates a secondary calendar. (calendars.insert)
|
1301 |
+
*
|
1302 |
+
* @param Google_Calendar $postBody
|
1303 |
+
* @param array $optParams Optional parameters.
|
1304 |
+
* @return Google_Service_Calendar_Calendar
|
1305 |
+
*/
|
1306 |
+
public function insert(Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1307 |
+
{
|
1308 |
+
$params = array('postBody' => $postBody);
|
1309 |
+
$params = array_merge($params, $optParams);
|
1310 |
+
return $this->call('insert', array($params), "Google_Service_Calendar_Calendar");
|
1311 |
+
}
|
1312 |
+
|
1313 |
+
/**
|
1314 |
+
* Updates metadata for a calendar. This method supports patch semantics.
|
1315 |
+
* (calendars.patch)
|
1316 |
+
*
|
1317 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1318 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1319 |
+
* the currently logged in user, use the "primary" keyword.
|
1320 |
+
* @param Google_Calendar $postBody
|
1321 |
+
* @param array $optParams Optional parameters.
|
1322 |
+
* @return Google_Service_Calendar_Calendar
|
1323 |
+
*/
|
1324 |
+
public function patch($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1325 |
+
{
|
1326 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1327 |
+
$params = array_merge($params, $optParams);
|
1328 |
+
return $this->call('patch', array($params), "Google_Service_Calendar_Calendar");
|
1329 |
+
}
|
1330 |
+
|
1331 |
+
/**
|
1332 |
+
* Updates metadata for a calendar. (calendars.update)
|
1333 |
+
*
|
1334 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1335 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1336 |
+
* the currently logged in user, use the "primary" keyword.
|
1337 |
+
* @param Google_Calendar $postBody
|
1338 |
+
* @param array $optParams Optional parameters.
|
1339 |
+
* @return Google_Service_Calendar_Calendar
|
1340 |
+
*/
|
1341 |
+
public function update($calendarId, Google_Service_Calendar_Calendar $postBody, $optParams = array())
|
1342 |
+
{
|
1343 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1344 |
+
$params = array_merge($params, $optParams);
|
1345 |
+
return $this->call('update', array($params), "Google_Service_Calendar_Calendar");
|
1346 |
+
}
|
1347 |
+
}
|
1348 |
+
|
1349 |
+
/**
|
1350 |
+
* The "channels" collection of methods.
|
1351 |
+
* Typical usage is:
|
1352 |
+
* <code>
|
1353 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1354 |
+
* $channels = $calendarService->channels;
|
1355 |
+
* </code>
|
1356 |
+
*/
|
1357 |
+
class Google_Service_Calendar_Channels_Resource extends Google_Service_Resource
|
1358 |
+
{
|
1359 |
+
|
1360 |
+
/**
|
1361 |
+
* Stop watching resources through this channel (channels.stop)
|
1362 |
+
*
|
1363 |
+
* @param Google_Channel $postBody
|
1364 |
+
* @param array $optParams Optional parameters.
|
1365 |
+
*/
|
1366 |
+
public function stop(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1367 |
+
{
|
1368 |
+
$params = array('postBody' => $postBody);
|
1369 |
+
$params = array_merge($params, $optParams);
|
1370 |
+
return $this->call('stop', array($params));
|
1371 |
+
}
|
1372 |
+
}
|
1373 |
+
|
1374 |
+
/**
|
1375 |
+
* The "colors" collection of methods.
|
1376 |
+
* Typical usage is:
|
1377 |
+
* <code>
|
1378 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1379 |
+
* $colors = $calendarService->colors;
|
1380 |
+
* </code>
|
1381 |
+
*/
|
1382 |
+
class Google_Service_Calendar_Colors_Resource extends Google_Service_Resource
|
1383 |
+
{
|
1384 |
+
|
1385 |
+
/**
|
1386 |
+
* Returns the color definitions for calendars and events. (colors.get)
|
1387 |
+
*
|
1388 |
+
* @param array $optParams Optional parameters.
|
1389 |
+
* @return Google_Service_Calendar_Colors
|
1390 |
+
*/
|
1391 |
+
public function get($optParams = array())
|
1392 |
+
{
|
1393 |
+
$params = array();
|
1394 |
+
$params = array_merge($params, $optParams);
|
1395 |
+
return $this->call('get', array($params), "Google_Service_Calendar_Colors");
|
1396 |
+
}
|
1397 |
+
}
|
1398 |
+
|
1399 |
+
/**
|
1400 |
+
* The "events" collection of methods.
|
1401 |
+
* Typical usage is:
|
1402 |
+
* <code>
|
1403 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1404 |
+
* $events = $calendarService->events;
|
1405 |
+
* </code>
|
1406 |
+
*/
|
1407 |
+
class Google_Service_Calendar_Events_Resource extends Google_Service_Resource
|
1408 |
+
{
|
1409 |
+
|
1410 |
+
/**
|
1411 |
+
* Deletes an event. (events.delete)
|
1412 |
+
*
|
1413 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1414 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1415 |
+
* the currently logged in user, use the "primary" keyword.
|
1416 |
+
* @param string $eventId Event identifier.
|
1417 |
+
* @param array $optParams Optional parameters.
|
1418 |
+
*
|
1419 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1420 |
+
* deletion of the event. Optional. The default is False.
|
1421 |
+
*/
|
1422 |
+
public function delete($calendarId, $eventId, $optParams = array())
|
1423 |
+
{
|
1424 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1425 |
+
$params = array_merge($params, $optParams);
|
1426 |
+
return $this->call('delete', array($params));
|
1427 |
+
}
|
1428 |
+
|
1429 |
+
/**
|
1430 |
+
* Returns an event. (events.get)
|
1431 |
+
*
|
1432 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1433 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1434 |
+
* the currently logged in user, use the "primary" keyword.
|
1435 |
+
* @param string $eventId Event identifier.
|
1436 |
+
* @param array $optParams Optional parameters.
|
1437 |
+
*
|
1438 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1439 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1440 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1441 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1442 |
+
* handle the absence of an email address value in the mentioned places.
|
1443 |
+
* Optional. The default is False.
|
1444 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1445 |
+
* response. If there are more than the specified number of attendees, only the
|
1446 |
+
* participant is returned. Optional.
|
1447 |
+
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1448 |
+
* default is the time zone of the calendar.
|
1449 |
+
* @return Google_Service_Calendar_Event
|
1450 |
+
*/
|
1451 |
+
public function get($calendarId, $eventId, $optParams = array())
|
1452 |
+
{
|
1453 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1454 |
+
$params = array_merge($params, $optParams);
|
1455 |
+
return $this->call('get', array($params), "Google_Service_Calendar_Event");
|
1456 |
+
}
|
1457 |
+
|
1458 |
+
/**
|
1459 |
+
* Imports an event. This operation is used to add a private copy of an existing
|
1460 |
+
* event to a calendar. (events.import)
|
1461 |
+
*
|
1462 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1463 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1464 |
+
* the currently logged in user, use the "primary" keyword.
|
1465 |
+
* @param Google_Event $postBody
|
1466 |
+
* @param array $optParams Optional parameters.
|
1467 |
+
*
|
1468 |
+
* @opt_param bool supportsAttachments Whether API client performing operation
|
1469 |
+
* supports event attachments. Optional. The default is False.
|
1470 |
+
* @return Google_Service_Calendar_Event
|
1471 |
+
*/
|
1472 |
+
public function import($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1473 |
+
{
|
1474 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1475 |
+
$params = array_merge($params, $optParams);
|
1476 |
+
return $this->call('import', array($params), "Google_Service_Calendar_Event");
|
1477 |
+
}
|
1478 |
+
|
1479 |
+
/**
|
1480 |
+
* Creates an event. (events.insert)
|
1481 |
+
*
|
1482 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1483 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1484 |
+
* the currently logged in user, use the "primary" keyword.
|
1485 |
+
* @param Google_Event $postBody
|
1486 |
+
* @param array $optParams Optional parameters.
|
1487 |
+
*
|
1488 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1489 |
+
* response. If there are more than the specified number of attendees, only the
|
1490 |
+
* participant is returned. Optional.
|
1491 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1492 |
+
* creation of the new event. Optional. The default is False.
|
1493 |
+
* @opt_param bool supportsAttachments Whether API client performing operation
|
1494 |
+
* supports event attachments. Optional. The default is False.
|
1495 |
+
* @return Google_Service_Calendar_Event
|
1496 |
+
*/
|
1497 |
+
public function insert($calendarId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1498 |
+
{
|
1499 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1500 |
+
$params = array_merge($params, $optParams);
|
1501 |
+
return $this->call('insert', array($params), "Google_Service_Calendar_Event");
|
1502 |
+
}
|
1503 |
+
|
1504 |
+
/**
|
1505 |
+
* Returns instances of the specified recurring event. (events.instances)
|
1506 |
+
*
|
1507 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1508 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1509 |
+
* the currently logged in user, use the "primary" keyword.
|
1510 |
+
* @param string $eventId Recurring event identifier.
|
1511 |
+
* @param array $optParams Optional parameters.
|
1512 |
+
*
|
1513 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1514 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1515 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1516 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1517 |
+
* handle the absence of an email address value in the mentioned places.
|
1518 |
+
* Optional. The default is False.
|
1519 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1520 |
+
* response. If there are more than the specified number of attendees, only the
|
1521 |
+
* participant is returned. Optional.
|
1522 |
+
* @opt_param int maxResults Maximum number of events returned on one result
|
1523 |
+
* page. By default the value is 250 events. The page size can never be larger
|
1524 |
+
* than 2500 events. Optional.
|
1525 |
+
* @opt_param string originalStart The original start time of the instance in
|
1526 |
+
* the result. Optional.
|
1527 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1528 |
+
* Optional.
|
1529 |
+
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1530 |
+
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1531 |
+
* will still be included if singleEvents is False. Optional. The default is
|
1532 |
+
* False.
|
1533 |
+
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1534 |
+
* to filter by. Optional. The default is not to filter by start time. Must be
|
1535 |
+
* an RFC3339 timestamp with mandatory time zone offset.
|
1536 |
+
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1537 |
+
* filter by. Optional. The default is not to filter by end time. Must be an
|
1538 |
+
* RFC3339 timestamp with mandatory time zone offset.
|
1539 |
+
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1540 |
+
* default is the time zone of the calendar.
|
1541 |
+
* @return Google_Service_Calendar_Events
|
1542 |
+
*/
|
1543 |
+
public function instances($calendarId, $eventId, $optParams = array())
|
1544 |
+
{
|
1545 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId);
|
1546 |
+
$params = array_merge($params, $optParams);
|
1547 |
+
return $this->call('instances', array($params), "Google_Service_Calendar_Events");
|
1548 |
+
}
|
1549 |
+
|
1550 |
+
/**
|
1551 |
+
* Returns events on the specified calendar. (events.listEvents)
|
1552 |
+
*
|
1553 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1554 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1555 |
+
* the currently logged in user, use the "primary" keyword.
|
1556 |
+
* @param array $optParams Optional parameters.
|
1557 |
+
*
|
1558 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1559 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1560 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1561 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1562 |
+
* handle the absence of an email address value in the mentioned places.
|
1563 |
+
* Optional. The default is False.
|
1564 |
+
* @opt_param string iCalUID Specifies event ID in the iCalendar format to be
|
1565 |
+
* included in the response. Optional.
|
1566 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1567 |
+
* response. If there are more than the specified number of attendees, only the
|
1568 |
+
* participant is returned. Optional.
|
1569 |
+
* @opt_param int maxResults Maximum number of events returned on one result
|
1570 |
+
* page. By default the value is 250 events. The page size can never be larger
|
1571 |
+
* than 2500 events. Optional.
|
1572 |
+
* @opt_param string orderBy The order of the events returned in the result.
|
1573 |
+
* Optional. The default is an unspecified, stable order.
|
1574 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1575 |
+
* Optional.
|
1576 |
+
* @opt_param string privateExtendedProperty Extended properties constraint
|
1577 |
+
* specified as propertyName=value. Matches only private properties. This
|
1578 |
+
* parameter might be repeated multiple times to return events that match all
|
1579 |
+
* given constraints.
|
1580 |
+
* @opt_param string q Free text search terms to find events that match these
|
1581 |
+
* terms in any field, except for extended properties. Optional.
|
1582 |
+
* @opt_param string sharedExtendedProperty Extended properties constraint
|
1583 |
+
* specified as propertyName=value. Matches only shared properties. This
|
1584 |
+
* parameter might be repeated multiple times to return events that match all
|
1585 |
+
* given constraints.
|
1586 |
+
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1587 |
+
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1588 |
+
* (but not the underlying recurring event) will still be included if
|
1589 |
+
* showDeleted and singleEvents are both False. If showDeleted and singleEvents
|
1590 |
+
* are both True, only single instances of deleted events (but not the
|
1591 |
+
* underlying recurring events) are returned. Optional. The default is False.
|
1592 |
+
* @opt_param bool showHiddenInvitations Whether to include hidden invitations
|
1593 |
+
* in the result. Optional. The default is False.
|
1594 |
+
* @opt_param bool singleEvents Whether to expand recurring events into
|
1595 |
+
* instances and only return single one-off events and instances of recurring
|
1596 |
+
* events, but not the underlying recurring events themselves. Optional. The
|
1597 |
+
* default is False.
|
1598 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1599 |
+
* returned on the last page of results from the previous list request. It makes
|
1600 |
+
* the result of this list request contain only entries that have changed since
|
1601 |
+
* then. All events deleted since the previous list request will always be in
|
1602 |
+
* the result set and it is not allowed to set showDeleted to False. There are
|
1603 |
+
* several query parameters that cannot be specified together with nextSyncToken
|
1604 |
+
* to ensure consistency of the client state.
|
1605 |
+
*
|
1606 |
+
* These are: - iCalUID - orderBy - privateExtendedProperty - q -
|
1607 |
+
* sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
|
1608 |
+
* expires, the server will respond with a 410 GONE response code and the client
|
1609 |
+
* should clear its storage and perform a full synchronization without any
|
1610 |
+
* syncToken. Learn more about incremental synchronization. Optional. The
|
1611 |
+
* default is to return all entries.
|
1612 |
+
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1613 |
+
* to filter by. Optional. The default is not to filter by start time. Must be
|
1614 |
+
* an RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1615 |
+
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1616 |
+
* but will be ignored.
|
1617 |
+
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1618 |
+
* filter by. Optional. The default is not to filter by end time. Must be an
|
1619 |
+
* RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1620 |
+
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1621 |
+
* but will be ignored.
|
1622 |
+
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1623 |
+
* default is the time zone of the calendar.
|
1624 |
+
* @opt_param string updatedMin Lower bound for an event's last modification
|
1625 |
+
* time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
|
1626 |
+
* since this time will always be included regardless of showDeleted. Optional.
|
1627 |
+
* The default is not to filter by last modification time.
|
1628 |
+
* @return Google_Service_Calendar_Events
|
1629 |
+
*/
|
1630 |
+
public function listEvents($calendarId, $optParams = array())
|
1631 |
+
{
|
1632 |
+
$params = array('calendarId' => $calendarId);
|
1633 |
+
$params = array_merge($params, $optParams);
|
1634 |
+
return $this->call('list', array($params), "Google_Service_Calendar_Events");
|
1635 |
+
}
|
1636 |
+
|
1637 |
+
/**
|
1638 |
+
* Moves an event to another calendar, i.e. changes an event's organizer.
|
1639 |
+
* (events.move)
|
1640 |
+
*
|
1641 |
+
* @param string $calendarId Calendar identifier of the source calendar where
|
1642 |
+
* the event currently is on.
|
1643 |
+
* @param string $eventId Event identifier.
|
1644 |
+
* @param string $destination Calendar identifier of the target calendar where
|
1645 |
+
* the event is to be moved to.
|
1646 |
+
* @param array $optParams Optional parameters.
|
1647 |
+
*
|
1648 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1649 |
+
* change of the event's organizer. Optional. The default is False.
|
1650 |
+
* @return Google_Service_Calendar_Event
|
1651 |
+
*/
|
1652 |
+
public function move($calendarId, $eventId, $destination, $optParams = array())
|
1653 |
+
{
|
1654 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'destination' => $destination);
|
1655 |
+
$params = array_merge($params, $optParams);
|
1656 |
+
return $this->call('move', array($params), "Google_Service_Calendar_Event");
|
1657 |
+
}
|
1658 |
+
|
1659 |
+
/**
|
1660 |
+
* Updates an event. This method supports patch semantics. (events.patch)
|
1661 |
+
*
|
1662 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1663 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1664 |
+
* the currently logged in user, use the "primary" keyword.
|
1665 |
+
* @param string $eventId Event identifier.
|
1666 |
+
* @param Google_Event $postBody
|
1667 |
+
* @param array $optParams Optional parameters.
|
1668 |
+
*
|
1669 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1670 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1671 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1672 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1673 |
+
* handle the absence of an email address value in the mentioned places.
|
1674 |
+
* Optional. The default is False.
|
1675 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1676 |
+
* response. If there are more than the specified number of attendees, only the
|
1677 |
+
* participant is returned. Optional.
|
1678 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1679 |
+
* event update (e.g. attendee's responses, title changes, etc.). Optional. The
|
1680 |
+
* default is False.
|
1681 |
+
* @opt_param bool supportsAttachments Whether API client performing operation
|
1682 |
+
* supports event attachments. Optional. The default is False.
|
1683 |
+
* @return Google_Service_Calendar_Event
|
1684 |
+
*/
|
1685 |
+
public function patch($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1686 |
+
{
|
1687 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
|
1688 |
+
$params = array_merge($params, $optParams);
|
1689 |
+
return $this->call('patch', array($params), "Google_Service_Calendar_Event");
|
1690 |
+
}
|
1691 |
+
|
1692 |
+
/**
|
1693 |
+
* Creates an event based on a simple text string. (events.quickAdd)
|
1694 |
+
*
|
1695 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1696 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1697 |
+
* the currently logged in user, use the "primary" keyword.
|
1698 |
+
* @param string $text The text describing the event to be created.
|
1699 |
+
* @param array $optParams Optional parameters.
|
1700 |
+
*
|
1701 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1702 |
+
* creation of the event. Optional. The default is False.
|
1703 |
+
* @return Google_Service_Calendar_Event
|
1704 |
+
*/
|
1705 |
+
public function quickAdd($calendarId, $text, $optParams = array())
|
1706 |
+
{
|
1707 |
+
$params = array('calendarId' => $calendarId, 'text' => $text);
|
1708 |
+
$params = array_merge($params, $optParams);
|
1709 |
+
return $this->call('quickAdd', array($params), "Google_Service_Calendar_Event");
|
1710 |
+
}
|
1711 |
+
|
1712 |
+
/**
|
1713 |
+
* Updates an event. (events.update)
|
1714 |
+
*
|
1715 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1716 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1717 |
+
* the currently logged in user, use the "primary" keyword.
|
1718 |
+
* @param string $eventId Event identifier.
|
1719 |
+
* @param Google_Event $postBody
|
1720 |
+
* @param array $optParams Optional parameters.
|
1721 |
+
*
|
1722 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1723 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1724 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1725 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1726 |
+
* handle the absence of an email address value in the mentioned places.
|
1727 |
+
* Optional. The default is False.
|
1728 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1729 |
+
* response. If there are more than the specified number of attendees, only the
|
1730 |
+
* participant is returned. Optional.
|
1731 |
+
* @opt_param bool sendNotifications Whether to send notifications about the
|
1732 |
+
* event update (e.g. attendee's responses, title changes, etc.). Optional. The
|
1733 |
+
* default is False.
|
1734 |
+
* @opt_param bool supportsAttachments Whether API client performing operation
|
1735 |
+
* supports event attachments. Optional. The default is False.
|
1736 |
+
* @return Google_Service_Calendar_Event
|
1737 |
+
*/
|
1738 |
+
public function update($calendarId, $eventId, Google_Service_Calendar_Event $postBody, $optParams = array())
|
1739 |
+
{
|
1740 |
+
$params = array('calendarId' => $calendarId, 'eventId' => $eventId, 'postBody' => $postBody);
|
1741 |
+
$params = array_merge($params, $optParams);
|
1742 |
+
return $this->call('update', array($params), "Google_Service_Calendar_Event");
|
1743 |
+
}
|
1744 |
+
|
1745 |
+
/**
|
1746 |
+
* Watch for changes to Events resources. (events.watch)
|
1747 |
+
*
|
1748 |
+
* @param string $calendarId Calendar identifier. To retrieve calendar IDs call
|
1749 |
+
* the calendarList.list method. If you want to access the primary calendar of
|
1750 |
+
* the currently logged in user, use the "primary" keyword.
|
1751 |
+
* @param Google_Channel $postBody
|
1752 |
+
* @param array $optParams Optional parameters.
|
1753 |
+
*
|
1754 |
+
* @opt_param bool alwaysIncludeEmail Whether to always include a value in the
|
1755 |
+
* email field for the organizer, creator and attendees, even if no real email
|
1756 |
+
* is available (i.e. a generated, non-working value will be provided). The use
|
1757 |
+
* of this option is discouraged and should only be used by clients which cannot
|
1758 |
+
* handle the absence of an email address value in the mentioned places.
|
1759 |
+
* Optional. The default is False.
|
1760 |
+
* @opt_param string iCalUID Specifies event ID in the iCalendar format to be
|
1761 |
+
* included in the response. Optional.
|
1762 |
+
* @opt_param int maxAttendees The maximum number of attendees to include in the
|
1763 |
+
* response. If there are more than the specified number of attendees, only the
|
1764 |
+
* participant is returned. Optional.
|
1765 |
+
* @opt_param int maxResults Maximum number of events returned on one result
|
1766 |
+
* page. By default the value is 250 events. The page size can never be larger
|
1767 |
+
* than 2500 events. Optional.
|
1768 |
+
* @opt_param string orderBy The order of the events returned in the result.
|
1769 |
+
* Optional. The default is an unspecified, stable order.
|
1770 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1771 |
+
* Optional.
|
1772 |
+
* @opt_param string privateExtendedProperty Extended properties constraint
|
1773 |
+
* specified as propertyName=value. Matches only private properties. This
|
1774 |
+
* parameter might be repeated multiple times to return events that match all
|
1775 |
+
* given constraints.
|
1776 |
+
* @opt_param string q Free text search terms to find events that match these
|
1777 |
+
* terms in any field, except for extended properties. Optional.
|
1778 |
+
* @opt_param string sharedExtendedProperty Extended properties constraint
|
1779 |
+
* specified as propertyName=value. Matches only shared properties. This
|
1780 |
+
* parameter might be repeated multiple times to return events that match all
|
1781 |
+
* given constraints.
|
1782 |
+
* @opt_param bool showDeleted Whether to include deleted events (with status
|
1783 |
+
* equals "cancelled") in the result. Cancelled instances of recurring events
|
1784 |
+
* (but not the underlying recurring event) will still be included if
|
1785 |
+
* showDeleted and singleEvents are both False. If showDeleted and singleEvents
|
1786 |
+
* are both True, only single instances of deleted events (but not the
|
1787 |
+
* underlying recurring events) are returned. Optional. The default is False.
|
1788 |
+
* @opt_param bool showHiddenInvitations Whether to include hidden invitations
|
1789 |
+
* in the result. Optional. The default is False.
|
1790 |
+
* @opt_param bool singleEvents Whether to expand recurring events into
|
1791 |
+
* instances and only return single one-off events and instances of recurring
|
1792 |
+
* events, but not the underlying recurring events themselves. Optional. The
|
1793 |
+
* default is False.
|
1794 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1795 |
+
* returned on the last page of results from the previous list request. It makes
|
1796 |
+
* the result of this list request contain only entries that have changed since
|
1797 |
+
* then. All events deleted since the previous list request will always be in
|
1798 |
+
* the result set and it is not allowed to set showDeleted to False. There are
|
1799 |
+
* several query parameters that cannot be specified together with nextSyncToken
|
1800 |
+
* to ensure consistency of the client state.
|
1801 |
+
*
|
1802 |
+
* These are: - iCalUID - orderBy - privateExtendedProperty - q -
|
1803 |
+
* sharedExtendedProperty - timeMin - timeMax - updatedMin If the syncToken
|
1804 |
+
* expires, the server will respond with a 410 GONE response code and the client
|
1805 |
+
* should clear its storage and perform a full synchronization without any
|
1806 |
+
* syncToken. Learn more about incremental synchronization. Optional. The
|
1807 |
+
* default is to return all entries.
|
1808 |
+
* @opt_param string timeMax Upper bound (exclusive) for an event's start time
|
1809 |
+
* to filter by. Optional. The default is not to filter by start time. Must be
|
1810 |
+
* an RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1811 |
+
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1812 |
+
* but will be ignored.
|
1813 |
+
* @opt_param string timeMin Lower bound (inclusive) for an event's end time to
|
1814 |
+
* filter by. Optional. The default is not to filter by end time. Must be an
|
1815 |
+
* RFC3339 timestamp with mandatory time zone offset, e.g.,
|
1816 |
+
* 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided
|
1817 |
+
* but will be ignored.
|
1818 |
+
* @opt_param string timeZone Time zone used in the response. Optional. The
|
1819 |
+
* default is the time zone of the calendar.
|
1820 |
+
* @opt_param string updatedMin Lower bound for an event's last modification
|
1821 |
+
* time (as a RFC3339 timestamp) to filter by. When specified, entries deleted
|
1822 |
+
* since this time will always be included regardless of showDeleted. Optional.
|
1823 |
+
* The default is not to filter by last modification time.
|
1824 |
+
* @return Google_Service_Calendar_Channel
|
1825 |
+
*/
|
1826 |
+
public function watch($calendarId, Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1827 |
+
{
|
1828 |
+
$params = array('calendarId' => $calendarId, 'postBody' => $postBody);
|
1829 |
+
$params = array_merge($params, $optParams);
|
1830 |
+
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1831 |
+
}
|
1832 |
+
}
|
1833 |
+
|
1834 |
+
/**
|
1835 |
+
* The "freebusy" collection of methods.
|
1836 |
+
* Typical usage is:
|
1837 |
+
* <code>
|
1838 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1839 |
+
* $freebusy = $calendarService->freebusy;
|
1840 |
+
* </code>
|
1841 |
+
*/
|
1842 |
+
class Google_Service_Calendar_Freebusy_Resource extends Google_Service_Resource
|
1843 |
+
{
|
1844 |
+
|
1845 |
+
/**
|
1846 |
+
* Returns free/busy information for a set of calendars. (freebusy.query)
|
1847 |
+
*
|
1848 |
+
* @param Google_FreeBusyRequest $postBody
|
1849 |
+
* @param array $optParams Optional parameters.
|
1850 |
+
* @return Google_Service_Calendar_FreeBusyResponse
|
1851 |
+
*/
|
1852 |
+
public function query(Google_Service_Calendar_FreeBusyRequest $postBody, $optParams = array())
|
1853 |
+
{
|
1854 |
+
$params = array('postBody' => $postBody);
|
1855 |
+
$params = array_merge($params, $optParams);
|
1856 |
+
return $this->call('query', array($params), "Google_Service_Calendar_FreeBusyResponse");
|
1857 |
+
}
|
1858 |
+
}
|
1859 |
+
|
1860 |
+
/**
|
1861 |
+
* The "settings" collection of methods.
|
1862 |
+
* Typical usage is:
|
1863 |
+
* <code>
|
1864 |
+
* $calendarService = new Google_Service_Calendar(...);
|
1865 |
+
* $settings = $calendarService->settings;
|
1866 |
+
* </code>
|
1867 |
+
*/
|
1868 |
+
class Google_Service_Calendar_Settings_Resource extends Google_Service_Resource
|
1869 |
+
{
|
1870 |
+
|
1871 |
+
/**
|
1872 |
+
* Returns a single user setting. (settings.get)
|
1873 |
+
*
|
1874 |
+
* @param string $setting The id of the user setting.
|
1875 |
+
* @param array $optParams Optional parameters.
|
1876 |
+
* @return Google_Service_Calendar_Setting
|
1877 |
+
*/
|
1878 |
+
public function get($setting, $optParams = array())
|
1879 |
+
{
|
1880 |
+
$params = array('setting' => $setting);
|
1881 |
+
$params = array_merge($params, $optParams);
|
1882 |
+
return $this->call('get', array($params), "Google_Service_Calendar_Setting");
|
1883 |
+
}
|
1884 |
+
|
1885 |
+
/**
|
1886 |
+
* Returns all user settings for the authenticated user. (settings.listSettings)
|
1887 |
+
*
|
1888 |
+
* @param array $optParams Optional parameters.
|
1889 |
+
*
|
1890 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
1891 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
1892 |
+
* than 250 entries. Optional.
|
1893 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1894 |
+
* Optional.
|
1895 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1896 |
+
* returned on the last page of results from the previous list request. It makes
|
1897 |
+
* the result of this list request contain only entries that have changed since
|
1898 |
+
* then. If the syncToken expires, the server will respond with a 410 GONE
|
1899 |
+
* response code and the client should clear its storage and perform a full
|
1900 |
+
* synchronization without any syncToken. Learn more about incremental
|
1901 |
+
* synchronization. Optional. The default is to return all entries.
|
1902 |
+
* @return Google_Service_Calendar_Settings
|
1903 |
+
*/
|
1904 |
+
public function listSettings($optParams = array())
|
1905 |
+
{
|
1906 |
+
$params = array();
|
1907 |
+
$params = array_merge($params, $optParams);
|
1908 |
+
return $this->call('list', array($params), "Google_Service_Calendar_Settings");
|
1909 |
+
}
|
1910 |
+
|
1911 |
+
/**
|
1912 |
+
* Watch for changes to Settings resources. (settings.watch)
|
1913 |
+
*
|
1914 |
+
* @param Google_Channel $postBody
|
1915 |
+
* @param array $optParams Optional parameters.
|
1916 |
+
*
|
1917 |
+
* @opt_param int maxResults Maximum number of entries returned on one result
|
1918 |
+
* page. By default the value is 100 entries. The page size can never be larger
|
1919 |
+
* than 250 entries. Optional.
|
1920 |
+
* @opt_param string pageToken Token specifying which result page to return.
|
1921 |
+
* Optional.
|
1922 |
+
* @opt_param string syncToken Token obtained from the nextSyncToken field
|
1923 |
+
* returned on the last page of results from the previous list request. It makes
|
1924 |
+
* the result of this list request contain only entries that have changed since
|
1925 |
+
* then. If the syncToken expires, the server will respond with a 410 GONE
|
1926 |
+
* response code and the client should clear its storage and perform a full
|
1927 |
+
* synchronization without any syncToken. Learn more about incremental
|
1928 |
+
* synchronization. Optional. The default is to return all entries.
|
1929 |
+
* @return Google_Service_Calendar_Channel
|
1930 |
+
*/
|
1931 |
+
public function watch(Google_Service_Calendar_Channel $postBody, $optParams = array())
|
1932 |
+
{
|
1933 |
+
$params = array('postBody' => $postBody);
|
1934 |
+
$params = array_merge($params, $optParams);
|
1935 |
+
return $this->call('watch', array($params), "Google_Service_Calendar_Channel");
|
1936 |
+
}
|
1937 |
+
}
|
1938 |
+
|
1939 |
+
|
1940 |
+
|
1941 |
+
|
1942 |
+
class Google_Service_Calendar_Acl extends Google_Collection
|
1943 |
+
{
|
1944 |
+
protected $collection_key = 'items';
|
1945 |
+
protected $internal_gapi_mappings = array(
|
1946 |
+
);
|
1947 |
+
public $etag;
|
1948 |
+
protected $itemsType = 'Google_Service_Calendar_AclRule';
|
1949 |
+
protected $itemsDataType = 'array';
|
1950 |
+
public $kind;
|
1951 |
+
public $nextPageToken;
|
1952 |
+
public $nextSyncToken;
|
1953 |
+
|
1954 |
+
|
1955 |
+
public function setEtag($etag)
|
1956 |
+
{
|
1957 |
+
$this->etag = $etag;
|
1958 |
+
}
|
1959 |
+
public function getEtag()
|
1960 |
+
{
|
1961 |
+
return $this->etag;
|
1962 |
+
}
|
1963 |
+
public function setItems($items)
|
1964 |
+
{
|
1965 |
+
$this->items = $items;
|
1966 |
+
}
|
1967 |
+
public function getItems()
|
1968 |
+
{
|
1969 |
+
return $this->items;
|
1970 |
+
}
|
1971 |
+
public function setKind($kind)
|
1972 |
+
{
|
1973 |
+
$this->kind = $kind;
|
1974 |
+
}
|
1975 |
+
public function getKind()
|
1976 |
+
{
|
1977 |
+
return $this->kind;
|
1978 |
+
}
|
1979 |
+
public function setNextPageToken($nextPageToken)
|
1980 |
+
{
|
1981 |
+
$this->nextPageToken = $nextPageToken;
|
1982 |
+
}
|
1983 |
+
public function getNextPageToken()
|
1984 |
+
{
|
1985 |
+
return $this->nextPageToken;
|
1986 |
+
}
|
1987 |
+
public function setNextSyncToken($nextSyncToken)
|
1988 |
+
{
|
1989 |
+
$this->nextSyncToken = $nextSyncToken;
|
1990 |
+
}
|
1991 |
+
public function getNextSyncToken()
|
1992 |
+
{
|
1993 |
+
return $this->nextSyncToken;
|
1994 |
+
}
|
1995 |
+
}
|
1996 |
+
|
1997 |
+
class Google_Service_Calendar_AclRule extends Google_Model
|
1998 |
+
{
|
1999 |
+
protected $internal_gapi_mappings = array(
|
2000 |
+
);
|
2001 |
+
public $etag;
|
2002 |
+
public $id;
|
2003 |
+
public $kind;
|
2004 |
+
public $role;
|
2005 |
+
protected $scopeType = 'Google_Service_Calendar_AclRuleScope';
|
2006 |
+
protected $scopeDataType = '';
|
2007 |
+
|
2008 |
+
|
2009 |
+
public function setEtag($etag)
|
2010 |
+
{
|
2011 |
+
$this->etag = $etag;
|
2012 |
+
}
|
2013 |
+
public function getEtag()
|
2014 |
+
{
|
2015 |
+
return $this->etag;
|
2016 |
+
}
|
2017 |
+
public function setId($id)
|
2018 |
+
{
|
2019 |
+
$this->id = $id;
|
2020 |
+
}
|
2021 |
+
public function getId()
|
2022 |
+
{
|
2023 |
+
return $this->id;
|
2024 |
+
}
|
2025 |
+
public function setKind($kind)
|
2026 |
+
{
|
2027 |
+
$this->kind = $kind;
|
2028 |
+
}
|
2029 |
+
public function getKind()
|
2030 |
+
{
|
2031 |
+
return $this->kind;
|
2032 |
+
}
|
2033 |
+
public function setRole($role)
|
2034 |
+
{
|
2035 |
+
$this->role = $role;
|
2036 |
+
}
|
2037 |
+
public function getRole()
|
2038 |
+
{
|
2039 |
+
return $this->role;
|
2040 |
+
}
|
2041 |
+
public function setScope(Google_Service_Calendar_AclRuleScope $scope)
|
2042 |
+
{
|
2043 |
+
$this->scope = $scope;
|
2044 |
+
}
|
2045 |
+
public function getScope()
|
2046 |
+
{
|
2047 |
+
return $this->scope;
|
2048 |
+
}
|
2049 |
+
}
|
2050 |
+
|
2051 |
+
class Google_Service_Calendar_AclRuleScope extends Google_Model
|
2052 |
+
{
|
2053 |
+
protected $internal_gapi_mappings = array(
|
2054 |
+
);
|
2055 |
+
public $type;
|
2056 |
+
public $value;
|
2057 |
+
|
2058 |
+
|
2059 |
+
public function setType($type)
|
2060 |
+
{
|
2061 |
+
$this->type = $type;
|
2062 |
+
}
|
2063 |
+
public function getType()
|
2064 |
+
{
|
2065 |
+
return $this->type;
|
2066 |
+
}
|
2067 |
+
public function setValue($value)
|
2068 |
+
{
|
2069 |
+
$this->value = $value;
|
2070 |
+
}
|
2071 |
+
public function getValue()
|
2072 |
+
{
|
2073 |
+
return $this->value;
|
2074 |
+
}
|
2075 |
+
}
|
2076 |
+
|
2077 |
+
class Google_Service_Calendar_Calendar extends Google_Model
|
2078 |
+
{
|
2079 |
+
protected $internal_gapi_mappings = array(
|
2080 |
+
);
|
2081 |
+
public $description;
|
2082 |
+
public $etag;
|
2083 |
+
public $id;
|
2084 |
+
public $kind;
|
2085 |
+
public $location;
|
2086 |
+
public $summary;
|
2087 |
+
public $timeZone;
|
2088 |
+
|
2089 |
+
|
2090 |
+
public function setDescription($description)
|
2091 |
+
{
|
2092 |
+
$this->description = $description;
|
2093 |
+
}
|
2094 |
+
public function getDescription()
|
2095 |
+
{
|
2096 |
+
return $this->description;
|
2097 |
+
}
|
2098 |
+
public function setEtag($etag)
|
2099 |
+
{
|
2100 |
+
$this->etag = $etag;
|
2101 |
+
}
|
2102 |
+
public function getEtag()
|
2103 |
+
{
|
2104 |
+
return $this->etag;
|
2105 |
+
}
|
2106 |
+
public function setId($id)
|
2107 |
+
{
|
2108 |
+
$this->id = $id;
|
2109 |
+
}
|
2110 |
+
public function getId()
|
2111 |
+
{
|
2112 |
+
return $this->id;
|
2113 |
+
}
|
2114 |
+
public function setKind($kind)
|
2115 |
+
{
|
2116 |
+
$this->kind = $kind;
|
2117 |
+
}
|
2118 |
+
public function getKind()
|
2119 |
+
{
|
2120 |
+
return $this->kind;
|
2121 |
+
}
|
2122 |
+
public function setLocation($location)
|
2123 |
+
{
|
2124 |
+
$this->location = $location;
|
2125 |
+
}
|
2126 |
+
public function getLocation()
|
2127 |
+
{
|
2128 |
+
return $this->location;
|
2129 |
+
}
|
2130 |
+
public function setSummary($summary)
|
2131 |
+
{
|
2132 |
+
$this->summary = $summary;
|
2133 |
+
}
|
2134 |
+
public function getSummary()
|
2135 |
+
{
|
2136 |
+
return $this->summary;
|
2137 |
+
}
|
2138 |
+
public function setTimeZone($timeZone)
|
2139 |
+
{
|
2140 |
+
$this->timeZone = $timeZone;
|
2141 |
+
}
|
2142 |
+
public function getTimeZone()
|
2143 |
+
{
|
2144 |
+
return $this->timeZone;
|
2145 |
+
}
|
2146 |
+
}
|
2147 |
+
|
2148 |
+
class Google_Service_Calendar_CalendarList extends Google_Collection
|
2149 |
+
{
|
2150 |
+
protected $collection_key = 'items';
|
2151 |
+
protected $internal_gapi_mappings = array(
|
2152 |
+
);
|
2153 |
+
public $etag;
|
2154 |
+
protected $itemsType = 'Google_Service_Calendar_CalendarListEntry';
|
2155 |
+
protected $itemsDataType = 'array';
|
2156 |
+
public $kind;
|
2157 |
+
public $nextPageToken;
|
2158 |
+
public $nextSyncToken;
|
2159 |
+
|
2160 |
+
|
2161 |
+
public function setEtag($etag)
|
2162 |
+
{
|
2163 |
+
$this->etag = $etag;
|
2164 |
+
}
|
2165 |
+
public function getEtag()
|
2166 |
+
{
|
2167 |
+
return $this->etag;
|
2168 |
+
}
|
2169 |
+
public function setItems($items)
|
2170 |
+
{
|
2171 |
+
$this->items = $items;
|
2172 |
+
}
|
2173 |
+
public function getItems()
|
2174 |
+
{
|
2175 |
+
return $this->items;
|
2176 |
+
}
|
2177 |
+
public function setKind($kind)
|
2178 |
+
{
|
2179 |
+
$this->kind = $kind;
|
2180 |
+
}
|
2181 |
+
public function getKind()
|
2182 |
+
{
|
2183 |
+
return $this->kind;
|
2184 |
+
}
|
2185 |
+
public function setNextPageToken($nextPageToken)
|
2186 |
+
{
|
2187 |
+
$this->nextPageToken = $nextPageToken;
|
2188 |
+
}
|
2189 |
+
public function getNextPageToken()
|
2190 |
+
{
|
2191 |
+
return $this->nextPageToken;
|
2192 |
+
}
|
2193 |
+
public function setNextSyncToken($nextSyncToken)
|
2194 |
+
{
|
2195 |
+
$this->nextSyncToken = $nextSyncToken;
|
2196 |
+
}
|
2197 |
+
public function getNextSyncToken()
|
2198 |
+
{
|
2199 |
+
return $this->nextSyncToken;
|
2200 |
+
}
|
2201 |
+
}
|
2202 |
+
|
2203 |
+
class Google_Service_Calendar_CalendarListEntry extends Google_Collection
|
2204 |
+
{
|
2205 |
+
protected $collection_key = 'defaultReminders';
|
2206 |
+
protected $internal_gapi_mappings = array(
|
2207 |
+
);
|
2208 |
+
public $accessRole;
|
2209 |
+
public $backgroundColor;
|
2210 |
+
public $colorId;
|
2211 |
+
protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
|
2212 |
+
protected $defaultRemindersDataType = 'array';
|
2213 |
+
public $deleted;
|
2214 |
+
public $description;
|
2215 |
+
public $etag;
|
2216 |
+
public $foregroundColor;
|
2217 |
+
public $hidden;
|
2218 |
+
public $id;
|
2219 |
+
public $kind;
|
2220 |
+
public $location;
|
2221 |
+
protected $notificationSettingsType = 'Google_Service_Calendar_CalendarListEntryNotificationSettings';
|
2222 |
+
protected $notificationSettingsDataType = '';
|
2223 |
+
public $primary;
|
2224 |
+
public $selected;
|
2225 |
+
public $summary;
|
2226 |
+
public $summaryOverride;
|
2227 |
+
public $timeZone;
|
2228 |
+
|
2229 |
+
|
2230 |
+
public function setAccessRole($accessRole)
|
2231 |
+
{
|
2232 |
+
$this->accessRole = $accessRole;
|
2233 |
+
}
|
2234 |
+
public function getAccessRole()
|
2235 |
+
{
|
2236 |
+
return $this->accessRole;
|
2237 |
+
}
|
2238 |
+
public function setBackgroundColor($backgroundColor)
|
2239 |
+
{
|
2240 |
+
$this->backgroundColor = $backgroundColor;
|
2241 |
+
}
|
2242 |
+
public function getBackgroundColor()
|
2243 |
+
{
|
2244 |
+
return $this->backgroundColor;
|
2245 |
+
}
|
2246 |
+
public function setColorId($colorId)
|
2247 |
+
{
|
2248 |
+
$this->colorId = $colorId;
|
2249 |
+
}
|
2250 |
+
public function getColorId()
|
2251 |
+
{
|
2252 |
+
return $this->colorId;
|
2253 |
+
}
|
2254 |
+
public function setDefaultReminders($defaultReminders)
|
2255 |
+
{
|
2256 |
+
$this->defaultReminders = $defaultReminders;
|
2257 |
+
}
|
2258 |
+
public function getDefaultReminders()
|
2259 |
+
{
|
2260 |
+
return $this->defaultReminders;
|
2261 |
+
}
|
2262 |
+
public function setDeleted($deleted)
|
2263 |
+
{
|
2264 |
+
$this->deleted = $deleted;
|
2265 |
+
}
|
2266 |
+
public function getDeleted()
|
2267 |
+
{
|
2268 |
+
return $this->deleted;
|
2269 |
+
}
|
2270 |
+
public function setDescription($description)
|
2271 |
+
{
|
2272 |
+
$this->description = $description;
|
2273 |
+
}
|
2274 |
+
public function getDescription()
|
2275 |
+
{
|
2276 |
+
return $this->description;
|
2277 |
+
}
|
2278 |
+
public function setEtag($etag)
|
2279 |
+
{
|
2280 |
+
$this->etag = $etag;
|
2281 |
+
}
|
2282 |
+
public function getEtag()
|
2283 |
+
{
|
2284 |
+
return $this->etag;
|
2285 |
+
}
|
2286 |
+
public function setForegroundColor($foregroundColor)
|
2287 |
+
{
|
2288 |
+
$this->foregroundColor = $foregroundColor;
|
2289 |
+
}
|
2290 |
+
public function getForegroundColor()
|
2291 |
+
{
|
2292 |
+
return $this->foregroundColor;
|
2293 |
+
}
|
2294 |
+
public function setHidden($hidden)
|
2295 |
+
{
|
2296 |
+
$this->hidden = $hidden;
|
2297 |
+
}
|
2298 |
+
public function getHidden()
|
2299 |
+
{
|
2300 |
+
return $this->hidden;
|
2301 |
+
}
|
2302 |
+
public function setId($id)
|
2303 |
+
{
|
2304 |
+
$this->id = $id;
|
2305 |
+
}
|
2306 |
+
public function getId()
|
2307 |
+
{
|
2308 |
+
return $this->id;
|
2309 |
+
}
|
2310 |
+
public function setKind($kind)
|
2311 |
+
{
|
2312 |
+
$this->kind = $kind;
|
2313 |
+
}
|
2314 |
+
public function getKind()
|
2315 |
+
{
|
2316 |
+
return $this->kind;
|
2317 |
+
}
|
2318 |
+
public function setLocation($location)
|
2319 |
+
{
|
2320 |
+
$this->location = $location;
|
2321 |
+
}
|
2322 |
+
public function getLocation()
|
2323 |
+
{
|
2324 |
+
return $this->location;
|
2325 |
+
}
|
2326 |
+
public function setNotificationSettings(Google_Service_Calendar_CalendarListEntryNotificationSettings $notificationSettings)
|
2327 |
+
{
|
2328 |
+
$this->notificationSettings = $notificationSettings;
|
2329 |
+
}
|
2330 |
+
public function getNotificationSettings()
|
2331 |
+
{
|
2332 |
+
return $this->notificationSettings;
|
2333 |
+
}
|
2334 |
+
public function setPrimary($primary)
|
2335 |
+
{
|
2336 |
+
$this->primary = $primary;
|
2337 |
+
}
|
2338 |
+
public function getPrimary()
|
2339 |
+
{
|
2340 |
+
return $this->primary;
|
2341 |
+
}
|
2342 |
+
public function setSelected($selected)
|
2343 |
+
{
|
2344 |
+
$this->selected = $selected;
|
2345 |
+
}
|
2346 |
+
public function getSelected()
|
2347 |
+
{
|
2348 |
+
return $this->selected;
|
2349 |
+
}
|
2350 |
+
public function setSummary($summary)
|
2351 |
+
{
|
2352 |
+
$this->summary = $summary;
|
2353 |
+
}
|
2354 |
+
public function getSummary()
|
2355 |
+
{
|
2356 |
+
return $this->summary;
|
2357 |
+
}
|
2358 |
+
public function setSummaryOverride($summaryOverride)
|
2359 |
+
{
|
2360 |
+
$this->summaryOverride = $summaryOverride;
|
2361 |
+
}
|
2362 |
+
public function getSummaryOverride()
|
2363 |
+
{
|
2364 |
+
return $this->summaryOverride;
|
2365 |
+
}
|
2366 |
+
public function setTimeZone($timeZone)
|
2367 |
+
{
|
2368 |
+
$this->timeZone = $timeZone;
|
2369 |
+
}
|
2370 |
+
public function getTimeZone()
|
2371 |
+
{
|
2372 |
+
return $this->timeZone;
|
2373 |
+
}
|
2374 |
+
}
|
2375 |
+
|
2376 |
+
class Google_Service_Calendar_CalendarListEntryNotificationSettings extends Google_Collection
|
2377 |
+
{
|
2378 |
+
protected $collection_key = 'notifications';
|
2379 |
+
protected $internal_gapi_mappings = array(
|
2380 |
+
);
|
2381 |
+
protected $notificationsType = 'Google_Service_Calendar_CalendarNotification';
|
2382 |
+
protected $notificationsDataType = 'array';
|
2383 |
+
|
2384 |
+
|
2385 |
+
public function setNotifications($notifications)
|
2386 |
+
{
|
2387 |
+
$this->notifications = $notifications;
|
2388 |
+
}
|
2389 |
+
public function getNotifications()
|
2390 |
+
{
|
2391 |
+
return $this->notifications;
|
2392 |
+
}
|
2393 |
+
}
|
2394 |
+
|
2395 |
+
class Google_Service_Calendar_CalendarNotification extends Google_Model
|
2396 |
+
{
|
2397 |
+
protected $internal_gapi_mappings = array(
|
2398 |
+
);
|
2399 |
+
public $method;
|
2400 |
+
public $type;
|
2401 |
+
|
2402 |
+
|
2403 |
+
public function setMethod($method)
|
2404 |
+
{
|
2405 |
+
$this->method = $method;
|
2406 |
+
}
|
2407 |
+
public function getMethod()
|
2408 |
+
{
|
2409 |
+
return $this->method;
|
2410 |
+
}
|
2411 |
+
public function setType($type)
|
2412 |
+
{
|
2413 |
+
$this->type = $type;
|
2414 |
+
}
|
2415 |
+
public function getType()
|
2416 |
+
{
|
2417 |
+
return $this->type;
|
2418 |
+
}
|
2419 |
+
}
|
2420 |
+
|
2421 |
+
class Google_Service_Calendar_Channel extends Google_Model
|
2422 |
+
{
|
2423 |
+
protected $internal_gapi_mappings = array(
|
2424 |
+
);
|
2425 |
+
public $address;
|
2426 |
+
public $expiration;
|
2427 |
+
public $id;
|
2428 |
+
public $kind;
|
2429 |
+
public $params;
|
2430 |
+
public $payload;
|
2431 |
+
public $resourceId;
|
2432 |
+
public $resourceUri;
|
2433 |
+
public $token;
|
2434 |
+
public $type;
|
2435 |
+
|
2436 |
+
|
2437 |
+
public function setAddress($address)
|
2438 |
+
{
|
2439 |
+
$this->address = $address;
|
2440 |
+
}
|
2441 |
+
public function getAddress()
|
2442 |
+
{
|
2443 |
+
return $this->address;
|
2444 |
+
}
|
2445 |
+
public function setExpiration($expiration)
|
2446 |
+
{
|
2447 |
+
$this->expiration = $expiration;
|
2448 |
+
}
|
2449 |
+
public function getExpiration()
|
2450 |
+
{
|
2451 |
+
return $this->expiration;
|
2452 |
+
}
|
2453 |
+
public function setId($id)
|
2454 |
+
{
|
2455 |
+
$this->id = $id;
|
2456 |
+
}
|
2457 |
+
public function getId()
|
2458 |
+
{
|
2459 |
+
return $this->id;
|
2460 |
+
}
|
2461 |
+
public function setKind($kind)
|
2462 |
+
{
|
2463 |
+
$this->kind = $kind;
|
2464 |
+
}
|
2465 |
+
public function getKind()
|
2466 |
+
{
|
2467 |
+
return $this->kind;
|
2468 |
+
}
|
2469 |
+
public function setParams($params)
|
2470 |
+
{
|
2471 |
+
$this->params = $params;
|
2472 |
+
}
|
2473 |
+
public function getParams()
|
2474 |
+
{
|
2475 |
+
return $this->params;
|
2476 |
+
}
|
2477 |
+
public function setPayload($payload)
|
2478 |
+
{
|
2479 |
+
$this->payload = $payload;
|
2480 |
+
}
|
2481 |
+
public function getPayload()
|
2482 |
+
{
|
2483 |
+
return $this->payload;
|
2484 |
+
}
|
2485 |
+
public function setResourceId($resourceId)
|
2486 |
+
{
|
2487 |
+
$this->resourceId = $resourceId;
|
2488 |
+
}
|
2489 |
+
public function getResourceId()
|
2490 |
+
{
|
2491 |
+
return $this->resourceId;
|
2492 |
+
}
|
2493 |
+
public function setResourceUri($resourceUri)
|
2494 |
+
{
|
2495 |
+
$this->resourceUri = $resourceUri;
|
2496 |
+
}
|
2497 |
+
public function getResourceUri()
|
2498 |
+
{
|
2499 |
+
return $this->resourceUri;
|
2500 |
+
}
|
2501 |
+
public function setToken($token)
|
2502 |
+
{
|
2503 |
+
$this->token = $token;
|
2504 |
+
}
|
2505 |
+
public function getToken()
|
2506 |
+
{
|
2507 |
+
return $this->token;
|
2508 |
+
}
|
2509 |
+
public function setType($type)
|
2510 |
+
{
|
2511 |
+
$this->type = $type;
|
2512 |
+
}
|
2513 |
+
public function getType()
|
2514 |
+
{
|
2515 |
+
return $this->type;
|
2516 |
+
}
|
2517 |
+
}
|
2518 |
+
|
2519 |
+
class Google_Service_Calendar_ColorDefinition extends Google_Model
|
2520 |
+
{
|
2521 |
+
protected $internal_gapi_mappings = array(
|
2522 |
+
);
|
2523 |
+
public $background;
|
2524 |
+
public $foreground;
|
2525 |
+
|
2526 |
+
|
2527 |
+
public function setBackground($background)
|
2528 |
+
{
|
2529 |
+
$this->background = $background;
|
2530 |
+
}
|
2531 |
+
public function getBackground()
|
2532 |
+
{
|
2533 |
+
return $this->background;
|
2534 |
+
}
|
2535 |
+
public function setForeground($foreground)
|
2536 |
+
{
|
2537 |
+
$this->foreground = $foreground;
|
2538 |
+
}
|
2539 |
+
public function getForeground()
|
2540 |
+
{
|
2541 |
+
return $this->foreground;
|
2542 |
+
}
|
2543 |
+
}
|
2544 |
+
|
2545 |
+
class Google_Service_Calendar_Colors extends Google_Model
|
2546 |
+
{
|
2547 |
+
protected $internal_gapi_mappings = array(
|
2548 |
+
);
|
2549 |
+
protected $calendarType = 'Google_Service_Calendar_ColorDefinition';
|
2550 |
+
protected $calendarDataType = 'map';
|
2551 |
+
protected $eventType = 'Google_Service_Calendar_ColorDefinition';
|
2552 |
+
protected $eventDataType = 'map';
|
2553 |
+
public $kind;
|
2554 |
+
public $updated;
|
2555 |
+
|
2556 |
+
|
2557 |
+
public function setCalendar($calendar)
|
2558 |
+
{
|
2559 |
+
$this->calendar = $calendar;
|
2560 |
+
}
|
2561 |
+
public function getCalendar()
|
2562 |
+
{
|
2563 |
+
return $this->calendar;
|
2564 |
+
}
|
2565 |
+
public function setEvent($event)
|
2566 |
+
{
|
2567 |
+
$this->event = $event;
|
2568 |
+
}
|
2569 |
+
public function getEvent()
|
2570 |
+
{
|
2571 |
+
return $this->event;
|
2572 |
+
}
|
2573 |
+
public function setKind($kind)
|
2574 |
+
{
|
2575 |
+
$this->kind = $kind;
|
2576 |
+
}
|
2577 |
+
public function getKind()
|
2578 |
+
{
|
2579 |
+
return $this->kind;
|
2580 |
+
}
|
2581 |
+
public function setUpdated($updated)
|
2582 |
+
{
|
2583 |
+
$this->updated = $updated;
|
2584 |
+
}
|
2585 |
+
public function getUpdated()
|
2586 |
+
{
|
2587 |
+
return $this->updated;
|
2588 |
+
}
|
2589 |
+
}
|
2590 |
+
|
2591 |
+
class Google_Service_Calendar_Error extends Google_Model
|
2592 |
+
{
|
2593 |
+
protected $internal_gapi_mappings = array(
|
2594 |
+
);
|
2595 |
+
public $domain;
|
2596 |
+
public $reason;
|
2597 |
+
|
2598 |
+
|
2599 |
+
public function setDomain($domain)
|
2600 |
+
{
|
2601 |
+
$this->domain = $domain;
|
2602 |
+
}
|
2603 |
+
public function getDomain()
|
2604 |
+
{
|
2605 |
+
return $this->domain;
|
2606 |
+
}
|
2607 |
+
public function setReason($reason)
|
2608 |
+
{
|
2609 |
+
$this->reason = $reason;
|
2610 |
+
}
|
2611 |
+
public function getReason()
|
2612 |
+
{
|
2613 |
+
return $this->reason;
|
2614 |
+
}
|
2615 |
+
}
|
2616 |
+
|
2617 |
+
class Google_Service_Calendar_Event extends Google_Collection
|
2618 |
+
{
|
2619 |
+
protected $collection_key = 'recurrence';
|
2620 |
+
protected $internal_gapi_mappings = array(
|
2621 |
+
);
|
2622 |
+
public $anyoneCanAddSelf;
|
2623 |
+
protected $attachmentsType = 'Google_Service_Calendar_EventAttachment';
|
2624 |
+
protected $attachmentsDataType = 'array';
|
2625 |
+
protected $attendeesType = 'Google_Service_Calendar_EventAttendee';
|
2626 |
+
protected $attendeesDataType = 'array';
|
2627 |
+
public $attendeesOmitted;
|
2628 |
+
public $colorId;
|
2629 |
+
public $created;
|
2630 |
+
protected $creatorType = 'Google_Service_Calendar_EventCreator';
|
2631 |
+
protected $creatorDataType = '';
|
2632 |
+
public $description;
|
2633 |
+
protected $endType = 'Google_Service_Calendar_EventDateTime';
|
2634 |
+
protected $endDataType = '';
|
2635 |
+
public $endTimeUnspecified;
|
2636 |
+
public $etag;
|
2637 |
+
protected $extendedPropertiesType = 'Google_Service_Calendar_EventExtendedProperties';
|
2638 |
+
protected $extendedPropertiesDataType = '';
|
2639 |
+
protected $gadgetType = 'Google_Service_Calendar_EventGadget';
|
2640 |
+
protected $gadgetDataType = '';
|
2641 |
+
public $guestsCanInviteOthers;
|
2642 |
+
public $guestsCanModify;
|
2643 |
+
public $guestsCanSeeOtherGuests;
|
2644 |
+
public $hangoutLink;
|
2645 |
+
public $htmlLink;
|
2646 |
+
public $iCalUID;
|
2647 |
+
public $id;
|
2648 |
+
public $kind;
|
2649 |
+
public $location;
|
2650 |
+
public $locked;
|
2651 |
+
protected $organizerType = 'Google_Service_Calendar_EventOrganizer';
|
2652 |
+
protected $organizerDataType = '';
|
2653 |
+
protected $originalStartTimeType = 'Google_Service_Calendar_EventDateTime';
|
2654 |
+
protected $originalStartTimeDataType = '';
|
2655 |
+
public $privateCopy;
|
2656 |
+
public $recurrence;
|
2657 |
+
public $recurringEventId;
|
2658 |
+
protected $remindersType = 'Google_Service_Calendar_EventReminders';
|
2659 |
+
protected $remindersDataType = '';
|
2660 |
+
public $sequence;
|
2661 |
+
protected $sourceType = 'Google_Service_Calendar_EventSource';
|
2662 |
+
protected $sourceDataType = '';
|
2663 |
+
protected $startType = 'Google_Service_Calendar_EventDateTime';
|
2664 |
+
protected $startDataType = '';
|
2665 |
+
public $status;
|
2666 |
+
public $summary;
|
2667 |
+
public $transparency;
|
2668 |
+
public $updated;
|
2669 |
+
public $visibility;
|
2670 |
+
|
2671 |
+
|
2672 |
+
public function setAnyoneCanAddSelf($anyoneCanAddSelf)
|
2673 |
+
{
|
2674 |
+
$this->anyoneCanAddSelf = $anyoneCanAddSelf;
|
2675 |
+
}
|
2676 |
+
public function getAnyoneCanAddSelf()
|
2677 |
+
{
|
2678 |
+
return $this->anyoneCanAddSelf;
|
2679 |
+
}
|
2680 |
+
public function setAttachments($attachments)
|
2681 |
+
{
|
2682 |
+
$this->attachments = $attachments;
|
2683 |
+
}
|
2684 |
+
public function getAttachments()
|
2685 |
+
{
|
2686 |
+
return $this->attachments;
|
2687 |
+
}
|
2688 |
+
public function setAttendees($attendees)
|
2689 |
+
{
|
2690 |
+
$this->attendees = $attendees;
|
2691 |
+
}
|
2692 |
+
public function getAttendees()
|
2693 |
+
{
|
2694 |
+
return $this->attendees;
|
2695 |
+
}
|
2696 |
+
public function setAttendeesOmitted($attendeesOmitted)
|
2697 |
+
{
|
2698 |
+
$this->attendeesOmitted = $attendeesOmitted;
|
2699 |
+
}
|
2700 |
+
public function getAttendeesOmitted()
|
2701 |
+
{
|
2702 |
+
return $this->attendeesOmitted;
|
2703 |
+
}
|
2704 |
+
public function setColorId($colorId)
|
2705 |
+
{
|
2706 |
+
$this->colorId = $colorId;
|
2707 |
+
}
|
2708 |
+
public function getColorId()
|
2709 |
+
{
|
2710 |
+
return $this->colorId;
|
2711 |
+
}
|
2712 |
+
public function setCreated($created)
|
2713 |
+
{
|
2714 |
+
$this->created = $created;
|
2715 |
+
}
|
2716 |
+
public function getCreated()
|
2717 |
+
{
|
2718 |
+
return $this->created;
|
2719 |
+
}
|
2720 |
+
public function setCreator(Google_Service_Calendar_EventCreator $creator)
|
2721 |
+
{
|
2722 |
+
$this->creator = $creator;
|
2723 |
+
}
|
2724 |
+
public function getCreator()
|
2725 |
+
{
|
2726 |
+
return $this->creator;
|
2727 |
+
}
|
2728 |
+
public function setDescription($description)
|
2729 |
+
{
|
2730 |
+
$this->description = $description;
|
2731 |
+
}
|
2732 |
+
public function getDescription()
|
2733 |
+
{
|
2734 |
+
return $this->description;
|
2735 |
+
}
|
2736 |
+
public function setEnd(Google_Service_Calendar_EventDateTime $end)
|
2737 |
+
{
|
2738 |
+
$this->end = $end;
|
2739 |
+
}
|
2740 |
+
public function getEnd()
|
2741 |
+
{
|
2742 |
+
return $this->end;
|
2743 |
+
}
|
2744 |
+
public function setEndTimeUnspecified($endTimeUnspecified)
|
2745 |
+
{
|
2746 |
+
$this->endTimeUnspecified = $endTimeUnspecified;
|
2747 |
+
}
|
2748 |
+
public function getEndTimeUnspecified()
|
2749 |
+
{
|
2750 |
+
return $this->endTimeUnspecified;
|
2751 |
+
}
|
2752 |
+
public function setEtag($etag)
|
2753 |
+
{
|
2754 |
+
$this->etag = $etag;
|
2755 |
+
}
|
2756 |
+
public function getEtag()
|
2757 |
+
{
|
2758 |
+
return $this->etag;
|
2759 |
+
}
|
2760 |
+
public function setExtendedProperties(Google_Service_Calendar_EventExtendedProperties $extendedProperties)
|
2761 |
+
{
|
2762 |
+
$this->extendedProperties = $extendedProperties;
|
2763 |
+
}
|
2764 |
+
public function getExtendedProperties()
|
2765 |
+
{
|
2766 |
+
return $this->extendedProperties;
|
2767 |
+
}
|
2768 |
+
public function setGadget(Google_Service_Calendar_EventGadget $gadget)
|
2769 |
+
{
|
2770 |
+
$this->gadget = $gadget;
|
2771 |
+
}
|
2772 |
+
public function getGadget()
|
2773 |
+
{
|
2774 |
+
return $this->gadget;
|
2775 |
+
}
|
2776 |
+
public function setGuestsCanInviteOthers($guestsCanInviteOthers)
|
2777 |
+
{
|
2778 |
+
$this->guestsCanInviteOthers = $guestsCanInviteOthers;
|
2779 |
+
}
|
2780 |
+
public function getGuestsCanInviteOthers()
|
2781 |
+
{
|
2782 |
+
return $this->guestsCanInviteOthers;
|
2783 |
+
}
|
2784 |
+
public function setGuestsCanModify($guestsCanModify)
|
2785 |
+
{
|
2786 |
+
$this->guestsCanModify = $guestsCanModify;
|
2787 |
+
}
|
2788 |
+
public function getGuestsCanModify()
|
2789 |
+
{
|
2790 |
+
return $this->guestsCanModify;
|
2791 |
+
}
|
2792 |
+
public function setGuestsCanSeeOtherGuests($guestsCanSeeOtherGuests)
|
2793 |
+
{
|
2794 |
+
$this->guestsCanSeeOtherGuests = $guestsCanSeeOtherGuests;
|
2795 |
+
}
|
2796 |
+
public function getGuestsCanSeeOtherGuests()
|
2797 |
+
{
|
2798 |
+
return $this->guestsCanSeeOtherGuests;
|
2799 |
+
}
|
2800 |
+
public function setHangoutLink($hangoutLink)
|
2801 |
+
{
|
2802 |
+
$this->hangoutLink = $hangoutLink;
|
2803 |
+
}
|
2804 |
+
public function getHangoutLink()
|
2805 |
+
{
|
2806 |
+
return $this->hangoutLink;
|
2807 |
+
}
|
2808 |
+
public function setHtmlLink($htmlLink)
|
2809 |
+
{
|
2810 |
+
$this->htmlLink = $htmlLink;
|
2811 |
+
}
|
2812 |
+
public function getHtmlLink()
|
2813 |
+
{
|
2814 |
+
return $this->htmlLink;
|
2815 |
+
}
|
2816 |
+
public function setICalUID($iCalUID)
|
2817 |
+
{
|
2818 |
+
$this->iCalUID = $iCalUID;
|
2819 |
+
}
|
2820 |
+
public function getICalUID()
|
2821 |
+
{
|
2822 |
+
return $this->iCalUID;
|
2823 |
+
}
|
2824 |
+
public function setId($id)
|
2825 |
+
{
|
2826 |
+
$this->id = $id;
|
2827 |
+
}
|
2828 |
+
public function getId()
|
2829 |
+
{
|
2830 |
+
return $this->id;
|
2831 |
+
}
|
2832 |
+
public function setKind($kind)
|
2833 |
+
{
|
2834 |
+
$this->kind = $kind;
|
2835 |
+
}
|
2836 |
+
public function getKind()
|
2837 |
+
{
|
2838 |
+
return $this->kind;
|
2839 |
+
}
|
2840 |
+
public function setLocation($location)
|
2841 |
+
{
|
2842 |
+
$this->location = $location;
|
2843 |
+
}
|
2844 |
+
public function getLocation()
|
2845 |
+
{
|
2846 |
+
return $this->location;
|
2847 |
+
}
|
2848 |
+
public function setLocked($locked)
|
2849 |
+
{
|
2850 |
+
$this->locked = $locked;
|
2851 |
+
}
|
2852 |
+
public function getLocked()
|
2853 |
+
{
|
2854 |
+
return $this->locked;
|
2855 |
+
}
|
2856 |
+
public function setOrganizer(Google_Service_Calendar_EventOrganizer $organizer)
|
2857 |
+
{
|
2858 |
+
$this->organizer = $organizer;
|
2859 |
+
}
|
2860 |
+
public function getOrganizer()
|
2861 |
+
{
|
2862 |
+
return $this->organizer;
|
2863 |
+
}
|
2864 |
+
public function setOriginalStartTime(Google_Service_Calendar_EventDateTime $originalStartTime)
|
2865 |
+
{
|
2866 |
+
$this->originalStartTime = $originalStartTime;
|
2867 |
+
}
|
2868 |
+
public function getOriginalStartTime()
|
2869 |
+
{
|
2870 |
+
return $this->originalStartTime;
|
2871 |
+
}
|
2872 |
+
public function setPrivateCopy($privateCopy)
|
2873 |
+
{
|
2874 |
+
$this->privateCopy = $privateCopy;
|
2875 |
+
}
|
2876 |
+
public function getPrivateCopy()
|
2877 |
+
{
|
2878 |
+
return $this->privateCopy;
|
2879 |
+
}
|
2880 |
+
public function setRecurrence($recurrence)
|
2881 |
+
{
|
2882 |
+
$this->recurrence = $recurrence;
|
2883 |
+
}
|
2884 |
+
public function getRecurrence()
|
2885 |
+
{
|
2886 |
+
return $this->recurrence;
|
2887 |
+
}
|
2888 |
+
public function setRecurringEventId($recurringEventId)
|
2889 |
+
{
|
2890 |
+
$this->recurringEventId = $recurringEventId;
|
2891 |
+
}
|
2892 |
+
public function getRecurringEventId()
|
2893 |
+
{
|
2894 |
+
return $this->recurringEventId;
|
2895 |
+
}
|
2896 |
+
public function setReminders(Google_Service_Calendar_EventReminders $reminders)
|
2897 |
+
{
|
2898 |
+
$this->reminders = $reminders;
|
2899 |
+
}
|
2900 |
+
public function getReminders()
|
2901 |
+
{
|
2902 |
+
return $this->reminders;
|
2903 |
+
}
|
2904 |
+
public function setSequence($sequence)
|
2905 |
+
{
|
2906 |
+
$this->sequence = $sequence;
|
2907 |
+
}
|
2908 |
+
public function getSequence()
|
2909 |
+
{
|
2910 |
+
return $this->sequence;
|
2911 |
+
}
|
2912 |
+
public function setSource(Google_Service_Calendar_EventSource $source)
|
2913 |
+
{
|
2914 |
+
$this->source = $source;
|
2915 |
+
}
|
2916 |
+
public function getSource()
|
2917 |
+
{
|
2918 |
+
return $this->source;
|
2919 |
+
}
|
2920 |
+
public function setStart(Google_Service_Calendar_EventDateTime $start)
|
2921 |
+
{
|
2922 |
+
$this->start = $start;
|
2923 |
+
}
|
2924 |
+
public function getStart()
|
2925 |
+
{
|
2926 |
+
return $this->start;
|
2927 |
+
}
|
2928 |
+
public function setStatus($status)
|
2929 |
+
{
|
2930 |
+
$this->status = $status;
|
2931 |
+
}
|
2932 |
+
public function getStatus()
|
2933 |
+
{
|
2934 |
+
return $this->status;
|
2935 |
+
}
|
2936 |
+
public function setSummary($summary)
|
2937 |
+
{
|
2938 |
+
$this->summary = $summary;
|
2939 |
+
}
|
2940 |
+
public function getSummary()
|
2941 |
+
{
|
2942 |
+
return $this->summary;
|
2943 |
+
}
|
2944 |
+
public function setTransparency($transparency)
|
2945 |
+
{
|
2946 |
+
$this->transparency = $transparency;
|
2947 |
+
}
|
2948 |
+
public function getTransparency()
|
2949 |
+
{
|
2950 |
+
return $this->transparency;
|
2951 |
+
}
|
2952 |
+
public function setUpdated($updated)
|
2953 |
+
{
|
2954 |
+
$this->updated = $updated;
|
2955 |
+
}
|
2956 |
+
public function getUpdated()
|
2957 |
+
{
|
2958 |
+
return $this->updated;
|
2959 |
+
}
|
2960 |
+
public function setVisibility($visibility)
|
2961 |
+
{
|
2962 |
+
$this->visibility = $visibility;
|
2963 |
+
}
|
2964 |
+
public function getVisibility()
|
2965 |
+
{
|
2966 |
+
return $this->visibility;
|
2967 |
+
}
|
2968 |
+
}
|
2969 |
+
|
2970 |
+
class Google_Service_Calendar_EventAttachment extends Google_Model
|
2971 |
+
{
|
2972 |
+
protected $internal_gapi_mappings = array(
|
2973 |
+
);
|
2974 |
+
public $fileId;
|
2975 |
+
public $fileUrl;
|
2976 |
+
public $iconLink;
|
2977 |
+
public $mimeType;
|
2978 |
+
public $title;
|
2979 |
+
|
2980 |
+
|
2981 |
+
public function setFileId($fileId)
|
2982 |
+
{
|
2983 |
+
$this->fileId = $fileId;
|
2984 |
+
}
|
2985 |
+
public function getFileId()
|
2986 |
+
{
|
2987 |
+
return $this->fileId;
|
2988 |
+
}
|
2989 |
+
public function setFileUrl($fileUrl)
|
2990 |
+
{
|
2991 |
+
$this->fileUrl = $fileUrl;
|
2992 |
+
}
|
2993 |
+
public function getFileUrl()
|
2994 |
+
{
|
2995 |
+
return $this->fileUrl;
|
2996 |
+
}
|
2997 |
+
public function setIconLink($iconLink)
|
2998 |
+
{
|
2999 |
+
$this->iconLink = $iconLink;
|
3000 |
+
}
|
3001 |
+
public function getIconLink()
|
3002 |
+
{
|
3003 |
+
return $this->iconLink;
|
3004 |
+
}
|
3005 |
+
public function setMimeType($mimeType)
|
3006 |
+
{
|
3007 |
+
$this->mimeType = $mimeType;
|
3008 |
+
}
|
3009 |
+
public function getMimeType()
|
3010 |
+
{
|
3011 |
+
return $this->mimeType;
|
3012 |
+
}
|
3013 |
+
public function setTitle($title)
|
3014 |
+
{
|
3015 |
+
$this->title = $title;
|
3016 |
+
}
|
3017 |
+
public function getTitle()
|
3018 |
+
{
|
3019 |
+
return $this->title;
|
3020 |
+
}
|
3021 |
+
}
|
3022 |
+
|
3023 |
+
class Google_Service_Calendar_EventAttendee extends Google_Model
|
3024 |
+
{
|
3025 |
+
protected $internal_gapi_mappings = array(
|
3026 |
+
);
|
3027 |
+
public $additionalGuests;
|
3028 |
+
public $comment;
|
3029 |
+
public $displayName;
|
3030 |
+
public $email;
|
3031 |
+
public $id;
|
3032 |
+
public $optional;
|
3033 |
+
public $organizer;
|
3034 |
+
public $resource;
|
3035 |
+
public $responseStatus;
|
3036 |
+
public $self;
|
3037 |
+
|
3038 |
+
|
3039 |
+
public function setAdditionalGuests($additionalGuests)
|
3040 |
+
{
|
3041 |
+
$this->additionalGuests = $additionalGuests;
|
3042 |
+
}
|
3043 |
+
public function getAdditionalGuests()
|
3044 |
+
{
|
3045 |
+
return $this->additionalGuests;
|
3046 |
+
}
|
3047 |
+
public function setComment($comment)
|
3048 |
+
{
|
3049 |
+
$this->comment = $comment;
|
3050 |
+
}
|
3051 |
+
public function getComment()
|
3052 |
+
{
|
3053 |
+
return $this->comment;
|
3054 |
+
}
|
3055 |
+
public function setDisplayName($displayName)
|
3056 |
+
{
|
3057 |
+
$this->displayName = $displayName;
|
3058 |
+
}
|
3059 |
+
public function getDisplayName()
|
3060 |
+
{
|
3061 |
+
return $this->displayName;
|
3062 |
+
}
|
3063 |
+
public function setEmail($email)
|
3064 |
+
{
|
3065 |
+
$this->email = $email;
|
3066 |
+
}
|
3067 |
+
public function getEmail()
|
3068 |
+
{
|
3069 |
+
return $this->email;
|
3070 |
+
}
|
3071 |
+
public function setId($id)
|
3072 |
+
{
|
3073 |
+
$this->id = $id;
|
3074 |
+
}
|
3075 |
+
public function getId()
|
3076 |
+
{
|
3077 |
+
return $this->id;
|
3078 |
+
}
|
3079 |
+
public function setOptional($optional)
|
3080 |
+
{
|
3081 |
+
$this->optional = $optional;
|
3082 |
+
}
|
3083 |
+
public function getOptional()
|
3084 |
+
{
|
3085 |
+
return $this->optional;
|
3086 |
+
}
|
3087 |
+
public function setOrganizer($organizer)
|
3088 |
+
{
|
3089 |
+
$this->organizer = $organizer;
|
3090 |
+
}
|
3091 |
+
public function getOrganizer()
|
3092 |
+
{
|
3093 |
+
return $this->organizer;
|
3094 |
+
}
|
3095 |
+
public function setResource($resource)
|
3096 |
+
{
|
3097 |
+
$this->resource = $resource;
|
3098 |
+
}
|
3099 |
+
public function getResource()
|
3100 |
+
{
|
3101 |
+
return $this->resource;
|
3102 |
+
}
|
3103 |
+
public function setResponseStatus($responseStatus)
|
3104 |
+
{
|
3105 |
+
$this->responseStatus = $responseStatus;
|
3106 |
+
}
|
3107 |
+
public function getResponseStatus()
|
3108 |
+
{
|
3109 |
+
return $this->responseStatus;
|
3110 |
+
}
|
3111 |
+
public function setSelf($self)
|
3112 |
+
{
|
3113 |
+
$this->self = $self;
|
3114 |
+
}
|
3115 |
+
public function getSelf()
|
3116 |
+
{
|
3117 |
+
return $this->self;
|
3118 |
+
}
|
3119 |
+
}
|
3120 |
+
|
3121 |
+
class Google_Service_Calendar_EventCreator extends Google_Model
|
3122 |
+
{
|
3123 |
+
protected $internal_gapi_mappings = array(
|
3124 |
+
);
|
3125 |
+
public $displayName;
|
3126 |
+
public $email;
|
3127 |
+
public $id;
|
3128 |
+
public $self;
|
3129 |
+
|
3130 |
+
|
3131 |
+
public function setDisplayName($displayName)
|
3132 |
+
{
|
3133 |
+
$this->displayName = $displayName;
|
3134 |
+
}
|
3135 |
+
public function getDisplayName()
|
3136 |
+
{
|
3137 |
+
return $this->displayName;
|
3138 |
+
}
|
3139 |
+
public function setEmail($email)
|
3140 |
+
{
|
3141 |
+
$this->email = $email;
|
3142 |
+
}
|
3143 |
+
public function getEmail()
|
3144 |
+
{
|
3145 |
+
return $this->email;
|
3146 |
+
}
|
3147 |
+
public function setId($id)
|
3148 |
+
{
|
3149 |
+
$this->id = $id;
|
3150 |
+
}
|
3151 |
+
public function getId()
|
3152 |
+
{
|
3153 |
+
return $this->id;
|
3154 |
+
}
|
3155 |
+
public function setSelf($self)
|
3156 |
+
{
|
3157 |
+
$this->self = $self;
|
3158 |
+
}
|
3159 |
+
public function getSelf()
|
3160 |
+
{
|
3161 |
+
return $this->self;
|
3162 |
+
}
|
3163 |
+
}
|
3164 |
+
|
3165 |
+
class Google_Service_Calendar_EventDateTime extends Google_Model
|
3166 |
+
{
|
3167 |
+
protected $internal_gapi_mappings = array(
|
3168 |
+
);
|
3169 |
+
public $date;
|
3170 |
+
public $dateTime;
|
3171 |
+
public $timeZone;
|
3172 |
+
|
3173 |
+
|
3174 |
+
public function setDate($date)
|
3175 |
+
{
|
3176 |
+
$this->date = $date;
|
3177 |
+
}
|
3178 |
+
public function getDate()
|
3179 |
+
{
|
3180 |
+
return $this->date;
|
3181 |
+
}
|
3182 |
+
public function setDateTime($dateTime)
|
3183 |
+
{
|
3184 |
+
$this->dateTime = $dateTime;
|
3185 |
+
}
|
3186 |
+
public function getDateTime()
|
3187 |
+
{
|
3188 |
+
return $this->dateTime;
|
3189 |
+
}
|
3190 |
+
public function setTimeZone($timeZone)
|
3191 |
+
{
|
3192 |
+
$this->timeZone = $timeZone;
|
3193 |
+
}
|
3194 |
+
public function getTimeZone()
|
3195 |
+
{
|
3196 |
+
return $this->timeZone;
|
3197 |
+
}
|
3198 |
+
}
|
3199 |
+
|
3200 |
+
class Google_Service_Calendar_EventExtendedProperties extends Google_Model
|
3201 |
+
{
|
3202 |
+
protected $internal_gapi_mappings = array(
|
3203 |
+
);
|
3204 |
+
public $private;
|
3205 |
+
public $shared;
|
3206 |
+
|
3207 |
+
|
3208 |
+
public function setPrivate($private)
|
3209 |
+
{
|
3210 |
+
$this->private = $private;
|
3211 |
+
}
|
3212 |
+
public function getPrivate()
|
3213 |
+
{
|
3214 |
+
return $this->private;
|
3215 |
+
}
|
3216 |
+
public function setShared($shared)
|
3217 |
+
{
|
3218 |
+
$this->shared = $shared;
|
3219 |
+
}
|
3220 |
+
public function getShared()
|
3221 |
+
{
|
3222 |
+
return $this->shared;
|
3223 |
+
}
|
3224 |
+
}
|
3225 |
+
|
3226 |
+
class Google_Service_Calendar_EventGadget extends Google_Model
|
3227 |
+
{
|
3228 |
+
protected $internal_gapi_mappings = array(
|
3229 |
+
);
|
3230 |
+
public $display;
|
3231 |
+
public $height;
|
3232 |
+
public $iconLink;
|
3233 |
+
public $link;
|
3234 |
+
public $preferences;
|
3235 |
+
public $title;
|
3236 |
+
public $type;
|
3237 |
+
public $width;
|
3238 |
+
|
3239 |
+
|
3240 |
+
public function setDisplay($display)
|
3241 |
+
{
|
3242 |
+
$this->display = $display;
|
3243 |
+
}
|
3244 |
+
public function getDisplay()
|
3245 |
+
{
|
3246 |
+
return $this->display;
|
3247 |
+
}
|
3248 |
+
public function setHeight($height)
|
3249 |
+
{
|
3250 |
+
$this->height = $height;
|
3251 |
+
}
|
3252 |
+
public function getHeight()
|
3253 |
+
{
|
3254 |
+
return $this->height;
|
3255 |
+
}
|
3256 |
+
public function setIconLink($iconLink)
|
3257 |
+
{
|
3258 |
+
$this->iconLink = $iconLink;
|
3259 |
+
}
|
3260 |
+
public function getIconLink()
|
3261 |
+
{
|
3262 |
+
return $this->iconLink;
|
3263 |
+
}
|
3264 |
+
public function setLink($link)
|
3265 |
+
{
|
3266 |
+
$this->link = $link;
|
3267 |
+
}
|
3268 |
+
public function getLink()
|
3269 |
+
{
|
3270 |
+
return $this->link;
|
3271 |
+
}
|
3272 |
+
public function setPreferences($preferences)
|
3273 |
+
{
|
3274 |
+
$this->preferences = $preferences;
|
3275 |
+
}
|
3276 |
+
public function getPreferences()
|
3277 |
+
{
|
3278 |
+
return $this->preferences;
|
3279 |
+
}
|
3280 |
+
public function setTitle($title)
|
3281 |
+
{
|
3282 |
+
$this->title = $title;
|
3283 |
+
}
|
3284 |
+
public function getTitle()
|
3285 |
+
{
|
3286 |
+
return $this->title;
|
3287 |
+
}
|
3288 |
+
public function setType($type)
|
3289 |
+
{
|
3290 |
+
$this->type = $type;
|
3291 |
+
}
|
3292 |
+
public function getType()
|
3293 |
+
{
|
3294 |
+
return $this->type;
|
3295 |
+
}
|
3296 |
+
public function setWidth($width)
|
3297 |
+
{
|
3298 |
+
$this->width = $width;
|
3299 |
+
}
|
3300 |
+
public function getWidth()
|
3301 |
+
{
|
3302 |
+
return $this->width;
|
3303 |
+
}
|
3304 |
+
}
|
3305 |
+
|
3306 |
+
class Google_Service_Calendar_EventOrganizer extends Google_Model
|
3307 |
+
{
|
3308 |
+
protected $internal_gapi_mappings = array(
|
3309 |
+
);
|
3310 |
+
public $displayName;
|
3311 |
+
public $email;
|
3312 |
+
public $id;
|
3313 |
+
public $self;
|
3314 |
+
|
3315 |
+
|
3316 |
+
public function setDisplayName($displayName)
|
3317 |
+
{
|
3318 |
+
$this->displayName = $displayName;
|
3319 |
+
}
|
3320 |
+
public function getDisplayName()
|
3321 |
+
{
|
3322 |
+
return $this->displayName;
|
3323 |
+
}
|
3324 |
+
public function setEmail($email)
|
3325 |
+
{
|
3326 |
+
$this->email = $email;
|
3327 |
+
}
|
3328 |
+
public function getEmail()
|
3329 |
+
{
|
3330 |
+
return $this->email;
|
3331 |
+
}
|
3332 |
+
public function setId($id)
|
3333 |
+
{
|
3334 |
+
$this->id = $id;
|
3335 |
+
}
|
3336 |
+
public function getId()
|
3337 |
+
{
|
3338 |
+
return $this->id;
|
3339 |
+
}
|
3340 |
+
public function setSelf($self)
|
3341 |
+
{
|
3342 |
+
$this->self = $self;
|
3343 |
+
}
|
3344 |
+
public function getSelf()
|
3345 |
+
{
|
3346 |
+
return $this->self;
|
3347 |
+
}
|
3348 |
+
}
|
3349 |
+
|
3350 |
+
class Google_Service_Calendar_EventReminder extends Google_Model
|
3351 |
+
{
|
3352 |
+
protected $internal_gapi_mappings = array(
|
3353 |
+
);
|
3354 |
+
public $method;
|
3355 |
+
public $minutes;
|
3356 |
+
|
3357 |
+
|
3358 |
+
public function setMethod($method)
|
3359 |
+
{
|
3360 |
+
$this->method = $method;
|
3361 |
+
}
|
3362 |
+
public function getMethod()
|
3363 |
+
{
|
3364 |
+
return $this->method;
|
3365 |
+
}
|
3366 |
+
public function setMinutes($minutes)
|
3367 |
+
{
|
3368 |
+
$this->minutes = $minutes;
|
3369 |
+
}
|
3370 |
+
public function getMinutes()
|
3371 |
+
{
|
3372 |
+
return $this->minutes;
|
3373 |
+
}
|
3374 |
+
}
|
3375 |
+
|
3376 |
+
class Google_Service_Calendar_EventReminders extends Google_Collection
|
3377 |
+
{
|
3378 |
+
protected $collection_key = 'overrides';
|
3379 |
+
protected $internal_gapi_mappings = array(
|
3380 |
+
);
|
3381 |
+
protected $overridesType = 'Google_Service_Calendar_EventReminder';
|
3382 |
+
protected $overridesDataType = 'array';
|
3383 |
+
public $useDefault;
|
3384 |
+
|
3385 |
+
|
3386 |
+
public function setOverrides($overrides)
|
3387 |
+
{
|
3388 |
+
$this->overrides = $overrides;
|
3389 |
+
}
|
3390 |
+
public function getOverrides()
|
3391 |
+
{
|
3392 |
+
return $this->overrides;
|
3393 |
+
}
|
3394 |
+
public function setUseDefault($useDefault)
|
3395 |
+
{
|
3396 |
+
$this->useDefault = $useDefault;
|
3397 |
+
}
|
3398 |
+
public function getUseDefault()
|
3399 |
+
{
|
3400 |
+
return $this->useDefault;
|
3401 |
+
}
|
3402 |
+
}
|
3403 |
+
|
3404 |
+
class Google_Service_Calendar_EventSource extends Google_Model
|
3405 |
+
{
|
3406 |
+
protected $internal_gapi_mappings = array(
|
3407 |
+
);
|
3408 |
+
public $title;
|
3409 |
+
public $url;
|
3410 |
+
|
3411 |
+
|
3412 |
+
public function setTitle($title)
|
3413 |
+
{
|
3414 |
+
$this->title = $title;
|
3415 |
+
}
|
3416 |
+
public function getTitle()
|
3417 |
+
{
|
3418 |
+
return $this->title;
|
3419 |
+
}
|
3420 |
+
public function setUrl($url)
|
3421 |
+
{
|
3422 |
+
$this->url = $url;
|
3423 |
+
}
|
3424 |
+
public function getUrl()
|
3425 |
+
{
|
3426 |
+
return $this->url;
|
3427 |
+
}
|
3428 |
+
}
|
3429 |
+
|
3430 |
+
class Google_Service_Calendar_Events extends Google_Collection
|
3431 |
+
{
|
3432 |
+
protected $collection_key = 'items';
|
3433 |
+
protected $internal_gapi_mappings = array(
|
3434 |
+
);
|
3435 |
+
public $accessRole;
|
3436 |
+
protected $defaultRemindersType = 'Google_Service_Calendar_EventReminder';
|
3437 |
+
protected $defaultRemindersDataType = 'array';
|
3438 |
+
public $description;
|
3439 |
+
public $etag;
|
3440 |
+
protected $itemsType = 'Google_Service_Calendar_Event';
|
3441 |
+
protected $itemsDataType = 'array';
|
3442 |
+
public $kind;
|
3443 |
+
public $nextPageToken;
|
3444 |
+
public $nextSyncToken;
|
3445 |
+
public $summary;
|
3446 |
+
public $timeZone;
|
3447 |
+
public $updated;
|
3448 |
+
|
3449 |
+
|
3450 |
+
public function setAccessRole($accessRole)
|
3451 |
+
{
|
3452 |
+
$this->accessRole = $accessRole;
|
3453 |
+
}
|
3454 |
+
public function getAccessRole()
|
3455 |
+
{
|
3456 |
+
return $this->accessRole;
|
3457 |
+
}
|
3458 |
+
public function setDefaultReminders($defaultReminders)
|
3459 |
+
{
|
3460 |
+
$this->defaultReminders = $defaultReminders;
|
3461 |
+
}
|
3462 |
+
public function getDefaultReminders()
|
3463 |
+
{
|
3464 |
+
return $this->defaultReminders;
|
3465 |
+
}
|
3466 |
+
public function setDescription($description)
|
3467 |
+
{
|
3468 |
+
$this->description = $description;
|
3469 |
+
}
|
3470 |
+
public function getDescription()
|
3471 |
+
{
|
3472 |
+
return $this->description;
|
3473 |
+
}
|
3474 |
+
public function setEtag($etag)
|
3475 |
+
{
|
3476 |
+
$this->etag = $etag;
|
3477 |
+
}
|
3478 |
+
public function getEtag()
|
3479 |
+
{
|
3480 |
+
return $this->etag;
|
3481 |
+
}
|
3482 |
+
public function setItems($items)
|
3483 |
+
{
|
3484 |
+
$this->items = $items;
|
3485 |
+
}
|
3486 |
+
public function getItems()
|
3487 |
+
{
|
3488 |
+
return $this->items;
|
3489 |
+
}
|
3490 |
+
public function setKind($kind)
|
3491 |
+
{
|
3492 |
+
$this->kind = $kind;
|
3493 |
+
}
|
3494 |
+
public function getKind()
|
3495 |
+
{
|
3496 |
+
return $this->kind;
|
3497 |
+
}
|
3498 |
+
public function setNextPageToken($nextPageToken)
|
3499 |
+
{
|
3500 |
+
$this->nextPageToken = $nextPageToken;
|
3501 |
+
}
|
3502 |
+
public function getNextPageToken()
|
3503 |
+
{
|
3504 |
+
return $this->nextPageToken;
|
3505 |
+
}
|
3506 |
+
public function setNextSyncToken($nextSyncToken)
|
3507 |
+
{
|
3508 |
+
$this->nextSyncToken = $nextSyncToken;
|
3509 |
+
}
|
3510 |
+
public function getNextSyncToken()
|
3511 |
+
{
|
3512 |
+
return $this->nextSyncToken;
|
3513 |
+
}
|
3514 |
+
public function setSummary($summary)
|
3515 |
+
{
|
3516 |
+
$this->summary = $summary;
|
3517 |
+
}
|
3518 |
+
public function getSummary()
|
3519 |
+
{
|
3520 |
+
return $this->summary;
|
3521 |
+
}
|
3522 |
+
public function setTimeZone($timeZone)
|
3523 |
+
{
|
3524 |
+
$this->timeZone = $timeZone;
|
3525 |
+
}
|
3526 |
+
public function getTimeZone()
|
3527 |
+
{
|
3528 |
+
return $this->timeZone;
|
3529 |
+
}
|
3530 |
+
public function setUpdated($updated)
|
3531 |
+
{
|
3532 |
+
$this->updated = $updated;
|
3533 |
+
}
|
3534 |
+
public function getUpdated()
|
3535 |
+
{
|
3536 |
+
return $this->updated;
|
3537 |
+
}
|
3538 |
+
}
|
3539 |
+
|
3540 |
+
class Google_Service_Calendar_FreeBusyCalendar extends Google_Collection
|
3541 |
+
{
|
3542 |
+
protected $collection_key = 'errors';
|
3543 |
+
protected $internal_gapi_mappings = array(
|
3544 |
+
);
|
3545 |
+
protected $busyType = 'Google_Service_Calendar_TimePeriod';
|
3546 |
+
protected $busyDataType = 'array';
|
3547 |
+
protected $errorsType = 'Google_Service_Calendar_Error';
|
3548 |
+
protected $errorsDataType = 'array';
|
3549 |
+
|
3550 |
+
|
3551 |
+
public function setBusy($busy)
|
3552 |
+
{
|
3553 |
+
$this->busy = $busy;
|
3554 |
+
}
|
3555 |
+
public function getBusy()
|
3556 |
+
{
|
3557 |
+
return $this->busy;
|
3558 |
+
}
|
3559 |
+
public function setErrors($errors)
|
3560 |
+
{
|
3561 |
+
$this->errors = $errors;
|
3562 |
+
}
|
3563 |
+
public function getErrors()
|
3564 |
+
{
|
3565 |
+
return $this->errors;
|
3566 |
+
}
|
3567 |
+
}
|
3568 |
+
|
3569 |
+
class Google_Service_Calendar_FreeBusyGroup extends Google_Collection
|
3570 |
+
{
|
3571 |
+
protected $collection_key = 'errors';
|
3572 |
+
protected $internal_gapi_mappings = array(
|
3573 |
+
);
|
3574 |
+
public $calendars;
|
3575 |
+
protected $errorsType = 'Google_Service_Calendar_Error';
|
3576 |
+
protected $errorsDataType = 'array';
|
3577 |
+
|
3578 |
+
|
3579 |
+
public function setCalendars($calendars)
|
3580 |
+
{
|
3581 |
+
$this->calendars = $calendars;
|
3582 |
+
}
|
3583 |
+
public function getCalendars()
|
3584 |
+
{
|
3585 |
+
return $this->calendars;
|
3586 |
+
}
|
3587 |
+
public function setErrors($errors)
|
3588 |
+
{
|
3589 |
+
$this->errors = $errors;
|
3590 |
+
}
|
3591 |
+
public function getErrors()
|
3592 |
+
{
|
3593 |
+
return $this->errors;
|
3594 |
+
}
|
3595 |
+
}
|
3596 |
+
|
3597 |
+
class Google_Service_Calendar_FreeBusyRequest extends Google_Collection
|
3598 |
+
{
|
3599 |
+
protected $collection_key = 'items';
|
3600 |
+
protected $internal_gapi_mappings = array(
|
3601 |
+
);
|
3602 |
+
public $calendarExpansionMax;
|
3603 |
+
public $groupExpansionMax;
|
3604 |
+
protected $itemsType = 'Google_Service_Calendar_FreeBusyRequestItem';
|
3605 |
+
protected $itemsDataType = 'array';
|
3606 |
+
public $timeMax;
|
3607 |
+
public $timeMin;
|
3608 |
+
public $timeZone;
|
3609 |
+
|
3610 |
+
|
3611 |
+
public function setCalendarExpansionMax($calendarExpansionMax)
|
3612 |
+
{
|
3613 |
+
$this->calendarExpansionMax = $calendarExpansionMax;
|
3614 |
+
}
|
3615 |
+
public function getCalendarExpansionMax()
|
3616 |
+
{
|
3617 |
+
return $this->calendarExpansionMax;
|
3618 |
+
}
|
3619 |
+
public function setGroupExpansionMax($groupExpansionMax)
|
3620 |
+
{
|
3621 |
+
$this->groupExpansionMax = $groupExpansionMax;
|
3622 |
+
}
|
3623 |
+
public function getGroupExpansionMax()
|
3624 |
+
{
|
3625 |
+
return $this->groupExpansionMax;
|
3626 |
+
}
|
3627 |
+
public function setItems($items)
|
3628 |
+
{
|
3629 |
+
$this->items = $items;
|
3630 |
+
}
|
3631 |
+
public function getItems()
|
3632 |
+
{
|
3633 |
+
return $this->items;
|
3634 |
+
}
|
3635 |
+
public function setTimeMax($timeMax)
|
3636 |
+
{
|
3637 |
+
$this->timeMax = $timeMax;
|
3638 |
+
}
|
3639 |
+
public function getTimeMax()
|
3640 |
+
{
|
3641 |
+
return $this->timeMax;
|
3642 |
+
}
|
3643 |
+
public function setTimeMin($timeMin)
|
3644 |
+
{
|
3645 |
+
$this->timeMin = $timeMin;
|
3646 |
+
}
|
3647 |
+
public function getTimeMin()
|
3648 |
+
{
|
3649 |
+
return $this->timeMin;
|
3650 |
+
}
|
3651 |
+
public function setTimeZone($timeZone)
|
3652 |
+
{
|
3653 |
+
$this->timeZone = $timeZone;
|
3654 |
+
}
|
3655 |
+
public function getTimeZone()
|
3656 |
+
{
|
3657 |
+
return $this->timeZone;
|
3658 |
+
}
|
3659 |
+
}
|
3660 |
+
|
3661 |
+
class Google_Service_Calendar_FreeBusyRequestItem extends Google_Model
|
3662 |
+
{
|
3663 |
+
protected $internal_gapi_mappings = array(
|
3664 |
+
);
|
3665 |
+
public $id;
|
3666 |
+
|
3667 |
+
|
3668 |
+
public function setId($id)
|
3669 |
+
{
|
3670 |
+
$this->id = $id;
|
3671 |
+
}
|
3672 |
+
public function getId()
|
3673 |
+
{
|
3674 |
+
return $this->id;
|
3675 |
+
}
|
3676 |
+
}
|
3677 |
+
|
3678 |
+
class Google_Service_Calendar_FreeBusyResponse extends Google_Model
|
3679 |
+
{
|
3680 |
+
protected $internal_gapi_mappings = array(
|
3681 |
+
);
|
3682 |
+
protected $calendarsType = 'Google_Service_Calendar_FreeBusyCalendar';
|
3683 |
+
protected $calendarsDataType = 'map';
|
3684 |
+
protected $groupsType = 'Google_Service_Calendar_FreeBusyGroup';
|
3685 |
+
protected $groupsDataType = 'map';
|
3686 |
+
public $kind;
|
3687 |
+
public $timeMax;
|
3688 |
+
public $timeMin;
|
3689 |
+
|
3690 |
+
|
3691 |
+
public function setCalendars($calendars)
|
3692 |
+
{
|
3693 |
+
$this->calendars = $calendars;
|
3694 |
+
}
|
3695 |
+
public function getCalendars()
|
3696 |
+
{
|
3697 |
+
return $this->calendars;
|
3698 |
+
}
|
3699 |
+
public function setGroups($groups)
|
3700 |
+
{
|
3701 |
+
$this->groups = $groups;
|
3702 |
+
}
|
3703 |
+
public function getGroups()
|
3704 |
+
{
|
3705 |
+
return $this->groups;
|
3706 |
+
}
|
3707 |
+
public function setKind($kind)
|
3708 |
+
{
|
3709 |
+
$this->kind = $kind;
|
3710 |
+
}
|
3711 |
+
public function getKind()
|
3712 |
+
{
|
3713 |
+
return $this->kind;
|
3714 |
+
}
|
3715 |
+
public function setTimeMax($timeMax)
|
3716 |
+
{
|
3717 |
+
$this->timeMax = $timeMax;
|
3718 |
+
}
|
3719 |
+
public function getTimeMax()
|
3720 |
+
{
|
3721 |
+
return $this->timeMax;
|
3722 |
+
}
|
3723 |
+
public function setTimeMin($timeMin)
|
3724 |
+
{
|
3725 |
+
$this->timeMin = $timeMin;
|
3726 |
+
}
|
3727 |
+
public function getTimeMin()
|
3728 |
+
{
|
3729 |
+
return $this->timeMin;
|
3730 |
+
}
|
3731 |
+
}
|
3732 |
+
|
3733 |
+
class Google_Service_Calendar_Setting extends Google_Model
|
3734 |
+
{
|
3735 |
+
protected $internal_gapi_mappings = array(
|
3736 |
+
);
|
3737 |
+
public $etag;
|
3738 |
+
public $id;
|
3739 |
+
public $kind;
|
3740 |
+
public $value;
|
3741 |
+
|
3742 |
+
|
3743 |
+
public function setEtag($etag)
|
3744 |
+
{
|
3745 |
+
$this->etag = $etag;
|
3746 |
+
}
|
3747 |
+
public function getEtag()
|
3748 |
+
{
|
3749 |
+
return $this->etag;
|
3750 |
+
}
|
3751 |
+
public function setId($id)
|
3752 |
+
{
|
3753 |
+
$this->id = $id;
|
3754 |
+
}
|
3755 |
+
public function getId()
|
3756 |
+
{
|
3757 |
+
return $this->id;
|
3758 |
+
}
|
3759 |
+
public function setKind($kind)
|
3760 |
+
{
|
3761 |
+
$this->kind = $kind;
|
3762 |
+
}
|
3763 |
+
public function getKind()
|
3764 |
+
{
|
3765 |
+
return $this->kind;
|
3766 |
+
}
|
3767 |
+
public function setValue($value)
|
3768 |
+
{
|
3769 |
+
$this->value = $value;
|
3770 |
+
}
|
3771 |
+
public function getValue()
|
3772 |
+
{
|
3773 |
+
return $this->value;
|
3774 |
+
}
|
3775 |
+
}
|
3776 |
+
|
3777 |
+
class Google_Service_Calendar_Settings extends Google_Collection
|
3778 |
+
{
|
3779 |
+
protected $collection_key = 'items';
|
3780 |
+
protected $internal_gapi_mappings = array(
|
3781 |
+
);
|
3782 |
+
public $etag;
|
3783 |
+
protected $itemsType = 'Google_Service_Calendar_Setting';
|
3784 |
+
protected $itemsDataType = 'array';
|
3785 |
+
public $kind;
|
3786 |
+
public $nextPageToken;
|
3787 |
+
public $nextSyncToken;
|
3788 |
+
|
3789 |
+
|
3790 |
+
public function setEtag($etag)
|
3791 |
+
{
|
3792 |
+
$this->etag = $etag;
|
3793 |
+
}
|
3794 |
+
public function getEtag()
|
3795 |
+
{
|
3796 |
+
return $this->etag;
|
3797 |
+
}
|
3798 |
+
public function setItems($items)
|
3799 |
+
{
|
3800 |
+
$this->items = $items;
|
3801 |
+
}
|
3802 |
+
public function getItems()
|
3803 |
+
{
|
3804 |
+
return $this->items;
|
3805 |
+
}
|
3806 |
+
public function setKind($kind)
|
3807 |
+
{
|
3808 |
+
$this->kind = $kind;
|
3809 |
+
}
|
3810 |
+
public function getKind()
|
3811 |
+
{
|
3812 |
+
return $this->kind;
|
3813 |
+
}
|
3814 |
+
public function setNextPageToken($nextPageToken)
|
3815 |
+
{
|
3816 |
+
$this->nextPageToken = $nextPageToken;
|
3817 |
+
}
|
3818 |
+
public function getNextPageToken()
|
3819 |
+
{
|
3820 |
+
return $this->nextPageToken;
|
3821 |
+
}
|
3822 |
+
public function setNextSyncToken($nextSyncToken)
|
3823 |
+
{
|
3824 |
+
$this->nextSyncToken = $nextSyncToken;
|
3825 |
+
}
|
3826 |
+
public function getNextSyncToken()
|
3827 |
+
{
|
3828 |
+
return $this->nextSyncToken;
|
3829 |
+
}
|
3830 |
+
}
|
3831 |
+
|
3832 |
+
class Google_Service_Calendar_TimePeriod extends Google_Model
|
3833 |
+
{
|
3834 |
+
protected $internal_gapi_mappings = array(
|
3835 |
+
);
|
3836 |
+
public $end;
|
3837 |
+
public $start;
|
3838 |
+
|
3839 |
+
|
3840 |
+
public function setEnd($end)
|
3841 |
+
{
|
3842 |
+
$this->end = $end;
|
3843 |
+
}
|
3844 |
+
public function getEnd()
|
3845 |
+
{
|
3846 |
+
return $this->end;
|
3847 |
+
}
|
3848 |
+
public function setStart($start)
|
3849 |
+
{
|
3850 |
+
$this->start = $start;
|
3851 |
+
}
|
3852 |
+
public function getStart()
|
3853 |
+
{
|
3854 |
+
return $this->start;
|
3855 |
+
}
|
3856 |
+
}
|
app/api/Google/Service/Exception.php
CHANGED
@@ -1,105 +1,105 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_Service_Exception extends Google_Exception implements Google_Task_Retryable
|
23 |
-
{
|
24 |
-
/**
|
25 |
-
* Optional list of errors returned in a JSON body of an HTTP error response.
|
26 |
-
*/
|
27 |
-
protected $errors = array();
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @var array $retryMap Map of errors with retry counts.
|
31 |
-
*/
|
32 |
-
private $retryMap = array();
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Override default constructor to add the ability to set $errors and a retry
|
36 |
-
* map.
|
37 |
-
*
|
38 |
-
* @param string $message
|
39 |
-
* @param int $code
|
40 |
-
* @param Exception|null $previous
|
41 |
-
* @param [{string, string}] errors List of errors returned in an HTTP
|
42 |
-
* response. Defaults to [].
|
43 |
-
* @param array|null $retryMap Map of errors with retry counts.
|
44 |
-
*/
|
45 |
-
public function __construct(
|
46 |
-
$message,
|
47 |
-
$code = 0,
|
48 |
-
Exception $previous = null,
|
49 |
-
$errors = array(),
|
50 |
-
array $retryMap = null
|
51 |
-
) {
|
52 |
-
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
|
53 |
-
parent::__construct($message, $code, $previous);
|
54 |
-
} else {
|
55 |
-
parent::__construct($message, $code);
|
56 |
-
}
|
57 |
-
|
58 |
-
$this->errors = $errors;
|
59 |
-
|
60 |
-
if (is_array($retryMap)) {
|
61 |
-
$this->retryMap = $retryMap;
|
62 |
-
}
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* An example of the possible errors returned.
|
67 |
-
*
|
68 |
-
* {
|
69 |
-
* "domain": "global",
|
70 |
-
* "reason": "authError",
|
71 |
-
* "message": "Invalid Credentials",
|
72 |
-
* "locationType": "header",
|
73 |
-
* "location": "Authorization",
|
74 |
-
* }
|
75 |
-
*
|
76 |
-
* @return [{string, string}] List of errors return in an HTTP response or [].
|
77 |
-
*/
|
78 |
-
public function getErrors()
|
79 |
-
{
|
80 |
-
return $this->errors;
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Gets the number of times the associated task can be retried.
|
85 |
-
*
|
86 |
-
* NOTE: -1 is returned if the task can be retried indefinitely
|
87 |
-
*
|
88 |
-
* @return integer
|
89 |
-
*/
|
90 |
-
public function allowedRetries()
|
91 |
-
{
|
92 |
-
if (isset($this->retryMap[$this->code])) {
|
93 |
-
return $this->retryMap[$this->code];
|
94 |
-
}
|
95 |
-
|
96 |
-
$errors = $this->getErrors();
|
97 |
-
|
98 |
-
if (!empty($errors) && isset($errors[0]['reason']) &&
|
99 |
-
isset($this->retryMap[$errors[0]['reason']])) {
|
100 |
-
return $this->retryMap[$errors[0]['reason']];
|
101 |
-
}
|
102 |
-
|
103 |
-
return 0;
|
104 |
-
}
|
105 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_Service_Exception extends Google_Exception implements Google_Task_Retryable
|
23 |
+
{
|
24 |
+
/**
|
25 |
+
* Optional list of errors returned in a JSON body of an HTTP error response.
|
26 |
+
*/
|
27 |
+
protected $errors = array();
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @var array $retryMap Map of errors with retry counts.
|
31 |
+
*/
|
32 |
+
private $retryMap = array();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Override default constructor to add the ability to set $errors and a retry
|
36 |
+
* map.
|
37 |
+
*
|
38 |
+
* @param string $message
|
39 |
+
* @param int $code
|
40 |
+
* @param Exception|null $previous
|
41 |
+
* @param [{string, string}] errors List of errors returned in an HTTP
|
42 |
+
* response. Defaults to [].
|
43 |
+
* @param array|null $retryMap Map of errors with retry counts.
|
44 |
+
*/
|
45 |
+
public function __construct(
|
46 |
+
$message,
|
47 |
+
$code = 0,
|
48 |
+
Exception $previous = null,
|
49 |
+
$errors = array(),
|
50 |
+
array $retryMap = null
|
51 |
+
) {
|
52 |
+
if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
|
53 |
+
parent::__construct($message, $code, $previous);
|
54 |
+
} else {
|
55 |
+
parent::__construct($message, $code);
|
56 |
+
}
|
57 |
+
|
58 |
+
$this->errors = $errors;
|
59 |
+
|
60 |
+
if (is_array($retryMap)) {
|
61 |
+
$this->retryMap = $retryMap;
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* An example of the possible errors returned.
|
67 |
+
*
|
68 |
+
* {
|
69 |
+
* "domain": "global",
|
70 |
+
* "reason": "authError",
|
71 |
+
* "message": "Invalid Credentials",
|
72 |
+
* "locationType": "header",
|
73 |
+
* "location": "Authorization",
|
74 |
+
* }
|
75 |
+
*
|
76 |
+
* @return [{string, string}] List of errors return in an HTTP response or [].
|
77 |
+
*/
|
78 |
+
public function getErrors()
|
79 |
+
{
|
80 |
+
return $this->errors;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Gets the number of times the associated task can be retried.
|
85 |
+
*
|
86 |
+
* NOTE: -1 is returned if the task can be retried indefinitely
|
87 |
+
*
|
88 |
+
* @return integer
|
89 |
+
*/
|
90 |
+
public function allowedRetries()
|
91 |
+
{
|
92 |
+
if (isset($this->retryMap[$this->code])) {
|
93 |
+
return $this->retryMap[$this->code];
|
94 |
+
}
|
95 |
+
|
96 |
+
$errors = $this->getErrors();
|
97 |
+
|
98 |
+
if (!empty($errors) && isset($errors[0]['reason']) &&
|
99 |
+
isset($this->retryMap[$errors[0]['reason']])) {
|
100 |
+
return $this->retryMap[$errors[0]['reason']];
|
101 |
+
}
|
102 |
+
|
103 |
+
return 0;
|
104 |
+
}
|
105 |
+
}
|
app/api/Google/Service/Resource.php
CHANGED
@@ -1,255 +1,255 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Copyright 2010 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Implements the actual methods/resources of the discovered Google API using magic function
|
24 |
-
* calling overloading (__call()), which on call will see if the method name (plus.activities.list)
|
25 |
-
* is available in this service, and if so construct an apiHttpRequest representing it.
|
26 |
-
*
|
27 |
-
*/
|
28 |
-
class Google_Service_Resource
|
29 |
-
{
|
30 |
-
// Valid query parameters that work, but don't appear in discovery.
|
31 |
-
private $stackParameters = array(
|
32 |
-
'alt' => array('type' => 'string', 'location' => 'query'),
|
33 |
-
'fields' => array('type' => 'string', 'location' => 'query'),
|
34 |
-
'trace' => array('type' => 'string', 'location' => 'query'),
|
35 |
-
'userIp' => array('type' => 'string', 'location' => 'query'),
|
36 |
-
'quotaUser' => array('type' => 'string', 'location' => 'query'),
|
37 |
-
'data' => array('type' => 'string', 'location' => 'body'),
|
38 |
-
'mimeType' => array('type' => 'string', 'location' => 'header'),
|
39 |
-
'uploadType' => array('type' => 'string', 'location' => 'query'),
|
40 |
-
'mediaUpload' => array('type' => 'complex', 'location' => 'query'),
|
41 |
-
'prettyPrint' => array('type' => 'string', 'location' => 'query'),
|
42 |
-
);
|
43 |
-
|
44 |
-
/** @var string $rootUrl */
|
45 |
-
private $rootUrl;
|
46 |
-
|
47 |
-
/** @var Google_Client $client */
|
48 |
-
private $client;
|
49 |
-
|
50 |
-
/** @var string $serviceName */
|
51 |
-
private $serviceName;
|
52 |
-
|
53 |
-
/** @var string $servicePath */
|
54 |
-
private $servicePath;
|
55 |
-
|
56 |
-
/** @var string $resourceName */
|
57 |
-
private $resourceName;
|
58 |
-
|
59 |
-
/** @var array $methods */
|
60 |
-
private $methods;
|
61 |
-
|
62 |
-
public function __construct($service, $serviceName, $resourceName, $resource)
|
63 |
-
{
|
64 |
-
$this->rootUrl = $service->rootUrl;
|
65 |
-
$this->client = $service->getClient();
|
66 |
-
$this->servicePath = $service->servicePath;
|
67 |
-
$this->serviceName = $serviceName;
|
68 |
-
$this->resourceName = $resourceName;
|
69 |
-
$this->methods = is_array($resource) && isset($resource['methods']) ?
|
70 |
-
$resource['methods'] :
|
71 |
-
array($resourceName => $resource);
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* TODO: This function needs simplifying.
|
76 |
-
* @param $name
|
77 |
-
* @param $arguments
|
78 |
-
* @param $expected_class - optional, the expected class name
|
79 |
-
* @return Google_Http_Request|expected_class
|
80 |
-
* @throws Google_Exception
|
81 |
-
*/
|
82 |
-
public function call($name, $arguments, $expected_class = null)
|
83 |
-
{
|
84 |
-
if (! isset($this->methods[$name])) {
|
85 |
-
$this->client->getLogger()->error(
|
86 |
-
'Service method unknown',
|
87 |
-
array(
|
88 |
-
'service' => $this->serviceName,
|
89 |
-
'resource' => $this->resourceName,
|
90 |
-
'method' => $name
|
91 |
-
)
|
92 |
-
);
|
93 |
-
|
94 |
-
throw new Google_Exception(
|
95 |
-
"Unknown function: " .
|
96 |
-
"{$this->serviceName}->{$this->resourceName}->{$name}()"
|
97 |
-
);
|
98 |
-
}
|
99 |
-
$method = $this->methods[$name];
|
100 |
-
$parameters = $arguments[0];
|
101 |
-
|
102 |
-
// postBody is a special case since it's not defined in the discovery
|
103 |
-
// document as parameter, but we abuse the param entry for storing it.
|
104 |
-
$postBody = null;
|
105 |
-
if (isset($parameters['postBody'])) {
|
106 |
-
if ($parameters['postBody'] instanceof Google_Model) {
|
107 |
-
// In the cases the post body is an existing object, we want
|
108 |
-
// to use the smart method to create a simple object for
|
109 |
-
// for JSONification.
|
110 |
-
$parameters['postBody'] = $parameters['postBody']->toSimpleObject();
|
111 |
-
} else if (is_object($parameters['postBody'])) {
|
112 |
-
// If the post body is another kind of object, we will try and
|
113 |
-
// wrangle it into a sensible format.
|
114 |
-
$parameters['postBody'] =
|
115 |
-
$this->convertToArrayAndStripNulls($parameters['postBody']);
|
116 |
-
}
|
117 |
-
$postBody = json_encode($parameters['postBody']);
|
118 |
-
if ($postBody === false && $parameters['postBody'] !== false) {
|
119 |
-
throw new Google_Exception("JSON encoding failed. Ensure all strings in the request are UTF-8 encoded.");
|
120 |
-
}
|
121 |
-
unset($parameters['postBody']);
|
122 |
-
}
|
123 |
-
|
124 |
-
// TODO: optParams here probably should have been
|
125 |
-
// handled already - this may well be redundant code.
|
126 |
-
if (isset($parameters['optParams'])) {
|
127 |
-
$optParams = $parameters['optParams'];
|
128 |
-
unset($parameters['optParams']);
|
129 |
-
$parameters = array_merge($parameters, $optParams);
|
130 |
-
}
|
131 |
-
|
132 |
-
if (!isset($method['parameters'])) {
|
133 |
-
$method['parameters'] = array();
|
134 |
-
}
|
135 |
-
|
136 |
-
$method['parameters'] = array_merge(
|
137 |
-
$this->stackParameters,
|
138 |
-
$method['parameters']
|
139 |
-
);
|
140 |
-
foreach ($parameters as $key => $val) {
|
141 |
-
if ($key != 'postBody' && ! isset($method['parameters'][$key])) {
|
142 |
-
$this->client->getLogger()->error(
|
143 |
-
'Service parameter unknown',
|
144 |
-
array(
|
145 |
-
'service' => $this->serviceName,
|
146 |
-
'resource' => $this->resourceName,
|
147 |
-
'method' => $name,
|
148 |
-
'parameter' => $key
|
149 |
-
)
|
150 |
-
);
|
151 |
-
throw new Google_Exception("($name) unknown parameter: '$key'");
|
152 |
-
}
|
153 |
-
}
|
154 |
-
|
155 |
-
foreach ($method['parameters'] as $paramName => $paramSpec) {
|
156 |
-
if (isset($paramSpec['required']) &&
|
157 |
-
$paramSpec['required'] &&
|
158 |
-
! isset($parameters[$paramName])
|
159 |
-
) {
|
160 |
-
$this->client->getLogger()->error(
|
161 |
-
'Service parameter missing',
|
162 |
-
array(
|
163 |
-
'service' => $this->serviceName,
|
164 |
-
'resource' => $this->resourceName,
|
165 |
-
'method' => $name,
|
166 |
-
'parameter' => $paramName
|
167 |
-
)
|
168 |
-
);
|
169 |
-
throw new Google_Exception("($name) missing required param: '$paramName'");
|
170 |
-
}
|
171 |
-
if (isset($parameters[$paramName])) {
|
172 |
-
$value = $parameters[$paramName];
|
173 |
-
$parameters[$paramName] = $paramSpec;
|
174 |
-
$parameters[$paramName]['value'] = $value;
|
175 |
-
unset($parameters[$paramName]['required']);
|
176 |
-
} else {
|
177 |
-
// Ensure we don't pass nulls.
|
178 |
-
unset($parameters[$paramName]);
|
179 |
-
}
|
180 |
-
}
|
181 |
-
|
182 |
-
$this->client->getLogger()->info(
|
183 |
-
'Service Call',
|
184 |
-
array(
|
185 |
-
'service' => $this->serviceName,
|
186 |
-
'resource' => $this->resourceName,
|
187 |
-
'method' => $name,
|
188 |
-
'arguments' => $parameters,
|
189 |
-
)
|
190 |
-
);
|
191 |
-
|
192 |
-
$url = Google_Http_REST::createRequestUri(
|
193 |
-
$this->servicePath,
|
194 |
-
$method['path'],
|
195 |
-
$parameters
|
196 |
-
);
|
197 |
-
$httpRequest = new Google_Http_Request(
|
198 |
-
$url,
|
199 |
-
$method['httpMethod'],
|
200 |
-
null,
|
201 |
-
$postBody
|
202 |
-
);
|
203 |
-
|
204 |
-
if ($this->rootUrl) {
|
205 |
-
$httpRequest->setBaseComponent($this->rootUrl);
|
206 |
-
} else {
|
207 |
-
$httpRequest->setBaseComponent($this->client->getBasePath());
|
208 |
-
}
|
209 |
-
|
210 |
-
if ($postBody) {
|
211 |
-
$contentTypeHeader = array();
|
212 |
-
$contentTypeHeader['content-type'] = 'application/json; charset=UTF-8';
|
213 |
-
$httpRequest->setRequestHeaders($contentTypeHeader);
|
214 |
-
$httpRequest->setPostBody($postBody);
|
215 |
-
}
|
216 |
-
|
217 |
-
$httpRequest = $this->client->getAuth()->sign($httpRequest);
|
218 |
-
$httpRequest->setExpectedClass($expected_class);
|
219 |
-
|
220 |
-
if (isset($parameters['data']) &&
|
221 |
-
($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) {
|
222 |
-
// If we are doing a simple media upload, trigger that as a convenience.
|
223 |
-
$mfu = new Google_Http_MediaFileUpload(
|
224 |
-
$this->client,
|
225 |
-
$httpRequest,
|
226 |
-
isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream',
|
227 |
-
$parameters['data']['value']
|
228 |
-
);
|
229 |
-
}
|
230 |
-
|
231 |
-
if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') {
|
232 |
-
$httpRequest->enableExpectedRaw();
|
233 |
-
}
|
234 |
-
|
235 |
-
if ($this->client->shouldDefer()) {
|
236 |
-
// If we are in batch or upload mode, return the raw request.
|
237 |
-
return $httpRequest;
|
238 |
-
}
|
239 |
-
|
240 |
-
return $this->client->execute($httpRequest);
|
241 |
-
}
|
242 |
-
|
243 |
-
protected function convertToArrayAndStripNulls($o)
|
244 |
-
{
|
245 |
-
$o = (array) $o;
|
246 |
-
foreach ($o as $k => $v) {
|
247 |
-
if ($v === null) {
|
248 |
-
unset($o[$k]);
|
249 |
-
} elseif (is_object($v) || is_array($v)) {
|
250 |
-
$o[$k] = $this->convertToArrayAndStripNulls($o[$k]);
|
251 |
-
}
|
252 |
-
}
|
253 |
-
return $o;
|
254 |
-
}
|
255 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2010 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Implements the actual methods/resources of the discovered Google API using magic function
|
24 |
+
* calling overloading (__call()), which on call will see if the method name (plus.activities.list)
|
25 |
+
* is available in this service, and if so construct an apiHttpRequest representing it.
|
26 |
+
*
|
27 |
+
*/
|
28 |
+
class Google_Service_Resource
|
29 |
+
{
|
30 |
+
// Valid query parameters that work, but don't appear in discovery.
|
31 |
+
private $stackParameters = array(
|
32 |
+
'alt' => array('type' => 'string', 'location' => 'query'),
|
33 |
+
'fields' => array('type' => 'string', 'location' => 'query'),
|
34 |
+
'trace' => array('type' => 'string', 'location' => 'query'),
|
35 |
+
'userIp' => array('type' => 'string', 'location' => 'query'),
|
36 |
+
'quotaUser' => array('type' => 'string', 'location' => 'query'),
|
37 |
+
'data' => array('type' => 'string', 'location' => 'body'),
|
38 |
+
'mimeType' => array('type' => 'string', 'location' => 'header'),
|
39 |
+
'uploadType' => array('type' => 'string', 'location' => 'query'),
|
40 |
+
'mediaUpload' => array('type' => 'complex', 'location' => 'query'),
|
41 |
+
'prettyPrint' => array('type' => 'string', 'location' => 'query'),
|
42 |
+
);
|
43 |
+
|
44 |
+
/** @var string $rootUrl */
|
45 |
+
private $rootUrl;
|
46 |
+
|
47 |
+
/** @var Google_Client $client */
|
48 |
+
private $client;
|
49 |
+
|
50 |
+
/** @var string $serviceName */
|
51 |
+
private $serviceName;
|
52 |
+
|
53 |
+
/** @var string $servicePath */
|
54 |
+
private $servicePath;
|
55 |
+
|
56 |
+
/** @var string $resourceName */
|
57 |
+
private $resourceName;
|
58 |
+
|
59 |
+
/** @var array $methods */
|
60 |
+
private $methods;
|
61 |
+
|
62 |
+
public function __construct($service, $serviceName, $resourceName, $resource)
|
63 |
+
{
|
64 |
+
$this->rootUrl = $service->rootUrl;
|
65 |
+
$this->client = $service->getClient();
|
66 |
+
$this->servicePath = $service->servicePath;
|
67 |
+
$this->serviceName = $serviceName;
|
68 |
+
$this->resourceName = $resourceName;
|
69 |
+
$this->methods = is_array($resource) && isset($resource['methods']) ?
|
70 |
+
$resource['methods'] :
|
71 |
+
array($resourceName => $resource);
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* TODO: This function needs simplifying.
|
76 |
+
* @param $name
|
77 |
+
* @param $arguments
|
78 |
+
* @param $expected_class - optional, the expected class name
|
79 |
+
* @return Google_Http_Request|expected_class
|
80 |
+
* @throws Google_Exception
|
81 |
+
*/
|
82 |
+
public function call($name, $arguments, $expected_class = null)
|
83 |
+
{
|
84 |
+
if (! isset($this->methods[$name])) {
|
85 |
+
$this->client->getLogger()->error(
|
86 |
+
'Service method unknown',
|
87 |
+
array(
|
88 |
+
'service' => $this->serviceName,
|
89 |
+
'resource' => $this->resourceName,
|
90 |
+
'method' => $name
|
91 |
+
)
|
92 |
+
);
|
93 |
+
|
94 |
+
throw new Google_Exception(
|
95 |
+
"Unknown function: " .
|
96 |
+
"{$this->serviceName}->{$this->resourceName}->{$name}()"
|
97 |
+
);
|
98 |
+
}
|
99 |
+
$method = $this->methods[$name];
|
100 |
+
$parameters = $arguments[0];
|
101 |
+
|
102 |
+
// postBody is a special case since it's not defined in the discovery
|
103 |
+
// document as parameter, but we abuse the param entry for storing it.
|
104 |
+
$postBody = null;
|
105 |
+
if (isset($parameters['postBody'])) {
|
106 |
+
if ($parameters['postBody'] instanceof Google_Model) {
|
107 |
+
// In the cases the post body is an existing object, we want
|
108 |
+
// to use the smart method to create a simple object for
|
109 |
+
// for JSONification.
|
110 |
+
$parameters['postBody'] = $parameters['postBody']->toSimpleObject();
|
111 |
+
} else if (is_object($parameters['postBody'])) {
|
112 |
+
// If the post body is another kind of object, we will try and
|
113 |
+
// wrangle it into a sensible format.
|
114 |
+
$parameters['postBody'] =
|
115 |
+
$this->convertToArrayAndStripNulls($parameters['postBody']);
|
116 |
+
}
|
117 |
+
$postBody = json_encode($parameters['postBody']);
|
118 |
+
if ($postBody === false && $parameters['postBody'] !== false) {
|
119 |
+
throw new Google_Exception("JSON encoding failed. Ensure all strings in the request are UTF-8 encoded.");
|
120 |
+
}
|
121 |
+
unset($parameters['postBody']);
|
122 |
+
}
|
123 |
+
|
124 |
+
// TODO: optParams here probably should have been
|
125 |
+
// handled already - this may well be redundant code.
|
126 |
+
if (isset($parameters['optParams'])) {
|
127 |
+
$optParams = $parameters['optParams'];
|
128 |
+
unset($parameters['optParams']);
|
129 |
+
$parameters = array_merge($parameters, $optParams);
|
130 |
+
}
|
131 |
+
|
132 |
+
if (!isset($method['parameters'])) {
|
133 |
+
$method['parameters'] = array();
|
134 |
+
}
|
135 |
+
|
136 |
+
$method['parameters'] = array_merge(
|
137 |
+
$this->stackParameters,
|
138 |
+
$method['parameters']
|
139 |
+
);
|
140 |
+
foreach ($parameters as $key => $val) {
|
141 |
+
if ($key != 'postBody' && ! isset($method['parameters'][$key])) {
|
142 |
+
$this->client->getLogger()->error(
|
143 |
+
'Service parameter unknown',
|
144 |
+
array(
|
145 |
+
'service' => $this->serviceName,
|
146 |
+
'resource' => $this->resourceName,
|
147 |
+
'method' => $name,
|
148 |
+
'parameter' => $key
|
149 |
+
)
|
150 |
+
);
|
151 |
+
throw new Google_Exception("($name) unknown parameter: '$key'");
|
152 |
+
}
|
153 |
+
}
|
154 |
+
|
155 |
+
foreach ($method['parameters'] as $paramName => $paramSpec) {
|
156 |
+
if (isset($paramSpec['required']) &&
|
157 |
+
$paramSpec['required'] &&
|
158 |
+
! isset($parameters[$paramName])
|
159 |
+
) {
|
160 |
+
$this->client->getLogger()->error(
|
161 |
+
'Service parameter missing',
|
162 |
+
array(
|
163 |
+
'service' => $this->serviceName,
|
164 |
+
'resource' => $this->resourceName,
|
165 |
+
'method' => $name,
|
166 |
+
'parameter' => $paramName
|
167 |
+
)
|
168 |
+
);
|
169 |
+
throw new Google_Exception("($name) missing required param: '$paramName'");
|
170 |
+
}
|
171 |
+
if (isset($parameters[$paramName])) {
|
172 |
+
$value = $parameters[$paramName];
|
173 |
+
$parameters[$paramName] = $paramSpec;
|
174 |
+
$parameters[$paramName]['value'] = $value;
|
175 |
+
unset($parameters[$paramName]['required']);
|
176 |
+
} else {
|
177 |
+
// Ensure we don't pass nulls.
|
178 |
+
unset($parameters[$paramName]);
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
$this->client->getLogger()->info(
|
183 |
+
'Service Call',
|
184 |
+
array(
|
185 |
+
'service' => $this->serviceName,
|
186 |
+
'resource' => $this->resourceName,
|
187 |
+
'method' => $name,
|
188 |
+
'arguments' => $parameters,
|
189 |
+
)
|
190 |
+
);
|
191 |
+
|
192 |
+
$url = Google_Http_REST::createRequestUri(
|
193 |
+
$this->servicePath,
|
194 |
+
$method['path'],
|
195 |
+
$parameters
|
196 |
+
);
|
197 |
+
$httpRequest = new Google_Http_Request(
|
198 |
+
$url,
|
199 |
+
$method['httpMethod'],
|
200 |
+
null,
|
201 |
+
$postBody
|
202 |
+
);
|
203 |
+
|
204 |
+
if ($this->rootUrl) {
|
205 |
+
$httpRequest->setBaseComponent($this->rootUrl);
|
206 |
+
} else {
|
207 |
+
$httpRequest->setBaseComponent($this->client->getBasePath());
|
208 |
+
}
|
209 |
+
|
210 |
+
if ($postBody) {
|
211 |
+
$contentTypeHeader = array();
|
212 |
+
$contentTypeHeader['content-type'] = 'application/json; charset=UTF-8';
|
213 |
+
$httpRequest->setRequestHeaders($contentTypeHeader);
|
214 |
+
$httpRequest->setPostBody($postBody);
|
215 |
+
}
|
216 |
+
|
217 |
+
$httpRequest = $this->client->getAuth()->sign($httpRequest);
|
218 |
+
$httpRequest->setExpectedClass($expected_class);
|
219 |
+
|
220 |
+
if (isset($parameters['data']) &&
|
221 |
+
($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) {
|
222 |
+
// If we are doing a simple media upload, trigger that as a convenience.
|
223 |
+
$mfu = new Google_Http_MediaFileUpload(
|
224 |
+
$this->client,
|
225 |
+
$httpRequest,
|
226 |
+
isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream',
|
227 |
+
$parameters['data']['value']
|
228 |
+
);
|
229 |
+
}
|
230 |
+
|
231 |
+
if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') {
|
232 |
+
$httpRequest->enableExpectedRaw();
|
233 |
+
}
|
234 |
+
|
235 |
+
if ($this->client->shouldDefer()) {
|
236 |
+
// If we are in batch or upload mode, return the raw request.
|
237 |
+
return $httpRequest;
|
238 |
+
}
|
239 |
+
|
240 |
+
return $this->client->execute($httpRequest);
|
241 |
+
}
|
242 |
+
|
243 |
+
protected function convertToArrayAndStripNulls($o)
|
244 |
+
{
|
245 |
+
$o = (array) $o;
|
246 |
+
foreach ($o as $k => $v) {
|
247 |
+
if ($v === null) {
|
248 |
+
unset($o[$k]);
|
249 |
+
} elseif (is_object($v) || is_array($v)) {
|
250 |
+
$o[$k] = $this->convertToArrayAndStripNulls($o[$k]);
|
251 |
+
}
|
252 |
+
}
|
253 |
+
return $o;
|
254 |
+
}
|
255 |
+
}
|
app/api/Google/Signer/Abstract.php
CHANGED
@@ -1,29 +1,29 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Signs data.
|
20 |
-
*
|
21 |
-
* @author Brian Eaton <beaton@google.com>
|
22 |
-
*/
|
23 |
-
abstract class Google_Signer_Abstract
|
24 |
-
{
|
25 |
-
/**
|
26 |
-
* Signs data, returns the signature as binary data.
|
27 |
-
*/
|
28 |
-
abstract public function sign($data);
|
29 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Signs data.
|
20 |
+
*
|
21 |
+
* @author Brian Eaton <beaton@google.com>
|
22 |
+
*/
|
23 |
+
abstract class Google_Signer_Abstract
|
24 |
+
{
|
25 |
+
/**
|
26 |
+
* Signs data, returns the signature as binary data.
|
27 |
+
*/
|
28 |
+
abstract public function sign($data);
|
29 |
+
}
|
app/api/Google/Signer/P12.php
CHANGED
@@ -1,94 +1,94 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Signs data.
|
24 |
-
*
|
25 |
-
* Only used for testing.
|
26 |
-
*
|
27 |
-
* @author Brian Eaton <beaton@google.com>
|
28 |
-
*/
|
29 |
-
class Google_Signer_P12 extends Google_Signer_Abstract
|
30 |
-
{
|
31 |
-
// OpenSSL private key resource
|
32 |
-
private $privateKey;
|
33 |
-
|
34 |
-
// Creates a new signer from a .p12 file.
|
35 |
-
public function __construct($p12, $password)
|
36 |
-
{
|
37 |
-
if (!function_exists('openssl_x509_read')) {
|
38 |
-
throw new Google_Exception(
|
39 |
-
'The Google PHP API library needs the openssl PHP extension'
|
40 |
-
);
|
41 |
-
}
|
42 |
-
|
43 |
-
// If the private key is provided directly, then this isn't in the p12
|
44 |
-
// format. Different versions of openssl support different p12 formats
|
45 |
-
// and the key from google wasn't being accepted by the version available
|
46 |
-
// at the time.
|
47 |
-
if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) {
|
48 |
-
$this->privateKey = openssl_pkey_get_private($p12);
|
49 |
-
} elseif ($password === 'notasecret' && strpos($p12, "-----BEGIN PRIVATE KEY-----") !== false) {
|
50 |
-
$this->privateKey = openssl_pkey_get_private($p12);
|
51 |
-
} else {
|
52 |
-
// This throws on error
|
53 |
-
$certs = array();
|
54 |
-
if (!openssl_pkcs12_read($p12, $certs, $password)) {
|
55 |
-
throw new Google_Auth_Exception(
|
56 |
-
"Unable to parse the p12 file. " .
|
57 |
-
"Is this a .p12 file? Is the password correct? OpenSSL error: " .
|
58 |
-
openssl_error_string()
|
59 |
-
);
|
60 |
-
}
|
61 |
-
// TODO(beaton): is this part of the contract for the openssl_pkcs12_read
|
62 |
-
// method? What happens if there are multiple private keys? Do we care?
|
63 |
-
if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) {
|
64 |
-
throw new Google_Auth_Exception("No private key found in p12 file.");
|
65 |
-
}
|
66 |
-
$this->privateKey = openssl_pkey_get_private($certs['pkey']);
|
67 |
-
}
|
68 |
-
|
69 |
-
if (!$this->privateKey) {
|
70 |
-
throw new Google_Auth_Exception("Unable to load private key");
|
71 |
-
}
|
72 |
-
}
|
73 |
-
|
74 |
-
public function __destruct()
|
75 |
-
{
|
76 |
-
if ($this->privateKey) {
|
77 |
-
openssl_pkey_free($this->privateKey);
|
78 |
-
}
|
79 |
-
}
|
80 |
-
|
81 |
-
public function sign($data)
|
82 |
-
{
|
83 |
-
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
|
84 |
-
throw new Google_Auth_Exception(
|
85 |
-
"PHP 5.3.0 or higher is required to use service accounts."
|
86 |
-
);
|
87 |
-
}
|
88 |
-
$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
|
89 |
-
if (!openssl_sign($data, $signature, $this->privateKey, $hash)) {
|
90 |
-
throw new Google_Auth_Exception("Unable to sign data");
|
91 |
-
}
|
92 |
-
return $signature;
|
93 |
-
}
|
94 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Signs data.
|
24 |
+
*
|
25 |
+
* Only used for testing.
|
26 |
+
*
|
27 |
+
* @author Brian Eaton <beaton@google.com>
|
28 |
+
*/
|
29 |
+
class Google_Signer_P12 extends Google_Signer_Abstract
|
30 |
+
{
|
31 |
+
// OpenSSL private key resource
|
32 |
+
private $privateKey;
|
33 |
+
|
34 |
+
// Creates a new signer from a .p12 file.
|
35 |
+
public function __construct($p12, $password)
|
36 |
+
{
|
37 |
+
if (!function_exists('openssl_x509_read')) {
|
38 |
+
throw new Google_Exception(
|
39 |
+
'The Google PHP API library needs the openssl PHP extension'
|
40 |
+
);
|
41 |
+
}
|
42 |
+
|
43 |
+
// If the private key is provided directly, then this isn't in the p12
|
44 |
+
// format. Different versions of openssl support different p12 formats
|
45 |
+
// and the key from google wasn't being accepted by the version available
|
46 |
+
// at the time.
|
47 |
+
if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) {
|
48 |
+
$this->privateKey = openssl_pkey_get_private($p12);
|
49 |
+
} elseif ($password === 'notasecret' && strpos($p12, "-----BEGIN PRIVATE KEY-----") !== false) {
|
50 |
+
$this->privateKey = openssl_pkey_get_private($p12);
|
51 |
+
} else {
|
52 |
+
// This throws on error
|
53 |
+
$certs = array();
|
54 |
+
if (!openssl_pkcs12_read($p12, $certs, $password)) {
|
55 |
+
throw new Google_Auth_Exception(
|
56 |
+
"Unable to parse the p12 file. " .
|
57 |
+
"Is this a .p12 file? Is the password correct? OpenSSL error: " .
|
58 |
+
openssl_error_string()
|
59 |
+
);
|
60 |
+
}
|
61 |
+
// TODO(beaton): is this part of the contract for the openssl_pkcs12_read
|
62 |
+
// method? What happens if there are multiple private keys? Do we care?
|
63 |
+
if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) {
|
64 |
+
throw new Google_Auth_Exception("No private key found in p12 file.");
|
65 |
+
}
|
66 |
+
$this->privateKey = openssl_pkey_get_private($certs['pkey']);
|
67 |
+
}
|
68 |
+
|
69 |
+
if (!$this->privateKey) {
|
70 |
+
throw new Google_Auth_Exception("Unable to load private key");
|
71 |
+
}
|
72 |
+
}
|
73 |
+
|
74 |
+
public function __destruct()
|
75 |
+
{
|
76 |
+
if ($this->privateKey) {
|
77 |
+
openssl_pkey_free($this->privateKey);
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
public function sign($data)
|
82 |
+
{
|
83 |
+
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
|
84 |
+
throw new Google_Auth_Exception(
|
85 |
+
"PHP 5.3.0 or higher is required to use service accounts."
|
86 |
+
);
|
87 |
+
}
|
88 |
+
$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
|
89 |
+
if (!openssl_sign($data, $signature, $this->privateKey, $hash)) {
|
90 |
+
throw new Google_Auth_Exception("Unable to sign data");
|
91 |
+
}
|
92 |
+
return $signature;
|
93 |
+
}
|
94 |
+
}
|
app/api/Google/Task/Exception.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
class Google_Task_Exception extends Google_Exception
|
23 |
-
{
|
24 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
class Google_Task_Exception extends Google_Exception
|
23 |
+
{
|
24 |
+
}
|
app/api/Google/Task/Retryable.php
CHANGED
@@ -1,36 +1,36 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Interface for checking how many times a given task can be retried following
|
24 |
-
* a failure.
|
25 |
-
*/
|
26 |
-
interface Google_Task_Retryable
|
27 |
-
{
|
28 |
-
/**
|
29 |
-
* Gets the number of times the associated task can be retried.
|
30 |
-
*
|
31 |
-
* NOTE: -1 is returned if the task can be retried indefinitely
|
32 |
-
*
|
33 |
-
* @return integer
|
34 |
-
*/
|
35 |
-
public function allowedRetries();
|
36 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Interface for checking how many times a given task can be retried following
|
24 |
+
* a failure.
|
25 |
+
*/
|
26 |
+
interface Google_Task_Retryable
|
27 |
+
{
|
28 |
+
/**
|
29 |
+
* Gets the number of times the associated task can be retried.
|
30 |
+
*
|
31 |
+
* NOTE: -1 is returned if the task can be retried indefinitely
|
32 |
+
*
|
33 |
+
* @return integer
|
34 |
+
*/
|
35 |
+
public function allowedRetries();
|
36 |
+
}
|
app/api/Google/Task/Runner.php
CHANGED
@@ -1,257 +1,257 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* A task runner with exponential backoff support.
|
24 |
-
*
|
25 |
-
* @see https://developers.google.com/drive/web/handle-errors#implementing_exponential_backoff
|
26 |
-
*/
|
27 |
-
class Google_Task_Runner
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* @var integer $maxDelay The max time (in seconds) to wait before a retry.
|
31 |
-
*/
|
32 |
-
private $maxDelay = 60;
|
33 |
-
/**
|
34 |
-
* @var integer $delay The previous delay from which the next is calculated.
|
35 |
-
*/
|
36 |
-
private $delay = 1;
|
37 |
-
|
38 |
-
/**
|
39 |
-
* @var integer $factor The base number for the exponential back off.
|
40 |
-
*/
|
41 |
-
private $factor = 2;
|
42 |
-
/**
|
43 |
-
* @var float $jitter A random number between -$jitter and $jitter will be
|
44 |
-
* added to $factor on each iteration to allow for a better distribution of
|
45 |
-
* retries.
|
46 |
-
*/
|
47 |
-
private $jitter = 0.5;
|
48 |
-
|
49 |
-
/**
|
50 |
-
* @var integer $attempts The number of attempts that have been tried so far.
|
51 |
-
*/
|
52 |
-
private $attempts = 0;
|
53 |
-
/**
|
54 |
-
* @var integer $maxAttempts The max number of attempts allowed.
|
55 |
-
*/
|
56 |
-
private $maxAttempts = 1;
|
57 |
-
|
58 |
-
/**
|
59 |
-
* @var Google_Client $client The current API client.
|
60 |
-
*/
|
61 |
-
private $client;
|
62 |
-
|
63 |
-
/**
|
64 |
-
* @var string $name The name of the current task (used for logging).
|
65 |
-
*/
|
66 |
-
private $name;
|
67 |
-
/**
|
68 |
-
* @var callable $action The task to run and possibly retry.
|
69 |
-
*/
|
70 |
-
private $action;
|
71 |
-
/**
|
72 |
-
* @var array $arguments The task arguments.
|
73 |
-
*/
|
74 |
-
private $arguments;
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Creates a new task runner with exponential backoff support.
|
78 |
-
*
|
79 |
-
* @param Google_Client $client The current API client
|
80 |
-
* @param string $name The name of the current task (used for logging)
|
81 |
-
* @param callable $action The task to run and possibly retry
|
82 |
-
* @param array $arguments The task arguments
|
83 |
-
* @throws Google_Task_Exception when misconfigured
|
84 |
-
*/
|
85 |
-
public function __construct(
|
86 |
-
Google_Client $client,
|
87 |
-
$name,
|
88 |
-
$action,
|
89 |
-
array $arguments = array()
|
90 |
-
) {
|
91 |
-
$config = (array) $client->getClassConfig('Google_Task_Runner');
|
92 |
-
|
93 |
-
if (isset($config['initial_delay'])) {
|
94 |
-
if ($config['initial_delay'] < 0) {
|
95 |
-
throw new Google_Task_Exception(
|
96 |
-
'Task configuration `initial_delay` must not be negative.'
|
97 |
-
);
|
98 |
-
}
|
99 |
-
|
100 |
-
$this->delay = $config['initial_delay'];
|
101 |
-
}
|
102 |
-
|
103 |
-
if (isset($config['max_delay'])) {
|
104 |
-
if ($config['max_delay'] <= 0) {
|
105 |
-
throw new Google_Task_Exception(
|
106 |
-
'Task configuration `max_delay` must be greater than 0.'
|
107 |
-
);
|
108 |
-
}
|
109 |
-
|
110 |
-
$this->maxDelay = $config['max_delay'];
|
111 |
-
}
|
112 |
-
|
113 |
-
if (isset($config['factor'])) {
|
114 |
-
if ($config['factor'] <= 0) {
|
115 |
-
throw new Google_Task_Exception(
|
116 |
-
'Task configuration `factor` must be greater than 0.'
|
117 |
-
);
|
118 |
-
}
|
119 |
-
|
120 |
-
$this->factor = $config['factor'];
|
121 |
-
}
|
122 |
-
|
123 |
-
if (isset($config['jitter'])) {
|
124 |
-
if ($config['jitter'] <= 0) {
|
125 |
-
throw new Google_Task_Exception(
|
126 |
-
'Task configuration `jitter` must be greater than 0.'
|
127 |
-
);
|
128 |
-
}
|
129 |
-
|
130 |
-
$this->jitter = $config['jitter'];
|
131 |
-
}
|
132 |
-
|
133 |
-
if (isset($config['retries'])) {
|
134 |
-
if ($config['retries'] < 0) {
|
135 |
-
throw new Google_Task_Exception(
|
136 |
-
'Task configuration `retries` must not be negative.'
|
137 |
-
);
|
138 |
-
}
|
139 |
-
$this->maxAttempts += $config['retries'];
|
140 |
-
}
|
141 |
-
|
142 |
-
if (!is_callable($action)) {
|
143 |
-
throw new Google_Task_Exception(
|
144 |
-
'Task argument `$action` must be a valid callable.'
|
145 |
-
);
|
146 |
-
}
|
147 |
-
|
148 |
-
$this->name = $name;
|
149 |
-
$this->client = $client;
|
150 |
-
$this->action = $action;
|
151 |
-
$this->arguments = $arguments;
|
152 |
-
}
|
153 |
-
|
154 |
-
/**
|
155 |
-
* Checks if a retry can be attempted.
|
156 |
-
*
|
157 |
-
* @return boolean
|
158 |
-
*/
|
159 |
-
public function canAttmpt()
|
160 |
-
{
|
161 |
-
return $this->attempts < $this->maxAttempts;
|
162 |
-
}
|
163 |
-
|
164 |
-
/**
|
165 |
-
* Runs the task and (if applicable) automatically retries when errors occur.
|
166 |
-
*
|
167 |
-
* @return mixed
|
168 |
-
* @throws Google_Task_Retryable on failure when no retries are available.
|
169 |
-
*/
|
170 |
-
public function run()
|
171 |
-
{
|
172 |
-
while ($this->attempt()) {
|
173 |
-
try {
|
174 |
-
return call_user_func_array($this->action, $this->arguments);
|
175 |
-
} catch (Google_Task_Retryable $exception) {
|
176 |
-
$allowedRetries = $exception->allowedRetries();
|
177 |
-
|
178 |
-
if (!$this->canAttmpt() || !$allowedRetries) {
|
179 |
-
throw $exception;
|
180 |
-
}
|
181 |
-
|
182 |
-
if ($allowedRetries > 0) {
|
183 |
-
$this->maxAttempts = min(
|
184 |
-
$this->maxAttempts,
|
185 |
-
$this->attempts + $allowedRetries
|
186 |
-
);
|
187 |
-
}
|
188 |
-
}
|
189 |
-
}
|
190 |
-
}
|
191 |
-
|
192 |
-
/**
|
193 |
-
* Runs a task once, if possible. This is useful for bypassing the `run()`
|
194 |
-
* loop.
|
195 |
-
*
|
196 |
-
* NOTE: If this is not the first attempt, this function will sleep in
|
197 |
-
* accordance to the backoff configurations before running the task.
|
198 |
-
*
|
199 |
-
* @return boolean
|
200 |
-
*/
|
201 |
-
public function attempt()
|
202 |
-
{
|
203 |
-
if (!$this->canAttmpt()) {
|
204 |
-
return false;
|
205 |
-
}
|
206 |
-
|
207 |
-
if ($this->attempts > 0) {
|
208 |
-
$this->backOff();
|
209 |
-
}
|
210 |
-
|
211 |
-
$this->attempts++;
|
212 |
-
return true;
|
213 |
-
}
|
214 |
-
|
215 |
-
/**
|
216 |
-
* Sleeps in accordance to the backoff configurations.
|
217 |
-
*/
|
218 |
-
private function backOff()
|
219 |
-
{
|
220 |
-
$delay = $this->getDelay();
|
221 |
-
|
222 |
-
$this->client->getLogger()->debug(
|
223 |
-
'Retrying task with backoff',
|
224 |
-
array(
|
225 |
-
'request' => $this->name,
|
226 |
-
'retry' => $this->attempts,
|
227 |
-
'backoff_seconds' => $delay
|
228 |
-
)
|
229 |
-
);
|
230 |
-
|
231 |
-
usleep($delay * 1000000);
|
232 |
-
}
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Gets the delay (in seconds) for the current backoff period.
|
236 |
-
*
|
237 |
-
* @return float
|
238 |
-
*/
|
239 |
-
private function getDelay()
|
240 |
-
{
|
241 |
-
$jitter = $this->getJitter();
|
242 |
-
$factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter);
|
243 |
-
|
244 |
-
return $this->delay = min($this->maxDelay, $this->delay * $factor);
|
245 |
-
}
|
246 |
-
|
247 |
-
/**
|
248 |
-
* Gets the current jitter (random number between -$this->jitter and
|
249 |
-
* $this->jitter).
|
250 |
-
*
|
251 |
-
* @return float
|
252 |
-
*/
|
253 |
-
private function getJitter()
|
254 |
-
{
|
255 |
-
return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter;
|
256 |
-
}
|
257 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* A task runner with exponential backoff support.
|
24 |
+
*
|
25 |
+
* @see https://developers.google.com/drive/web/handle-errors#implementing_exponential_backoff
|
26 |
+
*/
|
27 |
+
class Google_Task_Runner
|
28 |
+
{
|
29 |
+
/**
|
30 |
+
* @var integer $maxDelay The max time (in seconds) to wait before a retry.
|
31 |
+
*/
|
32 |
+
private $maxDelay = 60;
|
33 |
+
/**
|
34 |
+
* @var integer $delay The previous delay from which the next is calculated.
|
35 |
+
*/
|
36 |
+
private $delay = 1;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var integer $factor The base number for the exponential back off.
|
40 |
+
*/
|
41 |
+
private $factor = 2;
|
42 |
+
/**
|
43 |
+
* @var float $jitter A random number between -$jitter and $jitter will be
|
44 |
+
* added to $factor on each iteration to allow for a better distribution of
|
45 |
+
* retries.
|
46 |
+
*/
|
47 |
+
private $jitter = 0.5;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @var integer $attempts The number of attempts that have been tried so far.
|
51 |
+
*/
|
52 |
+
private $attempts = 0;
|
53 |
+
/**
|
54 |
+
* @var integer $maxAttempts The max number of attempts allowed.
|
55 |
+
*/
|
56 |
+
private $maxAttempts = 1;
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @var Google_Client $client The current API client.
|
60 |
+
*/
|
61 |
+
private $client;
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @var string $name The name of the current task (used for logging).
|
65 |
+
*/
|
66 |
+
private $name;
|
67 |
+
/**
|
68 |
+
* @var callable $action The task to run and possibly retry.
|
69 |
+
*/
|
70 |
+
private $action;
|
71 |
+
/**
|
72 |
+
* @var array $arguments The task arguments.
|
73 |
+
*/
|
74 |
+
private $arguments;
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Creates a new task runner with exponential backoff support.
|
78 |
+
*
|
79 |
+
* @param Google_Client $client The current API client
|
80 |
+
* @param string $name The name of the current task (used for logging)
|
81 |
+
* @param callable $action The task to run and possibly retry
|
82 |
+
* @param array $arguments The task arguments
|
83 |
+
* @throws Google_Task_Exception when misconfigured
|
84 |
+
*/
|
85 |
+
public function __construct(
|
86 |
+
Google_Client $client,
|
87 |
+
$name,
|
88 |
+
$action,
|
89 |
+
array $arguments = array()
|
90 |
+
) {
|
91 |
+
$config = (array) $client->getClassConfig('Google_Task_Runner');
|
92 |
+
|
93 |
+
if (isset($config['initial_delay'])) {
|
94 |
+
if ($config['initial_delay'] < 0) {
|
95 |
+
throw new Google_Task_Exception(
|
96 |
+
'Task configuration `initial_delay` must not be negative.'
|
97 |
+
);
|
98 |
+
}
|
99 |
+
|
100 |
+
$this->delay = $config['initial_delay'];
|
101 |
+
}
|
102 |
+
|
103 |
+
if (isset($config['max_delay'])) {
|
104 |
+
if ($config['max_delay'] <= 0) {
|
105 |
+
throw new Google_Task_Exception(
|
106 |
+
'Task configuration `max_delay` must be greater than 0.'
|
107 |
+
);
|
108 |
+
}
|
109 |
+
|
110 |
+
$this->maxDelay = $config['max_delay'];
|
111 |
+
}
|
112 |
+
|
113 |
+
if (isset($config['factor'])) {
|
114 |
+
if ($config['factor'] <= 0) {
|
115 |
+
throw new Google_Task_Exception(
|
116 |
+
'Task configuration `factor` must be greater than 0.'
|
117 |
+
);
|
118 |
+
}
|
119 |
+
|
120 |
+
$this->factor = $config['factor'];
|
121 |
+
}
|
122 |
+
|
123 |
+
if (isset($config['jitter'])) {
|
124 |
+
if ($config['jitter'] <= 0) {
|
125 |
+
throw new Google_Task_Exception(
|
126 |
+
'Task configuration `jitter` must be greater than 0.'
|
127 |
+
);
|
128 |
+
}
|
129 |
+
|
130 |
+
$this->jitter = $config['jitter'];
|
131 |
+
}
|
132 |
+
|
133 |
+
if (isset($config['retries'])) {
|
134 |
+
if ($config['retries'] < 0) {
|
135 |
+
throw new Google_Task_Exception(
|
136 |
+
'Task configuration `retries` must not be negative.'
|
137 |
+
);
|
138 |
+
}
|
139 |
+
$this->maxAttempts += $config['retries'];
|
140 |
+
}
|
141 |
+
|
142 |
+
if (!is_callable($action)) {
|
143 |
+
throw new Google_Task_Exception(
|
144 |
+
'Task argument `$action` must be a valid callable.'
|
145 |
+
);
|
146 |
+
}
|
147 |
+
|
148 |
+
$this->name = $name;
|
149 |
+
$this->client = $client;
|
150 |
+
$this->action = $action;
|
151 |
+
$this->arguments = $arguments;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Checks if a retry can be attempted.
|
156 |
+
*
|
157 |
+
* @return boolean
|
158 |
+
*/
|
159 |
+
public function canAttmpt()
|
160 |
+
{
|
161 |
+
return $this->attempts < $this->maxAttempts;
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Runs the task and (if applicable) automatically retries when errors occur.
|
166 |
+
*
|
167 |
+
* @return mixed
|
168 |
+
* @throws Google_Task_Retryable on failure when no retries are available.
|
169 |
+
*/
|
170 |
+
public function run()
|
171 |
+
{
|
172 |
+
while ($this->attempt()) {
|
173 |
+
try {
|
174 |
+
return call_user_func_array($this->action, $this->arguments);
|
175 |
+
} catch (Google_Task_Retryable $exception) {
|
176 |
+
$allowedRetries = $exception->allowedRetries();
|
177 |
+
|
178 |
+
if (!$this->canAttmpt() || !$allowedRetries) {
|
179 |
+
throw $exception;
|
180 |
+
}
|
181 |
+
|
182 |
+
if ($allowedRetries > 0) {
|
183 |
+
$this->maxAttempts = min(
|
184 |
+
$this->maxAttempts,
|
185 |
+
$this->attempts + $allowedRetries
|
186 |
+
);
|
187 |
+
}
|
188 |
+
}
|
189 |
+
}
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Runs a task once, if possible. This is useful for bypassing the `run()`
|
194 |
+
* loop.
|
195 |
+
*
|
196 |
+
* NOTE: If this is not the first attempt, this function will sleep in
|
197 |
+
* accordance to the backoff configurations before running the task.
|
198 |
+
*
|
199 |
+
* @return boolean
|
200 |
+
*/
|
201 |
+
public function attempt()
|
202 |
+
{
|
203 |
+
if (!$this->canAttmpt()) {
|
204 |
+
return false;
|
205 |
+
}
|
206 |
+
|
207 |
+
if ($this->attempts > 0) {
|
208 |
+
$this->backOff();
|
209 |
+
}
|
210 |
+
|
211 |
+
$this->attempts++;
|
212 |
+
return true;
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Sleeps in accordance to the backoff configurations.
|
217 |
+
*/
|
218 |
+
private function backOff()
|
219 |
+
{
|
220 |
+
$delay = $this->getDelay();
|
221 |
+
|
222 |
+
$this->client->getLogger()->debug(
|
223 |
+
'Retrying task with backoff',
|
224 |
+
array(
|
225 |
+
'request' => $this->name,
|
226 |
+
'retry' => $this->attempts,
|
227 |
+
'backoff_seconds' => $delay
|
228 |
+
)
|
229 |
+
);
|
230 |
+
|
231 |
+
usleep($delay * 1000000);
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* Gets the delay (in seconds) for the current backoff period.
|
236 |
+
*
|
237 |
+
* @return float
|
238 |
+
*/
|
239 |
+
private function getDelay()
|
240 |
+
{
|
241 |
+
$jitter = $this->getJitter();
|
242 |
+
$factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + abs($jitter);
|
243 |
+
|
244 |
+
return $this->delay = min($this->maxDelay, $this->delay * $factor);
|
245 |
+
}
|
246 |
+
|
247 |
+
/**
|
248 |
+
* Gets the current jitter (random number between -$this->jitter and
|
249 |
+
* $this->jitter).
|
250 |
+
*
|
251 |
+
* @return float
|
252 |
+
*/
|
253 |
+
private function getJitter()
|
254 |
+
{
|
255 |
+
return $this->jitter * 2 * mt_rand() / mt_getrandmax() - $this->jitter;
|
256 |
+
}
|
257 |
+
}
|
app/api/Google/Utils.php
CHANGED
@@ -1,133 +1,133 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Collection of static utility methods used for convenience across
|
20 |
-
* the client library.
|
21 |
-
*/
|
22 |
-
class Google_Utils
|
23 |
-
{
|
24 |
-
public static function urlSafeB64Encode($data)
|
25 |
-
{
|
26 |
-
$b64 = base64_encode($data);
|
27 |
-
$b64 = str_replace(
|
28 |
-
array('+', '/', '\r', '\n', '='),
|
29 |
-
array('-', '_'),
|
30 |
-
$b64
|
31 |
-
);
|
32 |
-
return $b64;
|
33 |
-
}
|
34 |
-
|
35 |
-
public static function urlSafeB64Decode($b64)
|
36 |
-
{
|
37 |
-
$b64 = str_replace(
|
38 |
-
array('-', '_'),
|
39 |
-
array('+', '/'),
|
40 |
-
$b64
|
41 |
-
);
|
42 |
-
return base64_decode($b64);
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Misc function used to count the number of bytes in a post body, in the
|
47 |
-
* world of multi-byte chars and the unpredictability of
|
48 |
-
* strlen/mb_strlen/sizeof, this is the only way to do that in a sane
|
49 |
-
* manner at the moment.
|
50 |
-
*
|
51 |
-
* This algorithm was originally developed for the
|
52 |
-
* Solar Framework by Paul M. Jones
|
53 |
-
*
|
54 |
-
* @link http://solarphp.com/
|
55 |
-
* @link http://svn.solarphp.com/core/trunk/Solar/Json.php
|
56 |
-
* @link http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php
|
57 |
-
* @param string $str
|
58 |
-
* @return int The number of bytes in a string.
|
59 |
-
*/
|
60 |
-
public static function getStrLen($str)
|
61 |
-
{
|
62 |
-
$strlenVar = strlen($str);
|
63 |
-
$d = $ret = 0;
|
64 |
-
for ($count = 0; $count < $strlenVar; ++ $count) {
|
65 |
-
$ordinalValue = ord($str{$ret});
|
66 |
-
switch (true) {
|
67 |
-
case (($ordinalValue >= 0x20) && ($ordinalValue <= 0x7F)):
|
68 |
-
// characters U-00000000 - U-0000007F (same as ASCII)
|
69 |
-
$ret ++;
|
70 |
-
break;
|
71 |
-
case (($ordinalValue & 0xE0) == 0xC0):
|
72 |
-
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
73 |
-
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
74 |
-
$ret += 2;
|
75 |
-
break;
|
76 |
-
case (($ordinalValue & 0xF0) == 0xE0):
|
77 |
-
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
78 |
-
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
79 |
-
$ret += 3;
|
80 |
-
break;
|
81 |
-
case (($ordinalValue & 0xF8) == 0xF0):
|
82 |
-
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
83 |
-
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
84 |
-
$ret += 4;
|
85 |
-
break;
|
86 |
-
case (($ordinalValue & 0xFC) == 0xF8):
|
87 |
-
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
88 |
-
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
89 |
-
$ret += 5;
|
90 |
-
break;
|
91 |
-
case (($ordinalValue & 0xFE) == 0xFC):
|
92 |
-
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
93 |
-
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
94 |
-
$ret += 6;
|
95 |
-
break;
|
96 |
-
default:
|
97 |
-
$ret ++;
|
98 |
-
}
|
99 |
-
}
|
100 |
-
return $ret;
|
101 |
-
}
|
102 |
-
|
103 |
-
/**
|
104 |
-
* Normalize all keys in an array to lower-case.
|
105 |
-
* @param array $arr
|
106 |
-
* @return array Normalized array.
|
107 |
-
*/
|
108 |
-
public static function normalize($arr)
|
109 |
-
{
|
110 |
-
if (!is_array($arr)) {
|
111 |
-
return array();
|
112 |
-
}
|
113 |
-
|
114 |
-
$normalized = array();
|
115 |
-
foreach ($arr as $key => $val) {
|
116 |
-
$normalized[strtolower($key)] = $val;
|
117 |
-
}
|
118 |
-
return $normalized;
|
119 |
-
}
|
120 |
-
|
121 |
-
/**
|
122 |
-
* Convert a string to camelCase
|
123 |
-
* @param string $value
|
124 |
-
* @return string
|
125 |
-
*/
|
126 |
-
public static function camelCase($value)
|
127 |
-
{
|
128 |
-
$value = ucwords(str_replace(array('-', '_'), ' ', $value));
|
129 |
-
$value = str_replace(' ', '', $value);
|
130 |
-
$value[0] = strtolower($value[0]);
|
131 |
-
return $value;
|
132 |
-
}
|
133 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Collection of static utility methods used for convenience across
|
20 |
+
* the client library.
|
21 |
+
*/
|
22 |
+
class Google_Utils
|
23 |
+
{
|
24 |
+
public static function urlSafeB64Encode($data)
|
25 |
+
{
|
26 |
+
$b64 = base64_encode($data);
|
27 |
+
$b64 = str_replace(
|
28 |
+
array('+', '/', '\r', '\n', '='),
|
29 |
+
array('-', '_'),
|
30 |
+
$b64
|
31 |
+
);
|
32 |
+
return $b64;
|
33 |
+
}
|
34 |
+
|
35 |
+
public static function urlSafeB64Decode($b64)
|
36 |
+
{
|
37 |
+
$b64 = str_replace(
|
38 |
+
array('-', '_'),
|
39 |
+
array('+', '/'),
|
40 |
+
$b64
|
41 |
+
);
|
42 |
+
return base64_decode($b64);
|
43 |
+
}
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Misc function used to count the number of bytes in a post body, in the
|
47 |
+
* world of multi-byte chars and the unpredictability of
|
48 |
+
* strlen/mb_strlen/sizeof, this is the only way to do that in a sane
|
49 |
+
* manner at the moment.
|
50 |
+
*
|
51 |
+
* This algorithm was originally developed for the
|
52 |
+
* Solar Framework by Paul M. Jones
|
53 |
+
*
|
54 |
+
* @link http://solarphp.com/
|
55 |
+
* @link http://svn.solarphp.com/core/trunk/Solar/Json.php
|
56 |
+
* @link http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php
|
57 |
+
* @param string $str
|
58 |
+
* @return int The number of bytes in a string.
|
59 |
+
*/
|
60 |
+
public static function getStrLen($str)
|
61 |
+
{
|
62 |
+
$strlenVar = strlen($str);
|
63 |
+
$d = $ret = 0;
|
64 |
+
for ($count = 0; $count < $strlenVar; ++ $count) {
|
65 |
+
$ordinalValue = ord($str{$ret});
|
66 |
+
switch (true) {
|
67 |
+
case (($ordinalValue >= 0x20) && ($ordinalValue <= 0x7F)):
|
68 |
+
// characters U-00000000 - U-0000007F (same as ASCII)
|
69 |
+
$ret ++;
|
70 |
+
break;
|
71 |
+
case (($ordinalValue & 0xE0) == 0xC0):
|
72 |
+
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
73 |
+
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
74 |
+
$ret += 2;
|
75 |
+
break;
|
76 |
+
case (($ordinalValue & 0xF0) == 0xE0):
|
77 |
+
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
78 |
+
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
79 |
+
$ret += 3;
|
80 |
+
break;
|
81 |
+
case (($ordinalValue & 0xF8) == 0xF0):
|
82 |
+
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
83 |
+
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
84 |
+
$ret += 4;
|
85 |
+
break;
|
86 |
+
case (($ordinalValue & 0xFC) == 0xF8):
|
87 |
+
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
88 |
+
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
89 |
+
$ret += 5;
|
90 |
+
break;
|
91 |
+
case (($ordinalValue & 0xFE) == 0xFC):
|
92 |
+
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
93 |
+
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
94 |
+
$ret += 6;
|
95 |
+
break;
|
96 |
+
default:
|
97 |
+
$ret ++;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
return $ret;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Normalize all keys in an array to lower-case.
|
105 |
+
* @param array $arr
|
106 |
+
* @return array Normalized array.
|
107 |
+
*/
|
108 |
+
public static function normalize($arr)
|
109 |
+
{
|
110 |
+
if (!is_array($arr)) {
|
111 |
+
return array();
|
112 |
+
}
|
113 |
+
|
114 |
+
$normalized = array();
|
115 |
+
foreach ($arr as $key => $val) {
|
116 |
+
$normalized[strtolower($key)] = $val;
|
117 |
+
}
|
118 |
+
return $normalized;
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Convert a string to camelCase
|
123 |
+
* @param string $value
|
124 |
+
* @return string
|
125 |
+
*/
|
126 |
+
public static function camelCase($value)
|
127 |
+
{
|
128 |
+
$value = ucwords(str_replace(array('-', '_'), ' ', $value));
|
129 |
+
$value = str_replace(' ', '', $value);
|
130 |
+
$value[0] = strtolower($value[0]);
|
131 |
+
return $value;
|
132 |
+
}
|
133 |
+
}
|
app/api/Google/Utils/URITemplate.php
CHANGED
@@ -1,333 +1,333 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2013 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Implementation of levels 1-3 of the URI Template spec.
|
20 |
-
* @see http://tools.ietf.org/html/rfc6570
|
21 |
-
*/
|
22 |
-
class Google_Utils_URITemplate
|
23 |
-
{
|
24 |
-
const TYPE_MAP = "1";
|
25 |
-
const TYPE_LIST = "2";
|
26 |
-
const TYPE_SCALAR = "4";
|
27 |
-
|
28 |
-
/**
|
29 |
-
* @var $operators array
|
30 |
-
* These are valid at the start of a template block to
|
31 |
-
* modify the way in which the variables inside are
|
32 |
-
* processed.
|
33 |
-
*/
|
34 |
-
private $operators = array(
|
35 |
-
"+" => "reserved",
|
36 |
-
"/" => "segments",
|
37 |
-
"." => "dotprefix",
|
38 |
-
"#" => "fragment",
|
39 |
-
";" => "semicolon",
|
40 |
-
"?" => "form",
|
41 |
-
"&" => "continuation"
|
42 |
-
);
|
43 |
-
|
44 |
-
/**
|
45 |
-
* @var reserved array
|
46 |
-
* These are the characters which should not be URL encoded in reserved
|
47 |
-
* strings.
|
48 |
-
*/
|
49 |
-
private $reserved = array(
|
50 |
-
"=", ",", "!", "@", "|", ":", "/", "?", "#",
|
51 |
-
"[", "]",'$', "&", "'", "(", ")", "*", "+", ";"
|
52 |
-
);
|
53 |
-
private $reservedEncoded = array(
|
54 |
-
"%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F",
|
55 |
-
"%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29",
|
56 |
-
"%2A", "%2B", "%3B"
|
57 |
-
);
|
58 |
-
|
59 |
-
public function parse($string, array $parameters)
|
60 |
-
{
|
61 |
-
return $this->resolveNextSection($string, $parameters);
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* This function finds the first matching {...} block and
|
66 |
-
* executes the replacement. It then calls itself to find
|
67 |
-
* subsequent blocks, if any.
|
68 |
-
*/
|
69 |
-
private function resolveNextSection($string, $parameters)
|
70 |
-
{
|
71 |
-
$start = strpos($string, "{");
|
72 |
-
if ($start === false) {
|
73 |
-
return $string;
|
74 |
-
}
|
75 |
-
$end = strpos($string, "}");
|
76 |
-
if ($end === false) {
|
77 |
-
return $string;
|
78 |
-
}
|
79 |
-
$string = $this->replace($string, $start, $end, $parameters);
|
80 |
-
return $this->resolveNextSection($string, $parameters);
|
81 |
-
}
|
82 |
-
|
83 |
-
private function replace($string, $start, $end, $parameters)
|
84 |
-
{
|
85 |
-
// We know a data block will have {} round it, so we can strip that.
|
86 |
-
$data = substr($string, $start + 1, $end - $start - 1);
|
87 |
-
|
88 |
-
// If the first character is one of the reserved operators, it effects
|
89 |
-
// the processing of the stream.
|
90 |
-
if (isset($this->operators[$data[0]])) {
|
91 |
-
$op = $this->operators[$data[0]];
|
92 |
-
$data = substr($data, 1);
|
93 |
-
$prefix = "";
|
94 |
-
$prefix_on_missing = false;
|
95 |
-
|
96 |
-
switch ($op) {
|
97 |
-
case "reserved":
|
98 |
-
// Reserved means certain characters should not be URL encoded
|
99 |
-
$data = $this->replaceVars($data, $parameters, ",", null, true);
|
100 |
-
break;
|
101 |
-
case "fragment":
|
102 |
-
// Comma separated with fragment prefix. Bare values only.
|
103 |
-
$prefix = "#";
|
104 |
-
$prefix_on_missing = true;
|
105 |
-
$data = $this->replaceVars($data, $parameters, ",", null, true);
|
106 |
-
break;
|
107 |
-
case "segments":
|
108 |
-
// Slash separated data. Bare values only.
|
109 |
-
$prefix = "/";
|
110 |
-
$data =$this->replaceVars($data, $parameters, "/");
|
111 |
-
break;
|
112 |
-
case "dotprefix":
|
113 |
-
// Dot separated data. Bare values only.
|
114 |
-
$prefix = ".";
|
115 |
-
$prefix_on_missing = true;
|
116 |
-
$data = $this->replaceVars($data, $parameters, ".");
|
117 |
-
break;
|
118 |
-
case "semicolon":
|
119 |
-
// Semicolon prefixed and separated. Uses the key name
|
120 |
-
$prefix = ";";
|
121 |
-
$data = $this->replaceVars($data, $parameters, ";", "=", false, true, false);
|
122 |
-
break;
|
123 |
-
case "form":
|
124 |
-
// Standard URL format. Uses the key name
|
125 |
-
$prefix = "?";
|
126 |
-
$data = $this->replaceVars($data, $parameters, "&", "=");
|
127 |
-
break;
|
128 |
-
case "continuation":
|
129 |
-
// Standard URL, but with leading ampersand. Uses key name.
|
130 |
-
$prefix = "&";
|
131 |
-
$data = $this->replaceVars($data, $parameters, "&", "=");
|
132 |
-
break;
|
133 |
-
}
|
134 |
-
|
135 |
-
// Add the initial prefix character if data is valid.
|
136 |
-
if ($data || ($data !== false && $prefix_on_missing)) {
|
137 |
-
$data = $prefix . $data;
|
138 |
-
}
|
139 |
-
|
140 |
-
} else {
|
141 |
-
// If no operator we replace with the defaults.
|
142 |
-
$data = $this->replaceVars($data, $parameters);
|
143 |
-
}
|
144 |
-
// This is chops out the {...} and replaces with the new section.
|
145 |
-
return substr($string, 0, $start) . $data . substr($string, $end + 1);
|
146 |
-
}
|
147 |
-
|
148 |
-
private function replaceVars(
|
149 |
-
$section,
|
150 |
-
$parameters,
|
151 |
-
$sep = ",",
|
152 |
-
$combine = null,
|
153 |
-
$reserved = false,
|
154 |
-
$tag_empty = false,
|
155 |
-
$combine_on_empty = true
|
156 |
-
) {
|
157 |
-
if (strpos($section, ",") === false) {
|
158 |
-
// If we only have a single value, we can immediately process.
|
159 |
-
return $this->combine(
|
160 |
-
$section,
|
161 |
-
$parameters,
|
162 |
-
$sep,
|
163 |
-
$combine,
|
164 |
-
$reserved,
|
165 |
-
$tag_empty,
|
166 |
-
$combine_on_empty
|
167 |
-
);
|
168 |
-
} else {
|
169 |
-
// If we have multiple values, we need to split and loop over them.
|
170 |
-
// Each is treated individually, then glued together with the
|
171 |
-
// separator character.
|
172 |
-
$vars = explode(",", $section);
|
173 |
-
return $this->combineList(
|
174 |
-
$vars,
|
175 |
-
$sep,
|
176 |
-
$parameters,
|
177 |
-
$combine,
|
178 |
-
$reserved,
|
179 |
-
false, // Never emit empty strings in multi-param replacements
|
180 |
-
$combine_on_empty
|
181 |
-
);
|
182 |
-
}
|
183 |
-
}
|
184 |
-
|
185 |
-
public function combine(
|
186 |
-
$key,
|
187 |
-
$parameters,
|
188 |
-
$sep,
|
189 |
-
$combine,
|
190 |
-
$reserved,
|
191 |
-
$tag_empty,
|
192 |
-
$combine_on_empty
|
193 |
-
) {
|
194 |
-
$length = false;
|
195 |
-
$explode = false;
|
196 |
-
$skip_final_combine = false;
|
197 |
-
$value = false;
|
198 |
-
|
199 |
-
// Check for length restriction.
|
200 |
-
if (strpos($key, ":") !== false) {
|
201 |
-
list($key, $length) = explode(":", $key);
|
202 |
-
}
|
203 |
-
|
204 |
-
// Check for explode parameter.
|
205 |
-
if ($key[strlen($key) - 1] == "*") {
|
206 |
-
$explode = true;
|
207 |
-
$key = substr($key, 0, -1);
|
208 |
-
$skip_final_combine = true;
|
209 |
-
}
|
210 |
-
|
211 |
-
// Define the list separator.
|
212 |
-
$list_sep = $explode ? $sep : ",";
|
213 |
-
|
214 |
-
if (isset($parameters[$key])) {
|
215 |
-
$data_type = $this->getDataType($parameters[$key]);
|
216 |
-
switch ($data_type) {
|
217 |
-
case self::TYPE_SCALAR:
|
218 |
-
$value = $this->getValue($parameters[$key], $length);
|
219 |
-
break;
|
220 |
-
case self::TYPE_LIST:
|
221 |
-
$values = array();
|
222 |
-
foreach ($parameters[$key] as $pkey => $pvalue) {
|
223 |
-
$pvalue = $this->getValue($pvalue, $length);
|
224 |
-
if ($combine && $explode) {
|
225 |
-
$values[$pkey] = $key . $combine . $pvalue;
|
226 |
-
} else {
|
227 |
-
$values[$pkey] = $pvalue;
|
228 |
-
}
|
229 |
-
}
|
230 |
-
$value = implode($list_sep, $values);
|
231 |
-
if ($value == '') {
|
232 |
-
return '';
|
233 |
-
}
|
234 |
-
break;
|
235 |
-
case self::TYPE_MAP:
|
236 |
-
$values = array();
|
237 |
-
foreach ($parameters[$key] as $pkey => $pvalue) {
|
238 |
-
$pvalue = $this->getValue($pvalue, $length);
|
239 |
-
if ($explode) {
|
240 |
-
$pkey = $this->getValue($pkey, $length);
|
241 |
-
$values[] = $pkey . "=" . $pvalue; // Explode triggers = combine.
|
242 |
-
} else {
|
243 |
-
$values[] = $pkey;
|
244 |
-
$values[] = $pvalue;
|
245 |
-
}
|
246 |
-
}
|
247 |
-
$value = implode($list_sep, $values);
|
248 |
-
if ($value == '') {
|
249 |
-
return false;
|
250 |
-
}
|
251 |
-
break;
|
252 |
-
}
|
253 |
-
} else if ($tag_empty) {
|
254 |
-
// If we are just indicating empty values with their key name, return that.
|
255 |
-
return $key;
|
256 |
-
} else {
|
257 |
-
// Otherwise we can skip this variable due to not being defined.
|
258 |
-
return false;
|
259 |
-
}
|
260 |
-
|
261 |
-
if ($reserved) {
|
262 |
-
$value = str_replace($this->reservedEncoded, $this->reserved, $value);
|
263 |
-
}
|
264 |
-
|
265 |
-
// If we do not need to include the key name, we just return the raw
|
266 |
-
// value.
|
267 |
-
if (!$combine || $skip_final_combine) {
|
268 |
-
return $value;
|
269 |
-
}
|
270 |
-
|
271 |
-
// Else we combine the key name: foo=bar, if value is not the empty string.
|
272 |
-
return $key . ($value != '' || $combine_on_empty ? $combine . $value : '');
|
273 |
-
}
|
274 |
-
|
275 |
-
/**
|
276 |
-
* Return the type of a passed in value
|
277 |
-
*/
|
278 |
-
private function getDataType($data)
|
279 |
-
{
|
280 |
-
if (is_array($data)) {
|
281 |
-
reset($data);
|
282 |
-
if (key($data) !== 0) {
|
283 |
-
return self::TYPE_MAP;
|
284 |
-
}
|
285 |
-
return self::TYPE_LIST;
|
286 |
-
}
|
287 |
-
return self::TYPE_SCALAR;
|
288 |
-
}
|
289 |
-
|
290 |
-
/**
|
291 |
-
* Utility function that merges multiple combine calls
|
292 |
-
* for multi-key templates.
|
293 |
-
*/
|
294 |
-
private function combineList(
|
295 |
-
$vars,
|
296 |
-
$sep,
|
297 |
-
$parameters,
|
298 |
-
$combine,
|
299 |
-
$reserved,
|
300 |
-
$tag_empty,
|
301 |
-
$combine_on_empty
|
302 |
-
) {
|
303 |
-
$ret = array();
|
304 |
-
foreach ($vars as $var) {
|
305 |
-
$response = $this->combine(
|
306 |
-
$var,
|
307 |
-
$parameters,
|
308 |
-
$sep,
|
309 |
-
$combine,
|
310 |
-
$reserved,
|
311 |
-
$tag_empty,
|
312 |
-
$combine_on_empty
|
313 |
-
);
|
314 |
-
if ($response === false) {
|
315 |
-
continue;
|
316 |
-
}
|
317 |
-
$ret[] = $response;
|
318 |
-
}
|
319 |
-
return implode($sep, $ret);
|
320 |
-
}
|
321 |
-
|
322 |
-
/**
|
323 |
-
* Utility function to encode and trim values
|
324 |
-
*/
|
325 |
-
private function getValue($value, $length)
|
326 |
-
{
|
327 |
-
if ($length) {
|
328 |
-
$value = substr($value, 0, $length);
|
329 |
-
}
|
330 |
-
$value = rawurlencode($value);
|
331 |
-
return $value;
|
332 |
-
}
|
333 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2013 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Implementation of levels 1-3 of the URI Template spec.
|
20 |
+
* @see http://tools.ietf.org/html/rfc6570
|
21 |
+
*/
|
22 |
+
class Google_Utils_URITemplate
|
23 |
+
{
|
24 |
+
const TYPE_MAP = "1";
|
25 |
+
const TYPE_LIST = "2";
|
26 |
+
const TYPE_SCALAR = "4";
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @var $operators array
|
30 |
+
* These are valid at the start of a template block to
|
31 |
+
* modify the way in which the variables inside are
|
32 |
+
* processed.
|
33 |
+
*/
|
34 |
+
private $operators = array(
|
35 |
+
"+" => "reserved",
|
36 |
+
"/" => "segments",
|
37 |
+
"." => "dotprefix",
|
38 |
+
"#" => "fragment",
|
39 |
+
";" => "semicolon",
|
40 |
+
"?" => "form",
|
41 |
+
"&" => "continuation"
|
42 |
+
);
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @var reserved array
|
46 |
+
* These are the characters which should not be URL encoded in reserved
|
47 |
+
* strings.
|
48 |
+
*/
|
49 |
+
private $reserved = array(
|
50 |
+
"=", ",", "!", "@", "|", ":", "/", "?", "#",
|
51 |
+
"[", "]",'$', "&", "'", "(", ")", "*", "+", ";"
|
52 |
+
);
|
53 |
+
private $reservedEncoded = array(
|
54 |
+
"%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F",
|
55 |
+
"%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29",
|
56 |
+
"%2A", "%2B", "%3B"
|
57 |
+
);
|
58 |
+
|
59 |
+
public function parse($string, array $parameters)
|
60 |
+
{
|
61 |
+
return $this->resolveNextSection($string, $parameters);
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* This function finds the first matching {...} block and
|
66 |
+
* executes the replacement. It then calls itself to find
|
67 |
+
* subsequent blocks, if any.
|
68 |
+
*/
|
69 |
+
private function resolveNextSection($string, $parameters)
|
70 |
+
{
|
71 |
+
$start = strpos($string, "{");
|
72 |
+
if ($start === false) {
|
73 |
+
return $string;
|
74 |
+
}
|
75 |
+
$end = strpos($string, "}");
|
76 |
+
if ($end === false) {
|
77 |
+
return $string;
|
78 |
+
}
|
79 |
+
$string = $this->replace($string, $start, $end, $parameters);
|
80 |
+
return $this->resolveNextSection($string, $parameters);
|
81 |
+
}
|
82 |
+
|
83 |
+
private function replace($string, $start, $end, $parameters)
|
84 |
+
{
|
85 |
+
// We know a data block will have {} round it, so we can strip that.
|
86 |
+
$data = substr($string, $start + 1, $end - $start - 1);
|
87 |
+
|
88 |
+
// If the first character is one of the reserved operators, it effects
|
89 |
+
// the processing of the stream.
|
90 |
+
if (isset($this->operators[$data[0]])) {
|
91 |
+
$op = $this->operators[$data[0]];
|
92 |
+
$data = substr($data, 1);
|
93 |
+
$prefix = "";
|
94 |
+
$prefix_on_missing = false;
|
95 |
+
|
96 |
+
switch ($op) {
|
97 |
+
case "reserved":
|
98 |
+
// Reserved means certain characters should not be URL encoded
|
99 |
+
$data = $this->replaceVars($data, $parameters, ",", null, true);
|
100 |
+
break;
|
101 |
+
case "fragment":
|
102 |
+
// Comma separated with fragment prefix. Bare values only.
|
103 |
+
$prefix = "#";
|
104 |
+
$prefix_on_missing = true;
|
105 |
+
$data = $this->replaceVars($data, $parameters, ",", null, true);
|
106 |
+
break;
|
107 |
+
case "segments":
|
108 |
+
// Slash separated data. Bare values only.
|
109 |
+
$prefix = "/";
|
110 |
+
$data =$this->replaceVars($data, $parameters, "/");
|
111 |
+
break;
|
112 |
+
case "dotprefix":
|
113 |
+
// Dot separated data. Bare values only.
|
114 |
+
$prefix = ".";
|
115 |
+
$prefix_on_missing = true;
|
116 |
+
$data = $this->replaceVars($data, $parameters, ".");
|
117 |
+
break;
|
118 |
+
case "semicolon":
|
119 |
+
// Semicolon prefixed and separated. Uses the key name
|
120 |
+
$prefix = ";";
|
121 |
+
$data = $this->replaceVars($data, $parameters, ";", "=", false, true, false);
|
122 |
+
break;
|
123 |
+
case "form":
|
124 |
+
// Standard URL format. Uses the key name
|
125 |
+
$prefix = "?";
|
126 |
+
$data = $this->replaceVars($data, $parameters, "&", "=");
|
127 |
+
break;
|
128 |
+
case "continuation":
|
129 |
+
// Standard URL, but with leading ampersand. Uses key name.
|
130 |
+
$prefix = "&";
|
131 |
+
$data = $this->replaceVars($data, $parameters, "&", "=");
|
132 |
+
break;
|
133 |
+
}
|
134 |
+
|
135 |
+
// Add the initial prefix character if data is valid.
|
136 |
+
if ($data || ($data !== false && $prefix_on_missing)) {
|
137 |
+
$data = $prefix . $data;
|
138 |
+
}
|
139 |
+
|
140 |
+
} else {
|
141 |
+
// If no operator we replace with the defaults.
|
142 |
+
$data = $this->replaceVars($data, $parameters);
|
143 |
+
}
|
144 |
+
// This is chops out the {...} and replaces with the new section.
|
145 |
+
return substr($string, 0, $start) . $data . substr($string, $end + 1);
|
146 |
+
}
|
147 |
+
|
148 |
+
private function replaceVars(
|
149 |
+
$section,
|
150 |
+
$parameters,
|
151 |
+
$sep = ",",
|
152 |
+
$combine = null,
|
153 |
+
$reserved = false,
|
154 |
+
$tag_empty = false,
|
155 |
+
$combine_on_empty = true
|
156 |
+
) {
|
157 |
+
if (strpos($section, ",") === false) {
|
158 |
+
// If we only have a single value, we can immediately process.
|
159 |
+
return $this->combine(
|
160 |
+
$section,
|
161 |
+
$parameters,
|
162 |
+
$sep,
|
163 |
+
$combine,
|
164 |
+
$reserved,
|
165 |
+
$tag_empty,
|
166 |
+
$combine_on_empty
|
167 |
+
);
|
168 |
+
} else {
|
169 |
+
// If we have multiple values, we need to split and loop over them.
|
170 |
+
// Each is treated individually, then glued together with the
|
171 |
+
// separator character.
|
172 |
+
$vars = explode(",", $section);
|
173 |
+
return $this->combineList(
|
174 |
+
$vars,
|
175 |
+
$sep,
|
176 |
+
$parameters,
|
177 |
+
$combine,
|
178 |
+
$reserved,
|
179 |
+
false, // Never emit empty strings in multi-param replacements
|
180 |
+
$combine_on_empty
|
181 |
+
);
|
182 |
+
}
|
183 |
+
}
|
184 |
+
|
185 |
+
public function combine(
|
186 |
+
$key,
|
187 |
+
$parameters,
|
188 |
+
$sep,
|
189 |
+
$combine,
|
190 |
+
$reserved,
|
191 |
+
$tag_empty,
|
192 |
+
$combine_on_empty
|
193 |
+
) {
|
194 |
+
$length = false;
|
195 |
+
$explode = false;
|
196 |
+
$skip_final_combine = false;
|
197 |
+
$value = false;
|
198 |
+
|
199 |
+
// Check for length restriction.
|
200 |
+
if (strpos($key, ":") !== false) {
|
201 |
+
list($key, $length) = explode(":", $key);
|
202 |
+
}
|
203 |
+
|
204 |
+
// Check for explode parameter.
|
205 |
+
if ($key[strlen($key) - 1] == "*") {
|
206 |
+
$explode = true;
|
207 |
+
$key = substr($key, 0, -1);
|
208 |
+
$skip_final_combine = true;
|
209 |
+
}
|
210 |
+
|
211 |
+
// Define the list separator.
|
212 |
+
$list_sep = $explode ? $sep : ",";
|
213 |
+
|
214 |
+
if (isset($parameters[$key])) {
|
215 |
+
$data_type = $this->getDataType($parameters[$key]);
|
216 |
+
switch ($data_type) {
|
217 |
+
case self::TYPE_SCALAR:
|
218 |
+
$value = $this->getValue($parameters[$key], $length);
|
219 |
+
break;
|
220 |
+
case self::TYPE_LIST:
|
221 |
+
$values = array();
|
222 |
+
foreach ($parameters[$key] as $pkey => $pvalue) {
|
223 |
+
$pvalue = $this->getValue($pvalue, $length);
|
224 |
+
if ($combine && $explode) {
|
225 |
+
$values[$pkey] = $key . $combine . $pvalue;
|
226 |
+
} else {
|
227 |
+
$values[$pkey] = $pvalue;
|
228 |
+
}
|
229 |
+
}
|
230 |
+
$value = implode($list_sep, $values);
|
231 |
+
if ($value == '') {
|
232 |
+
return '';
|
233 |
+
}
|
234 |
+
break;
|
235 |
+
case self::TYPE_MAP:
|
236 |
+
$values = array();
|
237 |
+
foreach ($parameters[$key] as $pkey => $pvalue) {
|
238 |
+
$pvalue = $this->getValue($pvalue, $length);
|
239 |
+
if ($explode) {
|
240 |
+
$pkey = $this->getValue($pkey, $length);
|
241 |
+
$values[] = $pkey . "=" . $pvalue; // Explode triggers = combine.
|
242 |
+
} else {
|
243 |
+
$values[] = $pkey;
|
244 |
+
$values[] = $pvalue;
|
245 |
+
}
|
246 |
+
}
|
247 |
+
$value = implode($list_sep, $values);
|
248 |
+
if ($value == '') {
|
249 |
+
return false;
|
250 |
+
}
|
251 |
+
break;
|
252 |
+
}
|
253 |
+
} else if ($tag_empty) {
|
254 |
+
// If we are just indicating empty values with their key name, return that.
|
255 |
+
return $key;
|
256 |
+
} else {
|
257 |
+
// Otherwise we can skip this variable due to not being defined.
|
258 |
+
return false;
|
259 |
+
}
|
260 |
+
|
261 |
+
if ($reserved) {
|
262 |
+
$value = str_replace($this->reservedEncoded, $this->reserved, $value);
|
263 |
+
}
|
264 |
+
|
265 |
+
// If we do not need to include the key name, we just return the raw
|
266 |
+
// value.
|
267 |
+
if (!$combine || $skip_final_combine) {
|
268 |
+
return $value;
|
269 |
+
}
|
270 |
+
|
271 |
+
// Else we combine the key name: foo=bar, if value is not the empty string.
|
272 |
+
return $key . ($value != '' || $combine_on_empty ? $combine . $value : '');
|
273 |
+
}
|
274 |
+
|
275 |
+
/**
|
276 |
+
* Return the type of a passed in value
|
277 |
+
*/
|
278 |
+
private function getDataType($data)
|
279 |
+
{
|
280 |
+
if (is_array($data)) {
|
281 |
+
reset($data);
|
282 |
+
if (key($data) !== 0) {
|
283 |
+
return self::TYPE_MAP;
|
284 |
+
}
|
285 |
+
return self::TYPE_LIST;
|
286 |
+
}
|
287 |
+
return self::TYPE_SCALAR;
|
288 |
+
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Utility function that merges multiple combine calls
|
292 |
+
* for multi-key templates.
|
293 |
+
*/
|
294 |
+
private function combineList(
|
295 |
+
$vars,
|
296 |
+
$sep,
|
297 |
+
$parameters,
|
298 |
+
$combine,
|
299 |
+
$reserved,
|
300 |
+
$tag_empty,
|
301 |
+
$combine_on_empty
|
302 |
+
) {
|
303 |
+
$ret = array();
|
304 |
+
foreach ($vars as $var) {
|
305 |
+
$response = $this->combine(
|
306 |
+
$var,
|
307 |
+
$parameters,
|
308 |
+
$sep,
|
309 |
+
$combine,
|
310 |
+
$reserved,
|
311 |
+
$tag_empty,
|
312 |
+
$combine_on_empty
|
313 |
+
);
|
314 |
+
if ($response === false) {
|
315 |
+
continue;
|
316 |
+
}
|
317 |
+
$ret[] = $response;
|
318 |
+
}
|
319 |
+
return implode($sep, $ret);
|
320 |
+
}
|
321 |
+
|
322 |
+
/**
|
323 |
+
* Utility function to encode and trim values
|
324 |
+
*/
|
325 |
+
private function getValue($value, $length)
|
326 |
+
{
|
327 |
+
if ($length) {
|
328 |
+
$value = substr($value, 0, $length);
|
329 |
+
}
|
330 |
+
$value = rawurlencode($value);
|
331 |
+
return $value;
|
332 |
+
}
|
333 |
+
}
|
app/api/Google/Verifier/Abstract.php
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Verifies signatures.
|
20 |
-
*
|
21 |
-
* @author Brian Eaton <beaton@google.com>
|
22 |
-
*/
|
23 |
-
abstract class Google_Verifier_Abstract
|
24 |
-
{
|
25 |
-
/**
|
26 |
-
* Checks a signature, returns true if the signature is correct,
|
27 |
-
* false otherwise.
|
28 |
-
*/
|
29 |
-
abstract public function verify($data, $signature);
|
30 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Verifies signatures.
|
20 |
+
*
|
21 |
+
* @author Brian Eaton <beaton@google.com>
|
22 |
+
*/
|
23 |
+
abstract class Google_Verifier_Abstract
|
24 |
+
{
|
25 |
+
/**
|
26 |
+
* Checks a signature, returns true if the signature is correct,
|
27 |
+
* false otherwise.
|
28 |
+
*/
|
29 |
+
abstract public function verify($data, $signature);
|
30 |
+
}
|
app/api/Google/Verifier/Pem.php
CHANGED
@@ -1,75 +1,75 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2011 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
if (!class_exists('Google_Client')) {
|
19 |
-
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Verifies signatures using PEM encoded certificates.
|
24 |
-
*
|
25 |
-
* @author Brian Eaton <beaton@google.com>
|
26 |
-
*/
|
27 |
-
class Google_Verifier_Pem extends Google_Verifier_Abstract
|
28 |
-
{
|
29 |
-
private $publicKey;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* Constructs a verifier from the supplied PEM-encoded certificate.
|
33 |
-
*
|
34 |
-
* $pem: a PEM encoded certificate (not a file).
|
35 |
-
* @param $pem
|
36 |
-
* @throws Google_Auth_Exception
|
37 |
-
* @throws Google_Exception
|
38 |
-
*/
|
39 |
-
public function __construct($pem)
|
40 |
-
{
|
41 |
-
if (!function_exists('openssl_x509_read')) {
|
42 |
-
throw new Google_Exception('Google API PHP client needs the openssl PHP extension');
|
43 |
-
}
|
44 |
-
$this->publicKey = openssl_x509_read($pem);
|
45 |
-
if (!$this->publicKey) {
|
46 |
-
throw new Google_Auth_Exception("Unable to parse PEM: $pem");
|
47 |
-
}
|
48 |
-
}
|
49 |
-
|
50 |
-
public function __destruct()
|
51 |
-
{
|
52 |
-
if ($this->publicKey) {
|
53 |
-
openssl_x509_free($this->publicKey);
|
54 |
-
}
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Verifies the signature on data.
|
59 |
-
*
|
60 |
-
* Returns true if the signature is valid, false otherwise.
|
61 |
-
* @param $data
|
62 |
-
* @param $signature
|
63 |
-
* @throws Google_Auth_Exception
|
64 |
-
* @return bool
|
65 |
-
*/
|
66 |
-
public function verify($data, $signature)
|
67 |
-
{
|
68 |
-
$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
|
69 |
-
$status = openssl_verify($data, $signature, $this->publicKey, $hash);
|
70 |
-
if ($status === -1) {
|
71 |
-
throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string());
|
72 |
-
}
|
73 |
-
return $status === 1;
|
74 |
-
}
|
75 |
-
}
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2011 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
if (!class_exists('Google_Client')) {
|
19 |
+
require_once dirname(__FILE__) . '/../autoload.php';
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Verifies signatures using PEM encoded certificates.
|
24 |
+
*
|
25 |
+
* @author Brian Eaton <beaton@google.com>
|
26 |
+
*/
|
27 |
+
class Google_Verifier_Pem extends Google_Verifier_Abstract
|
28 |
+
{
|
29 |
+
private $publicKey;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Constructs a verifier from the supplied PEM-encoded certificate.
|
33 |
+
*
|
34 |
+
* $pem: a PEM encoded certificate (not a file).
|
35 |
+
* @param $pem
|
36 |
+
* @throws Google_Auth_Exception
|
37 |
+
* @throws Google_Exception
|
38 |
+
*/
|
39 |
+
public function __construct($pem)
|
40 |
+
{
|
41 |
+
if (!function_exists('openssl_x509_read')) {
|
42 |
+
throw new Google_Exception('Google API PHP client needs the openssl PHP extension');
|
43 |
+
}
|
44 |
+
$this->publicKey = openssl_x509_read($pem);
|
45 |
+
if (!$this->publicKey) {
|
46 |
+
throw new Google_Auth_Exception("Unable to parse PEM: $pem");
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
public function __destruct()
|
51 |
+
{
|
52 |
+
if ($this->publicKey) {
|
53 |
+
openssl_x509_free($this->publicKey);
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Verifies the signature on data.
|
59 |
+
*
|
60 |
+
* Returns true if the signature is valid, false otherwise.
|
61 |
+
* @param $data
|
62 |
+
* @param $signature
|
63 |
+
* @throws Google_Auth_Exception
|
64 |
+
* @return bool
|
65 |
+
*/
|
66 |
+
public function verify($data, $signature)
|
67 |
+
{
|
68 |
+
$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
|
69 |
+
$status = openssl_verify($data, $signature, $this->publicKey, $hash);
|
70 |
+
if ($status === -1) {
|
71 |
+
throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string());
|
72 |
+
}
|
73 |
+
return $status === 1;
|
74 |
+
}
|
75 |
+
}
|
app/api/Google/autoload.php
CHANGED
@@ -1,37 +1,37 @@
|
|
1 |
-
<?php
|
2 |
-
/*
|
3 |
-
* Copyright 2014 Google Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
-
* you may not use this file except in compliance with the License.
|
7 |
-
* You may obtain a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
-
* See the License for the specific language governing permissions and
|
15 |
-
* limitations under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
function mec_google_api_php_client_autoload($className)
|
19 |
-
{
|
20 |
-
$classPath = explode('_', $className);
|
21 |
-
|
22 |
-
if($classPath[0] != 'Google')
|
23 |
-
{
|
24 |
-
return;
|
25 |
-
}
|
26 |
-
|
27 |
-
// Drop 'Google', and maximum class file path depth in this project is 3.
|
28 |
-
$classPath = array_slice($classPath, 1, 2);
|
29 |
-
$filePath = dirname(__FILE__) . DS . implode(DS, $classPath) . '.php';
|
30 |
-
|
31 |
-
if(file_exists($filePath))
|
32 |
-
{
|
33 |
-
require_once($filePath);
|
34 |
-
}
|
35 |
-
}
|
36 |
-
|
37 |
spl_autoload_register('mec_google_api_php_client_autoload');
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright 2014 Google Inc.
|
4 |
+
*
|
5 |
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6 |
+
* you may not use this file except in compliance with the License.
|
7 |
+
* You may obtain a copy of the License at
|
8 |
+
*
|
9 |
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
+
*
|
11 |
+
* Unless required by applicable law or agreed to in writing, software
|
12 |
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13 |
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14 |
+
* See the License for the specific language governing permissions and
|
15 |
+
* limitations under the License.
|
16 |
+
*/
|
17 |
+
|
18 |
+
function mec_google_api_php_client_autoload($className)
|
19 |
+
{
|
20 |
+
$classPath = explode('_', $className);
|
21 |
+
|
22 |
+
if($classPath[0] != 'Google')
|
23 |
+
{
|
24 |
+
return;
|
25 |
+
}
|
26 |
+
|
27 |
+
// Drop 'Google', and maximum class file path depth in this project is 3.
|
28 |
+
$classPath = array_slice($classPath, 1, 2);
|
29 |
+
$filePath = dirname(__FILE__) . DS . implode(DS, $classPath) . '.php';
|
30 |
+
|
31 |
+
if(file_exists($filePath))
|
32 |
+
{
|
33 |
+
require_once($filePath);
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
spl_autoload_register('mec_google_api_php_client_autoload');
|
app/api/Meetup/meetup.php
CHANGED
@@ -1,132 +1,132 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class Meetup {
|
4 |
-
const BASE = 'https://api.meetup.com';
|
5 |
-
|
6 |
-
protected $_parameters = array(
|
7 |
-
'sign' => 'true',
|
8 |
-
);
|
9 |
-
|
10 |
-
public function __construct(array $parameters = array()) {
|
11 |
-
$this->_parameters = array_merge($this->_parameters, $parameters);
|
12 |
-
}
|
13 |
-
|
14 |
-
public function getEvents(array $parameters = array()) {
|
15 |
-
return $this->get('/:urlname/events', $parameters);
|
16 |
-
}
|
17 |
-
|
18 |
-
public function getEvent(array $parameters = array()) {
|
19 |
-
return $this->get('/:urlname/events/:id', $parameters);
|
20 |
-
}
|
21 |
-
|
22 |
-
public function getPhotos(array $parameters = array()) {
|
23 |
-
return $this->get('/2/photos', $parameters)->results;
|
24 |
-
}
|
25 |
-
|
26 |
-
public function getDiscussionBoards(array $parameters = array()) {
|
27 |
-
return $this->get('/:urlname/boards', $parameters);
|
28 |
-
}
|
29 |
-
|
30 |
-
public function getDiscussions(array $parameters = array()) {
|
31 |
-
return $this->get('/:urlname/boards/:bid/discussions', $parameters);
|
32 |
-
}
|
33 |
-
|
34 |
-
public function getMembers(array $parameters = array()) {
|
35 |
-
return $this->get('/2/members', $parameters);
|
36 |
-
}
|
37 |
-
|
38 |
-
public function getNext($response) {
|
39 |
-
if (!isset($response) || !isset($response->meta->next))
|
40 |
-
{
|
41 |
-
throw new Exception("Invalid response object.");
|
42 |
-
}
|
43 |
-
return $this->get_url($response->meta->next);
|
44 |
-
}
|
45 |
-
|
46 |
-
public function get($path, array $parameters = array()) {
|
47 |
-
$parameters = array_merge($this->_parameters, $parameters);
|
48 |
-
|
49 |
-
if (preg_match_all('/:([a-z]+)/', $path, $matches)) {
|
50 |
-
|
51 |
-
foreach ($matches[0] as $i => $match) {
|
52 |
-
|
53 |
-
if (isset($parameters[$matches[1][$i]])) {
|
54 |
-
$path = str_replace($match, $parameters[$matches[1][$i]], $path);
|
55 |
-
unset($parameters[$matches[1][$i]]);
|
56 |
-
} else {
|
57 |
-
throw new Exception("Missing parameter '" . $matches[1][$i] . "' for path '" . $path . "'.");
|
58 |
-
}
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
-
$url = self::BASE . $path . '?' . http_build_query($parameters);
|
63 |
-
|
64 |
-
return $this->get_url($url);
|
65 |
-
}
|
66 |
-
|
67 |
-
protected function get_url($url) {
|
68 |
-
|
69 |
-
$ch = curl_init();
|
70 |
-
curl_setopt($ch, CURLOPT_URL, $url);
|
71 |
-
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Charset: utf-8"));
|
72 |
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
73 |
-
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
74 |
-
|
75 |
-
$content = curl_exec($ch);
|
76 |
-
|
77 |
-
if (curl_errno($ch)) {
|
78 |
-
$error = curl_error($ch);
|
79 |
-
curl_close($ch);
|
80 |
-
|
81 |
-
throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'.");
|
82 |
-
}
|
83 |
-
|
84 |
-
$response = json_decode($content);
|
85 |
-
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
86 |
-
|
87 |
-
curl_close($ch);
|
88 |
-
|
89 |
-
if ($status != 200) {
|
90 |
-
|
91 |
-
if (isset($response->errors[0]->message)) {
|
92 |
-
$error = $response->errors[0]->message;
|
93 |
-
} else {
|
94 |
-
$error = 'Status ' . $status;
|
95 |
-
}
|
96 |
-
|
97 |
-
throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'.");
|
98 |
-
}
|
99 |
-
|
100 |
-
if (isset($response) == false) {
|
101 |
-
|
102 |
-
switch (json_last_error()) {
|
103 |
-
case JSON_ERROR_NONE:
|
104 |
-
$error = 'No errors';
|
105 |
-
break;
|
106 |
-
case JSON_ERROR_DEPTH:
|
107 |
-
$error = 'Maximum stack depth exceeded';
|
108 |
-
break;
|
109 |
-
case JSON_ERROR_STATE_MISMATCH:
|
110 |
-
$error = ' Underflow or the modes mismatch';
|
111 |
-
break;
|
112 |
-
case JSON_ERROR_CTRL_CHAR:
|
113 |
-
$error = 'Unexpected control character found';
|
114 |
-
break;
|
115 |
-
case JSON_ERROR_SYNTAX:
|
116 |
-
$error = 'Syntax error, malformed JSON';
|
117 |
-
break;
|
118 |
-
case JSON_ERROR_UTF8:
|
119 |
-
$error = 'Malformed UTF-8 characters, possibly incorrectly encoded';
|
120 |
-
break;
|
121 |
-
default:
|
122 |
-
$error = 'Unknown error';
|
123 |
-
break;
|
124 |
-
}
|
125 |
-
|
126 |
-
throw new Exception("Cannot read response by '" . $url . "' because of: '" . $error . "'.");
|
127 |
-
}
|
128 |
-
|
129 |
-
return $response;
|
130 |
-
}
|
131 |
-
}
|
132 |
-
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Meetup {
|
4 |
+
const BASE = 'https://api.meetup.com';
|
5 |
+
|
6 |
+
protected $_parameters = array(
|
7 |
+
'sign' => 'true',
|
8 |
+
);
|
9 |
+
|
10 |
+
public function __construct(array $parameters = array()) {
|
11 |
+
$this->_parameters = array_merge($this->_parameters, $parameters);
|
12 |
+
}
|
13 |
+
|
14 |
+
public function getEvents(array $parameters = array()) {
|
15 |
+
return $this->get('/:urlname/events', $parameters);
|
16 |
+
}
|
17 |
+
|
18 |
+
public function getEvent(array $parameters = array()) {
|
19 |
+
return $this->get('/:urlname/events/:id', $parameters);
|
20 |
+
}
|
21 |
+
|
22 |
+
public function getPhotos(array $parameters = array()) {
|
23 |
+
return $this->get('/2/photos', $parameters)->results;
|
24 |
+
}
|
25 |
+
|
26 |
+
public function getDiscussionBoards(array $parameters = array()) {
|
27 |
+
return $this->get('/:urlname/boards', $parameters);
|
28 |
+
}
|
29 |
+
|
30 |
+
public function getDiscussions(array $parameters = array()) {
|
31 |
+
return $this->get('/:urlname/boards/:bid/discussions', $parameters);
|
32 |
+
}
|
33 |
+
|
34 |
+
public function getMembers(array $parameters = array()) {
|
35 |
+
return $this->get('/2/members', $parameters);
|
36 |
+
}
|
37 |
+
|
38 |
+
public function getNext($response) {
|
39 |
+
if (!isset($response) || !isset($response->meta->next))
|
40 |
+
{
|
41 |
+
throw new Exception("Invalid response object.");
|
42 |
+
}
|
43 |
+
return $this->get_url($response->meta->next);
|
44 |
+
}
|
45 |
+
|
46 |
+
public function get($path, array $parameters = array()) {
|
47 |
+
$parameters = array_merge($this->_parameters, $parameters);
|
48 |
+
|
49 |
+
if (preg_match_all('/:([a-z]+)/', $path, $matches)) {
|
50 |
+
|
51 |
+
foreach ($matches[0] as $i => $match) {
|
52 |
+
|
53 |
+
if (isset($parameters[$matches[1][$i]])) {
|
54 |
+
$path = str_replace($match, $parameters[$matches[1][$i]], $path);
|
55 |
+
unset($parameters[$matches[1][$i]]);
|
56 |
+
} else {
|
57 |
+
throw new Exception("Missing parameter '" . $matches[1][$i] . "' for path '" . $path . "'.");
|
58 |
+
}
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
$url = self::BASE . $path . '?' . http_build_query($parameters);
|
63 |
+
|
64 |
+
return $this->get_url($url);
|
65 |
+
}
|
66 |
+
|
67 |
+
protected function get_url($url) {
|
68 |
+
|
69 |
+
$ch = curl_init();
|
70 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
71 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Charset: utf-8"));
|
72 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
73 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
|
74 |
+
|
75 |
+
$content = curl_exec($ch);
|
76 |
+
|
77 |
+
if (curl_errno($ch)) {
|
78 |
+
$error = curl_error($ch);
|
79 |
+
curl_close($ch);
|
80 |
+
|
81 |
+
throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'.");
|
82 |
+
}
|
83 |
+
|
84 |
+
$response = json_decode($content);
|
85 |
+
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
86 |
+
|
87 |
+
curl_close($ch);
|
88 |
+
|
89 |
+
if ($status != 200) {
|
90 |
+
|
91 |
+
if (isset($response->errors[0]->message)) {
|
92 |
+
$error = $response->errors[0]->message;
|
93 |
+
} else {
|
94 |
+
$error = 'Status ' . $status;
|
95 |
+
}
|
96 |
+
|
97 |
+
throw new Exception("Failed retrieving '" . $url . "' because of ' " . $error . "'.");
|
98 |
+
}
|
99 |
+
|
100 |
+
if (isset($response) == false) {
|
101 |
+
|
102 |
+
switch (json_last_error()) {
|
103 |
+
case JSON_ERROR_NONE:
|
104 |
+
$error = 'No errors';
|
105 |
+
break;
|
106 |
+
case JSON_ERROR_DEPTH:
|
107 |
+
$error = 'Maximum stack depth exceeded';
|
108 |
+
break;
|
109 |
+
case JSON_ERROR_STATE_MISMATCH:
|
110 |
+
$error = ' Underflow or the modes mismatch';
|
111 |
+
break;
|
112 |
+
case JSON_ERROR_CTRL_CHAR:
|
113 |
+
$error = 'Unexpected control character found';
|
114 |
+
break;
|
115 |
+
case JSON_ERROR_SYNTAX:
|
116 |
+
$error = 'Syntax error, malformed JSON';
|
117 |
+
break;
|
118 |
+
case JSON_ERROR_UTF8:
|
119 |
+
$error = 'Malformed UTF-8 characters, possibly incorrectly encoded';
|
120 |
+
break;
|
121 |
+
default:
|
122 |
+
$error = 'Unknown error';
|
123 |
+
break;
|
124 |
+
}
|
125 |
+
|
126 |
+
throw new Exception("Cannot read response by '" . $url . "' because of: '" . $error . "'.");
|
127 |
+
}
|
128 |
+
|
129 |
+
return $response;
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
app/api/Stripe/Account.php
CHANGED
@@ -1,131 +1,131 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class Account
|
7 |
-
*
|
8 |
-
* @property string $id
|
9 |
-
* @property string $object
|
10 |
-
* @property mixed $business_logo
|
11 |
-
* @property string $business_name
|
12 |
-
* @property mixed $business_url
|
13 |
-
* @property bool $charges_enabled
|
14 |
-
* @property string $country
|
15 |
-
* @property bool $debit_negative_balances
|
16 |
-
* @property mixed $decline_charge_on
|
17 |
-
* @property string $default_currency
|
18 |
-
* @property bool $details_submitted
|
19 |
-
* @property string $display_name
|
20 |
-
* @property string $email
|
21 |
-
* @property mixed $external_accounts
|
22 |
-
* @property mixed $legal_entity
|
23 |
-
* @property bool $managed
|
24 |
-
* @property mixed $product_description
|
25 |
-
* @property mixed $statement_descriptor
|
26 |
-
* @property mixed $support_email
|
27 |
-
* @property mixed $support_phone
|
28 |
-
* @property string $timezone
|
29 |
-
* @property mixed $tos_acceptance
|
30 |
-
* @property mixed $transfer_schedule
|
31 |
-
* @property bool $transfers_enabled
|
32 |
-
* @property mixed $verification
|
33 |
-
* @property mixed $keys
|
34 |
-
*
|
35 |
-
* @package Stripe
|
36 |
-
*/
|
37 |
-
class Account extends ApiResource
|
38 |
-
{
|
39 |
-
public function instanceUrl()
|
40 |
-
{
|
41 |
-
if ($this['id'] === null) {
|
42 |
-
return '/v1/account';
|
43 |
-
} else {
|
44 |
-
return parent::instanceUrl();
|
45 |
-
}
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* @param string|null $id
|
50 |
-
* @param array|string|null $opts
|
51 |
-
*
|
52 |
-
* @return Account
|
53 |
-
*/
|
54 |
-
public static function retrieve($id = null, $opts = null)
|
55 |
-
{
|
56 |
-
if (!$opts && is_string($id) && substr($id, 0, 3) === 'sk_') {
|
57 |
-
$opts = $id;
|
58 |
-
$id = null;
|
59 |
-
}
|
60 |
-
return self::_retrieve($id, $opts);
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* @param array|null $params
|
65 |
-
* @param array|string|null $opts
|
66 |
-
*
|
67 |
-
* @return Account
|
68 |
-
*/
|
69 |
-
public static function create($params = null, $opts = null)
|
70 |
-
{
|
71 |
-
return self::_create($params, $opts);
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* @param string $id The ID of the account to update.
|
76 |
-
* @param array|null $params
|
77 |
-
* @param array|string|null $options
|
78 |
-
*
|
79 |
-
* @return Account The updated account.
|
80 |
-
*/
|
81 |
-
public static function update($id, $params = null, $options = null)
|
82 |
-
{
|
83 |
-
return self::_update($id, $params, $options);
|
84 |
-
}
|
85 |
-
|
86 |
-
/**
|
87 |
-
* @param array|string|null $opts
|
88 |
-
*
|
89 |
-
* @return Account
|
90 |
-
*/
|
91 |
-
public function save($opts = null)
|
92 |
-
{
|
93 |
-
return $this->_save($opts);
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* @param array|null $params
|
98 |
-
* @param array|string|null $opts
|
99 |
-
*
|
100 |
-
* @return Account The deleted account.
|
101 |
-
*/
|
102 |
-
public function delete($params = null, $opts = null)
|
103 |
-
{
|
104 |
-
return $this->_delete($params, $opts);
|
105 |
-
}
|
106 |
-
|
107 |
-
/**
|
108 |
-
* @param array|null $params
|
109 |
-
* @param array|string|null $opts
|
110 |
-
*
|
111 |
-
* @return Account The rejected account.
|
112 |
-
*/
|
113 |
-
public function reject($params = null, $opts = null)
|
114 |
-
{
|
115 |
-
$url = $this->instanceUrl() . '/reject';
|
116 |
-
list($response, $opts) = $this->_request('post', $url, $params, $opts);
|
117 |
-
$this->refreshFrom($response, $opts);
|
118 |
-
return $this;
|
119 |
-
}
|
120 |
-
|
121 |
-
/**
|
122 |
-
* @param array|null $params
|
123 |
-
* @param array|string|null $opts
|
124 |
-
*
|
125 |
-
* @return Collection of Accounts
|
126 |
-
*/
|
127 |
-
public static function all($params = null, $opts = null)
|
128 |
-
{
|
129 |
-
return self::_all($params, $opts);
|
130 |
-
}
|
131 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Stripe;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Account
|
7 |
+
*
|
8 |
+
* @property string $id
|
9 |
+
* @property string $object
|
10 |
+
* @property mixed $business_logo
|
11 |
+
* @property string $business_name
|
12 |
+
* @property mixed $business_url
|
13 |
+
* @property bool $charges_enabled
|
14 |
+
* @property string $country
|
15 |
+
* @property bool $debit_negative_balances
|
16 |
+
* @property mixed $decline_charge_on
|
17 |
+
* @property string $default_currency
|
18 |
+
* @property bool $details_submitted
|
19 |
+
* @property string $display_name
|
20 |
+
* @property string $email
|
21 |
+
* @property mixed $external_accounts
|
22 |
+
* @property mixed $legal_entity
|
23 |
+
* @property bool $managed
|
24 |
+
* @property mixed $product_description
|
25 |
+
* @property mixed $statement_descriptor
|
26 |
+
* @property mixed $support_email
|
27 |
+
* @property mixed $support_phone
|
28 |
+
* @property string $timezone
|
29 |
+
* @property mixed $tos_acceptance
|
30 |
+
* @property mixed $transfer_schedule
|
31 |
+
* @property bool $transfers_enabled
|
32 |
+
* @property mixed $verification
|
33 |
+
* @property mixed $keys
|
34 |
+
*
|
35 |
+
* @package Stripe
|
36 |
+
*/
|
37 |
+
class Account extends ApiResource
|
38 |
+
{
|
39 |
+
public function instanceUrl()
|
40 |
+
{
|
41 |
+
if ($this['id'] === null) {
|
42 |
+
return '/v1/account';
|
43 |
+
} else {
|
44 |
+
return parent::instanceUrl();
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @param string|null $id
|
50 |
+
* @param array|string|null $opts
|
51 |
+
*
|
52 |
+
* @return Account
|
53 |
+
*/
|
54 |
+
public static function retrieve($id = null, $opts = null)
|
55 |
+
{
|
56 |
+
if (!$opts && is_string($id) && substr($id, 0, 3) === 'sk_') {
|
57 |
+
$opts = $id;
|
58 |
+
$id = null;
|
59 |
+
}
|
60 |
+
return self::_retrieve($id, $opts);
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @param array|null $params
|
65 |
+
* @param array|string|null $opts
|
66 |
+
*
|
67 |
+
* @return Account
|
68 |
+
*/
|
69 |
+
public static function create($params = null, $opts = null)
|
70 |
+
{
|
71 |
+
return self::_create($params, $opts);
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @param string $id The ID of the account to update.
|
76 |
+
* @param array|null $params
|
77 |
+
* @param array|string|null $options
|
78 |
+
*
|
79 |
+
* @return Account The updated account.
|
80 |
+
*/
|
81 |
+
public static function update($id, $params = null, $options = null)
|
82 |
+
{
|
83 |
+
return self::_update($id, $params, $options);
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* @param array|string|null $opts
|
88 |
+
*
|
89 |
+
* @return Account
|
90 |
+
*/
|
91 |
+
public function save($opts = null)
|
92 |
+
{
|
93 |
+
return $this->_save($opts);
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* @param array|null $params
|
98 |
+
* @param array|string|null $opts
|
99 |
+
*
|
100 |
+
* @return Account The deleted account.
|
101 |
+
*/
|
102 |
+
public function delete($params = null, $opts = null)
|
103 |
+
{
|
104 |
+
return $this->_delete($params, $opts);
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* @param array|null $params
|
109 |
+
* @param array|string|null $opts
|
110 |
+
*
|
111 |
+
* @return Account The rejected account.
|
112 |
+
*/
|
113 |
+
public function reject($params = null, $opts = null)
|
114 |
+
{
|
115 |
+
$url = $this->instanceUrl() . '/reject';
|
116 |
+
list($response, $opts) = $this->_request('post', $url, $params, $opts);
|
117 |
+
$this->refreshFrom($response, $opts);
|
118 |
+
return $this;
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* @param array|null $params
|
123 |
+
* @param array|string|null $opts
|
124 |
+
*
|
125 |
+
* @return Collection of Accounts
|
126 |
+
*/
|
127 |
+
public static function all($params = null, $opts = null)
|
128 |
+
{
|
129 |
+
return self::_all($params, $opts);
|
130 |
+
}
|
131 |
+
}
|
app/api/Stripe/AlipayAccount.php
CHANGED
@@ -1,13 +1,13 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class AlipayAccount
|
7 |
-
*
|
8 |
-
* @package Stripe
|
9 |
-
*/
|
10 |
-
class AlipayAccount extends ExternalAccount
|
11 |
-
{
|
12 |
-
|
13 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Stripe;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class AlipayAccount
|
7 |
+
*
|
8 |
+
* @package Stripe
|
9 |
+
*/
|
10 |
+
class AlipayAccount extends ExternalAccount
|
11 |
+
{
|
12 |
+
|
13 |
+
}
|
app/api/Stripe/ApiRequestor.php
CHANGED
@@ -1,283 +1,283 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class ApiRequestor
|
7 |
-
*
|
8 |
-
* @package Stripe
|
9 |
-
*/
|
10 |
-
class ApiRequestor
|
11 |
-
{
|
12 |
-
private $_apiKey;
|
13 |
-
|
14 |
-
private $_apiBase;
|
15 |
-
|
16 |
-
private static $_httpClient;
|
17 |
-
|
18 |
-
public function __construct($apiKey = null, $apiBase = null)
|
19 |
-
{
|
20 |
-
$this->_apiKey = $apiKey;
|
21 |
-
if (!$apiBase) {
|
22 |
-
$apiBase = Stripe::$apiBase;
|
23 |
-
}
|
24 |
-
$this->_apiBase = $apiBase;
|
25 |
-
}
|
26 |
-
|
27 |
-
private static function _encodeObjects($d)
|
28 |
-
{
|
29 |
-
if ($d instanceof ApiResource) {
|
30 |
-
return Util\Util::utf8($d->id);
|
31 |
-
} elseif ($d === true) {
|
32 |
-
return 'true';
|
33 |
-
} elseif ($d === false) {
|
34 |
-
return 'false';
|
35 |
-
} elseif (is_array($d)) {
|
36 |
-
$res = array();
|
37 |
-
foreach ($d as $k => $v) {
|
38 |
-
$res[$k] = self::_encodeObjects($v);
|
39 |
-
}
|
40 |
-
return $res;
|
41 |
-
} else {
|
42 |
-
return Util\Util::utf8($d);
|
43 |
-
}
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* @param string $method
|
48 |
-
* @param string $url
|
49 |
-
* @param array|null $params
|
50 |
-
* @param array|null $headers
|
51 |
-
*
|
52 |
-
* @return array An array whose first element is an API response and second
|
53 |
-
* element is the API key used to make the request.
|
54 |
-
*/
|
55 |
-
public function request($method, $url, $params = null, $headers = null)
|
56 |
-
{
|
57 |
-
if (!$params) {
|
58 |
-
$params = array();
|
59 |
-
}
|
60 |
-
if (!$headers) {
|
61 |
-
$headers = array();
|
62 |
-
}
|
63 |
-
list($rbody, $rcode, $rheaders, $myApiKey) =
|
64 |
-
$this->_requestRaw($method, $url, $params, $headers);
|
65 |
-
$json = $this->_interpretResponse($rbody, $rcode, $rheaders);
|
66 |
-
$resp = new ApiResponse($rbody, $rcode, $rheaders, $json);
|
67 |
-
return array($resp, $myApiKey);
|
68 |
-
}
|
69 |
-
|
70 |
-
/**
|
71 |
-
* @param string $rbody A JSON string.
|
72 |
-
* @param int $rcode
|
73 |
-
* @param array $rheaders
|
74 |
-
* @param array $resp
|
75 |
-
*
|
76 |
-
* @throws Error\InvalidRequest if the error is caused by the user.
|
77 |
-
* @throws Error\Authentication if the error is caused by a lack of
|
78 |
-
* permissions.
|
79 |
-
* @throws Error\Permission if the error is caused by insufficient
|
80 |
-
* permissions.
|
81 |
-
* @throws Error\Card if the error is the error code is 402 (payment
|
82 |
-
* required)
|
83 |
-
* @throws Error\RateLimit if the error is caused by too many requests
|
84 |
-
* hitting the API.
|
85 |
-
* @throws Error\Api otherwise.
|
86 |
-
*/
|
87 |
-
public function handleApiError($rbody, $rcode, $rheaders, $resp)
|
88 |
-
{
|
89 |
-
if (!is_array($resp) || !isset($resp['error'])) {
|
90 |
-
$msg = "Invalid response object from API: $rbody "
|
91 |
-
. "(HTTP response code was $rcode)";
|
92 |
-
throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
|
93 |
-
}
|
94 |
-
|
95 |
-
$error = $resp['error'];
|
96 |
-
$msg = isset($error['message']) ? $error['message'] : null;
|
97 |
-
$param = isset($error['param']) ? $error['param'] : null;
|
98 |
-
$code = isset($error['code']) ? $error['code'] : null;
|
99 |
-
|
100 |
-
switch ($rcode) {
|
101 |
-
case 400:
|
102 |
-
// 'rate_limit' code is deprecated, but left here for backwards compatibility
|
103 |
-
// for API versions earlier than 2015-09-08
|
104 |
-
if ($code == 'rate_limit') {
|
105 |
-
throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
106 |
-
}
|
107 |
-
|
108 |
-
// intentional fall-through
|
109 |
-
case 404:
|
110 |
-
throw new Error\InvalidRequest($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
111 |
-
case 401:
|
112 |
-
throw new Error\Authentication($msg, $rcode, $rbody, $resp, $rheaders);
|
113 |
-
case 402:
|
114 |
-
throw new Error\Card($msg, $param, $code, $rcode, $rbody, $resp, $rheaders);
|
115 |
-
case 403:
|
116 |
-
throw new Error\Permission($msg, $rcode, $rbody, $resp, $rheaders);
|
117 |
-
case 429:
|
118 |
-
throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
119 |
-
default:
|
120 |
-
throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
|
121 |
-
}
|
122 |
-
}
|
123 |
-
|
124 |
-
private static function _formatAppInfo($appInfo)
|
125 |
-
{
|
126 |
-
if ($appInfo !== null) {
|
127 |
-
$string = $appInfo['name'];
|
128 |
-
if ($appInfo['version'] !== null) {
|
129 |
-
$string .= '/' . $appInfo['version'];
|
130 |
-
}
|
131 |
-
if ($appInfo['url'] !== null) {
|
132 |
-
$string .= ' (' . $appInfo['url'] . ')';
|
133 |
-
}
|
134 |
-
return $string;
|
135 |
-
} else {
|
136 |
-
return null;
|
137 |
-
}
|
138 |
-
}
|
139 |
-
|
140 |
-
private static function _defaultHeaders($apiKey)
|
141 |
-
{
|
142 |
-
$appInfo = Stripe::getAppInfo();
|
143 |
-
|
144 |
-
$uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION;
|
145 |
-
|
146 |
-
$langVersion = phpversion();
|
147 |
-
$uname = php_uname();
|
148 |
-
$curlVersion = curl_version();
|
149 |
-
$appInfo = Stripe::getAppInfo();
|
150 |
-
$ua = array(
|
151 |
-
'bindings_version' => Stripe::VERSION,
|
152 |
-
'lang' => 'php',
|
153 |
-
'lang_version' => $langVersion,
|
154 |
-
'publisher' => 'stripe',
|
155 |
-
'uname' => $uname,
|
156 |
-
'httplib' => 'curl ' . $curlVersion['version'],
|
157 |
-
'ssllib' => $curlVersion['ssl_version'],
|
158 |
-
);
|
159 |
-
if ($appInfo !== null) {
|
160 |
-
$uaString .= ' ' . self::_formatAppInfo($appInfo);
|
161 |
-
$ua['application'] = $appInfo;
|
162 |
-
}
|
163 |
-
|
164 |
-
$defaultHeaders = array(
|
165 |
-
'X-Stripe-Client-User-Agent' => json_encode($ua),
|
166 |
-
'User-Agent' => $uaString,
|
167 |
-
'Authorization' => 'Bearer ' . $apiKey,
|
168 |
-
);
|
169 |
-
return $defaultHeaders;
|
170 |
-
}
|
171 |
-
|
172 |
-
private function _requestRaw($method, $url, $params, $headers)
|
173 |
-
{
|
174 |
-
$myApiKey = $this->_apiKey;
|
175 |
-
if (!$myApiKey) {
|
176 |
-
$myApiKey = Stripe::$apiKey;
|
177 |
-
}
|
178 |
-
|
179 |
-
if (!$myApiKey) {
|
180 |
-
$msg = 'No API key provided. (HINT: set your API key using '
|
181 |
-
. '"Stripe::setApiKey(<API-KEY>)". You can generate API keys from '
|
182 |
-
. 'the Stripe web interface. See https://stripe.com/api for '
|
183 |
-
. 'details, or email support@stripe.com if you have any questions.';
|
184 |
-
throw new Error\Authentication($msg);
|
185 |
-
}
|
186 |
-
|
187 |
-
$absUrl = $this->_apiBase.$url;
|
188 |
-
$params = self::_encodeObjects($params);
|
189 |
-
$defaultHeaders = $this->_defaultHeaders($myApiKey);
|
190 |
-
if (Stripe::$apiVersion) {
|
191 |
-
$defaultHeaders['Stripe-Version'] = Stripe::$apiVersion;
|
192 |
-
}
|
193 |
-
|
194 |
-
if (Stripe::$accountId) {
|
195 |
-
$defaultHeaders['Stripe-Account'] = Stripe::$accountId;
|
196 |
-
}
|
197 |
-
|
198 |
-
$hasFile = false;
|
199 |
-
$hasCurlFile = class_exists('\CURLFile', false);
|
200 |
-
foreach ($params as $k => $v) {
|
201 |
-
if (is_resource($v)) {
|
202 |
-
$hasFile = true;
|
203 |
-
$params[$k] = self::_processResourceParam($v, $hasCurlFile);
|
204 |
-
} elseif ($hasCurlFile && $v instanceof \CURLFile) {
|
205 |
-
$hasFile = true;
|
206 |
-
}
|
207 |
-
}
|
208 |
-
|
209 |
-
if ($hasFile) {
|
210 |
-
$defaultHeaders['Content-Type'] = 'multipart/form-data';
|
211 |
-
} else {
|
212 |
-
$defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
|
213 |
-
}
|
214 |
-
|
215 |
-
$combinedHeaders = array_merge($defaultHeaders, $headers);
|
216 |
-
$rawHeaders = array();
|
217 |
-
|
218 |
-
foreach ($combinedHeaders as $header => $value) {
|
219 |
-
$rawHeaders[] = $header . ': ' . $value;
|
220 |
-
}
|
221 |
-
|
222 |
-
list($rbody, $rcode, $rheaders) = $this->httpClient()->request(
|
223 |
-
$method,
|
224 |
-
$absUrl,
|
225 |
-
$rawHeaders,
|
226 |
-
$params,
|
227 |
-
$hasFile
|
228 |
-
);
|
229 |
-
return array($rbody, $rcode, $rheaders, $myApiKey);
|
230 |
-
}
|
231 |
-
|
232 |
-
private function _processResourceParam($resource, $hasCurlFile)
|
233 |
-
{
|
234 |
-
if (get_resource_type($resource) !== 'stream') {
|
235 |
-
throw new Error\Api(
|
236 |
-
'Attempted to upload a resource that is not a stream'
|
237 |
-
);
|
238 |
-
}
|
239 |
-
|
240 |
-
$metaData = stream_get_meta_data($resource);
|
241 |
-
if ($metaData['wrapper_type'] !== 'plainfile') {
|
242 |
-
throw new Error\Api(
|
243 |
-
'Only plainfile resource streams are supported'
|
244 |
-
);
|
245 |
-
}
|
246 |
-
|
247 |
-
if ($hasCurlFile) {
|
248 |
-
// We don't have the filename or mimetype, but the API doesn't care
|
249 |
-
return new \CURLFile($metaData['uri']);
|
250 |
-
} else {
|
251 |
-
return '@'.$metaData['uri'];
|
252 |
-
}
|
253 |
-
}
|
254 |
-
|
255 |
-
private function _interpretResponse($rbody, $rcode, $rheaders)
|
256 |
-
{
|
257 |
-
try {
|
258 |
-
$resp = json_decode($rbody, true);
|
259 |
-
} catch (Exception $e) {
|
260 |
-
$msg = "Invalid response body from API: $rbody "
|
261 |
-
. "(HTTP response code was $rcode)";
|
262 |
-
throw new Error\Api($msg, $rcode, $rbody);
|
263 |
-
}
|
264 |
-
|
265 |
-
if ($rcode < 200 || $rcode >= 300) {
|
266 |
-
$this->handleApiError($rbody, $rcode, $rheaders, $resp);
|
267 |
-
}
|
268 |
-
return $resp;
|
269 |
-
}
|
270 |
-
|
271 |
-
public static function setHttpClient($client)
|
272 |
-
{
|
273 |
-
self::$_httpClient = $client;
|
274 |
-
}
|
275 |
-
|
276 |
-
private function httpClient()
|
277 |
-
{
|
278 |
-
if (!self::$_httpClient) {
|
279 |
-
self::$_httpClient = HttpClient\CurlClient::instance();
|
280 |
-
}
|
281 |
-
return self::$_httpClient;
|
282 |
-
}
|
283 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Stripe;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class ApiRequestor
|
7 |
+
*
|
8 |
+
* @package Stripe
|
9 |
+
*/
|
10 |
+
class ApiRequestor
|
11 |
+
{
|
12 |
+
private $_apiKey;
|
13 |
+
|
14 |
+
private $_apiBase;
|
15 |
+
|
16 |
+
private static $_httpClient;
|
17 |
+
|
18 |
+
public function __construct($apiKey = null, $apiBase = null)
|
19 |
+
{
|
20 |
+
$this->_apiKey = $apiKey;
|
21 |
+
if (!$apiBase) {
|
22 |
+
$apiBase = Stripe::$apiBase;
|
23 |
+
}
|
24 |
+
$this->_apiBase = $apiBase;
|
25 |
+
}
|
26 |
+
|
27 |
+
private static function _encodeObjects($d)
|
28 |
+
{
|
29 |
+
if ($d instanceof ApiResource) {
|
30 |
+
return Util\Util::utf8($d->id);
|
31 |
+
} elseif ($d === true) {
|
32 |
+
return 'true';
|
33 |
+
} elseif ($d === false) {
|
34 |
+
return 'false';
|
35 |
+
} elseif (is_array($d)) {
|
36 |
+
$res = array();
|
37 |
+
foreach ($d as $k => $v) {
|
38 |
+
$res[$k] = self::_encodeObjects($v);
|
39 |
+
}
|
40 |
+
return $res;
|
41 |
+
} else {
|
42 |
+
return Util\Util::utf8($d);
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @param string $method
|
48 |
+
* @param string $url
|
49 |
+
* @param array|null $params
|
50 |
+
* @param array|null $headers
|
51 |
+
*
|
52 |
+
* @return array An array whose first element is an API response and second
|
53 |
+
* element is the API key used to make the request.
|
54 |
+
*/
|
55 |
+
public function request($method, $url, $params = null, $headers = null)
|
56 |
+
{
|
57 |
+
if (!$params) {
|
58 |
+
$params = array();
|
59 |
+
}
|
60 |
+
if (!$headers) {
|
61 |
+
$headers = array();
|
62 |
+
}
|
63 |
+
list($rbody, $rcode, $rheaders, $myApiKey) =
|
64 |
+
$this->_requestRaw($method, $url, $params, $headers);
|
65 |
+
$json = $this->_interpretResponse($rbody, $rcode, $rheaders);
|
66 |
+
$resp = new ApiResponse($rbody, $rcode, $rheaders, $json);
|
67 |
+
return array($resp, $myApiKey);
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* @param string $rbody A JSON string.
|
72 |
+
* @param int $rcode
|
73 |
+
* @param array $rheaders
|
74 |
+
* @param array $resp
|
75 |
+
*
|
76 |
+
* @throws Error\InvalidRequest if the error is caused by the user.
|
77 |
+
* @throws Error\Authentication if the error is caused by a lack of
|
78 |
+
* permissions.
|
79 |
+
* @throws Error\Permission if the error is caused by insufficient
|
80 |
+
* permissions.
|
81 |
+
* @throws Error\Card if the error is the error code is 402 (payment
|
82 |
+
* required)
|
83 |
+
* @throws Error\RateLimit if the error is caused by too many requests
|
84 |
+
* hitting the API.
|
85 |
+
* @throws Error\Api otherwise.
|
86 |
+
*/
|
87 |
+
public function handleApiError($rbody, $rcode, $rheaders, $resp)
|
88 |
+
{
|
89 |
+
if (!is_array($resp) || !isset($resp['error'])) {
|
90 |
+
$msg = "Invalid response object from API: $rbody "
|
91 |
+
. "(HTTP response code was $rcode)";
|
92 |
+
throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
|
93 |
+
}
|
94 |
+
|
95 |
+
$error = $resp['error'];
|
96 |
+
$msg = isset($error['message']) ? $error['message'] : null;
|
97 |
+
$param = isset($error['param']) ? $error['param'] : null;
|
98 |
+
$code = isset($error['code']) ? $error['code'] : null;
|
99 |
+
|
100 |
+
switch ($rcode) {
|
101 |
+
case 400:
|
102 |
+
// 'rate_limit' code is deprecated, but left here for backwards compatibility
|
103 |
+
// for API versions earlier than 2015-09-08
|
104 |
+
if ($code == 'rate_limit') {
|
105 |
+
throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
106 |
+
}
|
107 |
+
|
108 |
+
// intentional fall-through
|
109 |
+
case 404:
|
110 |
+
throw new Error\InvalidRequest($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
111 |
+
case 401:
|
112 |
+
throw new Error\Authentication($msg, $rcode, $rbody, $resp, $rheaders);
|
113 |
+
case 402:
|
114 |
+
throw new Error\Card($msg, $param, $code, $rcode, $rbody, $resp, $rheaders);
|
115 |
+
case 403:
|
116 |
+
throw new Error\Permission($msg, $rcode, $rbody, $resp, $rheaders);
|
117 |
+
case 429:
|
118 |
+
throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders);
|
119 |
+
default:
|
120 |
+
throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders);
|
121 |
+
}
|
122 |
+
}
|
123 |
+
|
124 |
+
private static function _formatAppInfo($appInfo)
|
125 |
+
{
|
126 |
+
if ($appInfo !== null) {
|
127 |
+
$string = $appInfo['name'];
|
128 |
+
if ($appInfo['version'] !== null) {
|
129 |
+
$string .= '/' . $appInfo['version'];
|
130 |
+
}
|
131 |
+
if ($appInfo['url'] !== null) {
|
132 |
+
$string .= ' (' . $appInfo['url'] . ')';
|
133 |
+
}
|
134 |
+
return $string;
|
135 |
+
} else {
|
136 |
+
return null;
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
private static function _defaultHeaders($apiKey)
|
141 |
+
{
|
142 |
+
$appInfo = Stripe::getAppInfo();
|
143 |
+
|
144 |
+
$uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION;
|
145 |
+
|
146 |
+
$langVersion = phpversion();
|
147 |
+
$uname = php_uname();
|
148 |
+
$curlVersion = curl_version();
|
149 |
+
$appInfo = Stripe::getAppInfo();
|
150 |
+
$ua = array(
|
151 |
+
'bindings_version' => Stripe::VERSION,
|
152 |
+
'lang' => 'php',
|
153 |
+
'lang_version' => $langVersion,
|
154 |
+
'publisher' => 'stripe',
|
155 |
+
'uname' => $uname,
|
156 |
+
'httplib' => 'curl ' . $curlVersion['version'],
|
157 |
+
'ssllib' => $curlVersion['ssl_version'],
|
158 |
+
);
|
159 |
+
if ($appInfo !== null) {
|
160 |
+
$uaString .= ' ' . self::_formatAppInfo($appInfo);
|
161 |
+
$ua['application'] = $appInfo;
|
162 |
+
}
|
163 |
+
|
164 |
+
$defaultHeaders = array(
|
165 |
+
'X-Stripe-Client-User-Agent' => json_encode($ua),
|
166 |
+
'User-Agent' => $uaString,
|
167 |
+
'Authorization' => 'Bearer ' . $apiKey,
|
168 |
+
);
|
169 |
+
return $defaultHeaders;
|
170 |
+
}
|
171 |
+
|
172 |
+
private function _requestRaw($method, $url, $params, $headers)
|
173 |
+
{
|
174 |
+
$myApiKey = $this->_apiKey;
|
175 |
+
if (!$myApiKey) {
|
176 |
+
$myApiKey = Stripe::$apiKey;
|
177 |
+
}
|
178 |
+
|
179 |
+
if (!$myApiKey) {
|
180 |
+
$msg = 'No API key provided. (HINT: set your API key using '
|
181 |
+
. '"Stripe::setApiKey(<API-KEY>)". You can generate API keys from '
|
182 |
+
. 'the Stripe web interface. See https://stripe.com/api for '
|
183 |
+
. 'details, or email support@stripe.com if you have any questions.';
|
184 |
+
throw new Error\Authentication($msg);
|
185 |
+
}
|
186 |
+
|
187 |
+
$absUrl = $this->_apiBase.$url;
|
188 |
+
$params = self::_encodeObjects($params);
|
189 |
+
$defaultHeaders = $this->_defaultHeaders($myApiKey);
|
190 |
+
if (Stripe::$apiVersion) {
|
191 |
+
$defaultHeaders['Stripe-Version'] = Stripe::$apiVersion;
|
192 |
+
}
|
193 |
+
|
194 |
+
if (Stripe::$accountId) {
|
195 |
+
$defaultHeaders['Stripe-Account'] = Stripe::$accountId;
|
196 |
+
}
|
197 |
+
|
198 |
+
$hasFile = false;
|
199 |
+
$hasCurlFile = class_exists('\CURLFile', false);
|
200 |
+
foreach ($params as $k => $v) {
|
201 |
+
if (is_resource($v)) {
|
202 |
+
$hasFile = true;
|
203 |
+
$params[$k] = self::_processResourceParam($v, $hasCurlFile);
|
204 |
+
} elseif ($hasCurlFile && $v instanceof \CURLFile) {
|
205 |
+
$hasFile = true;
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
if ($hasFile) {
|
210 |
+
$defaultHeaders['Content-Type'] = 'multipart/form-data';
|
211 |
+
} else {
|
212 |
+
$defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
|
213 |
+
}
|
214 |
+
|
215 |
+
$combinedHeaders = array_merge($defaultHeaders, $headers);
|
216 |
+
$rawHeaders = array();
|
217 |
+
|
218 |
+
foreach ($combinedHeaders as $header => $value) {
|
219 |
+
$rawHeaders[] = $header . ': ' . $value;
|
220 |
+
}
|
221 |
+
|
222 |
+
list($rbody, $rcode, $rheaders) = $this->httpClient()->request(
|
223 |
+
$method,
|
224 |
+
$absUrl,
|
225 |
+
$rawHeaders,
|
226 |
+
$params,
|
227 |
+
$hasFile
|
228 |
+
);
|
229 |
+
return array($rbody, $rcode, $rheaders, $myApiKey);
|
230 |
+
}
|
231 |
+
|
232 |
+
private function _processResourceParam($resource, $hasCurlFile)
|
233 |
+
{
|
234 |
+
if (get_resource_type($resource) !== 'stream') {
|
235 |
+
throw new Error\Api(
|
236 |
+
'Attempted to upload a resource that is not a stream'
|
237 |
+
);
|
238 |
+
}
|
239 |
+
|
240 |
+
$metaData = stream_get_meta_data($resource);
|
241 |
+
if ($metaData['wrapper_type'] !== 'plainfile') {
|
242 |
+
throw new Error\Api(
|
243 |
+
'Only plainfile resource streams are supported'
|
244 |
+
);
|
245 |
+
}
|
246 |
+
|
247 |
+
if ($hasCurlFile) {
|
248 |
+
// We don't have the filename or mimetype, but the API doesn't care
|
249 |
+
return new \CURLFile($metaData['uri']);
|
250 |
+
} else {
|
251 |
+
return '@'.$metaData['uri'];
|
252 |
+
}
|
253 |
+
}
|
254 |
+
|
255 |
+
private function _interpretResponse($rbody, $rcode, $rheaders)
|
256 |
+
{
|
257 |
+
try {
|
258 |
+
$resp = json_decode($rbody, true);
|
259 |
+
} catch (Exception $e) {
|
260 |
+
$msg = "Invalid response body from API: $rbody "
|
261 |
+
. "(HTTP response code was $rcode)";
|
262 |
+
throw new Error\Api($msg, $rcode, $rbody);
|
263 |
+
}
|
264 |
+
|
265 |
+
if ($rcode < 200 || $rcode >= 300) {
|
266 |
+
$this->handleApiError($rbody, $rcode, $rheaders, $resp);
|
267 |
+
}
|
268 |
+
return $resp;
|
269 |
+
}
|
270 |
+
|
271 |
+
public static function setHttpClient($client)
|
272 |
+
{
|
273 |
+
self::$_httpClient = $client;
|
274 |
+
}
|
275 |
+
|
276 |
+
private function httpClient()
|
277 |
+
{
|
278 |
+
if (!self::$_httpClient) {
|
279 |
+
self::$_httpClient = HttpClient\CurlClient::instance();
|
280 |
+
}
|
281 |
+
return self::$_httpClient;
|
282 |
+
}
|
283 |
+
}
|
app/api/Stripe/ApiResource.php
CHANGED
@@ -1,205 +1,205 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class ApiResource
|
7 |
-
*
|
8 |
-
* @package Stripe
|
9 |
-
*/
|
10 |
-
abstract class ApiResource extends StripeObject
|
11 |
-
{
|
12 |
-
private static $HEADERS_TO_PERSIST = array('Stripe-Account' => true, 'Stripe-Version' => true);
|
13 |
-
|
14 |
-
public static function baseUrl()
|
15 |
-
{
|
16 |
-
return Stripe::$apiBase;
|
17 |
-
}
|
18 |
-
|
19 |
-
/**
|
20 |
-
* @return ApiResource The refreshed resource.
|
21 |
-
*/
|
22 |
-
public function refresh()
|
23 |
-
{
|
24 |
-
$requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl());
|
25 |
-
$url = $this->instanceUrl();
|
26 |
-
|
27 |
-
list($response, $this->_opts->apiKey) = $requestor->request(
|
28 |
-
'get',
|
29 |
-
$url,
|
30 |
-
$this->_retrieveOptions,
|
31 |
-
$this->_opts->headers
|
32 |
-
);
|
33 |
-
$this->setLastResponse($response);
|
34 |
-
$this->refreshFrom($response->json, $this->_opts);
|
35 |
-
return $this;
|
36 |
-
}
|
37 |
-
|
38 |
-
/**
|
39 |
-
* @return string The name of the class, with namespacing and underscores
|
40 |
-
* stripped.
|
41 |
-
*/
|
42 |
-
public static function className()
|
43 |
-
{
|
44 |
-
$class = get_called_class();
|
45 |
-
// Useful for namespaces: Foo\Charge
|
46 |
-
if ($postfixNamespaces = strrchr($class, '\\')) {
|
47 |
-
$class = substr($postfixNamespaces, 1);
|
48 |
-
}
|
49 |
-
// Useful for underscored 'namespaces': Foo_Charge
|
50 |
-
if ($postfixFakeNamespaces = strrchr($class, '')) {
|
51 |
-
$class = $postfixFakeNamespaces;
|
52 |
-
}
|
53 |
-
if (substr($class, 0, strlen('Stripe')) == 'Stripe') {
|
54 |
-
$class = substr($class, strlen('Stripe'));
|
55 |
-
}
|
56 |
-
$class = str_replace('_', '', $class);
|
57 |
-
$name = urlencode($class);
|
58 |
-
$name = strtolower($name);
|
59 |
-
return $name;
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* @return string The endpoint URL for the given class.
|
64 |
-
*/
|
65 |
-
public static function classUrl()
|
66 |
-
{
|
67 |
-
$base = static::className();
|
68 |
-
return "/v1/${base}s";
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* @return string The instance endpoint URL for the given class.
|
73 |
-
*/
|
74 |
-
public static function resourceUrl($id)
|
75 |
-
{
|
76 |
-
if ($id === null) {
|
77 |
-
$class = get_called_class();
|
78 |
-
$message = "Could not determine which URL to request: "
|
79 |
-
. "$class instance has invalid ID: $id";
|
80 |
-
throw new Error\InvalidRequest($message, null);
|
81 |
-
}
|
82 |
-
$id = Util\Util::utf8($id);
|
83 |
-
$base = static::classUrl();
|
84 |
-
$extn = urlencode($id);
|
85 |
-
return "$base/$extn";
|
86 |
-
}
|
87 |
-
|
88 |
-
/**
|
89 |
-
* @return string The full API URL for this API resource.
|
90 |
-
*/
|
91 |
-
public function instanceUrl()
|
92 |
-
{
|
93 |
-
return static::resourceUrl($this['id']);
|
94 |
-
}
|
95 |
-
|
96 |
-
private static function _validateParams($params = null)
|
97 |
-
{
|
98 |
-
if ($params && !is_array($params)) {
|
99 |
-
$message = "You must pass an array as the first argument to Stripe API "
|
100 |
-
. "method calls. (HINT: an example call to create a charge "
|
101 |
-
. "would be: \"Stripe\\Charge::create(array('amount' => 100, "
|
102 |
-
. "'currency' => 'usd', 'card' => array('number' => "
|
103 |
-
. "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")";
|
104 |
-
throw new Error\Api($message);
|
105 |
-
}
|
106 |
-
}
|
107 |
-
|
108 |
-
protected function _request($method, $url, $params = array(), $options = null)
|
109 |
-
{
|
110 |
-
$opts = $this->_opts->merge($options);
|
111 |
-
list($resp, $options) = static::_staticRequest($method, $url, $params, $opts);
|
112 |
-
$this->setLastResponse($resp);
|
113 |
-
return array($resp->json, $options);
|
114 |
-
}
|
115 |
-
|
116 |
-
protected static function _staticRequest($method, $url, $params, $options)
|
117 |
-
{
|
118 |
-
$opts = Util\RequestOptions::parse($options);
|
119 |
-
$requestor = new ApiRequestor($opts->apiKey, static::baseUrl());
|
120 |
-
list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers);
|
121 |
-
foreach ($opts->headers as $k => $v) {
|
122 |
-
if (!array_key_exists($k, self::$HEADERS_TO_PERSIST)) {
|
123 |
-
unset($opts->headers[$k]);
|
124 |
-
}
|
125 |
-
}
|
126 |
-
return array($response, $opts);
|
127 |
-
}
|
128 |
-
|
129 |
-
protected static function _retrieve($id, $options = null)
|
130 |
-
{
|
131 |
-
$opts = Util\RequestOptions::parse($options);
|
132 |
-
$instance = new static($id, $opts);
|
133 |
-
$instance->refresh();
|
134 |
-
return $instance;
|
135 |
-
}
|
136 |
-
|
137 |
-
protected static function _all($params = null, $options = null)
|
138 |
-
{
|
139 |
-
self::_validateParams($params);
|
140 |
-
$url = static::classUrl();
|
141 |
-
|
142 |
-
list($response, $opts) = static::_staticRequest('get', $url, $params, $options);
|
143 |
-
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
144 |
-
if (!is_a($obj, 'Stripe\\Collection')) {
|
145 |
-
$class = get_class($obj);
|
146 |
-
$message = "Expected type \"Stripe\\Collection\", got \"$class\" instead";
|
147 |
-
throw new Error\Api($message);
|
148 |
-
}
|
149 |
-
$obj->setLastResponse($response);
|
150 |
-
$obj->setRequestParams($params);
|
151 |
-
return $obj;
|
152 |
-
}
|
153 |
-
|
154 |
-
protected static function _create($params = null, $options = null)
|
155 |
-
{
|
156 |
-
self::_validateParams($params);
|
157 |
-
$base = static::baseUrl();
|
158 |
-
$url = static::classUrl();
|
159 |
-
|
160 |
-
list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
|
161 |
-
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
162 |
-
$obj->setLastResponse($response);
|
163 |
-
return $obj;
|
164 |
-
}
|
165 |
-
|
166 |
-
/**
|
167 |
-
* @param string $id The ID of the API resource to update.
|
168 |
-
* @param array|null $params
|
169 |
-
* @param array|string|null $opts
|
170 |
-
*
|
171 |
-
* @return ApiResource the updated API resource
|
172 |
-
*/
|
173 |
-
protected static function _update($id, $params = null, $options = null)
|
174 |
-
{
|
175 |
-
self::_validateParams($params);
|
176 |
-
$base = static::baseUrl();
|
177 |
-
$url = static::resourceUrl($id);
|
178 |
-
|
179 |
-
list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
|
180 |
-
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
181 |
-
$obj->setLastResponse($response);
|
182 |
-
return $obj;
|
183 |
-
}
|
184 |
-
|
185 |
-
protected function _save($options = null)
|
186 |
-
{
|
187 |
-
$params = $this->serializeParameters();
|
188 |
-
if (count($params) > 0) {
|
189 |
-
$url = $this->instanceUrl();
|
190 |
-
list($response, $opts) = $this->_request('post', $url, $params, $options);
|
191 |
-
$this->refreshFrom($response, $opts);
|
192 |
-
}
|
193 |
-
return $this;
|
194 |
-
}
|
195 |
-
|
196 |
-
protected function _delete($params = null, $options = null)
|
197 |
-
{
|
198 |
-
self::_validateParams($params);
|
199 |
-
|
200 |
-
$url = $this->instanceUrl();
|
201 |
-
list($response, $opts) = $this->_request('delete', $url, $params, $options);
|
202 |
-
$this->refreshFrom($response, $opts);
|
203 |
-
return $this;
|
204 |
-
}
|
205 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Stripe;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class ApiResource
|
7 |
+
*
|
8 |
+
* @package Stripe
|
9 |
+
*/
|
10 |
+
abstract class ApiResource extends StripeObject
|
11 |
+
{
|
12 |
+
private static $HEADERS_TO_PERSIST = array('Stripe-Account' => true, 'Stripe-Version' => true);
|
13 |
+
|
14 |
+
public static function baseUrl()
|
15 |
+
{
|
16 |
+
return Stripe::$apiBase;
|
17 |
+
}
|
18 |
+
|
19 |
+
/**
|
20 |
+
* @return ApiResource The refreshed resource.
|
21 |
+
*/
|
22 |
+
public function refresh()
|
23 |
+
{
|
24 |
+
$requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl());
|
25 |
+
$url = $this->instanceUrl();
|
26 |
+
|
27 |
+
list($response, $this->_opts->apiKey) = $requestor->request(
|
28 |
+
'get',
|
29 |
+
$url,
|
30 |
+
$this->_retrieveOptions,
|
31 |
+
$this->_opts->headers
|
32 |
+
);
|
33 |
+
$this->setLastResponse($response);
|
34 |
+
$this->refreshFrom($response->json, $this->_opts);
|
35 |
+
return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @return string The name of the class, with namespacing and underscores
|
40 |
+
* stripped.
|
41 |
+
*/
|
42 |
+
public static function className()
|
43 |
+
{
|
44 |
+
$class = get_called_class();
|
45 |
+
// Useful for namespaces: Foo\Charge
|
46 |
+
if ($postfixNamespaces = strrchr($class, '\\')) {
|
47 |
+
$class = substr($postfixNamespaces, 1);
|
48 |
+
}
|
49 |
+
// Useful for underscored 'namespaces': Foo_Charge
|
50 |
+
if ($postfixFakeNamespaces = strrchr($class, '')) {
|
51 |
+
$class = $postfixFakeNamespaces;
|
52 |
+
}
|
53 |
+
if (substr($class, 0, strlen('Stripe')) == 'Stripe') {
|
54 |
+
$class = substr($class, strlen('Stripe'));
|
55 |
+
}
|
56 |
+
$class = str_replace('_', '', $class);
|
57 |
+
$name = urlencode($class);
|
58 |
+
$name = strtolower($name);
|
59 |
+
return $name;
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @return string The endpoint URL for the given class.
|
64 |
+
*/
|
65 |
+
public static function classUrl()
|
66 |
+
{
|
67 |
+
$base = static::className();
|
68 |
+
return "/v1/${base}s";
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @return string The instance endpoint URL for the given class.
|
73 |
+
*/
|
74 |
+
public static function resourceUrl($id)
|
75 |
+
{
|
76 |
+
if ($id === null) {
|
77 |
+
$class = get_called_class();
|
78 |
+
$message = "Could not determine which URL to request: "
|
79 |
+
. "$class instance has invalid ID: $id";
|
80 |
+
throw new Error\InvalidRequest($message, null);
|
81 |
+
}
|
82 |
+
$id = Util\Util::utf8($id);
|
83 |
+
$base = static::classUrl();
|
84 |
+
$extn = urlencode($id);
|
85 |
+
return "$base/$extn";
|
86 |
+
}
|
87 |
+
|
88 |
+
/**
|
89 |
+
* @return string The full API URL for this API resource.
|
90 |
+
*/
|
91 |
+
public function instanceUrl()
|
92 |
+
{
|
93 |
+
return static::resourceUrl($this['id']);
|
94 |
+
}
|
95 |
+
|
96 |
+
private static function _validateParams($params = null)
|
97 |
+
{
|
98 |
+
if ($params && !is_array($params)) {
|
99 |
+
$message = "You must pass an array as the first argument to Stripe API "
|
100 |
+
. "method calls. (HINT: an example call to create a charge "
|
101 |
+
. "would be: \"Stripe\\Charge::create(array('amount' => 100, "
|
102 |
+
. "'currency' => 'usd', 'card' => array('number' => "
|
103 |
+
. "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")";
|
104 |
+
throw new Error\Api($message);
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
protected function _request($method, $url, $params = array(), $options = null)
|
109 |
+
{
|
110 |
+
$opts = $this->_opts->merge($options);
|
111 |
+
list($resp, $options) = static::_staticRequest($method, $url, $params, $opts);
|
112 |
+
$this->setLastResponse($resp);
|
113 |
+
return array($resp->json, $options);
|
114 |
+
}
|
115 |
+
|
116 |
+
protected static function _staticRequest($method, $url, $params, $options)
|
117 |
+
{
|
118 |
+
$opts = Util\RequestOptions::parse($options);
|
119 |
+
$requestor = new ApiRequestor($opts->apiKey, static::baseUrl());
|
120 |
+
list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers);
|
121 |
+
foreach ($opts->headers as $k => $v) {
|
122 |
+
if (!array_key_exists($k, self::$HEADERS_TO_PERSIST)) {
|
123 |
+
unset($opts->headers[$k]);
|
124 |
+
}
|
125 |
+
}
|
126 |
+
return array($response, $opts);
|
127 |
+
}
|
128 |
+
|
129 |
+
protected static function _retrieve($id, $options = null)
|
130 |
+
{
|
131 |
+
$opts = Util\RequestOptions::parse($options);
|
132 |
+
$instance = new static($id, $opts);
|
133 |
+
$instance->refresh();
|
134 |
+
return $instance;
|
135 |
+
}
|
136 |
+
|
137 |
+
protected static function _all($params = null, $options = null)
|
138 |
+
{
|
139 |
+
self::_validateParams($params);
|
140 |
+
$url = static::classUrl();
|
141 |
+
|
142 |
+
list($response, $opts) = static::_staticRequest('get', $url, $params, $options);
|
143 |
+
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
144 |
+
if (!is_a($obj, 'Stripe\\Collection')) {
|
145 |
+
$class = get_class($obj);
|
146 |
+
$message = "Expected type \"Stripe\\Collection\", got \"$class\" instead";
|
147 |
+
throw new Error\Api($message);
|
148 |
+
}
|
149 |
+
$obj->setLastResponse($response);
|
150 |
+
$obj->setRequestParams($params);
|
151 |
+
return $obj;
|
152 |
+
}
|
153 |
+
|
154 |
+
protected static function _create($params = null, $options = null)
|
155 |
+
{
|
156 |
+
self::_validateParams($params);
|
157 |
+
$base = static::baseUrl();
|
158 |
+
$url = static::classUrl();
|
159 |
+
|
160 |
+
list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
|
161 |
+
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
162 |
+
$obj->setLastResponse($response);
|
163 |
+
return $obj;
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* @param string $id The ID of the API resource to update.
|
168 |
+
* @param array|null $params
|
169 |
+
* @param array|string|null $opts
|
170 |
+
*
|
171 |
+
* @return ApiResource the updated API resource
|
172 |
+
*/
|
173 |
+
protected static function _update($id, $params = null, $options = null)
|
174 |
+
{
|
175 |
+
self::_validateParams($params);
|
176 |
+
$base = static::baseUrl();
|
177 |
+
$url = static::resourceUrl($id);
|
178 |
+
|
179 |
+
list($response, $opts) = static::_staticRequest('post', $url, $params, $options);
|
180 |
+
$obj = Util\Util::convertToStripeObject($response->json, $opts);
|
181 |
+
$obj->setLastResponse($response);
|
182 |
+
return $obj;
|
183 |
+
}
|
184 |
+
|
185 |
+
protected function _save($options = null)
|
186 |
+
{
|
187 |
+
$params = $this->serializeParameters();
|
188 |
+
if (count($params) > 0) {
|
189 |
+
$url = $this->instanceUrl();
|
190 |
+
list($response, $opts) = $this->_request('post', $url, $params, $options);
|
191 |
+
$this->refreshFrom($response, $opts);
|
192 |
+
}
|
193 |
+
return $this;
|
194 |
+
}
|
195 |
+
|
196 |
+
protected function _delete($params = null, $options = null)
|
197 |
+
{
|
198 |
+
self::_validateParams($params);
|
199 |
+
|
200 |
+
$url = $this->instanceUrl();
|
201 |
+
list($response, $opts) = $this->_request('delete', $url, $params, $options);
|
202 |
+
$this->refreshFrom($response, $opts);
|
203 |
+
return $this;
|
204 |
+
}
|
205 |
+
}
|
app/api/Stripe/ApiResponse.php
CHANGED
@@ -1,32 +1,32 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class ApiResponse
|
7 |
-
*
|
8 |
-
* @package Stripe
|
9 |
-
*/
|
10 |
-
class ApiResponse
|
11 |
-
{
|
12 |
-
public $headers;
|
13 |
-
public $body;
|
14 |
-
public $json;
|
15 |
-
public $code;
|
16 |
-
|
17 |
-
/**
|
18 |
-
* @param string $body
|
19 |
-
* @param integer $code
|
20 |
-
* @param array|null $headers
|
21 |
-
* @param array|null $json
|
22 |
-
*
|
23 |
-
* @return obj An APIResponse
|
24 |
-
*/
|
25 |
-
public function __construct($body, $code, $headers, $json)
|
26 |
-
{
|
27 |
-
$this->body = $body;
|
28 |
-
$this->code = $code;
|
29 |
-
$this->headers = $headers;
|
30 |
-
$this->json = $json;
|
31 |
-
}
|
32 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Stripe;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class ApiResponse
|
7 |
+
*
|
8 |
+
* @package Stripe
|
9 |
+
*/
|
10 |
+
class ApiResponse
|
11 |
+
{
|
12 |
+
public $headers;
|
13 |
+
public $body;
|
14 |
+
public $json;
|
15 |
+
public $code;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @param string $body
|
19 |
+
* @param integer $code
|
20 |
+
* @param array|null $headers
|
21 |
+
* @param array|null $json
|
22 |
+
*
|
23 |
+
* @return obj An APIResponse
|
24 |
+
*/
|
25 |
+
public function __construct($body, $code, $headers, $json)
|
26 |
+
{
|
27 |
+
$this->body = $body;
|
28 |
+
$this->code = $code;
|
29 |
+
$this->headers = $headers;
|
30 |
+
$this->json = $json;
|
31 |
+
}
|
32 |
+
}
|
app/api/Stripe/ApplePayDomain.php
CHANGED
@@ -1,65 +1,65 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace Stripe;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class ApplePayDomain
|
7 |
-
*
|
8 |
-
* @package Stripe
|
9 |
-
*/
|
10 |
-
class ApplePayDomain extends ApiResource
|
11 |
-
{
|
12 |
-
|
13 |
-
/**
|
14 |
-
* @return string The class URL for this resource. It needs to be special
|
15 |
-
* cased because it doesn't fit into the standard resource pattern.
|
16 |
-
*/
|
17 |
-
public static function classUrl()
|
18 |
-
{
|
19 |
-
return '/v1/apple_pay/domains';
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|