UNPKG

dataflo.ws

Version:

Zero-code JSON config-based dataflow engine for Node, PhoneGap and browser.

160 lines (100 loc) 3.34 kB
var task = require ('./base'), util = require ('util'); // - static var defaultDomain = project.config.consumerConfig.domain || "127.0.0.1"; var cookieConfig = project.config.consumerConfig.session; var defaultCookieTpl = { // default tpl name: "stoken", domain: defaultDomain, path: "/", expirePeriod: "0" }; // - - - var cookieParser = module.exports = function (config) { this.init (config); }; util.inherits (cookieParser, task); util.extend (cookieParser.prototype, { run: function() { var self = this; self.failed('use method [parse|render|session]'); }, parse: function () { var self = this; var cookies = self.headers.cookie ? self.headers.cookie : null; var cookiesObj = {length:0}; if (cookies) cookies.split('; ').map (function(item) { var s = item.split('='); if (s[0] && s[1]) { cookiesObj[s[0]] = s[1]; cookiesObj.length++; } }); self.completed (cookiesObj); }, render: function () { var self = this; var cookies = []; self.cookies.map(function(cookie) { cookies.push(self.serializeCookie(cookie)); }); self.output.setHeader ("Set-Cookie", cookies); self.completed (cookies); }, serializeCookie: function(cookie) { var pairs = [cookie.name + '=' + encodeURIComponent(cookie.value)]; if (cookie.domain) pairs.push('domain=' + cookie.domain); if (cookie.path) pairs.push('path=' + cookie.path); if (cookie.expirePeriod) { var expires = new Date(); var expirePeriod; var firstChar = cookie.expirePeriod[0]; expirePeriod = parseInt(cookie.expirePeriod); if (firstChar == "+" || firstChar == "-") { expires.setTime(expires.getTime() + expirePeriod); } else { expires.setTime(expirePeriod); } pairs.push('expires=' + expires.toUTCString()); } if (cookie.httpOnly) pairs.push('httpOnly'); if (cookie.secure) pairs.push('secure'); return pairs.join('; '); }, session: function () { var self = this; var reqCookies = self.reqCookies; delete reqCookies.length; //cookie template var cookieTpl = self.cookieTpl || cookieConfig.cookieTpl || defaultCookieTpl || {}, secret = self.secret || cookieConfig.secret || ''; if (!cookieTpl.domain) cookieTpl.domain = defaultDomain; // name of session cookie var name = cookieTpl.name; var value = (reqCookies[name]) ? reqCookies[name] : self.generate(secret); // - - - self.request.sessionUID = value; // - - - var newCookie = {}; for (var key in cookieTpl) { newCookie[key] = cookieTpl[key] || defaultCookieTpl[key]; } newCookie.value = value; console.log('SESSION', value); self.completed (newCookie); }, generate: function(secret) { var self = this, ip = self.request.connection.remoteAddress, port = self.request.connection.remotePort, date = self.request.connection._idleStart; timestamp = (date.constructor == Date) ? date.getTime() : date; timestamp = timestamp.toString(16); var rnd = (~~(10e+6*Math.random())).toString(16); var str = ip + ':' + port + '.' + timestamp + '.' + rnd; str = (port % 2 == 0) ? (str + '.' + secret) : (secret + '.' + str); var result = new Buffer(str).toString('base64').replace(/=+$/, ''); self.emit('log', 'Generated SessionID\n\t source = ' + str + '\n\t base64 = ' + result); return result; } });