/*******************************************************************************
* Copyright 2008 Amazon Technologies, Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
*
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at: http://aws.amazon.com/apache2.0
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
* __ _ _ ___
* ( )( \/\/ )/ __)
* /__\ \ / \__ \
* (_)(_) \/\/ (___/
*
* Amazon EC2 CSharp Library
* API Version: 2008-12-01
* Generated: Fri Dec 26 23:53:41 PST 2008
*
*/
using System;
using System.Text;
using System.Security.Cryptography;
using System.Globalization;
namespace Amazon.EC2.Util
{
///
/// This class represents S3 upload policy. Policy string
/// representaion and signature to be used within EC2 bundling API.
///
public class S3UploadPolicy
{
private String policySignature;
private String policyString;
///
/// S3 Upload policy to be used by EC2 API.
///
/// Access Key Id of the signer of the policy
/// Secret Key of the signer of the policy
/// Bucket name to upload
/// Prefix for the object keys
/// Expire, minutes from now
///
public S3UploadPolicy(String awsAccessKeyId,
String awsSecretKey,
String bucketName,
String prefix,
int expireInMinutes)
{
StringBuilder builder = new StringBuilder();
builder.Append("{")
.Append("\"expiration\": \"")
.Append(GetFormattedTimestamp(expireInMinutes))
.Append("\",")
.Append("\"conditions\": [")
.Append("{\"bucket\": \"")
.Append(bucketName)
.Append("\"},")
.Append("{\"acl\": \"")
.Append("ec2-bundle-read")
.Append("\"},")
.Append("[\"starts-with\", \"$key\", \"")
.Append(prefix)
.Append("\"]")
.Append("]}");
Encoding encoding = new UTF8Encoding();
this.policyString = Convert.ToBase64String(encoding.GetBytes(builder.ToString().ToCharArray()));
this.policySignature = SignPolicy(awsSecretKey, policyString);
}
///
/// Base64 representation of the serialized policy.
/// Use policy generated by this method
/// for passing to EC2 bunding calls.
///
/// Base64 policy
public String PolicyString
{
get
{
return this.policyString;
}
}
///
/// Policy signature in base64 format
/// Use signature generated by this method
/// for passing to EC2 bunding calls along with policy.
///
/// Base64 signature
public String PolicySignature
{
get
{
return this.policySignature;
}
}
private String SignPolicy(String awsSecretKey, String base64EncodedPolicy)
{
Encoding encoding = new UTF8Encoding();
HMACSHA1 signature = new HMACSHA1(encoding.GetBytes(awsSecretKey));
return Convert.ToBase64String(signature.ComputeHash(
encoding.GetBytes(base64EncodedPolicy.ToCharArray())));
}
private String GetFormattedTimestamp(int minutesFromNow)
{
DateTime dateTime = DateTime.Now.AddMinutes(minutesFromNow);
return new DateTime(dateTime.Year,
dateTime.Month,
dateTime.Day,
dateTime.Hour,
dateTime.Minute,
dateTime.Second,
dateTime.Millisecond,
DateTimeKind.Local)
.ToUniversalTime()
.ToString("yyyy-MM-dd\\THH:mm:ss.fff\\Z",
CultureInfo.InvariantCulture);
}
}
}