diff options
Diffstat (limited to 'zend/library/Zend/Gdata/ClientLogin.php')
| -rw-r--r-- | zend/library/Zend/Gdata/ClientLogin.php | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/zend/library/Zend/Gdata/ClientLogin.php b/zend/library/Zend/Gdata/ClientLogin.php new file mode 100644 index 0000000..2c8fbc2 --- /dev/null +++ b/zend/library/Zend/Gdata/ClientLogin.php @@ -0,0 +1,182 @@ +<?php + +/** + * Zend Framework + * + * LICENSE + * + * This source file is subject to the new BSD license that is bundled + * with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://framework.zend.com/license/new-bsd + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@zend.com so we can send you a copy immediately. + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gdata + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @version $Id: ClientLogin.php 24593 2012-01-05 20:35:02Z matthew $ + */ + +/** + * Zend_Gdata_HttpClient + */ +require_once 'Zend/Gdata/HttpClient.php'; + +/** + * Zend_Version + */ +require_once 'Zend/Version.php'; + +/** + * Class to facilitate Google's "Account Authentication + * for Installed Applications" also known as "ClientLogin". + * @see http://code.google.com/apis/accounts/AuthForInstalledApps.html + * + * @category Zend + * @package Zend_Gdata + * @subpackage Gdata + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class Zend_Gdata_ClientLogin +{ + + /** + * The Google client login URI + * + */ + const CLIENTLOGIN_URI = 'https://www.google.com/accounts/ClientLogin'; + + /** + * The default 'source' parameter to send to Google + * + */ + const DEFAULT_SOURCE = 'Zend-ZendFramework'; + + /** + * Set Google authentication credentials. + * Must be done before trying to do any Google Data operations that + * require authentication. + * For example, viewing private data, or posting or deleting entries. + * + * @param string $email + * @param string $password + * @param string $service + * @param Zend_Gdata_HttpClient $client + * @param string $source + * @param string $loginToken The token identifier as provided by the server. + * @param string $loginCaptcha The user's response to the CAPTCHA challenge. + * @param string $accountType An optional string to identify whether the + * account to be authenticated is a google or a hosted account. Defaults to + * 'HOSTED_OR_GOOGLE'. See: http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html#Request + * @throws Zend_Gdata_App_AuthException + * @throws Zend_Gdata_App_HttpException + * @throws Zend_Gdata_App_CaptchaRequiredException + * @return Zend_Gdata_HttpClient + */ + public static function getHttpClient($email, $password, $service = 'xapi', + $client = null, + $source = self::DEFAULT_SOURCE, + $loginToken = null, + $loginCaptcha = null, + $loginUri = self::CLIENTLOGIN_URI, + $accountType = 'HOSTED_OR_GOOGLE') + { + if (! ($email && $password)) { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Please set your Google credentials before trying to ' . + 'authenticate'); + } + + if ($client == null) { + $client = new Zend_Gdata_HttpClient(); + } + if (!$client instanceof Zend_Http_Client) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException( + 'Client is not an instance of Zend_Http_Client.'); + } + + // Build the HTTP client for authentication + $client->setUri($loginUri); + $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setConfig(array( + 'maxredirects' => 0, + 'strictredirects' => true, + 'useragent' => $useragent + ) + ); + $client->setParameterPost('accountType', $accountType); + $client->setParameterPost('Email', (string) $email); + $client->setParameterPost('Passwd', (string) $password); + $client->setParameterPost('service', (string) $service); + $client->setParameterPost('source', (string) $source); + if ($loginToken || $loginCaptcha) { + if($loginToken && $loginCaptcha) { + $client->setParameterPost('logintoken', (string) $loginToken); + $client->setParameterPost('logincaptcha', + (string) $loginCaptcha); + } + else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException( + 'Please provide both a token ID and a user\'s response ' . + 'to the CAPTCHA challenge.'); + } + } + + // Send the authentication request + // For some reason Google's server causes an SSL error. We use the + // output buffer to supress an error from being shown. Ugly - but works! + ob_start(); + try { + $response = $client->request('POST'); + } catch (Zend_Http_Client_Exception $e) { + require_once 'Zend/Gdata/App/HttpException.php'; + throw new Zend_Gdata_App_HttpException($e->getMessage(), $e); + } + ob_end_clean(); + + // Parse Google's response + $goog_resp = array(); + foreach (explode("\n", $response->getBody()) as $l) { + $l = chop($l); + if ($l) { + list($key, $val) = explode('=', chop($l), 2); + $goog_resp[$key] = $val; + } + } + + if ($response->getStatus() == 200) { + $client->setClientLoginToken($goog_resp['Auth']); + $useragent = $source . ' Zend_Framework_Gdata/' . Zend_Version::VERSION; + $client->setConfig(array( + 'strictredirects' => true, + 'useragent' => $useragent + ) + ); + return $client; + + } elseif ($response->getStatus() == 403) { + // Check if the server asked for a CAPTCHA + if (array_key_exists('Error', $goog_resp) && + $goog_resp['Error'] == 'CaptchaRequired') { + require_once 'Zend/Gdata/App/CaptchaRequiredException.php'; + throw new Zend_Gdata_App_CaptchaRequiredException( + $goog_resp['CaptchaToken'], $goog_resp['CaptchaUrl']); + } + else { + require_once 'Zend/Gdata/App/AuthException.php'; + throw new Zend_Gdata_App_AuthException('Authentication with Google failed. Reason: ' . + (isset($goog_resp['Error']) ? $goog_resp['Error'] : 'Unspecified.')); + } + } + } + +} + |
