Minor - Format code - refs BT#13469

pull/2729/head
Angel Fernando Quiroz Campos 7 years ago
parent aa1dec474b
commit c8d81c560d
  1. 407
      plugin/ims_lti/OAuthSimple.php

@ -1,4 +1,5 @@
<?php <?php
/** /**
* OAuthSimple - A simpler version of OAuth * OAuthSimple - A simpler version of OAuth
* *
@ -7,33 +8,32 @@
* @author jr conlin <src@jrconlin.com> * @author jr conlin <src@jrconlin.com>
* @copyright unitedHeroes.net 2011 * @copyright unitedHeroes.net 2011
* @version 1.3 * @version 1.3
* @license See license.txt * @license BSD licence.
*
*/ */
class OAuthSimple
class OAuthSimple { {
private $_secrets; private $_secrets;
private $_default_signature_method; private $_default_signature_method;
private $_action; private $_action;
private $_nonce_chars; private $_nonce_chars;
/** /**
* Constructor * OAuthSimple constructor.
*
* @param string $APIKey The API Key (sometimes referred to as the consumer key). This value is usually
* supplied by the site you wish to use.
* @param string $sharedSecret The shared secret. This value is also usually provided by the site you wish to use.
* *
* @access public * @return OAuthSimple
* @param api_key (String) The API Key (sometimes referred to as the consumer key) This value is usually supplied by the site you wish to use.
* @param shared_secret (String) The shared secret. This value is also usually provided by the site you wish to use.
* @return OAuthSimple (Object)
*/ */
function __construct ($APIKey = "", $sharedSecret=""){ function __construct($APIKey = "", $sharedSecret = "")
if (!empty($APIKey))
{ {
if (!empty($APIKey)) {
$this->_secrets['consumer_key'] = $APIKey; $this->_secrets['consumer_key'] = $APIKey;
} }
if (!empty($sharedSecret)) if (!empty($sharedSecret)) {
{
$this->_secrets['shared_secret'] = $sharedSecret; $this->_secrets['shared_secret'] = $sharedSecret;
} }
@ -45,62 +45,56 @@ class OAuthSimple {
} }
/** /**
* Reset the parameters and URL * Reset the parameters and URL.
* *
* @access public * @return OAuthSimple
* @return OAuthSimple (Object)
*/ */
public function reset() { public function reset()
{
$this->_parameters = Array(); $this->_parameters = Array();
$this->path = NULL; $this->path = null;
$this->sbs = NULL; $this->sbs = null;
return $this; return $this;
} }
/** /**
* Set the parameters either from a hash or a string * Set the parameters either from a hash or a string.
* *
* @access public * @param array $parameters List of parameters for the call,
* @param(string, object) List of parameters for the call, this can either be a URI string (e.g. "foo=bar&gorp=banana" or an object/hash) * this can either be a URI string (e.g."foo=bar&gorp=banana" or an object/hash)
* @return OAuthSimple (Object) *
* @throws OAuthSimpleException
*
* @return OAuthSimple
*/ */
public function setParameters ($parameters=Array()) { public function setParameters($parameters = [])
if (is_string($parameters))
{ {
if (is_string($parameters)) {
$parameters = $this->_parseParameterString($parameters); $parameters = $this->_parseParameterString($parameters);
} }
if (empty($this->_parameters)) if (empty($this->_parameters)) {
{
$this->_parameters = $parameters; $this->_parameters = $parameters;
} } elseif (!empty($parameters)) {
else if (!empty($parameters))
{
$this->_parameters = array_merge($this->_parameters, $parameters); $this->_parameters = array_merge($this->_parameters, $parameters);
} }
if (empty($this->_parameters['oauth_nonce'])) if (empty($this->_parameters['oauth_nonce'])) {
{
$this->_getNonce(); $this->_getNonce();
} }
if (empty($this->_parameters['oauth_timestamp'])) if (empty($this->_parameters['oauth_timestamp'])) {
{
$this->_getTimeStamp(); $this->_getTimeStamp();
} }
if (empty($this->_parameters['oauth_consumer_key'])) if (empty($this->_parameters['oauth_consumer_key'])) {
{
$this->_getApiKey(); $this->_getApiKey();
} }
if (empty($this->_parameters['oauth_token'])) if (empty($this->_parameters['oauth_token'])) {
{
$this->_getAccessToken(); $this->_getAccessToken();
} }
if (empty($this->_parameters['oauth_signature_method'])) if (empty($this->_parameters['oauth_signature_method'])) {
{
$this->setSignatureMethod(); $this->setSignatureMethod();
} }
if (empty($this->_parameters['oauth_version'])) if (empty($this->_parameters['oauth_version'])) {
{
$this->_parameters['oauth_version'] = "1.0"; $this->_parameters['oauth_version'] = "1.0";
} }
@ -108,10 +102,13 @@ class OAuthSimple {
} }
/** /**
* Convenience method for setParameters * Convenience method for setParameters.
*
* @param array $parameters
* *
* @access public * @throws OAuthSimpleException
* @see setParameters *
* @return OAuthSimple
*/ */
public function setQueryString($parameters) public function setQueryString($parameters)
{ {
@ -119,27 +116,31 @@ class OAuthSimple {
} }
/** /**
* Set the target URL (does not include the parameters) * Set the target URL (does not include the parameters).
*
* @param string $path The fully qualified URI (excluding query arguments) (e.g "http://example.org/foo")
* *
* @param path (String) the fully qualified URI (excluding query arguments) (e.g "http://example.org/foo") * @throws OAuthSimpleException
* @return OAuthSimple (Object) *
* @return OAuthSimple
*/ */
public function setURL($path) public function setURL($path)
{ {
if (empty($path)) if (empty($path)) {
{
throw new OAuthSimpleException('No path specified for OAuthSimple.setURL'); throw new OAuthSimpleException('No path specified for OAuthSimple.setURL');
} }
$this->_path = $path; $this->_path = $path;
return $this; return $this;
} }
/** /**
* Convenience method for setURL * Convenience method for setURL.
*
* @param string $path
* *
* @param path (String) * @return mixed
* @see setURL
*/ */
public function setPath($path) public function setPath($path)
{ {
@ -147,20 +148,21 @@ class OAuthSimple {
} }
/** /**
* Set the "action" for the url, (e.g. GET,POST, DELETE, etc.) * Set the "action" for the url, (e.g. GET,POST, DELETE, etc.).
*
* @param string $action HTTP Action word.
* *
* @param action (String) HTTP Action word. * @throws OAuthSimpleException
* @return OAuthSimple (Object) *
* @return $this
*/ */
public function setAction($action) public function setAction($action)
{ {
if (empty($action)) if (empty($action)) {
{
$action = 'GET'; $action = 'GET';
} }
$action = strtoupper($action); $action = strtoupper($action);
if (preg_match('/[^A-Z]/',$action)) if (preg_match('/[^A-Z]/', $action)) {
{
throw new OAuthSimpleException('Invalid action specified for OAuthSimple.setAction'); throw new OAuthSimpleException('Invalid action specified for OAuthSimple.setAction');
} }
$this->_action = $action; $this->_action = $action;
@ -169,117 +171,121 @@ class OAuthSimple {
} }
/** /**
* Set the signatures (as well as validate the ones you have) * Set the signatures (as well as validate the ones you have).
*
* @param array $signatures object/hash of the token/signature pairs {api_key:, shared_secret:, oauth_token:
* oauth_secret:}
* *
* @param signatures (object) object/hash of the token/signature pairs {api_key:, shared_secret:, oauth_token: oauth_secret:} * @throws OAuthSimpleException
* @return OAuthSimple (Object) *
* @return $this
*/ */
public function signatures($signatures) public function signatures($signatures)
{ {
if (!empty($signatures) && !is_array($signatures)) if (!empty($signatures) && !is_array($signatures)) {
{
throw new OAuthSimpleException('Must pass dictionary array to OAuthSimple.signatures'); throw new OAuthSimpleException('Must pass dictionary array to OAuthSimple.signatures');
} }
if (!empty($signatures)) if (!empty($signatures)) {
{ if (empty($this->_secrets)) {
if (empty($this->_secrets))
{
$this->_secrets = Array(); $this->_secrets = Array();
} }
$this->_secrets = array_merge($this->_secrets, $signatures); $this->_secrets = array_merge($this->_secrets, $signatures);
} }
if (isset($this->_secrets['api_key'])) if (isset($this->_secrets['api_key'])) {
{
$this->_secrets['consumer_key'] = $this->_secrets['api_key']; $this->_secrets['consumer_key'] = $this->_secrets['api_key'];
} }
if (isset($this->_secrets['access_token'])) if (isset($this->_secrets['access_token'])) {
{
$this->_secrets['oauth_token'] = $this->_secrets['access_token']; $this->_secrets['oauth_token'] = $this->_secrets['access_token'];
} }
if (isset($this->_secrets['access_secret'])) if (isset($this->_secrets['access_secret'])) {
{
$this->_secrets['shared_secret'] = $this->_secrets['access_secret']; $this->_secrets['shared_secret'] = $this->_secrets['access_secret'];
} }
if (isset($this->_secrets['oauth_token_secret'])) if (isset($this->_secrets['oauth_token_secret'])) {
{
$this->_secrets['oauth_secret'] = $this->_secrets['oauth_token_secret']; $this->_secrets['oauth_secret'] = $this->_secrets['oauth_token_secret'];
} }
if (empty($this->_secrets['consumer_key'])) if (empty($this->_secrets['consumer_key'])) {
{
throw new OAuthSimpleException('Missing required consumer_key in OAuthSimple.signatures'); throw new OAuthSimpleException('Missing required consumer_key in OAuthSimple.signatures');
} }
if (empty($this->_secrets['shared_secret'])) if (empty($this->_secrets['shared_secret'])) {
{
throw new OAuthSimpleException('Missing requires shared_secret in OAuthSimple.signatures'); throw new OAuthSimpleException('Missing requires shared_secret in OAuthSimple.signatures');
} }
if (!empty($this->_secrets['oauth_token']) && empty($this->_secrets['oauth_secret'])) if (!empty($this->_secrets['oauth_token']) && empty($this->_secrets['oauth_secret'])) {
{
throw new OAuthSimpleException('Missing oauth_secret for supplied oauth_token in OAuthSimple.signatures'); throw new OAuthSimpleException('Missing oauth_secret for supplied oauth_token in OAuthSimple.signatures');
} }
return $this; return $this;
} }
/**
* @param array $signatures
*
* @throws OAuthSimpleException
*
* @return OAuthSimple
*/
public function setTokensAndSecrets($signatures) public function setTokensAndSecrets($signatures)
{ {
return $this->signatures($signatures); return $this->signatures($signatures);
} }
/** /**
* Set the signature method (currently only Plaintext or SHA-MAC1) * Set the signature method (currently only Plaintext or SHA-MAC1).
*
* @param string $method Method of signing the transaction (only PLAINTEXT and SHA-MAC1 allowed for now).
* *
* @param method (String) Method of signing the transaction (only PLAINTEXT and SHA-MAC1 allowed for now) * @throws OAuthSimpleException
* @return OAuthSimple (Object) *
* @return $this
*/ */
public function setSignatureMethod($method = "") public function setSignatureMethod($method = "")
{ {
if (empty($method)) if (empty($method)) {
{
$method = $this->_default_signature_method; $method = $this->_default_signature_method;
} }
$method = strtoupper($method); $method = strtoupper($method);
switch($method) switch ($method) {
{
case 'PLAINTEXT': case 'PLAINTEXT':
case 'HMAC-SHA1': case 'HMAC-SHA1':
$this->_parameters['oauth_signature_method'] = $method; $this->_parameters['oauth_signature_method'] = $method;
break; break;
default: default:
throw new OAuthSimpleException ("Unknown signing method $method specified for OAuthSimple.setSignatureMethod"); throw new OAuthSimpleException (
"Unknown signing method $method specified for OAuthSimple.setSignatureMethod"
);
break; break;
} }
return $this; return $this;
} }
/** sign the request /**
* Sign the request.
* *
* note: all arguments are optional, provided you've set them using the * note: all arguments are optional, provided you've set them using the
* other helper functions. * other helper functions.
* *
* @param args (Array) hash of arguments for the call {action, path, parameters (array), method, signatures (array)} all arguments are optional. * @param array $args Optional.
* @return (Array) signed values * Hash of arguments for the call {action, path, parameters (array), method, signatures, (array)}
*
* @throws OAuthSimpleException
*
* @return array
*/ */
public function sign($args = array()) public function sign($args = array())
{ {
if (!empty($args['action'])) if (!empty($args['action'])) {
{
$this->setAction($args['action']); $this->setAction($args['action']);
} }
if (!empty($args['path'])) if (!empty($args['path'])) {
{
$this->setPath($args['path']); $this->setPath($args['path']);
} }
if (!empty($args['method'])) if (!empty($args['method'])) {
{
$this->setSignatureMethod($args['method']); $this->setSignatureMethod($args['method']);
} }
if (!empty($args['signatures'])) if (!empty($args['signatures'])) {
{
$this->signatures($args['signatures']); $this->signatures($args['signatures']);
} }
if (empty($args['parameters'])) if (empty($args['parameters'])) {
{
$args['parameters'] = array(); $args['parameters'] = array();
} }
$this->setParameters($args['parameters']); $this->setParameters($args['parameters']);
@ -290,43 +296,39 @@ class OAuthSimple {
'signature' => self::_oauthEscape($this->_parameters['oauth_signature']), 'signature' => self::_oauthEscape($this->_parameters['oauth_signature']),
'signed_url' => $this->_path.'?'.$normParams, 'signed_url' => $this->_path.'?'.$normParams,
'header' => $this->getHeaderString(), 'header' => $this->getHeaderString(),
'sbs'=> $this->sbs 'sbs' => $this->sbs,
); );
} }
/** /**
* Return a formatted "header" string * Return a formatted "header" string.
* *
* NOTE: This doesn't set the "Authorization: " prefix, which is required. * NOTE: This doesn't set the "Authorization: " prefix, which is required.
* It's not set because various set header functions prefer different * It's not set because various set header functions prefer different
* ways to do that. * ways to do that.
* *
* @param args (Array) * @param array $args
* @return $result (String) *
* @throws OAuthSimpleException
*
* @return null|string|string[]
*/ */
public function getHeaderString($args = array()) public function getHeaderString($args = array())
{ {
if (empty($this->_parameters['oauth_signature'])) if (empty($this->_parameters['oauth_signature'])) {
{
$this->sign($args); $this->sign($args);
} }
$result = 'OAuth '; $result = 'OAuth ';
foreach ($this->_parameters as $pName => $pValue) foreach ($this->_parameters as $pName => $pValue) {
{ if (strpos($pName, 'oauth_') !== 0) {
if (strpos($pName,'oauth_') !== 0)
{
continue; continue;
} }
if (is_array($pValue)) if (is_array($pValue)) {
{ foreach ($pValue as $val) {
foreach ($pValue as $val)
{
$result .= $pName.'="'.self::_oauthEscape($val).'", '; $result .= $pName.'="'.self::_oauthEscape($val).'", ';
} }
} } else {
else
{
$result .= $pName.'="'.self::_oauthEscape($pValue).'", '; $result .= $pName.'="'.self::_oauthEscape($pValue).'", ';
} }
} }
@ -334,40 +336,52 @@ class OAuthSimple {
return preg_replace('/, $/', '', $result); return preg_replace('/, $/', '', $result);
} }
/**
* @param string $paramString
*
* @return array
*/
private function _parseParameterString($paramString) private function _parseParameterString($paramString)
{ {
$elements = explode('&', $paramString); $elements = explode('&', $paramString);
$result = array(); $result = array();
foreach ($elements as $element) foreach ($elements as $element) {
{
list ($key, $token) = explode('=', $element); list ($key, $token) = explode('=', $element);
if ($token) if ($token) {
{
$token = urldecode($token); $token = urldecode($token);
} }
if (!empty($result[$key])) if (!empty($result[$key])) {
{ if (!is_array($result[$key])) {
if (!is_array($result[$key]))
{
$result[$key] = array($result[$key], $token); $result[$key] = array($result[$key], $token);
} } else {
else
{
array_push($result[$key], $token); array_push($result[$key], $token);
} }
} } else {
else
$result[$key] = $token; $result[$key] = $token;
} }
return $result;
} }
return $result;
}
/**
* @param string $string
*
* @throws OAuthSimpleException
*
* @return int|mixed|string
*/
private static function _oauthEscape($string) private static function _oauthEscape($string)
{ {
if ($string === 0) { return 0; } if ($string === 0) {
if ($string == '0') { return '0'; } return 0;
if (strlen($string) == 0) { return ''; } }
if ($string == '0') {
return '0';
}
if (strlen($string) == 0) {
return '';
}
if (is_array($string)) { if (is_array($string)) {
throw new OAuthSimpleException('Array passed to _oauthEscape'); throw new OAuthSimpleException('Array passed to _oauthEscape');
} }
@ -377,17 +391,22 @@ class OAuthSimple {
$string = str_replace( $string = str_replace(
Array('%7E', '+'), // Replace these Array('%7E', '+'), // Replace these
Array('~', '%20'), // with these Array('~', '%20'), // with these
$string); $string
);
return $string; return $string;
} }
/**
* @param int $length
*
* @return string
*/
private function _getNonce($length = 5) private function _getNonce($length = 5)
{ {
$result = ''; $result = '';
$cLength = strlen($this->_nonce_chars); $cLength = strlen($this->_nonce_chars);
for ($i=0; $i < $length; $i++) for ($i = 0; $i < $length; $i++) {
{
$rnum = rand(0, $cLength - 1); $rnum = rand(0, $cLength - 1);
$result .= substr($this->_nonce_chars, $rnum, 1); $result .= substr($this->_nonce_chars, $rnum, 1);
} }
@ -396,10 +415,14 @@ class OAuthSimple {
return $result; return $result;
} }
/**
* @throws OAuthSimpleException
*
* @return mixed
*/
private function _getApiKey() private function _getApiKey()
{ {
if (empty($this->_secrets['consumer_key'])) if (empty($this->_secrets['consumer_key'])) {
{
throw new OAuthSimpleException('No consumer_key set for OAuthSimple'); throw new OAuthSimpleException('No consumer_key set for OAuthSimple');
} }
$this->_parameters['oauth_consumer_key'] = $this->_secrets['consumer_key']; $this->_parameters['oauth_consumer_key'] = $this->_secrets['consumer_key'];
@ -407,14 +430,17 @@ class OAuthSimple {
return $this->_parameters['oauth_consumer_key']; return $this->_parameters['oauth_consumer_key'];
} }
/**
* @throws OAuthSimpleException
*
* @return string
*/
private function _getAccessToken() private function _getAccessToken()
{ {
if (!isset($this->_secrets['oauth_secret'])) if (!isset($this->_secrets['oauth_secret'])) {
{
return ''; return '';
} }
if (!isset($this->_secrets['oauth_token'])) if (!isset($this->_secrets['oauth_token'])) {
{
throw new OAuthSimpleException('No access token (oauth_token) set for OAuthSimple.'); throw new OAuthSimpleException('No access token (oauth_token) set for OAuthSimple.');
} }
$this->_parameters['oauth_token'] = $this->_secrets['oauth_token']; $this->_parameters['oauth_token'] = $this->_secrets['oauth_token'];
@ -422,11 +448,19 @@ class OAuthSimple {
return $this->_parameters['oauth_token']; return $this->_parameters['oauth_token'];
} }
/**
* @return int
*/
private function _getTimeStamp() private function _getTimeStamp()
{ {
return $this->_parameters['oauth_timestamp'] = time(); return $this->_parameters['oauth_timestamp'] = time();
} }
/**
* @throws OAuthSimpleException
*
* @return string
*/
private function _normalizedParameters() private function _normalizedParameters()
{ {
$normalized_keys = array(); $normalized_keys = array();
@ -440,16 +474,12 @@ class OAuthSimple {
// Read parameters from a file. Hope you're practicing safe PHP. // Read parameters from a file. Hope you're practicing safe PHP.
//if (strpos($paramValue, '@') !== 0 && !file_exists(substr($paramValue, 1))) //if (strpos($paramValue, '@') !== 0 && !file_exists(substr($paramValue, 1)))
//{ //{
if (is_array($paramValue)) if (is_array($paramValue)) {
{
$normalized_keys[self::_oauthEscape($paramName)] = array(); $normalized_keys[self::_oauthEscape($paramName)] = array();
foreach($paramValue as $item) foreach ($paramValue as $item) {
{
array_push($normalized_keys[self::_oauthEscape($paramName)], self::_oauthEscape($item)); array_push($normalized_keys[self::_oauthEscape($paramName)], self::_oauthEscape($item));
} }
} } else {
else
{
$normalized_keys[self::_oauthEscape($paramName)] = self::_oauthEscape($paramValue); $normalized_keys[self::_oauthEscape($paramName)] = self::_oauthEscape($paramValue);
} }
//} //}
@ -457,18 +487,13 @@ class OAuthSimple {
ksort($normalized_keys); ksort($normalized_keys);
foreach($normalized_keys as $key=>$val) foreach ($normalized_keys as $key => $val) {
{ if (is_array($val)) {
if (is_array($val))
{
sort($val); sort($val);
foreach($val as $element) foreach ($val as $element) {
{
array_push($return_array, $key."=".$element); array_push($return_array, $key."=".$element);
} }
} } else {
else
{
array_push($return_array, $key.'='.$val); array_push($return_array, $key.'='.$val);
} }
@ -477,34 +502,38 @@ class OAuthSimple {
$sig = $this->_generateSignature($presig); $sig = $this->_generateSignature($presig);
$this->_parameters['oauth_signature'] = $sig; $this->_parameters['oauth_signature'] = $sig;
array_push($return_array, "oauth_signature=$sig"); array_push($return_array, "oauth_signature=$sig");
return join("&", $return_array); return join("&", $return_array);
} }
/**
* @param string $parameters
*
* @throws OAuthSimpleException
*
* @return string
*/
private function _generateSignature($parameters = "") private function _generateSignature($parameters = "")
{ {
$secretKey = ''; $secretKey = '';
if(isset($this->_secrets['shared_secret'])) if (isset($this->_secrets['shared_secret'])) {
{
$secretKey = self::_oauthEscape($this->_secrets['shared_secret']); $secretKey = self::_oauthEscape($this->_secrets['shared_secret']);
} }
$secretKey .= '&'; $secretKey .= '&';
if(isset($this->_secrets['oauth_secret'])) if (isset($this->_secrets['oauth_secret'])) {
{
$secretKey .= self::_oauthEscape($this->_secrets['oauth_secret']); $secretKey .= self::_oauthEscape($this->_secrets['oauth_secret']);
} }
if (!empty($parameters)) { if (!empty($parameters)) {
$parameters = urlencode($parameters); $parameters = urlencode($parameters);
} }
switch($this->_parameters['oauth_signature_method']) switch ($this->_parameters['oauth_signature_method']) {
{
case 'PLAINTEXT': case 'PLAINTEXT':
return urlencode($secretKey);; return urlencode($secretKey);;
case 'HMAC-SHA1': case 'HMAC-SHA1':
$this->sbs = self::_oauthEscape($this->_action).'&'.self::_oauthEscape($this->_path).'&'.$parameters; $this->sbs = self::_oauthEscape($this->_action).'&'.self::_oauthEscape($this->_path).'&'.$parameters;
return base64_encode(hash_hmac('sha1',$this->sbs,$secretKey,TRUE)); return base64_encode(hash_hmac('sha1', $this->sbs, $secretKey, true));
default: default:
throw new OAuthSimpleException('Unknown signature method for OAuthSimple'); throw new OAuthSimpleException('Unknown signature method for OAuthSimple');
break; break;
@ -512,27 +541,41 @@ class OAuthSimple {
} }
} }
class OAuthSimpleException extends Exception { /**
* Class OAuthSimpleException.
public function __construct($err, $isDebug = FALSE) */
class OAuthSimpleException extends Exception
{ {
self::log_error($err); /**
if ($isDebug) * OAuthSimpleException constructor.
*
* @param string $err
* @param bool $isDebug
*/
public function __construct($err, $isDebug = false)
{ {
self::display_error($err, TRUE); self::log_error($err);
if ($isDebug) {
self::display_error($err, true);
} }
} }
/**
* @param string $err
*/
public static function log_error($err) public static function log_error($err)
{ {
error_log($err, 0); error_log($err, 0);
} }
public static function display_error($err, $kill = FALSE) /**
* @param string $err
* @param bool $kill
*/
public static function display_error($err, $kill = false)
{ {
print_r($err); print_r($err);
if ($kill === FALSE) if ($kill === false) {
{
die(); die();
} }
} }

Loading…
Cancel
Save