mirror of
https://bitbucket.org/jsuto/piler.git
synced 2026-05-04 17:32:14 +02:00
added google xoauth2 support + fixed a journaling issue
This commit is contained in:
@@ -0,0 +1,371 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// Check for the required json and curl extensions, the Google API PHP Client won't function without them.
|
||||
if (! function_exists('curl_init')) {
|
||||
throw new Exception('Google PHP API Client requires the CURL PHP extension');
|
||||
}
|
||||
|
||||
if (! function_exists('json_decode')) {
|
||||
throw new Exception('Google PHP API Client requires the JSON PHP extension');
|
||||
}
|
||||
|
||||
if (! function_exists('http_build_query')) {
|
||||
throw new Exception('Google PHP API Client requires http_build_query()');
|
||||
}
|
||||
|
||||
if (! ini_get('date.timezone') && function_exists('date_default_timezone_set')) {
|
||||
date_default_timezone_set('UTC');
|
||||
}
|
||||
|
||||
// hack around with the include paths a bit so the library 'just works'
|
||||
$cwd = dirname(__FILE__);
|
||||
set_include_path("$cwd" . PATH_SEPARATOR . get_include_path());
|
||||
|
||||
require_once "config.php";
|
||||
// If a local configuration file is found, merge it's values with the default configuration
|
||||
if (file_exists($cwd . '/local_config.php')) {
|
||||
$defaultConfig = $apiConfig;
|
||||
require_once ($cwd . '/local_config.php');
|
||||
$apiConfig = array_merge($defaultConfig, $apiConfig);
|
||||
}
|
||||
|
||||
// Include the top level classes, they each include their own dependencies
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
require_once 'auth/apiAuth.php';
|
||||
require_once 'cache/apiCache.php';
|
||||
require_once 'io/apiIO.php';
|
||||
require_once('service/apiMediaFileUpload.php');
|
||||
|
||||
/**
|
||||
* The Google API Client
|
||||
* http://code.google.com/p/google-api-php-client/
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
class apiClient {
|
||||
// the version of the discovery mechanism this class is meant to work with
|
||||
const discoveryVersion = 'v0.3';
|
||||
|
||||
/**
|
||||
* @static
|
||||
* @var apiAuth $auth
|
||||
*/
|
||||
static $auth;
|
||||
|
||||
/** @var apiIo $io */
|
||||
static $io;
|
||||
|
||||
/** @var apiCache $cache */
|
||||
static $cache;
|
||||
|
||||
/** @var array $scopes */
|
||||
protected $scopes = array();
|
||||
|
||||
/** @var bool $useObjects */
|
||||
protected $useObjects = false;
|
||||
|
||||
// definitions of services that are discovered.
|
||||
protected $services = array();
|
||||
|
||||
// Used to track authenticated state, can't discover services after doing authenticate()
|
||||
private $authenticated = false;
|
||||
|
||||
private $defaultService = array(
|
||||
'authorization_token_url' => 'https://www.google.com/accounts/OAuthAuthorizeToken',
|
||||
'request_token_url' => 'https://www.google.com/accounts/OAuthGetRequestToken',
|
||||
'access_token_url' => 'https://www.google.com/accounts/OAuthGetAccessToken');
|
||||
|
||||
public function __construct($config = array()) {
|
||||
global $apiConfig;
|
||||
$apiConfig = array_merge($apiConfig, $config);
|
||||
self::$cache = new $apiConfig['cacheClass']();
|
||||
self::$auth = new $apiConfig['authClass']();
|
||||
self::$io = new $apiConfig['ioClass']();
|
||||
}
|
||||
|
||||
public function discover($service, $version = 'v1') {
|
||||
$this->addService($service, $version);
|
||||
$this->$service = $this->discoverService($service, $this->services[$service]['discoveryURI']);
|
||||
return $this->$service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a service
|
||||
*/
|
||||
public function addService($service, $version) {
|
||||
global $apiConfig;
|
||||
if ($this->authenticated) {
|
||||
// Adding services after being authenticated, since the oauth scope is already set (so you wouldn't have access to that data)
|
||||
throw new apiException('Cant add services after having authenticated');
|
||||
}
|
||||
$this->services[$service] = $this->defaultService;
|
||||
if (isset($apiConfig['services'][$service])) {
|
||||
// Merge the service descriptor with the default values
|
||||
$this->services[$service] = array_merge($this->services[$service], $apiConfig['services'][$service]);
|
||||
}
|
||||
$this->services[$service]['discoveryURI'] = $apiConfig['basePath'] . '/discovery/' . self::discoveryVersion . '/describe/' . urlencode($service) . '/' . urlencode($version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the type of Auth class the client should use.
|
||||
* @param string $authClassName
|
||||
*/
|
||||
public function setAuthClass($authClassName) {
|
||||
self::$auth = new $authClassName();
|
||||
}
|
||||
|
||||
public function authenticate() {
|
||||
$service = $this->prepareService();
|
||||
$this->authenticated = true;
|
||||
return self::$auth->authenticate($service);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct the OAuth 2.0 authorization request URI.
|
||||
* @return string
|
||||
*/
|
||||
public function createAuthUrl() {
|
||||
$service = $this->prepareService();
|
||||
return self::$auth->createAuthUrl($service['scope']);
|
||||
}
|
||||
|
||||
private function prepareService() {
|
||||
$service = $this->defaultService;
|
||||
$scopes = array();
|
||||
if ($this->scopes) {
|
||||
$scopes = $this->scopes;
|
||||
} else {
|
||||
foreach ($this->services as $key => $val) {
|
||||
if (isset($val['scope'])) {
|
||||
if (is_array($val['scope'])) {
|
||||
$scopes = array_merge($val['scope'], $scopes);
|
||||
} else {
|
||||
$scopes[] = $val['scope'];
|
||||
}
|
||||
} else {
|
||||
$scopes[] = 'https://www.googleapis.com/auth/' . $key;
|
||||
}
|
||||
unset($val['discoveryURI']);
|
||||
unset($val['scope']);
|
||||
$service = array_merge($service, $val);
|
||||
}
|
||||
}
|
||||
$service['scope'] = implode(' ', $scopes);
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the OAuth 2.0 access token using the string that resulted from calling authenticate()
|
||||
* or apiClient#getAccessToken().
|
||||
* @param string $accessToken JSON encoded string containing in the following format:
|
||||
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
||||
* "expires_in":3600, "id_token":"TOKEN", "created":1320790426}
|
||||
*/
|
||||
public function setAccessToken($accessToken) {
|
||||
if ($accessToken == null || 'null' == $accessToken) {
|
||||
$accessToken = null;
|
||||
}
|
||||
self::$auth->setAccessToken($accessToken);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the OAuth 2.0 access token.
|
||||
* @return string $accessToken JSON encoded string in the following format:
|
||||
* {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer",
|
||||
* "expires_in":3600,"id_token":"TOKEN", "created":1320790426}
|
||||
*/
|
||||
public function getAccessToken() {
|
||||
$token = self::$auth->getAccessToken();
|
||||
return (null == $token || 'null' == $token) ? null : $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the developer key to use, these are obtained through the API Console.
|
||||
* @see http://code.google.com/apis/console-help/#generatingdevkeys
|
||||
* @param string $developerKey
|
||||
*/
|
||||
public function setDeveloperKey($developerKey) {
|
||||
self::$auth->setDeveloperKey($developerKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set OAuth 2.0 "state" parameter to achieve per-request customization.
|
||||
* @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2
|
||||
* @param string $state
|
||||
*/
|
||||
public function setState($state) {
|
||||
self::$auth->setState($state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $accessType Possible values for access_type include:
|
||||
* {@code "offline"} to request offline access from the user. (This is the default value)
|
||||
* {@code "online"} to request online access from the user.
|
||||
*/
|
||||
public function setAccessType($accessType) {
|
||||
self::$auth->setAccessType($accessType);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $approvalPrompt Possible values for approval_prompt include:
|
||||
* {@code "force"} to force the approval UI to appear. (This is the default value)
|
||||
* {@code "auto"} to request auto-approval when possible.
|
||||
*/
|
||||
public function setApprovalPrompt($approvalPrompt) {
|
||||
self::$auth->setApprovalPrompt($approvalPrompt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the application name, this is included in the User-Agent HTTP header.
|
||||
* @param string $applicationName
|
||||
*/
|
||||
public function setApplicationName($applicationName) {
|
||||
global $apiConfig;
|
||||
$apiConfig['application_name'] = $applicationName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the OAuth 2.0 Client ID.
|
||||
* @param string $clientId
|
||||
*/
|
||||
public function setClientId($clientId) {
|
||||
global $apiConfig;
|
||||
$apiConfig['oauth2_client_id'] = $clientId;
|
||||
self::$auth->clientId = $clientId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the OAuth 2.0 Client Secret.
|
||||
* @param string $clientSecret
|
||||
*/
|
||||
public function setClientSecret($clientSecret) {
|
||||
global $apiConfig;
|
||||
$apiConfig['oauth2_client_secret'] = $clientSecret;
|
||||
self::$auth->clientSecret = $clientSecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the OAuth 2.0 Redirect URI.
|
||||
* @param string $redirectUri
|
||||
*/
|
||||
public function setRedirectUri($redirectUri) {
|
||||
global $apiConfig;
|
||||
$apiConfig['oauth2_redirect_uri'] = $redirectUri;
|
||||
self::$auth->redirectUri = $redirectUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches a fresh OAuth 2.0 access token with the given refresh token.
|
||||
* @param string $refreshToken
|
||||
* @return void
|
||||
*/
|
||||
public function refreshToken($refreshToken) {
|
||||
self::$auth->refreshToken($refreshToken);
|
||||
}
|
||||
|
||||
/**
|
||||
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
||||
* token, if a token isn't provided.
|
||||
* @throws apiAuthException
|
||||
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
||||
* @return boolean Returns True if the revocation was successful, otherwise False.
|
||||
*/
|
||||
public function revokeToken($token = null) {
|
||||
self::$auth->revokeToken($token);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify an id_token. This method will verify the current id_token, if one
|
||||
* isn't provided.
|
||||
* @throws apiAuthException
|
||||
* @param string|null $token The token (id_token) that should be verified.
|
||||
* @return apiLoginTicket Returns an apiLoginTicket if the verification was
|
||||
* successful.
|
||||
*/
|
||||
public function verifyIdToken($token = null) {
|
||||
return self::$auth->verifyIdToken($token);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function allows you to overrule the automatically generated scopes,
|
||||
* so that you can ask for more or less permission in the auth flow
|
||||
* Set this before you call authenticate() though!
|
||||
* @param array $scopes, ie: array('https://www.googleapis.com/auth/plus', 'https://www.googleapis.com/auth/moderator')
|
||||
*/
|
||||
public function setScopes($scopes) {
|
||||
$this->scopes = is_string($scopes) ? explode(" ", $scopes) : $scopes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Declare if objects should be returned by the api service classes.
|
||||
*
|
||||
* @param boolean $useObjects True if objects should be returned by the service classes.
|
||||
* False if associative arrays should be returned (default behavior).
|
||||
*/
|
||||
public function setUseObjects($useObjects) {
|
||||
global $apiConfig;
|
||||
$apiConfig['use_objects'] = $useObjects;
|
||||
}
|
||||
|
||||
private function discoverService($serviceName, $serviceURI) {
|
||||
$request = self::$io->makeRequest(new apiHttpRequest($serviceURI));
|
||||
if ($request->getResponseHttpCode() != 200) {
|
||||
throw new apiException("Could not fetch discovery document for $serviceName, code: "
|
||||
. $request->getResponseHttpCode() . ", response: " . $request->getResponseBody());
|
||||
}
|
||||
$discoveryResponse = $request->getResponseBody();
|
||||
$discoveryDocument = json_decode($discoveryResponse, true);
|
||||
if ($discoveryDocument == NULL) {
|
||||
throw new apiException("Invalid json returned for $serviceName");
|
||||
}
|
||||
return new apiService($serviceName, $discoveryDocument, apiClient::getIo());
|
||||
}
|
||||
|
||||
/**
|
||||
* @static
|
||||
* @return apiAuth the implementation of apiAuth.
|
||||
*/
|
||||
public static function getAuth() {
|
||||
return apiClient::$auth;
|
||||
}
|
||||
|
||||
/**
|
||||
* @static
|
||||
* @return apiIo the implementation of apiIo.
|
||||
*/
|
||||
public static function getIo() {
|
||||
return apiClient::$io;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return apiCache the implementation of apiCache.
|
||||
*/
|
||||
public function getCache() {
|
||||
return apiClient::$cache;
|
||||
}
|
||||
}
|
||||
|
||||
// Exceptions that the Google PHP API Library can throw
|
||||
class apiException extends Exception {}
|
||||
class apiAuthException extends apiException {}
|
||||
class apiCacheException extends apiException {}
|
||||
class apiIOException extends apiException {}
|
||||
class apiServiceException extends apiException {}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "apiAuthNone.php";
|
||||
require_once "apiOAuth.php";
|
||||
require_once "apiOAuth2.php";
|
||||
|
||||
/**
|
||||
* Abstract class for the Authentication in the API client
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*
|
||||
*/
|
||||
abstract class apiAuth {
|
||||
abstract public function authenticate($service);
|
||||
abstract public function sign(apiHttpRequest $request);
|
||||
abstract public function createAuthUrl($scope);
|
||||
|
||||
abstract public function getAccessToken();
|
||||
abstract public function setAccessToken($accessToken);
|
||||
abstract public function setDeveloperKey($developerKey);
|
||||
abstract public function refreshToken($refreshToken);
|
||||
abstract public function revokeToken();
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Do-nothing authentication implementation, use this if you want to make un-authenticated calls
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
class apiAuthNone extends apiAuth {
|
||||
public $key = null;
|
||||
|
||||
public function __construct() {
|
||||
global $apiConfig;
|
||||
if (!empty($apiConfig['developer_key'])) {
|
||||
$this->setDeveloperKey($apiConfig['developer_key']);
|
||||
}
|
||||
}
|
||||
|
||||
public function setDeveloperKey($key) {$this->key = $key;}
|
||||
public function authenticate($service) {/*noop*/}
|
||||
public function setAccessToken($accessToken) {/* noop*/}
|
||||
public function getAccessToken() {return null;}
|
||||
public function createAuthUrl($scope) {return null;}
|
||||
public function refreshToken($refreshToken) {/* noop*/}
|
||||
public function revokeToken() {/* noop*/}
|
||||
|
||||
public function sign(apiHttpRequest $request) {
|
||||
if ($this->key) {
|
||||
$request->setUrl($request->getUrl() . ((strpos($request->getUrl(), '?') === false) ? '?' : '&')
|
||||
. 'key='.urlencode($this->key));
|
||||
}
|
||||
return $request;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class to hold information about an authenticated login.
|
||||
*
|
||||
* @author Brian Eaton <beaton@google.com>
|
||||
*/
|
||||
class apiLoginTicket {
|
||||
const USER_ATTR = "id";
|
||||
|
||||
// Information from id token envelope.
|
||||
private $envelope;
|
||||
|
||||
// Information from id token payload.
|
||||
private $payload;
|
||||
|
||||
/**
|
||||
* Creates a user based on the supplied token.
|
||||
*
|
||||
* envelope: header from a verified authentication token.
|
||||
* payload: information from a verified authentication token.
|
||||
*/
|
||||
public function __construct($envelope, $payload) {
|
||||
$this->envelope = $envelope;
|
||||
$this->payload = $payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the numeric identifier for the user.
|
||||
*/
|
||||
public function getUserId() {
|
||||
if (array_key_exists(self::USER_ATTR, $this->payload)) {
|
||||
return $this->payload[self::USER_ATTR];
|
||||
}
|
||||
throw new apiAuthException("No user_id in token");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns attributes from the login ticket. This can contain
|
||||
* various information about the user session.
|
||||
*/
|
||||
public function getAttributes() {
|
||||
return array("envelope" => $this->envelope, "payload" => $this->payload);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,250 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2008 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "external/OAuth.php";
|
||||
|
||||
/**
|
||||
* Authentication class that deals with 3-Legged OAuth 1.0a authentication
|
||||
*
|
||||
* This class uses the OAuth 1.0a spec which has a slightly different work flow in
|
||||
* how callback urls, request & access tokens are dealt with to prevent a possible
|
||||
* man in the middle attack.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*
|
||||
*/
|
||||
class apiOAuth extends apiAuth {
|
||||
public $cacheKey;
|
||||
protected $consumerToken;
|
||||
protected $accessToken;
|
||||
protected $privateKeyFile;
|
||||
protected $developerKey;
|
||||
public $service;
|
||||
|
||||
/**
|
||||
* Instantiates the class, but does not initiate the login flow, leaving it
|
||||
* to the discretion of the caller.
|
||||
*/
|
||||
public function __construct() {
|
||||
global $apiConfig;
|
||||
if (!empty($apiConfig['developer_key'])) {
|
||||
$this->setDeveloperKey($apiConfig['developer_key']);
|
||||
}
|
||||
$this->consumerToken = new apiClientOAuthConsumer($apiConfig['oauth_consumer_key'], $apiConfig['oauth_consumer_secret'], NULL);
|
||||
$this->signatureMethod = new apiClientOAuthSignatureMethod_HMAC_SHA1();
|
||||
$this->cacheKey = 'OAuth:' . $apiConfig['oauth_consumer_key']; // Scope data to the local user as well, or else multiple local users will share the same OAuth credentials.
|
||||
}
|
||||
|
||||
/**
|
||||
* The 3 legged oauth class needs a way to store the access key and token
|
||||
* it uses the apiCache class to do so.
|
||||
*
|
||||
* Constructing this class will initiate the 3 legged oauth work flow, including redirecting
|
||||
* to the OAuth provider's site if required(!)
|
||||
*
|
||||
* @param string $consumerKey
|
||||
* @param string $consumerSecret
|
||||
* @return apiOAuth3Legged the logged-in provider instance
|
||||
*/
|
||||
public function authenticate($service) {
|
||||
global $apiConfig;
|
||||
$this->service = $service;
|
||||
$this->service['authorization_token_url'] .= '?scope=' . apiClientOAuthUtil::urlencodeRFC3986($service['scope']) . '&domain=' . apiClientOAuthUtil::urlencodeRFC3986($apiConfig['site_name']) . '&oauth_token=';
|
||||
if (isset($_GET['oauth_verifier']) && isset($_GET['oauth_token']) && isset($_GET['uid'])) {
|
||||
$uid = $_GET['uid'];
|
||||
$secret = apiClient::$cache->get($this->cacheKey.":nonce:" . $uid);
|
||||
apiClient::$cache->delete($this->cacheKey.":nonce:" . $uid);
|
||||
$token = $this->upgradeRequestToken($_GET['oauth_token'], $secret, $_GET['oauth_verifier']);
|
||||
return json_encode($token);
|
||||
} else {
|
||||
// Initialize the OAuth dance, first request a request token, then kick the client to the authorize URL
|
||||
// First we store the current URL in our cache, so that when the oauth dance is completed we can return there
|
||||
$callbackUrl = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
$uid = uniqid();
|
||||
$token = $this->obtainRequestToken($callbackUrl, $uid);
|
||||
apiClient::$cache->set($this->cacheKey.":nonce:" . $uid, $token->secret);
|
||||
$this->redirectToAuthorization($token);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the internal oauth access token (which is returned by the authenticate function), a user should only
|
||||
* go through the authenticate() flow once (which involces a bunch of browser redirections and authentication screens, not fun)
|
||||
* and every time the user comes back the access token from the authentication() flow should be re-used (it essentially never expires)
|
||||
* @param object $accessToken
|
||||
*/
|
||||
public function setAccessToken($accessToken) {
|
||||
$accessToken = json_decode($accessToken, true);
|
||||
if ($accessToken == null) {
|
||||
throw new apiAuthException("Could not json decode the access token");
|
||||
}
|
||||
if (! isset($accessToken['key']) || ! isset($accessToken['secret'])) {
|
||||
throw new apiAuthException("Invalid OAuth token, missing key and/or secret");
|
||||
}
|
||||
$this->accessToken = new apiClientOAuthConsumer($accessToken['key'], $accessToken['secret']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current access token
|
||||
*/
|
||||
public function getAccessToken() {
|
||||
return $this->accessToken;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the developer key to use, these are obtained through the API Console
|
||||
*/
|
||||
public function setDeveloperKey($developerKey) {
|
||||
$this->developerKey = $developerKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Upgrades an existing request token to an access token.
|
||||
*
|
||||
* @param apiCache $cache cache class to use (file,apc,memcache,mysql)
|
||||
* @param oauthVerifier
|
||||
*/
|
||||
public function upgradeRequestToken($requestToken, $requestTokenSecret, $oauthVerifier) {
|
||||
$ret = $this->requestAccessToken($requestToken, $requestTokenSecret, $oauthVerifier);
|
||||
$matches = array();
|
||||
@parse_str($ret, $matches);
|
||||
if (!isset($matches['oauth_token']) || !isset($matches['oauth_token_secret'])) {
|
||||
throw new apiAuthException("Error authorizing access key (result was: {$ret})");
|
||||
}
|
||||
// The token was upgraded to an access token, we can now continue to use it.
|
||||
$this->accessToken = new apiClientOAuthConsumer(apiClientOAuthUtil::urldecodeRFC3986($matches['oauth_token']), apiClientOAuthUtil::urldecodeRFC3986($matches['oauth_token_secret']));
|
||||
return $this->accessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the actual request to exchange an existing request token for an access token.
|
||||
*
|
||||
* @param string $requestToken the existing request token
|
||||
* @param string $requestTokenSecret the request token secret
|
||||
* @return array('http_code' => HTTP response code (200, 404, 401, etc), 'data' => the html document)
|
||||
*/
|
||||
protected function requestAccessToken($requestToken, $requestTokenSecret, $oauthVerifier) {
|
||||
$accessToken = new apiClientOAuthConsumer($requestToken, $requestTokenSecret);
|
||||
$accessRequest = apiClientOAuthRequest::from_consumer_and_token($this->consumerToken, $accessToken, "GET", $this->service['access_token_url'], array('oauth_verifier' => $oauthVerifier));
|
||||
$accessRequest->sign_request($this->signatureMethod, $this->consumerToken, $accessToken);
|
||||
$request = apiClient::$io->makeRequest(new apiHttpRequest($accessRequest));
|
||||
if ($request->getResponseHttpCode() != 200) {
|
||||
throw new apiAuthException("Could not fetch access token, http code: " . $request->getResponseHttpCode() . ', response body: '. $request->getResponseBody());
|
||||
}
|
||||
return $request->getResponseBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtains a request token from the specified provider.
|
||||
*/
|
||||
public function obtainRequestToken($callbackUrl, $uid) {
|
||||
$callbackParams = (strpos($_SERVER['REQUEST_URI'], '?') !== false ? '&' : '?') . 'uid=' . urlencode($uid);
|
||||
$ret = $this->requestRequestToken($callbackUrl . $callbackParams);
|
||||
$matches = array();
|
||||
preg_match('/oauth_token=(.*)&oauth_token_secret=(.*)&oauth_callback_confirmed=(.*)/', $ret, $matches);
|
||||
if (!is_array($matches) || count($matches) != 4) {
|
||||
throw new apiAuthException("Error retrieving request key ({$ret})");
|
||||
}
|
||||
return new apiClientOAuthToken(apiClientOAuthUtil::urldecodeRFC3986($matches[1]), apiClientOAuthUtil::urldecodeRFC3986($matches[2]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the actual request to obtain a request token.
|
||||
*
|
||||
* @return array('http_code' => HTTP response code (200, 404, 401, etc), 'data' => the html document)
|
||||
*/
|
||||
protected function requestRequestToken($callbackUrl) {
|
||||
$requestTokenRequest = apiClientOAuthRequest::from_consumer_and_token($this->consumerToken, NULL, "GET", $this->service['request_token_url'], array());
|
||||
$requestTokenRequest->set_parameter('scope', $this->service['scope']);
|
||||
$requestTokenRequest->set_parameter('oauth_callback', $callbackUrl);
|
||||
$requestTokenRequest->sign_request($this->signatureMethod, $this->consumerToken, NULL);
|
||||
$request = apiClient::$io->makeRequest(new apiHttpRequest($requestTokenRequest));
|
||||
if ($request->getResponseHttpCode() != 200) {
|
||||
throw new apiAuthException("Couldn't fetch request token, http code: " . $request->getResponseHttpCode() . ', response body: '. $request->getResponseBody());
|
||||
}
|
||||
return $request->getResponseBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect the uset to the (provider's) authorize page, if approved it should kick the user back to the call back URL
|
||||
* which hopefully means we'll end up in the constructor of this class again, but with oauth_continue=1 set
|
||||
*
|
||||
* @param OAuthToken $token the request token
|
||||
* @param string $callbackUrl the URL to return to post-authorization (passed to login site)
|
||||
*/
|
||||
public function redirectToAuthorization($token) {
|
||||
$authorizeRedirect = $this->service['authorization_token_url']. $token->key;
|
||||
header("Location: $authorizeRedirect");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign the request using OAuth. This uses the consumer token and key
|
||||
*
|
||||
* @param string $method the method (get/put/delete/post)
|
||||
* @param string $url the url to sign (http://site/social/rest/people/1/@me)
|
||||
* @param array $params the params that should be appended to the url (count=20 fields=foo, etc)
|
||||
* @param string $postBody for POST/PUT requests, the postBody is included in the signature
|
||||
* @return string the signed url
|
||||
*/
|
||||
public function sign(apiHttpRequest $request) {
|
||||
// add the developer key to the request before signing it
|
||||
if ($this->developerKey) {
|
||||
$request->setUrl($request->getUrl() . ((strpos($request->getUrl(), '?') === false) ? '?' : '&') . 'key='.urlencode($this->developerKey));
|
||||
}
|
||||
// and sign the request
|
||||
$oauthRequest = apiClientOAuthRequest::from_request($request->getMethod(), $request->getBaseUrl(), $request->getQueryParams());
|
||||
$params = $this->mergeParameters($request->getQueryParams());
|
||||
foreach ($params as $key => $val) {
|
||||
if (is_array($val)) {
|
||||
$val = implode(',', $val);
|
||||
}
|
||||
$oauthRequest->set_parameter($key, $val);
|
||||
}
|
||||
$oauthRequest->sign_request($this->signatureMethod, $this->consumerToken, $this->accessToken);
|
||||
$authHeaders = $oauthRequest->to_header();
|
||||
$headers = $request->getHeaders();
|
||||
$headers[] = $authHeaders;
|
||||
$request->setHeaders($headers);
|
||||
// and add the access token key to it (since it doesn't include the secret, it's still secure to store this in cache)
|
||||
$request->accessKey = $this->accessToken->key;
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges the supplied parameters with reasonable defaults for 2 legged oauth. User-supplied parameters
|
||||
* will have precedent over the defaults.
|
||||
*
|
||||
* @param array $params the user-supplied params that will be appended to the url
|
||||
* @return array the combined parameters
|
||||
*/
|
||||
protected function mergeParameters($params) {
|
||||
$defaults = array(
|
||||
'oauth_nonce' => md5(microtime() . mt_rand()),
|
||||
'oauth_version' => apiClientOAuthRequest::$version, 'oauth_timestamp' => time(),
|
||||
'oauth_consumer_key' => $this->consumerToken->key
|
||||
);
|
||||
if ($this->accessToken != null) {
|
||||
$params['oauth_token'] = $this->accessToken->key;
|
||||
}
|
||||
return array_merge($defaults, $params);
|
||||
}
|
||||
|
||||
public function createAuthUrl($scope) {return null;}
|
||||
public function refreshToken($refreshToken) {/* noop*/}
|
||||
public function revokeToken() {/* noop*/}
|
||||
}
|
||||
@@ -0,0 +1,394 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2008 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "apiVerifier.php";
|
||||
require_once "apiLoginTicket.php";
|
||||
require_once "service/apiUtils.php";
|
||||
|
||||
/**
|
||||
* Authentication class that deals with the OAuth 2 web-server authentication flow
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiOAuth2 extends apiAuth {
|
||||
public $clientId;
|
||||
public $clientSecret;
|
||||
public $developerKey;
|
||||
public $accessToken;
|
||||
public $redirectUri;
|
||||
public $state;
|
||||
public $accessType = 'offline';
|
||||
public $approvalPrompt = 'force';
|
||||
|
||||
const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke';
|
||||
const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token';
|
||||
const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth';
|
||||
const OAUTH2_FEDERATED_SIGNON_CERTS_URL = 'https://www.googleapis.com/oauth2/v1/certs';
|
||||
const CLOCK_SKEW_SECS = 300; // five minutes in seconds
|
||||
const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds
|
||||
const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds
|
||||
|
||||
/**
|
||||
* Instantiates the class, but does not initiate the login flow, leaving it
|
||||
* to the discretion of the caller (which is done by calling authenticate()).
|
||||
*/
|
||||
public function __construct() {
|
||||
global $apiConfig;
|
||||
|
||||
if (! empty($apiConfig['developer_key'])) {
|
||||
$this->developerKey = $apiConfig['developer_key'];
|
||||
}
|
||||
|
||||
if (! empty($apiConfig['oauth2_client_id'])) {
|
||||
$this->clientId = $apiConfig['oauth2_client_id'];
|
||||
}
|
||||
|
||||
if (! empty($apiConfig['oauth2_client_secret'])) {
|
||||
$this->clientSecret = $apiConfig['oauth2_client_secret'];
|
||||
}
|
||||
|
||||
if (! empty($apiConfig['oauth2_redirect_uri'])) {
|
||||
$this->redirectUri = $apiConfig['oauth2_redirect_uri'];
|
||||
}
|
||||
|
||||
if (! empty($apiConfig['oauth2_access_type'])) {
|
||||
$this->accessType = $apiConfig['oauth2_access_type'];
|
||||
}
|
||||
|
||||
if (! empty($apiConfig['oauth2_approval_prompt'])) {
|
||||
$this->approvalPrompt = $apiConfig['oauth2_approval_prompt'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $service
|
||||
* @return string
|
||||
* @throws apiAuthException
|
||||
*/
|
||||
public function authenticate($service) {
|
||||
if (isset($_GET['code'])) {
|
||||
// We got here from the redirect from a successful authorization grant, fetch the access token
|
||||
$request = apiClient::$io->makeRequest(new apiHttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), array(
|
||||
'code' => $_GET['code'],
|
||||
'grant_type' => 'authorization_code',
|
||||
'redirect_uri' => $this->redirectUri,
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret
|
||||
)));
|
||||
|
||||
if ($request->getResponseHttpCode() == 200) {
|
||||
$this->setAccessToken($request->getResponseBody());
|
||||
$this->accessToken['created'] = time();
|
||||
return $this->getAccessToken();
|
||||
} else {
|
||||
$response = $request->getResponseBody();
|
||||
$decodedResponse = json_decode($response, true);
|
||||
if ($decodedResponse != $response && $decodedResponse != null && $decodedResponse['error']) {
|
||||
$response = $decodedResponse['error'];
|
||||
}
|
||||
throw new apiAuthException("Error fetching OAuth2 access token, message: '$response'", $request->getResponseHttpCode());
|
||||
}
|
||||
}
|
||||
|
||||
$authUrl = $this->createAuthUrl($service['scope']);
|
||||
header('Location: ' . $authUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a URL to obtain user authorization.
|
||||
* The authorization endpoint allows the user to first
|
||||
* authenticate, and then grant/deny the access request.
|
||||
* @param string $scope The scope is expressed as a list of space-delimited strings.
|
||||
* @return string
|
||||
*/
|
||||
public function createAuthUrl($scope) {
|
||||
$params = array(
|
||||
'response_type=code',
|
||||
'redirect_uri=' . urlencode($this->redirectUri),
|
||||
'client_id=' . urlencode($this->clientId),
|
||||
'scope=' . urlencode($scope),
|
||||
'access_type=' . urlencode($this->accessType),
|
||||
'approval_prompt=' . urlencode($this->approvalPrompt)
|
||||
);
|
||||
|
||||
if (isset($this->state)) {
|
||||
$params[] = 'state=' . urlencode($this->state);
|
||||
}
|
||||
$params = implode('&', $params);
|
||||
return self::OAUTH2_AUTH_URL . "?$params";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $accessToken
|
||||
* @throws apiAuthException Thrown when $accessToken is invalid.
|
||||
*/
|
||||
public function setAccessToken($accessToken) {
|
||||
$accessToken = json_decode($accessToken, true);
|
||||
if ($accessToken == null) {
|
||||
throw new apiAuthException('Could not json decode the access token');
|
||||
}
|
||||
if (! isset($accessToken['access_token'])) {
|
||||
throw new apiAuthException("Invalid token format");
|
||||
}
|
||||
$this->accessToken = $accessToken;
|
||||
}
|
||||
|
||||
public function getAccessToken() {
|
||||
return json_encode($this->accessToken);
|
||||
}
|
||||
|
||||
public function setDeveloperKey($developerKey) {
|
||||
$this->developerKey = $developerKey;
|
||||
}
|
||||
|
||||
public function setState($state) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
public function setAccessType($accessType) {
|
||||
$this->accessType = $accessType;
|
||||
}
|
||||
|
||||
public function setApprovalPrompt($approvalPrompt) {
|
||||
$this->approvalPrompt = $approvalPrompt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Include an accessToken in a given apiHttpRequest.
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest
|
||||
* @throws apiAuthException
|
||||
*/
|
||||
public function sign(apiHttpRequest $request) {
|
||||
// add the developer key to the request before signing it
|
||||
if ($this->developerKey) {
|
||||
$requestUrl = $request->getUrl();
|
||||
$requestUrl .= (strpos($request->getUrl(), '?') === false) ? '?' : '&';
|
||||
$requestUrl .= 'key=' . urlencode($this->developerKey);
|
||||
$request->setUrl($requestUrl);
|
||||
}
|
||||
|
||||
// Cannot sign the request without an OAuth access token.
|
||||
if (null == $this->accessToken) {
|
||||
return $request;
|
||||
}
|
||||
|
||||
// If the token is set to expire in the next 30 seconds (or has already
|
||||
// expired), refresh it and set the new token.
|
||||
$expired = ($this->accessToken['created'] + ($this->accessToken['expires_in'] - 30)) < time();
|
||||
if ($expired) {
|
||||
if (! array_key_exists('refresh_token', $this->accessToken)) {
|
||||
throw new apiAuthException("The OAuth 2.0 access token has expired, "
|
||||
. "and a refresh token is not available. Refresh tokens are not "
|
||||
. "returned for responses that were auto-approved.");
|
||||
}
|
||||
$this->refreshToken($this->accessToken['refresh_token']);
|
||||
}
|
||||
|
||||
// Add the OAuth2 header to the request
|
||||
$request->setRequestHeaders(
|
||||
array('Authorization' => 'Bearer ' . $this->accessToken['access_token'])
|
||||
);
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches a fresh access token with the given refresh token.
|
||||
* @param string $refreshToken
|
||||
* @return void
|
||||
*/
|
||||
public function refreshToken($refreshToken) {
|
||||
|
||||
$params = array(
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret,
|
||||
'refresh_token' => $refreshToken,
|
||||
'grant_type' => 'refresh_token'
|
||||
);
|
||||
|
||||
$request = apiClient::$io->makeRequest(
|
||||
new apiHttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), $params));
|
||||
$code = $request->getResponseHttpCode();
|
||||
$body = $request->getResponseBody();
|
||||
|
||||
if ($code == 200) {
|
||||
$token = json_decode($body, true);
|
||||
if ($token == null) {
|
||||
throw new apiAuthException("Could not json decode the access token");
|
||||
}
|
||||
|
||||
if (! isset($token['access_token']) || ! isset($token['expires_in'])) {
|
||||
throw new apiAuthException("Invalid token format");
|
||||
}
|
||||
|
||||
$this->accessToken['access_token'] = $token['access_token'];
|
||||
$this->accessToken['expires_in'] = $token['expires_in'];
|
||||
$this->accessToken['created'] = time();
|
||||
} else {
|
||||
throw new apiAuthException("Error refreshing the OAuth2 token, message: '$body'", $code);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
||||
* token, if a token isn't provided.
|
||||
* @throws apiAuthException
|
||||
* @param string|null $token The token (access token or a refresh token) that should be revoked.
|
||||
* @return boolean Returns True if the revocation was successful, otherwise False.
|
||||
*/
|
||||
public function revokeToken($token = null) {
|
||||
if (!$token) {
|
||||
$token = $this->accessToken['access_token'];
|
||||
}
|
||||
$request = new apiHttpRequest(self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token");
|
||||
$response = apiClient::$io->makeRequest($request);
|
||||
$code = $response->getResponseHttpCode();
|
||||
if ($code == 200) {
|
||||
$this->accessToken = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Gets federated sign-on certificates to use for verifying identity tokens.
|
||||
// Returns certs as array structure, where keys are key ids, and values
|
||||
// are PEM encoded certificates.
|
||||
private function getFederatedSignOnCerts() {
|
||||
// This relies on makeRequest caching certificate responses.
|
||||
$request = apiClient::$io->makeRequest(new apiHttpRequest(
|
||||
self::OAUTH2_FEDERATED_SIGNON_CERTS_URL));
|
||||
if ($request->getResponseHttpCode() == 200) {
|
||||
$certs = json_decode($request->getResponseBody(), true);
|
||||
if ($certs) {
|
||||
return $certs;
|
||||
}
|
||||
}
|
||||
throw new apiAuthException(
|
||||
"Failed to retrieve verification certificates: '" .
|
||||
$request->getResponseBody() . "'.",
|
||||
$request->getResponseHttpCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies an id token and returns the authenticated apiLoginTicket.
|
||||
* Throws an exception if the id token is not valid.
|
||||
* The audience parameter can be used to control which id tokens are
|
||||
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
||||
*
|
||||
* @param $id_token
|
||||
* @param $audience
|
||||
* @return apiLoginTicket
|
||||
*/
|
||||
public function verifyIdToken($id_token = null, $audience = null) {
|
||||
if (!$id_token) {
|
||||
$id_token = $this->accessToken['id_token'];
|
||||
}
|
||||
|
||||
$certs = $this->getFederatedSignonCerts();
|
||||
if (!$audience) {
|
||||
$audience = $this->clientId;
|
||||
}
|
||||
return $this->verifySignedJwtWithCerts($id_token, $certs, $audience);
|
||||
}
|
||||
|
||||
// Verifies the id token, returns the verified token contents.
|
||||
// Visible for testing.
|
||||
function verifySignedJwtWithCerts($jwt, $certs, $required_audience) {
|
||||
$segments = explode(".", $jwt);
|
||||
if (count($segments) != 3) {
|
||||
throw new apiAuthException("Wrong number of segments in token: $jwt");
|
||||
}
|
||||
$signed = $segments[0] . "." . $segments[1];
|
||||
$signature = apiUtils::urlSafeB64Decode($segments[2]);
|
||||
|
||||
// Parse envelope.
|
||||
$envelope = json_decode(apiUtils::urlSafeB64Decode($segments[0]), true);
|
||||
if (!$envelope) {
|
||||
throw new apiAuthException("Can't parse token envelope: " . $segments[0]);
|
||||
}
|
||||
|
||||
// Parse token
|
||||
$json_body = apiUtils::urlSafeB64Decode($segments[1]);
|
||||
$payload = json_decode($json_body, true);
|
||||
if (!$payload) {
|
||||
throw new apiAuthException("Can't parse token payload: " . $segments[1]);
|
||||
}
|
||||
|
||||
// Check signature
|
||||
$verified = false;
|
||||
foreach ($certs as $keyName => $pem) {
|
||||
$public_key = new apiPemVerifier($pem);
|
||||
if ($public_key->verify($signed, $signature)) {
|
||||
$verified = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$verified) {
|
||||
throw new apiAuthException("Invalid token signature: $jwt");
|
||||
}
|
||||
|
||||
// Check issued-at timestamp
|
||||
$iat = 0;
|
||||
if (array_key_exists("iat", $payload)) {
|
||||
$iat = $payload["iat"];
|
||||
}
|
||||
if (!$iat) {
|
||||
throw new apiAuthException("No issue time in token: $json_body");
|
||||
}
|
||||
$earliest = $iat - self::CLOCK_SKEW_SECS;
|
||||
|
||||
// Check expiration timestamp
|
||||
$now = time();
|
||||
$exp = 0;
|
||||
if (array_key_exists("exp", $payload)) {
|
||||
$exp = $payload["exp"];
|
||||
}
|
||||
if (!$exp) {
|
||||
throw new apiAuthException("No expiration time in token: $json_body");
|
||||
}
|
||||
if ($exp >= $now + self::MAX_TOKEN_LIFETIME_SECS) {
|
||||
throw new apiAuthException(
|
||||
"Expiration time too far in future: $json_body");
|
||||
}
|
||||
|
||||
$latest = $exp + self::CLOCK_SKEW_SECS;
|
||||
if ($now < $earliest) {
|
||||
throw new apiAuthException(
|
||||
"Token used too early, $now < $earliest: $json_body");
|
||||
}
|
||||
if ($now > $latest) {
|
||||
throw new apiAuthException(
|
||||
"Token used too late, $now > $latest: $json_body");
|
||||
}
|
||||
|
||||
// TODO(beaton): check issuer field?
|
||||
|
||||
// Check audience
|
||||
$aud = $payload["aud"];
|
||||
if ($aud != $required_audience) {
|
||||
throw new apiAuthException("Wrong recipient, $aud != $required_audience: $json_body");
|
||||
}
|
||||
|
||||
// All good.
|
||||
return new apiLoginTicket($envelope, $payload);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Signs data.
|
||||
*
|
||||
* Only used for testing.
|
||||
*
|
||||
* @author Brian Eaton <beaton@google.com>
|
||||
*/
|
||||
class apiP12Signer extends apiSigner {
|
||||
// OpenSSL private key resource
|
||||
private $privateKey;
|
||||
|
||||
// Creates a new signer from a .p12 file.
|
||||
function __construct($p12file, $password) {
|
||||
if (!function_exists('openssl_x509_read')) {
|
||||
throw new Exception(
|
||||
'The Google PHP API library needs the openssl PHP extension');
|
||||
}
|
||||
// This throws on error
|
||||
$p12 = file_get_contents($p12file);
|
||||
$certs = array();
|
||||
if (!openssl_pkcs12_read($p12, $certs, $password)) {
|
||||
throw new apiAuthException("Unable to parse $p12file. " .
|
||||
"Is this a .p12 file? Is the password correct? OpenSSL error: " .
|
||||
openssl_error_string());
|
||||
}
|
||||
// TODO(beaton): is this part of the contract for the openssl_pkcs12_read
|
||||
// method? What happens if there are multiple private keys? Do we care?
|
||||
if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) {
|
||||
throw new apiAuthException("No private key found in p12 file $p12file");
|
||||
}
|
||||
$this->privateKey = openssl_pkey_get_private($certs["pkey"]);
|
||||
if (!$this->privateKey) {
|
||||
throw new apiAuthException("Unable to load private key in $p12file");
|
||||
}
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
if ($this->privateKey) {
|
||||
openssl_pkey_free($this->privateKey);
|
||||
}
|
||||
}
|
||||
|
||||
function sign($data) {
|
||||
if (!openssl_sign($data, $signature, $this->privateKey, "sha256")) {
|
||||
throw new apiAuthException("Unable to sign data");
|
||||
}
|
||||
return $signature;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Verifies signatures using PEM encoded certificates.
|
||||
*
|
||||
* @author Brian Eaton <beaton@google.com>
|
||||
*/
|
||||
class apiPemVerifier extends apiVerifier {
|
||||
private $publicKey;
|
||||
|
||||
/**
|
||||
* Constructs a verifier from the supplied PEM-encoded certificate.
|
||||
*
|
||||
* $pem: a PEM encoded certificate (not a file).
|
||||
*/
|
||||
function __construct($pem) {
|
||||
if (!function_exists('openssl_x509_read')) {
|
||||
throw new Exception(
|
||||
'The Google PHP API library needs the openssl PHP extension');
|
||||
}
|
||||
$this->publicKey = openssl_x509_read($pem);
|
||||
if (!$this->publicKey) {
|
||||
throw new apiAuthException("Unable to parse PEM: $pem");
|
||||
}
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
if ($this->publicKey) {
|
||||
openssl_x509_free($this->publicKey);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the signature on data.
|
||||
*
|
||||
* Returns true if the signature is valid, false otherwise.
|
||||
*/
|
||||
function verify($data, $signature) {
|
||||
$status = openssl_verify($data, $signature, $this->publicKey, "sha256");
|
||||
if ($status === -1) {
|
||||
throw new apiAuthException("Signature verification error: " .
|
||||
openssl_error_string());
|
||||
}
|
||||
return $status === 1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "apiP12Signer.php";
|
||||
|
||||
/**
|
||||
* Signs data.
|
||||
*
|
||||
* @author Brian Eaton <beaton@google.com>
|
||||
*/
|
||||
abstract class apiSigner {
|
||||
/**
|
||||
* Signs data, returns the signature as binary data.
|
||||
*/
|
||||
abstract public function sign($data);
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "apiPemVerifier.php";
|
||||
|
||||
/**
|
||||
* Verifies signatures.
|
||||
*
|
||||
* @author Brian Eaton <beaton@google.com>
|
||||
*/
|
||||
abstract class apiVerifier {
|
||||
/**
|
||||
* Checks a signature, returns true if the signature is correct,
|
||||
* false otherwise.
|
||||
*/
|
||||
abstract public function verify($data, $signature);
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A persistent storage class based on the APC cache, which is not
|
||||
* really very persistent, as soon as you restart your web server
|
||||
* the storage will be wiped, however for debugging and/or speed
|
||||
* it can be useful, kinda, and cache is a lot cheaper then storage.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
class apiApcCache extends apiCache {
|
||||
|
||||
public function __construct() {
|
||||
if (! function_exists('apc_add')) {
|
||||
throw new apiCacheException("Apc functions not available");
|
||||
}
|
||||
}
|
||||
|
||||
private function isLocked($key) {
|
||||
if ((@apc_fetch($key . '.lock')) === false) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private function createLock($key) {
|
||||
// the interesting thing is that this could fail if the lock was created in the meantime..
|
||||
// but we'll ignore that out of convenience
|
||||
@apc_add($key . '.lock', '', 5);
|
||||
}
|
||||
|
||||
private function removeLock($key) {
|
||||
// suppress all warnings, if some other process removed it that's ok too
|
||||
@apc_delete($key . '.lock');
|
||||
}
|
||||
|
||||
private function waitForLock($key) {
|
||||
// 20 x 250 = 5 seconds
|
||||
$tries = 20;
|
||||
$cnt = 0;
|
||||
do {
|
||||
// 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks..
|
||||
usleep(250);
|
||||
$cnt ++;
|
||||
} while ($cnt <= $tries && $this->isLocked($key));
|
||||
if ($this->isLocked($key)) {
|
||||
// 5 seconds passed, assume the owning process died off and remove it
|
||||
$this->removeLock($key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function get($key, $expiration = false) {
|
||||
|
||||
if (($ret = @apc_fetch($key)) === false) {
|
||||
return false;
|
||||
}
|
||||
if (!$expiration || (time() - $ret['time'] > $expiration)) {
|
||||
$this->delete($key);
|
||||
return false;
|
||||
}
|
||||
return unserialize($ret['data']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function set($key, $value) {
|
||||
if (@apc_store($key, array('time' => time(), 'data' => serialize($value))) == false) {
|
||||
throw new apiCacheException("Couldn't store data");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function delete($key) {
|
||||
@apc_delete($key);
|
||||
}
|
||||
}
|
||||
Vendored
+56
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2008 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "apiFileCache.php";
|
||||
require_once "apiApcCache.php";
|
||||
require_once "apiMemcacheCache.php";
|
||||
|
||||
/**
|
||||
* Abstract storage class
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
abstract class apiCache {
|
||||
|
||||
/**
|
||||
* Retrieves the data for the given key, or false if they
|
||||
* key is unknown or expired
|
||||
*
|
||||
* @param String $key The key who's data to retrieve
|
||||
* @param boolean|int $expiration Expiration time in seconds
|
||||
*
|
||||
*/
|
||||
abstract function get($key, $expiration = false);
|
||||
|
||||
/**
|
||||
* Store the key => $value set. The $value is serialized
|
||||
* by this function so can be of any type
|
||||
*
|
||||
* @param String $key Key of the data
|
||||
* @param $value the data
|
||||
*/
|
||||
abstract function set($key, $value);
|
||||
|
||||
/**
|
||||
* Removes the key/data pair for the given $key
|
||||
*
|
||||
* @param String $key
|
||||
*/
|
||||
abstract function delete($key);
|
||||
}
|
||||
|
||||
|
||||
+135
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2008 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This class implements a basic on disk storage. While that does
|
||||
* work quite well it's not the most elegant and scalable solution.
|
||||
* It will also get you into a heap of trouble when you try to run
|
||||
* this in a clustered environment. In those cases please use the
|
||||
* MySql back-end
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
class apiFileCache extends apiCache {
|
||||
private $path;
|
||||
|
||||
public function __construct() {
|
||||
global $apiConfig;
|
||||
$this->path = $apiConfig['ioFileCache_directory'];
|
||||
}
|
||||
|
||||
private function isLocked($storageFile) {
|
||||
// our lock file convention is simple: /the/file/path.lock
|
||||
return file_exists($storageFile . '.lock');
|
||||
}
|
||||
|
||||
private function createLock($storageFile) {
|
||||
$storageDir = dirname($storageFile);
|
||||
if (! is_dir($storageDir)) {
|
||||
if (! @mkdir($storageDir, 0755, true)) {
|
||||
// make sure the failure isn't because of a concurrency issue
|
||||
if (! is_dir($storageDir)) {
|
||||
throw new apiCacheException("Could not create storage directory: $storageDir");
|
||||
}
|
||||
}
|
||||
}
|
||||
@touch($storageFile . '.lock');
|
||||
}
|
||||
|
||||
private function removeLock($storageFile) {
|
||||
// suppress all warnings, if some other process removed it that's ok too
|
||||
@unlink($storageFile . '.lock');
|
||||
}
|
||||
|
||||
private function waitForLock($storageFile) {
|
||||
// 20 x 250 = 5 seconds
|
||||
$tries = 20;
|
||||
$cnt = 0;
|
||||
do {
|
||||
// make sure PHP picks up on file changes. This is an expensive action but really can't be avoided
|
||||
clearstatcache();
|
||||
// 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks..
|
||||
usleep(250);
|
||||
$cnt ++;
|
||||
} while ($cnt <= $tries && $this->isLocked($storageFile));
|
||||
if ($this->isLocked($storageFile)) {
|
||||
// 5 seconds passed, assume the owning process died off and remove it
|
||||
$this->removeLock($storageFile);
|
||||
}
|
||||
}
|
||||
|
||||
private function getCacheDir($hash) {
|
||||
// use the first 2 characters of the hash as a directory prefix
|
||||
// this should prevent slowdowns due to huge directory listings
|
||||
// and thus give some basic amount of scalability
|
||||
return $this->path . '/' . substr($hash, 0, 2);
|
||||
}
|
||||
|
||||
private function getCacheFile($hash) {
|
||||
return $this->getCacheDir($hash) . '/' . $hash;
|
||||
}
|
||||
|
||||
public function get($key, $expiration = false) {
|
||||
$storageFile = $this->getCacheFile(md5($key));
|
||||
// See if this storage file is locked, if so we wait upto 5 seconds for the lock owning process to
|
||||
// complete it's work. If the lock is not released within that time frame, it's cleaned up.
|
||||
// This should give us a fair amount of 'Cache Stampeding' protection
|
||||
if ($this->isLocked($storageFile)) {
|
||||
$this->waitForLock($storageFile);
|
||||
}
|
||||
if (file_exists($storageFile) && is_readable($storageFile)) {
|
||||
$now = time();
|
||||
if (! $expiration || (($mtime = @filemtime($storageFile)) !== false && ($now - $mtime) < $expiration)) {
|
||||
if (($data = @file_get_contents($storageFile)) !== false) {
|
||||
$data = unserialize($data);
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function set($key, $value) {
|
||||
$storageDir = $this->getCacheDir(md5($key));
|
||||
$storageFile = $this->getCacheFile(md5($key));
|
||||
if ($this->isLocked($storageFile)) {
|
||||
// some other process is writing to this file too, wait until it's done to prevent hickups
|
||||
$this->waitForLock($storageFile);
|
||||
}
|
||||
if (! is_dir($storageDir)) {
|
||||
if (! @mkdir($storageDir, 0755, true)) {
|
||||
throw new apiCacheException("Could not create storage directory: $storageDir");
|
||||
}
|
||||
}
|
||||
// we serialize the whole request object, since we don't only want the
|
||||
// responseContent but also the postBody used, headers, size, etc
|
||||
$data = serialize($value);
|
||||
$this->createLock($storageFile);
|
||||
if (! @file_put_contents($storageFile, $data)) {
|
||||
$this->removeLock($storageFile);
|
||||
throw new apiCacheException("Could not store data in the file");
|
||||
}
|
||||
$this->removeLock($storageFile);
|
||||
}
|
||||
|
||||
public function delete($key) {
|
||||
$file = $this->getCacheFile(md5($key));
|
||||
if (! @unlink($file)) {
|
||||
throw new apiCacheException("Cache file could not be deleted");
|
||||
}
|
||||
}
|
||||
}
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2008 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A persistent storage class based on the memcache, which is not
|
||||
* really very persistent, as soon as you restart your memcache daemon
|
||||
* the storage will be wiped, however for debugging and/or speed
|
||||
* it can be useful, kinda, and cache is a lot cheaper then storage.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
class apiMemcacheCache extends apiCache {
|
||||
private $connection = false;
|
||||
|
||||
public function __construct() {
|
||||
global $apiConfig;
|
||||
if (! function_exists('memcache_connect')) {
|
||||
throw new apiCacheException("Memcache functions not available");
|
||||
}
|
||||
$this->host = $apiConfig['ioMemCacheCache_host'];
|
||||
$this->port = $apiConfig['ioMemCacheCache_port'];
|
||||
if (empty($this->host) || empty($this->port)) {
|
||||
throw new apiCacheException("You need to supply a valid memcache host and port");
|
||||
}
|
||||
}
|
||||
|
||||
private function isLocked($key) {
|
||||
$this->check();
|
||||
if ((@memcache_get($this->connection, $key . '.lock')) === false) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private function createLock($key) {
|
||||
$this->check();
|
||||
// the interesting thing is that this could fail if the lock was created in the meantime..
|
||||
// but we'll ignore that out of convenience
|
||||
@memcache_add($this->connection, $key . '.lock', '', 0, 5);
|
||||
}
|
||||
|
||||
private function removeLock($key) {
|
||||
$this->check();
|
||||
// suppress all warnings, if some other process removed it that's ok too
|
||||
@memcache_delete($this->connection, $key . '.lock');
|
||||
}
|
||||
|
||||
private function waitForLock($key) {
|
||||
$this->check();
|
||||
// 20 x 250 = 5 seconds
|
||||
$tries = 20;
|
||||
$cnt = 0;
|
||||
do {
|
||||
// 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks..
|
||||
usleep(250);
|
||||
$cnt ++;
|
||||
} while ($cnt <= $tries && $this->isLocked($key));
|
||||
if ($this->isLocked($key)) {
|
||||
// 5 seconds passed, assume the owning process died off and remove it
|
||||
$this->removeLock($key);
|
||||
}
|
||||
}
|
||||
|
||||
// I prefer lazy initialization since the cache isn't used every request
|
||||
// so this potentially saves a lot of overhead
|
||||
private function connect() {
|
||||
if (! $this->connection = @memcache_pconnect($this->host, $this->port)) {
|
||||
throw new apiCacheException("Couldn't connect to memcache server");
|
||||
}
|
||||
}
|
||||
|
||||
private function check() {
|
||||
if (! $this->connection) {
|
||||
$this->connect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function get($key, $expiration = false) {
|
||||
$this->check();
|
||||
if (($ret = @memcache_get($this->connection, $key)) === false) {
|
||||
return false;
|
||||
}
|
||||
if (! $expiration || (time() - $ret['time'] > $expiration)) {
|
||||
$this->delete($key);
|
||||
return false;
|
||||
}
|
||||
return $ret['data'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function set($key, $value) {
|
||||
$this->check();
|
||||
// we store it with the cache_time default expiration so objects will at least get cleaned eventually.
|
||||
if (@memcache_set($this->connection, $key, array('time' => time(),
|
||||
'data' => $value), false) == false) {
|
||||
throw new apiCacheException("Couldn't store data in cache");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function delete($key) {
|
||||
$this->check();
|
||||
@memcache_delete($this->connection, $key);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
global $apiConfig;
|
||||
$apiConfig = array(
|
||||
// True if objects should be returned by the service classes.
|
||||
// False if associative arrays should be returned (default behavior).
|
||||
'use_objects' => false,
|
||||
|
||||
// The application_name is included in the User-Agent HTTP header.
|
||||
'application_name' => '',
|
||||
|
||||
// OAuth2 Settings, you can get these keys at https://code.google.com/apis/console
|
||||
'oauth2_client_id' => '',
|
||||
'oauth2_client_secret' => '',
|
||||
'oauth2_redirect_uri' => '',
|
||||
|
||||
// The developer key, you get this at https://code.google.com/apis/console
|
||||
'developer_key' => '',
|
||||
|
||||
// OAuth1 Settings.
|
||||
// If you're using the apiOAuth auth class, it will use these values for the oauth consumer key and secret.
|
||||
// See http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html for info on how to obtain those
|
||||
'oauth_consumer_key' => 'anonymous',
|
||||
'oauth_consumer_secret' => 'anonymous',
|
||||
|
||||
// Site name to show in the Google's OAuth 1 authentication screen.
|
||||
'site_name' => 'www.example.org',
|
||||
|
||||
// Which Authentication, Storage and HTTP IO classes to use.
|
||||
'authClass' => 'apiOAuth2',
|
||||
'ioClass' => 'apiCurlIO',
|
||||
'cacheClass' => 'apiFileCache',
|
||||
|
||||
// If you want to run the test suite (by running # phpunit AllTests.php in the tests/ directory), fill in the settings below
|
||||
'oauth_test_token' => '', // the oauth access token to use (which you can get by runing authenticate() as the test user and copying the token value), ie '{"key":"foo","secret":"bar","callback_url":null}'
|
||||
'oauth_test_user' => '', // and the user ID to use, this can either be a vanity name 'testuser' or a numberic ID '123456'
|
||||
|
||||
// Don't change these unless you're working against a special development or testing environment.
|
||||
'basePath' => 'https://www.googleapis.com',
|
||||
|
||||
// IO Class dependent configuration, you only have to configure the values for the class that was configured as the ioClass above
|
||||
'ioFileCache_directory' =>
|
||||
(function_exists('sys_get_temp_dir') ?
|
||||
sys_get_temp_dir() . '/apiClient' :
|
||||
'/tmp/apiClient'),
|
||||
'ioMemCacheStorage_host' => '127.0.0.1',
|
||||
'ioMemcacheStorage_port' => '11211',
|
||||
|
||||
// Definition of service specific values like scopes, oauth token URLs, etc
|
||||
'services' => array(
|
||||
'analytics' => array('scope' => 'https://www.googleapis.com/auth/analytics.readonly'),
|
||||
'calendar' => array(
|
||||
'scope' => array(
|
||||
"https://www.googleapis.com/auth/calendar",
|
||||
"https://www.googleapis.com/auth/calendar.readonly",
|
||||
)
|
||||
),
|
||||
'books' => array('scope' => 'https://www.googleapis.com/auth/books'),
|
||||
'latitude' => array(
|
||||
'scope' => array(
|
||||
'https://www.googleapis.com/auth/latitude.all.best',
|
||||
'https://www.googleapis.com/auth/latitude.all.city',
|
||||
)
|
||||
),
|
||||
'moderator' => array('scope' => 'https://www.googleapis.com/auth/moderator'),
|
||||
'oauth2' => array(
|
||||
'scope' => array(
|
||||
'https://www.googleapis.com/auth/userinfo.profile',
|
||||
'https://www.googleapis.com/auth/userinfo.email',
|
||||
)
|
||||
),
|
||||
'plus' => array('scope' => 'https://www.googleapis.com/auth/plus.me'),
|
||||
'siteVerification' => array('scope' => 'https://www.googleapis.com/auth/siteverification'),
|
||||
'tasks' => array('scope' => 'https://www.googleapis.com/auth/tasks'),
|
||||
'urlshortener' => array('scope' => 'https://www.googleapis.com/auth/urlshortener')
|
||||
)
|
||||
);
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,488 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "cse" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $customsearchService = new apiCustomsearchService(...);
|
||||
* $cse = $customsearchService->cse;
|
||||
* </code>
|
||||
*/
|
||||
class CseServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Returns metadata about the search performed, metadata about the custom search engine used for the
|
||||
* search, and the search results. (cse.list)
|
||||
*
|
||||
* @param string $q Query
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string sort The sort expression to apply to the results
|
||||
* @opt_param string num Number of search results to return
|
||||
* @opt_param string googlehost The local Google domain to use to perform the search.
|
||||
* @opt_param string safe Search safety level
|
||||
* @opt_param string filter Controls turning on or off the duplicate content filter.
|
||||
* @opt_param string start The index of the first result to return
|
||||
* @opt_param string cx The custom search engine ID to scope this search query
|
||||
* @opt_param string lr The language restriction for the search results
|
||||
* @opt_param string cr Country restrict(s).
|
||||
* @opt_param string gl Geolocation of end user.
|
||||
* @opt_param string cref The URL of a linked custom search engine
|
||||
* @return Search
|
||||
*/
|
||||
public function listCse($q, $optParams = array()) {
|
||||
$params = array('q' => $q);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Search($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Customsearch (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you search over a website or collection of websites
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/customsearch/v1/using_rest.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiCustomsearchService extends apiService {
|
||||
public $cse;
|
||||
/**
|
||||
* Constructs the internal representation of the Customsearch service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/customsearch/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'customsearch';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->cse = new CseServiceResource($this, $this->serviceName, 'cse', json_decode('{"methods": {"list": {"parameters": {"sort": {"type": "string", "location": "query"}, "filter": {"enum": ["0", "1"], "type": "string", "location": "query"}, "cx": {"type": "string", "location": "query"}, "googlehost": {"type": "string", "location": "query"}, "safe": {"default": "off", "enum": ["high", "medium", "off"], "location": "query", "type": "string"}, "q": {"required": true, "type": "string", "location": "query"}, "start": {"type": "string", "location": "query"}, "num": {"default": "10", "type": "string", "location": "query"}, "lr": {"enum": ["lang_ar", "lang_bg", "lang_ca", "lang_cs", "lang_da", "lang_de", "lang_el", "lang_en", "lang_es", "lang_et", "lang_fi", "lang_fr", "lang_hr", "lang_hu", "lang_id", "lang_is", "lang_it", "lang_iw", "lang_ja", "lang_ko", "lang_lt", "lang_lv", "lang_nl", "lang_no", "lang_pl", "lang_pt", "lang_ro", "lang_ru", "lang_sk", "lang_sl", "lang_sr", "lang_sv", "lang_tr", "lang_zh-CN", "lang_zh-TW"], "type": "string", "location": "query"}, "cr": {"type": "string", "location": "query"}, "gl": {"type": "string", "location": "query"}, "cref": {"type": "string", "location": "query"}}, "id": "search.cse.list", "httpMethod": "GET", "path": "v1", "response": {"$ref": "Search"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Context extends apiModel {
|
||||
protected $__facetsType = 'ContextFacets';
|
||||
protected $__facetsDataType = 'array';
|
||||
public $facets;
|
||||
public $title;
|
||||
public function setFacets(/* array(ContextFacets) */ $facets) {
|
||||
$this->assertIsArray($facets, 'ContextFacets', __METHOD__);
|
||||
$this->facets = $facets;
|
||||
}
|
||||
public function getFacets() {
|
||||
return $this->facets;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
}
|
||||
|
||||
class ContextFacets extends apiModel {
|
||||
public $anchor;
|
||||
public $label;
|
||||
public function setAnchor($anchor) {
|
||||
$this->anchor = $anchor;
|
||||
}
|
||||
public function getAnchor() {
|
||||
return $this->anchor;
|
||||
}
|
||||
public function setLabel($label) {
|
||||
$this->label = $label;
|
||||
}
|
||||
public function getLabel() {
|
||||
return $this->label;
|
||||
}
|
||||
}
|
||||
|
||||
class Promotion extends apiModel {
|
||||
public $link;
|
||||
public $displayLink;
|
||||
protected $__imageType = 'PromotionImage';
|
||||
protected $__imageDataType = '';
|
||||
public $image;
|
||||
protected $__bodyLinesType = 'PromotionBodyLines';
|
||||
protected $__bodyLinesDataType = 'array';
|
||||
public $bodyLines;
|
||||
public $title;
|
||||
public function setLink($link) {
|
||||
$this->link = $link;
|
||||
}
|
||||
public function getLink() {
|
||||
return $this->link;
|
||||
}
|
||||
public function setDisplayLink($displayLink) {
|
||||
$this->displayLink = $displayLink;
|
||||
}
|
||||
public function getDisplayLink() {
|
||||
return $this->displayLink;
|
||||
}
|
||||
public function setImage(PromotionImage $image) {
|
||||
$this->image = $image;
|
||||
}
|
||||
public function getImage() {
|
||||
return $this->image;
|
||||
}
|
||||
public function setBodyLines(/* array(PromotionBodyLines) */ $bodyLines) {
|
||||
$this->assertIsArray($bodyLines, 'PromotionBodyLines', __METHOD__);
|
||||
$this->bodyLines = $bodyLines;
|
||||
}
|
||||
public function getBodyLines() {
|
||||
return $this->bodyLines;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
}
|
||||
|
||||
class PromotionBodyLines extends apiModel {
|
||||
public $url;
|
||||
public $link;
|
||||
public $title;
|
||||
public function setUrl($url) {
|
||||
$this->url = $url;
|
||||
}
|
||||
public function getUrl() {
|
||||
return $this->url;
|
||||
}
|
||||
public function setLink($link) {
|
||||
$this->link = $link;
|
||||
}
|
||||
public function getLink() {
|
||||
return $this->link;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
}
|
||||
|
||||
class PromotionImage extends apiModel {
|
||||
public $source;
|
||||
public $width;
|
||||
public $height;
|
||||
public function setSource($source) {
|
||||
$this->source = $source;
|
||||
}
|
||||
public function getSource() {
|
||||
return $this->source;
|
||||
}
|
||||
public function setWidth($width) {
|
||||
$this->width = $width;
|
||||
}
|
||||
public function getWidth() {
|
||||
return $this->width;
|
||||
}
|
||||
public function setHeight($height) {
|
||||
$this->height = $height;
|
||||
}
|
||||
public function getHeight() {
|
||||
return $this->height;
|
||||
}
|
||||
}
|
||||
|
||||
class Query extends apiModel {
|
||||
public $count;
|
||||
public $sort;
|
||||
public $outputEncoding;
|
||||
public $language;
|
||||
public $title;
|
||||
public $googleHost;
|
||||
public $safe;
|
||||
public $searchTerms;
|
||||
public $filter;
|
||||
public $startIndex;
|
||||
public $cx;
|
||||
public $startPage;
|
||||
public $inputEncoding;
|
||||
public $cr;
|
||||
public $gl;
|
||||
public $totalResults;
|
||||
public $cref;
|
||||
public function setCount($count) {
|
||||
$this->count = $count;
|
||||
}
|
||||
public function getCount() {
|
||||
return $this->count;
|
||||
}
|
||||
public function setSort($sort) {
|
||||
$this->sort = $sort;
|
||||
}
|
||||
public function getSort() {
|
||||
return $this->sort;
|
||||
}
|
||||
public function setOutputEncoding($outputEncoding) {
|
||||
$this->outputEncoding = $outputEncoding;
|
||||
}
|
||||
public function getOutputEncoding() {
|
||||
return $this->outputEncoding;
|
||||
}
|
||||
public function setLanguage($language) {
|
||||
$this->language = $language;
|
||||
}
|
||||
public function getLanguage() {
|
||||
return $this->language;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
public function setGoogleHost($googleHost) {
|
||||
$this->googleHost = $googleHost;
|
||||
}
|
||||
public function getGoogleHost() {
|
||||
return $this->googleHost;
|
||||
}
|
||||
public function setSafe($safe) {
|
||||
$this->safe = $safe;
|
||||
}
|
||||
public function getSafe() {
|
||||
return $this->safe;
|
||||
}
|
||||
public function setSearchTerms($searchTerms) {
|
||||
$this->searchTerms = $searchTerms;
|
||||
}
|
||||
public function getSearchTerms() {
|
||||
return $this->searchTerms;
|
||||
}
|
||||
public function setFilter($filter) {
|
||||
$this->filter = $filter;
|
||||
}
|
||||
public function getFilter() {
|
||||
return $this->filter;
|
||||
}
|
||||
public function setStartIndex($startIndex) {
|
||||
$this->startIndex = $startIndex;
|
||||
}
|
||||
public function getStartIndex() {
|
||||
return $this->startIndex;
|
||||
}
|
||||
public function setCx($cx) {
|
||||
$this->cx = $cx;
|
||||
}
|
||||
public function getCx() {
|
||||
return $this->cx;
|
||||
}
|
||||
public function setStartPage($startPage) {
|
||||
$this->startPage = $startPage;
|
||||
}
|
||||
public function getStartPage() {
|
||||
return $this->startPage;
|
||||
}
|
||||
public function setInputEncoding($inputEncoding) {
|
||||
$this->inputEncoding = $inputEncoding;
|
||||
}
|
||||
public function getInputEncoding() {
|
||||
return $this->inputEncoding;
|
||||
}
|
||||
public function setCr($cr) {
|
||||
$this->cr = $cr;
|
||||
}
|
||||
public function getCr() {
|
||||
return $this->cr;
|
||||
}
|
||||
public function setGl($gl) {
|
||||
$this->gl = $gl;
|
||||
}
|
||||
public function getGl() {
|
||||
return $this->gl;
|
||||
}
|
||||
public function setTotalResults($totalResults) {
|
||||
$this->totalResults = $totalResults;
|
||||
}
|
||||
public function getTotalResults() {
|
||||
return $this->totalResults;
|
||||
}
|
||||
public function setCref($cref) {
|
||||
$this->cref = $cref;
|
||||
}
|
||||
public function getCref() {
|
||||
return $this->cref;
|
||||
}
|
||||
}
|
||||
|
||||
class Result extends apiModel {
|
||||
public $kind;
|
||||
public $title;
|
||||
public $displayLink;
|
||||
public $cacheId;
|
||||
public $pagemap;
|
||||
public $snippet;
|
||||
public $htmlSnippet;
|
||||
public $link;
|
||||
public $htmlTitle;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
public function setDisplayLink($displayLink) {
|
||||
$this->displayLink = $displayLink;
|
||||
}
|
||||
public function getDisplayLink() {
|
||||
return $this->displayLink;
|
||||
}
|
||||
public function setCacheId($cacheId) {
|
||||
$this->cacheId = $cacheId;
|
||||
}
|
||||
public function getCacheId() {
|
||||
return $this->cacheId;
|
||||
}
|
||||
public function setPagemap($pagemap) {
|
||||
$this->pagemap = $pagemap;
|
||||
}
|
||||
public function getPagemap() {
|
||||
return $this->pagemap;
|
||||
}
|
||||
public function setSnippet($snippet) {
|
||||
$this->snippet = $snippet;
|
||||
}
|
||||
public function getSnippet() {
|
||||
return $this->snippet;
|
||||
}
|
||||
public function setHtmlSnippet($htmlSnippet) {
|
||||
$this->htmlSnippet = $htmlSnippet;
|
||||
}
|
||||
public function getHtmlSnippet() {
|
||||
return $this->htmlSnippet;
|
||||
}
|
||||
public function setLink($link) {
|
||||
$this->link = $link;
|
||||
}
|
||||
public function getLink() {
|
||||
return $this->link;
|
||||
}
|
||||
public function setHtmlTitle($htmlTitle) {
|
||||
$this->htmlTitle = $htmlTitle;
|
||||
}
|
||||
public function getHtmlTitle() {
|
||||
return $this->htmlTitle;
|
||||
}
|
||||
}
|
||||
|
||||
class Search extends apiModel {
|
||||
protected $__promotionsType = 'Promotion';
|
||||
protected $__promotionsDataType = 'array';
|
||||
public $promotions;
|
||||
public $kind;
|
||||
protected $__urlType = 'SearchUrl';
|
||||
protected $__urlDataType = '';
|
||||
public $url;
|
||||
protected $__itemsType = 'Result';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
protected $__contextType = 'Context';
|
||||
protected $__contextDataType = '';
|
||||
public $context;
|
||||
protected $__queriesType = 'Query';
|
||||
protected $__queriesDataType = 'map';
|
||||
public $queries;
|
||||
public function setPromotions(/* array(Promotion) */ $promotions) {
|
||||
$this->assertIsArray($promotions, 'Promotion', __METHOD__);
|
||||
$this->promotions = $promotions;
|
||||
}
|
||||
public function getPromotions() {
|
||||
return $this->promotions;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setUrl(SearchUrl $url) {
|
||||
$this->url = $url;
|
||||
}
|
||||
public function getUrl() {
|
||||
return $this->url;
|
||||
}
|
||||
public function setItems(/* array(Result) */ $items) {
|
||||
$this->assertIsArray($items, 'Result', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setContext(Context $context) {
|
||||
$this->context = $context;
|
||||
}
|
||||
public function getContext() {
|
||||
return $this->context;
|
||||
}
|
||||
public function setQueries(Query $queries) {
|
||||
$this->queries = $queries;
|
||||
}
|
||||
public function getQueries() {
|
||||
return $this->queries;
|
||||
}
|
||||
}
|
||||
|
||||
class SearchUrl extends apiModel {
|
||||
public $type;
|
||||
public $template;
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function setTemplate($template) {
|
||||
$this->template = $template;
|
||||
}
|
||||
public function getTemplate() {
|
||||
return $this->template;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "text" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $freebaseService = new apiFreebaseService(...);
|
||||
* $text = $freebaseService->text;
|
||||
* </code>
|
||||
*/
|
||||
class TextServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Returns blob attached to node at specified id as HTML (text.get)
|
||||
*
|
||||
* @param string $id The id of the item that you want data about
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string maxlength The max number of characters to return. Valid only for 'plain' format.
|
||||
* @opt_param string format Sanitizing transformation.
|
||||
* @return ContentserviceGet
|
||||
*/
|
||||
public function get($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new ContentserviceGet($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The "mqlread" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $freebaseService = new apiFreebaseService(...);
|
||||
* $mqlread = $freebaseService->mqlread;
|
||||
* </code>
|
||||
*/
|
||||
class MqlreadServiceResource extends apiServiceResource {
|
||||
/**
|
||||
* Performs MQL Queries. (mqlread.mqlread)
|
||||
*
|
||||
* @param string $query An envelope containing a single MQL query.
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string lang The language of the results - an id of a /type/lang object.
|
||||
* @opt_param bool html_escape Whether or not to escape entities.
|
||||
* @opt_param string indent How many spaces to indent the json.
|
||||
* @opt_param string uniqueness_failure How MQL responds to uniqueness failures.
|
||||
* @opt_param string dateline The dateline that you get in a mqlwrite response to ensure consistent results.
|
||||
* @opt_param string cursor The mql cursor.
|
||||
* @opt_param string callback JS method name for JSONP callbacks.
|
||||
* @opt_param bool cost Show the costs or not.
|
||||
* @opt_param string as_of_time Run the query as it would've been run at the specified point in time.
|
||||
*/
|
||||
public function mqlread($query, $optParams = array()) {
|
||||
$params = array('query' => $query);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('mqlread', array($params));
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* The "image" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $freebaseService = new apiFreebaseService(...);
|
||||
* $image = $freebaseService->image;
|
||||
* </code>
|
||||
*/
|
||||
class ImageServiceResource extends apiServiceResource {
|
||||
/**
|
||||
* Returns the scaled/cropped image attached to a freebase node. (image.image)
|
||||
*
|
||||
* @param string $id Freebase entity or content id, mid, or guid.
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string maxwidth Maximum width in pixels for resulting image.
|
||||
* @opt_param string maxheight Maximum height in pixels for resulting image.
|
||||
* @opt_param string fallbackid Use the image associated with this secondary id if no image is associated with the primary id.
|
||||
* @opt_param bool pad A boolean specifying whether the resulting image should be padded up to the requested dimensions.
|
||||
* @opt_param string mode Method used to scale or crop image.
|
||||
*/
|
||||
public function image($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('image', array($params));
|
||||
return $data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Freebase (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you access the Freebase repository of open data.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://wiki.freebase.com/wiki/New_Freebase_API" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiFreebaseService extends apiService {
|
||||
public $mqlread;
|
||||
public $image;
|
||||
public $text;
|
||||
/**
|
||||
* Constructs the internal representation of the Freebase service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/freebase/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'freebase';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->text = new TextServiceResource($this, $this->serviceName, 'text', json_decode('{"methods": {"get": {"parameters": {"format": {"default": "plain", "enum": ["html", "plain", "raw"], "location": "query", "type": "string"}, "id": {"repeated": true, "required": true, "type": "string", "location": "path"}, "maxlength": {"format": "uint32", "type": "integer", "location": "query"}}, "id": "freebase.text.get", "httpMethod": "GET", "path": "text{/id*}", "response": {"$ref": "ContentserviceGet"}}}}', true));
|
||||
$this->mqlread = new MqlreadServiceResource($this, $this->serviceName, 'mqlread', json_decode('{"httpMethod": "GET", "parameters": {"lang": {"default": "/lang/en", "type": "string", "location": "query"}, "cursor": {"type": "string", "location": "query"}, "indent": {"format": "uint32", "default": "0", "maximum": "10", "location": "query", "type": "integer"}, "uniqueness_failure": {"default": "hard", "enum": ["hard", "soft"], "location": "query", "type": "string"}, "dateline": {"type": "string", "location": "query"}, "html_escape": {"default": "true", "type": "boolean", "location": "query"}, "callback": {"type": "string", "location": "query"}, "cost": {"default": "false", "type": "boolean", "location": "query"}, "query": {"required": true, "type": "string", "location": "query"}, "as_of_time": {"type": "string", "location": "query"}}, "path": "mqlread", "id": "freebase.mqlread"}', true));
|
||||
$this->image = new ImageServiceResource($this, $this->serviceName, 'image', json_decode('{"httpMethod": "GET", "parameters": {"maxwidth": {"format": "uint32", "type": "integer", "location": "query", "maximum": "4096"}, "maxheight": {"format": "uint32", "type": "integer", "location": "query", "maximum": "4096"}, "fallbackid": {"default": "/freebase/no_image_png", "type": "string", "location": "query"}, "pad": {"default": "false", "type": "boolean", "location": "query"}, "mode": {"default": "fit", "enum": ["fill", "fillcrop", "fillcropmid", "fit"], "location": "query", "type": "string"}, "id": {"repeated": true, "required": true, "type": "string", "location": "path"}}, "path": "image{/id*}", "id": "freebase.image"}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class ContentserviceGet extends apiModel {
|
||||
public $result;
|
||||
public function setResult($result) {
|
||||
$this->result = $result;
|
||||
}
|
||||
public function getResult() {
|
||||
return $this->result;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,287 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "currentLocation" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $latitudeService = new apiLatitudeService(...);
|
||||
* $currentLocation = $latitudeService->currentLocation;
|
||||
* </code>
|
||||
*/
|
||||
class CurrentLocationServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Updates or creates the user's current location. (currentLocation.insert)
|
||||
*
|
||||
* @param Location $postBody
|
||||
* @return Location
|
||||
*/
|
||||
public function insert(Location $postBody, $optParams = array()) {
|
||||
$params = array('postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Location($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the authenticated user's current location. (currentLocation.get)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string granularity Granularity of the requested location.
|
||||
* @return Location
|
||||
*/
|
||||
public function get($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Location($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deletes the authenticated user's current location. (currentLocation.delete)
|
||||
*
|
||||
*/
|
||||
public function delete($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The "location" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $latitudeService = new apiLatitudeService(...);
|
||||
* $location = $latitudeService->location;
|
||||
* </code>
|
||||
*/
|
||||
class LocationServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Inserts or updates a location in the user's location history. (location.insert)
|
||||
*
|
||||
* @param Location $postBody
|
||||
* @return Location
|
||||
*/
|
||||
public function insert(Location $postBody, $optParams = array()) {
|
||||
$params = array('postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Location($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Reads a location from the user's location history. (location.get)
|
||||
*
|
||||
* @param string $locationId Timestamp of the location to read (ms since epoch).
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string granularity Granularity of the location to return.
|
||||
* @return Location
|
||||
*/
|
||||
public function get($locationId, $optParams = array()) {
|
||||
$params = array('locationId' => $locationId);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Location($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Lists the user's location history. (location.list)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string max-results Maximum number of locations to return.
|
||||
* @opt_param string max-time Maximum timestamp of locations to return (ms since epoch).
|
||||
* @opt_param string min-time Minimum timestamp of locations to return (ms since epoch).
|
||||
* @opt_param string granularity Granularity of the requested locations.
|
||||
* @return LocationFeed
|
||||
*/
|
||||
public function listLocation($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new LocationFeed($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deletes a location from the user's location history. (location.delete)
|
||||
*
|
||||
* @param string $locationId Timestamp of the location to delete (ms since epoch).
|
||||
*/
|
||||
public function delete($locationId, $optParams = array()) {
|
||||
$params = array('locationId' => $locationId);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Latitude (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you read and update your current location and work with your location history
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/latitude/v1/using_rest.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiLatitudeService extends apiService {
|
||||
public $currentLocation;
|
||||
public $location;
|
||||
/**
|
||||
* Constructs the internal representation of the Latitude service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/latitude/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'latitude';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->currentLocation = new CurrentLocationServiceResource($this, $this->serviceName, 'currentLocation', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"], "request": {"$ref": "LatitudeCurrentlocationResourceJson"}, "response": {"$ref": "LatitudeCurrentlocationResourceJson"}, "httpMethod": "POST", "path": "currentLocation", "id": "latitude.currentLocation.insert"}, "delete": {"id": "latitude.currentLocation.delete", "path": "currentLocation", "httpMethod": "DELETE", "scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"]}, "get": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city", "https://www.googleapis.com/auth/latitude.current.best", "https://www.googleapis.com/auth/latitude.current.city"], "parameters": {"granularity": {"type": "string", "location": "query"}}, "response": {"$ref": "LatitudeCurrentlocationResourceJson"}, "httpMethod": "GET", "path": "currentLocation", "id": "latitude.currentLocation.get"}}}', true));
|
||||
$this->location = new LocationServiceResource($this, $this->serviceName, 'location', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "request": {"$ref": "Location"}, "response": {"$ref": "Location"}, "httpMethod": "POST", "path": "location", "id": "latitude.location.insert"}, "delete": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"locationId": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "location/{locationId}", "id": "latitude.location.delete"}, "list": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"max-results": {"type": "string", "location": "query"}, "max-time": {"type": "string", "location": "query"}, "min-time": {"type": "string", "location": "query"}, "granularity": {"type": "string", "location": "query"}}, "response": {"$ref": "LocationFeed"}, "httpMethod": "GET", "path": "location", "id": "latitude.location.list"}, "get": {"scopes": ["https://www.googleapis.com/auth/latitude.all.best", "https://www.googleapis.com/auth/latitude.all.city"], "parameters": {"locationId": {"required": true, "type": "string", "location": "path"}, "granularity": {"type": "string", "location": "query"}}, "id": "latitude.location.get", "httpMethod": "GET", "path": "location/{locationId}", "response": {"$ref": "Location"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Location extends apiModel {
|
||||
public $kind;
|
||||
public $altitude;
|
||||
public $longitude;
|
||||
public $activityId;
|
||||
public $latitude;
|
||||
public $altitudeAccuracy;
|
||||
public $timestampMs;
|
||||
public $speed;
|
||||
public $heading;
|
||||
public $accuracy;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setAltitude($altitude) {
|
||||
$this->altitude = $altitude;
|
||||
}
|
||||
public function getAltitude() {
|
||||
return $this->altitude;
|
||||
}
|
||||
public function setLongitude($longitude) {
|
||||
$this->longitude = $longitude;
|
||||
}
|
||||
public function getLongitude() {
|
||||
return $this->longitude;
|
||||
}
|
||||
public function setActivityId($activityId) {
|
||||
$this->activityId = $activityId;
|
||||
}
|
||||
public function getActivityId() {
|
||||
return $this->activityId;
|
||||
}
|
||||
public function setLatitude($latitude) {
|
||||
$this->latitude = $latitude;
|
||||
}
|
||||
public function getLatitude() {
|
||||
return $this->latitude;
|
||||
}
|
||||
public function setAltitudeAccuracy($altitudeAccuracy) {
|
||||
$this->altitudeAccuracy = $altitudeAccuracy;
|
||||
}
|
||||
public function getAltitudeAccuracy() {
|
||||
return $this->altitudeAccuracy;
|
||||
}
|
||||
public function setTimestampMs($timestampMs) {
|
||||
$this->timestampMs = $timestampMs;
|
||||
}
|
||||
public function getTimestampMs() {
|
||||
return $this->timestampMs;
|
||||
}
|
||||
public function setSpeed($speed) {
|
||||
$this->speed = $speed;
|
||||
}
|
||||
public function getSpeed() {
|
||||
return $this->speed;
|
||||
}
|
||||
public function setHeading($heading) {
|
||||
$this->heading = $heading;
|
||||
}
|
||||
public function getHeading() {
|
||||
return $this->heading;
|
||||
}
|
||||
public function setAccuracy($accuracy) {
|
||||
$this->accuracy = $accuracy;
|
||||
}
|
||||
public function getAccuracy() {
|
||||
return $this->accuracy;
|
||||
}
|
||||
}
|
||||
|
||||
class LocationFeed extends apiModel {
|
||||
protected $__itemsType = 'Location';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public $kind;
|
||||
public function setItems(/* array(Location) */ $items) {
|
||||
$this->assertIsArray($items, 'Location', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,307 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "userinfo" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $oauth2Service = new apiOauth2Service(...);
|
||||
* $userinfo = $oauth2Service->userinfo;
|
||||
* </code>
|
||||
*/
|
||||
class UserinfoServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* (userinfo.get)
|
||||
*
|
||||
* @return Userinfo
|
||||
*/
|
||||
public function get($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Userinfo($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The "v2" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $oauth2Service = new apiOauth2Service(...);
|
||||
* $v2 = $oauth2Service->v2;
|
||||
* </code>
|
||||
*/
|
||||
class UserinfoV2ServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The "me" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $oauth2Service = new apiOauth2Service(...);
|
||||
* $me = $oauth2Service->me;
|
||||
* </code>
|
||||
*/
|
||||
class UserinfoV2MeServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* (me.get)
|
||||
*
|
||||
* @return Userinfo
|
||||
*/
|
||||
public function get($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Userinfo($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The "tokeninfo" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $oauth2Service = new apiOauth2Service(...);
|
||||
* $tokeninfo = $oauth2Service->tokeninfo;
|
||||
* </code>
|
||||
*/
|
||||
class TokeninfoServiceResource extends apiServiceResource {
|
||||
/**
|
||||
* (tokeninfo.tokeninfo)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string access_token
|
||||
* @opt_param string id_token
|
||||
* @return Tokeninfo
|
||||
*/
|
||||
public function tokeninfo($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('tokeninfo', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Tokeninfo($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Oauth2 (v2).
|
||||
*
|
||||
* <p>
|
||||
* OAuth2 API
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiOauth2Service extends apiService {
|
||||
public $tokeninfo;
|
||||
public $userinfo;
|
||||
public $userinfo_v2;
|
||||
/**
|
||||
* Constructs the internal representation of the Oauth2 service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/';
|
||||
$this->version = 'v2';
|
||||
$this->serviceName = 'oauth2';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->userinfo = new UserinfoServiceResource($this, $this->serviceName, 'userinfo', json_decode('{"methods": {"get": {"path": "oauth2/v2/userinfo", "response": {"$ref": "Userinfo"}, "httpMethod": "GET", "id": "oauth2.userinfo.get"}}}', true));
|
||||
$this->userinfo_v2 = new UserinfoV2ServiceResource($this, $this->serviceName, 'v2', json_decode('{}', true));
|
||||
$this->tokeninfo = new TokeninfoServiceResource($this, $this->serviceName, 'tokeninfo', json_decode('{"id": "oauth2.tokeninfo", "path": "oauth2/v2/tokeninfo", "response": {"$ref": "Tokeninfo"}, "parameters": {"access_token": {"type": "string", "location": "query"}, "id_token": {"type": "string", "location": "query"}}, "httpMethod": "GET"}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Tokeninfo extends apiModel {
|
||||
public $issued_to;
|
||||
public $user_id;
|
||||
public $expires_in;
|
||||
public $access_type;
|
||||
public $audience;
|
||||
public $scope;
|
||||
public $email;
|
||||
public $verified_email;
|
||||
public function setIssued_to($issued_to) {
|
||||
$this->issued_to = $issued_to;
|
||||
}
|
||||
public function getIssued_to() {
|
||||
return $this->issued_to;
|
||||
}
|
||||
public function setUser_id($user_id) {
|
||||
$this->user_id = $user_id;
|
||||
}
|
||||
public function getUser_id() {
|
||||
return $this->user_id;
|
||||
}
|
||||
public function setExpires_in($expires_in) {
|
||||
$this->expires_in = $expires_in;
|
||||
}
|
||||
public function getExpires_in() {
|
||||
return $this->expires_in;
|
||||
}
|
||||
public function setAccess_type($access_type) {
|
||||
$this->access_type = $access_type;
|
||||
}
|
||||
public function getAccess_type() {
|
||||
return $this->access_type;
|
||||
}
|
||||
public function setAudience($audience) {
|
||||
$this->audience = $audience;
|
||||
}
|
||||
public function getAudience() {
|
||||
return $this->audience;
|
||||
}
|
||||
public function setScope($scope) {
|
||||
$this->scope = $scope;
|
||||
}
|
||||
public function getScope() {
|
||||
return $this->scope;
|
||||
}
|
||||
public function setEmail($email) {
|
||||
$this->email = $email;
|
||||
}
|
||||
public function getEmail() {
|
||||
return $this->email;
|
||||
}
|
||||
public function setVerified_email($verified_email) {
|
||||
$this->verified_email = $verified_email;
|
||||
}
|
||||
public function getVerified_email() {
|
||||
return $this->verified_email;
|
||||
}
|
||||
}
|
||||
|
||||
class Userinfo extends apiModel {
|
||||
public $family_name;
|
||||
public $name;
|
||||
public $picture;
|
||||
public $locale;
|
||||
public $gender;
|
||||
public $email;
|
||||
public $birthday;
|
||||
public $link;
|
||||
public $given_name;
|
||||
public $timezone;
|
||||
public $id;
|
||||
public $verified_email;
|
||||
public function setFamily_name($family_name) {
|
||||
$this->family_name = $family_name;
|
||||
}
|
||||
public function getFamily_name() {
|
||||
return $this->family_name;
|
||||
}
|
||||
public function setName($name) {
|
||||
$this->name = $name;
|
||||
}
|
||||
public function getName() {
|
||||
return $this->name;
|
||||
}
|
||||
public function setPicture($picture) {
|
||||
$this->picture = $picture;
|
||||
}
|
||||
public function getPicture() {
|
||||
return $this->picture;
|
||||
}
|
||||
public function setLocale($locale) {
|
||||
$this->locale = $locale;
|
||||
}
|
||||
public function getLocale() {
|
||||
return $this->locale;
|
||||
}
|
||||
public function setGender($gender) {
|
||||
$this->gender = $gender;
|
||||
}
|
||||
public function getGender() {
|
||||
return $this->gender;
|
||||
}
|
||||
public function setEmail($email) {
|
||||
$this->email = $email;
|
||||
}
|
||||
public function getEmail() {
|
||||
return $this->email;
|
||||
}
|
||||
public function setBirthday($birthday) {
|
||||
$this->birthday = $birthday;
|
||||
}
|
||||
public function getBirthday() {
|
||||
return $this->birthday;
|
||||
}
|
||||
public function setLink($link) {
|
||||
$this->link = $link;
|
||||
}
|
||||
public function getLink() {
|
||||
return $this->link;
|
||||
}
|
||||
public function setGiven_name($given_name) {
|
||||
$this->given_name = $given_name;
|
||||
}
|
||||
public function getGiven_name() {
|
||||
return $this->given_name;
|
||||
}
|
||||
public function setTimezone($timezone) {
|
||||
$this->timezone = $timezone;
|
||||
}
|
||||
public function getTimezone() {
|
||||
return $this->timezone;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setVerified_email($verified_email) {
|
||||
$this->verified_email = $verified_email;
|
||||
}
|
||||
public function getVerified_email() {
|
||||
return $this->verified_email;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,482 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "pagespeedapi" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $pagespeedonlineService = new apiPagespeedonlineService(...);
|
||||
* $pagespeedapi = $pagespeedonlineService->pagespeedapi;
|
||||
* </code>
|
||||
*/
|
||||
class PagespeedapiServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Runs Page Speed analysis on the page at the specified URL, and returns a Page Speed score, a list
|
||||
* of suggestions to make that page faster, and other information. (pagespeedapi.runpagespeed)
|
||||
*
|
||||
* @param string $url The URL to fetch and analyze
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string locale The locale used to localize formatted results
|
||||
* @opt_param string rule A Page Speed rule to run; if none are given, all rules are run
|
||||
* @opt_param string strategy The analysis strategy to use
|
||||
* @return Result
|
||||
*/
|
||||
public function runpagespeed($url, $optParams = array()) {
|
||||
$params = array('url' => $url);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('runpagespeed', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Result($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Pagespeedonline (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="https://code.google.com/apis/pagespeedonline/v1/getting_started.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiPagespeedonlineService extends apiService {
|
||||
public $pagespeedapi;
|
||||
/**
|
||||
* Constructs the internal representation of the Pagespeedonline service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/pagespeedonline/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'pagespeedonline';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->pagespeedapi = new PagespeedapiServiceResource($this, $this->serviceName, 'pagespeedapi', json_decode('{"methods": {"runpagespeed": {"parameters": {"locale": {"type": "string", "location": "query"}, "url": {"required": true, "type": "string", "location": "query"}, "rule": {"repeated": true, "type": "string", "location": "query"}, "strategy": {"enum": ["desktop", "mobile"], "type": "string", "location": "query"}}, "id": "pagespeedonline.pagespeedapi.runpagespeed", "httpMethod": "GET", "path": "runPagespeed", "response": {"$ref": "Result"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Result extends apiModel {
|
||||
public $kind;
|
||||
protected $__formattedResultsType = 'ResultFormattedResults';
|
||||
protected $__formattedResultsDataType = '';
|
||||
public $formattedResults;
|
||||
public $title;
|
||||
protected $__versionType = 'ResultVersion';
|
||||
protected $__versionDataType = '';
|
||||
public $version;
|
||||
public $score;
|
||||
public $responseCode;
|
||||
public $invalidRules;
|
||||
protected $__pageStatsType = 'ResultPageStats';
|
||||
protected $__pageStatsDataType = '';
|
||||
public $pageStats;
|
||||
public $id;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setFormattedResults(ResultFormattedResults $formattedResults) {
|
||||
$this->formattedResults = $formattedResults;
|
||||
}
|
||||
public function getFormattedResults() {
|
||||
return $this->formattedResults;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
public function setVersion(ResultVersion $version) {
|
||||
$this->version = $version;
|
||||
}
|
||||
public function getVersion() {
|
||||
return $this->version;
|
||||
}
|
||||
public function setScore($score) {
|
||||
$this->score = $score;
|
||||
}
|
||||
public function getScore() {
|
||||
return $this->score;
|
||||
}
|
||||
public function setResponseCode($responseCode) {
|
||||
$this->responseCode = $responseCode;
|
||||
}
|
||||
public function getResponseCode() {
|
||||
return $this->responseCode;
|
||||
}
|
||||
public function setInvalidRules(/* array(string) */ $invalidRules) {
|
||||
$this->assertIsArray($invalidRules, 'string', __METHOD__);
|
||||
$this->invalidRules = $invalidRules;
|
||||
}
|
||||
public function getInvalidRules() {
|
||||
return $this->invalidRules;
|
||||
}
|
||||
public function setPageStats(ResultPageStats $pageStats) {
|
||||
$this->pageStats = $pageStats;
|
||||
}
|
||||
public function getPageStats() {
|
||||
return $this->pageStats;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResults extends apiModel {
|
||||
public $locale;
|
||||
protected $__ruleResultsType = 'ResultFormattedResultsRuleResults';
|
||||
protected $__ruleResultsDataType = 'map';
|
||||
public $ruleResults;
|
||||
public function setLocale($locale) {
|
||||
$this->locale = $locale;
|
||||
}
|
||||
public function getLocale() {
|
||||
return $this->locale;
|
||||
}
|
||||
public function setRuleResults(ResultFormattedResultsRuleResults $ruleResults) {
|
||||
$this->ruleResults = $ruleResults;
|
||||
}
|
||||
public function getRuleResults() {
|
||||
return $this->ruleResults;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResults extends apiModel {
|
||||
public $localizedRuleName;
|
||||
protected $__urlBlocksType = 'ResultFormattedResultsRuleResultsUrlBlocks';
|
||||
protected $__urlBlocksDataType = 'array';
|
||||
public $urlBlocks;
|
||||
public $ruleScore;
|
||||
public $ruleImpact;
|
||||
public function setLocalizedRuleName($localizedRuleName) {
|
||||
$this->localizedRuleName = $localizedRuleName;
|
||||
}
|
||||
public function getLocalizedRuleName() {
|
||||
return $this->localizedRuleName;
|
||||
}
|
||||
public function setUrlBlocks(/* array(ResultFormattedResultsRuleResultsUrlBlocks) */ $urlBlocks) {
|
||||
$this->assertIsArray($urlBlocks, 'ResultFormattedResultsRuleResultsUrlBlocks', __METHOD__);
|
||||
$this->urlBlocks = $urlBlocks;
|
||||
}
|
||||
public function getUrlBlocks() {
|
||||
return $this->urlBlocks;
|
||||
}
|
||||
public function setRuleScore($ruleScore) {
|
||||
$this->ruleScore = $ruleScore;
|
||||
}
|
||||
public function getRuleScore() {
|
||||
return $this->ruleScore;
|
||||
}
|
||||
public function setRuleImpact($ruleImpact) {
|
||||
$this->ruleImpact = $ruleImpact;
|
||||
}
|
||||
public function getRuleImpact() {
|
||||
return $this->ruleImpact;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocks extends apiModel {
|
||||
protected $__headerType = 'ResultFormattedResultsRuleResultsUrlBlocksHeader';
|
||||
protected $__headerDataType = '';
|
||||
public $header;
|
||||
protected $__urlsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrls';
|
||||
protected $__urlsDataType = 'array';
|
||||
public $urls;
|
||||
public function setHeader(ResultFormattedResultsRuleResultsUrlBlocksHeader $header) {
|
||||
$this->header = $header;
|
||||
}
|
||||
public function getHeader() {
|
||||
return $this->header;
|
||||
}
|
||||
public function setUrls(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrls) */ $urls) {
|
||||
$this->assertIsArray($urls, 'ResultFormattedResultsRuleResultsUrlBlocksUrls', __METHOD__);
|
||||
$this->urls = $urls;
|
||||
}
|
||||
public function getUrls() {
|
||||
return $this->urls;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksHeader extends apiModel {
|
||||
protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs';
|
||||
protected $__argsDataType = 'array';
|
||||
public $args;
|
||||
public $format;
|
||||
public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs) */ $args) {
|
||||
$this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs', __METHOD__);
|
||||
$this->args = $args;
|
||||
}
|
||||
public function getArgs() {
|
||||
return $this->args;
|
||||
}
|
||||
public function setFormat($format) {
|
||||
$this->format = $format;
|
||||
}
|
||||
public function getFormat() {
|
||||
return $this->format;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksHeaderArgs extends apiModel {
|
||||
public $type;
|
||||
public $value;
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function setValue($value) {
|
||||
$this->value = $value;
|
||||
}
|
||||
public function getValue() {
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksUrls extends apiModel {
|
||||
protected $__detailsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails';
|
||||
protected $__detailsDataType = 'array';
|
||||
public $details;
|
||||
protected $__resultType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResult';
|
||||
protected $__resultDataType = '';
|
||||
public $result;
|
||||
public function setDetails(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails) */ $details) {
|
||||
$this->assertIsArray($details, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails', __METHOD__);
|
||||
$this->details = $details;
|
||||
}
|
||||
public function getDetails() {
|
||||
return $this->details;
|
||||
}
|
||||
public function setResult(ResultFormattedResultsRuleResultsUrlBlocksUrlsResult $result) {
|
||||
$this->result = $result;
|
||||
}
|
||||
public function getResult() {
|
||||
return $this->result;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksUrlsDetails extends apiModel {
|
||||
protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs';
|
||||
protected $__argsDataType = 'array';
|
||||
public $args;
|
||||
public $format;
|
||||
public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs) */ $args) {
|
||||
$this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs', __METHOD__);
|
||||
$this->args = $args;
|
||||
}
|
||||
public function getArgs() {
|
||||
return $this->args;
|
||||
}
|
||||
public function setFormat($format) {
|
||||
$this->format = $format;
|
||||
}
|
||||
public function getFormat() {
|
||||
return $this->format;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksUrlsDetailsArgs extends apiModel {
|
||||
public $type;
|
||||
public $value;
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function setValue($value) {
|
||||
$this->value = $value;
|
||||
}
|
||||
public function getValue() {
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksUrlsResult extends apiModel {
|
||||
protected $__argsType = 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs';
|
||||
protected $__argsDataType = 'array';
|
||||
public $args;
|
||||
public $format;
|
||||
public function setArgs(/* array(ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs) */ $args) {
|
||||
$this->assertIsArray($args, 'ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs', __METHOD__);
|
||||
$this->args = $args;
|
||||
}
|
||||
public function getArgs() {
|
||||
return $this->args;
|
||||
}
|
||||
public function setFormat($format) {
|
||||
$this->format = $format;
|
||||
}
|
||||
public function getFormat() {
|
||||
return $this->format;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultFormattedResultsRuleResultsUrlBlocksUrlsResultArgs extends apiModel {
|
||||
public $type;
|
||||
public $value;
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function setValue($value) {
|
||||
$this->value = $value;
|
||||
}
|
||||
public function getValue() {
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultPageStats extends apiModel {
|
||||
public $otherResponseBytes;
|
||||
public $flashResponseBytes;
|
||||
public $totalRequestBytes;
|
||||
public $numberCssResources;
|
||||
public $numberResources;
|
||||
public $cssResponseBytes;
|
||||
public $javascriptResponseBytes;
|
||||
public $imageResponseBytes;
|
||||
public $numberHosts;
|
||||
public $numberStaticResources;
|
||||
public $htmlResponseBytes;
|
||||
public $numberJsResources;
|
||||
public $textResponseBytes;
|
||||
public function setOtherResponseBytes($otherResponseBytes) {
|
||||
$this->otherResponseBytes = $otherResponseBytes;
|
||||
}
|
||||
public function getOtherResponseBytes() {
|
||||
return $this->otherResponseBytes;
|
||||
}
|
||||
public function setFlashResponseBytes($flashResponseBytes) {
|
||||
$this->flashResponseBytes = $flashResponseBytes;
|
||||
}
|
||||
public function getFlashResponseBytes() {
|
||||
return $this->flashResponseBytes;
|
||||
}
|
||||
public function setTotalRequestBytes($totalRequestBytes) {
|
||||
$this->totalRequestBytes = $totalRequestBytes;
|
||||
}
|
||||
public function getTotalRequestBytes() {
|
||||
return $this->totalRequestBytes;
|
||||
}
|
||||
public function setNumberCssResources($numberCssResources) {
|
||||
$this->numberCssResources = $numberCssResources;
|
||||
}
|
||||
public function getNumberCssResources() {
|
||||
return $this->numberCssResources;
|
||||
}
|
||||
public function setNumberResources($numberResources) {
|
||||
$this->numberResources = $numberResources;
|
||||
}
|
||||
public function getNumberResources() {
|
||||
return $this->numberResources;
|
||||
}
|
||||
public function setCssResponseBytes($cssResponseBytes) {
|
||||
$this->cssResponseBytes = $cssResponseBytes;
|
||||
}
|
||||
public function getCssResponseBytes() {
|
||||
return $this->cssResponseBytes;
|
||||
}
|
||||
public function setJavascriptResponseBytes($javascriptResponseBytes) {
|
||||
$this->javascriptResponseBytes = $javascriptResponseBytes;
|
||||
}
|
||||
public function getJavascriptResponseBytes() {
|
||||
return $this->javascriptResponseBytes;
|
||||
}
|
||||
public function setImageResponseBytes($imageResponseBytes) {
|
||||
$this->imageResponseBytes = $imageResponseBytes;
|
||||
}
|
||||
public function getImageResponseBytes() {
|
||||
return $this->imageResponseBytes;
|
||||
}
|
||||
public function setNumberHosts($numberHosts) {
|
||||
$this->numberHosts = $numberHosts;
|
||||
}
|
||||
public function getNumberHosts() {
|
||||
return $this->numberHosts;
|
||||
}
|
||||
public function setNumberStaticResources($numberStaticResources) {
|
||||
$this->numberStaticResources = $numberStaticResources;
|
||||
}
|
||||
public function getNumberStaticResources() {
|
||||
return $this->numberStaticResources;
|
||||
}
|
||||
public function setHtmlResponseBytes($htmlResponseBytes) {
|
||||
$this->htmlResponseBytes = $htmlResponseBytes;
|
||||
}
|
||||
public function getHtmlResponseBytes() {
|
||||
return $this->htmlResponseBytes;
|
||||
}
|
||||
public function setNumberJsResources($numberJsResources) {
|
||||
$this->numberJsResources = $numberJsResources;
|
||||
}
|
||||
public function getNumberJsResources() {
|
||||
return $this->numberJsResources;
|
||||
}
|
||||
public function setTextResponseBytes($textResponseBytes) {
|
||||
$this->textResponseBytes = $textResponseBytes;
|
||||
}
|
||||
public function getTextResponseBytes() {
|
||||
return $this->textResponseBytes;
|
||||
}
|
||||
}
|
||||
|
||||
class ResultVersion extends apiModel {
|
||||
public $major;
|
||||
public $minor;
|
||||
public function setMajor($major) {
|
||||
$this->major = $major;
|
||||
}
|
||||
public function getMajor() {
|
||||
return $this->major;
|
||||
}
|
||||
public function setMinor($minor) {
|
||||
$this->minor = $minor;
|
||||
}
|
||||
public function getMinor() {
|
||||
return $this->minor;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,431 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "trainedmodels" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $predictionService = new apiPredictionService(...);
|
||||
* $trainedmodels = $predictionService->trainedmodels;
|
||||
* </code>
|
||||
*/
|
||||
class TrainedmodelsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Submit model id and request a prediction (trainedmodels.predict)
|
||||
*
|
||||
* @param string $id The unique name for the predictive model.
|
||||
* @param Input $postBody
|
||||
* @return Output
|
||||
*/
|
||||
public function predict($id, Input $postBody, $optParams = array()) {
|
||||
$params = array('id' => $id, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('predict', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Output($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Begin training your model. (trainedmodels.insert)
|
||||
*
|
||||
* @param Training $postBody
|
||||
* @return Training
|
||||
*/
|
||||
public function insert(Training $postBody, $optParams = array()) {
|
||||
$params = array('postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Training($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check training status of your model. (trainedmodels.get)
|
||||
*
|
||||
* @param string $id The unique name for the predictive model.
|
||||
* @return Training
|
||||
*/
|
||||
public function get($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Training($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Add new data to a trained model. (trainedmodels.update)
|
||||
*
|
||||
* @param string $id The unique name for the predictive model.
|
||||
* @param Update $postBody
|
||||
* @return Training
|
||||
*/
|
||||
public function update($id, Update $postBody, $optParams = array()) {
|
||||
$params = array('id' => $id, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('update', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Training($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Delete a trained model. (trainedmodels.delete)
|
||||
*
|
||||
* @param string $id The unique name for the predictive model.
|
||||
*/
|
||||
public function delete($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The "hostedmodels" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $predictionService = new apiPredictionService(...);
|
||||
* $hostedmodels = $predictionService->hostedmodels;
|
||||
* </code>
|
||||
*/
|
||||
class HostedmodelsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Submit input and request an output against a hosted model. (hostedmodels.predict)
|
||||
*
|
||||
* @param string $hostedModelName The name of a hosted model.
|
||||
* @param Input $postBody
|
||||
* @return Output
|
||||
*/
|
||||
public function predict($hostedModelName, Input $postBody, $optParams = array()) {
|
||||
$params = array('hostedModelName' => $hostedModelName, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('predict', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Output($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Prediction (v1.4).
|
||||
*
|
||||
* <p>
|
||||
* Lets you access a cloud hosted machine learning service that makes it easy to build smart apps
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/predict/docs/developer-guide.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiPredictionService extends apiService {
|
||||
public $trainedmodels;
|
||||
public $hostedmodels;
|
||||
/**
|
||||
* Constructs the internal representation of the Prediction service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/prediction/v1.4/';
|
||||
$this->version = 'v1.4';
|
||||
$this->serviceName = 'prediction';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->trainedmodels = new TrainedmodelsServiceResource($this, $this->serviceName, 'trainedmodels', json_decode('{"methods": {"predict": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Input"}, "id": "prediction.trainedmodels.predict", "httpMethod": "POST", "path": "trainedmodels/{id}/predict", "response": {"$ref": "Output"}}, "insert": {"scopes": ["https://www.googleapis.com/auth/prediction"], "request": {"$ref": "Training"}, "response": {"$ref": "Training"}, "httpMethod": "POST", "path": "trainedmodels", "id": "prediction.trainedmodels.insert"}, "delete": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "trainedmodels/{id}", "id": "prediction.trainedmodels.delete"}, "update": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Update"}, "id": "prediction.trainedmodels.update", "httpMethod": "PUT", "path": "trainedmodels/{id}", "response": {"$ref": "Training"}}, "get": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "id": "prediction.trainedmodels.get", "httpMethod": "GET", "path": "trainedmodels/{id}", "response": {"$ref": "Training"}}}}', true));
|
||||
$this->hostedmodels = new HostedmodelsServiceResource($this, $this->serviceName, 'hostedmodels', json_decode('{"methods": {"predict": {"scopes": ["https://www.googleapis.com/auth/prediction"], "parameters": {"hostedModelName": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Input"}, "id": "prediction.hostedmodels.predict", "httpMethod": "POST", "path": "hostedmodels/{hostedModelName}/predict", "response": {"$ref": "Output"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Input extends apiModel {
|
||||
protected $__inputType = 'InputInput';
|
||||
protected $__inputDataType = '';
|
||||
public $input;
|
||||
public function setInput(InputInput $input) {
|
||||
$this->input = $input;
|
||||
}
|
||||
public function getInput() {
|
||||
return $this->input;
|
||||
}
|
||||
}
|
||||
|
||||
class InputInput extends apiModel {
|
||||
public $csvInstance;
|
||||
public function setCsvInstance(/* array(object) */ $csvInstance) {
|
||||
$this->assertIsArray($csvInstance, 'object', __METHOD__);
|
||||
$this->csvInstance = $csvInstance;
|
||||
}
|
||||
public function getCsvInstance() {
|
||||
return $this->csvInstance;
|
||||
}
|
||||
}
|
||||
|
||||
class Output extends apiModel {
|
||||
public $kind;
|
||||
public $outputLabel;
|
||||
public $id;
|
||||
protected $__outputMultiType = 'OutputOutputMulti';
|
||||
protected $__outputMultiDataType = 'array';
|
||||
public $outputMulti;
|
||||
public $outputValue;
|
||||
public $selfLink;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setOutputLabel($outputLabel) {
|
||||
$this->outputLabel = $outputLabel;
|
||||
}
|
||||
public function getOutputLabel() {
|
||||
return $this->outputLabel;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setOutputMulti(/* array(OutputOutputMulti) */ $outputMulti) {
|
||||
$this->assertIsArray($outputMulti, 'OutputOutputMulti', __METHOD__);
|
||||
$this->outputMulti = $outputMulti;
|
||||
}
|
||||
public function getOutputMulti() {
|
||||
return $this->outputMulti;
|
||||
}
|
||||
public function setOutputValue($outputValue) {
|
||||
$this->outputValue = $outputValue;
|
||||
}
|
||||
public function getOutputValue() {
|
||||
return $this->outputValue;
|
||||
}
|
||||
public function setSelfLink($selfLink) {
|
||||
$this->selfLink = $selfLink;
|
||||
}
|
||||
public function getSelfLink() {
|
||||
return $this->selfLink;
|
||||
}
|
||||
}
|
||||
|
||||
class OutputOutputMulti extends apiModel {
|
||||
public $score;
|
||||
public $label;
|
||||
public function setScore($score) {
|
||||
$this->score = $score;
|
||||
}
|
||||
public function getScore() {
|
||||
return $this->score;
|
||||
}
|
||||
public function setLabel($label) {
|
||||
$this->label = $label;
|
||||
}
|
||||
public function getLabel() {
|
||||
return $this->label;
|
||||
}
|
||||
}
|
||||
|
||||
class Training extends apiModel {
|
||||
public $kind;
|
||||
public $storageDataLocation;
|
||||
public $storagePMMLModelLocation;
|
||||
protected $__dataAnalysisType = 'TrainingDataAnalysis';
|
||||
protected $__dataAnalysisDataType = '';
|
||||
public $dataAnalysis;
|
||||
public $trainingStatus;
|
||||
protected $__modelInfoType = 'TrainingModelInfo';
|
||||
protected $__modelInfoDataType = '';
|
||||
public $modelInfo;
|
||||
public $storagePMMLLocation;
|
||||
public $id;
|
||||
public $selfLink;
|
||||
public $utility;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setStorageDataLocation($storageDataLocation) {
|
||||
$this->storageDataLocation = $storageDataLocation;
|
||||
}
|
||||
public function getStorageDataLocation() {
|
||||
return $this->storageDataLocation;
|
||||
}
|
||||
public function setStoragePMMLModelLocation($storagePMMLModelLocation) {
|
||||
$this->storagePMMLModelLocation = $storagePMMLModelLocation;
|
||||
}
|
||||
public function getStoragePMMLModelLocation() {
|
||||
return $this->storagePMMLModelLocation;
|
||||
}
|
||||
public function setDataAnalysis(TrainingDataAnalysis $dataAnalysis) {
|
||||
$this->dataAnalysis = $dataAnalysis;
|
||||
}
|
||||
public function getDataAnalysis() {
|
||||
return $this->dataAnalysis;
|
||||
}
|
||||
public function setTrainingStatus($trainingStatus) {
|
||||
$this->trainingStatus = $trainingStatus;
|
||||
}
|
||||
public function getTrainingStatus() {
|
||||
return $this->trainingStatus;
|
||||
}
|
||||
public function setModelInfo(TrainingModelInfo $modelInfo) {
|
||||
$this->modelInfo = $modelInfo;
|
||||
}
|
||||
public function getModelInfo() {
|
||||
return $this->modelInfo;
|
||||
}
|
||||
public function setStoragePMMLLocation($storagePMMLLocation) {
|
||||
$this->storagePMMLLocation = $storagePMMLLocation;
|
||||
}
|
||||
public function getStoragePMMLLocation() {
|
||||
return $this->storagePMMLLocation;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setSelfLink($selfLink) {
|
||||
$this->selfLink = $selfLink;
|
||||
}
|
||||
public function getSelfLink() {
|
||||
return $this->selfLink;
|
||||
}
|
||||
public function setUtility(/* array(double) */ $utility) {
|
||||
$this->assertIsArray($utility, 'double', __METHOD__);
|
||||
$this->utility = $utility;
|
||||
}
|
||||
public function getUtility() {
|
||||
return $this->utility;
|
||||
}
|
||||
}
|
||||
|
||||
class TrainingDataAnalysis extends apiModel {
|
||||
public $warnings;
|
||||
public function setWarnings(/* array(string) */ $warnings) {
|
||||
$this->assertIsArray($warnings, 'string', __METHOD__);
|
||||
$this->warnings = $warnings;
|
||||
}
|
||||
public function getWarnings() {
|
||||
return $this->warnings;
|
||||
}
|
||||
}
|
||||
|
||||
class TrainingModelInfo extends apiModel {
|
||||
public $confusionMatrixRowTotals;
|
||||
public $numberLabels;
|
||||
public $confusionMatrix;
|
||||
public $meanSquaredError;
|
||||
public $modelType;
|
||||
public $numberInstances;
|
||||
public $classWeightedAccuracy;
|
||||
public $classificationAccuracy;
|
||||
public function setConfusionMatrixRowTotals($confusionMatrixRowTotals) {
|
||||
$this->confusionMatrixRowTotals = $confusionMatrixRowTotals;
|
||||
}
|
||||
public function getConfusionMatrixRowTotals() {
|
||||
return $this->confusionMatrixRowTotals;
|
||||
}
|
||||
public function setNumberLabels($numberLabels) {
|
||||
$this->numberLabels = $numberLabels;
|
||||
}
|
||||
public function getNumberLabels() {
|
||||
return $this->numberLabels;
|
||||
}
|
||||
public function setConfusionMatrix($confusionMatrix) {
|
||||
$this->confusionMatrix = $confusionMatrix;
|
||||
}
|
||||
public function getConfusionMatrix() {
|
||||
return $this->confusionMatrix;
|
||||
}
|
||||
public function setMeanSquaredError($meanSquaredError) {
|
||||
$this->meanSquaredError = $meanSquaredError;
|
||||
}
|
||||
public function getMeanSquaredError() {
|
||||
return $this->meanSquaredError;
|
||||
}
|
||||
public function setModelType($modelType) {
|
||||
$this->modelType = $modelType;
|
||||
}
|
||||
public function getModelType() {
|
||||
return $this->modelType;
|
||||
}
|
||||
public function setNumberInstances($numberInstances) {
|
||||
$this->numberInstances = $numberInstances;
|
||||
}
|
||||
public function getNumberInstances() {
|
||||
return $this->numberInstances;
|
||||
}
|
||||
public function setClassWeightedAccuracy($classWeightedAccuracy) {
|
||||
$this->classWeightedAccuracy = $classWeightedAccuracy;
|
||||
}
|
||||
public function getClassWeightedAccuracy() {
|
||||
return $this->classWeightedAccuracy;
|
||||
}
|
||||
public function setClassificationAccuracy($classificationAccuracy) {
|
||||
$this->classificationAccuracy = $classificationAccuracy;
|
||||
}
|
||||
public function getClassificationAccuracy() {
|
||||
return $this->classificationAccuracy;
|
||||
}
|
||||
}
|
||||
|
||||
class Update extends apiModel {
|
||||
public $csvInstance;
|
||||
public $label;
|
||||
public function setCsvInstance(/* array(object) */ $csvInstance) {
|
||||
$this->assertIsArray($csvInstance, 'object', __METHOD__);
|
||||
$this->csvInstance = $csvInstance;
|
||||
}
|
||||
public function getCsvInstance() {
|
||||
return $this->csvInstance;
|
||||
}
|
||||
public function setLabel($label) {
|
||||
$this->label = $label;
|
||||
}
|
||||
public function getLabel() {
|
||||
return $this->label;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,292 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "webResource" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $siteVerificationService = new apiSiteVerificationService(...);
|
||||
* $webResource = $siteVerificationService->webResource;
|
||||
* </code>
|
||||
*/
|
||||
class WebResourceServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Attempt verification of a website or domain. (webResource.insert)
|
||||
*
|
||||
* @param string $verificationMethod The method to use for verifying a site or domain.
|
||||
* @param SiteVerificationWebResourceResource $postBody
|
||||
* @return SiteVerificationWebResourceResource
|
||||
*/
|
||||
public function insert($verificationMethod, SiteVerificationWebResourceResource $postBody, $optParams = array()) {
|
||||
$params = array('verificationMethod' => $verificationMethod, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceResource($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get the most current data for a website or domain. (webResource.get)
|
||||
*
|
||||
* @param string $id The id of a verified site or domain.
|
||||
* @return SiteVerificationWebResourceResource
|
||||
*/
|
||||
public function get($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceResource($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get the list of your verified websites and domains. (webResource.list)
|
||||
*
|
||||
* @return SiteVerificationWebResourceListResponse
|
||||
*/
|
||||
public function listWebResource($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceListResponse($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Modify the list of owners for your website or domain. (webResource.update)
|
||||
*
|
||||
* @param string $id The id of a verified site or domain.
|
||||
* @param SiteVerificationWebResourceResource $postBody
|
||||
* @return SiteVerificationWebResourceResource
|
||||
*/
|
||||
public function update($id, SiteVerificationWebResourceResource $postBody, $optParams = array()) {
|
||||
$params = array('id' => $id, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('update', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceResource($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Modify the list of owners for your website or domain. This method supports patch semantics.
|
||||
* (webResource.patch)
|
||||
*
|
||||
* @param string $id The id of a verified site or domain.
|
||||
* @param SiteVerificationWebResourceResource $postBody
|
||||
* @return SiteVerificationWebResourceResource
|
||||
*/
|
||||
public function patch($id, SiteVerificationWebResourceResource $postBody, $optParams = array()) {
|
||||
$params = array('id' => $id, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('patch', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceResource($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get a verification token for placing on a website or domain. (webResource.getToken)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string verificationMethod The method to use for verifying a site or domain.
|
||||
* @opt_param string identifier The URL or domain to verify.
|
||||
* @opt_param string type Type of resource to verify. Can be 'site' (URL) or 'inet_domain' (domain name).
|
||||
* @return SiteVerificationWebResourceGettokenResponse
|
||||
*/
|
||||
public function getToken($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('getToken', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new SiteVerificationWebResourceGettokenResponse($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Relinquish ownership of a website or domain. (webResource.delete)
|
||||
*
|
||||
* @param string $id The id of a verified site or domain.
|
||||
*/
|
||||
public function delete($id, $optParams = array()) {
|
||||
$params = array('id' => $id);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for SiteVerification (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you programatically verify ownership of websites or domains with Google.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/siteverification/" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiSiteVerificationService extends apiService {
|
||||
public $webResource;
|
||||
/**
|
||||
* Constructs the internal representation of the SiteVerification service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/siteVerification/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'siteVerification';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->webResource = new WebResourceServiceResource($this, $this->serviceName, 'webResource', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"verificationMethod": {"required": true, "type": "string", "location": "query"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.insert", "httpMethod": "POST", "path": "webResource", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "get": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "id": "siteVerification.webResource.get", "httpMethod": "GET", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "list": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "id": "siteVerification.webResource.list", "httpMethod": "GET", "path": "webResource", "response": {"$ref": "SiteVerificationWebResourceListResponse"}}, "update": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.update", "httpMethod": "PUT", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "SiteVerificationWebResourceResource"}, "id": "siteVerification.webResource.patch", "httpMethod": "PATCH", "path": "webResource/{id}", "response": {"$ref": "SiteVerificationWebResourceResource"}}, "getToken": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"type": {"type": "string", "location": "query"}, "identifier": {"type": "string", "location": "query"}, "verificationMethod": {"type": "string", "location": "query"}}, "response": {"$ref": "SiteVerificationWebResourceGettokenResponse"}, "httpMethod": "GET", "path": "token", "id": "siteVerification.webResource.getToken"}, "delete": {"scopes": ["https://www.googleapis.com/auth/siteverification"], "parameters": {"id": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "webResource/{id}", "id": "siteVerification.webResource.delete"}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceGettokenRequest extends apiModel {
|
||||
public $verificationMethod;
|
||||
protected $__siteType = 'SiteVerificationWebResourceGettokenRequestSite';
|
||||
protected $__siteDataType = '';
|
||||
public $site;
|
||||
public function setVerificationMethod($verificationMethod) {
|
||||
$this->verificationMethod = $verificationMethod;
|
||||
}
|
||||
public function getVerificationMethod() {
|
||||
return $this->verificationMethod;
|
||||
}
|
||||
public function setSite(SiteVerificationWebResourceGettokenRequestSite $site) {
|
||||
$this->site = $site;
|
||||
}
|
||||
public function getSite() {
|
||||
return $this->site;
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceGettokenRequestSite extends apiModel {
|
||||
public $identifier;
|
||||
public $type;
|
||||
public function setIdentifier($identifier) {
|
||||
$this->identifier = $identifier;
|
||||
}
|
||||
public function getIdentifier() {
|
||||
return $this->identifier;
|
||||
}
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceGettokenResponse extends apiModel {
|
||||
public $token;
|
||||
public $method;
|
||||
public function setToken($token) {
|
||||
$this->token = $token;
|
||||
}
|
||||
public function getToken() {
|
||||
return $this->token;
|
||||
}
|
||||
public function setMethod($method) {
|
||||
$this->method = $method;
|
||||
}
|
||||
public function getMethod() {
|
||||
return $this->method;
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceListResponse extends apiModel {
|
||||
protected $__itemsType = 'SiteVerificationWebResourceResource';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public function setItems(/* array(SiteVerificationWebResourceResource) */ $items) {
|
||||
$this->assertIsArray($items, 'SiteVerificationWebResourceResource', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceResource extends apiModel {
|
||||
public $owners;
|
||||
public $id;
|
||||
protected $__siteType = 'SiteVerificationWebResourceResourceSite';
|
||||
protected $__siteDataType = '';
|
||||
public $site;
|
||||
public function setOwners(/* array(string) */ $owners) {
|
||||
$this->assertIsArray($owners, 'string', __METHOD__);
|
||||
$this->owners = $owners;
|
||||
}
|
||||
public function getOwners() {
|
||||
return $this->owners;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setSite(SiteVerificationWebResourceResourceSite $site) {
|
||||
$this->site = $site;
|
||||
}
|
||||
public function getSite() {
|
||||
return $this->site;
|
||||
}
|
||||
}
|
||||
|
||||
class SiteVerificationWebResourceResourceSite extends apiModel {
|
||||
public $identifier;
|
||||
public $type;
|
||||
public function setIdentifier($identifier) {
|
||||
$this->identifier = $identifier;
|
||||
}
|
||||
public function getIdentifier() {
|
||||
return $this->identifier;
|
||||
}
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,571 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "tasks" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $tasksService = new apiTasksService(...);
|
||||
* $tasks = $tasksService->tasks;
|
||||
* </code>
|
||||
*/
|
||||
class TasksServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new task on the specified task list. (tasks.insert)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param Task $postBody
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string parent Parent task identifier. If the task is created at the top level, this parameter is omitted. Optional.
|
||||
* @opt_param string previous Previous sibling task identifier. If the task is created at the first position among its siblings, this parameter is omitted. Optional.
|
||||
* @return Task
|
||||
*/
|
||||
public function insert($tasklist, Task $postBody, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Task($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the specified task. (tasks.get)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param string $task Task identifier.
|
||||
* @return Task
|
||||
*/
|
||||
public function get($tasklist, $task, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'task' => $task);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Task($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Clears all completed tasks from the specified task list. The affected tasks will be marked as
|
||||
* 'hidden' and no longer be returned by default when retrieving all tasks for a task list.
|
||||
* (tasks.clear)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
*/
|
||||
public function clear($tasklist, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('clear', array($params));
|
||||
return $data;
|
||||
}
|
||||
/**
|
||||
* Moves the specified task to another position in the task list. This can include putting it as a
|
||||
* child task under a new parent and/or move it to a different position among its sibling tasks.
|
||||
* (tasks.move)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param string $task Task identifier.
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string parent New parent task identifier. If the task is moved to the top level, this parameter is omitted. Optional.
|
||||
* @opt_param string previous New previous sibling task identifier. If the task is moved to the first position among its siblings, this parameter is omitted. Optional.
|
||||
* @return Task
|
||||
*/
|
||||
public function move($tasklist, $task, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'task' => $task);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('move', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Task($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns all tasks in the specified task list. (tasks.list)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string dueMax Upper bound for a task's due date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by due date.
|
||||
* @opt_param bool showDeleted Flag indicating whether deleted tasks are returned in the result. Optional. The default is False.
|
||||
* @opt_param string updatedMin Lower bound for a task's last modification time (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by last modification time.
|
||||
* @opt_param string completedMin Lower bound for a task's completion date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by completion date.
|
||||
* @opt_param string maxResults Maximum number of task lists returned on one page. Optional. The default is 100.
|
||||
* @opt_param bool showCompleted Flag indicating whether completed tasks are returned in the result. Optional. The default is True.
|
||||
* @opt_param string pageToken Token specifying the result page to return. Optional.
|
||||
* @opt_param string completedMax Upper bound for a task's completion date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by completion date.
|
||||
* @opt_param bool showHidden Flag indicating whether hidden tasks are returned in the result. Optional. The default is False.
|
||||
* @opt_param string dueMin Lower bound for a task's due date (as a RFC 3339 timestamp) to filter by. Optional. The default is not to filter by due date.
|
||||
* @return Tasks
|
||||
*/
|
||||
public function listTasks($tasklist, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Tasks($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Updates the specified task. (tasks.update)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param string $task Task identifier.
|
||||
* @param Task $postBody
|
||||
* @return Task
|
||||
*/
|
||||
public function update($tasklist, $task, Task $postBody, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'task' => $task, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('update', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Task($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Updates the specified task. This method supports patch semantics. (tasks.patch)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param string $task Task identifier.
|
||||
* @param Task $postBody
|
||||
* @return Task
|
||||
*/
|
||||
public function patch($tasklist, $task, Task $postBody, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'task' => $task, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('patch', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Task($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deletes the specified task from the task list. (tasks.delete)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param string $task Task identifier.
|
||||
*/
|
||||
public function delete($tasklist, $task, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'task' => $task);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The "tasklists" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $tasksService = new apiTasksService(...);
|
||||
* $tasklists = $tasksService->tasklists;
|
||||
* </code>
|
||||
*/
|
||||
class TasklistsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new task list and adds it to the authenticated user's task lists. (tasklists.insert)
|
||||
*
|
||||
* @param TaskList $postBody
|
||||
* @return TaskList
|
||||
*/
|
||||
public function insert(TaskList $postBody, $optParams = array()) {
|
||||
$params = array('postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TaskList($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the authenticated user's specified task list. (tasklists.get)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @return TaskList
|
||||
*/
|
||||
public function get($tasklist, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TaskList($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns all the authenticated user's task lists. (tasklists.list)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string pageToken Token specifying the result page to return. Optional.
|
||||
* @opt_param string maxResults Maximum number of task lists returned on one page. Optional. The default is 100.
|
||||
* @return TaskLists
|
||||
*/
|
||||
public function listTasklists($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TaskLists($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Updates the authenticated user's specified task list. (tasklists.update)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param TaskList $postBody
|
||||
* @return TaskList
|
||||
*/
|
||||
public function update($tasklist, TaskList $postBody, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('update', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TaskList($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Updates the authenticated user's specified task list. This method supports patch semantics.
|
||||
* (tasklists.patch)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
* @param TaskList $postBody
|
||||
* @return TaskList
|
||||
*/
|
||||
public function patch($tasklist, TaskList $postBody, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist, 'postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('patch', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TaskList($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Deletes the authenticated user's specified task list. (tasklists.delete)
|
||||
*
|
||||
* @param string $tasklist Task list identifier.
|
||||
*/
|
||||
public function delete($tasklist, $optParams = array()) {
|
||||
$params = array('tasklist' => $tasklist);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('delete', array($params));
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Tasks (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you manage your tasks and task lists.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/tasks/v1/using.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiTasksService extends apiService {
|
||||
public $tasks;
|
||||
public $tasklists;
|
||||
/**
|
||||
* Constructs the internal representation of the Tasks service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/tasks/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'tasks';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->tasks = new TasksServiceResource($this, $this->serviceName, 'tasks', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "parent": {"type": "string", "location": "query"}, "previous": {"type": "string", "location": "query"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.insert", "httpMethod": "POST", "path": "lists/{tasklist}/tasks", "response": {"$ref": "Task"}}, "get": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasks.get", "httpMethod": "GET", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "clear": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "POST", "path": "lists/{tasklist}/clear", "id": "tasks.tasks.clear"}, "move": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"previous": {"type": "string", "location": "query"}, "tasklist": {"required": true, "type": "string", "location": "path"}, "parent": {"type": "string", "location": "query"}, "task": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasks.move", "httpMethod": "POST", "path": "lists/{tasklist}/tasks/{task}/move", "response": {"$ref": "Task"}}, "list": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"dueMax": {"type": "string", "location": "query"}, "tasklist": {"required": true, "type": "string", "location": "path"}, "pageToken": {"type": "string", "location": "query"}, "updatedMin": {"type": "string", "location": "query"}, "completedMin": {"type": "string", "location": "query"}, "maxResults": {"format": "int64", "type": "string", "location": "query"}, "showCompleted": {"type": "boolean", "location": "query"}, "showDeleted": {"type": "boolean", "location": "query"}, "completedMax": {"type": "string", "location": "query"}, "showHidden": {"type": "boolean", "location": "query"}, "dueMin": {"type": "string", "location": "query"}}, "id": "tasks.tasks.list", "httpMethod": "GET", "path": "lists/{tasklist}/tasks", "response": {"$ref": "Tasks"}}, "update": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.update", "httpMethod": "PUT", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "Task"}, "id": "tasks.tasks.patch", "httpMethod": "PATCH", "path": "lists/{tasklist}/tasks/{task}", "response": {"$ref": "Task"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}, "task": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "lists/{tasklist}/tasks/{task}", "id": "tasks.tasks.delete"}}}', true));
|
||||
$this->tasklists = new TasklistsServiceResource($this, $this->serviceName, 'tasklists', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/tasks"], "request": {"$ref": "TaskList"}, "response": {"$ref": "TaskList"}, "httpMethod": "POST", "path": "users/@me/lists", "id": "tasks.tasklists.insert"}, "get": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "id": "tasks.tasklists.get", "httpMethod": "GET", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "list": {"scopes": ["https://www.googleapis.com/auth/tasks", "https://www.googleapis.com/auth/tasks.readonly"], "parameters": {"pageToken": {"type": "string", "location": "query"}, "maxResults": {"format": "int64", "type": "string", "location": "query"}}, "response": {"$ref": "TaskLists"}, "httpMethod": "GET", "path": "users/@me/lists", "id": "tasks.tasklists.list"}, "update": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "TaskList"}, "id": "tasks.tasklists.update", "httpMethod": "PUT", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "patch": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "request": {"$ref": "TaskList"}, "id": "tasks.tasklists.patch", "httpMethod": "PATCH", "path": "users/@me/lists/{tasklist}", "response": {"$ref": "TaskList"}}, "delete": {"scopes": ["https://www.googleapis.com/auth/tasks"], "parameters": {"tasklist": {"required": true, "type": "string", "location": "path"}}, "httpMethod": "DELETE", "path": "users/@me/lists/{tasklist}", "id": "tasks.tasklists.delete"}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Task extends apiModel {
|
||||
public $status;
|
||||
public $kind;
|
||||
public $updated;
|
||||
public $parent;
|
||||
protected $__linksType = 'TaskLinks';
|
||||
protected $__linksDataType = 'array';
|
||||
public $links;
|
||||
public $title;
|
||||
public $deleted;
|
||||
public $completed;
|
||||
public $due;
|
||||
public $etag;
|
||||
public $notes;
|
||||
public $position;
|
||||
public $hidden;
|
||||
public $id;
|
||||
public $selfLink;
|
||||
public function setStatus($status) {
|
||||
$this->status = $status;
|
||||
}
|
||||
public function getStatus() {
|
||||
return $this->status;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setUpdated($updated) {
|
||||
$this->updated = $updated;
|
||||
}
|
||||
public function getUpdated() {
|
||||
return $this->updated;
|
||||
}
|
||||
public function setParent($parent) {
|
||||
$this->parent = $parent;
|
||||
}
|
||||
public function getParent() {
|
||||
return $this->parent;
|
||||
}
|
||||
public function setLinks(/* array(TaskLinks) */ $links) {
|
||||
$this->assertIsArray($links, 'TaskLinks', __METHOD__);
|
||||
$this->links = $links;
|
||||
}
|
||||
public function getLinks() {
|
||||
return $this->links;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
public function setDeleted($deleted) {
|
||||
$this->deleted = $deleted;
|
||||
}
|
||||
public function getDeleted() {
|
||||
return $this->deleted;
|
||||
}
|
||||
public function setCompleted($completed) {
|
||||
$this->completed = $completed;
|
||||
}
|
||||
public function getCompleted() {
|
||||
return $this->completed;
|
||||
}
|
||||
public function setDue($due) {
|
||||
$this->due = $due;
|
||||
}
|
||||
public function getDue() {
|
||||
return $this->due;
|
||||
}
|
||||
public function setEtag($etag) {
|
||||
$this->etag = $etag;
|
||||
}
|
||||
public function getEtag() {
|
||||
return $this->etag;
|
||||
}
|
||||
public function setNotes($notes) {
|
||||
$this->notes = $notes;
|
||||
}
|
||||
public function getNotes() {
|
||||
return $this->notes;
|
||||
}
|
||||
public function setPosition($position) {
|
||||
$this->position = $position;
|
||||
}
|
||||
public function getPosition() {
|
||||
return $this->position;
|
||||
}
|
||||
public function setHidden($hidden) {
|
||||
$this->hidden = $hidden;
|
||||
}
|
||||
public function getHidden() {
|
||||
return $this->hidden;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setSelfLink($selfLink) {
|
||||
$this->selfLink = $selfLink;
|
||||
}
|
||||
public function getSelfLink() {
|
||||
return $this->selfLink;
|
||||
}
|
||||
}
|
||||
|
||||
class TaskLinks extends apiModel {
|
||||
public $type;
|
||||
public $link;
|
||||
public $description;
|
||||
public function setType($type) {
|
||||
$this->type = $type;
|
||||
}
|
||||
public function getType() {
|
||||
return $this->type;
|
||||
}
|
||||
public function setLink($link) {
|
||||
$this->link = $link;
|
||||
}
|
||||
public function getLink() {
|
||||
return $this->link;
|
||||
}
|
||||
public function setDescription($description) {
|
||||
$this->description = $description;
|
||||
}
|
||||
public function getDescription() {
|
||||
return $this->description;
|
||||
}
|
||||
}
|
||||
|
||||
class TaskList extends apiModel {
|
||||
public $kind;
|
||||
public $etag;
|
||||
public $id;
|
||||
public $selfLink;
|
||||
public $title;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setEtag($etag) {
|
||||
$this->etag = $etag;
|
||||
}
|
||||
public function getEtag() {
|
||||
return $this->etag;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
public function setSelfLink($selfLink) {
|
||||
$this->selfLink = $selfLink;
|
||||
}
|
||||
public function getSelfLink() {
|
||||
return $this->selfLink;
|
||||
}
|
||||
public function setTitle($title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
public function getTitle() {
|
||||
return $this->title;
|
||||
}
|
||||
}
|
||||
|
||||
class TaskLists extends apiModel {
|
||||
public $nextPageToken;
|
||||
protected $__itemsType = 'TaskList';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public $kind;
|
||||
public $etag;
|
||||
public function setNextPageToken($nextPageToken) {
|
||||
$this->nextPageToken = $nextPageToken;
|
||||
}
|
||||
public function getNextPageToken() {
|
||||
return $this->nextPageToken;
|
||||
}
|
||||
public function setItems(/* array(TaskList) */ $items) {
|
||||
$this->assertIsArray($items, 'TaskList', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setEtag($etag) {
|
||||
$this->etag = $etag;
|
||||
}
|
||||
public function getEtag() {
|
||||
return $this->etag;
|
||||
}
|
||||
}
|
||||
|
||||
class Tasks extends apiModel {
|
||||
public $nextPageToken;
|
||||
protected $__itemsType = 'Task';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public $kind;
|
||||
public $etag;
|
||||
public function setNextPageToken($nextPageToken) {
|
||||
$this->nextPageToken = $nextPageToken;
|
||||
}
|
||||
public function getNextPageToken() {
|
||||
return $this->nextPageToken;
|
||||
}
|
||||
public function setItems(/* array(Task) */ $items) {
|
||||
$this->assertIsArray($items, 'Task', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setEtag($etag) {
|
||||
$this->etag = $etag;
|
||||
}
|
||||
public function getEtag() {
|
||||
return $this->etag;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "languages" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $translateService = new apiTranslateService(...);
|
||||
* $languages = $translateService->languages;
|
||||
* </code>
|
||||
*/
|
||||
class LanguagesServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* List the source/target languages supported by the API (languages.list)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string target the language and collation in which the localized results should be returned
|
||||
* @return LanguagesListResponse
|
||||
*/
|
||||
public function listLanguages($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new LanguagesListResponse($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The "detections" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $translateService = new apiTranslateService(...);
|
||||
* $detections = $translateService->detections;
|
||||
* </code>
|
||||
*/
|
||||
class DetectionsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Detect the language of text. (detections.list)
|
||||
*
|
||||
* @param string $q The text to detect
|
||||
* @return DetectionsListResponse
|
||||
*/
|
||||
public function listDetections($q, $optParams = array()) {
|
||||
$params = array('q' => $q);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new DetectionsListResponse($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The "translations" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $translateService = new apiTranslateService(...);
|
||||
* $translations = $translateService->translations;
|
||||
* </code>
|
||||
*/
|
||||
class TranslationsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Returns text translations from one language to another. (translations.list)
|
||||
*
|
||||
* @param string $q The text to translate
|
||||
* @param string $target The target language into which the text should be translated
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string source The source language of the text
|
||||
* @opt_param string format The format of the text
|
||||
* @opt_param string cid The customization id for translate
|
||||
* @return TranslationsListResponse
|
||||
*/
|
||||
public function listTranslations($q, $target, $optParams = array()) {
|
||||
$params = array('q' => $q, 'target' => $target);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new TranslationsListResponse($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Translate (v2).
|
||||
*
|
||||
* <p>
|
||||
* Lets you translate text from one language to another
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/language/translate/v2/using_rest.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiTranslateService extends apiService {
|
||||
public $languages;
|
||||
public $detections;
|
||||
public $translations;
|
||||
/**
|
||||
* Constructs the internal representation of the Translate service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/language/translate/';
|
||||
$this->version = 'v2';
|
||||
$this->serviceName = 'translate';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->languages = new LanguagesServiceResource($this, $this->serviceName, 'languages', json_decode('{"methods": {"list": {"parameters": {"target": {"type": "string", "location": "query"}}, "id": "language.languages.list", "httpMethod": "GET", "path": "v2/languages", "response": {"$ref": "LanguagesListResponse"}}}}', true));
|
||||
$this->detections = new DetectionsServiceResource($this, $this->serviceName, 'detections', json_decode('{"methods": {"list": {"parameters": {"q": {"repeated": true, "required": true, "type": "string", "location": "query"}}, "id": "language.detections.list", "httpMethod": "GET", "path": "v2/detect", "response": {"$ref": "DetectionsListResponse"}}}}', true));
|
||||
$this->translations = new TranslationsServiceResource($this, $this->serviceName, 'translations', json_decode('{"methods": {"list": {"parameters": {"q": {"repeated": true, "required": true, "type": "string", "location": "query"}, "source": {"type": "string", "location": "query"}, "cid": {"repeated": true, "type": "string", "location": "query"}, "target": {"required": true, "type": "string", "location": "query"}, "format": {"enum": ["html", "text"], "type": "string", "location": "query"}}, "id": "language.translations.list", "httpMethod": "GET", "path": "v2", "response": {"$ref": "TranslationsListResponse"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class DetectionsListResponse extends apiModel {
|
||||
protected $__detectionsType = 'DetectionsResourceItems';
|
||||
protected $__detectionsDataType = 'array';
|
||||
public $detections;
|
||||
public function setDetections(/* array(DetectionsResourceItems) */ $detections) {
|
||||
$this->assertIsArray($detections, 'DetectionsResourceItems', __METHOD__);
|
||||
$this->detections = $detections;
|
||||
}
|
||||
public function getDetections() {
|
||||
return $this->detections;
|
||||
}
|
||||
}
|
||||
|
||||
class DetectionsResource extends apiModel {
|
||||
}
|
||||
|
||||
class DetectionsResourceItems extends apiModel {
|
||||
public $isReliable;
|
||||
public $confidence;
|
||||
public $language;
|
||||
public function setIsReliable($isReliable) {
|
||||
$this->isReliable = $isReliable;
|
||||
}
|
||||
public function getIsReliable() {
|
||||
return $this->isReliable;
|
||||
}
|
||||
public function setConfidence($confidence) {
|
||||
$this->confidence = $confidence;
|
||||
}
|
||||
public function getConfidence() {
|
||||
return $this->confidence;
|
||||
}
|
||||
public function setLanguage($language) {
|
||||
$this->language = $language;
|
||||
}
|
||||
public function getLanguage() {
|
||||
return $this->language;
|
||||
}
|
||||
}
|
||||
|
||||
class LanguagesListResponse extends apiModel {
|
||||
protected $__languagesType = 'LanguagesResource';
|
||||
protected $__languagesDataType = 'array';
|
||||
public $languages;
|
||||
public function setLanguages(/* array(LanguagesResource) */ $languages) {
|
||||
$this->assertIsArray($languages, 'LanguagesResource', __METHOD__);
|
||||
$this->languages = $languages;
|
||||
}
|
||||
public function getLanguages() {
|
||||
return $this->languages;
|
||||
}
|
||||
}
|
||||
|
||||
class LanguagesResource extends apiModel {
|
||||
public $name;
|
||||
public $language;
|
||||
public function setName($name) {
|
||||
$this->name = $name;
|
||||
}
|
||||
public function getName() {
|
||||
return $this->name;
|
||||
}
|
||||
public function setLanguage($language) {
|
||||
$this->language = $language;
|
||||
}
|
||||
public function getLanguage() {
|
||||
return $this->language;
|
||||
}
|
||||
}
|
||||
|
||||
class TranslationsListResponse extends apiModel {
|
||||
protected $__translationsType = 'TranslationsResource';
|
||||
protected $__translationsDataType = 'array';
|
||||
public $translations;
|
||||
public function setTranslations(/* array(TranslationsResource) */ $translations) {
|
||||
$this->assertIsArray($translations, 'TranslationsResource', __METHOD__);
|
||||
$this->translations = $translations;
|
||||
}
|
||||
public function getTranslations() {
|
||||
return $this->translations;
|
||||
}
|
||||
}
|
||||
|
||||
class TranslationsResource extends apiModel {
|
||||
public $detectedSourceLanguage;
|
||||
public $translatedText;
|
||||
public function setDetectedSourceLanguage($detectedSourceLanguage) {
|
||||
$this->detectedSourceLanguage = $detectedSourceLanguage;
|
||||
}
|
||||
public function getDetectedSourceLanguage() {
|
||||
return $this->detectedSourceLanguage;
|
||||
}
|
||||
public function setTranslatedText($translatedText) {
|
||||
$this->translatedText = $translatedText;
|
||||
}
|
||||
public function getTranslatedText() {
|
||||
return $this->translatedText;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,332 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "url" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $urlshortenerService = new apiUrlshortenerService(...);
|
||||
* $url = $urlshortenerService->url;
|
||||
* </code>
|
||||
*/
|
||||
class UrlServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new short URL. (url.insert)
|
||||
*
|
||||
* @param Url $postBody
|
||||
* @return Url
|
||||
*/
|
||||
public function insert(Url $postBody, $optParams = array()) {
|
||||
$params = array('postBody' => $postBody);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('insert', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Url($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Retrieves a list of URLs shortened by a user. (url.list)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string start-token Token for requesting successive pages of results.
|
||||
* @opt_param string projection Additional information to return.
|
||||
* @return UrlHistory
|
||||
*/
|
||||
public function listUrl($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new UrlHistory($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Expands a short URL or gets creation time and analytics. (url.get)
|
||||
*
|
||||
* @param string $shortUrl The short URL, including the protocol.
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string projection Additional information to return.
|
||||
* @return Url
|
||||
*/
|
||||
public function get($shortUrl, $optParams = array()) {
|
||||
$params = array('shortUrl' => $shortUrl);
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('get', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new Url($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Urlshortener (v1).
|
||||
*
|
||||
* <p>
|
||||
* Lets you create, inspect, and manage goo.gl short URLs
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/urlshortener/v1/getting_started.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiUrlshortenerService extends apiService {
|
||||
public $url;
|
||||
/**
|
||||
* Constructs the internal representation of the Urlshortener service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/urlshortener/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'urlshortener';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->url = new UrlServiceResource($this, $this->serviceName, 'url', json_decode('{"methods": {"insert": {"scopes": ["https://www.googleapis.com/auth/urlshortener"], "request": {"$ref": "Url"}, "response": {"$ref": "Url"}, "httpMethod": "POST", "path": "url", "id": "urlshortener.url.insert"}, "list": {"scopes": ["https://www.googleapis.com/auth/urlshortener"], "parameters": {"start-token": {"type": "string", "location": "query"}, "projection": {"enum": ["ANALYTICS_CLICKS", "FULL"], "type": "string", "location": "query"}}, "response": {"$ref": "UrlHistory"}, "httpMethod": "GET", "path": "url/history", "id": "urlshortener.url.list"}, "get": {"parameters": {"shortUrl": {"required": true, "type": "string", "location": "query"}, "projection": {"enum": ["ANALYTICS_CLICKS", "ANALYTICS_TOP_STRINGS", "FULL"], "type": "string", "location": "query"}}, "id": "urlshortener.url.get", "httpMethod": "GET", "path": "url", "response": {"$ref": "Url"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class AnalyticsSnapshot extends apiModel {
|
||||
public $shortUrlClicks;
|
||||
protected $__countriesType = 'StringCount';
|
||||
protected $__countriesDataType = 'array';
|
||||
public $countries;
|
||||
protected $__platformsType = 'StringCount';
|
||||
protected $__platformsDataType = 'array';
|
||||
public $platforms;
|
||||
protected $__browsersType = 'StringCount';
|
||||
protected $__browsersDataType = 'array';
|
||||
public $browsers;
|
||||
protected $__referrersType = 'StringCount';
|
||||
protected $__referrersDataType = 'array';
|
||||
public $referrers;
|
||||
public $longUrlClicks;
|
||||
public function setShortUrlClicks($shortUrlClicks) {
|
||||
$this->shortUrlClicks = $shortUrlClicks;
|
||||
}
|
||||
public function getShortUrlClicks() {
|
||||
return $this->shortUrlClicks;
|
||||
}
|
||||
public function setCountries(/* array(StringCount) */ $countries) {
|
||||
$this->assertIsArray($countries, 'StringCount', __METHOD__);
|
||||
$this->countries = $countries;
|
||||
}
|
||||
public function getCountries() {
|
||||
return $this->countries;
|
||||
}
|
||||
public function setPlatforms(/* array(StringCount) */ $platforms) {
|
||||
$this->assertIsArray($platforms, 'StringCount', __METHOD__);
|
||||
$this->platforms = $platforms;
|
||||
}
|
||||
public function getPlatforms() {
|
||||
return $this->platforms;
|
||||
}
|
||||
public function setBrowsers(/* array(StringCount) */ $browsers) {
|
||||
$this->assertIsArray($browsers, 'StringCount', __METHOD__);
|
||||
$this->browsers = $browsers;
|
||||
}
|
||||
public function getBrowsers() {
|
||||
return $this->browsers;
|
||||
}
|
||||
public function setReferrers(/* array(StringCount) */ $referrers) {
|
||||
$this->assertIsArray($referrers, 'StringCount', __METHOD__);
|
||||
$this->referrers = $referrers;
|
||||
}
|
||||
public function getReferrers() {
|
||||
return $this->referrers;
|
||||
}
|
||||
public function setLongUrlClicks($longUrlClicks) {
|
||||
$this->longUrlClicks = $longUrlClicks;
|
||||
}
|
||||
public function getLongUrlClicks() {
|
||||
return $this->longUrlClicks;
|
||||
}
|
||||
}
|
||||
|
||||
class AnalyticsSummary extends apiModel {
|
||||
protected $__weekType = 'AnalyticsSnapshot';
|
||||
protected $__weekDataType = '';
|
||||
public $week;
|
||||
protected $__allTimeType = 'AnalyticsSnapshot';
|
||||
protected $__allTimeDataType = '';
|
||||
public $allTime;
|
||||
protected $__twoHoursType = 'AnalyticsSnapshot';
|
||||
protected $__twoHoursDataType = '';
|
||||
public $twoHours;
|
||||
protected $__dayType = 'AnalyticsSnapshot';
|
||||
protected $__dayDataType = '';
|
||||
public $day;
|
||||
protected $__monthType = 'AnalyticsSnapshot';
|
||||
protected $__monthDataType = '';
|
||||
public $month;
|
||||
public function setWeek(AnalyticsSnapshot $week) {
|
||||
$this->week = $week;
|
||||
}
|
||||
public function getWeek() {
|
||||
return $this->week;
|
||||
}
|
||||
public function setAllTime(AnalyticsSnapshot $allTime) {
|
||||
$this->allTime = $allTime;
|
||||
}
|
||||
public function getAllTime() {
|
||||
return $this->allTime;
|
||||
}
|
||||
public function setTwoHours(AnalyticsSnapshot $twoHours) {
|
||||
$this->twoHours = $twoHours;
|
||||
}
|
||||
public function getTwoHours() {
|
||||
return $this->twoHours;
|
||||
}
|
||||
public function setDay(AnalyticsSnapshot $day) {
|
||||
$this->day = $day;
|
||||
}
|
||||
public function getDay() {
|
||||
return $this->day;
|
||||
}
|
||||
public function setMonth(AnalyticsSnapshot $month) {
|
||||
$this->month = $month;
|
||||
}
|
||||
public function getMonth() {
|
||||
return $this->month;
|
||||
}
|
||||
}
|
||||
|
||||
class StringCount extends apiModel {
|
||||
public $count;
|
||||
public $id;
|
||||
public function setCount($count) {
|
||||
$this->count = $count;
|
||||
}
|
||||
public function getCount() {
|
||||
return $this->count;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
class Url extends apiModel {
|
||||
public $status;
|
||||
public $kind;
|
||||
public $created;
|
||||
protected $__analyticsType = 'AnalyticsSummary';
|
||||
protected $__analyticsDataType = '';
|
||||
public $analytics;
|
||||
public $longUrl;
|
||||
public $id;
|
||||
public function setStatus($status) {
|
||||
$this->status = $status;
|
||||
}
|
||||
public function getStatus() {
|
||||
return $this->status;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setCreated($created) {
|
||||
$this->created = $created;
|
||||
}
|
||||
public function getCreated() {
|
||||
return $this->created;
|
||||
}
|
||||
public function setAnalytics(AnalyticsSummary $analytics) {
|
||||
$this->analytics = $analytics;
|
||||
}
|
||||
public function getAnalytics() {
|
||||
return $this->analytics;
|
||||
}
|
||||
public function setLongUrl($longUrl) {
|
||||
$this->longUrl = $longUrl;
|
||||
}
|
||||
public function getLongUrl() {
|
||||
return $this->longUrl;
|
||||
}
|
||||
public function setId($id) {
|
||||
$this->id = $id;
|
||||
}
|
||||
public function getId() {
|
||||
return $this->id;
|
||||
}
|
||||
}
|
||||
|
||||
class UrlHistory extends apiModel {
|
||||
public $nextPageToken;
|
||||
protected $__itemsType = 'Url';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public $kind;
|
||||
public $itemsPerPage;
|
||||
public $totalItems;
|
||||
public function setNextPageToken($nextPageToken) {
|
||||
$this->nextPageToken = $nextPageToken;
|
||||
}
|
||||
public function getNextPageToken() {
|
||||
return $this->nextPageToken;
|
||||
}
|
||||
public function setItems(/* array(Url) */ $items) {
|
||||
$this->assertIsArray($items, 'Url', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setItemsPerPage($itemsPerPage) {
|
||||
$this->itemsPerPage = $itemsPerPage;
|
||||
}
|
||||
public function getItemsPerPage() {
|
||||
return $this->itemsPerPage;
|
||||
}
|
||||
public function setTotalItems($totalItems) {
|
||||
$this->totalItems = $totalItems;
|
||||
}
|
||||
public function getTotalItems() {
|
||||
return $this->totalItems;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright (c) 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiModel.php';
|
||||
require_once 'service/apiService.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
|
||||
|
||||
/**
|
||||
* The "webfonts" collection of methods.
|
||||
* Typical usage is:
|
||||
* <code>
|
||||
* $webfontsService = new apiWebfontsService(...);
|
||||
* $webfonts = $webfontsService->webfonts;
|
||||
* </code>
|
||||
*/
|
||||
class WebfontsServiceResource extends apiServiceResource {
|
||||
|
||||
|
||||
/**
|
||||
* Retrieves the list of fonts currently served by the Google Web Fonts Developer API
|
||||
* (webfonts.list)
|
||||
*
|
||||
* @param array $optParams Optional parameters. Valid optional parameters are listed below.
|
||||
*
|
||||
* @opt_param string sort Enables sorting of the list
|
||||
* @return WebfontList
|
||||
*/
|
||||
public function listWebfonts($optParams = array()) {
|
||||
$params = array();
|
||||
$params = array_merge($params, $optParams);
|
||||
$data = $this->__call('list', array($params));
|
||||
if ($this->useObjects()) {
|
||||
return new WebfontList($data);
|
||||
} else {
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Service definition for Webfonts (v1).
|
||||
*
|
||||
* <p>
|
||||
* The Google Web Fonts Developer API.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* For more information about this service, see the
|
||||
* <a href="http://code.google.com/apis/webfonts/docs/developer_api.html" target="_blank">API Documentation</a>
|
||||
* </p>
|
||||
*
|
||||
* @author Google, Inc.
|
||||
*/
|
||||
class apiWebfontsService extends apiService {
|
||||
public $webfonts;
|
||||
/**
|
||||
* Constructs the internal representation of the Webfonts service.
|
||||
*
|
||||
* @param apiClient apiClient
|
||||
*/
|
||||
public function __construct(apiClient $apiClient) {
|
||||
$this->rpcPath = '/rpc';
|
||||
$this->restBasePath = '/webfonts/v1/';
|
||||
$this->version = 'v1';
|
||||
$this->serviceName = 'webfonts';
|
||||
|
||||
$apiClient->addService($this->serviceName, $this->version);
|
||||
$this->webfonts = new WebfontsServiceResource($this, $this->serviceName, 'webfonts', json_decode('{"methods": {"list": {"parameters": {"sort": {"enum": ["alpha", "date", "popularity", "style", "trending"], "type": "string", "location": "query"}}, "id": "webfonts.webfonts.list", "httpMethod": "GET", "path": "webfonts", "response": {"$ref": "WebfontList"}}}}', true));
|
||||
}
|
||||
}
|
||||
|
||||
class Webfont extends apiModel {
|
||||
public $kind;
|
||||
public $variants;
|
||||
public $subsets;
|
||||
public $family;
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
public function setVariants($variants) {
|
||||
$this->variants = $variants;
|
||||
}
|
||||
public function getVariants() {
|
||||
return $this->variants;
|
||||
}
|
||||
public function setSubsets($subsets) {
|
||||
$this->subsets = $subsets;
|
||||
}
|
||||
public function getSubsets() {
|
||||
return $this->subsets;
|
||||
}
|
||||
public function setFamily($family) {
|
||||
$this->family = $family;
|
||||
}
|
||||
public function getFamily() {
|
||||
return $this->family;
|
||||
}
|
||||
}
|
||||
|
||||
class WebfontList extends apiModel {
|
||||
protected $__itemsType = 'Webfont';
|
||||
protected $__itemsDataType = 'array';
|
||||
public $items;
|
||||
public $kind;
|
||||
public function setItems(/* array(Webfont) */ $items) {
|
||||
$this->assertIsArray($items, 'Webfont', __METHOD__);
|
||||
$this->items = $items;
|
||||
}
|
||||
public function getItems() {
|
||||
return $this->items;
|
||||
}
|
||||
public function setKind($kind) {
|
||||
$this->kind = $kind;
|
||||
}
|
||||
public function getKind() {
|
||||
return $this->kind;
|
||||
}
|
||||
}
|
||||
+486
@@ -0,0 +1,486 @@
|
||||
<?php
|
||||
|
||||
/* Generic exception class
|
||||
*/
|
||||
class apiClientOAuthException extends Exception {
|
||||
// pass
|
||||
}
|
||||
|
||||
class apiClientOAuthConsumer {
|
||||
public $key;
|
||||
public $secret;
|
||||
|
||||
public function __construct($key, $secret, $callback_url=NULL) {
|
||||
$this->key = $key;
|
||||
$this->secret = $secret;
|
||||
$this->callback_url = $callback_url;
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthToken {
|
||||
// access tokens and request tokens
|
||||
public $key;
|
||||
public $secret;
|
||||
|
||||
/**
|
||||
* key = the token
|
||||
* secret = the token secret
|
||||
*/
|
||||
function __construct($key, $secret) {
|
||||
$this->key = $key;
|
||||
$this->secret = $secret;
|
||||
}
|
||||
|
||||
/**
|
||||
* generates the basic string serialization of a token that a server
|
||||
* would respond to request_token and access_token calls with
|
||||
*/
|
||||
function to_string() {
|
||||
return "oauth_token=" . apiClientOAuthUtil::urlencodeRFC3986($this->key) .
|
||||
"&oauth_token_secret=" . apiClientOAuthUtil::urlencodeRFC3986($this->secret);
|
||||
}
|
||||
|
||||
function __toString() {
|
||||
return $this->to_string();
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthSignatureMethod {
|
||||
public function check_signature(&$request, $consumer, $token, $signature) {
|
||||
$built = $this->build_signature($request, $consumer, $token);
|
||||
return $built == $signature;
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthSignatureMethod_HMAC_SHA1 extends apiClientOAuthSignatureMethod {
|
||||
function get_name() {
|
||||
return "HMAC-SHA1";
|
||||
}
|
||||
|
||||
public function build_signature($request, $consumer, $token, $privKey=NULL) {
|
||||
$base_string = $request->get_signature_base_string();
|
||||
$request->base_string = $base_string;
|
||||
|
||||
$key_parts = array(
|
||||
$consumer->secret,
|
||||
($token) ? $token->secret : ""
|
||||
);
|
||||
|
||||
$key_parts = array_map(array('apiClientOAuthUtil','urlencodeRFC3986'), $key_parts);
|
||||
$key = implode('&', $key_parts);
|
||||
|
||||
return base64_encode( hash_hmac('sha1', $base_string, $key, true));
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthSignatureMethod_RSA_SHA1 extends apiClientOAuthSignatureMethod {
|
||||
public function get_name() {
|
||||
return "RSA-SHA1";
|
||||
}
|
||||
|
||||
protected function fetch_public_cert(&$request) {
|
||||
// not implemented yet, ideas are:
|
||||
// (1) do a lookup in a table of trusted certs keyed off of consumer
|
||||
// (2) fetch via http using a url provided by the requester
|
||||
// (3) some sort of specific discovery code based on request
|
||||
//
|
||||
// either way should return a string representation of the certificate
|
||||
throw Exception("fetch_public_cert not implemented");
|
||||
}
|
||||
|
||||
protected function fetch_private_cert($privKey) {//&$request) {
|
||||
// not implemented yet, ideas are:
|
||||
// (1) do a lookup in a table of trusted certs keyed off of consumer
|
||||
//
|
||||
// either way should return a string representation of the certificate
|
||||
throw Exception("fetch_private_cert not implemented");
|
||||
}
|
||||
|
||||
public function build_signature(&$request, $consumer, $token, $privKey) {
|
||||
$base_string = $request->get_signature_base_string();
|
||||
|
||||
// Fetch the private key cert based on the request
|
||||
//$cert = $this->fetch_private_cert($consumer->privKey);
|
||||
|
||||
//Pull the private key ID from the certificate
|
||||
//$privatekeyid = openssl_get_privatekey($cert);
|
||||
|
||||
// hacked in
|
||||
if ($privKey == '') {
|
||||
$fp = fopen($GLOBALS['PRIV_KEY_FILE'], "r");
|
||||
$privKey = fread($fp, 8192);
|
||||
fclose($fp);
|
||||
}
|
||||
$privatekeyid = openssl_get_privatekey($privKey);
|
||||
|
||||
//Check the computer signature against the one passed in the query
|
||||
$ok = openssl_sign($base_string, $signature, $privatekeyid);
|
||||
|
||||
//Release the key resource
|
||||
openssl_free_key($privatekeyid);
|
||||
|
||||
return base64_encode($signature);
|
||||
}
|
||||
|
||||
public function check_signature(&$request, $consumer, $token, $signature) {
|
||||
$decoded_sig = base64_decode($signature);
|
||||
|
||||
$base_string = $request->get_signature_base_string();
|
||||
|
||||
// Fetch the public key cert based on the request
|
||||
$cert = $this->fetch_public_cert($request);
|
||||
|
||||
//Pull the public key ID from the certificate
|
||||
$publickeyid = openssl_get_publickey($cert);
|
||||
|
||||
//Check the computer signature against the one passed in the query
|
||||
$ok = openssl_verify($base_string, $decoded_sig, $publickeyid);
|
||||
|
||||
//Release the key resource
|
||||
openssl_free_key($publickeyid);
|
||||
|
||||
return $ok == 1;
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthRequest {
|
||||
private $parameters;
|
||||
private $http_method;
|
||||
private $http_url;
|
||||
// for debug purposes
|
||||
public $base_string;
|
||||
public static $version = '1.0';
|
||||
|
||||
function __construct($http_method, $http_url, $parameters=NULL) {
|
||||
@$parameters or $parameters = array();
|
||||
$this->parameters = $parameters;
|
||||
$this->http_method = $http_method;
|
||||
$this->http_url = $http_url;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* attempt to build up a request from what was passed to the server
|
||||
*/
|
||||
public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
|
||||
$scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") ? 'http' : 'https';
|
||||
@$http_url or $http_url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
@$http_method or $http_method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
$request_headers = apiClientOAuthRequest::get_headers();
|
||||
|
||||
// let the library user override things however they'd like, if they know
|
||||
// which parameters to use then go for it, for example XMLRPC might want to
|
||||
// do this
|
||||
if ($parameters) {
|
||||
$req = new apiClientOAuthRequest($http_method, $http_url, $parameters);
|
||||
}
|
||||
// next check for the auth header, we need to do some extra stuff
|
||||
// if that is the case, namely suck in the parameters from GET or POST
|
||||
// so that we can include them in the signature
|
||||
else if (@substr($request_headers['Authorization'], 0, 5) == "OAuth") {
|
||||
$header_parameters = apiClientOAuthRequest::split_header($request_headers['Authorization']);
|
||||
if ($http_method == "GET") {
|
||||
$req_parameters = $_GET;
|
||||
}
|
||||
else if ($http_method = "POST") {
|
||||
$req_parameters = $_POST;
|
||||
}
|
||||
$parameters = array_merge($header_parameters, $req_parameters);
|
||||
$req = new apiClientOAuthRequest($http_method, $http_url, $parameters);
|
||||
}
|
||||
else if ($http_method == "GET") {
|
||||
$req = new apiClientOAuthRequest($http_method, $http_url, $_GET);
|
||||
}
|
||||
else if ($http_method == "POST") {
|
||||
$req = new apiClientOAuthRequest($http_method, $http_url, $_POST);
|
||||
}
|
||||
return $req;
|
||||
}
|
||||
|
||||
/**
|
||||
* pretty much a helper function to set up the request
|
||||
*/
|
||||
public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
|
||||
@$parameters or $parameters = array();
|
||||
$defaults = array("oauth_version" => apiClientOAuthRequest::$version,
|
||||
"oauth_nonce" => apiClientOAuthRequest::generate_nonce(),
|
||||
"oauth_timestamp" => apiClientOAuthRequest::generate_timestamp(),
|
||||
"oauth_consumer_key" => $consumer->key);
|
||||
$parameters = array_merge($defaults, $parameters);
|
||||
|
||||
if ($token) {
|
||||
$parameters['oauth_token'] = $token->key;
|
||||
}
|
||||
|
||||
// oauth v1.0a
|
||||
/*if (isset($_REQUEST['oauth_verifier'])) {
|
||||
$parameters['oauth_verifier'] = $_REQUEST['oauth_verifier'];
|
||||
}*/
|
||||
|
||||
|
||||
return new apiClientOAuthRequest($http_method, $http_url, $parameters);
|
||||
}
|
||||
|
||||
public function set_parameter($name, $value) {
|
||||
$this->parameters[$name] = $value;
|
||||
}
|
||||
|
||||
public function get_parameter($name) {
|
||||
return $this->parameters[$name];
|
||||
}
|
||||
|
||||
public function get_parameters() {
|
||||
return $this->parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the normalized parameters of the request
|
||||
*
|
||||
* This will be all (except oauth_signature) parameters,
|
||||
* sorted first by key, and if duplicate keys, then by
|
||||
* value.
|
||||
*
|
||||
* The returned string will be all the key=value pairs
|
||||
* concated by &.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_signable_parameters() {
|
||||
// Grab all parameters
|
||||
$params = $this->parameters;
|
||||
|
||||
// Remove oauth_signature if present
|
||||
if (isset($params['oauth_signature'])) {
|
||||
unset($params['oauth_signature']);
|
||||
}
|
||||
|
||||
// Urlencode both keys and values
|
||||
$keys = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), array_keys($params));
|
||||
$values = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), array_values($params));
|
||||
$params = array_combine($keys, $values);
|
||||
|
||||
// Sort by keys (natsort)
|
||||
uksort($params, 'strnatcmp');
|
||||
|
||||
if(isset($params['title']) && isset($params['title-exact'])) {
|
||||
$temp = $params['title-exact'];
|
||||
$title = $params['title'];
|
||||
|
||||
unset($params['title']);
|
||||
unset($params['title-exact']);
|
||||
|
||||
$params['title-exact'] = $temp;
|
||||
$params['title'] = $title;
|
||||
}
|
||||
|
||||
// Generate key=value pairs
|
||||
$pairs = array();
|
||||
foreach ($params as $key=>$value ) {
|
||||
if (is_array($value)) {
|
||||
// If the value is an array, it's because there are multiple
|
||||
// with the same key, sort them, then add all the pairs
|
||||
natsort($value);
|
||||
foreach ($value as $v2) {
|
||||
$pairs[] = $key . '=' . $v2;
|
||||
}
|
||||
} else {
|
||||
$pairs[] = $key . '=' . $value;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the pairs, concated with &
|
||||
return implode('&', $pairs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the base string of this request
|
||||
*
|
||||
* The base string defined as the method, the url
|
||||
* and the parameters (normalized), each urlencoded
|
||||
* and the concated with &.
|
||||
*/
|
||||
public function get_signature_base_string() {
|
||||
$parts = array(
|
||||
$this->get_normalized_http_method(),
|
||||
$this->get_normalized_http_url(),
|
||||
$this->get_signable_parameters()
|
||||
);
|
||||
|
||||
$parts = array_map(array('apiClientOAuthUtil', 'urlencodeRFC3986'), $parts);
|
||||
|
||||
return implode('&', $parts);
|
||||
}
|
||||
|
||||
/**
|
||||
* just uppercases the http method
|
||||
*/
|
||||
public function get_normalized_http_method() {
|
||||
return strtoupper($this->http_method);
|
||||
}
|
||||
|
||||
/**
|
||||
* parses the url and rebuilds it to be
|
||||
* scheme://host/path
|
||||
*/
|
||||
public function get_normalized_http_url() {
|
||||
$parts = parse_url($this->http_url);
|
||||
|
||||
// FIXME: port should handle according to http://groups.google.com/group/oauth/browse_thread/thread/1b203a51d9590226
|
||||
$port = (isset($parts['port']) && $parts['port'] != '80') ? ':' . $parts['port'] : '';
|
||||
$path = (isset($parts['path'])) ? $parts['path'] : '';
|
||||
|
||||
return $parts['scheme'] . '://' . $parts['host'] . $port . $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds a url usable for a GET request
|
||||
*/
|
||||
public function to_url() {
|
||||
$out = $this->get_normalized_http_url() . "?";
|
||||
$out .= $this->to_postdata();
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the data one would send in a POST request
|
||||
*/
|
||||
public function to_postdata() {
|
||||
$total = array();
|
||||
foreach ($this->parameters as $k => $v) {
|
||||
$total[] = apiClientOAuthUtil::urlencodeRFC3986($k) . "=" . apiClientOAuthUtil::urlencodeRFC3986($v);
|
||||
}
|
||||
$out = implode("&", $total);
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* builds the Authorization: header
|
||||
*/
|
||||
public function to_header() {
|
||||
$out ='Authorization: OAuth ';
|
||||
$total = array();
|
||||
foreach ($this->parameters as $k => $v) {
|
||||
if (substr($k, 0, 5) != "oauth") continue;
|
||||
$out .= apiClientOAuthUtil::urlencodeRFC3986($k) . '="' . apiClientOAuthUtil::urlencodeRFC3986($v) . '", ';
|
||||
}
|
||||
$out = substr_replace($out, '', strlen($out) - 2);
|
||||
return $out;
|
||||
}
|
||||
|
||||
public function __toString() {
|
||||
return $this->to_url();
|
||||
}
|
||||
|
||||
|
||||
public function sign_request($signature_method, $consumer, $token, $privKey=NULL) {
|
||||
$this->set_parameter("oauth_signature_method", $signature_method->get_name());
|
||||
$signature = $this->build_signature($signature_method, $consumer, $token, $privKey);
|
||||
$this->set_parameter("oauth_signature", $signature);
|
||||
}
|
||||
|
||||
public function build_signature($signature_method, $consumer, $token, $privKey=NULL) {
|
||||
$signature = $signature_method->build_signature($this, $consumer, $token, $privKey);
|
||||
return $signature;
|
||||
}
|
||||
|
||||
/**
|
||||
* util function: current timestamp
|
||||
*/
|
||||
private static function generate_timestamp() {
|
||||
return time();
|
||||
}
|
||||
|
||||
/**
|
||||
* util function: current nonce
|
||||
*/
|
||||
private static function generate_nonce() {
|
||||
$mt = microtime();
|
||||
$rand = mt_rand();
|
||||
|
||||
return md5($mt . $rand); // md5s look nicer than numbers
|
||||
}
|
||||
|
||||
/**
|
||||
* util function for turning the Authorization: header into
|
||||
* parameters, has to do some unescaping
|
||||
*/
|
||||
private static function split_header($header) {
|
||||
// this should be a regex
|
||||
// error cases: commas in parameter values
|
||||
$parts = explode(",", $header);
|
||||
$out = array();
|
||||
foreach ($parts as $param) {
|
||||
$param = ltrim($param);
|
||||
// skip the "realm" param, nobody ever uses it anyway
|
||||
if (substr($param, 0, 5) != "oauth") continue;
|
||||
|
||||
$param_parts = explode("=", $param);
|
||||
|
||||
// rawurldecode() used because urldecode() will turn a "+" in the
|
||||
// value into a space
|
||||
$out[$param_parts[0]] = rawurldecode(substr($param_parts[1], 1, -1));
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to try to sort out headers for people who aren't running apache
|
||||
*/
|
||||
private static function get_headers() {
|
||||
if (function_exists('apache_request_headers')) {
|
||||
// we need this to get the actual Authorization: header
|
||||
// because apache tends to tell us it doesn't exist
|
||||
return apache_request_headers();
|
||||
}
|
||||
// otherwise we don't have apache and are just going to have to hope
|
||||
// that $_SERVER actually contains what we need
|
||||
$out = array();
|
||||
foreach ($_SERVER as $key => $value) {
|
||||
if (substr($key, 0, 5) == "HTTP_") {
|
||||
// this is chaos, basically it is just there to capitalize the first
|
||||
// letter of every word that is not an initial HTTP and strip HTTP
|
||||
// code from przemek
|
||||
$key = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($key, 5)))));
|
||||
$out[$key] = $value;
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
}
|
||||
|
||||
class apiClientOAuthDataStore {
|
||||
function lookup_consumer($consumer_key) {
|
||||
// implement me
|
||||
}
|
||||
|
||||
function lookup_token($consumer, $token_type, $token) {
|
||||
// implement me
|
||||
}
|
||||
|
||||
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
|
||||
// implement me
|
||||
}
|
||||
|
||||
function fetch_request_token($consumer) {
|
||||
// return a new token attached to this consumer
|
||||
}
|
||||
|
||||
function fetch_access_token($token, $consumer) {
|
||||
// return a new access token attached to this consumer
|
||||
// for the user associated with this token if the request token
|
||||
// is authorized
|
||||
// should also invalidate the request token
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class apiClientOAuthUtil {
|
||||
public static function urlencodeRFC3986($string) {
|
||||
return str_replace('%7E', '~', rawurlencode($string));
|
||||
}
|
||||
|
||||
public static function urldecodeRFC3986($string) {
|
||||
return rawurldecode($string);
|
||||
}
|
||||
}
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2010 Kevin M Burns Jr, http://kevburnsjr.com/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A URI Template Parser which is used by the apiREST class to resolve the REST requests
|
||||
* Blogpost: http://lab.kevburnsjr.com/php-uri-template-parser
|
||||
* Source: http://github.com/KevBurnsJr/php-uri-template-parser
|
||||
*/
|
||||
class URI_Template_Parser {
|
||||
|
||||
public static $operators = array('+', ';', '?', '/', '.');
|
||||
public static $reserved_operators = array('|', '!', '@');
|
||||
public static $explode_modifiers = array('+', '*');
|
||||
public static $partial_modifiers = array(':', '^');
|
||||
|
||||
public static $gen_delims = array(':', '/', '?', '#', '[', ']', '@');
|
||||
public static $gen_delims_pct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40');
|
||||
public static $sub_delims = array('!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=');
|
||||
public static $sub_delims_pct = array('%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D');
|
||||
public static $reserved;
|
||||
public static $reserved_pct;
|
||||
|
||||
public function __construct($template) {
|
||||
self::$reserved = array_merge(self::$gen_delims, self::$sub_delims);
|
||||
self::$reserved_pct = array_merge(self::$gen_delims_pct, self::$sub_delims_pct);
|
||||
$this->template = $template;
|
||||
}
|
||||
|
||||
public function expand($data) {
|
||||
// Modification to make this a bit more performant (since gettype is very slow)
|
||||
if (! is_array($data)) {
|
||||
$data = (array)$data;
|
||||
}
|
||||
/*
|
||||
// Original code, which uses a slow gettype() statement, kept in place for if the assumption that is_array always works here is incorrect
|
||||
switch (gettype($data)) {
|
||||
case "boolean":
|
||||
case "integer":
|
||||
case "double":
|
||||
case "string":
|
||||
case "object":
|
||||
$data = (array)$data;
|
||||
break;
|
||||
}
|
||||
*/
|
||||
|
||||
// Resolve template vars
|
||||
preg_match_all('/\{([^\}]*)\}/', $this->template, $em);
|
||||
|
||||
foreach ($em[1] as $i => $bare_expression) {
|
||||
preg_match('/^([\+\;\?\/\.]{1})?(.*)$/', $bare_expression, $lm);
|
||||
$exp = new StdClass();
|
||||
$exp->expression = $em[0][$i];
|
||||
$exp->operator = $lm[1];
|
||||
$exp->variable_list = $lm[2];
|
||||
$exp->varspecs = explode(',', $exp->variable_list);
|
||||
$exp->vars = array();
|
||||
foreach ($exp->varspecs as $varspec) {
|
||||
preg_match('/^([a-zA-Z0-9_]+)([\*\+]{1})?([\:\^][0-9-]+)?(\=[^,]+)?$/', $varspec, $vm);
|
||||
$var = new StdClass();
|
||||
$var->name = $vm[1];
|
||||
$var->modifier = isset($vm[2]) && $vm[2] ? $vm[2] : null;
|
||||
$var->modifier = isset($vm[3]) && $vm[3] ? $vm[3] : $var->modifier;
|
||||
$var->default = isset($vm[4]) ? substr($vm[4], 1) : null;
|
||||
$exp->vars[] = $var;
|
||||
}
|
||||
|
||||
// Add processing flags
|
||||
$exp->reserved = false;
|
||||
$exp->prefix = '';
|
||||
$exp->delimiter = ',';
|
||||
switch ($exp->operator) {
|
||||
case '+':
|
||||
$exp->reserved = 'true';
|
||||
break;
|
||||
case ';':
|
||||
$exp->prefix = ';';
|
||||
$exp->delimiter = ';';
|
||||
break;
|
||||
case '?':
|
||||
$exp->prefix = '?';
|
||||
$exp->delimiter = '&';
|
||||
break;
|
||||
case '/':
|
||||
$exp->prefix = '/';
|
||||
$exp->delimiter = '/';
|
||||
break;
|
||||
case '.':
|
||||
$exp->prefix = '.';
|
||||
$exp->delimiter = '.';
|
||||
break;
|
||||
}
|
||||
$expressions[] = $exp;
|
||||
}
|
||||
|
||||
// Expansion
|
||||
$this->expansion = $this->template;
|
||||
|
||||
foreach ($expressions as $exp) {
|
||||
$part = $exp->prefix;
|
||||
$exp->one_var_defined = false;
|
||||
foreach ($exp->vars as $var) {
|
||||
$val = '';
|
||||
if ($exp->one_var_defined && isset($data[$var->name])) {
|
||||
$part .= $exp->delimiter;
|
||||
}
|
||||
// Variable present
|
||||
if (isset($data[$var->name])) {
|
||||
$exp->one_var_defined = true;
|
||||
$var->data = $data[$var->name];
|
||||
|
||||
$val = self::val_from_var($var, $exp);
|
||||
|
||||
// Variable missing
|
||||
} else {
|
||||
if ($var->default) {
|
||||
$exp->one_var_defined = true;
|
||||
$val = $var->default;
|
||||
}
|
||||
}
|
||||
$part .= $val;
|
||||
}
|
||||
if (! $exp->one_var_defined) $part = '';
|
||||
$this->expansion = str_replace($exp->expression, $part, $this->expansion);
|
||||
}
|
||||
|
||||
return $this->expansion;
|
||||
}
|
||||
|
||||
private function val_from_var($var, $exp) {
|
||||
$val = '';
|
||||
if (is_array($var->data)) {
|
||||
$i = 0;
|
||||
if ($exp->operator == '?' && ! $var->modifier) {
|
||||
$val .= $var->name . '=';
|
||||
}
|
||||
foreach ($var->data as $k => $v) {
|
||||
$del = $var->modifier ? $exp->delimiter : ',';
|
||||
$ek = rawurlencode($k);
|
||||
$ev = rawurlencode($v);
|
||||
|
||||
// Array
|
||||
if ($k !== $i) {
|
||||
if ($var->modifier == '+') {
|
||||
$val .= $var->name . '.';
|
||||
}
|
||||
if ($exp->operator == '?' && $var->modifier || $exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+') {
|
||||
$val .= $ek . '=';
|
||||
} else {
|
||||
$val .= $ek . $del;
|
||||
}
|
||||
|
||||
// List
|
||||
} else {
|
||||
if ($var->modifier == '+') {
|
||||
if ($exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+' || $exp->operator == '?' && $var->modifier == '+') {
|
||||
$val .= $var->name . '=';
|
||||
} else {
|
||||
$val .= $var->name . '.';
|
||||
}
|
||||
}
|
||||
}
|
||||
$val .= $ev . $del;
|
||||
$i ++;
|
||||
}
|
||||
$val = trim($val, $del);
|
||||
|
||||
// Strings, numbers, etc.
|
||||
} else {
|
||||
if ($exp->operator == '?') {
|
||||
$val = $var->name . (isset($var->data) ? '=' : '');
|
||||
} else if ($exp->operator == ';') {
|
||||
$val = $var->name . ($var->data ? '=' : '');
|
||||
}
|
||||
$val .= rawurlencode($var->data);
|
||||
if ($exp->operator == '+') {
|
||||
$val = str_replace(self::$reserved_pct, self::$reserved, $val);
|
||||
}
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
public function match($uri) {}
|
||||
|
||||
public function __toString() {
|
||||
return $this->template;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* Implement the caching directives specified in rfc2616. This
|
||||
* implementation is guided by the guidance offered in rfc2616-sec13.
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
class apiCacheParser {
|
||||
public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD');
|
||||
public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301');
|
||||
|
||||
private function __construct() {}
|
||||
|
||||
/**
|
||||
* Check if an HTTP request can be cached by a private local cache.
|
||||
*
|
||||
* @static
|
||||
* @param apiHttpRequest $resp
|
||||
* @return bool True if the request is cacheable.
|
||||
* False if the request is uncacheable.
|
||||
*/
|
||||
public static function isRequestCacheable (apiHttpRequest $resp) {
|
||||
$method = $resp->getRequestMethod();
|
||||
if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Don't cache authorized requests/responses.
|
||||
// [rfc2616-14.8] When a shared cache receives a request containing an
|
||||
// Authorization field, it MUST NOT return the corresponding response
|
||||
// as a reply to any other request...
|
||||
if ($resp->getRequestHeader("authorization")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an HTTP response can be cached by a private local cache.
|
||||
*
|
||||
* @static
|
||||
* @param apiHttpRequest $resp
|
||||
* @return bool True if the response is cacheable.
|
||||
* False if the response is un-cacheable.
|
||||
*/
|
||||
public static function isResponseCacheable (apiHttpRequest $resp) {
|
||||
// First, check if the HTTP request was cacheable before inspecting the
|
||||
// HTTP response.
|
||||
if (false == self::isRequestCacheable($resp)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$code = $resp->getResponseHttpCode();
|
||||
if (! in_array($code, self::$CACHEABLE_STATUS_CODES)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The resource is uncacheable if the resource is already expired and
|
||||
// the resource doesn't have an ETag for revalidation.
|
||||
$etag = $resp->getResponseHeader("etag");
|
||||
if (self::isExpired($resp) && $etag == false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// [rfc2616-14.9.2] If [no-store is] sent in a response, a cache MUST NOT
|
||||
// store any part of either this response or the request that elicited it.
|
||||
$cacheControl = $resp->getParsedCacheControl();
|
||||
if (isset($cacheControl['no-store'])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Pragma: no-cache is an http request directive, but is occasionally
|
||||
// used as a response header incorrectly.
|
||||
$pragma = $resp->getResponseHeader('pragma');
|
||||
if ($pragma == 'no-cache' || strpos($pragma, 'no-cache') !== false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// [rfc2616-14.44] Vary: * is extremely difficult to cache. "It implies that
|
||||
// a cache cannot determine from the request headers of a subsequent request
|
||||
// whether this response is the appropriate representation."
|
||||
// Given this, we deem responses with the Vary header as uncacheable.
|
||||
$vary = $resp->getResponseHeader('vary');
|
||||
if ($vary) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @static
|
||||
* @param apiHttpRequest $resp
|
||||
* @return bool True if the HTTP response is considered to be expired.
|
||||
* False if it is considered to be fresh.
|
||||
*/
|
||||
public static function isExpired(apiHttpRequest $resp) {
|
||||
// HTTP/1.1 clients and caches MUST treat other invalid date formats,
|
||||
// especially including the value “0”, as in the past.
|
||||
$parsedExpires = false;
|
||||
$responseHeaders = $resp->getResponseHeaders();
|
||||
if (isset($responseHeaders['expires'])) {
|
||||
$rawExpires = $responseHeaders['expires'];
|
||||
// Check for a malformed expires header first.
|
||||
if (empty($rawExpires) || (is_numeric($rawExpires) && $rawExpires <= 0)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// See if we can parse the expires header.
|
||||
$parsedExpires = strtotime($rawExpires);
|
||||
if (false == $parsedExpires || $parsedExpires <= 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate the freshness of an http response.
|
||||
$freshnessLifetime = false;
|
||||
$cacheControl = $resp->getParsedCacheControl();
|
||||
if (isset($cacheControl['max-age'])) {
|
||||
$freshnessLifetime = $cacheControl['max-age'];
|
||||
}
|
||||
|
||||
$rawDate = $resp->getResponseHeader('date');
|
||||
$parsedDate = strtotime($rawDate);
|
||||
|
||||
if (empty($rawDate) || false == $parsedDate) {
|
||||
$parsedDate = time();
|
||||
}
|
||||
if (false == $freshnessLifetime && isset($responseHeaders['expires'])) {
|
||||
$freshnessLifetime = $parsedExpires - $parsedDate;
|
||||
}
|
||||
|
||||
if (false == $freshnessLifetime) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Calculate the age of an http response.
|
||||
$age = max(0, time() - $parsedDate);
|
||||
if (isset($responseHeaders['age'])) {
|
||||
$age = max($age, strtotime($responseHeaders['age']));
|
||||
}
|
||||
|
||||
return $freshnessLifetime <= $age;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a cache entry should be revalidated with by the origin.
|
||||
*
|
||||
* @param apiHttpRequest $response
|
||||
* @return bool True if the entry is expired, else return false.
|
||||
*/
|
||||
public static function mustRevalidate(apiHttpRequest $response) {
|
||||
// [13.3] When a cache has a stale entry that it would like to use as a
|
||||
// response to a client's request, it first has to check with the origin
|
||||
// server to see if its cached entry is still usable.
|
||||
return self::isExpired($response);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Curl based implementation of apiIO.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
|
||||
require_once 'apiCacheParser.php';
|
||||
|
||||
class apiCurlIO implements apiIO {
|
||||
const CONNECTION_ESTABLISHED = "HTTP/1.0 200 Connection established\r\n\r\n";
|
||||
const FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
||||
|
||||
private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null);
|
||||
private static $HOP_BY_HOP = array(
|
||||
'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization',
|
||||
'te', 'trailers', 'transfer-encoding', 'upgrade');
|
||||
|
||||
private static $DEFAULT_CURL_PARAMS = array (
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_FOLLOWLOCATION => 0,
|
||||
CURLOPT_FAILONERROR => false,
|
||||
CURLOPT_SSL_VERIFYPEER => true,
|
||||
CURLOPT_HEADER => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* Perform an authenticated / signed apiHttpRequest.
|
||||
* This function takes the apiHttpRequest, calls apiAuth->sign on it
|
||||
* (which can modify the request in what ever way fits the auth mechanism)
|
||||
* and then calls apiCurlIO::makeRequest on the signed request
|
||||
*
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest The resulting HTTP response including the
|
||||
* responseHttpCode, responseHeaders and responseBody.
|
||||
*/
|
||||
public function authenticatedRequest(apiHttpRequest $request) {
|
||||
$request = apiClient::$auth->sign($request);
|
||||
return $this->makeRequest($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a apiHttpRequest
|
||||
*
|
||||
* @param apiHttpRequest $request the http request to be executed
|
||||
* @return apiHttpRequest http request with the response http code, response
|
||||
* headers and response body filled in
|
||||
* @throws apiIOException on curl or IO error
|
||||
*/
|
||||
public function makeRequest(apiHttpRequest $request) {
|
||||
// First, check to see if we have a valid cached version.
|
||||
$cached = $this->getCachedRequest($request);
|
||||
if ($cached !== false) {
|
||||
if (apiCacheParser::mustRevalidate($cached)) {
|
||||
$addHeaders = array();
|
||||
if ($cached->getResponseHeader('etag')) {
|
||||
// [13.3.4] If an entity tag has been provided by the origin server,
|
||||
// we must use that entity tag in any cache-conditional request.
|
||||
$addHeaders['If-None-Match'] = $cached->getResponseHeader('etag');
|
||||
} elseif ($cached->getResponseHeader('date')) {
|
||||
$addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date');
|
||||
}
|
||||
|
||||
$request->setRequestHeaders($addHeaders);
|
||||
} else {
|
||||
// No need to revalidate the request, return it directly
|
||||
return $cached;
|
||||
}
|
||||
}
|
||||
|
||||
if (array_key_exists($request->getRequestMethod(),
|
||||
self::$ENTITY_HTTP_METHODS)) {
|
||||
$request = $this->processEntityRequest($request);
|
||||
}
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt_array($ch, self::$DEFAULT_CURL_PARAMS);
|
||||
curl_setopt($ch, CURLOPT_URL, $request->getUrl());
|
||||
if ($request->getPostBody()) {
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $request->getPostBody());
|
||||
}
|
||||
|
||||
$requestHeaders = $request->getRequestHeaders();
|
||||
if ($requestHeaders && is_array($requestHeaders)) {
|
||||
$parsed = array();
|
||||
foreach ($requestHeaders as $k => $v) {
|
||||
$parsed[] = "$k: $v";
|
||||
}
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $parsed);
|
||||
}
|
||||
|
||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, $request->getUserAgent());
|
||||
$respData = curl_exec($ch);
|
||||
|
||||
// Retry if certificates are missing.
|
||||
if (curl_errno($ch) == CURLE_SSL_CACERT) {
|
||||
error_log('SSL certificate problem, verify that the CA cert is OK.'
|
||||
. ' Retrying with the CA cert bundle from google-api-php-client.');
|
||||
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
|
||||
$respData = curl_exec($ch);
|
||||
}
|
||||
|
||||
$respHeaderSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
|
||||
$respHttpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$curlErrorNum = curl_errno($ch);
|
||||
$curlError = curl_error($ch);
|
||||
curl_close($ch);
|
||||
if ($curlErrorNum != CURLE_OK) {
|
||||
throw new apiIOException("HTTP Error: ($respHttpCode) $curlError");
|
||||
}
|
||||
|
||||
// Parse out the raw response into usable bits
|
||||
list($responseHeaders, $responseBody) =
|
||||
$this->parseHttpResponseBody($respData, $respHeaderSize);
|
||||
|
||||
if ($respHttpCode == 304 && $cached) {
|
||||
// If the server responded NOT_MODIFIED, return the cached request.
|
||||
if (isset($responseHeaders['connection'])) {
|
||||
$hopByHop = array_merge(
|
||||
self::$HOP_BY_HOP,
|
||||
explode(',', $responseHeaders['connection'])
|
||||
);
|
||||
|
||||
$endToEnd = array();
|
||||
foreach($hopByHop as $key) {
|
||||
if (isset($responseHeaders[$key])) {
|
||||
$endToEnd[$key] = $responseHeaders[$key];
|
||||
}
|
||||
}
|
||||
$cached->setResponseHeaders($endToEnd);
|
||||
}
|
||||
return $cached;
|
||||
}
|
||||
|
||||
// Fill in the apiHttpRequest with the response values
|
||||
$request->setResponseHttpCode($respHttpCode);
|
||||
$request->setResponseHeaders($responseHeaders);
|
||||
$request->setResponseBody($responseBody);
|
||||
// Store the request in cache (the function checks to see if the request
|
||||
// can actually be cached)
|
||||
$this->setCachedRequest($request);
|
||||
// And finally return it
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* @visible for testing.
|
||||
* Cache the response to an HTTP request if it is cacheable.
|
||||
* @param apiHttpRequest $request
|
||||
* @return bool Returns true if the insertion was successful.
|
||||
* Otherwise, return false.
|
||||
*/
|
||||
public function setCachedRequest(apiHttpRequest $request) {
|
||||
// Determine if the request is cacheable.
|
||||
if (apiCacheParser::isResponseCacheable($request)) {
|
||||
apiClient::$cache->set($request->getCacheKey(), $request);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @visible for testing.
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest|bool Returns the cached object or
|
||||
* false if the operation was unsuccessful.
|
||||
*/
|
||||
public function getCachedRequest(apiHttpRequest $request) {
|
||||
if (false == apiCacheParser::isRequestCacheable($request)) {
|
||||
false;
|
||||
}
|
||||
|
||||
return apiClient::$cache->get($request->getCacheKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $respData
|
||||
* @param $headerSize
|
||||
* @return array
|
||||
*/
|
||||
public function parseHttpResponseBody($respData, $headerSize) {
|
||||
if (stripos($respData, self::CONNECTION_ESTABLISHED) !== false) {
|
||||
$respData = str_ireplace(self::CONNECTION_ESTABLISHED, '', $respData);
|
||||
}
|
||||
|
||||
$responseBody = substr($respData, $headerSize);
|
||||
$responseHeaderLines = explode("\r\n", substr($respData, 0, $headerSize));
|
||||
$responseHeaders = array();
|
||||
|
||||
foreach ($responseHeaderLines as $headerLine) {
|
||||
if ($headerLine && strpos($headerLine, ':') !== false) {
|
||||
list($header, $value) = explode(': ', $headerLine, 2);
|
||||
$header = strtolower($header);
|
||||
if (isset($responseHeaders[$header])) {
|
||||
$responseHeaders[$header] .= "\n" . $value;
|
||||
} else {
|
||||
$responseHeaders[$header] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array($responseHeaders, $responseBody);
|
||||
}
|
||||
|
||||
/**
|
||||
* @visible for testing
|
||||
* Process an http request that contains an enclosed entity.
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest Processed request with the enclosed entity.
|
||||
*/
|
||||
public function processEntityRequest(apiHttpRequest $request) {
|
||||
$postBody = $request->getPostBody();
|
||||
$contentType = $request->getRequestHeader("content-type");
|
||||
|
||||
// Set the default content-type as application/x-www-form-urlencoded.
|
||||
if (false == $contentType) {
|
||||
$contentType = self::FORM_URLENCODED;
|
||||
$request->setRequestHeaders(array('content-type' => $contentType));
|
||||
}
|
||||
|
||||
// Force the payload to match the content-type asserted in the header.
|
||||
if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
|
||||
$postBody = http_build_query($postBody, '', '&');
|
||||
$request->setPostBody($postBody);
|
||||
}
|
||||
|
||||
// Make sure the content-length header is set.
|
||||
if (!$postBody || is_string($postBody)) {
|
||||
$postsLength = strlen($postBody);
|
||||
$request->setRequestHeaders(array('content-length' => $postsLength));
|
||||
}
|
||||
|
||||
return $request;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HTTP Request to be executed by apiIO classes. Upon execution, the
|
||||
* responseHttpCode, responseHeaders and responseBody will be filled in.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiHttpRequest {
|
||||
const USER_AGENT_SUFFIX = "google-api-php-client/0.5.0";
|
||||
|
||||
protected $url;
|
||||
protected $requestMethod;
|
||||
protected $requestHeaders;
|
||||
protected $postBody;
|
||||
protected $userAgent;
|
||||
|
||||
protected $responseHttpCode;
|
||||
protected $responseHeaders;
|
||||
protected $responseBody;
|
||||
|
||||
public $accessKey;
|
||||
|
||||
public function __construct($url, $method = 'GET', $headers = array(), $postBody = null) {
|
||||
$this->url = $url;
|
||||
$this->setRequestMethod($method);
|
||||
$this->setRequestHeaders($headers);
|
||||
$this->setPostBody($postBody);
|
||||
|
||||
global $apiConfig;
|
||||
if (empty($apiConfig['application_name'])) {
|
||||
$this->userAgent = self::USER_AGENT_SUFFIX;
|
||||
} else {
|
||||
$this->userAgent = $apiConfig['application_name'] . " " . self::USER_AGENT_SUFFIX;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Misc function that returns the base url component of the $url
|
||||
* used by the OAuth signing class to calculate the base string
|
||||
* @return string The base url component of the $url.
|
||||
* @see http://oauth.net/core/1.0a/#anchor13
|
||||
*/
|
||||
public function getBaseUrl() {
|
||||
if ($pos = strpos($this->url, '?')) {
|
||||
return substr($this->url, 0, $pos);
|
||||
}
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Misc function that returns an array of the query parameters of the current
|
||||
* url used by the OAuth signing class to calculate the signature
|
||||
* @return array Query parameters in the query string.
|
||||
*/
|
||||
public function getQueryParams() {
|
||||
if ($pos = strpos($this->url, '?')) {
|
||||
$queryStr = substr($this->url, $pos + 1);
|
||||
$params = array();
|
||||
parse_str($queryStr, $params);
|
||||
return $params;
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string HTTP Response Code.
|
||||
*/
|
||||
public function getResponseHttpCode() {
|
||||
return (int) $this->responseHttpCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $responseHttpCode HTTP Response Code.
|
||||
*/
|
||||
public function setResponseHttpCode($responseHttpCode) {
|
||||
$this->responseHttpCode = $responseHttpCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $responseHeaders (array) HTTP Response Headers.
|
||||
*/
|
||||
public function getResponseHeaders() {
|
||||
return $this->responseHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string HTTP Response Body
|
||||
*/
|
||||
public function getResponseBody() {
|
||||
return $this->responseBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $headers The HTTP response headers
|
||||
* to be normalized.
|
||||
*/
|
||||
public function setResponseHeaders($headers) {
|
||||
$headers = apiUtils::normalize($headers);
|
||||
if ($this->responseHeaders) {
|
||||
$headers = array_merge($this->responseHeaders, $headers);
|
||||
}
|
||||
|
||||
$this->responseHeaders = $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $key
|
||||
* @return array|boolean Returns the requested HTTP header or
|
||||
* false if unavailable.
|
||||
*/
|
||||
public function getResponseHeader($key) {
|
||||
return isset($this->responseHeaders[$key])
|
||||
? $this->responseHeaders[$key]
|
||||
: false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $responseBody The HTTP response body.
|
||||
*/
|
||||
public function setResponseBody($responseBody) {
|
||||
$this->responseBody = $responseBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $url The request URL.
|
||||
*/
|
||||
|
||||
public function getUrl() {
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $method HTTP Request Method.
|
||||
*/
|
||||
public function getRequestMethod() {
|
||||
return $this->requestMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array $headers HTTP Request Headers.
|
||||
*/
|
||||
public function getRequestHeaders() {
|
||||
return $this->requestHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $key
|
||||
* @return array|boolean Returns the requested HTTP header or
|
||||
* false if unavailable.
|
||||
*/
|
||||
public function getRequestHeader($key) {
|
||||
return isset($this->requestHeaders[$key])
|
||||
? $this->requestHeaders[$key]
|
||||
: false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $postBody HTTP Request Body.
|
||||
*/
|
||||
public function getPostBody() {
|
||||
return $this->postBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url the url to set
|
||||
*/
|
||||
public function setUrl($url) {
|
||||
$this->url = $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method Set he HTTP Method and normalize
|
||||
* it to upper-case, as required by HTTP.
|
||||
*
|
||||
*/
|
||||
public function setRequestMethod($method) {
|
||||
$this->requestMethod = strtoupper($method);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $headers The HTTP request headers
|
||||
* to be set and normalized.
|
||||
*/
|
||||
public function setRequestHeaders($headers) {
|
||||
$headers = apiUtils::normalize($headers);
|
||||
if ($this->requestHeaders) {
|
||||
$headers = array_merge($this->requestHeaders, $headers);
|
||||
}
|
||||
$this->requestHeaders = $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $postBody the postBody to set
|
||||
*/
|
||||
public function setPostBody($postBody) {
|
||||
$this->postBody = $postBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the User-Agent Header.
|
||||
* @param string $userAgent The User-Agent.
|
||||
*/
|
||||
public function setUserAgent($userAgent) {
|
||||
$this->userAgent = $userAgent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string The User-Agent.
|
||||
*/
|
||||
public function getUserAgent() {
|
||||
return $this->userAgent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a cache key depending on if this was an OAuth signed request
|
||||
* in which case it will use the non-signed url and access key to make this
|
||||
* cache key unique per authenticated user, else use the plain request url
|
||||
* @return The md5 hash of the request cache key.
|
||||
*/
|
||||
public function getCacheKey() {
|
||||
$key = $this->getUrl();
|
||||
|
||||
if (isset($this->accessKey)) {
|
||||
$key .= $this->accessKey;
|
||||
}
|
||||
|
||||
if (isset($this->requestHeaders['authorization'])) {
|
||||
$key .= $this->requestHeaders['authorization'];
|
||||
}
|
||||
|
||||
return md5($key);
|
||||
}
|
||||
|
||||
public function getParsedCacheControl() {
|
||||
$parsed = array();
|
||||
$rawCacheControl = $this->getResponseHeader('cache-control');
|
||||
if ($rawCacheControl) {
|
||||
$rawCacheControl = str_replace(", ", "&", $rawCacheControl);
|
||||
parse_str($rawCacheControl, $parsed);
|
||||
}
|
||||
|
||||
return $parsed;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once 'io/apiHttpRequest.php';
|
||||
require_once 'io/apiCurlIO.php';
|
||||
require_once 'io/apiREST.php';
|
||||
require_once 'io/apiRPC.php';
|
||||
|
||||
/**
|
||||
* Abstract IO class
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
interface apiIO {
|
||||
/**
|
||||
* An utility function that first calls $this->auth->sign($request) and then executes makeRequest()
|
||||
* on that signed request. Used for when a request should be authenticated
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest $request
|
||||
*/
|
||||
public function authenticatedRequest(apiHttpRequest $request);
|
||||
|
||||
/**
|
||||
* Executes a apIHttpRequest and returns the resulting populated httpRequest
|
||||
* @param apiHttpRequest $request
|
||||
* @return apiHttpRequest $request
|
||||
*/
|
||||
public function makeRequest(apiHttpRequest $request);
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once "external/URITemplateParser.php";
|
||||
require_once "service/apiUtils.php";
|
||||
|
||||
/**
|
||||
* This class implements the RESTful transport of apiServiceRequest()'s
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
class apiREST {
|
||||
/**
|
||||
* Executes a apiServiceRequest using a RESTful call by transforming it into
|
||||
* an apiHttpRequest, and executed via apiIO::authenticatedRequest().
|
||||
*
|
||||
* @param apiServiceRequest $req
|
||||
* @return array decoded result
|
||||
* @throws apiServiceException on server side error (ie: not authenticated, invalid or
|
||||
* malformed post body, invalid url)
|
||||
*/
|
||||
static public function execute(apiServiceRequest $req) {
|
||||
$result = null;
|
||||
$postBody = $req->getPostBody();
|
||||
$url = self::createRequestUri(
|
||||
$req->getRestBasePath(), $req->getRestPath(), $req->getParameters());
|
||||
|
||||
$httpRequest = new apiHttpRequest($url, $req->getHttpMethod(), null, $postBody);
|
||||
if ($postBody) {
|
||||
$contentTypeHeader = array();
|
||||
if (isset($req->contentType) && $req->contentType) {
|
||||
$contentTypeHeader['content-type'] = $req->contentType;
|
||||
} else {
|
||||
$contentTypeHeader['content-type'] = 'application/json; charset=UTF-8';
|
||||
$contentTypeHeader['content-length'] = apiUtils::getStrLen($postBody);
|
||||
}
|
||||
$httpRequest->setRequestHeaders($contentTypeHeader);
|
||||
}
|
||||
|
||||
$httpRequest = apiClient::$io->authenticatedRequest($httpRequest);
|
||||
$decodedResponse = self::decodeHttpResponse($httpRequest);
|
||||
|
||||
//FIXME currently everything is wrapped in a data envelope, but hopefully this might change some day
|
||||
$ret = isset($decodedResponse['data']) ? $decodedResponse['data'] : $decodedResponse;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decode an HTTP Response.
|
||||
* @static
|
||||
* @throws apiServiceException
|
||||
* @param apiHttpRequest $response The http response to be decoded.
|
||||
* @return mixed|null
|
||||
*/
|
||||
static function decodeHttpResponse($response) {
|
||||
$code = $response->getResponseHttpCode();
|
||||
$body = $response->getResponseBody();
|
||||
$decoded = null;
|
||||
|
||||
if ($code != '200' && $code != '201' && $code != '204') {
|
||||
$decoded = json_decode($body, true);
|
||||
$err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl();
|
||||
if ($decoded != null && isset($decoded['error']['message']) && isset($decoded['error']['code'])) {
|
||||
// if we're getting a json encoded error definition, use that instead of the raw response
|
||||
// body for improved readability
|
||||
$err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}";
|
||||
} else {
|
||||
$err .= ": ($code) $body";
|
||||
}
|
||||
throw new apiServiceException($err, $code);
|
||||
}
|
||||
|
||||
// Only attempt to decode the response, if the response code wasn't (204) 'no content'
|
||||
if ($code != '204') {
|
||||
$decoded = json_decode($body, true);
|
||||
if ($decoded == null) {
|
||||
throw new apiServiceException("Invalid json in service response: $body");
|
||||
}
|
||||
}
|
||||
return $decoded;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse/expand request parameters and create a fully qualified
|
||||
* request uri.
|
||||
* @static
|
||||
* @param string $basePath
|
||||
* @param string $restPath
|
||||
* @param array $params
|
||||
* @return string $requestUrl
|
||||
*/
|
||||
static function createRequestUri($basePath, $restPath, $params) {
|
||||
$requestUrl = $basePath . $restPath;
|
||||
$uriTemplateVars = array();
|
||||
$queryVars = array();
|
||||
foreach ($params as $paramName => $paramSpec) {
|
||||
// Discovery v1.0 puts the canonical location under the 'location' field.
|
||||
if (! isset($paramSpec['location'])) {
|
||||
$paramSpec['location'] = $paramSpec['restParameterType'];
|
||||
}
|
||||
|
||||
if ($paramSpec['type'] == 'boolean') {
|
||||
$paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false';
|
||||
}
|
||||
if ($paramSpec['location'] == 'path') {
|
||||
$uriTemplateVars[$paramName] = $paramSpec['value'];
|
||||
} else {
|
||||
if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) {
|
||||
foreach ($paramSpec['value'] as $value) {
|
||||
$queryVars[] = $paramName . '=' . rawurlencode($value);
|
||||
}
|
||||
} else {
|
||||
$queryVars[] = $paramName . '=' . rawurlencode($paramSpec['value']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($uriTemplateVars)) {
|
||||
$uriTemplateParser = new URI_Template_Parser($requestUrl);
|
||||
$requestUrl = $uriTemplateParser->expand($uriTemplateVars);
|
||||
}
|
||||
//FIXME work around for the the uri template lib which url encodes
|
||||
// the @'s & confuses our servers.
|
||||
$requestUrl = str_replace('%40', '@', $requestUrl);
|
||||
|
||||
if (count($queryVars)) {
|
||||
$requestUrl .= '?' . implode($queryVars, '&');
|
||||
}
|
||||
|
||||
return $requestUrl;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class implements the experimental JSON-RPC transport for executing apiServiceRequest'
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
class apiRPC {
|
||||
static public function execute($requests) {
|
||||
$jsonRpcRequest = array();
|
||||
foreach ($requests as $request) {
|
||||
$parameters = array();
|
||||
foreach ($request->getParameters() as $parameterName => $parameterVal) {
|
||||
$parameters[$parameterName] = $parameterVal['value'];
|
||||
}
|
||||
$jsonRpcRequest[] = array(
|
||||
'id' => $request->getBatchKey(),
|
||||
'method' => $request->getRpcName(),
|
||||
'params' => $parameters,
|
||||
'apiVersion' => 'v1'
|
||||
);
|
||||
}
|
||||
$httpRequest = new apiHttpRequest($request->getRpcPath());
|
||||
$httpRequest->setRequestHeaders(array('Content-Type' => 'application/json'));
|
||||
$httpRequest->setRequestMethod('POST');
|
||||
$httpRequest->setPostBody(json_encode($jsonRpcRequest));
|
||||
$httpRequest = apiClient::$io->authenticatedRequest($httpRequest);
|
||||
if (($decodedResponse = json_decode($httpRequest->getResponseBody(), true)) != false) {
|
||||
$ret = array();
|
||||
foreach ($decodedResponse as $response) {
|
||||
$ret[$response['id']] = self::checkNextLink($response['result']);
|
||||
}
|
||||
return $ret;
|
||||
} else {
|
||||
throw new apiServiceException("Invalid json returned by the json-rpc end-point");
|
||||
}
|
||||
}
|
||||
|
||||
static private function checkNextLink($response) {
|
||||
if (isset($response['links']) && isset($response['links']['next'][0]['href'])) {
|
||||
parse_str($response['links']['next'][0]['href'], $params);
|
||||
if (isset($params['c'])) {
|
||||
$response['continuationToken'] = $params['c'];
|
||||
}
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,714 @@
|
||||
# Certifcate Authority certificates for validating SSL connections.
|
||||
#
|
||||
# This file contains PEM format certificates generated from
|
||||
# http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is the Netscape security libraries.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1994-2000
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
Verisign/RSA Secure Server CA
|
||||
=============================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
|
||||
A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
|
||||
VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
|
||||
MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
|
||||
BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
|
||||
dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
|
||||
ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
|
||||
0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
|
||||
uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
|
||||
hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
|
||||
YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
|
||||
1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Personal Basic CA
|
||||
========================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
|
||||
VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
|
||||
ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
|
||||
IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
|
||||
DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
|
||||
EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
|
||||
ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
|
||||
dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
|
||||
QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
|
||||
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
|
||||
dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
|
||||
wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
|
||||
G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
|
||||
AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
|
||||
c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
|
||||
9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Personal Premium CA
|
||||
==========================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
|
||||
VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
|
||||
ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
|
||||
dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
|
||||
bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
|
||||
QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
|
||||
BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
|
||||
IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
|
||||
bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
|
||||
Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
|
||||
Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
|
||||
Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
|
||||
ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
||||
SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
|
||||
b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
|
||||
KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Personal Freemail CA
|
||||
===========================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
|
||||
VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
|
||||
ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
|
||||
YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
|
||||
Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
|
||||
AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
|
||||
MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
|
||||
b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
|
||||
cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
|
||||
d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
|
||||
DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
|
||||
rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
|
||||
uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
|
||||
BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
|
||||
MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
|
||||
/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
|
||||
gQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Server CA
|
||||
================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
||||
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
||||
biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
|
||||
MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
|
||||
MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
|
||||
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
|
||||
dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
|
||||
cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
|
||||
DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
|
||||
gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
|
||||
yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
|
||||
L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
|
||||
EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
|
||||
7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
|
||||
QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
|
||||
qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Premium Server CA
|
||||
========================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
|
||||
VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
|
||||
biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
|
||||
dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
|
||||
MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
|
||||
MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
|
||||
A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
|
||||
b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
|
||||
cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
|
||||
bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
|
||||
VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
|
||||
ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
|
||||
uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
|
||||
9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
|
||||
hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
|
||||
pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Equifax Secure CA
|
||||
=================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
||||
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
||||
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
||||
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
||||
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
||||
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
||||
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
||||
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
||||
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
||||
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
||||
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
||||
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
||||
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
||||
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
||||
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
||||
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 1 Public Primary Certification Authority
|
||||
=======================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
|
||||
c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
|
||||
NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
|
||||
VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
|
||||
bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
|
||||
jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
|
||||
H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
|
||||
4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
|
||||
BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
|
||||
EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
|
||||
FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
|
||||
lA==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 2 Public Primary Certification Authority
|
||||
=======================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
|
||||
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
||||
cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
||||
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
||||
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
|
||||
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
||||
ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
|
||||
YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
|
||||
FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
|
||||
CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
|
||||
J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
|
||||
r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 3 Public Primary Certification Authority
|
||||
=======================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
|
||||
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
||||
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
||||
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
||||
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
||||
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
||||
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
||||
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
||||
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
||||
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
|
||||
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
|
||||
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 1 Public Primary Certification Authority - G2
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
||||
c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
||||
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
||||
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
||||
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
|
||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
||||
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
||||
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
||||
AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
|
||||
VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
|
||||
Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
|
||||
AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
|
||||
h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
|
||||
uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
|
||||
DzFc6PLZ
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 2 Public Primary Certification Authority - G2
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
|
||||
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
|
||||
YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
|
||||
MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
|
||||
aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
|
||||
Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
|
||||
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
|
||||
IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
|
||||
KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
||||
eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
|
||||
HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
|
||||
DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
|
||||
AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
|
||||
nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
|
||||
rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
|
||||
jBJ7xUS0rg==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 3 Public Primary Certification Authority - G2
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
||||
c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
||||
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
||||
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
||||
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
|
||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
||||
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
||||
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
||||
AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
|
||||
pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
|
||||
13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
|
||||
AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
|
||||
U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
|
||||
F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
|
||||
oJ2daZH9
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 4 Public Primary Certification Authority - G2
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
||||
c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
||||
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
||||
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
||||
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
|
||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
||||
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
||||
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
||||
AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
|
||||
HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
|
||||
qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
|
||||
AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
|
||||
cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
|
||||
cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
|
||||
T8qAkbYp
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 1 Public Primary Certification Authority - G3
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
||||
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
||||
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
||||
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
||||
aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
||||
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
||||
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
||||
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
||||
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
||||
IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
||||
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
|
||||
nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
|
||||
8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
|
||||
ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
|
||||
PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
|
||||
6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
|
||||
n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
|
||||
qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
|
||||
wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
|
||||
ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
|
||||
pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
|
||||
E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 2 Public Primary Certification Authority - G3
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
|
||||
aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
|
||||
IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
|
||||
Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
||||
eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
|
||||
BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
|
||||
Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
|
||||
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
|
||||
Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
|
||||
IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
|
||||
J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
|
||||
JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
|
||||
wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
|
||||
koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
|
||||
qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
|
||||
Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
|
||||
xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
|
||||
7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
|
||||
sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
|
||||
sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
|
||||
cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 3 Public Primary Certification Authority - G3
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
||||
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
||||
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
||||
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
||||
aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
||||
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
||||
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
||||
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
||||
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
||||
IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
||||
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
|
||||
N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
|
||||
KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
|
||||
kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
|
||||
CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
|
||||
Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
|
||||
imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
|
||||
2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
|
||||
DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
||||
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
|
||||
F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
|
||||
TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Verisign Class 4 Public Primary Certification Authority - G3
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
|
||||
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
|
||||
cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
|
||||
LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
|
||||
aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
||||
dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
|
||||
VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
||||
aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
|
||||
bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
|
||||
IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
|
||||
LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
|
||||
GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
|
||||
+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
|
||||
U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
|
||||
NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
|
||||
ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
|
||||
ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
|
||||
CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
|
||||
g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
||||
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
|
||||
2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
|
||||
bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Equifax Secure Global eBusiness CA
|
||||
==================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
|
||||
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
|
||||
ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
|
||||
MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
|
||||
dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
|
||||
c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
|
||||
UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
|
||||
58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
|
||||
o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
|
||||
MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
|
||||
aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
|
||||
A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
|
||||
Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
|
||||
8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Equifax Secure eBusiness CA 1
|
||||
=============================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
|
||||
MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
|
||||
ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
|
||||
MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
|
||||
LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
|
||||
KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
|
||||
RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
|
||||
WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
|
||||
Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
|
||||
AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
|
||||
eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
|
||||
zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
|
||||
WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
|
||||
/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Equifax Secure eBusiness CA 2
|
||||
=============================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
||||
UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
|
||||
dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
|
||||
NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
|
||||
VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
|
||||
vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
|
||||
BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
|
||||
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
|
||||
MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
|
||||
IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
|
||||
NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
|
||||
y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
|
||||
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
||||
A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
|
||||
0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
|
||||
E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Thawte Time Stamping CA
|
||||
=======================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
|
||||
FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
|
||||
BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
|
||||
BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
|
||||
MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
|
||||
Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
|
||||
A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
|
||||
c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
|
||||
6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
|
||||
Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
|
||||
8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
|
||||
Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
|
||||
9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
|
||||
pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
|
||||
CayJSdM=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
thawte Primary Root CA
|
||||
======================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
|
||||
qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
|
||||
Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
|
||||
MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
|
||||
BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
|
||||
NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
|
||||
LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
|
||||
A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
||||
IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
|
||||
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
|
||||
W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
|
||||
3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
|
||||
6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
|
||||
Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
|
||||
NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
|
||||
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
|
||||
r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
|
||||
DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
|
||||
YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
|
||||
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
|
||||
/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
|
||||
LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
|
||||
jVaMaA==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
VeriSign Class 3 Public Primary Certification Authority - G5
|
||||
============================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
|
||||
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
||||
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
|
||||
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
|
||||
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
|
||||
aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
|
||||
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
|
||||
ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
|
||||
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
|
||||
U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
|
||||
aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
|
||||
nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
|
||||
t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
|
||||
SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
|
||||
BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
|
||||
rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
|
||||
NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
|
||||
BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
|
||||
BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
||||
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
|
||||
MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
|
||||
p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
|
||||
5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
|
||||
WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
|
||||
4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
|
||||
hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Entrust.net Secure Server Certification Authority
|
||||
=================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
||||
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
||||
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
||||
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
||||
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
|
||||
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
|
||||
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
|
||||
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
||||
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
|
||||
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
|
||||
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
|
||||
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
|
||||
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
|
||||
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
|
||||
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
|
||||
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
|
||||
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
|
||||
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
|
||||
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
||||
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
|
||||
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
|
||||
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
|
||||
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
|
||||
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
|
||||
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
|
||||
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Go Daddy Certification Authority Root Certificate Bundle
|
||||
========================================================
|
||||
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
|
||||
ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
|
||||
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
|
||||
MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
|
||||
QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
|
||||
b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
|
||||
b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
|
||||
YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
|
||||
AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
|
||||
KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
|
||||
VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
|
||||
SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
|
||||
cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
|
||||
6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
|
||||
MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
|
||||
kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
|
||||
BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
|
||||
BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
|
||||
c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
|
||||
AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
|
||||
BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
|
||||
OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
|
||||
A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
|
||||
0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
|
||||
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
|
||||
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
|
||||
U+4=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
|
||||
bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
|
||||
Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
|
||||
QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
|
||||
BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
|
||||
DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
|
||||
YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
|
||||
aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
|
||||
ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
|
||||
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
|
||||
N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
|
||||
r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
|
||||
f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
|
||||
U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
|
||||
TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
|
||||
VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
|
||||
SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
|
||||
biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
|
||||
MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
|
||||
AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
|
||||
ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
|
||||
Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
|
||||
IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
|
||||
bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
|
||||
QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
|
||||
WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
|
||||
SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
|
||||
IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
|
||||
BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
|
||||
aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
|
||||
9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
|
||||
NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
|
||||
azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
||||
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
|
||||
Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
|
||||
cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
|
||||
dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
|
||||
WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
|
||||
v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
|
||||
UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
|
||||
IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
|
||||
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Wrapper for the (experimental!) JSON-RPC protocol, for production use regular REST calls instead
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*/
|
||||
class apiBatch {
|
||||
|
||||
/**
|
||||
* Execute one or multiple Google API requests, takes one or multiple requests as param
|
||||
* Example usage:
|
||||
* $ret = apiBatch::execute(
|
||||
* $apiClient->activities->list(array('@public', '@me'), 'listActivitiesKey'),
|
||||
* $apiClient->people->get(array('userId' => '@me'), 'getPeopleKey')
|
||||
* );
|
||||
* print_r($ret['getPeopleKey']);
|
||||
*/
|
||||
static public function execute( /* polymorphic */) {
|
||||
$requests = func_get_args();
|
||||
return apiRPC::execute($requests);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiMediaFileUpload {
|
||||
public $mimeType;
|
||||
public $fileName;
|
||||
public $chunkSize;
|
||||
|
||||
public static function process($metadata, $method, &$params) {
|
||||
$payload = array();
|
||||
|
||||
$data = isset($params['data']) ? $params['data']['value'] : false;
|
||||
$mimeType = isset($params['mimeType']) ? $params['mimeType']['value'] : false;
|
||||
$file = isset($params['file']) ? $params['file']['value'] : false;
|
||||
$uploadPath = $method['mediaUpload']['protocols']['simple']['path'];
|
||||
|
||||
unset($params['data']);
|
||||
unset($params['mimeType']);
|
||||
unset($params['file']);
|
||||
|
||||
if ($file) {
|
||||
if (substr($file, 0, 1) != '@') {
|
||||
$file = '@' . $file;
|
||||
}
|
||||
$payload['file'] = $file;
|
||||
$payload['content-type'] = 'multipart/form-data';
|
||||
$payload['restBasePath'] = $uploadPath;
|
||||
|
||||
// This is a standard file upload with curl.
|
||||
return $payload;
|
||||
}
|
||||
|
||||
$parsedMeta = is_string($metadata) ? json_decode($metadata, true) : $metadata;
|
||||
if ($metadata && false == $data) {
|
||||
// Process as a normal API request.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Process as a media upload request.
|
||||
$params['uploadType'] = array(
|
||||
'type' => 'string',
|
||||
'location' => 'query',
|
||||
'value' => 'media',
|
||||
);
|
||||
|
||||
// Determine which type.
|
||||
$payload['restBasePath'] = $uploadPath;
|
||||
if (false == $metadata || false == $parsedMeta) {
|
||||
// This is a simple media upload.
|
||||
$payload['content-type'] = $mimeType;
|
||||
$payload['data'] = $data;
|
||||
} else {
|
||||
// This is a multipart/related upload.
|
||||
$boundary = isset($params['boundary']) ? $params['boundary'] : mt_rand();
|
||||
$boundary = str_replace('"', '', $boundary);
|
||||
$payload['content-type'] = 'multipart/related; boundary=' . $boundary;
|
||||
|
||||
$related = "--$boundary\r\n";
|
||||
$related .= "Content-Type: application/json; charset=UTF-8\r\n";
|
||||
$related .= "\r\n" . $metadata . "\r\n";
|
||||
$related .= "--$boundary\r\n";
|
||||
$related .= "Content-Type: $mimeType\r\n";
|
||||
$related .= "Content-Transfer-Encoding: base64\r\n";
|
||||
$related .= "\r\n" . base64_encode($data) . "\r\n";
|
||||
$related .= "--$boundary--";
|
||||
$payload['data'] = $related;
|
||||
}
|
||||
|
||||
return $payload;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class defines attributes, valid values, and usage which is generated from
|
||||
* a given json schema. http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5
|
||||
*
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiModel {
|
||||
public function __construct( /* polymorphic */ ) {
|
||||
if (func_num_args() == 1 && is_array(func_get_arg(0))) {
|
||||
// Initialize the model with the array's contents.
|
||||
$array = func_get_arg(0);
|
||||
$this->mapTypes($array);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize this object's properties from an array.
|
||||
*
|
||||
* @param array Used to seed this object's properties.
|
||||
* @return void
|
||||
*/
|
||||
private function mapTypes($array) {
|
||||
foreach ($array as $key => $val) {
|
||||
$this->$key = $val;
|
||||
|
||||
$keyTypeName = "__$key" . 'Type';
|
||||
$keyDataType = "__$key" . 'DataType';
|
||||
if ($this->useObjects() && property_exists($this, $keyTypeName)) {
|
||||
if ($this->isAssociativeArray($val)) {
|
||||
if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) {
|
||||
foreach($val as $arrayKey => $arrayItem) {
|
||||
$val[$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
||||
}
|
||||
$this->$key = $val;
|
||||
} else {
|
||||
$this->$key = $this->createObjectFromName($keyTypeName, $val);
|
||||
}
|
||||
} else if (is_array($val)) {
|
||||
$arrayObject = array();
|
||||
foreach ($val as $arrayIndex => $arrayItem) {
|
||||
$arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem);
|
||||
}
|
||||
$this->$key = $arrayObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true only if the array is associative.
|
||||
* @param array $array
|
||||
* @return bool True if the array is associative.
|
||||
*/
|
||||
private function isAssociativeArray($array) {
|
||||
if (!is_array($array)) {
|
||||
return false;
|
||||
}
|
||||
$keys = array_keys($array);
|
||||
foreach($keys as $key) {
|
||||
if (is_string($key)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a variable name, discover its type.
|
||||
*
|
||||
* @param $name
|
||||
* @param $item
|
||||
* @return object The object from the item.
|
||||
*/
|
||||
private function createObjectFromName($name, $item) {
|
||||
$type = $this->$name;
|
||||
return new $type($item);
|
||||
}
|
||||
|
||||
protected function useObjects() {
|
||||
global $apiConfig;
|
||||
return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify if $obj is an array.
|
||||
* @throws apiException Thrown if $obj isn't an array.
|
||||
* @param array $obj Items that should be validated.
|
||||
* @param string $type Array items should be of this type.
|
||||
* @param string $method Method expecting an array as an argument.
|
||||
*/
|
||||
protected function assertIsArray($obj, $type, $method) {
|
||||
if ($obj && !is_array($obj)) {
|
||||
throw new apiException("Incorrect parameter type passed to $method(), expected an"
|
||||
. " array containing items of type $type.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
require_once 'service/apiServiceResource.php';
|
||||
require_once 'service/apiServiceRequest.php';
|
||||
require_once 'service/apiBatch.php';
|
||||
|
||||
/**
|
||||
* This class parses the service end points of the api discovery document and constructs
|
||||
* serviceResource variables for all of them.
|
||||
*
|
||||
* For instance when calling with the service document for Plus, it will create apiServiceResource's
|
||||
* for $this->activities, $this->comments, $this->people, etc.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
*
|
||||
*/
|
||||
class apiService {
|
||||
public $version = null;
|
||||
public $restBasePath;
|
||||
public $rpcPath;
|
||||
public $resource = null;
|
||||
|
||||
public function __construct($serviceName, $discoveryDocument) {
|
||||
global $apiConfig;
|
||||
if (!isset($discoveryDocument['version']) || !isset($discoveryDocument['restBasePath']) || !isset($discoveryDocument['rpcPath'])) {
|
||||
throw new apiServiceException("Invalid discovery document");
|
||||
}
|
||||
$this->version = $discoveryDocument['version'];
|
||||
$this->restBasePath = $apiConfig['basePath'] . $discoveryDocument['restBasePath'];
|
||||
$this->rpcPath = $apiConfig['basePath'] . $discoveryDocument['rpcPath'];
|
||||
foreach ($discoveryDocument['resources'] as $resourceName => $resourceTypes) {
|
||||
$this->$resourceName = new apiServiceResource($this, $serviceName, $resourceName, $resourceTypes);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $restBasePath
|
||||
*/
|
||||
public function getRestBasePath() {
|
||||
return $this->restBasePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $rpcPath
|
||||
*/
|
||||
public function getRpcPath() {
|
||||
return $this->rpcPath;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Internal representation of a Google API request, used by the apiServiceResource class to
|
||||
* construct API function calls and passing them to the IO layer who knows how to execute
|
||||
* the request
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiServiceRequest {
|
||||
public $restBasePath;
|
||||
public $restPath;
|
||||
public $rpcPath;
|
||||
public $rpcName;
|
||||
public $httpMethod;
|
||||
public $parameters;
|
||||
public $postBody;
|
||||
public $batchKey;
|
||||
public $contentType;
|
||||
|
||||
/**
|
||||
* @param string $restBasePath
|
||||
* @param string $rpcPath
|
||||
* @param string $restPath
|
||||
* @param string $rpcName
|
||||
* @param string $httpMethod
|
||||
* @param array $parameters
|
||||
* @param string $postBody
|
||||
*/
|
||||
public function __construct($restBasePath, $rpcPath, $restPath, $rpcName, $httpMethod, $parameters, $postBody = null) {
|
||||
if (substr($restBasePath, 0, 4) == 'http') {
|
||||
$this->restBasePath = $restBasePath;
|
||||
} else {
|
||||
global $apiConfig;
|
||||
$this->restBasePath = $apiConfig['basePath'] . $restBasePath;
|
||||
}
|
||||
|
||||
$this->restPath = $restPath;
|
||||
$this->rpcPath = $rpcPath;
|
||||
$this->rpcName = $rpcName;
|
||||
$this->httpMethod = $httpMethod;
|
||||
$this->parameters = $parameters;
|
||||
$this->postBody = $postBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $postBody
|
||||
*/
|
||||
public function getPostBody() {
|
||||
return $this->postBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $postBody The post body.
|
||||
*/
|
||||
public function setPostBody($postBody) {
|
||||
$this->postBody = $postBody;
|
||||
}
|
||||
/**
|
||||
* @return string restBasePath
|
||||
*/
|
||||
public function getRestBasePath() {
|
||||
return $this->restBasePath;
|
||||
}
|
||||
/**
|
||||
* @return string restPath
|
||||
*/
|
||||
public function getRestPath() {
|
||||
return $this->restPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $rpcPath
|
||||
*/
|
||||
public function getRpcPath() {
|
||||
return $this->rpcPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $rpcName
|
||||
*/
|
||||
public function getRpcName() {
|
||||
return $this->rpcName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $httpMethod
|
||||
*/
|
||||
public function getHttpMethod() {
|
||||
return $this->httpMethod;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array $parameters
|
||||
*/
|
||||
public function getParameters() {
|
||||
return $this->parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string $batchKey
|
||||
*/
|
||||
public function getBatchKey() {
|
||||
return $this->batchKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $batchKey the $batchKey to set
|
||||
*/
|
||||
public function setBatchKey($batchKey) {
|
||||
$this->batchKey = $batchKey;
|
||||
}
|
||||
|
||||
public function setContentType($type) {
|
||||
$this->contentType = $type;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright 2010 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements the actual methods/resources of the discovered Google API using magic function
|
||||
* calling overloading (__call()), which on call will see if the method name (plus.activities.list)
|
||||
* is available in this service, and if so construct an apiServiceRequest representing it.
|
||||
*
|
||||
* @author Chris Chabot <chabotc@google.com>
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*
|
||||
*/
|
||||
class apiServiceResource {
|
||||
// Valid query parameters that work, but don't appear in discovery.
|
||||
private $stackParameters = array(
|
||||
'alt' => array('type' => 'string', 'location' => 'query'),
|
||||
'fields' => array('type' => 'string', 'location' => 'query'),
|
||||
'trace' => array('type' => 'string', 'location' => 'query'),
|
||||
'userIp' => array('type' => 'string', 'location' => 'query'),
|
||||
'userip' => array('type' => 'string', 'location' => 'query'),
|
||||
'file' => array('type' => 'complex', 'location' => 'body'),
|
||||
'data' => array('type' => 'string', 'location' => 'body'),
|
||||
'mimeType' => array('type' => 'string', 'location' => 'header'),
|
||||
'uploadType' => array('type' => 'string', 'location' => 'query'),
|
||||
);
|
||||
|
||||
/** @var apiService $service */
|
||||
private $service;
|
||||
|
||||
/** @var string $serviceName */
|
||||
private $serviceName;
|
||||
|
||||
/** @var string $resourceName */
|
||||
private $resourceName;
|
||||
|
||||
/** @var array $methods */
|
||||
private $methods;
|
||||
|
||||
public function __construct($service, $serviceName, $resourceName, $resource) {
|
||||
$this->service = $service;
|
||||
$this->serviceName = $serviceName;
|
||||
$this->resourceName = $resourceName;
|
||||
$this->methods = isset($resource['methods']) ? $resource['methods'] : array($resourceName => $resource);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $name
|
||||
* @param $arguments
|
||||
* @return apiServiceRequest|array
|
||||
* @throws apiException
|
||||
*/
|
||||
public function __call($name, $arguments) {
|
||||
if (count($arguments) != 1 && count($arguments) != 2) {
|
||||
throw new apiException("client method calls expect 1 or 2 parameter (\$client->plus->activities->list(array('userId' => 'me'))");
|
||||
}
|
||||
if (! is_array($arguments[0])) {
|
||||
throw new apiException("client method parameter should be an array (\$client->plus->activities->list(array('userId' => 'me'))");
|
||||
}
|
||||
$batchKey = false;
|
||||
if (isset($arguments[1])) {
|
||||
if (! is_string($arguments[1])) {
|
||||
throw new apiException("The batch key parameter should be a string (\$client->plus->activities->list( array('userId' => 'me'), 'batchKey'))");
|
||||
}
|
||||
$batchKey = $arguments[1];
|
||||
}
|
||||
if (! isset($this->methods[$name])) {
|
||||
throw new apiException("Unknown function: {$this->serviceName}->{$this->resourceName}->{$name}()");
|
||||
}
|
||||
$method = $this->methods[$name];
|
||||
$parameters = $arguments[0];
|
||||
// postBody is a special case since it's not defined in the discovery document as parameter, but we abuse the param entry for storing it
|
||||
$postBody = null;
|
||||
if (isset($parameters['postBody'])) {
|
||||
if (is_object($parameters['postBody'])) {
|
||||
$this->stripNull($parameters['postBody']);
|
||||
}
|
||||
|
||||
// Some APIs require the postBody to be set under the data key.
|
||||
if (is_array($parameters['postBody']) && 'latitude' == $this->serviceName) {
|
||||
if (!isset($parameters['postBody']['data'])) {
|
||||
$rawBody = $parameters['postBody'];
|
||||
unset($parameters['postBody']);
|
||||
$parameters['postBody']['data'] = $rawBody;
|
||||
}
|
||||
}
|
||||
|
||||
$postBody = is_array($parameters['postBody']) || is_object($parameters['postBody'])
|
||||
? json_encode($parameters['postBody'])
|
||||
: $parameters['postBody'];
|
||||
unset($parameters['postBody']);
|
||||
|
||||
if (isset($parameters['optParams'])) {
|
||||
$optParams = $parameters['optParams'];
|
||||
unset($parameters['optParams']);
|
||||
$parameters = array_merge($parameters, $optParams);
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($method['parameters'])) {
|
||||
$method['parameters'] = array();
|
||||
}
|
||||
|
||||
$method['parameters'] = array_merge($method['parameters'], $this->stackParameters);
|
||||
foreach ($parameters as $key => $val) {
|
||||
if ($key != 'postBody' && ! isset($method['parameters'][$key])) {
|
||||
throw new apiException("($name) unknown parameter: '$key'");
|
||||
}
|
||||
}
|
||||
if (isset($method['parameters'])) {
|
||||
foreach ($method['parameters'] as $paramName => $paramSpec) {
|
||||
if (isset($paramSpec['required']) && $paramSpec['required'] && ! isset($parameters[$paramName])) {
|
||||
throw new apiException("($name) missing required param: '$paramName'");
|
||||
}
|
||||
if (isset($parameters[$paramName])) {
|
||||
$value = $parameters[$paramName];
|
||||
$parameters[$paramName] = $paramSpec;
|
||||
$parameters[$paramName]['value'] = $value;
|
||||
unset($parameters[$paramName]['required']);
|
||||
} else {
|
||||
unset($parameters[$paramName]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Discovery v1.0 puts the canonical method id under the 'id' field.
|
||||
if (! isset($method['id'])) {
|
||||
$method['id'] = $method['rpcMethod'];
|
||||
}
|
||||
|
||||
// Discovery v1.0 puts the canonical path under the 'path' field.
|
||||
if (! isset($method['path'])) {
|
||||
$method['path'] = $method['restPath'];
|
||||
}
|
||||
|
||||
$restBasePath = $this->service->restBasePath;
|
||||
|
||||
// Process Media Request
|
||||
$contentType = false;
|
||||
if (isset($method['mediaUpload'])) {
|
||||
$media = apiMediaFileUpload::process($postBody, $method, $parameters);
|
||||
if (isset($media['content-type'])) {
|
||||
$contentType = $media['content-type'];
|
||||
}
|
||||
|
||||
if (isset($media['data'])) {
|
||||
$postBody = $media['data'];
|
||||
}
|
||||
|
||||
if (isset($media['file'])) {
|
||||
$postBody = array('file' => $media['file']);
|
||||
}
|
||||
|
||||
if (isset($media['restBasePath'])) {
|
||||
$restBasePath = $media['restBasePath'];
|
||||
$method['path'] = '';
|
||||
}
|
||||
}
|
||||
|
||||
$request = new apiServiceRequest(
|
||||
$restBasePath,
|
||||
$this->service->rpcPath,
|
||||
$method['path'],
|
||||
$method['id'],
|
||||
$method['httpMethod'],
|
||||
$parameters, $postBody
|
||||
);
|
||||
|
||||
$request->setContentType($contentType);
|
||||
if ($batchKey) {
|
||||
$request->setBatchKey($batchKey);
|
||||
return $request;
|
||||
} else {
|
||||
return apiREST::execute($request);
|
||||
}
|
||||
}
|
||||
|
||||
protected function useObjects() {
|
||||
global $apiConfig;
|
||||
return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']);
|
||||
}
|
||||
|
||||
protected function stripNull(&$o) {
|
||||
$o = (array) $o;
|
||||
foreach ($o as $k => $v) {
|
||||
if ($v === null || strstr($k, "\0*\0__")) {
|
||||
unset($o[$k]);
|
||||
}
|
||||
elseif (is_object($v) || is_array($v)) {
|
||||
$this->stripNull($o[$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Collection of static utility methods used for convenience across
|
||||
* the client library.
|
||||
*
|
||||
* @author Chirag Shah <chirags@google.com>
|
||||
*/
|
||||
class apiUtils {
|
||||
public static function urlSafeB64Encode($data) {
|
||||
$b64 = base64_encode($data);
|
||||
$b64 = str_replace(array('+', '/', '\r', '\n', '='),
|
||||
array('-', '_'),
|
||||
$b64);
|
||||
return $b64;
|
||||
}
|
||||
|
||||
public static function urlSafeB64Decode($b64) {
|
||||
$b64 = str_replace(array('-', '_'),
|
||||
array('+', '/'),
|
||||
$b64);
|
||||
return base64_decode($b64);
|
||||
}
|
||||
|
||||
/**
|
||||
* Misc function used to count the number of bytes in a post body, in the world of multi-byte chars
|
||||
* and the unpredictability of strlen/mb_strlen/sizeof, this is the only way to do that in a sane
|
||||
* manner at the moment.
|
||||
*
|
||||
* This algorithm was originally developed for the
|
||||
* Solar Framework by Paul M. Jones
|
||||
*
|
||||
* @link http://solarphp.com/
|
||||
* @link http://svn.solarphp.com/core/trunk/Solar/Json.php
|
||||
* @link http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php
|
||||
* @param string $str
|
||||
* @return int The number of bytes in a string.
|
||||
*/
|
||||
static public function getStrLen($str) {
|
||||
$strlenVar = strlen($str);
|
||||
$d = $ret = 0;
|
||||
for ($count = 0; $count < $strlenVar; ++ $count) {
|
||||
$ordinalValue = ord($str{$ret});
|
||||
switch (true) {
|
||||
case (($ordinalValue >= 0x20) && ($ordinalValue <= 0x7F)):
|
||||
// characters U-00000000 - U-0000007F (same as ASCII)
|
||||
$ret ++;
|
||||
break;
|
||||
|
||||
case (($ordinalValue & 0xE0) == 0xC0):
|
||||
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$ret += 2;
|
||||
break;
|
||||
|
||||
case (($ordinalValue & 0xF0) == 0xE0):
|
||||
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$ret += 3;
|
||||
break;
|
||||
|
||||
case (($ordinalValue & 0xF8) == 0xF0):
|
||||
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$ret += 4;
|
||||
break;
|
||||
|
||||
case (($ordinalValue & 0xFC) == 0xF8):
|
||||
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$ret += 5;
|
||||
break;
|
||||
|
||||
case (($ordinalValue & 0xFE) == 0xFC):
|
||||
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$ret += 6;
|
||||
break;
|
||||
default:
|
||||
$ret ++;
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize all keys in an array to lower-case.
|
||||
* @param array $arr
|
||||
* @return array Normalized array.
|
||||
*/
|
||||
public static function normalize($arr) {
|
||||
if (!is_array($arr)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$normalized = array();
|
||||
foreach ($arr as $key => $val) {
|
||||
$normalized[strtolower($key)] = $val;
|
||||
}
|
||||
return $normalized;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user