File indexing completed on 2024-12-22 05:36:53

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Oauth
0017  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0018  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0019  * @version    $Id$
0020  */
0021 
0022 /** Zend_Oauth_Http_Utility */
0023 // require_once 'Zend/Oauth/Http/Utility.php';
0024 
0025 /** Zend_Uri_Http */
0026 // require_once 'Zend/Uri/Http.php';
0027 
0028 /**
0029  * @category   Zend
0030  * @package    Zend_Oauth
0031  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0032  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0033  */
0034 abstract class Zend_Oauth_Signature_SignatureAbstract
0035 {
0036     /**
0037      * Hash algorithm to use when generating signature
0038      * @var string
0039      */
0040     protected $_hashAlgorithm = null;
0041 
0042     /**
0043      * Key to use when signing
0044      * @var string
0045      */
0046     protected $_key = null;
0047 
0048     /**
0049      * Consumer secret
0050      * @var string
0051      */
0052     protected $_consumerSecret = null;
0053 
0054     /**
0055      * Token secret
0056      * @var string
0057      */
0058     protected $_tokenSecret = '';
0059 
0060     /**
0061      * Constructor
0062      *
0063      * @param  string $consumerSecret
0064      * @param  null|string $tokenSecret
0065      * @param  null|string $hashAlgo
0066      * @return void
0067      */
0068     public function __construct($consumerSecret, $tokenSecret = null, $hashAlgo = null)
0069     {
0070         $this->_consumerSecret = $consumerSecret;
0071         if (isset($tokenSecret)) {
0072             $this->_tokenSecret = $tokenSecret;
0073         }
0074         $this->_key = $this->_assembleKey();
0075         if (isset($hashAlgo)) {
0076             $this->_hashAlgorithm = $hashAlgo;
0077         }
0078     }
0079 
0080     /**
0081      * Sign a request
0082      *
0083      * @param  array $params
0084      * @param  null|string $method
0085      * @param  null|string $url
0086      * @return string
0087      */
0088     public abstract function sign(array $params, $method = null, $url = null);
0089 
0090     /**
0091      * Normalize the base signature URL
0092      *
0093      * @param  string $url
0094      * @return string
0095      */
0096     public function normaliseBaseSignatureUrl($url)
0097     {
0098         $uri = Zend_Uri_Http::fromString($url);
0099         if ($uri->getScheme() == 'http' && $uri->getPort() == '80') {
0100             $uri->setPort('');
0101         } elseif ($uri->getScheme() == 'https' && $uri->getPort() == '443') {
0102             $uri->setPort('');
0103         }
0104         $uri->setQuery('');
0105         $uri->setFragment('');
0106         $uri->setHost(strtolower($uri->getHost()));
0107         return $uri->getUri(true);
0108     }
0109 
0110     /**
0111      * Assemble key from consumer and token secrets
0112      *
0113      * @return string
0114      */
0115     protected function _assembleKey()
0116     {
0117         $parts = array($this->_consumerSecret);
0118         if ($this->_tokenSecret !== null) {
0119             $parts[] = $this->_tokenSecret;
0120         }
0121         foreach ($parts as $key => $secret) {
0122             $parts[$key] = Zend_Oauth_Http_Utility::urlEncode($secret);
0123         }
0124         return implode('&', $parts);
0125     }
0126 
0127     /**
0128      * Get base signature string
0129      *
0130      * @param  array $params
0131      * @param  null|string $method
0132      * @param  null|string $url
0133      * @return string
0134      */
0135     protected function _getBaseSignatureString(array $params, $method = null, $url = null)
0136     {
0137         $encodedParams = array();
0138         foreach ($params as $key => $value) {
0139             $encodedParams[Zend_Oauth_Http_Utility::urlEncode($key)] =
0140                 Zend_Oauth_Http_Utility::urlEncode($value);
0141         }
0142         $baseStrings = array();
0143         if (isset($method)) {
0144             $baseStrings[] = strtoupper($method);
0145         }
0146         if (isset($url)) {
0147             // should normalise later
0148             $baseStrings[] = Zend_Oauth_Http_Utility::urlEncode(
0149                 $this->normaliseBaseSignatureUrl($url)
0150             );
0151         }
0152         if (isset($encodedParams['oauth_signature'])) {
0153             unset($encodedParams['oauth_signature']);
0154         }
0155         $baseStrings[] = Zend_Oauth_Http_Utility::urlEncode(
0156             $this->_toByteValueOrderedQueryString($encodedParams)
0157         );
0158         return implode('&', $baseStrings);
0159     }
0160 
0161     /**
0162      * Transform an array to a byte value ordered query string
0163      *
0164      * @param  array $params
0165      * @return string
0166      */
0167     protected function _toByteValueOrderedQueryString(array $params)
0168     {
0169         $return = array();
0170         uksort($params, 'strnatcmp');
0171         foreach ($params as $key => $value) {
0172             if (is_array($value)) {
0173                 natsort($value);
0174                 foreach ($value as $keyduplicate) {
0175                     $return[] = $key . '=' . $keyduplicate;
0176                 }
0177             } else {
0178                 $return[] = $key . '=' . $value;
0179             }
0180         }
0181         return implode('&', $return);
0182     }
0183 }