138 lines
4.0 KiB
JavaScript
138 lines
4.0 KiB
JavaScript
'use strict';
|
|
|
|
var PromiseA = require('bluebird');
|
|
var fs = PromiseA.promisifyAll(require('fs'));
|
|
var path = require('path');
|
|
//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');
|
|
|
|
// 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, '..'));
|
|
}
|
|
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);
|
|
}
|
|
|
|
module.exports = {
|
|
directives: {
|
|
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) {
|
|
// TODO make safe
|
|
try {
|
|
return require(path.join(directivesdir, providerUri + '.json'));
|
|
} catch(e) {
|
|
return null;
|
|
}
|
|
}
|
|
, set: function (providerUri, directives) {
|
|
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 () { });
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
|
|
, sessions: {
|
|
all: function (providerUri) {
|
|
return fs.readdirAsync(sessionsdir).then(function (nodes) {
|
|
return nodes.map(function (node) {
|
|
var result = require(path.join(sessionsdir, node));
|
|
if (result.link) {
|
|
return null;
|
|
}
|
|
}).filter(Boolean).filter(function (result) {
|
|
if (!providerUri || providerUri === result.issuer) {
|
|
return result;
|
|
}
|
|
});
|
|
});
|
|
}
|
|
, get: function (providerUri, id) {
|
|
var result;
|
|
try {
|
|
if (id) {
|
|
return PromiseA.resolve(require(path.join(sessionsdir, providerUri + '.' + id + '.json')));
|
|
}
|
|
else {
|
|
result = require(path.join(sessionsdir, providerUri + '.json'));
|
|
// TODO make safer
|
|
if (result.link && '/' !== result.link[0] && !/\.\./.test(result.link)) {
|
|
result = require(path.join(sessionsdir, result.link));
|
|
}
|
|
}
|
|
} catch(e) {
|
|
return PromiseA.resolve(null);
|
|
}
|
|
return PromiseA.resolve(result);
|
|
}
|
|
, set: function (providerUri, session, id) {
|
|
var p;
|
|
|
|
if (id) {
|
|
p = fs.writeFileAsync(path.join(sessionsdir, providerUri + '.' + id + '.json'), JSON.stringify(session, null, 2));
|
|
}
|
|
else {
|
|
p = fs.writeFileAsync(path.join(sessionsdir, providerUri + '.json'), JSON.stringify(session, null, 2));
|
|
}
|
|
return p.then(function () {
|
|
return session;
|
|
});
|
|
}
|
|
, clear: function () {
|
|
return fs.readdirAsync(sessionsdir).then(function (nodes) {
|
|
return PromiseA.all(nodes.map(function (node) {
|
|
return fs.unlinkAsync(path.join(sessionsdir, node));
|
|
}));
|
|
});
|
|
}
|
|
}
|
|
, 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;
|
|
});
|
|
}
|
|
}
|
|
};
|