Skip to content

Commit

Permalink
Allow headers to be set in getAuthenticatedURL
Browse files Browse the repository at this point in the history
Changes the signature and allows custom headers in the getAuthenticatedURL function. 

Example:
$s3->getAuthenticatedURL($this->bucket, $path, $timeout, false, false, array('response-content-disposition' => 'attachment'));
  • Loading branch information
jessevondoom committed Apr 27, 2015
1 parent 121318e commit 8d2be80
Showing 1 changed file with 33 additions and 22 deletions.
55 changes: 33 additions & 22 deletions S3.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class S3
* Default delimiter to be used, for example while getBucket().
* @var string
* @access public
* @static
* @static
*/
public static $defDelimiter = null;

Expand Down Expand Up @@ -152,7 +152,7 @@ class S3
* @static
*/
public static $sslKey = null;

/**
* SSL client certfificate
*
Expand All @@ -161,7 +161,7 @@ class S3
* @static
*/
public static $sslCert = null;

/**
* SSL CA cert (only required if you are having problems with your system CA cert)
*
Expand All @@ -170,7 +170,7 @@ class S3
* @static
*/
public static $sslCACert = null;

/**
* AWS Key Pair ID
*
Expand All @@ -179,13 +179,13 @@ class S3
* @static
*/
private static $__signingKeyPairId = null;

/**
* Key resource, freeSigningKey() must be called to clear it from memory
*
* @var bool
* @access private
* @static
* @static
*/
private static $__signingKeyResource = false;

Expand Down Expand Up @@ -318,7 +318,7 @@ public static function setTimeCorrectionOffset($offset = 0)
$rest = new S3Request('HEAD');
$rest = $rest->getResponse();
$awstime = $rest->headers['date'];
$systime = time();
$systime = time();
$offset = $systime > $awstime ? -($systime - $awstime) : ($awstime - $systime);
}
self::$__timeOffset = $offset;
Expand Down Expand Up @@ -1176,14 +1176,25 @@ public static function deleteObject($bucket, $uri)
* @param boolean $https Use HTTPS ($hostBucket should be false for SSL verification)
* @return string
*/
public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false)
public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false, $headers = false)
{
$expires = self::__getTime() + $lifetime;
$uri = str_replace(array('%2F', '%2B'), array('/', '+'), rawurlencode($uri));
return sprintf(($https ? 'https' : 'http').'://%s/%s?AWSAccessKeyId=%s&Expires=%u&Signature=%s',
// $hostBucket ? $bucket : $bucket.'.s3.amazonaws.com', $uri, self::$__accessKey, $expires,
$hostBucket ? $bucket : self::$endpoint.'/'.$bucket, $uri, self::$__accessKey, $expires,
urlencode(self::__getHash("GET\n\n\n{$expires}\n/{$bucket}/{$uri}")));
$uri = str_replace(array('%2F', '%2B'), array('/', '+'), rawurlencode($uri)); // URI should be encoded (thanks Sean O'Dea)

$finalUrl = sprintf(($https ? 'https' : 'http').'://%s/%s?',
$hostBucket ? $bucket : $bucket.'.s3.amazonaws.com', $uri);
$requestToSign = "GET\n\n\n{$expires}\n/{$bucket}/{$uri}";
if (is_array($headers)) {
ksort($headers); // AMZ servers reject signatures if headers are not in alphabetical order
$appendString = '?';
foreach ($headers as $header => $value) {
$finalUrl .= $header . '=' . urlencode($value) . '&';
$requestToSign .= $appendString . $header . '=' . $value;
$appendString = '&';
}
}
$finalUrl .= 'AWSAccessKeyId=' . self::$__accessKey . '&Expires=' . $expires . '&Signature=' . urlencode(self::__getHash($requestToSign));
return $finalUrl;
}


Expand Down Expand Up @@ -1826,7 +1837,7 @@ private static function __getMIMEType(&$file)
'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif',
'png' => 'image/png', 'ico' => 'image/x-icon', 'pdf' => 'application/pdf',
'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash',
'svgz' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash',
'zip' => 'application/zip', 'gz' => 'application/x-gzip',
'tar' => 'application/x-tar', 'bz' => 'application/x-bzip',
'bz2' => 'application/x-bzip2', 'rar' => 'application/x-rar-compressed',
Expand Down Expand Up @@ -1909,7 +1920,7 @@ private static function __getHash($string)
}

/**
* S3 Request class
* S3 Request class
*
* @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class
* @version 0.5.0-dev
Expand All @@ -1923,47 +1934,47 @@ final class S3Request
* @access pricate
*/
private $endpoint;

/**
* Verb
*
* @var string
* @access private
*/
private $verb;

/**
* S3 bucket name
*
* @var string
* @access private
*/
private $bucket;

/**
* Object URI
*
* @var string
* @access private
*/
private $uri;

/**
* Final object URI
*
* @var string
* @access private
*/
private $resource = '';

/**
* Additional request parameters
*
* @var array
* @access private
*/
private $parameters = array();

/**
* Amazon specific request headers
*
Expand Down Expand Up @@ -2026,7 +2037,7 @@ final class S3Request
*/
function __construct($verb, $bucket = '', $uri = '', $endpoint = 's3.amazonaws.com')
{

$this->endpoint = $endpoint;
$this->verb = $verb;
$this->bucket = $bucket;
Expand Down

0 comments on commit 8d2be80

Please sign in to comment.