Skip to content

Instantly share code, notes, and snippets.

@dezinezync
Created October 18, 2012 13:00
Show Gist options
  • Save dezinezync/3911646 to your computer and use it in GitHub Desktop.
Save dezinezync/3911646 to your computer and use it in GitHub Desktop.
Node:S3 policy generator
//Code adapted from https://gist.github.com/2163005
var s3 = {
access_key_id: "<Access Key>"
, secret_key: "<Secret Key>"
, bucket: "<bucket name>"
, acl: "public-read"
, https: "false"
, error_message: ""
, pad: function(n) {
if ((n+"").length == 1) {
return "0" + n;
}
return ""+n;
}, expiration_date: function() {
var now = new Date();
var date = new Date( now.getTime() + (3600 * 1000) );
var ed = date.getFullYear() + "-" + this.pad(date.getMonth()+1) + "-" + this.pad(date.getDate());
ed += "T" + this.pad(date.getHours()) + ":" + this.pad(date.getMinutes()) + ":" + this.pad(date.getSeconds()) + ".000Z";
return ed;
}
};
app.get('/upload', function(req, res) {
if(req.query.username == null) {
res.send(400, "Username not provided");
return;
}
// THIS YOU CHANGE
aws_access_key = s3.access_key; // your acces key to Amazon services (get if from https://portal.aws.amazon.com/gp/aws/securityCredentials)
aws_secret_key = s3.secret_key; // secret access key (get it from https://portal.aws.amazon.com/gp/aws/securityCredentials)
bucket = s3.bucket; // the name you've chosen for the bucket
key = '/${filename}'; // the folder and adress where the file will be uploaded; ${filename} will be replaced by original file name (the folder needs to be public on S3!)
success_action_redirect = 'http://localhost:3000/upload/success'; // URL that you will be redirected to when the file will be successfully uploaded
content_type = 'image/'; // limit accepted content types; empty will disable the filter; for example: 'image/', 'image/png'
acl = s3.acl; // private or public-read
// THIS YOU DON'T
var policy = { "expiration": s3.expiration_date(),
"conditions": [
{"bucket": bucket},
["starts-with", "$key", str_replace('${filename}', '', key)],
{"acl": acl},
{"success_action_redirect": success_action_redirect},
["starts-with", "$Content-Type", content_type],
{"x-amz-meta-uuid": "14365123651275"},
["starts-with", "$x-amz-meta-tag", ""]
]
};
policy = new Buffer(JSON.stringify(policy)).toString('base64').replace(/\n|\r/, '');
var hmac = crypto.createHmac("sha1", s3.secret_key);
var hash2 = hmac.update(policy);
var signature = hmac.digest(encoding="base64");
res.json(200,{
bucket: bucket,
aws_key: aws_access_key,
acl: acl,
key: key,
redirect: success_action_redirect,
content_type: content_type,
policy: policy,
signature: signature
});
});
//From php.js
function str_replace (search, replace, subject, count) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + improved by: Gabriel Paderni
// + improved by: Philip Peterson
// + improved by: Simon Willison (http://simonwillison.net)
// + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
// + bugfixed by: Anton Ongson
// + input by: Onno Marsman
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + tweaked by: Onno Marsman
// + input by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + input by: Oleg Eremeev
// + improved by: Brett Zamir (http://brett-zamir.me)
// + bugfixed by: Oleg Eremeev
// % note 1: The count parameter must be passed as a string in order
// % note 1: to find a global variable in which the result will be given
// * example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
// * returns 1: 'Kevin.van.Zonneveld'
// * example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
// * returns 2: 'hemmo, mars'
var i = 0,
j = 0,
temp = '',
repl = '',
sl = 0,
fl = 0,
f = [].concat(search),
r = [].concat(replace),
s = subject,
ra = Object.prototype.toString.call(r) === '[object Array]',
sa = Object.prototype.toString.call(s) === '[object Array]';
s = [].concat(s);
if (count) {
this.window[count] = 0;
}
for (i = 0, sl = s.length; i < sl; i++) {
if (s[i] === '') {
continue;
}
for (j = 0, fl = f.length; j < fl; j++) {
temp = s[i] + '';
repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
s[i] = (temp).split(f[j]).join(repl);
if (count && s[i] !== temp) {
this.window[count] += (temp.length - s[i].length) / f[j].length;
}
}
}
return sa ? s : s[0];
}
@jakelodwick
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment