| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  | var PromiseA = require('bluebird'); | 
					
						
							|  |  |  | var fs = PromiseA.promisifyAll(require('fs')); | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  | var path = require('path'); | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  | //var oauth3dir = process.cwd();
 | 
					
						
							|  |  |  | var oauth3dir = path.join(require('os').homedir(), '.oauth3', 'v1'); | 
					
						
							|  |  |  | var sessionsdir = path.join(oauth3dir, 'sessions'); | 
					
						
							|  |  |  | var directivesdir = path.join(oauth3dir, 'directives'); | 
					
						
							|  |  |  | var metadir = path.join(oauth3dir, 'meta'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-15 12:45:19 -06:00
										 |  |  | // We can reasonably assume the existence of the home directory, but we can't assume
 | 
					
						
							|  |  |  | // that there will already be a `.oauth3` directory or anything inside of it.
 | 
					
						
							|  |  |  | if (!fs.existsSync(path.join(oauth3dir, '..'))) { | 
					
						
							|  |  |  |   fs.mkdirSync(path.join(oauth3dir, '..')); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  | if (!fs.existsSync(oauth3dir)) { | 
					
						
							|  |  |  |   fs.mkdirSync(oauth3dir); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | if (!fs.existsSync(directivesdir)) { | 
					
						
							|  |  |  |   fs.mkdirSync(directivesdir); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | if (!fs.existsSync(sessionsdir)) { | 
					
						
							|  |  |  |   fs.mkdirSync(sessionsdir); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | if (!fs.existsSync(metadir)) { | 
					
						
							|  |  |  |   fs.mkdirSync(metadir); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   directives: { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |     all: function () { | 
					
						
							|  |  |  |       return fs.readdirAsync(directivesdir).then(function (nodes) { | 
					
						
							|  |  |  |         return nodes.map(function (node) { | 
					
						
							|  |  |  |           try { | 
					
						
							|  |  |  |             return require(path.join(directivesdir, node)); | 
					
						
							|  |  |  |           } catch(e) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }).filter(Boolean); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , get: function (providerUri) { | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  |       // TODO make safe
 | 
					
						
							|  |  |  |       try { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         return require(path.join(directivesdir, providerUri + '.json')); | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  |       } catch(e) { | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |   , set: function (providerUri, directives) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |       return fs.writeFileAsync( | 
					
						
							|  |  |  |         path.join(directivesdir, providerUri + '.json') | 
					
						
							|  |  |  |       , JSON.stringify(directives, null, 2) | 
					
						
							|  |  |  |       ).then(function () { | 
					
						
							|  |  |  |         return directives; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , clear: function () { | 
					
						
							|  |  |  |       return fs.readdirAsync(directivesdir).then(function (nodes) { | 
					
						
							|  |  |  |         return PromiseA.all(nodes.map(function (node) { | 
					
						
							|  |  |  |           return fs.unlinkAsync(path.join(directivesdir, node)).then(function () { }, function () { }); | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  | , sessions: { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |     all: function (providerUri) { | 
					
						
							| 
									
										
										
										
											2017-07-31 16:42:22 -06:00
										 |  |  |       return fs.readdirAsync(sessionsdir).then(function (nodes) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         return nodes.map(function (node) { | 
					
						
							| 
									
										
										
										
											2017-07-31 16:42:22 -06:00
										 |  |  |           var result = require(path.join(sessionsdir, node)); | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |           if (result.link) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }).filter(Boolean).filter(function (result) { | 
					
						
							|  |  |  |           if (!providerUri || providerUri === result.issuer) { | 
					
						
							|  |  |  |             return result; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , get: function (providerUri, id) { | 
					
						
							|  |  |  |       var result; | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  |       try { | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |         if (id) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |           return PromiseA.resolve(require(path.join(sessionsdir, providerUri + '.' + id + '.json'))); | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |           result = require(path.join(sessionsdir, providerUri + '.json')); | 
					
						
							|  |  |  |           // TODO make safer
 | 
					
						
							|  |  |  |           if (result.link && '/' !== result.link[0] && !/\.\./.test(result.link)) { | 
					
						
							| 
									
										
										
										
											2017-07-31 16:42:22 -06:00
										 |  |  |             result = require(path.join(sessionsdir, result.link)); | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  |       } catch(e) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         return PromiseA.resolve(null); | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |       return PromiseA.resolve(result); | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |   , set: function (providerUri, session, id) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |       var p; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |       if (id) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         p = fs.writeFileAsync(path.join(sessionsdir, providerUri + '.' + id + '.json'), JSON.stringify(session, null, 2)); | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |       } | 
					
						
							|  |  |  |       else { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         p = fs.writeFileAsync(path.join(sessionsdir, providerUri + '.json'), JSON.stringify(session, null, 2)); | 
					
						
							| 
									
										
										
										
											2017-03-22 09:48:04 -06:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |       return p.then(function () { | 
					
						
							|  |  |  |         return session; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , clear: function () { | 
					
						
							| 
									
										
										
										
											2017-07-31 16:42:22 -06:00
										 |  |  |       return fs.readdirAsync(sessionsdir).then(function (nodes) { | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         return PromiseA.all(nodes.map(function (node) { | 
					
						
							| 
									
										
										
										
											2017-07-31 16:42:22 -06:00
										 |  |  |           return fs.unlinkAsync(path.join(sessionsdir, node)); | 
					
						
							| 
									
										
										
										
											2017-03-26 01:43:06 -06:00
										 |  |  |         })); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | , meta: { | 
					
						
							|  |  |  |     get: function (key) { | 
					
						
							|  |  |  |       // TODO make safe
 | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         return PromiseA.resolve(require(path.join(metadir, key + '.json'))); | 
					
						
							|  |  |  |       } catch(e) { | 
					
						
							|  |  |  |         return PromiseA.resolve(null); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , set: function (key, value) { | 
					
						
							|  |  |  |       return fs.writeFileAsync(path.join(metadir, key + '.json'), JSON.stringify(value, null, 2)).then(function () { | 
					
						
							|  |  |  |         return value; | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-03-21 01:02:41 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-03-20 23:29:03 -06:00
										 |  |  | }; |