aboutsummaryrefslogtreecommitdiffstats
path: root/tools/node_modules/nodemailer/lib/xoauth.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/node_modules/nodemailer/lib/xoauth.js')
-rw-r--r--tools/node_modules/nodemailer/lib/xoauth.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/tools/node_modules/nodemailer/lib/xoauth.js b/tools/node_modules/nodemailer/lib/xoauth.js
new file mode 100644
index 0000000..07d396b
--- /dev/null
+++ b/tools/node_modules/nodemailer/lib/xoauth.js
@@ -0,0 +1,71 @@
+// this module is inspired by xoauth.py
+// http://code.google.com/p/google-mail-xoauth-tools/
+
+var crypto = require("crypto");
+
+module.exports.XOAuthGenerator = XOAuthGenerator;
+
+function XOAuthGenerator(options){
+ this.options = options || {};
+}
+
+XOAuthGenerator.prototype.generate = function(callback){
+ return generateXOAuthStr(this.options, callback);
+};
+
+function escapeAndJoin(arr){
+ return arr.map(encodeURIComponent).join("&");
+}
+
+function hmacSha1(str, key){
+ var hmac = crypto.createHmac("sha1", key);
+ hmac.update(str);
+ return hmac.digest("base64");
+}
+
+function initOAuthParams(options){
+ return {
+ oauth_consumer_key: options.consumerKey || "anonymous",
+ oauth_nonce: options.nonce || "" + Date.now() + Math.round(Math.random()*1000000),
+ oauth_signature_method: "HMAC-SHA1",
+ oauth_version: "1.0",
+ oauth_timestamp: options.timestamp || "" + Math.round(Date.now()/1000)
+ };
+}
+
+function generateOAuthBaseStr(method, requestUrl, params){
+ var reqArr = [method, requestUrl].concat(Object.keys(params).sort().map(function(key){
+ return key + "=" + encodeURIComponent(params[key]);
+ }).join("&"));
+
+ return escapeAndJoin(reqArr);
+}
+
+function generateXOAuthStr(options, callback){
+ options = options || {};
+
+ var params = initOAuthParams(options),
+ requestUrl = options.requestUrl || "https://mail.google.com/mail/b/" + (options.user || "") + "/smtp/",
+ baseStr, signatureKey, paramsStr, returnStr;
+
+ if(options.token){
+ params.oauth_token = options.token;
+ }
+
+ baseStr = generateOAuthBaseStr(options.method || "GET", requestUrl, params);
+
+ signatureKey = escapeAndJoin([options.consumerSecret || "anonymous", options.tokenSecret]);
+ params.oauth_signature = hmacSha1(baseStr, signatureKey);
+
+ paramsStr = Object.keys(params).sort().map(function(key){
+ return key+"=\""+encodeURIComponent(params[key])+"\"";
+ }).join(",");
+
+ returnStr = [options.method || "GET", requestUrl, paramsStr].join(" ");
+
+ if(typeof callback == "function"){
+ callback(null, new Buffer(returnStr, "utf-8").toString("base64"));
+ }else{
+ return new Buffer(returnStr, "utf-8").toString("base64");
+ }
+} \ No newline at end of file