├── README.md ├── config └── autoload.php ├── libraries ├── Consumer.php ├── Format.php ├── OAuth.php ├── Provider.php ├── Provider │ ├── Dropbox.php │ ├── Flickr.php │ ├── Google.php │ ├── Linkedin.php │ ├── Tumblr.php │ └── Twitter.php ├── Request.php ├── Request │ ├── Access.php │ ├── Authorize.php │ ├── Credentials.php │ ├── Resource.php │ └── Token.php ├── Response.php ├── Signature.php ├── Signature │ ├── HMAC_SHA1.php │ └── Plaintext.php ├── Token.php └── Token │ ├── Access.php │ └── Request.php └── spark.info /README.md: -------------------------------------------------------------------------------- 1 | ## CodeIgniter OAuth 2 | 3 | ## !!! DEPRECATED !!! 4 | **This package is no longer actively maintained. If somebody sends in a pull request with some major security bug 5 | then I'll merge it, but otherwise nothing will be done. Use [thephpleague/oauth1-client](https://github.com/thephpleague/oauth1-client) instead.** 6 | 7 | An implementation of the [OAuth](http://oauth.net/) protocol with drivers to work with different providers such as Twitter, Google, etc. 8 | 9 | This is based on the wonderful [Kohana OAuth](https://github.com/kohana/oauth) package but has been adapted to work with a wider range of providers. 10 | 11 | Note that this Spark ONLY provides the authorization mechanism. You will need to implement the example code below so you can save this information to make API requests on the users behalf. 12 | 13 | ### Providers 14 | 15 | - Dropbox 16 | - Flickr 17 | - Google 18 | - LinkedIn 19 | - Tumblr 20 | - Twitter 21 | 22 | ### Installation 23 | 24 | #### Install with Sparks 25 | 26 | ```console 27 | $ php tools/spark install -v0.3.1 oauth 28 | ``` 29 | 30 | ### Usage Example 31 | 32 | This example will need the user to go to a certain URL, which will support multiple providers. I like to set a controller to handle it and either have one single "session" method - or have another method for callbacks if you want to separate out the code even more. 33 | 34 | Here you'll see we have the provider passed in as a URI segment of "twitter" which can be used to find config in a database, or in a config multi-dimensional array. If you want to hard code it all then that is just fine too. 35 | 36 | Send your user to `http://example.com/auth/oauth/twitter` where Auth is the name of the controller. This will also be the address of the "Callback URL" which will be required by many OAuth providers. 37 | 38 | ```php 39 | class Auth extends CI_Controller 40 | { 41 | public function oauth($provider) 42 | { 43 | $this->load->helper('url'); 44 | 45 | $this->load->spark('oauth/0.3.1'); 46 | 47 | // Create an consumer from the config 48 | $consumer = $this->oauth->consumer(array( 49 | 'key' => $config['key'], 50 | 'secret' => $config['secret'], 51 | )); 52 | 53 | // Load the provider 54 | $provider = $this->oauth->provider($provider); 55 | 56 | // Create the URL to return the user to 57 | $callback = site_url('auth/oauth/'.$provider->name); 58 | 59 | if ( ! $this->input->get_post('oauth_token')) 60 | { 61 | // Add the callback URL to the consumer 62 | $consumer->callback($callback); 63 | 64 | // Get a request token for the consumer 65 | $token = $provider->request_token($consumer); 66 | 67 | // Store the token 68 | $this->session->set_userdata('oauth_token', base64_encode(serialize($token))); 69 | 70 | // Get the URL to the twitter login page 71 | $url = $provider->authorize($token, array( 72 | 'oauth_callback' => $callback, 73 | )); 74 | 75 | // Send the user off to login 76 | redirect($url); 77 | } 78 | else 79 | { 80 | if ($this->session->userdata('oauth_token')) 81 | { 82 | // Get the token from storage 83 | $token = unserialize(base64_decode($this->session->userdata('oauth_token'))); 84 | } 85 | 86 | if ( ! empty($token) AND $token->access_token !== $this->input->get_post('oauth_token')) 87 | { 88 | // Delete the token, it is not valid 89 | $this->session->unset_userdata('oauth_token'); 90 | 91 | // Send the user back to the beginning 92 | exit('invalid token after coming back to site'); 93 | } 94 | 95 | // Get the verifier 96 | $verifier = $this->input->get_post('oauth_verifier'); 97 | 98 | // Store the verifier in the token 99 | $token->verifier($verifier); 100 | 101 | // Exchange the request token for an access token 102 | $token = $provider->access_token($consumer, $token); 103 | 104 | // We got the token, let's get some user data 105 | $user = $provider->get_user_info($consumer, $token); 106 | 107 | // Here you should use this information to A) look for a user B) help a new user sign up with existing data. 108 | // If you store it all in a cookie and redirect to a registration page this is crazy-simple. 109 | echo "
Tokens: ";
110 | 			var_dump($token).PHP_EOL.PHP_EOL;
111 | 			
112 | 			echo "User Info: ";
113 | 			var_dump($user);
114 | 		}
115 | 	}
116 | }
117 | ```
118 | 
119 | If all goes well you should see a dump of user data and have `$token` available. If all does not go well you'll likely have a bunch of errors on your screen.
120 | 


--------------------------------------------------------------------------------
/config/autoload.php:
--------------------------------------------------------------------------------
1 | key = $options['key'];
45 | 
46 | 		$this->secret = $options['secret'];
47 | 
48 | 		if (isset($options['callback']))
49 | 		{
50 | 			$this->callback = $options['callback'];
51 | 		}
52 | 		
53 | 		if (isset($options['scope']))
54 | 		{
55 | 			$this->scope = $options['scope'];
56 | 		}
57 | 	}
58 | 
59 | 	/**
60 | 	 * Return the value of any protected class variable.
61 | 	 *
62 | 	 *     // Get the consumer key
63 | 	 *     $key = $consumer->key;
64 | 	 *
65 | 	 * @param   string  variable name
66 | 	 * @return  mixed
67 | 	 */
68 | 	public function __get($key)
69 | 	{
70 | 		return $this->$key;
71 | 	}
72 | 
73 | 	/**
74 | 	 * Change the consumer callback.
75 | 	 *
76 | 	 * @param   string  new consumer callback
77 | 	 * @return  $this
78 | 	 */
79 | 	public function callback($callback)
80 | 	{
81 | 		$this->callback = $callback;
82 | 
83 | 		return $this;
84 | 	}
85 | 
86 | } // End Consumer
87 | 


--------------------------------------------------------------------------------
/libraries/Format.php:
--------------------------------------------------------------------------------
  1 | format->factory(array('foo' => 'bar'))->to_xml();
 22 | 	 *
 23 | 	 * @param   mixed  general date to be converted
 24 | 	 * @param   string  data format the file was provided in
 25 | 	 * @return  Factory
 26 | 	 */
 27 | 	public function factory($data, $from_type = null)
 28 | 	{
 29 | 		// Stupid stuff to emulate the "new static()" stuff in this libraries PHP 5.3 equivalent
 30 | 		$class = __CLASS__;
 31 | 		return new $class($data, $from_type);
 32 | 	}
 33 | 
 34 | 	/**
 35 | 	 * Do not use this directly, call factory()
 36 | 	 */
 37 | 	public function __construct($data = null, $from_type = null)
 38 | 	{
 39 | 		get_instance()->load->helper('inflector');
 40 | 
 41 | 		// If the provided data is already formatted we should probably convert it to an array
 42 | 		if ($from_type !== null)
 43 | 		{
 44 | 			if (method_exists($this, '_from_' . $from_type))
 45 | 			{
 46 | 				$data = call_user_func(array($this, '_from_' . $from_type), $data);
 47 | 			}
 48 | 
 49 | 			else
 50 | 			{
 51 | 				throw new Exception('Format class does not support conversion from "' . $from_type . '".');
 52 | 			}
 53 | 		}
 54 | 
 55 | 		$this->_data = $data;
 56 | 	}
 57 | 
 58 | 	// FORMATING OUTPUT ---------------------------------------------------------
 59 | 
 60 | 	public function to_array($data = null)
 61 | 	{
 62 | 		// If not just null, but nothing is provided
 63 | 		if ($data === null and ! func_num_args())
 64 | 		{
 65 | 			$data = $this->_data;
 66 | 		}
 67 | 
 68 | 		$array = array();
 69 | 
 70 | 		foreach ((array) $data as $key => $value)
 71 | 		{
 72 | 			if (is_object($value) or is_array($value))
 73 | 			{
 74 | 				$array[$key] = $this->to_array($value);
 75 | 			}
 76 | 
 77 | 			else
 78 | 			{
 79 | 				$array[$key] = $value;
 80 | 			}
 81 | 		}
 82 | 
 83 | 		return $array;
 84 | 	}
 85 | 
 86 | 	// Format XML for output
 87 | 	public function to_xml($data = null, $structure = null, $basenode = 'xml')
 88 | 	{
 89 | 		if ($data === null and ! func_num_args())
 90 | 		{
 91 | 			$data = $this->_data;
 92 | 		}
 93 | 
 94 | 		// turn off compatibility mode as simple xml throws a wobbly if you don't.
 95 | 		if (ini_get('zend.ze1_compatibility_mode') == 1)
 96 | 		{
 97 | 			ini_set('zend.ze1_compatibility_mode', 0);
 98 | 		}
 99 | 
100 | 		if ($structure === null)
101 | 		{
102 | 			$structure = simplexml_load_string("<$basenode />");
103 | 		}
104 | 
105 | 		// Force it to be something useful
106 | 		if ( ! is_array($data) AND ! is_object($data))
107 | 		{
108 | 			$data = (array) $data;
109 | 		}
110 | 
111 | 		foreach ($data as $key => $value)
112 | 		{
113 | 
114 | 			//change false/true to 0/1
115 | 			if(is_bool($value))
116 | 			{
117 | 				$value = (int) $value;
118 | 			}
119 | 
120 | 			// no numeric keys in our xml please!
121 | 			if (is_numeric($key))
122 | 			{
123 | 				// make string key...
124 | 				$key = (singular($basenode) != $basenode) ? singular($basenode) : 'item';
125 | 			}
126 | 
127 | 			// replace anything not alpha numeric
128 | 			$key = preg_replace('/[^a-z_\-0-9]/i', '', $key);
129 | 
130 | 			// if there is another array found recursively call this function
131 | 			if (is_array($value) || is_object($value))
132 | 			{
133 | 				$node = $structure->addChild($key);
134 | 
135 | 				// recursive call.
136 | 				$this->to_xml($value, $node, $key);
137 | 			}
138 | 
139 | 			else
140 | 			{
141 | 				// add single node.
142 | 				$value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8");
143 | 
144 | 				$structure->addChild($key, $value);
145 | 			}
146 | 		}
147 | 
148 | 		return $structure->asXML();
149 | 	}
150 | 
151 | 	// Format HTML for output
152 | 	public function to_html()
153 | 	{
154 | 		$data = $this->_data;
155 | 
156 | 		// Multi-dimensional array
157 | 		if (isset($data[0]) && is_array($data[0]))
158 | 		{
159 | 			$headings = array_keys($data[0]);
160 | 		}
161 | 
162 | 		// Single array
163 | 		else
164 | 		{
165 | 			$headings = array_keys($data);
166 | 			$data = array($data);
167 | 		}
168 | 
169 | 		$ci = get_instance();
170 | 		$ci->load->library('table');
171 | 
172 | 		$ci->table->set_heading($headings);
173 | 
174 | 		foreach ($data as &$row)
175 | 		{
176 | 			$ci->table->add_row($row);
177 | 		}
178 | 
179 | 		return $ci->table->generate();
180 | 	}
181 | 
182 | 	// Format CSV for output
183 | 	public function to_csv()
184 | 	{
185 | 		$data = $this->_data;
186 | 
187 | 		// Multi-dimensional array
188 | 		if (isset($data[0]) && is_array($data[0]))
189 | 		{
190 | 			$headings = array_keys($data[0]);
191 | 		}
192 | 
193 | 		// Single array
194 | 		else
195 | 		{
196 | 			$headings = array_keys($data);
197 | 			$data = array($data);
198 | 		}
199 | 
200 | 		$output = implode(',', $headings).PHP_EOL;
201 | 		foreach ($data as &$row)
202 | 		{
203 | 			$output .= '"'.implode('","', $row).'"'.PHP_EOL;
204 | 		}
205 | 
206 | 		return $output;
207 | 	}
208 | 
209 | 	// Encode as JSON
210 | 	public function to_json()
211 | 	{
212 | 		return json_encode($this->_data);
213 | 	}
214 | 
215 | 	// Encode as Serialized array
216 | 	public function to_serialized()
217 | 	{
218 | 		return serialize($this->_data);
219 | 	}
220 | 
221 | 	// Output as a string representing the PHP structure
222 | 	public function to_php()
223 | 	{
224 | 		return var_export($this->_data, TRUE);
225 | 	}
226 | 
227 | 	// Format XML for output
228 | 	protected function _from_xml($string)
229 | 	{
230 | 		return $string ? (array) simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA) : array();
231 | 	}
232 | 
233 | 	// Format CSV for output
234 | 	// This function is DODGY! Not perfect CSV support but works with my REST_Controller
235 | 	protected function _from_csv($string)
236 | 	{
237 | 		$data = array();
238 | 
239 | 		// Splits
240 | 		$rows = explode("\n", trim($string));
241 | 		$headings = explode(',', array_shift($rows));
242 | 		foreach ($rows as $row)
243 | 		{
244 | 			// The substr removes " from start and end
245 | 			$data_fields = explode('","', trim(substr($row, 1, -1)));
246 | 
247 | 			if (count($data_fields) == count($headings))
248 | 			{
249 | 				$data[] = array_combine($headings, $data_fields);
250 | 			}
251 | 		}
252 | 
253 | 		return $data;
254 | 	}
255 | 
256 | 	// Encode as JSON
257 | 	private function _from_json($string)
258 | 	{
259 | 		return json_decode(trim($string));
260 | 	}
261 | 
262 | 	// Encode as Serialized array
263 | 	private function _from_serialize($string)
264 | 	{
265 | 		return unserialize(trim($string));
266 | 	}
267 | 
268 | }
269 | 
270 | /* End of file format.php */


--------------------------------------------------------------------------------
/libraries/OAuth.php:
--------------------------------------------------------------------------------
  1 |  TRUE,
 46 | 	 *         CURLOPT_POSTFIELDS => http_build_query($array),
 47 | 	 *     ));
 48 | 	 *
 49 | 	 * @param   string   remote URL
 50 | 	 * @param   array    curl options
 51 | 	 * @return  string
 52 | 	 * @throws  Exception
 53 | 	 */
 54 | 	public static function remote($url, array $options = NULL)
 55 | 	{
 56 | 		// The transfer must always be returned
 57 | 		$options[CURLOPT_RETURNTRANSFER] = TRUE;
 58 | 
 59 | 		// Open a new remote connection
 60 | 		$remote = curl_init($url);
 61 | 
 62 | 		// Set connection options
 63 | 		if ( ! curl_setopt_array($remote, $options))
 64 | 		{
 65 | 			throw new Exception('Failed to set CURL options, check CURL documentation: http://php.net/curl_setopt_array');
 66 | 		}
 67 | 
 68 | 		// Get the response
 69 | 		$response = curl_exec($remote);
 70 | 
 71 | 		// Get the response information
 72 | 		$code = curl_getinfo($remote, CURLINFO_HTTP_CODE);
 73 | 
 74 | 		if ($code AND ($code < 200 OR $code > 299))
 75 | 		{
 76 | 			$error = $response;
 77 | 		}
 78 | 		elseif ($response === FALSE)
 79 | 		{
 80 | 			$error = curl_error($remote);
 81 | 		}
 82 | 
 83 | 		// Close the connection
 84 | 		curl_close($remote);
 85 | 
 86 | 		if (isset($error))
 87 | 		{
 88 | 			throw new Exception(sprintf('Error fetching remote %s [ status %s ] %s', $url, $code, $error));
 89 | 		}
 90 | 
 91 | 		return $response;
 92 | 	}
 93 | 	/**
 94 | 	 * RFC3986 compatible version of urlencode. Passing an array will encode
 95 | 	 * all of the values in the array. Array keys will not be encoded.
 96 | 	 *
 97 | 	 *     $input = OAuth::urlencode($input);
 98 | 	 *
 99 | 	 * Multi-dimensional arrays are not allowed!
100 | 	 *
101 | 	 * [!!] This method implements [OAuth 1.0 Spec 5.1](http://oauth.net/core/1.0/#rfc.section.5.1).
102 | 	 *
103 | 	 * @param   mixed   input string or array
104 | 	 * @return  mixed
105 | 	 */
106 | 	public static function urlencode($input)
107 | 	{
108 | 		if (is_array($input))
109 | 		{
110 | 			// Encode the values of the array
111 | 			return array_map(array('OAuth', 'urlencode'), $input);
112 | 		}
113 | 
114 | 		// Encode the input
115 | 		$input = rawurlencode($input);
116 | 
117 | 		return $input;
118 | 	}
119 | 
120 | 	/**
121 | 	 * RFC3986 complaint version of urldecode. Passing an array will decode
122 | 	 * all of the values in the array. Array keys will not be encoded.
123 | 	 *
124 | 	 *     $input = OAuth::urldecode($input);
125 | 	 *
126 | 	 * Multi-dimensional arrays are not allowed!
127 | 	 *
128 | 	 * [!!] This method implements [OAuth 1.0 Spec 5.1](http://oauth.net/core/1.0/#rfc.section.5.1).
129 | 	 *
130 | 	 * @param   mixed  input string or array
131 | 	 * @return  mixed
132 | 	 */
133 | 	public static function urldecode($input)
134 | 	{
135 | 		if (is_array($input))
136 | 		{
137 | 			// Decode the values of the array
138 | 			return array_map(array('OAuth', 'urldecode'), $input);
139 | 		}
140 | 
141 | 		// Decode the input
142 | 		return rawurldecode($input);
143 | 	}
144 | 
145 | 	/**
146 | 	 * Normalize all request parameters into a string.
147 | 	 *
148 | 	 *     $query = OAuth::normalize_params($params);
149 | 	 *
150 | 	 * [!!] This method implements [OAuth 1.0 Spec 9.1.1](http://oauth.net/core/1.0/#rfc.section.9.1.1).
151 | 	 *
152 | 	 * @param   array   request parameters
153 | 	 * @return  string
154 | 	 * @uses    OAuth::urlencode
155 | 	 */
156 | 	public static function normalize_params(array $params = NULL)
157 | 	{
158 | 		if ( ! $params)
159 | 		{
160 | 			// Nothing to do
161 | 			return '';
162 | 		}
163 | 
164 | 		// Encode the parameter keys and values
165 | 		$keys   = OAuth::urlencode(array_keys($params));
166 | 		$values = OAuth::urlencode(array_values($params));
167 | 
168 | 		// Recombine the parameters
169 | 		$params = array_combine($keys, $values);
170 | 
171 | 		// OAuth Spec 9.1.1 (1)
172 | 		// "Parameters are sorted by name, using lexicographical byte value ordering."
173 | 		uksort($params, 'strcmp');
174 | 
175 | 		// Create a new query string
176 | 		$query = array();
177 | 
178 | 		foreach ($params as $name => $value)
179 | 		{
180 | 			if (is_array($value))
181 | 			{
182 | 				// OAuth Spec 9.1.1 (1)
183 | 				// "If two or more parameters share the same name, they are sorted by their value."
184 | 				$value = natsort($value);
185 | 
186 | 				foreach ($value as $duplicate)
187 | 				{
188 | 					$query[] = $name.'='.$duplicate;
189 | 				}
190 | 			}
191 | 			else
192 | 			{
193 | 				$query[] = $name.'='.$value;
194 | 			}
195 | 		}
196 | 
197 | 		return implode('&', $query);
198 | 	}
199 | 
200 | 	/**
201 | 	 * Parse the query string out of the URL and return it as parameters.
202 | 	 * All GET parameters must be removed from the request URL when building
203 | 	 * the base string and added to the request parameters.
204 | 	 *
205 | 	 *     // parsed parameters: array('oauth_key' => 'abcdef123456789')
206 | 	 *     list($url, $params) = OAuth::parse_url('http://example.com/oauth/access?oauth_key=abcdef123456789');
207 | 	 *
208 | 	 * [!!] This implements [OAuth Spec 9.1.1](http://oauth.net/core/1.0/#rfc.section.9.1.1).
209 | 	 *
210 | 	 * @param   string  URL to parse
211 | 	 * @return  array   (clean_url, params)
212 | 	 * @uses    OAuth::parse_params
213 | 	 */
214 | 	public static function parse_url($url)
215 | 	{
216 | 		if ($query = parse_url($url, PHP_URL_QUERY))
217 | 		{
218 | 			// Remove the query string from the URL
219 | 			list($url) = explode('?', $url, 2);
220 | 
221 | 			// Parse the query string as request parameters
222 | 			$params = OAuth::parse_params($query);
223 | 		}
224 | 		else
225 | 		{
226 | 			// No parameters are present
227 | 			$params = array();
228 | 		}
229 | 
230 | 		return array($url, $params);
231 | 	}
232 | 
233 | 	/**
234 | 	 * Parse the parameters in a string and return an array. Duplicates are
235 | 	 * converted into indexed arrays.
236 | 	 *
237 | 	 *     // Parsed: array('a' => '1', 'b' => '2', 'c' => '3')
238 | 	 *     $params = OAuth::parse_params('a=1,b=2,c=3');
239 | 	 *
240 | 	 *     // Parsed: array('a' => array('1', '2'), 'c' => '3')
241 | 	 *     $params = OAuth::parse_params('a=1,a=2,c=3');
242 | 	 *
243 | 	 * @param   string  parameter string
244 | 	 * @return  array
245 | 	 */
246 | 	public static function parse_params($params)
247 | 	{
248 | 		// Split the parameters by &
249 | 		$params = explode('&', trim($params));
250 | 
251 | 		// Create an array of parsed parameters
252 | 		$parsed = array();
253 | 
254 | 		foreach ($params as $param)
255 | 		{
256 | 			// Split the parameter into name and value
257 | 			list($name, $value) = explode('=', $param, 2);
258 | 
259 | 			// Decode the name and value
260 | 			$name  = OAuth::urldecode($name);
261 | 			$value = OAuth::urldecode($value);
262 | 
263 | 			if (isset($parsed[$name]))
264 | 			{
265 | 				if ( ! is_array($parsed[$name]))
266 | 				{
267 | 					// Convert the parameter to an array
268 | 					$parsed[$name] = array($parsed[$name]);
269 | 				}
270 | 
271 | 				// Add a new duplicate parameter
272 | 				$parsed[$name][] = $value;
273 | 			}
274 | 			else
275 | 			{
276 | 				// Add a new parameter
277 | 				$parsed[$name] = $value;
278 | 			}
279 | 		}
280 | 
281 | 		return $parsed;
282 | 	}
283 | 
284 | } // End OAuth
285 | 


--------------------------------------------------------------------------------
/libraries/Provider.php:
--------------------------------------------------------------------------------
  1 | signature = $options['signature'];
 57 | 		}
 58 | 
 59 | 		if ( ! is_object($this->signature))
 60 | 		{
 61 | 			// Convert the signature name into an object
 62 | 			$this->signature = OAuth_Signature::forge($this->signature);
 63 | 		}
 64 | 
 65 | 		if ( ! $this->name)
 66 | 		{
 67 | 			// Attempt to guess the name from the class name
 68 | 			$this->name = strtolower(substr(get_class($this), strlen('Provider_')));
 69 | 		}
 70 | 	}
 71 | 
 72 | 	/**
 73 | 	 * Return the value of any protected class variable.
 74 | 	 *
 75 | 	 *     // Get the provider signature
 76 | 	 *     $signature = $provider->signature;
 77 | 	 *
 78 | 	 * @param   string  variable name
 79 | 	 * @return  mixed
 80 | 	 */
 81 | 	public function __get($key)
 82 | 	{
 83 | 		return $this->$key;
 84 | 	}
 85 | 
 86 | 	/**
 87 | 	 * Returns the request token URL for the provider.
 88 | 	 *
 89 | 	 *     $url = $provider->url_request_token();
 90 | 	 *
 91 | 	 * @return  string
 92 | 	 */
 93 | 	abstract public function url_request_token();
 94 | 
 95 | 	/**
 96 | 	 * Returns the authorization URL for the provider.
 97 | 	 *
 98 | 	 *     $url = $provider->url_authorize();
 99 | 	 *
100 | 	 * @return  string
101 | 	 */
102 | 	abstract public function url_authorize();
103 | 
104 | 	/**
105 | 	 * Returns the access token endpoint for the provider.
106 | 	 *
107 | 	 *     $url = $provider->url_access_token();
108 | 	 *
109 | 	 * @return  string
110 | 	 */
111 | 	abstract public function url_access_token();
112 | 	
113 | 	/**
114 | 	 * Returns basic information about the user.
115 | 	 *
116 | 	 *     $url = $provider->get_user_info();
117 | 	 *
118 | 	 * @return  string
119 | 	 */
120 | 	abstract public function get_user_info(OAuth_Consumer $consumer, OAuth_Token $token);
121 | 
122 | 	/**
123 | 	 * Ask for a request token from the OAuth provider.
124 | 	 *
125 | 	 *     $token = $provider->request_token($consumer);
126 | 	 *
127 | 	 * @param   Consumer  consumer
128 | 	 * @param   array           additional request parameters
129 | 	 * @return  Token_Request
130 | 	 * @uses    Request_Token
131 | 	 */
132 | 	public function request_token(OAuth_Consumer $consumer, array $params = NULL)
133 | 	{
134 | 		// Create a new GET request for a request token with the required parameters
135 | 		$request = OAuth_Request::forge('token', 'GET', $this->url_request_token(), array(
136 | 			'oauth_consumer_key' => $consumer->key,
137 | 			'oauth_callback'     => $consumer->callback,
138 | 			'scope'     		 => is_array($consumer->scope) ? implode($this->scope_seperator, $consumer->scope) : $consumer->scope,
139 | 		));
140 | 
141 | 		if ($params)
142 | 		{
143 | 			// Load user parameters
144 | 			$request->params($params);
145 | 		}
146 | 
147 | 		// Sign the request using only the consumer, no token is available yet
148 | 		$request->sign($this->signature, $consumer);
149 | 
150 | 		// Create a response from the request
151 | 		$response = $request->execute();
152 | 
153 | 		// Store this token somewhere useful
154 | 		return OAuth_Token::forge('request', array(
155 | 			'access_token'  => $response->param('oauth_token'),
156 | 			'secret' => $response->param('oauth_token_secret'),
157 | 		));
158 | 	}
159 | 
160 | 	/**
161 | 	 * Get the authorization URL for the request token.
162 | 	 *
163 | 	 *     Response::redirect($provider->authorize_url($token));
164 | 	 *
165 | 	 * @param   Token_Request  token
166 | 	 * @param   array                additional request parameters
167 | 	 * @return  string
168 | 	 */
169 | 	public function authorize(OAuth_Token_Request $token, array $params = NULL)
170 | 	{
171 | 		// Create a new GET request for a request token with the required parameters
172 | 		$request = OAuth_Request::forge('authorize', 'GET', $this->url_authorize(), array(
173 | 			'oauth_token' => $token->access_token,
174 | 		));
175 | 
176 | 		if ($params)
177 | 		{
178 | 			// Load user parameters
179 | 			$request->params($params);
180 | 		}
181 | 
182 | 		return $request->as_url();
183 | 	}
184 | 
185 | 	/**
186 | 	 * Exchange the request token for an access token.
187 | 	 *
188 | 	 *     $token = $provider->access_token($consumer, $token);
189 | 	 *
190 | 	 * @param   Consumer       consumer
191 | 	 * @param   Token_Request  token
192 | 	 * @param   array                additional request parameters
193 | 	 * @return  Token_Access
194 | 	 */
195 | 	public function access_token(OAuth_Consumer $consumer, OAuth_Token_Request $token, array $params = NULL)
196 | 	{
197 | 		// Create a new GET request for a request token with the required parameters
198 | 		$request = OAuth_Request::forge('access', 'GET', $this->url_access_token(), array(
199 | 			'oauth_consumer_key' => $consumer->key,
200 | 			'oauth_token'        => $token->access_token,
201 | 			'oauth_verifier'     => $token->verifier,
202 | 		));
203 | 
204 | 		if ($params)
205 | 		{
206 | 			// Load user parameters
207 | 			$request->params($params);
208 | 		}
209 | 
210 | 		// Sign the request using only the consumer, no token is available yet
211 | 		$request->sign($this->signature, $consumer, $token);
212 | 
213 | 		// Create a response from the request
214 | 		$response = $request->execute();
215 | 		
216 | 		// Store this token somewhere useful
217 | 		return OAuth_Token::forge('access', array(
218 | 			'access_token'  => $response->param('oauth_token'),
219 | 			'secret' => $response->param('oauth_token_secret'),
220 | 			'uid' => $response->param($this->uid_key) ? $response->param($this->uid_key) : get_instance()->input->get_post($this->uid_key),
221 | 		));
222 | 	}
223 | 
224 | } // End Provider


--------------------------------------------------------------------------------
/libraries/Provider/Dropbox.php:
--------------------------------------------------------------------------------
 1 |  $consumer->key,
27 | 			'oauth_token' => $token->access_token,
28 | 		));
29 | 
30 | 		// Sign the request using the consumer and token
31 | 		$request->sign($this->signature, $consumer, $token);
32 | 
33 | 		$user = json_decode($request->execute());
34 | 		
35 | 		// Create a response from the request
36 | 		return array(
37 | 			'uid' => $token->uid,
38 | 			'name' => $user->display_name,
39 | 			'email' => $user->email,
40 | 			'location' => $user->country,
41 | 		);
42 | 	}
43 | 
44 | } // End Provider_Dropbox


--------------------------------------------------------------------------------
/libraries/Provider/Flickr.php:
--------------------------------------------------------------------------------
 1 |  $consumer->key,
28 | 			'oauth_token' => $token->access_token,
29 | 			'nojsoncallback' => 1,
30 | 			'format' => 'json',
31 | 			'user_id' => $token->uid,
32 | 			'method' => 'flickr.people.getInfo',
33 | 		));
34 | 
35 | 		// Sign the request using the consumer and token
36 | 		$request->sign($this->signature, $consumer, $token);
37 | 
38 | 		$response = json_decode($request->execute(), true);
39 | 		$user = $response['person'];
40 | 
41 | 		// Create a response from the request
42 | 		return array(
43 | 			'uid' => $user['nsid'],
44 | 			'name' => isset($user['realname']['_content']) ? $user['realname']['_content'] : $user['username']['_content'],
45 | 			'nickname' => $user['username']['_content'],
46 | 			'location' => isset($user['location']['_content']) ? $user['location']['_content'] : NULL,
47 | 			'image' => $user['iconserver'] ? "http://farm{$user['iconfarm']}.staticflickr.com/{$user['iconserver']}/buddyicons/{$user['nsid']}.jpg" : NULL,
48 | 			'urls' => array(
49 | 				'photos' => $user['photosurl']['_content'],
50 | 				'profile' => $user['profileurl']['_content'],
51 | 			),
52 | 		);
53 | 	}
54 | 
55 | } // End Provider_Flickr


--------------------------------------------------------------------------------
/libraries/Provider/Google.php:
--------------------------------------------------------------------------------
 1 |  $consumer->key,
48 | 			'oauth_token' => $token->access_token,
49 | 		));
50 | 
51 | 		// Sign the request using the consumer and token
52 | 		$request->sign($this->signature, $consumer, $token);
53 | 
54 | 		$response = json_decode($request->execute(), true);
55 | 		
56 | 		// Fetch data parts
57 | 		$email = \Arr::get($response, 'feed.id.$t');
58 | 		$name = \Arr::get($response, 'feed.author.0.name.$t');
59 | 		$name == '(unknown)' and $name = $email;
60 | 		
61 | 		return array(
62 | 			'uid' => $email,
63 | 			'nickname' => \Inflector::friendly_title($name),
64 | 			'name' => $name,
65 | 			'email' => $email,
66 | 			'location' => null,
67 | 			'image' => null,
68 | 			'description' => null,
69 | 			'urls' => array(),
70 | 		);
71 | 	}
72 | 
73 | } // End Provider_Gmail


--------------------------------------------------------------------------------
/libraries/Provider/Linkedin.php:
--------------------------------------------------------------------------------
 1 | .
 7 |  *
 8 |  * [!!] This class does not implement the LinkedIn API. It is only an
 9 |  * implementation of standard OAuth with Twitter as the service provider.
10 |  *
11 |  */
12 | 
13 | class OAuth_Provider_Linkedin extends OAuth_Provider {
14 | 
15 | 	public $name = 'linkedin';
16 | 
17 | 	public function url_request_token()
18 | 	{
19 | 		return 'https://api.linkedin.com/uas/oauth/requestToken';
20 | 	}
21 | 
22 | 	public function url_authorize()
23 | 	{
24 | 		return 'https://api.linkedin.com/uas/oauth/authorize';
25 | 	}
26 | 
27 | 	public function url_access_token()
28 | 	{
29 | 		return 'https://api.linkedin.com/uas/oauth/accessToken';
30 | 	}
31 | 	
32 | 	public function get_user_info(OAuth_Consumer $consumer, OAuth_Token $token)
33 | 	{
34 | 		// Create a new GET request with the required parameters
35 | 		$url = 'https://api.linkedin.com/v1/people/~:(id,first-name,last-name,headline,member-url-resources,picture-url,location,public-profile-url)';
36 | 		$request = OAuth_Request::forge('resource', 'GET', $url, array(
37 | 			'oauth_consumer_key' => $consumer->key,
38 | 			'oauth_token' => $token->access_token,
39 | 		));
40 | 
41 | 		// Sign the request using the consumer and token
42 | 		$request->sign($this->signature, $consumer, $token);
43 | 
44 | 		$user = OAuth_Format::factory($request->execute(), 'xml')->to_array();
45 | 		
46 | 		// Create a response from the request
47 | 		return array(
48 | 			'uid' => $user['id'],
49 | 			'name' => $user['first-name'].' '.$user['last-name'],
50 | 			'nickname' => end(explode('/', $user['public-profile-url'])),
51 | 			'description' => $user['headline'],
52 | 			'location' => isset($user['location']['name']) ? $user['location']['name'] : null,
53 | 			'urls' => array(
54 | 			  'Linked In' => $user['public-profile-url'],
55 | 			),
56 | 		);
57 | 	}
58 | 
59 | } // End Provider_Dropbox


--------------------------------------------------------------------------------
/libraries/Provider/Tumblr.php:
--------------------------------------------------------------------------------
 1 | .
 7 |  *
 8 |  * [!!] This class does not implement the Tumblr API. It is only an
 9 |  * implementation of standard OAuth with Tumblr as the service provider.
10 |  *
11 |  * @package    OAuth
12 |  * @category   Provider
13 |  * @author     Fuel Development Team
14 |  */
15 | 
16 | class OAuth_Provider_Tumblr extends OAuth_Provider {
17 | 
18 | 	public $name = 'tumblr';
19 | 
20 | 	public function url_request_token()
21 | 	{
22 | 		return 'http://www.tumblr.com/oauth/request_token';
23 | 	}
24 | 
25 | 	public function url_authorize()
26 | 	{
27 | 		return 'http://www.tumblr.com/oauth/authorize';
28 | 	}
29 | 
30 | 	public function url_access_token()
31 | 	{
32 | 		return 'http://www.tumblr.com/oauth/access_token';
33 | 	}
34 | 	
35 | 	public function get_user_info(OAuth_Consumer $consumer, OAuth_Token $token)
36 | 	{
37 | 		// Create a new GET request with the required parameters
38 | 		$request = OAuth_Request::forge('resource', 'GET', 'http://api.tumblr.com/v2/user/info', array(
39 | 			'oauth_consumer_key' => $consumer->key,
40 | 			'oauth_token' => $token->access_token,
41 | 		));
42 | 
43 | 		// Sign the request using the consumer and token
44 | 		$request->sign($this->signature, $consumer, $token);
45 | 
46 | 		$response = json_decode($request->execute());
47 | 
48 | 		$status = current($response);
49 | 		$response = next($response);
50 | 		$user = $response->user;
51 | 		
52 | 		// Create a response from the request
53 | 		return array(
54 | 			'uid' => $user->name,    // Tumblr doesn't provide a unique key other than name
55 | 			'name' => $user->name,
56 | 			'likes' => $user->likes,
57 | 			'following' => $user->following,
58 | 			'default_post_format' => $user->default_post_format,
59 | 		);
60 | 	}
61 | 
62 | } // End Provider_Tumblr


--------------------------------------------------------------------------------
/libraries/Provider/Twitter.php:
--------------------------------------------------------------------------------
 1 |  $consumer->key,
29 | 			'oauth_token' => $token->access_token,
30 | 			'user_id' => $token->uid,
31 | 		));
32 | 
33 | 		// Sign the request using the consumer and token
34 | 		$request->sign($this->signature, $consumer, $token);
35 | 
36 | 		$user = current(json_decode($request->execute()));
37 | 		
38 | 		// Create a response from the request
39 | 		return array(
40 | 			'uid' => $token->uid,
41 | 			'nickname' => $user->screen_name,
42 | 			'name' => $user->name ? $user->name : $user->screen_name,
43 | 			'location' => $user->location,
44 | 			'image' => $user->profile_image_url,
45 | 			'description' => $user->description,
46 | 			'urls' => array(
47 | 			  'Website' => $user->url,
48 | 			  'Twitter' => 'http://twitter.com/'.$user->screen_name,
49 | 			),
50 | 		);
51 | 	}
52 | 
53 | } // End Provider_Twitter
54 | 


--------------------------------------------------------------------------------
/libraries/Request.php:
--------------------------------------------------------------------------------
  1 | method = strtoupper($method);
 81 | 		}
 82 | 
 83 | 		// Separate the URL and query string, which will be used as additional
 84 | 		// default parameters
 85 | 		list ($url, $default) = OAuth::parse_url($url);
 86 | 
 87 | 		// Set the request URL
 88 | 		$this->url = $url;
 89 | 
 90 | 		if ($default)
 91 | 		{
 92 | 			// Set the default parameters
 93 | 			$this->params($default);
 94 | 		}
 95 | 
 96 | 		if ($params)
 97 | 		{
 98 | 			// Set the request parameters
 99 | 			$this->params($params);
100 | 		}
101 | 
102 | 		if ($this->required('oauth_version') AND ! isset($this->params['oauth_version']))
103 | 		{
104 | 			// Set the version of this request
105 | 			$this->params['oauth_version'] = OAuth::$version;
106 | 		}
107 | 
108 | 		if ($this->required('oauth_timestamp') AND ! isset($this->params['oauth_timestamp']))
109 | 		{
110 | 			// Set the timestamp of this request
111 | 			$this->params['oauth_timestamp'] = $this->timestamp();
112 | 		}
113 | 
114 | 		if ($this->required('oauth_nonce') AND ! isset($this->params['oauth_nonce']))
115 | 		{
116 | 			// Set the unique nonce of this request
117 | 			$this->params['oauth_nonce'] = $this->nonce();
118 | 		}
119 | 	}
120 | 
121 | 	/**
122 | 	 * Return the value of any protected class variable.
123 | 	 *
124 | 	 *     // Get the request parameters
125 | 	 *     $params = $request->params;
126 | 	 *
127 | 	 *     // Get the request URL
128 | 	 *     $url = $request->url;
129 | 	 *
130 | 	 * @param   string  variable name
131 | 	 * @return  mixed
132 | 	 */
133 | 	public function __get($key)
134 | 	{
135 | 		return $this->$key;
136 | 	}
137 | 
138 | 	/**
139 | 	 * Generates the UNIX timestamp for a request.
140 | 	 *
141 | 	 *     $time = $request->timestamp();
142 | 	 *
143 | 	 * [!!] This method implements [OAuth 1.0 Spec 8](http://oauth.net/core/1.0/#rfc.section.8).
144 | 	 *
145 | 	 * @return  integer
146 | 	 */
147 | 	public function timestamp()
148 | 	{
149 | 		return time();
150 | 	}
151 | 
152 | 	/**
153 | 	 * Generates the nonce for a request.
154 | 	 *
155 | 	 *     $nonce = $request->nonce();
156 | 	 *
157 | 	 * [!!] This method implements [OAuth 1.0 Spec 8](http://oauth.net/core/1.0/#rfc.section.8).
158 | 	 *
159 | 	 * @return  string
160 | 	 * @uses    Text::random
161 | 	 */
162 | 	public function nonce()
163 | 	{
164 | 		get_instance()->load->helper('string');
165 | 		return random_string('alnum', 40);
166 | 	}
167 | 
168 | 	/**
169 | 	 * Get the base signature string for a request.
170 | 	 *
171 | 	 *     $base = $request->base_string();
172 | 	 *
173 | 	 * [!!] This method implements [OAuth 1.0 Spec A5.1](http://oauth.net/core/1.0/#rfc.section.A.5.1).
174 | 	 *
175 | 	 * @param   Request   request to sign
176 | 	 * @return  string
177 | 	 * @uses    OAuth::urlencode
178 | 	 * @uses    OAuth::normalize_params
179 | 	 */
180 | 	public function base_string()
181 | 	{
182 | 		$url = $this->url;
183 | 
184 | 		// Get the request parameters
185 | 		$params = array_diff_key($this->params, $this->upload);
186 | 
187 | 		// "oauth_signature" is never included in the base string!
188 | 		unset($params['oauth_signature']);
189 | 
190 | 		// method & url & sorted-parameters
191 | 		return implode('&', array(
192 | 			$this->method,
193 | 			OAuth::urlencode($url),
194 | 			OAuth::urlencode(OAuth::normalize_params($params)),
195 | 		));
196 | 	}
197 | 
198 | 	/**
199 | 	 * Parameter getter and setter. Setting the value to `NULL` will remove it.
200 | 	 *
201 | 	 *     // Set the "oauth_consumer_key" to a new value
202 | 	 *     $request->param('oauth_consumer_key', $key);
203 | 	 *
204 | 	 *     // Get the "oauth_consumer_key" value
205 | 	 *     $key = $request->param('oauth_consumer_key');
206 | 	 *
207 | 	 * @param   string   parameter name
208 | 	 * @param   mixed    parameter value
209 | 	 * @param   boolean  allow duplicates?
210 | 	 * @return  mixed    when getting
211 | 	 * @return  $this    when setting
212 | 	 * @uses    Arr::get
213 | 	 */
214 | 	public function param($name, $value = NULL, $duplicate = FALSE)
215 | 	{
216 | 		if ($value === NULL)
217 | 		{
218 | 			// Get the parameter
219 | 			return isset($this->params[$name]) ? $this->params[$name] : null;
220 | 		}
221 | 
222 | 		if (isset($this->params[$name]) AND $duplicate)
223 | 		{
224 | 			if ( ! is_array($this->params[$name]))
225 | 			{
226 | 				// Convert the parameter into an array
227 | 				$this->params[$name] = array($this->params[$name]);
228 | 			}
229 | 
230 | 			// Add the duplicate value
231 | 			$this->params[$name][] = $value;
232 | 		}
233 | 		else
234 | 		{
235 | 			// Set the parameter value
236 | 			$this->params[$name] = $value;
237 | 		}
238 | 
239 | 		return $this;
240 | 	}
241 | 
242 | 	/**
243 | 	 * Set multiple parameters.
244 | 	 *
245 | 	 *     $request->params($params);
246 | 	 *
247 | 	 * @param   array    parameters
248 | 	 * @param   boolean  allow duplicates?
249 | 	 * @return  $this
250 | 	 * @uses    Request::param
251 | 	 */
252 | 	public function params(array $params, $duplicate = FALSE)
253 | 	{
254 | 		foreach ($params as $name => $value)
255 | 		{
256 | 			$this->param($name, $value, $duplicate);
257 | 		}
258 | 
259 | 		return $this;
260 | 	}
261 | 
262 | 	/**
263 | 	 * Upload getter and setter. Setting the value to `NULL` will remove it.
264 | 	 *
265 | 	 *     // Set the "image" file path for uploading
266 | 	 *     $request->upload('image', $file_path);
267 | 	 *
268 | 	 *     // Get the "image" file path
269 | 	 *     $key = $request->param('oauth_consumer_key');
270 | 	 *
271 | 	 * @param   string   upload name
272 | 	 * @param   mixed    upload file path
273 | 	 * @return  mixed    when getting
274 | 	 * @return  $this    when setting
275 | 	 * @uses    Request::param
276 | 	 */
277 | 	public function upload($name, $value = NULL)
278 | 	{
279 | 		if ($value !== NULL)
280 | 		{
281 | 			// This is an upload parameter
282 | 			$this->upload[$name] = TRUE;
283 | 
284 | 			// Get the mime type of the image
285 | 			$mime = get_mime_by_extension($value);
286 | 
287 | 			// Format the image path for CURL
288 | 			$value = "@{$value};type={$mime}";
289 | 		}
290 | 
291 | 		return $this->param($name, $value, FALSE);
292 | 	}
293 | 
294 | 	/**
295 | 	 * Get and set required parameters.
296 | 	 *
297 | 	 *     $request->required($field, $value);
298 | 	 *
299 | 	 * @param   string   parameter name
300 | 	 * @param   boolean  field value
301 | 	 * @return  boolean  when getting
302 | 	 * @return  $this    when setting
303 | 	 */
304 | 	public function required($param, $value = NULL)
305 | 	{
306 | 		if ($value === NULL)
307 | 		{
308 | 			// Get the current status
309 | 			return ! empty($this->required[$param]);
310 | 		}
311 | 
312 | 		// Change the requirement value
313 | 		$this->required[$param] = (boolean) $value;
314 | 
315 | 		return $this;
316 | 	}
317 | 
318 | 	/**
319 | 	 * Convert the request parameters into an `Authorization` header.
320 | 	 *
321 | 	 *     $header = $request->as_header();
322 | 	 *
323 | 	 * [!!] This method implements [OAuth 1.0 Spec 5.4.1](http://oauth.net/core/1.0/#rfc.section.5.4.1).
324 | 	 *
325 | 	 * @return  string
326 | 	 */
327 | 	public function as_header()
328 | 	{
329 | 		$header = array();
330 | 
331 | 		foreach ($this->params as $name => $value)
332 | 		{
333 | 			if (strpos($name, 'oauth_') === 0)
334 | 			{
335 | 				// OAuth Spec 5.4.1
336 | 				// "Parameter names and values are encoded per Parameter Encoding [RFC 3986]."
337 | 				$header[] = OAuth::urlencode($name).'="'.OAuth::urlencode($value).'"';
338 | 			}
339 | 		}
340 | 
341 | 		return 'OAuth '.implode(', ', $header);
342 | 	}
343 | 
344 | 	/**
345 | 	 * Convert the request parameters into a query string, suitable for GET and
346 | 	 * POST requests.
347 | 	 *
348 | 	 *     $query = $request->as_query();
349 | 	 *
350 | 	 * [!!] This method implements [OAuth 1.0 Spec 5.2 (2,3)](http://oauth.net/core/1.0/#rfc.section.5.2).
351 | 	 *
352 | 	 * @param   boolean   include oauth parameters?
353 | 	 * @param   boolean   return a normalized string?
354 | 	 * @return  string
355 | 	 */
356 | 	public function as_query($include_oauth = NULL, $as_string = TRUE)
357 | 	{
358 | 		if ($include_oauth === NULL)
359 | 		{
360 | 			// If we are sending a header, OAuth parameters should not be
361 | 			// included in the query string.
362 | 			$include_oauth = ! $this->send_header;
363 | 		}
364 | 
365 | 		if ($include_oauth)
366 | 		{
367 | 			$params = $this->params;
368 | 		}
369 | 		else
370 | 		{
371 | 			$params = array();
372 | 			foreach ($this->params as $name => $value)
373 | 			{
374 | 				if (strpos($name, 'oauth_') !== 0)
375 | 				{
376 | 					// This is not an OAuth parameter
377 | 					$params[$name] = $value;
378 | 				}
379 | 			}
380 | 		}
381 | 
382 | 		return $as_string ? OAuth::normalize_params($params) : $params;
383 | 	}
384 | 
385 | 	/**
386 | 	 * Return the entire request URL with the parameters as a GET string.
387 | 	 *
388 | 	 *     $url = $request->as_url();
389 | 	 *
390 | 	 * @return  string
391 | 	 * @uses    Request::as_query
392 | 	 */
393 | 	public function as_url()
394 | 	{
395 | 		return $this->url.'?'.$this->as_query(TRUE);
396 | 	}
397 | 
398 | 	/**
399 | 	 * Sign the request, setting the `oauth_signature_method` and `oauth_signature`.
400 | 	 *
401 | 	 * @param   Signature  signature
402 | 	 * @param   Consumer   consumer
403 | 	 * @param   Token      token
404 | 	 * @return  $this
405 | 	 * @uses    Signature::sign
406 | 	 */
407 | 	public function sign(OAuth_Signature $signature, OAuth_Consumer $consumer, OAuth_Token $token = NULL)
408 | 	{
409 | 		// Create a new signature class from the method
410 | 		$this->param('oauth_signature_method', $signature->name);
411 | 
412 | 		// Sign the request using the consumer and token
413 | 		$this->param('oauth_signature', $signature->sign($this, $consumer, $token));
414 | 
415 | 		return $this;
416 | 	}
417 | 
418 | 	/**
419 | 	 * Checks that all required request parameters have been set. Throws an
420 | 	 * exception if any parameters are missing.
421 | 	 *
422 | 	 *     try
423 | 	 *     {
424 | 	 *         $request->check();
425 | 	 *     }
426 | 	 *     catch (Exception $e)
427 | 	 *     {
428 | 	 *         // Request has missing parameters
429 | 	 *     }
430 | 	 *
431 | 	 * @return  TRUE
432 | 	 * @throws  Exception
433 | 	 */
434 | 	public function check()
435 | 	{
436 | 		foreach ($this->required as $param => $required)
437 | 		{
438 | 			if ($required AND ! isset($this->params[$param]))
439 | 			{
440 | 				throw new Exception(sprintf('Request to %s requires missing parameter "%s"', $this->url, $param));
441 | 			}
442 | 		}
443 | 
444 | 		return TRUE;
445 | 	}
446 | 
447 | 	/**
448 | 	 * Execute the request and return a response.
449 | 	 *
450 | 	 * @param   array    additional cURL options
451 | 	 * @return  string   request response body
452 | 	 * @uses    Request::check
453 | 	 * @uses    Arr::get
454 | 	 * @uses    Remote::get
455 | 	 */
456 | 	public function execute(array $options = NULL)
457 | 	{
458 | 		// Check that all required fields are set
459 | 		$this->check();
460 | 
461 | 		// Get the URL of the request
462 | 		$url = $this->url;
463 | 
464 | 		if ( ! isset($options[CURLOPT_CONNECTTIMEOUT]))
465 | 		{
466 | 			// Use the request default timeout
467 | 			$options[CURLOPT_CONNECTTIMEOUT] = $this->timeout;
468 | 		}
469 | 
470 | 		if (ENVIRONMENT === 'development')
471 | 		{
472 | 			$options[CURLOPT_SSL_VERIFYPEER] = false;
473 | 		}
474 | 
475 | 		if ($this->send_header)
476 | 		{
477 | 			// Get the the current headers
478 | 			$headers = isset($options[CURLOPT_HTTPHEADER]) ? $options[CURLOPT_HTTPHEADER] : array();
479 | 
480 | 			// Add the Authorization header
481 | 			$headers[] = 'Authorization: '.$this->as_header();
482 | 
483 | 			// Store the new headers
484 | 			$options[CURLOPT_HTTPHEADER] = $headers;
485 | 		}
486 | 
487 | 		if ($this->method === 'POST')
488 | 		{
489 | 			// Send the request as a POST
490 | 			$options[CURLOPT_POST] = TRUE;
491 | 
492 | 			if ($post = $this->as_query(NULL, empty($this->upload)))
493 | 			{
494 | 				// Attach the post fields to the request
495 | 				$options[CURLOPT_POSTFIELDS] = $post;
496 | 			}
497 | 		}
498 | 		elseif ($query = $this->as_query())
499 | 		{
500 | 			// Append the parameters to the query string
501 | 			$url = "{$url}?{$query}";
502 | 		}
503 | 
504 | 		return OAuth::remote($url, $options);
505 | 	}
506 | 
507 | } // End Request
508 | 


--------------------------------------------------------------------------------
/libraries/Request/Access.php:
--------------------------------------------------------------------------------
 1 |  TRUE,
 9 | 		'oauth_token'            => TRUE,
10 | 		'oauth_signature_method' => TRUE,
11 | 		'oauth_signature'        => TRUE,
12 | 		'oauth_timestamp'        => TRUE,
13 | 		'oauth_nonce'            => TRUE,
14 | 		// 'oauth_verifier'         => TRUE,
15 | 		'oauth_version'          => TRUE,
16 | 	);
17 | 
18 | 	public function execute(array $options = NULL)
19 | 	{
20 | 		return new OAuth_Response(parent::execute($options));
21 | 	}
22 | 
23 | } // End Request_Access


--------------------------------------------------------------------------------
/libraries/Request/Authorize.php:
--------------------------------------------------------------------------------
 1 |  TRUE,
10 | 	);
11 | 
12 | 	public function execute(array $options = NULL)
13 | 	{
14 | 		return redirect($this->as_url());
15 | 	}
16 | 
17 | } // End Request_Authorize


--------------------------------------------------------------------------------
/libraries/Request/Credentials.php:
--------------------------------------------------------------------------------
1 |  TRUE,
10 | 		'oauth_token'            => TRUE,
11 | 		'oauth_signature_method' => TRUE,
12 | 		'oauth_signature'        => TRUE,
13 | 		'oauth_timestamp'        => TRUE,
14 | 		'oauth_nonce'            => TRUE,
15 | 		'oauth_version'          => TRUE,
16 | 	);
17 | 
18 | } // End Request_Resource


--------------------------------------------------------------------------------
/libraries/Request/Token.php:
--------------------------------------------------------------------------------
 1 |  TRUE,
10 | 		'oauth_consumer_key'     => TRUE,
11 | 		'oauth_signature_method' => TRUE,
12 | 		'oauth_signature'        => TRUE,
13 | 		'oauth_timestamp'        => TRUE,
14 | 		'oauth_nonce'            => TRUE,
15 | 		'oauth_version'          => TRUE,
16 | 	);
17 | 
18 | 
19 | 	public function execute(array $options = NULL)
20 | 	{
21 | 		return new OAuth_Response(parent::execute($options));
22 | 	}
23 | 
24 | } // End Request_Token


--------------------------------------------------------------------------------
/libraries/Response.php:
--------------------------------------------------------------------------------
 1 | params = OAuth::parse_params($body);
15 | 		}
16 | 	}
17 | 
18 | 	/**
19 | 	 * Return the value of any protected class variable.
20 | 	 *
21 | 	 *     // Get the response parameters
22 | 	 *     $params = $response->params;
23 | 	 *
24 | 	 * @param   string  variable name
25 | 	 * @return  mixed
26 | 	 */
27 | 	public function __get($key)
28 | 	{
29 | 		return $this->$key;
30 | 	}
31 | 
32 | 	public function param($name, $default = NULL)
33 | 	{
34 | 		return isset($this->params[$name]) ? $this->params[$name] : $default;
35 | 	}
36 | 
37 | } // End Response
38 | 


--------------------------------------------------------------------------------
/libraries/Signature.php:
--------------------------------------------------------------------------------
 1 | name;
35 | 	 *
36 | 	 * @param   string  variable name
37 | 	 * @return  mixed
38 | 	 */
39 | 	public function __get($key)
40 | 	{
41 | 		return $this->$key;
42 | 	}
43 | 
44 | 	/**
45 | 	 * Get a signing key from a consumer and token.
46 | 	 *
47 | 	 *     $key = $signature->key($consumer, $token);
48 | 	 *
49 | 	 * [!!] This method implements the signing key of [OAuth 1.0 Spec 9](http://oauth.net/core/1.0/#rfc.section.9).
50 | 	 *
51 | 	 * @param   Consumer  consumer
52 | 	 * @param   Token     token
53 | 	 * @return  string
54 | 	 * @uses    OAuth::urlencode
55 | 	 */
56 | 	public function key(OAuth_Consumer $consumer, OAuth_Token $token = NULL)
57 | 	{
58 | 		$key = OAuth::urlencode($consumer->secret).'&';
59 | 
60 | 		if ($token)
61 | 		{
62 | 			$key .= OAuth::urlencode($token->secret);
63 | 		}
64 | 
65 | 		return $key;
66 | 	}
67 | 
68 | 	abstract public function sign(OAuth_Request $request, OAuth_Consumer $consumer, OAuth_Token $token = NULL);
69 | 
70 | 	abstract public function verify($signature, OAuth_Request $request, OAuth_Consumer $consumer, OAuth_Token $token = NULL);
71 | 
72 | } // End Signature
73 | 


--------------------------------------------------------------------------------
/libraries/Signature/HMAC_SHA1.php:
--------------------------------------------------------------------------------
 1 | sign($request, $consumer, $token);
19 | 	 *
20 | 	 * [!!] This method implements [OAuth 1.0 Spec 9.2.1](http://oauth.net/core/1.0/#rfc.section.9.2.1).
21 | 	 *
22 | 	 * @param   Request   request
23 | 	 * @param   Consumer  consumer
24 | 	 * @param   Token     token
25 | 	 * @return  string
26 | 	 * @uses    Signature::key
27 | 	 * @uses    Request::base_string
28 | 	 */
29 | 	public function sign(OAuth_Request $request, OAuth_Consumer $consumer, OAuth_Token $token = NULL)
30 | 	{
31 | 		// Get the signing key
32 | 		$key = $this->key($consumer, $token);
33 | 
34 | 		// Get the base string for the signature
35 | 		$base_string = $request->base_string();
36 | 
37 | 		// Sign the base string using the key
38 | 		return base64_encode(hash_hmac('sha1', $base_string, $key, TRUE));
39 | 	}
40 | 
41 | 	/**
42 | 	 * Verify a HMAC-SHA1 signature.
43 | 	 *
44 | 	 *     if ( ! $signature->verify($signature, $request, $consumer, $token))
45 | 	 *     {
46 | 	 *         throw new Exception('Failed to verify signature');
47 | 	 *     }
48 | 	 *
49 | 	 * [!!] This method implements [OAuth 1.0 Spec 9.2.2](http://oauth.net/core/1.0/#rfc.section.9.2.2).
50 | 	 *
51 | 	 * @param   string          signature to verify
52 | 	 * @param   Request   request
53 | 	 * @param   Consumer  consumer
54 | 	 * @param   Token     token
55 | 	 * @return  boolean
56 | 	 * @uses    Signature_HMAC_SHA1::sign
57 | 	 */
58 | 	public function verify($signature, OAuth_Request $request, OAuth_Consumer $consumer, OAuth_Token $token = NULL)
59 | 	{
60 | 		return $signature === $this->sign($request, $consumer, $token);
61 | 	}
62 | 
63 | } // End Signature_HMAC_SHA1
64 | 


--------------------------------------------------------------------------------
/libraries/Signature/Plaintext.php:
--------------------------------------------------------------------------------
 1 | sign($request, $consumer, $token);
24 | 	 *
25 | 	 * [!!] This method implements [OAuth 1.0 Spec 9.4.1](http://oauth.net/core/1.0/#rfc.section.9.4.1).
26 | 	 *
27 | 	 * @param   Request   request
28 | 	 * @param   Consumer  consumer
29 | 	 * @param   Token     token
30 | 	 * @return  $this
31 | 	 */
32 | 	public function sign(Request $request, Consumer $consumer, Token $token = NULL)
33 | 	{
34 | 		// Use the signing key as the signature
35 | 		return $this->key($consumer, $token);
36 | 	}
37 | 
38 | 	/**
39 | 	 * Verify a plaintext signature.
40 | 	 *
41 | 	 *     if ( ! $signature->verify($signature, $request, $consumer, $token))
42 | 	 *     {
43 | 	 *         throw new Exception('Failed to verify signature');
44 | 	 *     }
45 | 	 *
46 | 	 * [!!] This method implements [OAuth 1.0 Spec 9.4.2](http://oauth.net/core/1.0/#rfc.section.9.4.2).
47 | 	 *
48 | 	 * @param   string          signature to verify
49 | 	 * @param   Request   request
50 | 	 * @param   Consumer  consumer
51 | 	 * @param   Token     token
52 | 	 * @return  boolean
53 | 	 * @uses    Signature_PLAINTEXT::sign
54 | 	 */
55 | 	public function verify($signature, Request $request, Consumer $consumer, Token $token = NULL)
56 | 	{
57 | 		return $signature === $this->key($consumer, $token);
58 | 	}
59 | 
60 | } // End Signature_PLAINTEXT
61 | 


--------------------------------------------------------------------------------
/libraries/Token.php:
--------------------------------------------------------------------------------
  1 | access_token = $options['access_token'];
 64 | 
 65 | 		$this->secret = $options['secret'];
 66 | 
 67 | 		// If we have a uid lets use it
 68 | 		isset($options['uid']) and $this->uid = $options['uid'];
 69 | 	}
 70 | 
 71 | 	/**
 72 | 	 * Return the value of any protected class variable.
 73 | 	 *
 74 | 	 *     // Get the token secret
 75 | 	 *     $secret = $token->secret;
 76 | 	 *
 77 | 	 * @param   string  variable name
 78 | 	 * @return  mixed
 79 | 	 */
 80 | 	public function __get($key)
 81 | 	{
 82 | 		return isset($this->$key) ? $this->$key : null;
 83 | 	}
 84 | 
 85 | 	/**
 86 | 	 * Return a boolean if the property is set
 87 | 	 *
 88 | 	 *     // Get the token secret
 89 | 	 *     if ($token->secret) exit('YAY SECRET');
 90 | 	 *
 91 | 	 * @param   string  variable name
 92 | 	 * @return  bool
 93 | 	 */
 94 | 	public function __isset($key)
 95 | 	{
 96 | 		return isset($this->$key);
 97 | 	}
 98 | 
 99 | 	/**
100 | 	 * Returns the token key.
101 | 	 *
102 | 	 * @return  string
103 | 	 */
104 | 	public function __toString()
105 | 	{
106 | 		return (string) $this->access_token;
107 | 	}
108 | 
109 | } // End Token
110 | 


--------------------------------------------------------------------------------
/libraries/Token/Access.php:
--------------------------------------------------------------------------------
1 | verifier($key);
16 | 	 *
17 | 	 * @param   string   new verifier
18 | 	 * @return  $this
19 | 	 */
20 | 	public function verifier($verifier)
21 | 	{
22 | 		$this->verifier = $verifier;
23 | 
24 | 		return $this;
25 | 	}
26 | 
27 | } // End Token_Request
28 | 


--------------------------------------------------------------------------------
/spark.info:
--------------------------------------------------------------------------------
1 | name: oauth
2 | version: 0.3.1
3 | compatibility: 2.1.1


--------------------------------------------------------------------------------