@bee.js/node 0.0.51 → 0.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/beeRequest.js +46 -43
- package/beehive.js +491 -491
- package/index.js +14 -14
- package/lib/DBA/beeDBA.js +133 -133
- package/lib/DEV/beeDEV.js +41 -41
- package/lib/JWT/beeJWT.js +71 -71
- package/lib/ORM/beeORM.js +364 -364
- package/lib/WEB/freeRoute.js +4 -4
- package/lib/WEB/route.js +27 -27
- package/lib/beeHive/create.js +71 -52
- package/lib/beeHive/headers.js +9 -9
- package/lib/beeHive/load.js +19 -19
- package/lib/beeHive/log.js +2 -2
- package/lib/beeHive/routes.js +34 -34
- package/lib/beeHive/start.js +29 -29
- package/package.json +40 -40
- package/security/index.js +8 -8
- package/services/CRON.js +8 -8
- package/services/EMAIL.js +2 -2
- package/services/HTTP.js +32 -32
- package/services/HTTPS.js +31 -31
- package/services/LOGS.js +7 -7
- package/services/SCRIPT.js +13 -13
- package/services/SHELL.js +2 -2
- package/services/index.js +9 -9
- package/tools/beeTools.js +18 -18
- package/tools/guid.js +15 -15
- package/tools/hash.js +6 -6
- package/tools/model.js +20 -20
- package/tools/slug.js +16 -16
- package/tools/string.js +55 -55
package/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
load: require('./lib/beeHive/load'),
|
|
3
|
-
create: require('./lib/beeHive/create'),
|
|
4
|
-
start: require('./lib/beeHive/start'),
|
|
5
|
-
routes: require('./lib/beeHive/routes'),
|
|
6
|
-
route: require('./lib/WEB/route'),
|
|
7
|
-
freeRoute: require('./lib/WEB/freeRoute'),
|
|
8
|
-
request: require('./beeRequest'),
|
|
9
|
-
hive: require('./beehive'),
|
|
10
|
-
tools: require('./tools/beeTools'),
|
|
11
|
-
security: require('./security'),
|
|
12
|
-
services: require('./services'),
|
|
13
|
-
//scheduler: require('./security'), //TODO
|
|
14
|
-
status: (req, res)=>res.status(200).send(`${global.configs.name || 'Bee.js'} running version: ${global.configs.version}`)
|
|
1
|
+
module.exports = {
|
|
2
|
+
load: require('./lib/beeHive/load'),
|
|
3
|
+
create: require('./lib/beeHive/create'),
|
|
4
|
+
start: require('./lib/beeHive/start'),
|
|
5
|
+
routes: require('./lib/beeHive/routes'),
|
|
6
|
+
route: require('./lib/WEB/route'),
|
|
7
|
+
freeRoute: require('./lib/WEB/freeRoute'),
|
|
8
|
+
request: require('./beeRequest'),
|
|
9
|
+
hive: require('./beehive'),
|
|
10
|
+
tools: require('./tools/beeTools'),
|
|
11
|
+
security: require('./security'),
|
|
12
|
+
services: require('./services'),
|
|
13
|
+
//scheduler: require('./security'), //TODO
|
|
14
|
+
status: (req, res)=>res.status(200).send(`${global.configs.name || 'Bee.js'} running version: ${global.configs.version}`)
|
|
15
15
|
}
|
package/lib/DBA/beeDBA.js
CHANGED
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
const beeORM = require("../ORM/beeORM");
|
|
2
|
-
const beeHive = require("../../beehive");
|
|
3
|
-
|
|
4
|
-
const fieldType = {
|
|
5
|
-
mysql: function (field) {
|
|
6
|
-
let type = field.type.split(" ")[0].trim();
|
|
7
|
-
|
|
8
|
-
switch (type) {
|
|
9
|
-
case "integer":
|
|
10
|
-
case "int":
|
|
11
|
-
type = "int";
|
|
12
|
-
break;
|
|
13
|
-
case "decimal":
|
|
14
|
-
type = `decimal(${(field.length || 10.1)
|
|
15
|
-
.toString()
|
|
16
|
-
.replace(".", ",")})`;
|
|
17
|
-
break;
|
|
18
|
-
|
|
19
|
-
case "string":
|
|
20
|
-
case "varchar":
|
|
21
|
-
type = `varchar(${field.length || 45})`;
|
|
22
|
-
break;
|
|
23
|
-
case "uuid":
|
|
24
|
-
case "guid":
|
|
25
|
-
type = `binary(16)`;
|
|
26
|
-
field.ai = false;
|
|
27
|
-
break;
|
|
28
|
-
case "char":
|
|
29
|
-
type = `char(${field.length || 5})`;
|
|
30
|
-
break;
|
|
31
|
-
case "file":
|
|
32
|
-
type = "blob";
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
return (
|
|
36
|
-
type +
|
|
37
|
-
(!field.null ? " NOT NULL" : "") +
|
|
38
|
-
(field.ai ? " AUTO_INCREMENT" : "") +
|
|
39
|
-
(field.default !== undefined ? ` DEFAULT ${field.default}` : "") +
|
|
40
|
-
(field.default !== undefined && field.onUpdate
|
|
41
|
-
? ` ON UPDATE ${field.default}`
|
|
42
|
-
: "")
|
|
43
|
-
);
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
module.exports.actions = {
|
|
48
|
-
mysql: {
|
|
49
|
-
MODEL_STATEMENT_EXECUTE: async function (req, res) {
|
|
50
|
-
let hive = beeHive();
|
|
51
|
-
let data = await hive.dbExec(req.body.statement_execute);
|
|
52
|
-
|
|
53
|
-
res.status(200).send({ data: data });
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
MODEL_CREATE_DB: function (req, res) {
|
|
57
|
-
let configsDB = global.configs.databases.default;
|
|
58
|
-
let models = global.models;
|
|
59
|
-
let SQL = ["", ""];
|
|
60
|
-
|
|
61
|
-
//TODO create db with user permissions
|
|
62
|
-
|
|
63
|
-
Object.keys(models).map((model) => {
|
|
64
|
-
if (!req.body.models[model]._checked) return;
|
|
65
|
-
|
|
66
|
-
SQL[0] += this.MODEL_CREATE_TABLE(models[model], configsDB);
|
|
67
|
-
SQL[1] += models[model].relations
|
|
68
|
-
? this.MODEL_CREATE_CONSTRAINT(models[model], configsDB)
|
|
69
|
-
: "";
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
res.status(200).send({ data: SQL.join("") });
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
MODEL_CREATE_TABLE: function (model, configsDB) {
|
|
76
|
-
let q = beeORM.quote;
|
|
77
|
-
let SQL = "";
|
|
78
|
-
|
|
79
|
-
SQL = `CREATE TABLE IF NOT EXISTS ${q(model.table)} (`;
|
|
80
|
-
|
|
81
|
-
for (let field in model.schema)
|
|
82
|
-
SQL += `\n ${q(field)} ${fieldType[configsDB.drive](
|
|
83
|
-
model.schema[field]
|
|
84
|
-
)},`; // TODO criar funcao para relacionamentos.
|
|
85
|
-
|
|
86
|
-
SQL = SQL.slice(0, SQL.length - 1);
|
|
87
|
-
|
|
88
|
-
if (model.indexes) {
|
|
89
|
-
if (model.indexes.keys)
|
|
90
|
-
SQL += `,\n PRIMARY KEY (${q(model.indexes.keys)})`;
|
|
91
|
-
|
|
92
|
-
//TODO fazer uniques e cia. colocar em funcao.
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
SQL += `\n) ENGINE=${configsDB.engine} DEFAULT CHARSET=${configsDB.charset};\n\n`;
|
|
96
|
-
|
|
97
|
-
return SQL;
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
MODEL_CREATE_CONSTRAINT: function (model, configsDB) {
|
|
101
|
-
let q = beeORM.quote;
|
|
102
|
-
let SQL = "\n\n\n";
|
|
103
|
-
|
|
104
|
-
SQL += `/*----- Constraints for table ${q(model.table)} -----*/\n`;
|
|
105
|
-
|
|
106
|
-
for (let field in model.relations)
|
|
107
|
-
SQL += `\n\n ALTER TABLE ${q(model.table)}\n ADD CONSTRAINT ${q(
|
|
108
|
-
`FK_${model.relations[field].split(".")[0]}_X_${
|
|
109
|
-
model.table
|
|
110
|
-
}_${field}`.slice(0, 64)
|
|
111
|
-
)}
|
|
112
|
-
FOREIGN KEY (${field})
|
|
113
|
-
REFERENCES ${
|
|
114
|
-
model.relations[field].split(".")[0]
|
|
115
|
-
} (${field})
|
|
116
|
-
${"ON DELETE CASCADE"}
|
|
117
|
-
${"ON UPDATE CASCADE"};
|
|
118
|
-
\n\n`;
|
|
119
|
-
|
|
120
|
-
//SQL += `-- COMMIT; \n\n`
|
|
121
|
-
|
|
122
|
-
return SQL;
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
|
|
126
|
-
mssql: {
|
|
127
|
-
// TODO next version
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
mongoDB: {
|
|
131
|
-
// TODO next version
|
|
132
|
-
},
|
|
133
|
-
};
|
|
1
|
+
const beeORM = require("../ORM/beeORM");
|
|
2
|
+
const beeHive = require("../../beehive");
|
|
3
|
+
|
|
4
|
+
const fieldType = {
|
|
5
|
+
mysql: function (field) {
|
|
6
|
+
let type = field.type.split(" ")[0].trim();
|
|
7
|
+
|
|
8
|
+
switch (type) {
|
|
9
|
+
case "integer":
|
|
10
|
+
case "int":
|
|
11
|
+
type = "int";
|
|
12
|
+
break;
|
|
13
|
+
case "decimal":
|
|
14
|
+
type = `decimal(${(field.length || 10.1)
|
|
15
|
+
.toString()
|
|
16
|
+
.replace(".", ",")})`;
|
|
17
|
+
break;
|
|
18
|
+
|
|
19
|
+
case "string":
|
|
20
|
+
case "varchar":
|
|
21
|
+
type = `varchar(${field.length || 45})`;
|
|
22
|
+
break;
|
|
23
|
+
case "uuid":
|
|
24
|
+
case "guid":
|
|
25
|
+
type = `binary(16)`;
|
|
26
|
+
field.ai = false;
|
|
27
|
+
break;
|
|
28
|
+
case "char":
|
|
29
|
+
type = `char(${field.length || 5})`;
|
|
30
|
+
break;
|
|
31
|
+
case "file":
|
|
32
|
+
type = "blob";
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
return (
|
|
36
|
+
type +
|
|
37
|
+
(!field.null ? " NOT NULL" : "") +
|
|
38
|
+
(field.ai ? " AUTO_INCREMENT" : "") +
|
|
39
|
+
(field.default !== undefined ? ` DEFAULT ${field.default}` : "") +
|
|
40
|
+
(field.default !== undefined && field.onUpdate
|
|
41
|
+
? ` ON UPDATE ${field.default}`
|
|
42
|
+
: "")
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
module.exports.actions = {
|
|
48
|
+
mysql: {
|
|
49
|
+
MODEL_STATEMENT_EXECUTE: async function (req, res) {
|
|
50
|
+
let hive = beeHive();
|
|
51
|
+
let data = await hive.dbExec(req.body.statement_execute);
|
|
52
|
+
|
|
53
|
+
res.status(200).send({ data: data });
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
MODEL_CREATE_DB: function (req, res) {
|
|
57
|
+
let configsDB = global.configs.databases.default;
|
|
58
|
+
let models = global.models;
|
|
59
|
+
let SQL = ["", ""];
|
|
60
|
+
|
|
61
|
+
//TODO create db with user permissions
|
|
62
|
+
|
|
63
|
+
Object.keys(models).map((model) => {
|
|
64
|
+
if (!req.body.models[model]._checked) return;
|
|
65
|
+
|
|
66
|
+
SQL[0] += this.MODEL_CREATE_TABLE(models[model], configsDB);
|
|
67
|
+
SQL[1] += models[model].relations
|
|
68
|
+
? this.MODEL_CREATE_CONSTRAINT(models[model], configsDB)
|
|
69
|
+
: "";
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
res.status(200).send({ data: SQL.join("") });
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
MODEL_CREATE_TABLE: function (model, configsDB) {
|
|
76
|
+
let q = beeORM.quote;
|
|
77
|
+
let SQL = "";
|
|
78
|
+
|
|
79
|
+
SQL = `CREATE TABLE IF NOT EXISTS ${q(model.table)} (`;
|
|
80
|
+
|
|
81
|
+
for (let field in model.schema)
|
|
82
|
+
SQL += `\n ${q(field)} ${fieldType[configsDB.drive](
|
|
83
|
+
model.schema[field]
|
|
84
|
+
)},`; // TODO criar funcao para relacionamentos.
|
|
85
|
+
|
|
86
|
+
SQL = SQL.slice(0, SQL.length - 1);
|
|
87
|
+
|
|
88
|
+
if (model.indexes) {
|
|
89
|
+
if (model.indexes.keys)
|
|
90
|
+
SQL += `,\n PRIMARY KEY (${q(model.indexes.keys)})`;
|
|
91
|
+
|
|
92
|
+
//TODO fazer uniques e cia. colocar em funcao.
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
SQL += `\n) ENGINE=${configsDB.engine} DEFAULT CHARSET=${configsDB.charset};\n\n`;
|
|
96
|
+
|
|
97
|
+
return SQL;
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
MODEL_CREATE_CONSTRAINT: function (model, configsDB) {
|
|
101
|
+
let q = beeORM.quote;
|
|
102
|
+
let SQL = "\n\n\n";
|
|
103
|
+
|
|
104
|
+
SQL += `/*----- Constraints for table ${q(model.table)} -----*/\n`;
|
|
105
|
+
|
|
106
|
+
for (let field in model.relations)
|
|
107
|
+
SQL += `\n\n ALTER TABLE ${q(model.table)}\n ADD CONSTRAINT ${q(
|
|
108
|
+
`FK_${model.relations[field].split(".")[0]}_X_${
|
|
109
|
+
model.table
|
|
110
|
+
}_${field}`.slice(0, 64)
|
|
111
|
+
)}
|
|
112
|
+
FOREIGN KEY (${field})
|
|
113
|
+
REFERENCES ${
|
|
114
|
+
model.relations[field].split(".")[0]
|
|
115
|
+
} (${field})
|
|
116
|
+
${"ON DELETE CASCADE"}
|
|
117
|
+
${"ON UPDATE CASCADE"};
|
|
118
|
+
\n\n`;
|
|
119
|
+
|
|
120
|
+
//SQL += `-- COMMIT; \n\n`
|
|
121
|
+
|
|
122
|
+
return SQL;
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
mssql: {
|
|
127
|
+
// TODO next version
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
mongoDB: {
|
|
131
|
+
// TODO next version
|
|
132
|
+
},
|
|
133
|
+
};
|
package/lib/DEV/beeDEV.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
const log = require('../beeHive/log')
|
|
2
|
-
const beeDBA = require('../DBA/beeDBA')
|
|
3
|
-
const glob = require('glob')
|
|
4
|
-
const fs = require('fs')
|
|
5
|
-
|
|
6
|
-
module.exports = async function(req, res, next) {
|
|
7
|
-
if(!global.configs.dev) return res.send(null)
|
|
8
|
-
|
|
9
|
-
res.header("Access-Control-Allow-Origin", "*")
|
|
10
|
-
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
|
|
11
|
-
|
|
12
|
-
var result = {}
|
|
13
|
-
|
|
14
|
-
switch(req.params.action) {
|
|
15
|
-
case 'MODEL_STATEMENT_EXECUTE':
|
|
16
|
-
result = await beeDBA.actions[global.configs.databases.default.type || 'mysql'][req.params.action](req, res, next)
|
|
17
|
-
break
|
|
18
|
-
|
|
19
|
-
case 'MODEL_CREATE_DB':
|
|
20
|
-
result = beeDBA.actions[global.configs.databases.default.type || 'mysql'][req.params.action](req, res, next)
|
|
21
|
-
break
|
|
22
|
-
|
|
23
|
-
case 'PATHS':
|
|
24
|
-
return glob("**/*", {},
|
|
25
|
-
function (err, files) {
|
|
26
|
-
res.send({ data: files })
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
case 'PATH_DATA':
|
|
30
|
-
return fs.readFile(`${require.main.path}/${req.body.path}`,
|
|
31
|
-
function (err, data) {
|
|
32
|
-
res.send({ data: { path_data: Buffer.from(data).toString(), path: req.body.path } })
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
default:
|
|
36
|
-
result = {...global.configs, env : process.env}
|
|
37
|
-
log('# Started a remote connection.')
|
|
38
|
-
break
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
res.send(result)
|
|
1
|
+
const log = require('../beeHive/log')
|
|
2
|
+
const beeDBA = require('../DBA/beeDBA')
|
|
3
|
+
const glob = require('glob')
|
|
4
|
+
const fs = require('fs')
|
|
5
|
+
|
|
6
|
+
module.exports = async function(req, res, next) {
|
|
7
|
+
if(!global.configs.dev) return res.send(null)
|
|
8
|
+
|
|
9
|
+
res.header("Access-Control-Allow-Origin", "*")
|
|
10
|
+
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
|
|
11
|
+
|
|
12
|
+
var result = {}
|
|
13
|
+
|
|
14
|
+
switch(req.params.action) {
|
|
15
|
+
case 'MODEL_STATEMENT_EXECUTE':
|
|
16
|
+
result = await beeDBA.actions[global.configs.databases.default.type || 'mysql'][req.params.action](req, res, next)
|
|
17
|
+
break
|
|
18
|
+
|
|
19
|
+
case 'MODEL_CREATE_DB':
|
|
20
|
+
result = beeDBA.actions[global.configs.databases.default.type || 'mysql'][req.params.action](req, res, next)
|
|
21
|
+
break
|
|
22
|
+
|
|
23
|
+
case 'PATHS':
|
|
24
|
+
return glob("**/*", {},
|
|
25
|
+
function (err, files) {
|
|
26
|
+
res.send({ data: files })
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
case 'PATH_DATA':
|
|
30
|
+
return fs.readFile(`${require.main.path}/${req.body.path}`,
|
|
31
|
+
function (err, data) {
|
|
32
|
+
res.send({ data: { path_data: Buffer.from(data).toString(), path: req.body.path } })
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
default:
|
|
36
|
+
result = {...global.configs, env : process.env}
|
|
37
|
+
log('# Started a remote connection.')
|
|
38
|
+
break
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
res.send(result)
|
|
42
42
|
}
|
package/lib/JWT/beeJWT.js
CHANGED
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
const CryptoJS = require("crypto-js");
|
|
2
|
-
const log = require("../beeHive/log");
|
|
3
|
-
|
|
4
|
-
function base64url(source) {
|
|
5
|
-
encodedSource = CryptoJS.enc.Base64.stringify(source);
|
|
6
|
-
encodedSource = encodedSource.replace(/=+$/, "");
|
|
7
|
-
encodedSource = encodedSource.replace(/\+/g, "-");
|
|
8
|
-
encodedSource = encodedSource.replace(/\//g, "_");
|
|
9
|
-
|
|
10
|
-
return encodedSource;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
module.exports = function token(_payload = null, header = {}) {
|
|
14
|
-
if (_payload) {
|
|
15
|
-
let { jwt, ...payload } = _payload;
|
|
16
|
-
|
|
17
|
-
if (!global.configs.jwt && !global.configs.jwt.secret)
|
|
18
|
-
return log("ERROR: no jwt.secret defined in configs.");
|
|
19
|
-
|
|
20
|
-
let secret = global.configs.jwt.secret;
|
|
21
|
-
let iat = new Date().getTime();
|
|
22
|
-
let exp = new Date().getTime() + 60 * 1000;
|
|
23
|
-
|
|
24
|
-
header = {
|
|
25
|
-
...header,
|
|
26
|
-
typ: header.typ || "JWT",
|
|
27
|
-
alg: header.alg || "HS256",
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
payload = { ...payload, iat: iat, exp: exp };
|
|
31
|
-
|
|
32
|
-
header = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(header)));
|
|
33
|
-
payload = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(payload)));
|
|
34
|
-
|
|
35
|
-
const signature = base64url(
|
|
36
|
-
CryptoJS.HmacSHA256(`${header}.${payload}`, secret)
|
|
37
|
-
);
|
|
38
|
-
const token = `${header}.${payload}.${signature}`;
|
|
39
|
-
|
|
40
|
-
this.data.jwt =
|
|
41
|
-
this.data.jwt && typeof this.data.jwt !== "object"
|
|
42
|
-
? [this.data.jwt]
|
|
43
|
-
: this.data.jwt;
|
|
44
|
-
|
|
45
|
-
this.data.jwt = !this.data.jwt ? token : this.data.jwt.concat(token);
|
|
46
|
-
|
|
47
|
-
this.counters.jwt = (this.counters.jwt || 0) + 1;
|
|
48
|
-
|
|
49
|
-
log("JWT created: " + this.data.jwt);
|
|
50
|
-
|
|
51
|
-
return this;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return {
|
|
55
|
-
...this,
|
|
56
|
-
verify: function (token) {
|
|
57
|
-
const secret = global.configs.jwt.secret;
|
|
58
|
-
const array = token.split(".");
|
|
59
|
-
const header = array[0];
|
|
60
|
-
const payload = array[1];
|
|
61
|
-
|
|
62
|
-
const signature = base64url(
|
|
63
|
-
CryptoJS.HmacSHA256(`${header}.${payload}`, secret)
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
return token === `${header}.${payload}.${signature}`
|
|
67
|
-
? new Buffer.from(payload, "base64").toString("ascii")
|
|
68
|
-
: false;
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
};
|
|
1
|
+
const CryptoJS = require("crypto-js");
|
|
2
|
+
const log = require("../beeHive/log");
|
|
3
|
+
|
|
4
|
+
function base64url(source) {
|
|
5
|
+
encodedSource = CryptoJS.enc.Base64.stringify(source);
|
|
6
|
+
encodedSource = encodedSource.replace(/=+$/, "");
|
|
7
|
+
encodedSource = encodedSource.replace(/\+/g, "-");
|
|
8
|
+
encodedSource = encodedSource.replace(/\//g, "_");
|
|
9
|
+
|
|
10
|
+
return encodedSource;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
module.exports = function token(_payload = null, header = {}) {
|
|
14
|
+
if (_payload) {
|
|
15
|
+
let { jwt, ...payload } = _payload;
|
|
16
|
+
|
|
17
|
+
if (!global.configs.jwt && !global.configs.jwt.secret)
|
|
18
|
+
return log("ERROR: no jwt.secret defined in configs.");
|
|
19
|
+
|
|
20
|
+
let secret = global.configs.jwt.secret;
|
|
21
|
+
let iat = new Date().getTime();
|
|
22
|
+
let exp = new Date().getTime() + 60 * 1000;
|
|
23
|
+
|
|
24
|
+
header = {
|
|
25
|
+
...header,
|
|
26
|
+
typ: header.typ || "JWT",
|
|
27
|
+
alg: header.alg || "HS256",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
payload = { ...payload, iat: iat, exp: exp };
|
|
31
|
+
|
|
32
|
+
header = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(header)));
|
|
33
|
+
payload = base64url(CryptoJS.enc.Utf8.parse(JSON.stringify(payload)));
|
|
34
|
+
|
|
35
|
+
const signature = base64url(
|
|
36
|
+
CryptoJS.HmacSHA256(`${header}.${payload}`, secret)
|
|
37
|
+
);
|
|
38
|
+
const token = `${header}.${payload}.${signature}`;
|
|
39
|
+
|
|
40
|
+
this.data.jwt =
|
|
41
|
+
this.data.jwt && typeof this.data.jwt !== "object"
|
|
42
|
+
? [this.data.jwt]
|
|
43
|
+
: this.data.jwt;
|
|
44
|
+
|
|
45
|
+
this.data.jwt = !this.data.jwt ? token : this.data.jwt.concat(token);
|
|
46
|
+
|
|
47
|
+
this.counters.jwt = (this.counters.jwt || 0) + 1;
|
|
48
|
+
|
|
49
|
+
log("JWT created: " + this.data.jwt);
|
|
50
|
+
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
...this,
|
|
56
|
+
verify: function (token) {
|
|
57
|
+
const secret = global.configs.jwt.secret;
|
|
58
|
+
const array = token.split(".");
|
|
59
|
+
const header = array[0];
|
|
60
|
+
const payload = array[1];
|
|
61
|
+
|
|
62
|
+
const signature = base64url(
|
|
63
|
+
CryptoJS.HmacSHA256(`${header}.${payload}`, secret)
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return token === `${header}.${payload}.${signature}`
|
|
67
|
+
? new Buffer.from(payload, "base64").toString("ascii")
|
|
68
|
+
: false;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
};
|