r94933 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r94932‎ | r94933 | r94934 >
Date:20:04, 18 August 2011
Author:reedy
Status:deferred
Tags:
Comment:
aws-sdk 1.3.7 to 1.4
Modified paths:
  • /trunk/extensions/OpenStackManager/aws-sdk/_compatibility_test/sdk_compatibility_test.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/_docs/CHANGELOG.md (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/_docs/NOTICE.md (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/sdk.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/as.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/cloudformation.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/cloudwatch.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/ec2.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/elasticbeanstalk.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/elb.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/iam.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/importexport.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/rds.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/s3.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/ses.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/sns.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/sqs.class.php (modified) (history)
  • /trunk/extensions/OpenStackManager/aws-sdk/services/sts.class.php (added) (history)

Diff [purge]

Index: trunk/extensions/OpenStackManager/aws-sdk/services/cloudformation.class.php
@@ -48,7 +48,7 @@
4949 * Amazon CloudFormation makes use of other AWS products. If you need additional technical information about a specific AWS product, you can
5050 * find the product's technical documentation at <a href="http://aws.amazon.com/documentation/">http://aws.amazon.com/documentation/</a>.
5151 *
52 - * @version Tue Jul 12 16:07:23 PDT 2011
 52+ * @version Wed Aug 03 10:08:29 PDT 2011
5353 * @license See the included NOTICE.md file for complete information.
5454 * @copyright See the included NOTICE.md file for complete information.
5555 * @link http://aws.amazon.com/cloudformation/Amazon CloudFormation
Index: trunk/extensions/OpenStackManager/aws-sdk/services/s3.class.php
@@ -245,13 +245,16 @@
246246 // CONSTRUCTOR
247247
248248 /**
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.
250252 *
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.
253256 * @return boolean A value of <code>false</code> if no valid values are set, otherwise <code>true</code>.
254257 */
255 - public function __construct($key = null, $secret_key = null)
 258+ public function __construct($key = null, $secret_key = null, $token = null)
256259 {
257260 $this->vhost = null;
258261 $this->api_version = '2006-03-01';
@@ -279,6 +282,11 @@
280283 // @codeCoverageIgnoreEnd
281284 }
282285
 286+ if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG)
 287+ {
 288+ return parent::session_based_auth($key, $secret_key, $token);
 289+ }
 290+
283291 return parent::__construct($key, $secret_key);
284292 }
285293
@@ -417,6 +425,12 @@
418426
419427 /*%******************************************************************************************%*/
420428
 429+ // Do we have an authentication token?
 430+ if ($this->auth_token)
 431+ {
 432+ $headers['X-Amz-Security-Token'] = $this->auth_token;
 433+ }
 434+
421435 // Handle specific resources
422436 if (isset($opt['resource']))
423437 {
Index: trunk/extensions/OpenStackManager/aws-sdk/services/rds.class.php
@@ -27,7 +27,7 @@
2828 * instance's compute resources and storage capacity to meet your application's demand. As with all Amazon Web Services, there are no up-front
2929 * investments, and you pay only for the resources you use.
3030 *
31 - * @version Tue Jul 12 16:11:48 PDT 2011
 31+ * @version Wed Aug 03 10:13:10 PDT 2011
3232 * @license See the included NOTICE.md file for complete information.
3333 * @copyright See the included NOTICE.md file for complete information.
3434 * @link http://aws.amazon.com/rds/Amazon Relational Database Service
Index: trunk/extensions/OpenStackManager/aws-sdk/services/ses.class.php
@@ -23,7 +23,7 @@
2424 * For specific details on how to construct a service request, please consult the <a
2525 * href="http://docs.amazonwebservices.com/ses/latest/DeveloperGuide">Amazon SES Developer Guide</a>.
2626 *
27 - * @version Tue Jul 12 16:09:53 PDT 2011
 27+ * @version Wed Aug 03 10:11:14 PDT 2011
2828 * @license See the included NOTICE.md file for complete information.
2929 * @copyright See the included NOTICE.md file for complete information.
3030 * @link http://aws.amazon.com/ses/Amazon Simple Email Service
Index: trunk/extensions/OpenStackManager/aws-sdk/services/cloudwatch.class.php
@@ -47,7 +47,7 @@
4848 *
4949 * </ul>
5050 *
51 - * @version Tue Jul 12 16:07:50 PDT 2011
 51+ * @version Wed Aug 03 10:09:00 PDT 2011
5252 * @license See the included NOTICE.md file for complete information.
5353 * @copyright See the included NOTICE.md file for complete information.
5454 * @link http://aws.amazon.com/cloudwatch/Amazon CloudWatch
Index: trunk/extensions/OpenStackManager/aws-sdk/services/elb.class.php
@@ -21,7 +21,7 @@
2222 * application. It makes it easy for you to distribute application loads between two or more EC2 instances. Elastic Load Balancing enables
2323 * availability through redundancy and supports traffic growth of your application.
2424 *
25 - * @version Tue Jul 12 16:09:27 PDT 2011
 25+ * @version Wed Aug 03 10:10:44 PDT 2011
2626 * @license See the included NOTICE.md file for complete information.
2727 * @copyright See the included NOTICE.md file for complete information.
2828 * @link http://aws.amazon.com/elasticloadbalancing/Amazon Elastic Load Balancing
Index: trunk/extensions/OpenStackManager/aws-sdk/services/as.class.php
@@ -38,7 +38,7 @@
3939 * href="http://docs.amazonwebservices.com/general/latest/gr/index.html?rande.html">Regions and Endpoints</a> in the Amazon Web Services
4040 * General Reference.
4141 *
42 - * @version Wed Jul 20 13:14:36 PDT 2011
 42+ * @version Wed Aug 03 10:07:42 PDT 2011
4343 * @license See the included NOTICE.md file for complete information.
4444 * @copyright See the included NOTICE.md file for complete information.
4545 * @link http://aws.amazon.com/autoscaling/Amazon Auto-Scaling
Index: trunk/extensions/OpenStackManager/aws-sdk/services/sns.class.php
@@ -17,7 +17,7 @@
1818 /**
1919
2020 *
21 - * @version Tue Jul 12 16:12:40 PDT 2011
 21+ * @version Wed Aug 03 10:14:08 PDT 2011
2222 * @license See the included NOTICE.md file for complete information.
2323 * @copyright See the included NOTICE.md file for complete information.
2424 * @link http://aws.amazon.com/sns/Amazon Simple Notification Service
@@ -109,13 +109,16 @@
110110 // CONSTRUCTOR
111111
112112 /**
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.
114116 *
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>.
118121 */
119 - public function __construct($key = null, $secret_key = null)
 122+ public function __construct($key = null, $secret_key = null, $token = null)
120123 {
121124 $this->api_version = '2010-03-31';
122125 $this->hostname = self::DEFAULT_URL;
@@ -134,6 +137,11 @@
135138 // @codeCoverageIgnoreEnd
136139 }
137140
 141+ if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG)
 142+ {
 143+ return parent::session_based_auth($key, $secret_key, $token);
 144+ }
 145+
138146 return parent::__construct($key, $secret_key);
139147 }
140148
Index: trunk/extensions/OpenStackManager/aws-sdk/services/iam.class.php
@@ -32,7 +32,7 @@
3333 *
3434 * We will refer to Amazon AWS Identity and Access Management using the abbreviated form IAM. All copyrights and legal protections still apply.
3535 *
36 - * @version Tue Jul 12 16:10:48 PDT 2011
 36+ * @version Wed Aug 03 10:12:08 PDT 2011
3737 * @license See the included NOTICE.md file for complete information.
3838 * @copyright See the included NOTICE.md file for complete information.
3939 * @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 @@
2929 *
3030 * Visit <a href="http://aws.amazon.com/sqs/">http://aws.amazon.com/sqs/</a> for more information.
3131 *
32 - * @version Wed Jul 20 13:21:47 PDT 2011
 32+ * @version Wed Aug 03 10:14:34 PDT 2011
3333 * @license See the included NOTICE.md file for complete information.
3434 * @copyright See the included NOTICE.md file for complete information.
3535 * @link http://aws.amazon.com/sqs/Amazon Simple Queue Service
@@ -155,13 +155,16 @@
156156 // CONSTRUCTOR
157157
158158 /**
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.
160162 *
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>.
164167 */
165 - public function __construct($key = null, $secret_key = null)
 168+ public function __construct($key = null, $secret_key = null, $token = null)
166169 {
167170 $this->api_version = '2009-02-01';
168171 $this->hostname = self::DEFAULT_URL;
@@ -180,6 +183,11 @@
181184 // @codeCoverageIgnoreEnd
182185 }
183186
 187+ if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG)
 188+ {
 189+ return parent::session_based_auth($key, $secret_key, $token);
 190+ }
 191+
184192 return parent::__construct($key, $secret_key);
185193 }
186194
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
1157 + native
Index: trunk/extensions/OpenStackManager/aws-sdk/services/ec2.class.php
@@ -27,7 +27,7 @@
2828 *
2929 * Visit <a href="http://aws.amazon.com/ec2/">http://aws.amazon.com/ec2/</a> for more information.
3030 *
31 - * @version Tue Jul 12 16:08:47 PDT 2011
 31+ * @version Wed Aug 03 10:10:05 PDT 2011
3232 * @license See the included NOTICE.md file for complete information.
3333 * @copyright See the included NOTICE.md file for complete information.
3434 * @link http://aws.amazon.com/ec2/Amazon Elastic Compute Cloud
@@ -120,13 +120,16 @@
121121 // CONSTRUCTOR
122122
123123 /**
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.
125127 *
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>.
129132 */
130 - public function __construct($key = null, $secret_key = null)
 133+ public function __construct($key = null, $secret_key = null, $token = null)
131134 {
132135 $this->api_version = '2011-02-28';
133136 $this->hostname = self::DEFAULT_URL;
@@ -145,6 +148,11 @@
146149 // @codeCoverageIgnoreEnd
147150 }
148151
 152+ if (defined('AWS_DEFAULT_CACHE_CONFIG') && AWS_DEFAULT_CACHE_CONFIG)
 153+ {
 154+ return parent::session_based_auth($key, $secret_key, $token);
 155+ }
 156+
149157 return parent::__construct($key, $secret_key);
150158 }
151159
@@ -3032,21 +3040,32 @@
30333041 * Adds or remove permission settings for the specified snapshot.
30343042 *
30353043 * @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>
30383044 * @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>
30393047 * <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>
30403048 * <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>
30413062 * <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>
30423063 * <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>
30433064 * @return CFResponse A <CFResponse> object containing a parsed HTTP response.
30443065 */
3045 - public function modify_snapshot_attribute($snapshot_id, $attribute, $operation_type, $opt = null)
 3066+ public function modify_snapshot_attribute($snapshot_id, $opt = null)
30463067 {
30473068 if (!$opt) $opt = array();
30483069 $opt['SnapshotId'] = $snapshot_id;
3049 - $opt['Attribute'] = $attribute;
3050 - $opt['OperationType'] = $operation_type;
30513070
30523071 // Optional parameter
30533072 if (isset($opt['UserId']))
@@ -3066,6 +3085,15 @@
30673086 unset($opt['UserGroup']);
30683087 }
30693088
 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+
30703098 return $this->authenticate('ModifySnapshotAttribute', $opt, $this->hostname);
30713099 }
30723100
Index: trunk/extensions/OpenStackManager/aws-sdk/services/elasticbeanstalk.class.php
@@ -35,7 +35,7 @@
3636 *
3737 * </ul>
3838 *
39 - * @version Tue Jul 12 16:08:17 PDT 2011
 39+ * @version Wed Aug 03 10:09:34 PDT 2011
4040 * @license See the included NOTICE.md file for complete information.
4141 * @copyright See the included NOTICE.md file for complete information.
4242 * @link http://aws.amazon.com/elasticbeanstalk/AWS Elastic Beanstalk
Index: trunk/extensions/OpenStackManager/aws-sdk/services/importexport.class.php
@@ -22,7 +22,7 @@
2323 * Internet. For large data sets, AWS Import/Export is often faster than Internet transfer and more cost effective than upgrading your
2424 * connectivity.
2525 *
26 - * @version Tue Jul 12 16:11:17 PDT 2011
 26+ * @version Wed Aug 03 10:12:39 PDT 2011
2727 * @license See the included NOTICE.md file for complete information.
2828 * @copyright See the included NOTICE.md file for complete information.
2929 * @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 @@
22 <?php
33 if (isset($_GET['logopng']))
44 {
5 - $data='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';
 5+ $data = <<<IMAGE
 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
 119+l/8Df+8XDp+g0JUAAAAASUVORK5CYII=
 120+IMAGE;
 121+
 122+
6123 header('Content-type: image/png');
7124 echo base64_decode($data);
8125 exit;
9126 }
10 -else if (isset($_GET['background']))
 127+elseif (isset($_GET['background']))
11128 {
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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';
 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+
13212 header('Content-type: image/gif');
14213 echo base64_decode($data);
15214 exit;
16215 }
 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');
17240
 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+
18262 // Required
19263 $php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.2.0', '>='));
20264 $simplexml_ok = extension_loaded('simplexml');
@@ -42,8 +286,28 @@
43287 $sqlite2_ok = extension_loaded('sqlite');
44288 $sqlite3_ok = extension_loaded('sqlite3');
45289 $sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok));
 290+
 291+// Other
46292 $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');
47297
 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+
48312 header('Content-type: text/html; charset=UTF-8');
49313
50314 ?><!DOCTYPE html>
@@ -52,6 +316,16 @@
53317 <head>
54318 <title>AWS SDK for PHP: Environment Compatibility Test</title>
55319
 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+
56330 <style type="text/css">
57331 body {
58332 font:14px/1.4em "Helvetica Neue", Helvetica, "Lucida Grande", "Droid Sans", Ubuntu, Verdana, Arial, Clean, Sans, sans-serif;
@@ -127,43 +401,45 @@
128402 margin:15px 0 5px 0;
129403 }
130404
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;
135411 }
136412
137413 em strong {
138414 text-transform: uppercase;
139415 }
140416
141 -table#chart {
 417+table.chart {
142418 border-collapse:collapse;
143419 }
144420
145 -table#chart th {
 421+table.chart th {
146422 background-color:#eee;
147423 padding:2px 3px;
148424 border:1px solid #fff;
149425 }
150426
151 -table#chart td {
 427+table.chart td {
152428 text-align:center;
153429 padding:2px 3px;
154430 border:1px solid #eee;
155431 }
156432
157 -table#chart tr.enabled td {
 433+table.chart tr.enabled td {
158434 /* Leave this alone */
159435 }
160436
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 {
163439 color:#999;
164440 font-style:italic;
165441 }
166442
167 -table#chart tr.disabled td a {
 443+table.chart tr.disabled td a {
168444 text-decoration:underline;
169445 }
170446
@@ -212,7 +488,7 @@
213489 <h2 style="text-align:center;"><img src="<?php echo pathinfo(__FILE__, PATHINFO_BASENAME); ?>?logopng" alt="SDK Compatibility Test" title="SDK Compatibility Test" /></h2>
214490
215491 <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">
217493 <thead>
218494 <tr>
219495 <th>Test</th>
@@ -260,7 +536,7 @@
261537 </table>
262538
263539 <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">
265541 <thead>
266542 <tr>
267543 <th>Test</th>
@@ -322,8 +598,36 @@
323599 </tbody>
324600 </table>
325601
 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+
326630 <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">
328632 <thead>
329633 <tr>
330634 <th>Test</th>
@@ -375,12 +679,49 @@
376680 </div>
377681 <?php endif; ?>
378682
 683+ <?php if ($apc_ok || $xcache_ok || $file_ok): ?>
379684 <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">
380717 <h3>Give me the details!</h3>
381718 <?php if ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok): ?>
382719 <ol>
383720 <li><em>Your environment meets the minimum requirements for using the <strong>AWS SDK for PHP</strong>!</em></li>
384721
 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+
385726 <?php if ($openssl_ok): ?>
386727 <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&reg; Windows&reg; instance passwords.</li>
387728 <?php endif; ?>
@@ -393,6 +734,14 @@
394735 <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>
395736 <?php endif; ?>
396737
 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+
397746 <?php
398747 $storage_types = array();
399748 if ($file_ok) { $storage_types[] = '<a href="http://php.net/file_put_contents">The file system</a>'; }
@@ -454,5 +803,13 @@
455804
456805 </div>
457806
 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+
458815 </body>
459816 </html>
\ No newline at end of file
Index: trunk/extensions/OpenStackManager/aws-sdk/_compatibility_test/sdk_compatibility_test_cli.php
@@ -17,7 +17,6 @@
1818 // Optional, but recommended
1919 $openssl_ok = (extension_loaded('openssl') && function_exists('openssl_sign'));
2020 $zlib_ok = extension_loaded('zlib');
21 -$int64_ok = (PHP_INT_MAX === 9223372036854775807);
2221
2322 // Optional
2423 $apc_ok = extension_loaded('apc');
@@ -31,11 +30,38 @@
3231 $sqlite3_ok = extension_loaded('sqlite3');
3332 $sqlite_ok = ($pdo_ok && $pdo_sqlite_ok && ($sqlite2_ok || $sqlite3_ok));
3433
 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
3556 function success($s = 'Yes')
3657 {
3758 return "\033[1;37m\033[42m " . $s . " \033[0m";
3859 }
3960
 61+function info($s = 'Info')
 62+{
 63+ return "\033[1;37m\033[44m " . $s . " \033[0m";
 64+}
 65+
4066 function failure($s = 'No ')
4167 {
4268 return "\033[1;37m\033[41m " . $s . " \033[0m";
@@ -45,29 +71,53 @@
4672
4773 echo PHP_EOL;
4874
49 -echo 'AWS SDK for PHP' . PHP_EOL;
 75+echo info('AWS SDK for PHP') . PHP_EOL;
5076 echo 'PHP Environment Compatibility Test (CLI)' . PHP_EOL;
5177 echo '----------------------------------------' . PHP_EOL;
5278 echo PHP_EOL;
5379
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+
72122 echo PHP_EOL;
73123
74124 echo '----------------------------------------' . PHP_EOL;
@@ -75,11 +125,14 @@
76126
77127 if ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok)
78128 {
 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; }
79134
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; }
84137
85138 $storage_types = array();
86139 if ($file_ok) { $storage_types[] = 'The file system'; }
@@ -89,20 +142,20 @@
90143 elseif ($sqlite_ok && $sqlite2_ok) { $storage_types[] = 'SQLite 2'; }
91144 if ($memcached_ok) { $storage_types[] = 'Memcached'; }
92145 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;
94147
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; }
97150 }
98151 else
99152 {
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; }
107160 }
108161
109162 echo '----------------------------------------' . PHP_EOL;
@@ -110,17 +163,47 @@
111164
112165 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))
113166 {
114 - echo 'Bottom Line: Yes, you can!' . PHP_EOL;
 167+ echo success('Bottom Line: Yes, you can!') . PHP_EOL;
 168+ echo PHP_EOL;
115169 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;
116184 }
117185 elseif ($php_ok && $curl_ok && $simplexml_ok && $spl_ok && $json_ok && $pcre_ok && $file_ok)
118186 {
119 - echo 'Bottom Line: Yes, you can!' . PHP_EOL;
 187+ echo success('Bottom Line: Yes, you can!') . PHP_EOL;
 188+ echo PHP_EOL;
120189 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;
121204 }
122205 else
123206 {
124 - echo 'Bottom Line: We\'re sorry...' . PHP_EOL;
 207+ echo failure('Bottom Line: We\'re sorry...') . PHP_EOL;
125208 echo 'Your PHP environment does not support the minimum requirements for the AWS SDK for PHP.' . PHP_EOL;
126209 }
127210
Index: trunk/extensions/OpenStackManager/aws-sdk/_docs/NOTICE.md
@@ -165,6 +165,33 @@
166166 <http://opensource.org/licenses/bsd-license.php>
167167
168168
 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+
169196 ## Human readable file sizes
170197
171198 <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+
238 # Changelog: 1.3.7 "Quistis"
339 <http://finalfantasy.wikia.com/wiki/Quistis_Trepe>
440
5 -Launched Wednesday, July 25, 2011
 41+Launched Monday, July 25, 2011
642
743 ## Bug fixes and enhancements
844 * Addressed minor bug fixes reported via the feedback form in the API Reference.
945
1046 ## Service Classes
1147 ### AmazonAS
12 -* **New:**
1348 * **Changed:** Introduced backwards-incompatible changes to the <code>put_scheduled_update_group_action()</code> method.
1449
1550
Index: trunk/extensions/OpenStackManager/aws-sdk/sdk.class.php
@@ -94,6 +94,29 @@
9595 }
9696 }
9797
 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+
98121 return $ua_append;
99122 }
100123
@@ -102,10 +125,10 @@
103126 // INTERMEDIARY CONSTANTS
104127
105128 define('CFRUNTIME_NAME', 'aws-sdk-php');
106 -define('CFRUNTIME_VERSION', '1.3.7');
 129+define('CFRUNTIME_VERSION', '1.4');
107130 // 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());
110133
111134
112135 /*%******************************************************************************************%*/
@@ -115,7 +138,7 @@
116139 * Core functionality and default settings shared across all SDK classes. All methods and properties in this
117140 * class are inherited by the service-specific classes.
118141 *
119 - * @version 2011.07.12
 142+ * @version 2011.07.28
120143 * @license See the included NOTICE.md file for more information.
121144 * @copyright See the included NOTICE.md file for more information.
122145 * @link http://aws.amazon.com/php/ PHP Developer Center
@@ -337,13 +360,12 @@
338361 * The constructor. You would not normally instantiate this class directly. Rather, you would instantiate
339362 * a service-specific class.
340363 *
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.
345367 * @return boolean A value of `false` if no valid values are set, otherwise `true`.
346368 */
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)
348370 {
349371 // Instantiate the utilities class.
350372 $this->util = new $this->utilities_class();
@@ -354,29 +376,7 @@
355377 // Set default values
356378 $this->key = null;
357379 $this->secret_key = null;
358 - $this->account_id = null;
359 - $this->assoc_id = null;
360380
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 -
381381 // If both a key and secret key are passed in, use those.
382382 if ($key && $secret_key)
383383 {
@@ -400,15 +400,117 @@
401401 }
402402
403403 /**
 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+ /**
404507 * Alternate approach to constructing a new instance. Supports chaining.
405508 *
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.
410512 * @return boolean A value of `false` if no valid values are set, otherwise `true`.
411513 */
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)
413515 {
414516 if (version_compare(PHP_VERSION, '5.3.0', '<'))
415517 {
@@ -416,7 +518,7 @@
417519 }
418520
419521 $self = get_called_class();
420 - return new $self($key, $secret_key, $account_id, $assoc_id);
 522+ return new $self($key, $secret_key, $token);
421523 }
422524
423525
@@ -820,6 +922,13 @@
821923 $timestamp = gmdate(CFUtilities::DATE_FORMAT_ISO8601, $current_time);
822924 $nonce = $this->util->generate_guid();
823925
 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+
824933 // Manage the key-value pairs that are used in the query.
825934 if (stripos($action, 'x-amz-target') !== false)
826935 {
@@ -931,12 +1040,6 @@
9321041 $request->set_body($querystring);
9331042 $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
9341043
935 - // Do we have an authentication token?
936 - if ($this->auth_token)
937 - {
938 - $headers['X-Amz-Security-Token'] = $this->auth_token;
939 - }
940 -
9411044 // Signing using X-Amz-Target is handled differently.
9421045 if ($signature_version === 3 && $x_amz_target)
9431046 {

Status & tagging log