From: Michael J. Rubinsky Date: Sun, 19 Jul 2009 17:01:10 +0000 (-0400) Subject: Abstract out both the Auth class and the Request class, add Account class X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=3f909c65aaa338a5e875cb31790531fbd0fb7d99;p=horde.git Abstract out both the Auth class and the Request class, add Account class Abstract out Auth and Request so we can support both OAuth and Http Basic authentication mechanisms. Add Account class to handle the REST API's account/* methods --- diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter.php b/framework/Service_Twitter/lib/Horde/Service/Twitter.php index 0a86214a5..d3c224d89 100644 --- a/framework/Service_Twitter/lib/Horde/Service/Twitter.php +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter.php @@ -20,20 +20,65 @@ class Horde_Service_Twitter */ protected $_objCache = array(); + /** + * Configuration values + * + * @var array + */ protected $_config; /** + * Type of authentication (Oauth, Basic) + * + * @var string + */ + protected $_authType; + + /** + * Can't lazy load the auth or request class since we need to know early if + * we are OAuth or Basic + * + * @var Horde_Service_Twitter_Auth + */ + protected $_auth; + + /** + * + * @var Horde_Service_Twitter_Request + */ + protected $_request; + + /** * Const'r * * @param array $config Configuration parameters: *
-     *     'oauth'  - Horde_Oauth object
+     *     'oauth'    - Horde_Oauth object if using Oauth
+     *     'username' - if using Basic auth
+     *     'password' - if using Basic auth
+     *   
*/ public function __construct($config) { // TODO: Check for req'd config $this->_config = $config; + // Need to determine the type of authentication we will be using early.. + if (!empty($config['oauth'])) { + // OAuth + $this->_authType = 'Oauth'; + $params = array('oauth' => $config['oauth']); + } elseif (!empty($config['username']) && !empty($config['password'])) { + // Http_Basic + $this->_authType = 'Basic'; + $params = array(); + } + + $aclass = 'Horde_Service_Twitter_Auth_' . $this->_authType; + $rclass = 'Horde_Service_Twitter_Request_' . $this->_authType; + + $this->_auth = new $aclass($this, $params); + $this->_request = new $rclass($this); } /** @@ -48,9 +93,10 @@ class Horde_Service_Twitter { // First, see if it's an allowed protected value. switch ($value) { - case 'oauth': - return $this->_config['oauth']; - + case 'auth': + return $this->_auth; + case 'request': + return $this->_request; } // If not, assume it's a method/action class... @@ -64,37 +110,8 @@ class Horde_Service_Twitter } - $this->_objCache[$class] = new $class($this, $this->oauth); + $this->_objCache[$class] = new $class($this); return $this->_objCache[$class]; } - /** - * Send a request to the Twitter api - * - * @param $url - * @param $params - * @return unknown_type - */ - public function getRequest($url, $params = array()) - { - $request = new Horde_Oauth_Request($url, $params); - $request->sign($this->oauth->signatureMethod, $this->oauth, $this->auth->getAccessToken()); - - $client = new Horde_Http_Client(); - $response = $client->get($url, array('Authorization' => $request->buildAuthorizationHeader())); - - return $response->getBody(); - } - - public function postRequest($url, $params = array()) - { - $request = new Horde_Oauth_Request($url, $params); - $request->sign($this->oauth->signatureMethod, $this->oauth, $this->auth->getAccessToken()); - - $client = new Horde_Http_Client(); - $response = $client->post($url, $params, array('Authorization' => $request->buildAuthorizationHeader())); - - return $response->getBody(); - } - } diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Account.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Account.php index b3d9bbc7f..3c8dc0ebb 100644 --- a/framework/Service_Twitter/lib/Horde/Service/Twitter/Account.php +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Account.php @@ -1 +1,28 @@ + * @license http://opensource.org/licenses/bsd-license.php BSD + * @category Horde + * @package Horde_Service_Twitter + */ +class Horde_Service_Twitter_Account +{ + protected $_endpoint = 'http://twitter.com/account/'; + protected $_format = 'json'; + + public function __construct($twitter) + { + $this->_twitter = $twitter; + } + + public function verifyCredentials() + { + $url = $this->_endpoint . 'verify_credentials.' . $this->_format; + return $this->_twitter->request->get($url); + } + +} diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth.php index bcf2f86ee..32673caba 100644 --- a/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth.php +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth.php @@ -1,9 +1,7 @@ _twitter = $twitter; + $this->_config = $config; } - /** - * Obtain the URL used to get an authorization token. - * - * @param Horde_Oauth_Token $requestToken The request token - * - * @return string The Url - */ - public function getUserAuthorizationUrl($requestToken) - { - return $this->_twitter->oauth->getUserAuthorizationUrl($requestToken); - } - - /** - * Set the access token - * - * @param $token - * @return unknown_type - */ - public function setToken($token) - { - // @TODO: sanity check this - $this->_token = $token; - } - - /** - * Obtain the access token. This is the token that should be persisted to - * storage. - * - * @param Horde_Controller_Request_Http Http request object - * @param Horde_Oauth_Token $requestSecret The token secret returned by - * Twitter after the user authorizes - * the application. - * @return Horde_Oauth_Token - */ - public function getAccessToken($request = null, $requestSecret = null) + public function __get($value) { - if (!empty($this->_token)) { - return $this->_token; + if (!empty($this->_config[$value])) { + return $this->_config[$value]; } - //@TODO: Verify the existence of requestSecret... - - $params = $request->getGetParams(); - if (empty($params['oauth_token'])) { - return false; - } - $token = new Horde_Oauth_Token($params['oauth_token'], $requestSecret); - - return $this->_twitter->oauth->getAccessToken($token); - } - - public function getRequestToken($params = array()) - { - return $this->_twitter->oauth->getRequestToken($params); + throw new Horde_Service_Twitter_Exception(sprintf("The property %s does not exist", $value)); } } diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth/Oauth.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth/Oauth.php new file mode 100644 index 000000000..113936a16 --- /dev/null +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Auth/Oauth.php @@ -0,0 +1,78 @@ + + * @license http://opensource.org/licenses/bsd-license.php BSD + * @category Horde + * @package Horde_Service_Twitter + */ +class Horde_Service_Twitter_Auth_Oauth extends Horde_Service_Twitter_Auth +{ + /** + * + */ + protected $_token; + + /** + * Obtain the URL used to get an authorization token. + * + * @param Horde_Oauth_Token $requestToken The request token + * + * @return string The Url + */ + public function getUserAuthorizationUrl($requestToken) + { + return $this->oauth->getUserAuthorizationUrl($requestToken); + } + + /** + * Set the access token + * + * @param $token + * @return unknown_type + */ + public function setToken($token) + { + // @TODO: sanity check this + $this->_token = $token; + } + + /** + * Obtain the access token. This is the token that should be persisted to + * storage. + * + * @param Horde_Controller_Request_Http Http request object + * @param Horde_Oauth_Token $requestSecret The token secret returned by + * Twitter after the user authorizes + * the application. + * @return Horde_Oauth_Token + */ + public function getAccessToken($request = null, $requestSecret = null) + { + if (!empty($this->_token)) { + return $this->_token; + } + + //@TODO: Verify the existence of requestSecret... + + $params = $request->getGetParams(); + if (empty($params['oauth_token'])) { + return false; + } + $token = new Horde_Oauth_Token($params['oauth_token'], $requestSecret); + + return $this->oauth->getAccessToken($token); + } + + public function getRequestToken($params = array()) + { + return $this->oauth->getRequestToken($params); + } + +} diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Request.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Request.php new file mode 100644 index 000000000..28d3ac8fa --- /dev/null +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Request.php @@ -0,0 +1,25 @@ + + * @license http://opensource.org/licenses/bsd-license.php BSD + * @category Horde + * @package Horde_Service_Twitter + */ +abstract class Horde_Service_Twitter_Request +{ + protected $_twitter; + + public function __construct($twitter) + { + $this->_twitter = $twitter; + } + + abstract public function get($url, $params = array()); + abstract public function post($url, $params = array()); + +} diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Request/Oauth.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Request/Oauth.php new file mode 100644 index 000000000..0adecbc42 --- /dev/null +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Request/Oauth.php @@ -0,0 +1,48 @@ + + * @license http://opensource.org/licenses/bsd-license.php BSD + * @category Horde + * @package Horde_Service_Twitter + */ +class Horde_Service_Twitter_Request_Oauth extends Horde_Service_Twitter_Request +{ + + protected $_twitter; + + public function __construct($twitter) + { + $this->_twitter = $twitter; + } + + public function get($url, $params = array()) + { + $request = new Horde_Oauth_Request($url, $params); + $request->sign($this->_twitter->auth->oauth->signatureMethod, + $this->_twitter->auth->oauth, + $this->_twitter->auth->getAccessToken()); + $client = new Horde_Http_Client(); + $response = $client->get($url, array('Authorization' => $request->buildAuthorizationHeader('Twitter API'))); + + return $response->getBody(); + } + + public function post($url, $params = array()) + { + $request = new Horde_Oauth_Request($url, $params); + $request->sign($this->_twitter->auth->oauth->signatureMethod, + $this->_twitter->auth->oauth, + $this->_twitter->auth->getAccessToken()); + + $client = new Horde_Http_Client(); + $response = $client->post($url, $params, array('Authorization' => $request->buildAuthorizationHeader('Twitter API'))); + + return $response->getBody(); + } + +} diff --git a/framework/Service_Twitter/lib/Horde/Service/Twitter/Statuses.php b/framework/Service_Twitter/lib/Horde/Service/Twitter/Statuses.php index 234b45aeb..0b1771740 100644 --- a/framework/Service_Twitter/lib/Horde/Service/Twitter/Statuses.php +++ b/framework/Service_Twitter/lib/Horde/Service/Twitter/Statuses.php @@ -12,7 +12,7 @@ class Horde_Service_Twitter_Statuses { - public function __construct($twitter, $oauth) + public function __construct($twitter) { $this->_twitter = $twitter; } @@ -30,6 +30,6 @@ class Horde_Service_Twitter_Statuses public function update($status) { $url = 'http://twitter.com/statuses/update.json'; - return $this->_twitter->postRequest($url, array('status' => $status)); + return $this->_twitter->request->post($url, array('status' => $status)); } } diff --git a/framework/Service_Twitter/package.xml b/framework/Service_Twitter/package.xml index aff37cca5..910be2f86 100644 --- a/framework/Service_Twitter/package.xml +++ b/framework/Service_Twitter/package.xml @@ -33,9 +33,19 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + + + + + + + + @@ -60,8 +70,14 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + + + +