mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	| @@ -32,6 +32,8 @@ var sessionExpiryTime | |||||||
|  |  | ||||||
| var sessions = {}; | var sessions = {}; | ||||||
|  |  | ||||||
|  | var loadedSessions = null; | ||||||
|  |  | ||||||
| function expireSessions() { | function expireSessions() { | ||||||
|     var now = Date.now(); |     var now = Date.now(); | ||||||
|     var modified = false; |     var modified = false; | ||||||
| @@ -50,49 +52,61 @@ function expireSessions() { | |||||||
|         return when.resolve(); |         return when.resolve(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | function loadSessions() { | ||||||
|  |     if (loadedSessions === null) { | ||||||
|  |         loadedSessions = storage.getSessions().then(function(_sessions) { | ||||||
|  |              sessions = _sessions||{}; | ||||||
|  |              return expireSessions(); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |     return loadedSessions; | ||||||
|  | } | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     init: function(adminAuthSettings, _storage) { |     init: function(adminAuthSettings, _storage) { | ||||||
|         storage = _storage; |         storage = _storage; | ||||||
|          |  | ||||||
|         sessionExpiryTime = adminAuthSettings.sessionExpiryTime || 604800; // 1 week in seconds |         sessionExpiryTime = adminAuthSettings.sessionExpiryTime || 604800; // 1 week in seconds | ||||||
|          |         // At this point, storage will not have been initialised, so defer loading | ||||||
|         return storage.getSessions().then(function(_sessions) { |         // the sessions until there's a request for them. | ||||||
|              sessions = _sessions||{}; |         loadedSessions = null; | ||||||
|              return expireSessions(); |         return when.resolve(); | ||||||
|         }); |  | ||||||
|     }, |     }, | ||||||
|     get: function(token) { |     get: function(token) { | ||||||
|         if (sessions[token]) { |         return loadSessions().then(function() { | ||||||
|             if (sessions[token].expires < Date.now()) { |             if (sessions[token]) { | ||||||
|                 return expireSessions().then(function() { return null }); |                 if (sessions[token].expires < Date.now()) { | ||||||
|  |                     return expireSessions().then(function() { return null }); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |             return when.resolve(sessions[token]); | ||||||
|         return when.resolve(sessions[token]); |         }); | ||||||
|     }, |     }, | ||||||
|     create: function(user,client,scope) { |     create: function(user,client,scope) { | ||||||
|         var accessToken = generateToken(128); |         return loadSessions().then(function() { | ||||||
|          |             var accessToken = generateToken(128); | ||||||
|         var accessTokenExpiresAt = Date.now() + (sessionExpiryTime*1000); |  | ||||||
|          |             var accessTokenExpiresAt = Date.now() + (sessionExpiryTime*1000); | ||||||
|         var session = { |  | ||||||
|             user:user, |             var session = { | ||||||
|             client:client, |                 user:user, | ||||||
|             scope:scope, |                 client:client, | ||||||
|             accessToken: accessToken, |                 scope:scope, | ||||||
|             expires: accessTokenExpiresAt |  | ||||||
|         }; |  | ||||||
|         sessions[accessToken] = session; |  | ||||||
|         return storage.saveSessions(sessions).then(function() { |  | ||||||
|             return { |  | ||||||
|                 accessToken: accessToken, |                 accessToken: accessToken, | ||||||
|                 expires_in: sessionExpiryTime |                 expires: accessTokenExpiresAt | ||||||
|             } |             }; | ||||||
|  |             sessions[accessToken] = session; | ||||||
|  |             return storage.saveSessions(sessions).then(function() { | ||||||
|  |                 return { | ||||||
|  |                     accessToken: accessToken, | ||||||
|  |                     expires_in: sessionExpiryTime | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|         }); |         }); | ||||||
|     }, |     }, | ||||||
|     revoke: function(token) { |     revoke: function(token) { | ||||||
|         delete sessions[token]; |         return loadSessions().then(function() { | ||||||
|         return storage.saveSessions(sessions); |             delete sessions[token]; | ||||||
|  |             return storage.saveSessions(sessions); | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  **/ |  **/ | ||||||
|   |  | ||||||
| var should = require("should"); | var should = require("should"); | ||||||
| var when = require("when"); | var when = require("when"); | ||||||
| var sinon = require("sinon"); | var sinon = require("sinon"); | ||||||
| @@ -24,16 +24,11 @@ var Tokens = require("../../../../red/api/auth/tokens"); | |||||||
| describe("Tokens", function() { | describe("Tokens", function() { | ||||||
|     describe("#init",function() { |     describe("#init",function() { | ||||||
|         it('loads sessions', function(done) { |         it('loads sessions', function(done) { | ||||||
|             Tokens.init({},{ |             Tokens.init({}).then(done); | ||||||
|                 getSessions:function() { |  | ||||||
|                     done(); |  | ||||||
|                     return when.resolve(); |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|      |  | ||||||
|      |  | ||||||
|     describe("#get",function() { |     describe("#get",function() { | ||||||
|         it('returns a valid token', function(done) { |         it('returns a valid token', function(done) { | ||||||
|             Tokens.init({},{ |             Tokens.init({},{ | ||||||
| @@ -51,7 +46,7 @@ describe("Tokens", function() { | |||||||
|                 }); |                 }); | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|          |  | ||||||
|         it('returns null for an invalid token', function(done) { |         it('returns null for an invalid token', function(done) { | ||||||
|             Tokens.init({},{ |             Tokens.init({},{ | ||||||
|                 getSessions:function() { |                 getSessions:function() { | ||||||
| @@ -98,7 +93,7 @@ describe("Tokens", function() { | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|      |  | ||||||
|     describe("#create",function() { |     describe("#create",function() { | ||||||
|         it('creates a token', function(done) { |         it('creates a token', function(done) { | ||||||
|             var savedSession; |             var savedSession; | ||||||
| @@ -112,14 +107,14 @@ describe("Tokens", function() { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|             var expectedExpiryTime = Date.now()+10000; |             var expectedExpiryTime = Date.now()+10000; | ||||||
|              |  | ||||||
|              |  | ||||||
|             Tokens.create("user","client","scope").then(function(token) { |             Tokens.create("user","client","scope").then(function(token) { | ||||||
|                 try { |                 try { | ||||||
|                     should.exist(savedSession); |                     should.exist(savedSession); | ||||||
|                     var sessionKeys = Object.keys(savedSession); |                     var sessionKeys = Object.keys(savedSession); | ||||||
|                     sessionKeys.should.have.lengthOf(1); |                     sessionKeys.should.have.lengthOf(1); | ||||||
|                      |  | ||||||
|                     token.should.have.a.property('accessToken',sessionKeys[0]); |                     token.should.have.a.property('accessToken',sessionKeys[0]); | ||||||
|                     savedSession[sessionKeys[0]].should.have.a.property('user','user'); |                     savedSession[sessionKeys[0]].should.have.a.property('user','user'); | ||||||
|                     savedSession[sessionKeys[0]].should.have.a.property('client','client'); |                     savedSession[sessionKeys[0]].should.have.a.property('client','client'); | ||||||
| @@ -133,7 +128,7 @@ describe("Tokens", function() { | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|      |  | ||||||
|     describe("#revoke", function() { |     describe("#revoke", function() { | ||||||
|         it('revokes a token', function(done) { |         it('revokes a token', function(done) { | ||||||
|             var savedSession; |             var savedSession; | ||||||
| @@ -157,5 +152,5 @@ describe("Tokens", function() { | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|      |  | ||||||
| }); | }); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user