Return to Snippet

Revision: 38815
at January 8, 2011 04:18 by esundahl


Updated Code
<?php
  // ----------------------------------------------------------------------- //
  if(!function_exists('el_crypto_hmacSHA1')){
    /**
    * Calculate the HMAC SHA1 hash of a string.
    *
    * @param string $key The key to hash against
    * @param string $data The data to hash
    * @param int $blocksize Optional blocksize
    * @return string HMAC SHA1
    */
    function el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
        if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
        $key = str_pad($key, $blocksize, chr(0x00));
        $ipad = str_repeat(chr(0x36), $blocksize);
        $opad = str_repeat(chr(0x5c), $blocksize);
        $hmac = pack( 'H*', sha1(
        ($key ^ $opad) . pack( 'H*', sha1(
          ($key ^ $ipad) . $data
        ))
      ));
        return base64_encode($hmac);
    }
  }
  // ----------------------------------------------------------------------- //
  if(!function_exists('el_s3_getTemporaryLink')){
    /**
    * Create temporary URLs to your protected Amazon S3 files.
    *
    * @param string $accessKey Your Amazon S3 access key
    * @param string $secretKey Your Amazon S3 secret key
    * @param string $bucket The bucket (bucket.s3.amazonaws.com)
    * @param string $path The target file path
    * @param int $expires In minutes
    * @return string Temporary Amazon S3 URL
    * @see http://awsdocs.s3.amazonaws.com/S3/20060301/s3-dg-20060301.pdf
    */
    
    function el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
      // Calculate expiry time
      $expires = time() + intval(floatval($expires) * 60);
      // Fix the path; encode and sanitize
      $path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
      // Path for signature starts with the bucket
      $signpath = '/'. $bucket .'/'. $path;
      // S3 friendly string to sign
      $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
      // Calculate the hash
      $signature = el_crypto_hmacSHA1($secretKey, $signsz);
      // Glue the URL ...
      $url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
      // ... to the query string ...
      $qs = http_build_query($pieces = array(
        'AWSAccessKeyId' => $accessKey,
        'Expires' => $expires,
        'Signature' => $signature,
      ));a
      // ... and return the URL!
      return $url.'?'.$qs;
    }
  }

Revision: 38814
at January 8, 2011 04:10 by esundahl


Initial Code
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  <title>Expire Link</title>
  
</head>
<body>
  
  <?php
  // ----------------------------------------------------------------------- //
  if(!function_exists('el_crypto_hmacSHA1')){
  	/**
  	* Calculate the HMAC SHA1 hash of a string.
  	*
  	* @param string $key The key to hash against
  	* @param string $data The data to hash
  	* @param int $blocksize Optional blocksize
  	* @return string HMAC SHA1
  	*/
  	function el_crypto_hmacSHA1($key, $data, $blocksize = 64) {
  	    if (strlen($key) > $blocksize) $key = pack('H*', sha1($key));
  	    $key = str_pad($key, $blocksize, chr(0x00));
  	    $ipad = str_repeat(chr(0x36), $blocksize);
  	    $opad = str_repeat(chr(0x5c), $blocksize);
  	    $hmac = pack( 'H*', sha1(
  			($key ^ $opad) . pack( 'H*', sha1(
  				($key ^ $ipad) . $data
  			))
  		));
  	    return base64_encode($hmac);
  	}
  }
  // ----------------------------------------------------------------------- //
  if(!function_exists('el_s3_getTemporaryLink')){
  	/**
  	* Create temporary URLs to your protected Amazon S3 files.
  	*
  	* @param string $accessKey Your Amazon S3 access key
  	* @param string $secretKey Your Amazon S3 secret key
  	* @param string $bucket The bucket (bucket.s3.amazonaws.com)
  	* @param string $path The target file path
  	* @param int $expires In minutes
  	* @return string Temporary Amazon S3 URL
  	* @see http://awsdocs.s3.amazonaws.com/S3/20060301/s3-dg-20060301.pdf
  	*/
  	function el_s3_getTemporaryLink($accessKey, $secretKey, $bucket, $path, $expires = 5) {
  		// Calculate expiry time
  		$expires = time() + intval(floatval($expires) * 60);
  		// Fix the path; encode and sanitize
  		$path = str_replace('%2F', '/', rawurlencode($path = ltrim($path, '/')));
  		// Path for signature starts with the bucket
  		$signpath = '/'. $bucket .'/'. $path;
  		// S3 friendly string to sign
  		$signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
  		// Calculate the hash
  		$signature = el_crypto_hmacSHA1($secretKey, $signsz);
  		// Glue the URL ...
  		$url = sprintf('http://%s.s3.amazonaws.com/%s', $bucket, $path);
  		// ... to the query string ...
  		$qs = http_build_query($pieces = array(
  			'AWSAccessKeyId' => $accessKey,
  			'Expires' => $expires,
  			'Signature' => $signature,
  		));a
  		// ... and return the URL!
  		return $url.'?'.$qs;
  	}
  }
  // ----------------------------------------------------------------------- //
  ?>
  
  <?php $url = el_s3_getTemporaryLink('AKIAJ2GRCAERX6CQ6K7A', 'uNOC62Egc3hgIUmT+hcYf7Sb1ihDW9pC9dyDuiEl', 'com.bradcorporation.facebook', 'unlock/album/01copy.mp3', 1); ?>
  <a href="<?php echo $url; ?>">This link will expire in 5 minutes.</a>
</body>

Initial URL


Initial Description
This script generates an expiring link to an Amazon S3 file

Initial Title
Amazon S3 Expiring Link

Initial Tags
link

Initial Language
PHP