/library/Zend/Service/Amazon/Authentication/V2.php
PHP | 138 lines | 45 code | 17 blank | 76 comment | 2 complexity | e36f3d3c165d0d2f8bd799cf9d152417 MD5 | raw file
Possible License(s): AGPL-1.0
1<?php
2/**
3 * Zend Framework
4 *
5 * LICENSE
6 *
7 * This source file is subject to the new BSD license that is bundled
8 * with this package in the file LICENSE.txt.
9 * It is also available through the world-wide-web at this URL:
10 * http://framework.zend.com/license/new-bsd
11 * If you did not receive a copy of the license and are unable to
12 * obtain it through the world-wide-web, please send an email
13 * to license@zend.com so we can send you a copy immediately.
14 *
15 * @category Zend
16 * @package Zend_Service_Amazon
17 * @subpackage Authentication
18 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
19 * @license http://framework.zend.com/license/new-bsd New BSD License
20 */
21
22/**
23 * @see Zend_Service_Amazon_Authentication
24 */
25require_once 'Zend/Service/Amazon/Authentication.php';
26
27/**
28 * @see Zend_Crypt_Hmac
29 */
30require_once 'Zend/Crypt/Hmac.php';
31
32/**
33 * @category Zend
34 * @package Zend_Service_Amazon
35 * @subpackage Authentication
36 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
37 * @license http://framework.zend.com/license/new-bsd New BSD License
38 */
39class Zend_Service_Amazon_Authentication_V2 extends Zend_Service_Amazon_Authentication
40{
41 /**
42 * Signature Version
43 */
44 protected $_signatureVersion = '2';
45
46 /**
47 * Signature Encoding Method
48 */
49 protected $_signatureMethod = 'HmacSHA256';
50
51 /**
52 * Type of http request
53 * @var string
54 */
55 protected $_httpMethod = "POST";
56
57 /**
58 * Generate the required attributes for the signature
59 * @param string $url
60 * @param array $parameters
61 * @return string
62 */
63 public function generateSignature($url, array &$parameters)
64 {
65 $parameters['AWSAccessKeyId'] = $this->_accessKey;
66 $parameters['SignatureVersion'] = $this->_signatureVersion;
67 $parameters['Version'] = $this->_apiVersion;
68 $parameters['SignatureMethod'] = $this->_signatureMethod;
69 if(!isset($parameters['Timestamp'])) {
70 $parameters['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z', time()+10);
71 }
72
73 $data = $this->_signParameters($url, $parameters);
74
75 return $data;
76 }
77
78 /**
79 * Set http request type to POST or GET
80 * @param string $method
81 */
82 public function setHttpMethod($method = "POST") {
83 $this->_httpMethod = strtoupper($method);
84 }
85
86 /**
87 * Get the current http request type
88 * @return string
89 */
90 public function getHttpMethod()
91 {
92 return $this->_httpMethod;
93 }
94
95 /**
96 * Computes the RFC 2104-compliant HMAC signature for request parameters
97 *
98 * This implements the Amazon Web Services signature, as per the following
99 * specification:
100 *
101 * 1. Sort all request parameters (including <tt>SignatureVersion</tt> and
102 * excluding <tt>Signature</tt>, the value of which is being created),
103 * ignoring case.
104 *
105 * 2. Iterate over the sorted list and append the parameter name (in its
106 * original case) and then its value. Do not URL-encode the parameter
107 * values before constructing this string. Do not use any separator
108 * characters when appending strings.
109 *
110 * @param string $queue_url Queue URL
111 * @param array $parameters the parameters for which to get the signature.
112 *
113 * @return string the signed data.
114 */
115 protected function _signParameters($url, array &$paramaters)
116 {
117 $data = $this->_httpMethod . "\n";
118 $data .= parse_url($url, PHP_URL_HOST) . "\n";
119 $data .= ('' == $path = parse_url($url, PHP_URL_PATH)) ? '/' : $path;
120 $data .= "\n";
121
122 uksort($paramaters, 'strcmp');
123 unset($paramaters['Signature']);
124
125 $arrData = array();
126 foreach($paramaters as $key => $value) {
127 $arrData[] = $key . '=' . str_replace('%7E', '~', rawurlencode($value));
128 }
129
130 $data .= implode('&', $arrData);
131
132 $hmac = Zend_Crypt_Hmac::compute($this->_secretKey, 'SHA256', $data, Zend_Crypt_Hmac::BINARY);
133
134 $paramaters['Signature'] = base64_encode($hmac);
135
136 return $data;
137 }
138}