mirror of
https://bitbucket.org/jsuto/piler.git
synced 2025-06-12 23:17:02 +02:00
added google xoauth2 support + fixed a journaling issue
This commit is contained in:
371
webui/google-api/apiClient.php
Normal file
371
webui/google-api/apiClient.php
Normal file
@ -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 {}
|
37
webui/google-api/auth/apiAuth.php
Normal file
37
webui/google-api/auth/apiAuth.php
Normal file
@ -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();
|
||||
}
|
48
webui/google-api/auth/apiAuthNone.php
Normal file
48
webui/google-api/auth/apiAuthNone.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
60
webui/google-api/auth/apiLoginTicket.php
Normal file
60
webui/google-api/auth/apiLoginTicket.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
250
webui/google-api/auth/apiOAuth.php
Normal file
250
webui/google-api/auth/apiOAuth.php
Normal file
@ -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*/}
|
||||
}
|
394
webui/google-api/auth/apiOAuth2.php
Normal file
394
webui/google-api/auth/apiOAuth2.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
66
webui/google-api/auth/apiP12Signer.php
Normal file
66
webui/google-api/auth/apiP12Signer.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
61
webui/google-api/auth/apiPemVerifier.php
Normal file
61
webui/google-api/auth/apiPemVerifier.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
30
webui/google-api/auth/apiSigner.php
Normal file
30
webui/google-api/auth/apiSigner.php
Normal file
@ -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);
|
||||
}
|
31
webui/google-api/auth/apiVerifier.php
Normal file
31
webui/google-api/auth/apiVerifier.php
Normal file
@ -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
webui/google-api/cache/apiApcCache.php
vendored
Normal file
97
webui/google-api/cache/apiApcCache.php
vendored
Normal file
@ -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);
|
||||
}
|
||||
}
|
56
webui/google-api/cache/apiCache.php
vendored
Normal file
56
webui/google-api/cache/apiCache.php
vendored
Normal file
@ -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
webui/google-api/cache/apiFileCache.php
vendored
Normal file
135
webui/google-api/cache/apiFileCache.php
vendored
Normal file
@ -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
webui/google-api/cache/apiMemcacheCache.php
vendored
Normal file
126
webui/google-api/cache/apiMemcacheCache.php
vendored
Normal file
@ -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);
|
||||
}
|
||||
}
|
92
webui/google-api/config.php
Normal file
92
webui/google-api/config.php
Normal file
@ -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')
|
||||
)
|
||||
);
|
1178
webui/google-api/contrib/apiAdsenseService.php
Normal file
1178
webui/google-api/contrib/apiAdsenseService.php
Normal file
File diff suppressed because it is too large
Load Diff
1572
webui/google-api/contrib/apiAnalyticsService.php
Normal file
1572
webui/google-api/contrib/apiAnalyticsService.php
Normal file
File diff suppressed because it is too large
Load Diff
1741
webui/google-api/contrib/apiBigqueryService.php
Normal file
1741
webui/google-api/contrib/apiBigqueryService.php
Normal file
File diff suppressed because it is too large
Load Diff
1093
webui/google-api/contrib/apiBloggerService.php
Normal file
1093
webui/google-api/contrib/apiBloggerService.php
Normal file
File diff suppressed because it is too large
Load Diff
1865
webui/google-api/contrib/apiBooksService.php
Normal file
1865
webui/google-api/contrib/apiBooksService.php
Normal file
File diff suppressed because it is too large
Load Diff
1863
webui/google-api/contrib/apiCalendarService.php
Normal file
1863
webui/google-api/contrib/apiCalendarService.php
Normal file
File diff suppressed because one or more lines are too long
488
webui/google-api/contrib/apiCustomsearchService.php
Normal file
488
webui/google-api/contrib/apiCustomsearchService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
166
webui/google-api/contrib/apiFreebaseService.php
Normal file
166
webui/google-api/contrib/apiFreebaseService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
1529
webui/google-api/contrib/apiGanService.php
Normal file
1529
webui/google-api/contrib/apiGanService.php
Normal file
File diff suppressed because it is too large
Load Diff
287
webui/google-api/contrib/apiLatitudeService.php
Normal file
287
webui/google-api/contrib/apiLatitudeService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
1903
webui/google-api/contrib/apiModeratorService.php
Normal file
1903
webui/google-api/contrib/apiModeratorService.php
Normal file
File diff suppressed because it is too large
Load Diff
307
webui/google-api/contrib/apiOauth2Service.php
Normal file
307
webui/google-api/contrib/apiOauth2Service.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
2531
webui/google-api/contrib/apiOrkutService.php
Normal file
2531
webui/google-api/contrib/apiOrkutService.php
Normal file
File diff suppressed because it is too large
Load Diff
482
webui/google-api/contrib/apiPagespeedonlineService.php
Normal file
482
webui/google-api/contrib/apiPagespeedonlineService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
1525
webui/google-api/contrib/apiPlusService.php
Normal file
1525
webui/google-api/contrib/apiPlusService.php
Normal file
File diff suppressed because it is too large
Load Diff
431
webui/google-api/contrib/apiPredictionService.php
Normal file
431
webui/google-api/contrib/apiPredictionService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
1260
webui/google-api/contrib/apiShoppingService.php
Normal file
1260
webui/google-api/contrib/apiShoppingService.php
Normal file
File diff suppressed because it is too large
Load Diff
292
webui/google-api/contrib/apiSiteVerificationService.php
Normal file
292
webui/google-api/contrib/apiSiteVerificationService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
571
webui/google-api/contrib/apiTasksService.php
Normal file
571
webui/google-api/contrib/apiTasksService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
254
webui/google-api/contrib/apiTranslateService.php
Normal file
254
webui/google-api/contrib/apiTranslateService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
332
webui/google-api/contrib/apiUrlshortenerService.php
Normal file
332
webui/google-api/contrib/apiUrlshortenerService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
138
webui/google-api/contrib/apiWebfontsService.php
Normal file
138
webui/google-api/contrib/apiWebfontsService.php
Normal file
@ -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
webui/google-api/external/OAuth.php
vendored
Executable file
486
webui/google-api/external/OAuth.php
vendored
Executable file
@ -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
webui/google-api/external/URITemplateParser.php
vendored
Normal file
209
webui/google-api/external/URITemplateParser.php
vendored
Normal file
@ -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;
|
||||
}
|
||||
}
|
173
webui/google-api/io/apiCacheParser.php
Normal file
173
webui/google-api/io/apiCacheParser.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
254
webui/google-api/io/apiCurlIO.php
Normal file
254
webui/google-api/io/apiCurlIO.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
262
webui/google-api/io/apiHttpRequest.php
Normal file
262
webui/google-api/io/apiHttpRequest.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
43
webui/google-api/io/apiIO.php
Normal file
43
webui/google-api/io/apiIO.php
Normal file
@ -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);
|
||||
}
|
148
webui/google-api/io/apiREST.php
Normal file
148
webui/google-api/io/apiREST.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
63
webui/google-api/io/apiRPC.php
Normal file
63
webui/google-api/io/apiRPC.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
714
webui/google-api/io/cacerts.pem
Normal file
714
webui/google-api/io/cacerts.pem
Normal file
@ -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-----
|
||||
|
39
webui/google-api/service/apiBatch.php
Normal file
39
webui/google-api/service/apiBatch.php
Normal file
@ -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);
|
||||
}
|
||||
|
||||
}
|
89
webui/google-api/service/apiMediaFileUpload.php
Normal file
89
webui/google-api/service/apiMediaFileUpload.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
115
webui/google-api/service/apiModel.php
Normal file
115
webui/google-api/service/apiModel.php
Normal file
@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
64
webui/google-api/service/apiService.php
Normal file
64
webui/google-api/service/apiService.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
135
webui/google-api/service/apiServiceRequest.php
Normal file
135
webui/google-api/service/apiServiceRequest.php
Normal file
@ -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;
|
||||
}
|
||||
}
|
207
webui/google-api/service/apiServiceResource.php
Normal file
207
webui/google-api/service/apiServiceResource.php
Normal file
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
117
webui/google-api/service/apiUtils.php
Normal file
117
webui/google-api/service/apiUtils.php
Normal file
@ -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