Index: trunk/extensions/OpenStackManager/aws-sdk/services/cloudformation.class.php |
— | — | @@ -48,7 +48,7 @@ |
49 | 49 | * Amazon CloudFormation makes use of other AWS products. If you need additional technical information about a specific AWS product, you can |
50 | 50 | * find the product's technical documentation at <a href="http://aws.amazon.com/documentation/">http://aws.amazon.com/documentation/</a>. |
51 | 51 | * |
52 | | - * @version Tue Jul 12 16:07:23 PDT 2011 |
| 52 | + * @version Wed Aug 03 10:08:29 PDT 2011 |
53 | 53 | * @license See the included NOTICE.md file for complete information. |
54 | 54 | * @copyright See the included NOTICE.md file for complete information. |
55 | 55 | * @link http://aws.amazon.com/cloudformation/Amazon CloudFormation |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/s3.class.php |
— | — | @@ -245,13 +245,16 @@ |
246 | 246 | // CONSTRUCTOR |
247 | 247 | |
248 | 248 | /** |
249 | | - * Constructs a new instance of this class. |
| 249 | + * Constructs a new instance of <AmazonS3>. If the <code>AWS_DEFAULT_CACHE_CONFIG</code> configuration |
| 250 | + * option is set, requests will be authenticated using a session token. Otherwise, requests will use |
| 251 | + * the older authentication method. |
250 | 252 | * |
251 | | - * @param string $key (Optional) Amazon API Key. If blank, the `AWS_KEY` constant is used. |
252 | | - * @param string $secret_key (Optional) Amazon API Secret Key. If blank, the `AWS_SECRET_KEY` constant is used. |
| 253 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 254 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 255 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
253 | 256 | * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>. |
254 | 257 | */ |
255 | | - public function __construct($key = null, $secret_key = null) |
| 258 | + public function __construct($key = null, $secret_key = null, $token = null) |
256 | 259 | { |
257 | 260 | $this->vhost = null; |
258 | 261 | $this->api_version = '2006-03-01'; |
— | — | @@ -279,6 +282,11 @@ |
280 | 283 | // @codeCoverageIgnoreEnd |
281 | 284 | } |
282 | 285 | |
| 286 | + if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG) |
| 287 | + { |
| 288 | + return parent::session_based_auth($key, $secret_key, $token); |
| 289 | + } |
| 290 | + |
283 | 291 | return parent::__construct($key, $secret_key); |
284 | 292 | } |
285 | 293 | |
— | — | @@ -417,6 +425,12 @@ |
418 | 426 | |
419 | 427 | /*%******************************************************************************************%*/ |
420 | 428 | |
| 429 | + // Do we have an authentication token? |
| 430 | + if ($this->auth_token) |
| 431 | + { |
| 432 | + $headers['X-Amz-Security-Token'] = $this->auth_token; |
| 433 | + } |
| 434 | + |
421 | 435 | // Handle specific resources |
422 | 436 | if (isset($opt['resource'])) |
423 | 437 | { |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/rds.class.php |
— | — | @@ -27,7 +27,7 @@ |
28 | 28 | * instance's compute resources and storage capacity to meet your application's demand. As with all Amazon Web Services, there are no up-front |
29 | 29 | * investments, and you pay only for the resources you use. |
30 | 30 | * |
31 | | - * @version Tue Jul 12 16:11:48 PDT 2011 |
| 31 | + * @version Wed Aug 03 10:13:10 PDT 2011 |
32 | 32 | * @license See the included NOTICE.md file for complete information. |
33 | 33 | * @copyright See the included NOTICE.md file for complete information. |
34 | 34 | * @link http://aws.amazon.com/rds/Amazon Relational Database Service |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/ses.class.php |
— | — | @@ -23,7 +23,7 @@ |
24 | 24 | * For specific details on how to construct a service request, please consult the <a |
25 | 25 | * href="http://docs.amazonwebservices.com/ses/latest/DeveloperGuide">Amazon SES Developer Guide</a>. |
26 | 26 | * |
27 | | - * @version Tue Jul 12 16:09:53 PDT 2011 |
| 27 | + * @version Wed Aug 03 10:11:14 PDT 2011 |
28 | 28 | * @license See the included NOTICE.md file for complete information. |
29 | 29 | * @copyright See the included NOTICE.md file for complete information. |
30 | 30 | * @link http://aws.amazon.com/ses/Amazon Simple Email Service |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/cloudwatch.class.php |
— | — | @@ -47,7 +47,7 @@ |
48 | 48 | * |
49 | 49 | * </ul> |
50 | 50 | * |
51 | | - * @version Tue Jul 12 16:07:50 PDT 2011 |
| 51 | + * @version Wed Aug 03 10:09:00 PDT 2011 |
52 | 52 | * @license See the included NOTICE.md file for complete information. |
53 | 53 | * @copyright See the included NOTICE.md file for complete information. |
54 | 54 | * @link http://aws.amazon.com/cloudwatch/Amazon CloudWatch |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/elb.class.php |
— | — | @@ -21,7 +21,7 @@ |
22 | 22 | * application. It makes it easy for you to distribute application loads between two or more EC2 instances. Elastic Load Balancing enables |
23 | 23 | * availability through redundancy and supports traffic growth of your application. |
24 | 24 | * |
25 | | - * @version Tue Jul 12 16:09:27 PDT 2011 |
| 25 | + * @version Wed Aug 03 10:10:44 PDT 2011 |
26 | 26 | * @license See the included NOTICE.md file for complete information. |
27 | 27 | * @copyright See the included NOTICE.md file for complete information. |
28 | 28 | * @link http://aws.amazon.com/elasticloadbalancing/Amazon Elastic Load Balancing |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/as.class.php |
— | — | @@ -38,7 +38,7 @@ |
39 | 39 | * href="http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html">Regions and Endpoints</a> in the Amazon Web Services |
40 | 40 | * General Reference. |
41 | 41 | * |
42 | | - * @version Wed Jul 20 13:14:36 PDT 2011 |
| 42 | + * @version Wed Aug 03 10:07:42 PDT 2011 |
43 | 43 | * @license See the included NOTICE.md file for complete information. |
44 | 44 | * @copyright See the included NOTICE.md file for complete information. |
45 | 45 | * @link http://aws.amazon.com/autoscaling/Amazon Auto-Scaling |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/sns.class.php |
— | — | @@ -17,7 +17,7 @@ |
18 | 18 | /** |
19 | 19 | |
20 | 20 | * |
21 | | - * @version Tue Jul 12 16:12:40 PDT 2011 |
| 21 | + * @version Wed Aug 03 10:14:08 PDT 2011 |
22 | 22 | * @license See the included NOTICE.md file for complete information. |
23 | 23 | * @copyright See the included NOTICE.md file for complete information. |
24 | 24 | * @link http://aws.amazon.com/sns/Amazon Simple Notification Service |
— | — | @@ -109,13 +109,16 @@ |
110 | 110 | // CONSTRUCTOR |
111 | 111 | |
112 | 112 | /** |
113 | | - * Constructs a new instance of <AmazonSNS>. |
| 113 | + * Constructs a new instance of <AmazonSNS>. If the <code>AWS_DEFAULT_CACHE_CONFIG</code> configuration |
| 114 | + * option is set, requests will be authenticated using a session token. Otherwise, requests will use |
| 115 | + * the older authentication method. |
114 | 116 | * |
115 | | - * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the `AWS_KEY` constant. |
116 | | - * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the `AWS_SECRET_KEY` constant. |
117 | | - * @return boolean <code>false</code> if no valid values are set, otherwise <code>true</code>. |
| 117 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 118 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 119 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
| 120 | + * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>. |
118 | 121 | */ |
119 | | - public function __construct($key = null, $secret_key = null) |
| 122 | + public function __construct($key = null, $secret_key = null, $token = null) |
120 | 123 | { |
121 | 124 | $this->api_version = '2010-03-31'; |
122 | 125 | $this->hostname = self::DEFAULT_URL; |
— | — | @@ -134,6 +137,11 @@ |
135 | 138 | // @codeCoverageIgnoreEnd |
136 | 139 | } |
137 | 140 | |
| 141 | + if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG) |
| 142 | + { |
| 143 | + return parent::session_based_auth($key, $secret_key, $token); |
| 144 | + } |
| 145 | + |
138 | 146 | return parent::__construct($key, $secret_key); |
139 | 147 | } |
140 | 148 | |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/iam.class.php |
— | — | @@ -32,7 +32,7 @@ |
33 | 33 | * |
34 | 34 | * We will refer to Amazon AWS Identity and Access Management using the abbreviated form IAM. All copyrights and legal protections still apply. |
35 | 35 | * |
36 | | - * @version Tue Jul 12 16:10:48 PDT 2011 |
| 36 | + * @version Wed Aug 03 10:12:08 PDT 2011 |
37 | 37 | * @license See the included NOTICE.md file for complete information. |
38 | 38 | * @copyright See the included NOTICE.md file for complete information. |
39 | 39 | * @link http://aws.amazon.com/iam/Amazon Identity and Access Management Service |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/sqs.class.php |
— | — | @@ -28,7 +28,7 @@ |
29 | 29 | * |
30 | 30 | * Visit <a href="http://aws.amazon.com/sqs/">http://aws.amazon.com/sqs/</a> for more information. |
31 | 31 | * |
32 | | - * @version Wed Jul 20 13:21:47 PDT 2011 |
| 32 | + * @version Wed Aug 03 10:14:34 PDT 2011 |
33 | 33 | * @license See the included NOTICE.md file for complete information. |
34 | 34 | * @copyright See the included NOTICE.md file for complete information. |
35 | 35 | * @link http://aws.amazon.com/sqs/Amazon Simple Queue Service |
— | — | @@ -155,13 +155,16 @@ |
156 | 156 | // CONSTRUCTOR |
157 | 157 | |
158 | 158 | /** |
159 | | - * Constructs a new instance of <AmazonSQS>. |
| 159 | + * Constructs a new instance of <AmazonSQS>. If the <code>AWS_DEFAULT_CACHE_CONFIG</code> configuration |
| 160 | + * option is set, requests will be authenticated using a session token. Otherwise, requests will use |
| 161 | + * the older authentication method. |
160 | 162 | * |
161 | | - * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the `AWS_KEY` constant. |
162 | | - * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the `AWS_SECRET_KEY` constant. |
163 | | - * @return boolean <code>false</code> if no valid values are set, otherwise <code>true</code>. |
| 163 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 164 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 165 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
| 166 | + * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>. |
164 | 167 | */ |
165 | | - public function __construct($key = null, $secret_key = null) |
| 168 | + public function __construct($key = null, $secret_key = null, $token = null) |
166 | 169 | { |
167 | 170 | $this->api_version = '2009-02-01'; |
168 | 171 | $this->hostname = self::DEFAULT_URL; |
— | — | @@ -180,6 +183,11 @@ |
181 | 184 | // @codeCoverageIgnoreEnd |
182 | 185 | } |
183 | 186 | |
| 187 | + if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG) |
| 188 | + { |
| 189 | + return parent::session_based_auth($key, $secret_key, $token); |
| 190 | + } |
| 191 | + |
184 | 192 | return parent::__construct($key, $secret_key); |
185 | 193 | } |
186 | 194 | |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/sts.class.php |
— | — | @@ -0,0 +1,155 @@ |
| 2 | +<?php |
| 3 | +/* |
| 4 | + * Copyright 2010-2011 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
| 5 | + * |
| 6 | + * Licensed under the Apache License, Version 2.0 (the "License"). |
| 7 | + * You may not use this file except in compliance with the License. |
| 8 | + * A copy of the License is located at |
| 9 | + * |
| 10 | + * http://aws.amazon.com/apache2.0 |
| 11 | + * |
| 12 | + * or in the "license" file accompanying this file. This file is distributed |
| 13 | + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| 14 | + * express or implied. See the License for the specific language governing |
| 15 | + * permissions and limitations under the License. |
| 16 | + */ |
| 17 | + |
| 18 | +/** |
| 19 | + * |
| 20 | + * |
| 21 | + * This is the AWS Security Token Service (STS) API Reference. STS is a web service that enables you to request temporary, limited-privilege |
| 22 | + * credentials for users that you authenticate (federated users), or IAM users. This guide provides descriptions of the STS API as well as |
| 23 | + * links to related content in <a href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/">Using AWS Identity and Access Management</a>. |
| 24 | + * |
| 25 | + * For more detailed information about using this service, go to <a |
| 26 | + * href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/TokenBasedAuth.html">Granting Temporary Access to Your AWS Resources</a>, in |
| 27 | + * <i>Using AWS Identity and Access Management</i>. |
| 28 | + * |
| 29 | + * For specific information about setting up signatures and authorization through the API, go to <a |
| 30 | + * href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html">Making Query Requests</a> in <i>Using AWS Identity and |
| 31 | + * Access Management</i>. |
| 32 | + * |
| 33 | + * If you're new to AWS and need additional technical information about a specific AWS product, you can find the product's technical |
| 34 | + * documentation at <a href="http://aws.amazon.com/documentation/">http://aws.amazon.com/documentation/</a>. |
| 35 | + * |
| 36 | + * We will refer to Amazon AWS Security Token Service using the abbreviated form STS, and to Amazon Identity and Access Management using the |
| 37 | + * abbreviated form IAM. All copyrights and legal protections still apply. |
| 38 | + * |
| 39 | + * @version Wed Aug 03 10:14:57 PDT 2011 |
| 40 | + * @license See the included NOTICE.md file for complete information. |
| 41 | + * @copyright See the included NOTICE.md file for complete information. |
| 42 | + * @link http://aws.amazon.com/sts/AWS Secure Token Service |
| 43 | + * @link http://aws.amazon.com/documentation/sts/AWS Secure Token Service documentation |
| 44 | + */ |
| 45 | +class AmazonSTS extends CFRuntime |
| 46 | +{ |
| 47 | + |
| 48 | + /*%******************************************************************************************%*/ |
| 49 | + // CLASS CONSTANTS |
| 50 | + |
| 51 | + /** |
| 52 | + * Specify the default queue URL. |
| 53 | + */ |
| 54 | + const DEFAULT_URL = 'sts.amazonaws.com'; |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | + |
| 59 | + /*%******************************************************************************************%*/ |
| 60 | + // CONSTRUCTOR |
| 61 | + |
| 62 | + /** |
| 63 | + * Constructs a new instance of <AmazonSTS>. |
| 64 | + * |
| 65 | + * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 66 | + * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 67 | + * @return boolean false if no valid values are set, otherwise true. |
| 68 | + */ |
| 69 | + public function __construct($key = null, $secret_key = null) |
| 70 | + { |
| 71 | + $this->api_version = '2011-06-15'; |
| 72 | + $this->hostname = self::DEFAULT_URL; |
| 73 | + |
| 74 | + if (!$key && !defined('AWS_KEY')) |
| 75 | + { |
| 76 | + // @codeCoverageIgnoreStart |
| 77 | + throw new STS_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.'); |
| 78 | + // @codeCoverageIgnoreEnd |
| 79 | + } |
| 80 | + |
| 81 | + if (!$secret_key && !defined('AWS_SECRET_KEY')) |
| 82 | + { |
| 83 | + // @codeCoverageIgnoreStart |
| 84 | + throw new STS_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.'); |
| 85 | + // @codeCoverageIgnoreEnd |
| 86 | + } |
| 87 | + |
| 88 | + return parent::__construct($key, $secret_key); |
| 89 | + } |
| 90 | + |
| 91 | + |
| 92 | + /*%******************************************************************************************%*/ |
| 93 | + // SERVICE METHODS |
| 94 | + |
| 95 | + /** |
| 96 | + * |
| 97 | + * The GetSessionToken action returns a set of temporary credentials for an AWS account or IAM User. The credentials consist of an Access Key |
| 98 | + * ID, a Secret Access Key, and a security token. These credentials are valid for the specified duration only. The session duration for IAM |
| 99 | + * users can be between one and 36 hours, with a default of 12 hours. The session duration for AWS account owners is restricted to one hour. |
| 100 | + * |
| 101 | + * For more information about using GetSessionToken to create temporary credentials, go to <a |
| 102 | + * href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/CreatingSessionTokens.html">Creating Temporary Credentials to Enable Access for |
| 103 | + * IAM Users</a> in <i>Using AWS Identity and Access Management</i>. |
| 104 | + * |
| 105 | + * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul> |
| 106 | + * <li><code>DurationSeconds</code> - <code>integer</code> - Optional - The duration, in seconds, that the credentials should remain valid. Acceptable durations for IAM user sessions range from 3600s (one hour) to 129600s (36 hours), with 43200s (12 hours) as the default. Sessions for AWS account owners are restricted to a maximum of 3600s (one hour). </li> |
| 107 | + * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li> |
| 108 | + * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul> |
| 109 | + * @return CFResponse A <CFResponse> object containing a parsed HTTP response. |
| 110 | + */ |
| 111 | + public function get_session_token($opt = null) |
| 112 | + { |
| 113 | + if (!$opt) $opt = array(); |
| 114 | + |
| 115 | + return $this->authenticate('GetSessionToken', $opt, $this->hostname); |
| 116 | + } |
| 117 | + |
| 118 | + /** |
| 119 | + * |
| 120 | + * The GetFederationToken action returns a set of temporary credentials for a federated user with the user name and policy specified in the |
| 121 | + * request. The credentials consist of an Access Key ID, a Secret Access Key, and a security token. The credentials are valid for the specified |
| 122 | + * duration, between one and 36 hours. |
| 123 | + * |
| 124 | + * The federated user who holds these credentials has any permissions allowed by the intersection of the specified policy and any resource or |
| 125 | + * user policies that apply to the caller of the GetFederationToken API, and any resource policies that apply to the federated user's ARN. For |
| 126 | + * more information about how token permissions work, see <a |
| 127 | + * href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/TokenPermissions.html">Controlling Permissions in Temporary Credentials</a> in |
| 128 | + * <i>Using AWS Identity and Access Management</i>. For information about using GetFederationToken to create temporary credentials, see <a |
| 129 | + * href="http://docs.amazonwebservices.com/IAM/latest/UserGuide/CreatingFedTokens.html">Creating Temporary Credentials to Enable Access for |
| 130 | + * Federated Users</a> in <i>Using AWS Identity and Access Management</i>. |
| 131 | + * |
| 132 | + * @param string $name (Required) The name of the federated user associated with the credentials. For information about limitations on user names, go to Limitations on IAM Entities in <i>Using AWS Identity and Access Management</i>. |
| 133 | + * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul> |
| 134 | + * <li><code>Policy</code> - <code>string</code> - Optional - A policy specifying the permissions to associate with the credentials. The caller can delegate their own permissions by specifying a policy, and both policies will be checked when a service call is made. For more information about how permissions work in the context of temporary credentials, see Controlling Permissions in Temporary Credentials in <i>Using AWS Identity and Access Management</i>. </li> |
| 135 | + * <li><code>DurationSeconds</code> - <code>integer</code> - Optional - The duration, in seconds, that the session should last. Acceptable durations for federation sessions range from 3600s (one hour) to 129600s (36 hours), with 43200s (12 hours) as the default. </li> |
| 136 | + * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li> |
| 137 | + * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul> |
| 138 | + * @return CFResponse A <CFResponse> object containing a parsed HTTP response. |
| 139 | + */ |
| 140 | + public function get_federation_token($name, $opt = null) |
| 141 | + { |
| 142 | + if (!$opt) $opt = array(); |
| 143 | + $opt['Name'] = $name; |
| 144 | + |
| 145 | + return $this->authenticate('GetFederationToken', $opt, $this->hostname); |
| 146 | + } |
| 147 | +} |
| 148 | + |
| 149 | + |
| 150 | +/*%******************************************************************************************%*/ |
| 151 | +// EXCEPTIONS |
| 152 | + |
| 153 | +/** |
| 154 | + * Default STS Exception. |
| 155 | + */ |
| 156 | +class STS_Exception extends Exception {} |
\ No newline at end of file |
Property changes on: trunk/extensions/OpenStackManager/aws-sdk/services/sts.class.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 157 | + native |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/ec2.class.php |
— | — | @@ -27,7 +27,7 @@ |
28 | 28 | * |
29 | 29 | * Visit <a href="http://aws.amazon.com/ec2/">http://aws.amazon.com/ec2/</a> for more information. |
30 | 30 | * |
31 | | - * @version Tue Jul 12 16:08:47 PDT 2011 |
| 31 | + * @version Wed Aug 03 10:10:05 PDT 2011 |
32 | 32 | * @license See the included NOTICE.md file for complete information. |
33 | 33 | * @copyright See the included NOTICE.md file for complete information. |
34 | 34 | * @link http://aws.amazon.com/ec2/Amazon Elastic Compute Cloud |
— | — | @@ -120,13 +120,16 @@ |
121 | 121 | // CONSTRUCTOR |
122 | 122 | |
123 | 123 | /** |
124 | | - * Constructs a new instance of <AmazonEC2>. |
| 124 | + * Constructs a new instance of <AmazonEC2>. If the <code>AWS_DEFAULT_CACHE_CONFIG</code> configuration |
| 125 | + * option is set, requests will be authenticated using a session token. Otherwise, requests will use |
| 126 | + * the older authentication method. |
125 | 127 | * |
126 | | - * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <code>AWS_KEY</code> constant. |
127 | | - * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
128 | | - * @return boolean false if no valid values are set, otherwise true. |
| 128 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 129 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 130 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
| 131 | + * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>. |
129 | 132 | */ |
130 | | - public function __construct($key = null, $secret_key = null) |
| 133 | + public function __construct($key = null, $secret_key = null, $token = null) |
131 | 134 | { |
132 | 135 | $this->api_version = '2011-02-28'; |
133 | 136 | $this->hostname = self::DEFAULT_URL; |
— | — | @@ -145,6 +148,11 @@ |
146 | 149 | // @codeCoverageIgnoreEnd |
147 | 150 | } |
148 | 151 | |
| 152 | + if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG) |
| 153 | + { |
| 154 | + return parent::session_based_auth($key, $secret_key, $token); |
| 155 | + } |
| 156 | + |
149 | 157 | return parent::__construct($key, $secret_key); |
150 | 158 | } |
151 | 159 | |
— | — | @@ -3032,21 +3040,32 @@ |
3033 | 3041 | * Adds or remove permission settings for the specified snapshot. |
3034 | 3042 | * |
3035 | 3043 | * @param string $snapshot_id (Required) The ID of the EBS snapshot whose attributes are being modified. |
3036 | | - * @param string $attribute (Required) The name of the attribute being modified. Available attribute names: <code>createVolumePermission</code> |
3037 | | - * @param string $operation_type (Required) The operation to perform on the attribute. Available operation names: <code>add</code>, <code>remove</code> |
3038 | 3044 | * @param array $opt (Optional) An associative array of parameters that can have the following keys: <ul> |
| 3045 | + * <li><code>Attribute</code> - <code>string</code> - Optional - The name of the attribute being modified. Available attribute names: <code>createVolumePermission</code> </li> |
| 3046 | + * <li><code>OperationType</code> - <code>string</code> - Optional - The operation to perform on the attribute. Available operation names: <code>add</code>, <code>remove</code> </li> |
3039 | 3047 | * <li><code>UserId</code> - <code>string|array</code> - Optional - The AWS user IDs to add to or remove from the list of users that have permission to create EBS volumes from the specified snapshot. Currently supports "all". Only valid when the <code>createVolumePermission</code> attribute is being modified. Pass a string for a single value, or an indexed array for multiple values. </li> |
3040 | 3048 | * <li><code>UserGroup</code> - <code>string|array</code> - Optional - The AWS group names to add to or remove from the list of groups that have permission to create EBS volumes from the specified snapshot. Currently supports "all". Only valid when the <code>createVolumePermission</code> attribute is being modified. Pass a string for a single value, or an indexed array for multiple values. </li> |
| 3049 | + * <li><code>CreateVolumePermission</code> - <code>array</code> - Optional - <ul> |
| 3050 | + * <li><code>Add</code> - <code>array</code> - Optional - <ul> |
| 3051 | + * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul> |
| 3052 | + * <li><code>UserId</code> - <code>string</code> - Optional - The user ID of the user that can create volumes from the snapshot. </li> |
| 3053 | + * <li><code>Group</code> - <code>string</code> - Optional - The group that is allowed to create volumes from the snapshot (currently supports "all"). </li> |
| 3054 | + * </ul></li> |
| 3055 | + * </ul></li> |
| 3056 | + * <li><code>Remove</code> - <code>array</code> - Optional - <ul> |
| 3057 | + * <li><code>x</code> - <code>array</code> - This represents a simple array index. <ul> |
| 3058 | + * <li><code>UserId</code> - <code>string</code> - Optional - The user ID of the user that can create volumes from the snapshot. </li> |
| 3059 | + * <li><code>Group</code> - <code>string</code> - Optional - The group that is allowed to create volumes from the snapshot (currently supports "all"). </li> |
| 3060 | + * </ul></li> |
| 3061 | + * </ul></li></ul></li> |
3041 | 3062 | * <li><code>curlopts</code> - <code>array</code> - Optional - A set of values to pass directly into <code>curl_setopt()</code>, where the key is a pre-defined <code>CURLOPT_*</code> constant.</li> |
3042 | 3063 | * <li><code>returnCurlHandle</code> - <code>boolean</code> - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.</li></ul> |
3043 | 3064 | * @return CFResponse A <CFResponse> object containing a parsed HTTP response. |
3044 | 3065 | */ |
3045 | | - public function modify_snapshot_attribute($snapshot_id, $attribute, $operation_type, $opt = null) |
| 3066 | + public function modify_snapshot_attribute($snapshot_id, $opt = null) |
3046 | 3067 | { |
3047 | 3068 | if (!$opt) $opt = array(); |
3048 | 3069 | $opt['SnapshotId'] = $snapshot_id; |
3049 | | - $opt['Attribute'] = $attribute; |
3050 | | - $opt['OperationType'] = $operation_type; |
3051 | 3070 | |
3052 | 3071 | // Optional parameter |
3053 | 3072 | if (isset($opt['UserId'])) |
— | — | @@ -3066,6 +3085,15 @@ |
3067 | 3086 | unset($opt['UserGroup']); |
3068 | 3087 | } |
3069 | 3088 | |
| 3089 | + // Optional parameter |
| 3090 | + if (isset($opt['CreateVolumePermission'])) |
| 3091 | + { |
| 3092 | + $opt = array_merge($opt, CFComplexType::map(array( |
| 3093 | + 'CreateVolumePermission' => $opt['CreateVolumePermission'] |
| 3094 | + ))); |
| 3095 | + unset($opt['CreateVolumePermission']); |
| 3096 | + } |
| 3097 | + |
3070 | 3098 | return $this->authenticate('ModifySnapshotAttribute', $opt, $this->hostname); |
3071 | 3099 | } |
3072 | 3100 | |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/elasticbeanstalk.class.php |
— | — | @@ -35,7 +35,7 @@ |
36 | 36 | * |
37 | 37 | * </ul> |
38 | 38 | * |
39 | | - * @version Tue Jul 12 16:08:17 PDT 2011 |
| 39 | + * @version Wed Aug 03 10:09:34 PDT 2011 |
40 | 40 | * @license See the included NOTICE.md file for complete information. |
41 | 41 | * @copyright See the included NOTICE.md file for complete information. |
42 | 42 | * @link http://aws.amazon.com/elasticbeanstalk/AWS Elastic Beanstalk |
Index: trunk/extensions/OpenStackManager/aws-sdk/services/importexport.class.php |
— | — | @@ -22,7 +22,7 @@ |
23 | 23 | * Internet. For large data sets, AWS Import/Export is often faster than Internet transfer and more cost effective than upgrading your |
24 | 24 | * connectivity. |
25 | 25 | * |
26 | | - * @version Tue Jul 12 16:11:17 PDT 2011 |
| 26 | + * @version Wed Aug 03 10:12:39 PDT 2011 |
27 | 27 | * @license See the included NOTICE.md file for complete information. |
28 | 28 | * @copyright See the included NOTICE.md file for complete information. |
29 | 29 | * @link http://aws.amazon.com/importexport/Amazon Import/Export Service |
Index: trunk/extensions/OpenStackManager/aws-sdk/_compatibility_test/sdk_compatibility_test.php |
— | — | @@ -1,19 +1,263 @@ |
2 | 2 | <?php |
3 | 3 | if (isset($_GET['logopng'])) |
4 | 4 | { |
5 | | - $data='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'; |
| 5 | + $data = <<<IMAGE |
| 6 | +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 |
| 119 | +l/8Df+8XDp+g0JUAAAAASUVORK5CYII= |
| 120 | +IMAGE; |
| 121 | + |
| 122 | + |
6 | 123 | header('Content-type: image/png'); |
7 | 124 | echo base64_decode($data); |
8 | 125 | exit; |
9 | 126 | } |
10 | | -else if (isset($_GET['background'])) |
| 127 | +elseif (isset($_GET['background'])) |
11 | 128 | { |
12 | | - $data='R0lGODlhMAEeAeYAAP///8ni6cTf5+72+PD3+c3k6+nz9ufy9ev099Pn7bnZ48bg6LfY4uHv8/r8/f3+/v7//7bX4cjh6fj7/Mvj6vz9/rva4+z19/X6+/f7/Pn8/fb6+7jZ4vv9/bra473b5Lzb5LXX4b7c5b/c5e31+NTo7tvs8dfq7/H3+bjY4tnq79Hm7c/l69nr8PL4+t7t8sDd5cLe5uPw9Nvr8Mri6fP4+tLn7er099Hm7O/2+dDm7OTw9OXx9Nbp7tbp7+Lv8+Du8szj6sXg57bY4d3s8djq7+jz9tzs8cPe58fh6M7k68Pf5+by9fz+/sDd5vT5+vT5+97t8bbY4trr8P7+/v7+/+Pw8+Xx9dXo7sHe5vH4+fP5+sHd5t/u8s/l7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAwAR4BAAf/gCGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKNEaWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExbBDyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7KUuHi4+Tl5ufo6err7O3u7/Dx8vP09fb34wz6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2osmKKjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qc+ZGDzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1aAKsmrdyrWr169gw4odS7as2bNo06pdy7at27dw/+PKnUu3rt27ePOS9cC3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sz5sIXPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fqkEIH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOLb/6hvPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFgifCAgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okoTjjCiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5P+SNsLg5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZELpxJlopqnmmmy26eabcMYp55x01mnnnXjmqeeefPaZJheABirooIQWauihiCaq6KKMNuroo5BGKumklFZqqaBZZKrpppx26umnoIYq6qiklmrqqaimquqqrLbq6qubxiDrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHI0orEssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghtvsEuSWa+656Kar7rrstuvuu/DGK++89NZr77345quvuQL06++/AAcs8MAEF2zwwQgnrPDCDDfs8MMQRyzxxBRXbPH/xRhnrPHGHHeMsBAghyzyyCSXbPLJKKes8sost+zyyzDHLPPMNNdss8gL5Kzzzjz37PPPQAct9NBEF2300UgnrfTSTDft9NNQRy311FRXbfXVWGdNdBJcd+3112CHLfbYZJdt9tlop6322my37fbbcMctt9cS1G333XjnrffefPft99+ABy744IQXbvjhiCeu+OKMN+7445BHLvnklFcOeACYZ6755px37vnnoIcu+uikl2766ainrvrqrLfu+uuwxy777LTXbvvtuI9Ow+689+7778AHL/zwxBdv/PHIJ6/88sw37/zz0EffOwXUV2/99dhnr/323Hfv/ffghy/+//jkl2/++einr/767Lfv/vvwxy///PR/H8T9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAbmrwAQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTDcoBJmSMMa2vCGOMyhDnfIwx768IdADKIQh0jEIhrxiEhMYg1ZwMQmOvGJUIyiFKdIxSpa8YpYzKIWt8jFLnrxi2AMoxid6IUymvGMaEyjGtfIxja68Y1wjKMc50jHOtrxjnjMox73eEYd+PGPgAykIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSUlA4uCSmMykJjfJyU568v+ToAylKEdJylKa8pSoTKUqV8nKVmZyBbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhpTljZIpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm8tMgDjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yc9++vOfAA2oQNtZgoIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjd6UCx49KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdKU5D24KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1Kbm1AdQjapUp0rVqlr1qlj/zapWt8rVrnr1q2ANq1jHStaymlWqJ0irWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvay2CYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymCWsCjbL2c569rOgDa1oR0va0pr2tKhNrWpXy9rWuva1sI1tZ1tA29ra9ra4za1ud8vb3vr2t8ANrnCHS9ziGve4yE2ucm07heY697nQja50p0vd6lr3utjNrna3y93ueve74A2veMf73BmY97zoTa9618ve9rr3vfCNr3znS9/62ve++M2vfvfLX/Sa4L8ADrCAB0zgAhv4wAhOsIIXzOAGO/jBEI6w/4QnTOEKB/gIGM6whjfM4Q57+MMgDrGIR0ziEpv4xChOsYpXzOIWu1jDRIixjGdM4xrb+MY4zrGOd8zjHvv4x0AOspCHTOQiG/nIM46CkpfM5CY7+clQjrKUp0zlKlv5yljOspa3zOUue/nLYGbyC8ZM5jKb+cxoTrOa18zmNrv5zXCOs5znTOc62/nOeM5zmbvA5z77+c+ADrSgB03oQhv60IhOtKIXzehGO/rRkI60pP0MhEpb+tKYzrSmN83pTnv606AOtahHTepSm/rUqE61qld96Qa4+tWwjrWsZ03rWtv61rjOta53zete+/rXwA62sIdN7GIb+9jITrayl//N7GY7O9c/iLa0p03talv72tjOtra3ze1ue/vb4A63uMdN7nKb+9zTtoK6183udrv73fCOt7znTe962/ve+M63vvfN7377+98AZ7cMBk7wghv84AhPuMIXzvCGO/zhEI+4xCdO8Ypb/OIYz3jBd8Dxjnv84yAPuchHTvKSm/zkKE+5ylfO8pa7/OUwj7nMPc6Dmtv85jjPuc53zvOe+/znQA+60IdO9KIb/ehIT7rSl37zKzj96VCPutSnTvWqW/3qWM+61rfO9a57/etgD7vYx052qDPh7GhPu9rXzva2u/3tcI+73OdO97rb/e54z7ve9873vqf9AIAPvOAHT/j/whv+8IhPvOIXz/jGO/7xkI+85CdP+cpb/vKYz7zmN8/5znv+86BfvBFGT/rSm/70qE+96lfP+ta7/vWwj73sZ0/72tv+9rjPfekNwPve+/73wA++8IdP/OIb//jIT77yl8/85jv/+dCPvvSnT/3qW//62M++9rfP/ePf4PvgD7/4x0/+8pv//OhPv/rXz/72u//98I+//OdP//qHHwH4z7/+98///vv//wAYgAI4gARYgAZ4gAiYgAq4gAzYgA74gBAYgRI4gRRYgRZ4gRg4gBewgRzYgR74gSAYgiI4giRYgiZ4giiYgiq4gizYgi74gjAYgzI4gzRYgzZ4gziY/4M6uIMmSAI++INAGIRCOIREWIRGeIRImIRKuIRM2IRO+IRQGIVSOIVUCIQDcIVYmIVauIVc2IVe+IVgGIZiOIZkWIZmeIZomIZquIZs2IZu+IZwGIdyOId0WId2eIdimAN6uId82Id++IeAGIiCOIiEWIiGeIiImIiKuIiM2IiO+IiQyIcEMImUWImWeImYmImauImc2Ime+ImgGIqiOIqkWIqmeIqomIqquIqs2Iqu+IqwGIuyOIueiAK2eIu4mIu6uIu82Iu++IvAGIzCOIzEWIzGeIzImIzKuIzMiIta8IzQGI3SOI3UWI3WeI3YmI3auI3c2I3e+I3gGI7iOP+O5FiO0egC6JiO6riO7NiO7viO8BiP8jiP9FiP9niP+JiP+riP/NiP/qiONRCQAjmQBFmQBnmQCJmQCrmQDNmQDvmQEBmREjmRFFmRFnmRA7kFGrmRHNmRHvmRIBmSIjmSJFmSJnmSKJmSKrmSLNmSLvmSMMmRTzCTNFmTNnmTOJmTOrmTPNmTPvmTQBmUQjmURFmURnmUSJmUNQkFTNmUTvmUUBmVUjmVVFmVVnmVWJmVWrmVXNmVXvmVYBmWYumUGFCWZnmWaJmWarmWbNmWbvmWcBmXcjmXdFmXdnmXeJmXermXfNmXfvmXgBmYgjmYhFmYcLkBiJmYirmYjNn/mI75mJAZmZI5mZRZmZZ5mZiZmZq5mZzZmZ75maAZmqI5mqRZmqZ5mqg5mRmwmqzZmq75mrAZm7I5m7RZm7Z5m7iZm7q5m7zZm775m8AZnMI5nMRZnMZ5nMiZnMq5nLY5Ac75nNAZndI5ndRZndZ5ndiZndq5ndzZnd75neAZnuI5nuRZnuZ5nuiZnuq5nuzZnu6ZnRoQn/I5n/RZn/Z5n/iZn/q5n/zZn/75nwAaoAI6oARaoAZ6oAiaoAq6oAzaoA76oBAaofzpABRaoRZ6oRiaoRq6oRzaoR76oSAaoiI6oiRaoiZ6oiiaoiq6oizaoi76ojAaozI6ozT6oR1w/6M4mqM6uqM82qM++qNAGqRCOqREWqRGeqRImqRKuqRM2qRO+qRQGqVSOqVUWqVWeqVCWgFauqVc2qVe+qVgGqZiOqZkWqZmeqZomqZquqZs2qZu+qZwGqdyOqd0Wqd2eqd4mqd6WqZN0Kd++qeAGqiCOqiEWqiGeqiImqiKuqiM2qiO+qiQGqmSOql/+gCWeqmYmqmauqmc2qme+qmgGqqiOqqkWqqmeqqomqqquqqs2qqu+qqwGquyOqu0Wqu2GqpUkKu6uqu82qu++qvAGqzCOqzEWqzGeqzImqzKuqzM2qzO+qy7WgXSOq3UWq3Weq3Ymq3auq3c2q3e+q3gGv+u4jqu5Fqu5nqu6EqtELCu7Nqu7vqu8Bqv8jqv9Fqv9nqv+Jqv+rqv/Nqv/vqvABuwAjuwBFuwBnuwCJuwCruw9goADvuwEBuxEjuxFFuxFnuxGJuxGruxHNuxHvuxIBuyIjuyJFuyJnuyKJuyKruyLNuyLvuyMBuzMjuzNFuzNnuzOJuzOruzPNuzPvuzQBu0Qju0RFu0Rnu0SJu0Sru0TNu0Tvu0UBu1Uju1VFu1Vnu1WJu1Wru1XNu1Xvu1YBu2Yju2ZFu2Znu2aJu2aru2bNu2bvu2cBu3cju3dFu3dnu3eJu3eru3fNu3fvu3gBu4gju4hFu4hnu4iJu4irv/uIzbuI77uJAbuZI7uZRbuZZ7uZibuZq7uZzbuZ77uaAbuqI7uqRbuqZ7uqibuqq7uqzbuq77urAbu7I7u7Rbu7Z7u7ibu7q7u7zbu777u8AbvMI7vMRbvMZ7vMibvMq7vMzbvM77vNAbvdI7vdRbvdZ7vdibvdq7vdzbvd77veAbvuI7vuRbvuZ7vuibvuq7vuzbvu77vvAbv/I7v/Rbv/Z7v/ibv/q7v/zbv/77vwAcwAI8wARcwAZ8wAicwAq8wAzcwA78wBAcwRI8wRRcwRZ8wRicwRq8wRzcwR78wSAcwiI8wiRcwiZ8wiicwiq8wizcwi78wjAcwzI8wzRcFcM2fMM4nMM6vMM83MM+/MNArLmBAAA7'; |
| 129 | + $data = <<<IMAGE |
| 130 | +R0lGODlhMAEeAeYAAP///8ni6cTf5+72+PD3+c3k6+nz9ufy9ev099Pn7bnZ48bg6LfY4uHv8/r8 |
| 131 | +/f3+/v7//7bX4cjh6fj7/Mvj6vz9/rva4+z19/X6+/f7/Pn8/fb6+7jZ4vv9/bra473b5Lzb5LXX |
| 132 | +4b7c5b/c5e31+NTo7tvs8dfq7/H3+bjY4tnq79Hm7c/l69nr8PL4+t7t8sDd5cLe5uPw9Nvr8Mri |
| 133 | +6fP4+tLn7er099Hm7O/2+dDm7OTw9OXx9Nbp7tbp7+Lv8+Du8szj6sXg57bY4d3s8djq7+jz9tzs |
| 134 | +8cPe58fh6M7k68Pf5+by9fz+/sDd5vT5+vT5+97t8bbY4trr8P7+/v7+/+Pw8+Xx9dXo7sHe5vH4 |
| 135 | ++fP5+sHd5t/u8s/l7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| 136 | +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5 |
| 137 | +BAAAAAAALAAAAAAwAR4BAAf/gCGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKNEaWm |
| 138 | +p6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExbBDyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7K |
| 139 | +UuHi4+Tl5ufo6err7O3u7/Dx8vP09fb34wz6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGi |
| 140 | +xYsYM2osmKKjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qc+ZGDzZs4c+rcybOnz59AgwodSrSo0aNI |
| 141 | +kypdyrSp06dQo0qdSrWq1aAKsmrdyrWr169gw4odS7as2bNo06pdy7at27dw/+PKnUu3rt27ePOS |
| 142 | +9cC3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sz5sIXPoEOLHk26tOnTqFOrXs26 |
| 143 | +tevXsGPLnk27tu3buHPr3s27t+/fqkEIH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv |
| 144 | +4MOLb/6hvPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFgifCAgmqOCCDDbo4IMQ |
| 145 | +RijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okoTjjCiiy26OKLMMYo44w01mjjjTjmqOOOPPbo |
| 146 | +449ABinkkEQWaeSRSCap5P+SNsLg5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZELpxJlopqnm |
| 147 | +mmy26eabcMYp55x01mnnnXjmqeeefPaZJheABirooIQWauihiCaq6KKMNuroo5BGKumklFZqqaBZ |
| 148 | +ZKrpppx26umnoIYq6qiklmrqqaimquqqrLbq6qubxiDrrLTWauutuOaq66689urrr8AGK+ywxBZr |
| 149 | +7LHI0orEssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghtvsEuSWa+656Kar7rrstuvuu/DGK++8 |
| 150 | +9NZr77345quvuQL06++/AAcs8MAEF2zwwQgnrPDCDDfs8MMQRyzxxBRXbPH/xRhnrPHGHHeMsBAg |
| 151 | +hyzyyCSXbPLJKKes8sost+zyyzDHLPPMNNdss8gL5Kzzzjz37PPPQAct9NBEF2300UgnrfTSTDft |
| 152 | +9NNQRy311FRXbfXVWGdNdBJcd+3112CHLfbYZJdt9tlop6322my37fbbcMctt9cS1G333Xjnrffe |
| 153 | +fPft99+ABy744IQXbvjhiCeu+OKMN+7445BHLvnklFcOeACYZ6755px37vnnoIcu+uikl2766ain |
| 154 | +rvrqrLfu+uuwxy777LTXbvvtuI9Ow+689+7778AHL/zwxBdv/PHIJ6/88sw37/zz0EffOwXUV2/9 |
| 155 | +9dhnr/323Hfv/ffghy/+//jkl2/++einr/767Lfv/vvwxy///PR/H8T9+Oev//789+///wAMoAAH |
| 156 | +SMACGvCACEygAhfIwAbmrwAQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jC |
| 157 | +FrrwhTDcoBJmSMMa2vCGOMyhDnfIwx768IdADKIQh0jEIhrxiEhMYg1ZwMQmOvGJUIyiFKdIxSpa |
| 158 | +8YpYzKIWt8jFLnrxi2AMoxid6IUymvGMaEyjGtfIxja68Y1wjKMc50jHOtrxjnjMox73eEYd+PGP |
| 159 | +gAykIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSUlA4uCSmMykJjfJyU568v+ToAylKEdJylKa8pSo |
| 160 | +TKUqV8nKVmZyBbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhpTljZIpjKXycxmOvOZ0Iym |
| 161 | +NKdJzWpa85rYzKY2t8nNbnrzm8tMgDjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73 |
| 162 | +yc9++vOfAA2oQNtZgoIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjd6UCx49KMgDalIR0rS |
| 163 | +kpr0pChNqUpXytKWuvSlMI2pTGdKU5D24KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1Kbm |
| 164 | +1AdQjapUp0rVqlr1qlj/zapWt8rVrnr1q2ANq1jHStaymlWqJ0irWtfK1ra69a1wjatc50rXutr1 |
| 165 | +rnjNq173yte++vWvay2CYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymCWsCjbL2c569rOg |
| 166 | +Da1oR0va0pr2tKhNrWpXy9rWuva1sI1tZ1tA29ra9ra4za1ud8vb3vr2t8ANrnCHS9ziGve4yE2u |
| 167 | +cm07heY697nQja50p0vd6lr3utjNrna3y93ueve74A2veMf73BmY97zoTa9618ve9rr3vfCNr3zn |
| 168 | +S9/62ve++M2vfvfLX/Sa4L8ADrCAB0zgAhv4wAhOsIIXzOAGO/jBEI6w/4QnTOEKB/gIGM6whjfM |
| 169 | +4Q57+MMgDrGIR0ziEpv4xChOsYpXzOIWu1jDRIixjGdM4xrb+MY4zrGOd8zjHvv4x0AOspCHTOQi |
| 170 | +G/nIM46CkpfM5CY7+clQjrKUp0zlKlv5yljOspa3zOUue/nLYGbyC8ZM5jKb+cxoTrOa18zmNrv5 |
| 171 | +zXCOs5znTOc62/nOeM5zmbvA5z77+c+ADrSgB03oQhv60IhOtKIXzehGO/rRkI60pP0MhEpb+tKY |
| 172 | +zrSmN83pTnv606AOtahHTepSm/rUqE61qld96Qa4+tWwjrWsZ03rWtv61rjOta53zete+/rXwA62 |
| 173 | +sIdN7GIb+9jITrayl//N7GY7O9c/iLa0p03talv72tjOtra3ze1ue/vb4A63uMdN7nKb+9zTtoK6 |
| 174 | +183udrv73fCOt7znTe962/ve+M63vvfN7377+98AZ7cMBk7wghv84AhPuMIXzvCGO/zhEI+4xCdO |
| 175 | +8Ypb/OIYz3jBd8Dxjnv84yAPuchHTvKSm/zkKE+5ylfO8pa7/OUwj7nMPc6Dmtv85jjPuc53zvOe |
| 176 | ++/znQA+60IdO9KIb/ehIT7rSl37zKzj96VCPutSnTvWqW/3qWM+61rfO9a57/etgD7vYx052qDPh |
| 177 | +7GhPu9rXzva2u/3tcI+73OdO97rb/e54z7ve9873vqf9AIAPvOAHT/j/whv+8IhPvOIXz/jGO/7x |
| 178 | +kI+85CdP+cpb/vKYz7zmN8/5znv+86BfvBFGT/rSm/70qE+96lfP+ta7/vWwj73sZ0/72tv+9rjP |
| 179 | +fekNwPve+/73wA++8IdP/OIb//jIT77yl8/85jv/+dCPvvSnT/3qW//62M++9rfP/ePf4PvgD7/4 |
| 180 | +x0/+8pv//OhPv/rXz/72u//98I+//OdP//qHHwH4z7/+98///vv//wAYgAI4gARYgAZ4gAiYgAq4 |
| 181 | +gAzYgA74gBAYgRI4gRRYgRZ4gRg4gBewgRzYgR74gSAYgiI4giRYgiZ4giiYgiq4gizYgi74gjAY |
| 182 | +gzI4gzRYgzZ4gziY/4M6uIMmSAI++INAGIRCOIREWIRGeIRImIRKuIRM2IRO+IRQGIVSOIVUCIQD |
| 183 | +cIVYmIVauIVc2IVe+IVgGIZiOIZkWIZmeIZomIZquIZs2IZu+IZwGIdyOId0WId2eIdimAN6uId8 |
| 184 | +2Id++IeAGIiCOIiEWIiGeIiImIiKuIiM2IiO+IiQyIcEMImUWImWeImYmImauImc2Ime+ImgGIqi |
| 185 | +OIqkWIqmeIqomIqquIqs2Iqu+IqwGIuyOIueiAK2eIu4mIu6uIu82Iu++IvAGIzCOIzEWIzGeIzI |
| 186 | +mIzKuIzMiIta8IzQGI3SOI3UWI3WeI3YmI3auI3c2I3e+I3gGI7iOP+O5FiO0egC6JiO6riO7NiO |
| 187 | +7viO8BiP8jiP9FiP9niP+JiP+riP/NiP/qiONRCQAjmQBFmQBnmQCJmQCrmQDNmQDvmQEBmREjmR |
| 188 | +FFmRFnmRA7kFGrmRHNmRHvmRIBmSIjmSJFmSJnmSKJmSKrmSLNmSLvmSMMmRTzCTNFmTNnmTOJmT |
| 189 | +OrmTPNmTPvmTQBmUQjmURFmURnmUSJmUNQkFTNmUTvmUUBmVUjmVVFmVVnmVWJmVWrmVXNmVXvmV |
| 190 | +YBmWYumUGFCWZnmWaJmWarmWbNmWbvmWcBmXcjmXdFmXdnmXeJmXermXfNmXfvmXgBmYgjmYhFmY |
| 191 | +cLkBiJmYirmYjNn/mI75mJAZmZI5mZRZmZZ5mZiZmZq5mZzZmZ75maAZmqI5mqRZmqZ5mqg5mRmw |
| 192 | +mqzZmq75mrAZm7I5m7RZm7Z5m7iZm7q5m7zZm775m8AZnMI5nMRZnMZ5nMiZnMq5nLY5Ac75nNAZ |
| 193 | +ndI5ndRZndZ5ndiZndq5ndzZnd75neAZnuI5nuRZnuZ5nuiZnuq5nuzZnu6ZnRoQn/I5n/RZn/Z5 |
| 194 | +n/iZn/q5n/zZn/75nwAaoAI6oARaoAZ6oAiaoAq6oAzaoA76oBAaofzpABRaoRZ6oRiaoRq6oRza |
| 195 | +oR76oSAaoiI6oiRaoiZ6oiiaoiq6oizaoi76ojAaozI6ozT6oR1w/6M4mqM6uqM82qM++qNAGqRC |
| 196 | +OqREWqRGeqRImqRKuqRM2qRO+qRQGqVSOqVUWqVWeqVCWgFauqVc2qVe+qVgGqZiOqZkWqZmeqZo |
| 197 | +mqZquqZs2qZu+qZwGqdyOqd0Wqd2eqd4mqd6WqZN0Kd++qeAGqiCOqiEWqiGeqiImqiKuqiM2qiO |
| 198 | ++qiQGqmSOql/+gCWeqmYmqmauqmc2qme+qmgGqqiOqqkWqqmeqqomqqquqqs2qqu+qqwGquyOqu0 |
| 199 | +Wqu2GqpUkKu6uqu82qu++qvAGqzCOqzEWqzGeqzImqzKuqzM2qzO+qy7WgXSOq3UWq3Weq3Ymq3a |
| 200 | +uq3c2q3e+q3gGv+u4jqu5Fqu5nqu6EqtELCu7Nqu7vqu8Bqv8jqv9Fqv9nqv+Jqv+rqv/Nqv/vqv |
| 201 | +ABuwAjuwBFuwBnuwCJuwCruw9goADvuwEBuxEjuxFFuxFnuxGJuxGruxHNuxHvuxIBuyIjuyJFuy |
| 202 | +JnuyKJuyKruyLNuyLvuyMBuzMjuzNFuzNnuzOJuzOruzPNuzPvuzQBu0Qju0RFu0Rnu0SJu0Sru0 |
| 203 | +TNu0Tvu0UBu1Uju1VFu1Vnu1WJu1Wru1XNu1Xvu1YBu2Yju2ZFu2Znu2aJu2aru2bNu2bvu2cBu3 |
| 204 | +cju3dFu3dnu3eJu3eru3fNu3fvu3gBu4gju4hFu4hnu4iJu4irv/uIzbuI77uJAbuZI7uZRbuZZ7 |
| 205 | +uZibuZq7uZzbuZ77uaAbuqI7uqRbuqZ7uqibuqq7uqzbuq77urAbu7I7u7Rbu7Z7u7ibu7q7u7zb |
| 206 | +u777u8AbvMI7vMRbvMZ7vMibvMq7vMzbvM77vNAbvdI7vdRbvdZ7vdibvdq7vdzbvd77veAbvuI7 |
| 207 | +vuRbvuZ7vuibvuq7vuzbvu77vvAbv/I7v/Rbv/Z7v/ibv/q7v/zbv/77vwAcwAI8wARcwAZ8wAic |
| 208 | +wAq8wAzcwA78wBAcwRI8wRRcwRZ8wRicwRq8wRzcwR78wSAcwiI8wiRcwiZ8wiicwiq8wizcwi78 |
| 209 | +wjAcwzI8wzRcFcM2fMM4nMM6vMM83MM+/MNArLmBAAA7 |
| 210 | +IMAGE; |
| 211 | + |
13 | 212 | header('Content-type: image/gif'); |
14 | 213 | echo base64_decode($data); |
15 | 214 | exit; |
16 | 215 | } |
| 216 | +elseif (isset($_GET['loader'])) |
| 217 | +{ |
| 218 | + $data = <<<IMAGE |
| 219 | +R0lGODlhEAALAPQAAP///wBmzNro9tDi9Ory+gZpzQBmzC6B1YKz5WCf3rrV8CJ60kqS2oq452Sh |
| 220 | +377X8SZ80wRozE6U2+bv+djn9vT4/DiH19zp9/L2+7bS76DF68re8+70+gAAAAAAAAAAACH/C05F |
| 221 | +VFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAA |
| 222 | +EAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJ |
| 223 | +CwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJ |
| 224 | +CwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHT |
| 225 | +uBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V5 |
| 226 | +5zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme |
| 227 | +1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAA |
| 228 | +ABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2 |
| 229 | +y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2 |
| 230 | +isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0 |
| 231 | +DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA |
| 232 | +IMAGE; |
| 233 | + header('Content-type: image/gif'); |
| 234 | + echo base64_decode($data); |
| 235 | + exit; |
| 236 | +} |
| 237 | +elseif (isset($_GET['ssl_check'])) |
| 238 | +{ |
| 239 | + header('Content-type: text/plain; charset=utf-8'); |
17 | 240 | |
| 241 | + $ch = curl_init(); |
| 242 | + curl_setopt($ch, CURLOPT_URL, 'https://email.us-east-1.amazonaws.com'); |
| 243 | + curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); |
| 244 | + curl_setopt($ch, CURLOPT_HEADER, false); |
| 245 | + curl_setopt($ch, CURLOPT_NOBODY, true); |
| 246 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
| 247 | + curl_setopt($ch, CURLOPT_TIMEOUT, 5184000); |
| 248 | + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); |
| 249 | + curl_setopt($ch, CURLOPT_NOSIGNAL, true); |
| 250 | + curl_setopt($ch, CURLOPT_USERAGENT, 'AWS SDK for PHP Compatibility Test'); |
| 251 | + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); |
| 252 | + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); |
| 253 | + curl_setopt($ch, CURLOPT_VERBOSE, true); |
| 254 | + |
| 255 | + curl_exec($ch); |
| 256 | + echo (curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT) === 0) ? 'false' : 'true'; |
| 257 | + curl_close($ch); |
| 258 | + |
| 259 | + exit; |
| 260 | +} |
| 261 | + |
18 | 262 | // Required |
19 | 263 | $php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.2.0', '>=')); |
20 | 264 | $simplexml_ok = extension_loaded('simplexml'); |
— | — | @@ -42,8 +286,28 @@ |
43 | 287 | $sqlite2_ok = extension_loaded('sqlite'); |
44 | 288 | $sqlite3_ok = extension_loaded('sqlite3'); |
45 | 289 | $sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok)); |
| 290 | + |
| 291 | +// Other |
46 | 292 | $int64_ok = (PHP_INT_MAX === 9223372036854775807); |
| 293 | +$ini_memory_limit = get_cfg_var('memory_limit'); |
| 294 | +$ini_open_basedir = get_cfg_ini('open_basedir'); |
| 295 | +$ini_safe_mode = get_cfg_ini('safe_mode'); |
| 296 | +$ini_zend_enable_gc = get_cfg_ini('zend.enable_gc'); |
47 | 297 | |
| 298 | +function get_cfg_ini($config) |
| 299 | +{ |
| 300 | + $cfg_value = get_cfg_var($config); |
| 301 | + |
| 302 | + if ($cfg_value === false || $cfg_value === '' || $cfg_value === 0) |
| 303 | + { |
| 304 | + return false; |
| 305 | + } |
| 306 | + elseif ($cfg_value === true || $cfg_value === '1' || $cfg_value === 1) |
| 307 | + { |
| 308 | + return true; |
| 309 | + } |
| 310 | +} |
| 311 | + |
48 | 312 | header('Content-type: text/html; charset=UTF-8'); |
49 | 313 | |
50 | 314 | ?><!DOCTYPE html> |
— | — | @@ -52,6 +316,16 @@ |
53 | 317 | <head> |
54 | 318 | <title>AWS SDK for PHP: Environment Compatibility Test</title> |
55 | 319 | |
| 320 | +<script type="text/javascript" charset="utf-8"> |
| 321 | +/*! |
| 322 | + * Reqwest! A x-browser general purpose XHR connection manager |
| 323 | + * copyright Dustin Diaz 2011 |
| 324 | + * https://github.com/ded/reqwest |
| 325 | + * license MIT |
| 326 | + */ |
| 327 | +!function(window){function serial(a){var b=a.name;if(a.disabled||!b)return"";b=enc(b);switch(a.tagName.toLowerCase()){case"input":switch(a.type){case"reset":case"button":case"image":case"file":return"";case"checkbox":case"radio":return a.checked?b+"="+(a.value?enc(a.value):!0)+"&":"";default:return b+"="+(a.value?enc(a.value):"")+"&"}break;case"textarea":return b+"="+enc(a.value)+"&";case"select":return b+"="+enc(a.options[a.selectedIndex].value)+"&"}return""}function enc(a){return encodeURIComponent(a)}function reqwest(a,b){return new Reqwest(a,b)}function init(o,fn){function error(a){o.error&&o.error(a),complete(a)}function success(resp){o.timeout&&clearTimeout(self.timeout)&&(self.timeout=null);var r=resp.responseText;if(r)switch(type){case"json":resp=window.JSON?window.JSON.parse(r):eval("("+r+")");break;case"js":resp=eval(r);break;case"html":resp=r}fn(resp),o.success&&o.success(resp),complete(resp)}function complete(a){o.complete&&o.complete(a)}this.url=typeof o=="string"?o:o.url,this.timeout=null;var type=o.type||setType(this.url),self=this;fn=fn||function(){},o.timeout&&(this.timeout=setTimeout(function(){self.abort(),error()},o.timeout)),this.request=getRequest(o,success,error)}function setType(a){return/\.json$/.test(a)?"json":/\.jsonp$/.test(a)?"jsonp":/\.js$/.test(a)?"js":/\.html?$/.test(a)?"html":/\.xml$/.test(a)?"xml":"js"}function Reqwest(a,b){this.o=a,this.fn=b,init.apply(this,arguments)}function getRequest(a,b,c){if(a.type!="jsonp"){var f=xhr();f.open(a.method||"GET",typeof a=="string"?a:a.url,!0),setHeaders(f,a),f.onreadystatechange=readyState(f,b,c),a.before&&a.before(f),f.send(a.data||null);return f}var d=doc.createElement("script");window[getCallbackName(a)]=generalCallback,d.type="text/javascript",d.src=a.url,d.async=!0;var e=function(){a.success&&a.success(lastValue),lastValue=undefined,head.removeChild(d)};d.onload=e,d.onreadystatechange=function(){/^loaded|complete$/.test(d.readyState)&&e()},head.appendChild(d)}function generalCallback(a){lastValue=a}function getCallbackName(a){var b=a.jsonpCallback||"callback";if(a.url.slice(-(b.length+2))==b+"=?"){var c="reqwest_"+uniqid++;a.url=a.url.substr(0,a.url.length-1)+c;return c}var d=new RegExp(b+"=([\\w]+)");return a.url.match(d)[1]}function setHeaders(a,b){var c=b.headers||{};c.Accept=c.Accept||"text/javascript, text/html, application/xml, text/xml, */*",b.crossOrigin||(c["X-Requested-With"]=c["X-Requested-With"]||"XMLHttpRequest");if(b.data){c["Content-type"]=c["Content-type"]||"application/x-www-form-urlencoded";for(var d in c)c.hasOwnProperty(d)&&a.setRequestHeader(d,c[d],!1)}}function readyState(a,b,c){return function(){a&&a.readyState==4&&(twoHundo.test(a.status)?b(a):c(a))}}var v=window.v;!v&&typeof require!="undefined"&&(v=require("valentine"));var twoHundo=/^20\d$/,doc=document,byTag="getElementsByTagName",head=doc[byTag]("head")[0],xhr="XMLHttpRequest"in window?function(){return new XMLHttpRequest}:function(){return new ActiveXObject("Microsoft.XMLHTTP")},uniqid=0,lastValue;Reqwest.prototype={abort:function(){this.request.abort()},retry:function(){init.call(this,this.o,this.fn)}},reqwest.serialize=function(a){var b=a[byTag]("input"),c=a[byTag]("select"),d=a[byTag]("textarea");return(v(b).chain().toArray().map(serial).value().join("")+v(c).chain().toArray().map(serial).value().join("")+v(d).chain().toArray().map(serial).value().join("")).replace(/&$/,"")},reqwest.serializeArray=function(a){for(var b=this.serialize(a).split("&"),c=0,d=b.length,e=[],f;c<d;c++)b[c]&&(f=b[c].split("="))&&e.push({name:f[0],value:f[1]});return e};var old=window.reqwest;reqwest.noConflict=function(){window.reqwest=old;return this},window.reqwest=reqwest}(this) |
| 328 | +</script> |
| 329 | + |
56 | 330 | <style type="text/css"> |
57 | 331 | body { |
58 | 332 | font:14px/1.4em "Helvetica Neue", Helvetica, "Lucida Grande", "Droid Sans", Ubuntu, Verdana, Arial, Clean, Sans, sans-serif; |
— | — | @@ -127,43 +401,45 @@ |
128 | 402 | margin:15px 0 5px 0; |
129 | 403 | } |
130 | 404 | |
131 | | -code { |
132 | | - font-size:1.1em; |
133 | | - background-color:#f3f3ff; |
134 | | - color:#000; |
| 405 | +pre, code { |
| 406 | + font-family: "Panic Sans", "Bitstream Vera Sans Mono", Monaco, Consolas, "Andale Mono", monospace; |
| 407 | + background-color: #F0F0F0; |
| 408 | + border-radius: 3px 3px 3px 3px; |
| 409 | + padding: 0 3px; |
| 410 | + font-size: 1em; |
135 | 411 | } |
136 | 412 | |
137 | 413 | em strong { |
138 | 414 | text-transform: uppercase; |
139 | 415 | } |
140 | 416 | |
141 | | -table#chart { |
| 417 | +table.chart { |
142 | 418 | border-collapse:collapse; |
143 | 419 | } |
144 | 420 | |
145 | | -table#chart th { |
| 421 | +table.chart th { |
146 | 422 | background-color:#eee; |
147 | 423 | padding:2px 3px; |
148 | 424 | border:1px solid #fff; |
149 | 425 | } |
150 | 426 | |
151 | | -table#chart td { |
| 427 | +table.chart td { |
152 | 428 | text-align:center; |
153 | 429 | padding:2px 3px; |
154 | 430 | border:1px solid #eee; |
155 | 431 | } |
156 | 432 | |
157 | | -table#chart tr.enabled td { |
| 433 | +table.chart tr.enabled td { |
158 | 434 | /* Leave this alone */ |
159 | 435 | } |
160 | 436 | |
161 | | -table#chart tr.disabled td, |
162 | | -table#chart tr.disabled td a { |
| 437 | +table.chart tr.disabled td, |
| 438 | +table.chart tr.disabled td a { |
163 | 439 | color:#999; |
164 | 440 | font-style:italic; |
165 | 441 | } |
166 | 442 | |
167 | | -table#chart tr.disabled td a { |
| 443 | +table.chart tr.disabled td a { |
168 | 444 | text-decoration:underline; |
169 | 445 | } |
170 | 446 | |
— | — | @@ -212,7 +488,7 @@ |
213 | 489 | <h2 style="text-align:center;"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?logopng" alt="SDK Compatibility Test" title="SDK Compatibility Test" /></h2> |
214 | 490 | |
215 | 491 | <h3>Minimum Requirements</h3> |
216 | | - <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart"> |
| 492 | + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart"> |
217 | 493 | <thead> |
218 | 494 | <tr> |
219 | 495 | <th>Test</th> |
— | — | @@ -260,7 +536,7 @@ |
261 | 537 | </table> |
262 | 538 | |
263 | 539 | <h3>Optional Extensions</h3> |
264 | | - <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart"> |
| 540 | + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart"> |
265 | 541 | <thead> |
266 | 542 | <tr> |
267 | 543 | <th>Test</th> |
— | — | @@ -322,8 +598,36 @@ |
323 | 599 | </tbody> |
324 | 600 | </table> |
325 | 601 | |
| 602 | + <h3>Settings for php.ini</h3> |
| 603 | + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart"> |
| 604 | + <thead> |
| 605 | + <tr> |
| 606 | + <th>Test</th> |
| 607 | + <th>Would Like To Be</th> |
| 608 | + <th>What You Have</th> |
| 609 | + </tr> |
| 610 | + </thead> |
| 611 | + <tbody> |
| 612 | + <tr class="<?php echo (!$ini_open_basedir) ? 'enabled' : 'disabled'; ?>"> |
| 613 | + <td><a href="http://php.net/open_basedir">open_basedir</a></td> |
| 614 | + <td>off</td> |
| 615 | + <td><?php echo ($ini_open_basedir) ? 'on' : 'off'; ?></td> |
| 616 | + </tr> |
| 617 | + <tr class="<?php echo (!$ini_safe_mode) ? 'enabled' : 'disabled'; ?>"> |
| 618 | + <td><a href="http://php.net/safe_mode">safe_mode</a></td> |
| 619 | + <td>off</td> |
| 620 | + <td><?php echo ($ini_safe_mode) ? 'on' : 'off'; ?></td> |
| 621 | + </tr> |
| 622 | + <tr class="<?php echo ($ini_zend_enable_gc) ? 'enabled' : 'disabled'; ?>"> |
| 623 | + <td><a href="http://php.net/zend.enable_gc">zend.enable_gc</a></td> |
| 624 | + <td>on</td> |
| 625 | + <td><?php echo ($ini_zend_enable_gc) ? 'on' : 'off'; ?></td> |
| 626 | + </tr> |
| 627 | + </tbody> |
| 628 | + </table> |
| 629 | + |
326 | 630 | <h3>Other</h3> |
327 | | - <table cellpadding="0" cellspacing="0" border="0" width="100%" id="chart"> |
| 631 | + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart"> |
328 | 632 | <thead> |
329 | 633 | <tr> |
330 | 634 | <th>Test</th> |
— | — | @@ -375,12 +679,49 @@ |
376 | 680 | </div> |
377 | 681 | <?php endif; ?> |
378 | 682 | |
| 683 | + <?php if ($apc_ok || $xcache_ok || $file_ok): ?> |
379 | 684 | <div class="chunk"> |
| 685 | + <h3>Recommended settings for config.inc.php</h3> |
| 686 | + <p>Based on your particular server configuration, the following settings are recommended.</p> |
| 687 | + <br> |
| 688 | + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="chart"> |
| 689 | + <thead> |
| 690 | + <tr> |
| 691 | + <th>Configuration Setting</th> |
| 692 | + <th>Recommended Value</th> |
| 693 | + </tr> |
| 694 | + </thead> |
| 695 | + <tbody> |
| 696 | + <tr> |
| 697 | + <td><code>AWS_DEFAULT_CACHE_CONFIG</code></td> |
| 698 | + <?php if ($apc_ok): ?> |
| 699 | + <td><code>apc</code></td> |
| 700 | + <?php elseif ($xcache_ok): ?> |
| 701 | + <td><code>xcache</code></td> |
| 702 | + <?php elseif ($file_ok): ?> |
| 703 | + <td>Any valid, server-writable file system path</td> |
| 704 | + <?php endif; ?> |
| 705 | + </tr> |
| 706 | + <tr> |
| 707 | + <td><code>AWS_CERTIFICATE_AUTHORITY</code></td> |
| 708 | + <td id="ssl_check"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?loader" alt="Loading..."></td> |
| 709 | + </tr> |
| 710 | + </tbody> |
| 711 | + </table> |
| 712 | + <br> |
| 713 | + </div> |
| 714 | + <?php endif; ?> |
| 715 | + |
| 716 | + <div class="chunk"> |
380 | 717 | <h3>Give me the details!</h3> |
381 | 718 | <?php if ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok): ?> |
382 | 719 | <ol> |
383 | 720 | <li><em>Your environment meets the minimum requirements for using the <strong>AWS SDK for PHP</strong>!</em></li> |
384 | 721 | |
| 722 | + <?php if (version_compare(PHP_VERSION, '5.3.0') < 0): ?> |
| 723 | + <li>You're still running <strong>PHP <?php echo PHP_VERSION; ?></strong>. The PHP 5.2 family is no longer supported by the PHP team, and future versions of the AWS SDK for PHP will <i>require</i> PHP 5.3 or newer.</li> |
| 724 | + <?php endif; ?> |
| 725 | + |
385 | 726 | <?php if ($openssl_ok): ?> |
386 | 727 | <li>The <a href="http://php.net/openssl">OpenSSL</a> extension is installed. This will allow you to use <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html">CloudFront Private URLs</a> and decrypt Microsoft® Windows® instance passwords.</li> |
387 | 728 | <?php endif; ?> |
— | — | @@ -393,6 +734,14 @@ |
394 | 735 | <li>You're running on a <strong>32-bit</strong> system. This means that PHP does not correctly handle files larger than 2GB (this is a <a href="http://www.google.com/search?q=php+2gb+32-bit">well-known PHP issue</a>). For more information, please see: <a href="http://docs.php.net/manual/en/function.filesize.php#refsect1-function.filesize-returnvalues">PHP filesize: Return values</a>.</li> |
395 | 736 | <?php endif; ?> |
396 | 737 | |
| 738 | + <?php if ($ini_open_basedir || $ini_safe_mode): ?> |
| 739 | + <li>You have <a href="http://php.net/open_basedir">open_basedir</a> or <a href="http://php.net/safe_mode">safe_mode</a> enabled in your <code>php.ini</code> file. Sometimes PHP behaves strangely when these settings are enabled. Disable them if you can.</li> |
| 740 | + <?php endif; ?> |
| 741 | + |
| 742 | + <?php if (!$ini_zend_enable_gc): ?> |
| 743 | + <li>The PHP garbage collector (available in PHP 5.3+) is not enabled in your <code>php.ini</code> file. Enabling <a href="http://php.net/zend.enable_gc">zend.enable_gc</a> will provide better memory management in the PHP core.</li> |
| 744 | + <?php endif; ?> |
| 745 | + |
397 | 746 | <?php |
398 | 747 | $storage_types = array(); |
399 | 748 | if ($file_ok) { $storage_types[] = '<a href="http://php.net/file_put_contents">The file system</a>'; } |
— | — | @@ -454,5 +803,13 @@ |
455 | 804 | |
456 | 805 | </div> |
457 | 806 | |
| 807 | +<script type="text/javascript" charset="utf-8"> |
| 808 | +reqwest('<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?ssl_check', function(resp) { |
| 809 | + $sslCheck = document.getElementById('ssl_check'); |
| 810 | + $sslCheck.innerHTML = ''; |
| 811 | + $sslCheck.innerHTML = '<code>' + resp + '</code>'; |
| 812 | +}); |
| 813 | +</script> |
| 814 | + |
458 | 815 | </body> |
459 | 816 | </html> |
\ No newline at end of file |
Index: trunk/extensions/OpenStackManager/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php |
— | — | @@ -17,7 +17,6 @@ |
18 | 18 | // Optional, but recommended |
19 | 19 | $openssl_ok = (extension_loaded('openssl') && function_exists('openssl_sign')); |
20 | 20 | $zlib_ok = extension_loaded('zlib'); |
21 | | -$int64_ok = (PHP_INT_MAX === 9223372036854775807); |
22 | 21 | |
23 | 22 | // Optional |
24 | 23 | $apc_ok = extension_loaded('apc'); |
— | — | @@ -31,11 +30,38 @@ |
32 | 31 | $sqlite3_ok = extension_loaded('sqlite3'); |
33 | 32 | $sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok)); |
34 | 33 | |
| 34 | +// Other |
| 35 | +$int64_ok = (PHP_INT_MAX === 9223372036854775807); |
| 36 | +$ini_memory_limit = get_cfg_var('memory_limit'); |
| 37 | +$ini_open_basedir = get_cfg_ini('open_basedir'); |
| 38 | +$ini_safe_mode = get_cfg_ini('safe_mode'); |
| 39 | +$ini_zend_enable_gc = get_cfg_ini('zend.enable_gc'); |
| 40 | + |
| 41 | +function get_cfg_ini($config) |
| 42 | +{ |
| 43 | + $cfg_value = get_cfg_var($config); |
| 44 | + |
| 45 | + if ($cfg_value === false || $cfg_value === '' || $cfg_value === 0) |
| 46 | + { |
| 47 | + return false; |
| 48 | + } |
| 49 | + elseif ($cfg_value === true || $cfg_value === '1' || $cfg_value === 1) |
| 50 | + { |
| 51 | + return true; |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +// CLI display |
35 | 56 | function success($s = 'Yes') |
36 | 57 | { |
37 | 58 | return "\033[1;37m\033[42m " . $s . " \033[0m"; |
38 | 59 | } |
39 | 60 | |
| 61 | +function info($s = 'Info') |
| 62 | +{ |
| 63 | + return "\033[1;37m\033[44m " . $s . " \033[0m"; |
| 64 | +} |
| 65 | + |
40 | 66 | function failure($s = 'No ') |
41 | 67 | { |
42 | 68 | return "\033[1;37m\033[41m " . $s . " \033[0m"; |
— | — | @@ -45,29 +71,53 @@ |
46 | 72 | |
47 | 73 | echo PHP_EOL; |
48 | 74 | |
49 | | -echo 'AWS SDK for PHP' . PHP_EOL; |
| 75 | +echo info('AWS SDK for PHP') . PHP_EOL; |
50 | 76 | echo 'PHP Environment Compatibility Test (CLI)' . PHP_EOL; |
51 | 77 | echo '----------------------------------------' . PHP_EOL; |
52 | 78 | echo PHP_EOL; |
53 | 79 | |
54 | | -echo 'PHP 5.2 or newer... ' . ($php_ok ? (success() . ' ' . phpversion()) : failure()) . PHP_EOL; |
55 | | -echo 'Architecture... ' . ($int64_ok ? success('64-bit') : failure('32-bit')) . PHP_EOL; |
56 | | -echo 'cURL with SSL... ' . ($curl_ok ? (success() . ' ' . $curl_version['version'] . ' (' . $curl_version['ssl_version'] . ')') : failure($curl_version['version'] . (in_array('https', $curl_version['protocols'], true) ? ' (with ' . $curl_version['ssl_version'] . ')' : ' (without SSL)'))) . PHP_EOL; |
57 | | -echo 'Standard PHP Library... ' . ($spl_ok ? success() : failure()) . PHP_EOL; |
58 | | -echo 'SimpleXML... ' . ($simplexml_ok ? success() : failure()) . PHP_EOL; |
59 | | -echo 'JSON... ' . ($json_ok ? success() : failure()) . PHP_EOL; |
60 | | -echo 'PCRE... ' . ($pcre_ok ? success() : failure()) . PHP_EOL; |
61 | | -echo 'File system read/write... ' . ($file_ok ? success() : failure()) . PHP_EOL; |
62 | | -echo 'OpenSSL extension... ' . ($openssl_ok ? success() : failure()) . PHP_EOL; |
63 | | -echo 'Zlib... ' . ($zlib_ok ? success() : failure()) . PHP_EOL; |
64 | | -echo 'APC... ' . ($apc_ok ? success() : failure()) . PHP_EOL; |
65 | | -echo 'XCache... ' . ($xcache_ok ? success() : failure()) . PHP_EOL; |
66 | | -echo 'Memcache... ' . ($memcache_ok ? success() : failure()) . PHP_EOL; |
67 | | -echo 'Memcached... ' . ($memcached_ok ? success() : failure()) . PHP_EOL; |
68 | | -echo 'PDO... ' . ($pdo_ok ? success() : failure()) . PHP_EOL; |
69 | | -echo 'SQLite 2... ' . ($sqlite2_ok ? success() : failure()) . PHP_EOL; |
70 | | -echo 'SQLite 3... ' . ($sqlite3_ok ? success() : failure()) . PHP_EOL; |
71 | | -echo 'PDO-SQLite driver... ' . ($pdo_sqlite_ok ? success() : failure()) . PHP_EOL; |
| 80 | +echo 'PHP 5.2 or newer... ' . ($php_ok ? (success() . ' ' . phpversion()) : failure()) . PHP_EOL; |
| 81 | +echo '64-bit architecture... ' . ($int64_ok ? success() : failure()) . PHP_EOL; |
| 82 | +echo 'cURL with SSL... ' . ($curl_ok ? (success() . ' ' . $curl_version['version'] . ' (' . $curl_version['ssl_version'] . ')') : failure($curl_version['version'] . (in_array('https', $curl_version['protocols'], true) ? ' (with ' . $curl_version['ssl_version'] . ')' : ' (without SSL)'))) . PHP_EOL; |
| 83 | +echo 'Standard PHP Library... ' . ($spl_ok ? success() : failure()) . PHP_EOL; |
| 84 | +echo 'SimpleXML... ' . ($simplexml_ok ? success() : failure()) . PHP_EOL; |
| 85 | +echo 'JSON... ' . ($json_ok ? success() : failure()) . PHP_EOL; |
| 86 | +echo 'PCRE... ' . ($pcre_ok ? success() : failure()) . PHP_EOL; |
| 87 | +echo 'File system read/write... ' . ($file_ok ? success() : failure()) . PHP_EOL; |
| 88 | +echo 'OpenSSL extension... ' . ($openssl_ok ? success() : failure()) . PHP_EOL; |
| 89 | +echo 'Zlib... ' . ($zlib_ok ? success() : failure()) . PHP_EOL; |
| 90 | +echo 'APC... ' . ($apc_ok ? success() : failure()) . PHP_EOL; |
| 91 | +echo 'XCache... ' . ($xcache_ok ? success() : failure()) . PHP_EOL; |
| 92 | +echo 'Memcache... ' . ($memcache_ok ? success() : failure()) . PHP_EOL; |
| 93 | +echo 'Memcached... ' . ($memcached_ok ? success() : failure()) . PHP_EOL; |
| 94 | +echo 'PDO... ' . ($pdo_ok ? success() : failure()) . PHP_EOL; |
| 95 | +echo 'SQLite 2... ' . ($sqlite2_ok ? success() : failure()) . PHP_EOL; |
| 96 | +echo 'SQLite 3... ' . ($sqlite3_ok ? success() : failure()) . PHP_EOL; |
| 97 | +echo 'PDO-SQLite driver... ' . ($pdo_sqlite_ok ? success() : failure()) . PHP_EOL; |
| 98 | +echo 'open_basedir disabled... ' . (!$ini_open_basedir ? success() : failure()) . PHP_EOL; |
| 99 | +echo 'safe_mode disabled... ' . (!$ini_safe_mode ? success() : failure()) . PHP_EOL; |
| 100 | +echo 'Garbage Collector enabled... ' . ($ini_zend_enable_gc ? success() : failure()) . PHP_EOL; |
| 101 | + |
| 102 | +// Test SSL cert |
| 103 | +$ch = curl_init(); |
| 104 | +curl_setopt($ch, CURLOPT_URL, 'https://email.us-east-1.amazonaws.com'); |
| 105 | +curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); |
| 106 | +curl_setopt($ch, CURLOPT_HEADER, false); |
| 107 | +curl_setopt($ch, CURLOPT_NOBODY, true); |
| 108 | +curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); |
| 109 | +curl_setopt($ch, CURLOPT_TIMEOUT, 5184000); |
| 110 | +curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); |
| 111 | +curl_setopt($ch, CURLOPT_NOSIGNAL, true); |
| 112 | +curl_setopt($ch, CURLOPT_USERAGENT, 'AWS SDK for PHP Compatibility Test'); |
| 113 | +curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); |
| 114 | +curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); |
| 115 | +curl_setopt($ch, CURLOPT_VERBOSE, false); |
| 116 | +curl_exec($ch); |
| 117 | +$ssl_result = (curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT) === 0) ? 'false' : 'true'; |
| 118 | +curl_close($ch); |
| 119 | + |
| 120 | +echo 'Valid SSL certificate... ' . ($ssl_result ? success() : failure()) . PHP_EOL; |
| 121 | + |
72 | 122 | echo PHP_EOL; |
73 | 123 | |
74 | 124 | echo '----------------------------------------' . PHP_EOL; |
— | — | @@ -75,11 +125,14 @@ |
76 | 126 | |
77 | 127 | if ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok) |
78 | 128 | { |
| 129 | + echo success('Your environment meets the minimum requirements for using the AWS SDK for PHP!') . PHP_EOL . PHP_EOL; |
| 130 | + if (version_compare(PHP_VERSION, '5.3.0') < 0) { echo '* You\'re still running PHP ' . PHP_VERSION . '. The PHP 5.2 family is no longer supported' . PHP_EOL . ' by the PHP team, and future versions of the AWS SDK for PHP will *require*' . PHP_EOL . ' PHP 5.3 or newer.' . PHP_EOL . PHP_EOL; } |
| 131 | + if ($openssl_ok) { echo '* The OpenSSL extension is installed. This will allow you to use CloudFront' . PHP_EOL . ' Private URLs and decrypt Windows instance passwords.' . PHP_EOL . PHP_EOL; } |
| 132 | + if ($zlib_ok) { echo '* The Zlib extension is installed. The SDK will automatically leverage the' . PHP_EOL . ' compression capabilities of Zlib.' . PHP_EOL . PHP_EOL; } |
| 133 | + if (!$int64_ok) { echo '* You\'re running on a 32-bit system. This means that PHP does not correctly' . PHP_EOL . ' handle files larger than 2GB (this is a well-known PHP issue).' . PHP_EOL . PHP_EOL; } |
79 | 134 | |
80 | | - echo 'Your environment meets the minimum requirements for using the AWS SDK for PHP!' . PHP_EOL . PHP_EOL; |
81 | | - if ($openssl_ok) { echo '* The OpenSSL extension is installed. This will allow you to use CloudFront Private URLs and decrypt Windows instance passwords.' . PHP_EOL . PHP_EOL; } |
82 | | - if ($zlib_ok) { echo '* The Zlib extension is installed. The SDK will automatically leverage the compression capabilities of Zlib.' . PHP_EOL . PHP_EOL; } |
83 | | - if (!$int64_ok) { echo '* You\'re running on a 32-bit system. This means that PHP does not correctly handle files larger than 2GB (this is a well-known PHP issue).' . PHP_EOL . PHP_EOL; } |
| 135 | + if ($ini_open_basedir || $ini_safe_mode) { echo '* You have open_basedir or safe_mode enabled in your php.ini file. Sometimes' . PHP_EOL . ' PHP behaves strangely when these settings are enabled. Disable them if you can.' . PHP_EOL . PHP_EOL; } |
| 136 | + if (!$ini_zend_enable_gc) { echo '* The PHP garbage collector (available in PHP 5.3+) is not enabled in your' . PHP_EOL . ' php.ini file. Enabling zend.enable_gc will provide better memory management' . PHP_EOL . ' in the PHP core.' . PHP_EOL . PHP_EOL; } |
84 | 137 | |
85 | 138 | $storage_types = array(); |
86 | 139 | if ($file_ok) { $storage_types[] = 'The file system'; } |
— | — | @@ -89,20 +142,20 @@ |
90 | 143 | elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = 'SQLite 2'; } |
91 | 144 | if ($memcached_ok) { $storage_types[] = 'Memcached'; } |
92 | 145 | elseif ($memcache_ok) { $storage_types[] = 'Memcache'; } |
93 | | - echo '* Storage types available for response caching: ' . implode(', ', $storage_types) . PHP_EOL . PHP_EOL; |
| 146 | + echo '* Storage types available for response caching:' . PHP_EOL . ' ' . implode(', ', $storage_types) . PHP_EOL . PHP_EOL; |
94 | 147 | |
95 | | - if (!$openssl_ok) { echo '* You\'re missing the OpenSSL extension, which means that you won\'t be able to take advantage of CloudFront Private URLs or Windows password decryption.' . PHP_EOL . PHP_EOL; } |
96 | | - if (!$zlib_ok) { echo '* You\'re missing the Zlib extension, which means that responses from Amazon\'s services will take a little longer to download and you won\'t be able to take advantage of compression with the response caching feature.' . PHP_EOL . PHP_EOL; } |
| 148 | + if (!$openssl_ok) { echo '* You\'re missing the OpenSSL extension, which means that you won\'t be able' . PHP_EOL . ' to take advantage of CloudFront Private URLs or Windows password decryption.' . PHP_EOL . PHP_EOL; } |
| 149 | + if (!$zlib_ok) { echo '* You\'re missing the Zlib extension, which means that responses from Amazon\'s' . PHP_EOL . ' services will take a little longer to download and you won\'t be able to take' . PHP_EOL . ' advantage of compression with the response caching feature.' . PHP_EOL; } |
97 | 150 | } |
98 | 151 | else |
99 | 152 | { |
100 | | - if (!$php_ok) { echo '* PHP: You are running an unsupported version of PHP.' . PHP_EOL . PHP_EOL; } |
101 | | - if (!$curl_ok) { echo '* cURL: The cURL extension is not available. Without cURL, the SDK cannot connect to -- or authenticate with -- Amazon\'s services.' . PHP_EOL . PHP_EOL; } |
102 | | - if (!$simplexml_ok) { echo '* SimpleXML: The SimpleXML extension is not available. Without SimpleXML, the SDK cannot parse the XML responses from Amazon\'s services.' . PHP_EOL . PHP_EOL; } |
103 | | - if (!$spl_ok) { echo '* SPL: Standard PHP Library support is not available. Without SPL support, the SDK cannot autoload the required PHP classes.' . PHP_EOL . PHP_EOL; } |
104 | | - if (!$json_ok) { echo '* JSON: JSON support is not available. AWS leverages JSON heavily in many of its services.' . PHP_EOL . PHP_EOL; } |
105 | | - if (!$pcre_ok) { echo '* PCRE: Your PHP installation doesn\'t support Perl-Compatible Regular Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via regular expressions.' . PHP_EOL . PHP_EOL; } |
106 | | - if (!$file_ok) { echo '* File System Read/Write: The file_get_contents() and/or file_put_contents() functions have been disabled. Without them, the SDK cannot read from, or write to, the file system.' . PHP_EOL . PHP_EOL; } |
| 153 | + if (!$php_ok) { echo '* ' . failure('PHP:') . ' You are running an unsupported version of PHP.' . PHP_EOL; } |
| 154 | + if (!$curl_ok) { echo '* ' . failure('cURL:') . ' The cURL extension is not available. Without cURL, the SDK cannot' . PHP_EOL . ' connect to -- or authenticate with -- Amazon\'s services.' . PHP_EOL; } |
| 155 | + if (!$simplexml_ok) { echo '* ' . failure('SimpleXML:') . ': The SimpleXML extension is not available. Without SimpleXML,' . PHP_EOL . ' the SDK cannot parse the XML responses from Amazon\'s services.' . PHP_EOL; } |
| 156 | + if (!$spl_ok) { echo '* ' . failure('SPL:') . ' Standard PHP Library support is not available. Without SPL support,' . PHP_EOL . ' the SDK cannot autoload the required PHP classes.' . PHP_EOL; } |
| 157 | + if (!$json_ok) { echo '* ' . failure('JSON:') . ' JSON support is not available. AWS leverages JSON heavily in many' . PHP_EOL . ' of its services.' . PHP_EOL; } |
| 158 | + if (!$pcre_ok) { echo '* ' . failure('PCRE:') . ' Your PHP installation doesn\'t support Perl-Compatible Regular' . PHP_EOL . ' Expressions (PCRE). Without PCRE, the SDK cannot do any filtering via' . PHP_EOL . ' regular expressions.' . PHP_EOL; } |
| 159 | + if (!$file_ok) { echo '* ' . failure('File System Read/Write:') . ' The file_get_contents() and/or file_put_contents()' . PHP_EOL . ' functions have been disabled. Without them, the SDK cannot read from,' . PHP_EOL . ' or write to, the file system.' . PHP_EOL; } |
107 | 160 | } |
108 | 161 | |
109 | 162 | echo '----------------------------------------' . PHP_EOL; |
— | — | @@ -110,17 +163,47 @@ |
111 | 164 | |
112 | 165 | if ($php_ok && $int64_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok && $openssl_ok && $zlib_ok && ($apc_ok || $xcache_ok || $mc_ok || $sqlite_ok)) |
113 | 166 | { |
114 | | - echo 'Bottom Line: Yes, you can!' . PHP_EOL; |
| 167 | + echo success('Bottom Line: Yes, you can!') . PHP_EOL; |
| 168 | + echo PHP_EOL; |
115 | 169 | echo 'Your PHP environment is ready to go, and can take advantage of all possible features!' . PHP_EOL; |
| 170 | + |
| 171 | + echo PHP_EOL; |
| 172 | + echo info('Recommended settings for config.inc.php') . PHP_EOL; |
| 173 | + echo PHP_EOL; |
| 174 | + |
| 175 | + echo 'define(\'AWS_DEFAULT_CACHE_CONFIG\', '; |
| 176 | + if ($apc_ok) echo '\'apc\''; |
| 177 | + elseif ($xcache_ok) echo '\'xcache\''; |
| 178 | + elseif ($file_ok) echo '\'/path/to/cache/folder\''; |
| 179 | + echo ');' . PHP_EOL; |
| 180 | + |
| 181 | + echo 'define(\'AWS_CERTIFICATE_AUTHORITY\', '; |
| 182 | + echo $ssl_result; |
| 183 | + echo ');' . PHP_EOL; |
116 | 184 | } |
117 | 185 | elseif ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok) |
118 | 186 | { |
119 | | - echo 'Bottom Line: Yes, you can!' . PHP_EOL; |
| 187 | + echo success('Bottom Line: Yes, you can!') . PHP_EOL; |
| 188 | + echo PHP_EOL; |
120 | 189 | echo 'Your PHP environment is ready to go! There are a couple of minor features that you won\'t be able to take advantage of, but nothing that\'s a show-stopper.' . PHP_EOL; |
| 190 | + |
| 191 | + echo PHP_EOL; |
| 192 | + echo info('Recommended settings for config.inc.php') . PHP_EOL; |
| 193 | + echo PHP_EOL; |
| 194 | + |
| 195 | + echo 'define(\'AWS_DEFAULT_CACHE_CONFIG\', '; |
| 196 | + if ($apc_ok) echo '\'apc\''; |
| 197 | + elseif ($xcache_ok) echo '\'xcache\''; |
| 198 | + elseif ($file_ok) echo '\'/path/to/cache/folder\''; |
| 199 | + echo ');' . PHP_EOL; |
| 200 | + |
| 201 | + echo 'define(\'AWS_CERTIFICATE_AUTHORITY\', '; |
| 202 | + echo $ssl_result; |
| 203 | + echo ');' . PHP_EOL; |
121 | 204 | } |
122 | 205 | else |
123 | 206 | { |
124 | | - echo 'Bottom Line: We\'re sorry...' . PHP_EOL; |
| 207 | + echo failure('Bottom Line: We\'re sorry...') . PHP_EOL; |
125 | 208 | echo 'Your PHP environment does not support the minimum requirements for the AWS SDK for PHP.' . PHP_EOL; |
126 | 209 | } |
127 | 210 | |
Index: trunk/extensions/OpenStackManager/aws-sdk/_docs/NOTICE.md |
— | — | @@ -165,6 +165,33 @@ |
166 | 166 | <http://opensource.org/licenses/bsd-license.php> |
167 | 167 | |
168 | 168 | |
| 169 | +## Reqwest |
| 170 | + |
| 171 | +<https://github.com/ded/reqwest> |
| 172 | + |
| 173 | +* Copyright 2011 [Dustin Diaz](http://dustindiaz.com) |
| 174 | + |
| 175 | +Permission is hereby granted, free of charge, to any person obtaining a copy |
| 176 | +of this software and associated documentation files (the "Software"), to deal |
| 177 | +in the Software without restriction, including without limitation the rights |
| 178 | +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 179 | +copies of the Software, and to permit persons to whom the Software is |
| 180 | +furnished to do so, subject to the following conditions: |
| 181 | + |
| 182 | +The above copyright notice and this permission notice shall be included in |
| 183 | +all copies or substantial portions of the Software. |
| 184 | + |
| 185 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 186 | +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 187 | +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 188 | +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 189 | +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 190 | +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 191 | +THE SOFTWARE. |
| 192 | + |
| 193 | +<http://www.opensource.org/licenses/mit-license.php> |
| 194 | + |
| 195 | + |
169 | 196 | ## Human readable file sizes |
170 | 197 | |
171 | 198 | <http://aidanlister.com/2004/04/human-readable-file-sizes/> |
Index: trunk/extensions/OpenStackManager/aws-sdk/_docs/CHANGELOG.md |
— | — | @@ -1,14 +1,49 @@ |
| 2 | +# Changelog: 1.4 "Rikku" |
| 3 | +<http://finalfantasy.wikia.com/wiki/Rikku> |
| 4 | + |
| 5 | +Launched Wednesday, August 3, 2011 |
| 6 | + |
| 7 | +## Bug fixes and enhancements |
| 8 | + |
| 9 | +## Service Classes |
| 10 | +### AmazonEC2 |
| 11 | +* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. |
| 12 | + |
| 13 | +### AmazonS3 |
| 14 | +* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. |
| 15 | + |
| 16 | +### AmazonSNS |
| 17 | +* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. |
| 18 | + |
| 19 | +### AmazonSQS |
| 20 | +* **New:** Support for Session-Based Authentication (SBA) leveraging Amazon Secure Token Service (STS) has been added to the SDK. |
| 21 | + |
| 22 | +### AmazonSTS |
| 23 | +* **New:** Support for the Amazon Secure Token Service (STS) has been added to the SDK. |
| 24 | + |
| 25 | +## Utility Classes |
| 26 | +### CFRuntime |
| 27 | +* **New:** The following anonymous datapoints are now collected in aggregate so that we can make more informed decisions about future SDK features: `memory_limit`, `date.timezone`, `open_basedir`, `safe_mode`, `zend.enable_gc`. |
| 28 | + |
| 29 | +## Compatibility Test |
| 30 | +* **New:** Support for verifying the installed SSL certificate has been added to the compatibility test. |
| 31 | +* **New:** Support for verifying the status of `open_basedir` and `safe_mode` has been added to the compatibility test. |
| 32 | +* **New:** Support for verifying the status of the PHP 5.3 garbage collector has been added to the compatibility test. |
| 33 | +* **New:** The compatibility test now recommends optimal values for the `AWS_CERTIFICATE_AUTHORITY` and `AWS_DEFAULT_CACHE_CONFIG` configuration options based on the system's configuration. |
| 34 | + |
| 35 | + |
| 36 | +---- |
| 37 | + |
2 | 38 | # Changelog: 1.3.7 "Quistis" |
3 | 39 | <http://finalfantasy.wikia.com/wiki/Quistis_Trepe> |
4 | 40 | |
5 | | -Launched Wednesday, July 25, 2011 |
| 41 | +Launched Monday, July 25, 2011 |
6 | 42 | |
7 | 43 | ## Bug fixes and enhancements |
8 | 44 | * Addressed minor bug fixes reported via the feedback form in the API Reference. |
9 | 45 | |
10 | 46 | ## Service Classes |
11 | 47 | ### AmazonAS |
12 | | -* **New:** |
13 | 48 | * **Changed:** Introduced backwards-incompatible changes to the <code>put_scheduled_update_group_action()</code> method. |
14 | 49 | |
15 | 50 | |
Index: trunk/extensions/OpenStackManager/aws-sdk/sdk.class.php |
— | — | @@ -94,6 +94,29 @@ |
95 | 95 | } |
96 | 96 | } |
97 | 97 | |
| 98 | + foreach (array('memory_limit', 'date.timezone', 'open_basedir', 'safe_mode', 'zend.enable_gc') as $cfg) |
| 99 | + { |
| 100 | + $cfg_value = get_cfg_var($cfg); |
| 101 | + |
| 102 | + if (in_array($cfg, array('memory_limit', 'date.timezone'), true)) |
| 103 | + { |
| 104 | + $ua_append .= ' ' . $cfg . '/' . str_replace('/', '.', $cfg_value); |
| 105 | + } |
| 106 | + elseif (in_array($cfg, array('open_basedir', 'safe_mode', 'zend.enable_gc'), true)) |
| 107 | + { |
| 108 | + if ($cfg_value === false || $cfg_value === '' || $cfg_value === 0) |
| 109 | + { |
| 110 | + $cfg_value = 'off'; |
| 111 | + } |
| 112 | + elseif ($cfg_value === true || $cfg_value === '1' || $cfg_value === 1) |
| 113 | + { |
| 114 | + $cfg_value = 'on'; |
| 115 | + } |
| 116 | + |
| 117 | + $ua_append .= ' ' . $cfg . '/' . $cfg_value; |
| 118 | + } |
| 119 | + } |
| 120 | + |
98 | 121 | return $ua_append; |
99 | 122 | } |
100 | 123 | |
— | — | @@ -102,10 +125,10 @@ |
103 | 126 | // INTERMEDIARY CONSTANTS |
104 | 127 | |
105 | 128 | define('CFRUNTIME_NAME', 'aws-sdk-php'); |
106 | | -define('CFRUNTIME_VERSION', '1.3.7'); |
| 129 | +define('CFRUNTIME_VERSION', '1.4'); |
107 | 130 | // define('CFRUNTIME_BUILD', gmdate('YmdHis', filemtime(__FILE__))); // @todo: Hardcode for release. |
108 | | -define('CFRUNTIME_BUILD', '20110725055831'); |
109 | | -define('CFRUNTIME_USERAGENT', CFRUNTIME_NAME . '/' . CFRUNTIME_VERSION . ' PHP/' . PHP_VERSION . ' ' . php_uname('s') . '/' . php_uname('r') . ' Arch/' . php_uname('m') . ' SAPI/' . php_sapi_name() . ' Integer/' . PHP_INT_MAX . ' Build/' . CFRUNTIME_BUILD . __aws_sdk_ua_callback()); |
| 131 | +define('CFRUNTIME_BUILD', '20110803172558'); |
| 132 | +define('CFRUNTIME_USERAGENT', CFRUNTIME_NAME . '/' . CFRUNTIME_VERSION . ' PHP/' . PHP_VERSION . ' ' . str_replace(' ', '_', php_uname('s')) . '/' . str_replace(' ', '_', php_uname('r')) . ' Arch/' . php_uname('m') . ' SAPI/' . php_sapi_name() . ' Integer/' . PHP_INT_MAX . ' Build/' . CFRUNTIME_BUILD . __aws_sdk_ua_callback()); |
110 | 133 | |
111 | 134 | |
112 | 135 | /*%******************************************************************************************%*/ |
— | — | @@ -115,7 +138,7 @@ |
116 | 139 | * Core functionality and default settings shared across all SDK classes. All methods and properties in this |
117 | 140 | * class are inherited by the service-specific classes. |
118 | 141 | * |
119 | | - * @version 2011.07.12 |
| 142 | + * @version 2011.07.28 |
120 | 143 | * @license See the included NOTICE.md file for more information. |
121 | 144 | * @copyright See the included NOTICE.md file for more information. |
122 | 145 | * @link http://aws.amazon.com/php/ PHP Developer Center |
— | — | @@ -337,13 +360,12 @@ |
338 | 361 | * The constructor. You would not normally instantiate this class directly. Rather, you would instantiate |
339 | 362 | * a service-specific class. |
340 | 363 | * |
341 | | - * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant. |
342 | | - * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant. |
343 | | - * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant. |
344 | | - * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for PAS. If blank, it will look for the <AWS_ASSOC_ID> constant. |
| 364 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 365 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 366 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
345 | 367 | * @return boolean A value of `false` if no valid values are set, otherwise `true`. |
346 | 368 | */ |
347 | | - public function __construct($key = null, $secret_key = null, $account_id = null, $assoc_id = null) |
| 369 | + public function __construct($key = null, $secret_key = null, $token = null) |
348 | 370 | { |
349 | 371 | // Instantiate the utilities class. |
350 | 372 | $this->util = new $this->utilities_class(); |
— | — | @@ -354,29 +376,7 @@ |
355 | 377 | // Set default values |
356 | 378 | $this->key = null; |
357 | 379 | $this->secret_key = null; |
358 | | - $this->account_id = null; |
359 | | - $this->assoc_id = null; |
360 | 380 | |
361 | | - // Set the Account ID |
362 | | - if ($account_id) |
363 | | - { |
364 | | - $this->account_id = $account_id; |
365 | | - } |
366 | | - elseif (defined('AWS_ACCOUNT_ID')) |
367 | | - { |
368 | | - $this->account_id = AWS_ACCOUNT_ID; |
369 | | - } |
370 | | - |
371 | | - // Set the Associates ID |
372 | | - if ($assoc_id) |
373 | | - { |
374 | | - $this->assoc_id = $assoc_id; |
375 | | - } |
376 | | - elseif (defined('AWS_ASSOC_ID')) |
377 | | - { |
378 | | - $this->assoc_id = AWS_ASSOC_ID; |
379 | | - } |
380 | | - |
381 | 381 | // If both a key and secret key are passed in, use those. |
382 | 382 | if ($key && $secret_key) |
383 | 383 | { |
— | — | @@ -400,15 +400,117 @@ |
401 | 401 | } |
402 | 402 | |
403 | 403 | /** |
| 404 | + * Handle session-based authentication for services that support it. |
| 405 | + * |
| 406 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 407 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 408 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
| 409 | + * @return boolean A value of `false` if no valid values are set, otherwise `true`. |
| 410 | + */ |
| 411 | + public function session_based_auth($key = null, $secret_key = null, $token = null) |
| 412 | + { |
| 413 | + // Instantiate the utilities class. |
| 414 | + $this->util = new $this->utilities_class(); |
| 415 | + |
| 416 | + // Use 'em if we've got 'em |
| 417 | + if ($key && $secret_key && $token) |
| 418 | + { |
| 419 | + $this->__construct($key, $secret_key); |
| 420 | + $this->auth_token = $token; |
| 421 | + return true; |
| 422 | + } |
| 423 | + else |
| 424 | + { |
| 425 | + if (!$key && !defined('AWS_KEY')) |
| 426 | + { |
| 427 | + // @codeCoverageIgnoreStart |
| 428 | + throw new CFRuntime_Exception('No account key was passed into the constructor, nor was it set in the AWS_KEY constant.'); |
| 429 | + // @codeCoverageIgnoreEnd |
| 430 | + } |
| 431 | + |
| 432 | + if (!$secret_key && !defined('AWS_SECRET_KEY')) |
| 433 | + { |
| 434 | + // @codeCoverageIgnoreStart |
| 435 | + throw new CFRuntime_Exception('No account secret was passed into the constructor, nor was it set in the AWS_SECRET_KEY constant.'); |
| 436 | + // @codeCoverageIgnoreEnd |
| 437 | + } |
| 438 | + |
| 439 | + // If both a key and secret key are passed in, use those. |
| 440 | + if ($key && $secret_key) |
| 441 | + { |
| 442 | + $this->key = $key; |
| 443 | + $this->secret_key = $secret_key; |
| 444 | + } |
| 445 | + // If neither are passed in, look for the constants instead. |
| 446 | + elseif (defined('AWS_KEY') && defined('AWS_SECRET_KEY')) |
| 447 | + { |
| 448 | + $this->key = AWS_KEY; |
| 449 | + $this->secret_key = AWS_SECRET_KEY; |
| 450 | + } |
| 451 | + |
| 452 | + // Determine storage type. |
| 453 | + $this->set_cache_config(AWS_DEFAULT_CACHE_CONFIG); |
| 454 | + $cache_class = $this->cache_class; |
| 455 | + $cache_object = new $cache_class('aws_active_session_credentials_' . get_class($this) . '_' . $this->key, AWS_DEFAULT_CACHE_CONFIG, 3600); // AWS_DEFAULT_CACHE_CONFIG only matters if it's a file system path. |
| 456 | + |
| 457 | + // Fetch session credentials |
| 458 | + $session_credentials = $cache_object->response_manager(array($this, 'cache_token'), array($this->key, $this->secret_key)); |
| 459 | + $this->auth_token = $session_credentials['SessionToken']; |
| 460 | + |
| 461 | + // If both a key and secret key are passed in, use those. |
| 462 | + if ($session_credentials['AccessKeyId'] && $session_credentials['SecretAccessKey']) |
| 463 | + { |
| 464 | + $this->key = $session_credentials['AccessKeyId']; |
| 465 | + $this->secret_key = $session_credentials['SecretAccessKey']; |
| 466 | + return true; |
| 467 | + } |
| 468 | + // If neither are passed in, look for the constants instead. |
| 469 | + elseif (defined('AWS_KEY') && defined('AWS_SECRET_KEY')) |
| 470 | + { |
| 471 | + $this->key = AWS_KEY; |
| 472 | + $this->secret_key = AWS_SECRET_KEY; |
| 473 | + return true; |
| 474 | + } |
| 475 | + |
| 476 | + // Otherwise set the values to blank and return false. |
| 477 | + else |
| 478 | + { |
| 479 | + throw new CFRuntime_Exception('No valid credentials were used to authenticate with AWS.'); |
| 480 | + } |
| 481 | + } |
| 482 | + } |
| 483 | + |
| 484 | + public function cache_token($key, $secret_key) |
| 485 | + { |
| 486 | + $token = new AmazonSTS($key, $secret_key); |
| 487 | + $response = $token->get_session_token(); |
| 488 | + |
| 489 | + if ($response->isOK()) |
| 490 | + { |
| 491 | + /* |
| 492 | + Array |
| 493 | + ( |
| 494 | + [AccessKeyId] => ****** |
| 495 | + [Expiration] => ****** |
| 496 | + [SecretAccessKey] => ****** |
| 497 | + [SessionToken] => ****** |
| 498 | + ) |
| 499 | + */ |
| 500 | + return $response->body->GetSessionTokenResult->Credentials->to_array()->getArrayCopy(); |
| 501 | + } |
| 502 | + |
| 503 | + return null; |
| 504 | + } |
| 505 | + |
| 506 | + /** |
404 | 507 | * Alternate approach to constructing a new instance. Supports chaining. |
405 | 508 | * |
406 | | - * @param string $key (Optional) Your Amazon API Key. If blank, it will look for the <AWS_KEY> constant. |
407 | | - * @param string $secret_key (Optional) Your Amazon API Secret Key. If blank, it will look for the <AWS_SECRET_KEY> constant. |
408 | | - * @param string $account_id (Optional) Your Amazon account ID without the hyphens. Required for EC2. If blank, it will look for the <AWS_ACCOUNT_ID> constant. |
409 | | - * @param string $assoc_id (Optional) Your Amazon Associates ID. Required for AAWS. If blank, it will look for the <AWS_ASSOC_ID> constant. |
| 509 | + * @param string $key (Optional) Your AWS key, or a session key. If blank, it will look for the <code>AWS_KEY</code> constant. |
| 510 | + * @param string $secret_key (Optional) Your AWS secret key, or a session secret key. If blank, it will look for the <code>AWS_SECRET_KEY</code> constant. |
| 511 | + * @param string $token (optional) An AWS session token. If blank, a request will be made to the AWS Secure Token Service to fetch a set of session credentials. |
410 | 512 | * @return boolean A value of `false` if no valid values are set, otherwise `true`. |
411 | 513 | */ |
412 | | - public static function init($key = null, $secret_key = null, $account_id = null, $assoc_id = null) |
| 514 | + public static function init($key = null, $secret_key = null, $token = null) |
413 | 515 | { |
414 | 516 | if (version_compare(PHP_VERSION, '5.3.0', '<')) |
415 | 517 | { |
— | — | @@ -416,7 +518,7 @@ |
417 | 519 | } |
418 | 520 | |
419 | 521 | $self = get_called_class(); |
420 | | - return new $self($key, $secret_key, $account_id, $assoc_id); |
| 522 | + return new $self($key, $secret_key, $token); |
421 | 523 | } |
422 | 524 | |
423 | 525 | |
— | — | @@ -820,6 +922,13 @@ |
821 | 923 | $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time); |
822 | 924 | $nonce = $this->util->generate_guid(); |
823 | 925 | |
| 926 | + // Do we have an authentication token? |
| 927 | + if ($this->auth_token) |
| 928 | + { |
| 929 | + $headers['X-Amz-Security-Token'] = $this->auth_token; |
| 930 | + $query['SecurityToken'] = $this->auth_token; |
| 931 | + } |
| 932 | + |
824 | 933 | // Manage the key-value pairs that are used in the query. |
825 | 934 | if (stripos($action, 'x-amz-target') !== false) |
826 | 935 | { |
— | — | @@ -931,12 +1040,6 @@ |
932 | 1041 | $request->set_body($querystring); |
933 | 1042 | $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'; |
934 | 1043 | |
935 | | - // Do we have an authentication token? |
936 | | - if ($this->auth_token) |
937 | | - { |
938 | | - $headers['X-Amz-Security-Token'] = $this->auth_token; |
939 | | - } |
940 | | - |
941 | 1044 | // Signing using X-Amz-Target is handled differently. |
942 | 1045 | if ($signature_version === 3 && $x_amz_target) |
943 | 1046 | { |