beech-api 3.5.12 → 3.7.23
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/README.md +400 -185
- package/index.js +2 -3
- package/package.json +9 -5
- package/packages/cli/beech +2 -2
- package/packages/cli/bin/{beech.js → beech-app.js} +86 -28
- package/packages/cli/bin/beech-service.js +40 -212
- package/packages/cli/core/auth/Credentials.js +76 -35
- package/packages/cli/core/auth/Passport.js +318 -188
- package/packages/cli/core/auth/_Request.js +12 -0
- package/packages/cli/core/configure/_gitignore +9 -1
- package/packages/cli/core/configure/app.config-basic.js +10 -10
- package/packages/cli/core/configure/app.config-sequelize.js +12 -12
- package/packages/cli/core/configure/beech.config.js +8 -0
- package/packages/cli/core/configure/global.config-basic.js +4 -4
- package/packages/cli/core/configure/global.config-sequelize.js +4 -4
- package/packages/cli/core/configure/passport.config.js +5 -15
- package/packages/cli/core/databases/mysql.js +53 -29
- package/packages/cli/core/databases/sequelize.js +135 -107
- package/packages/cli/core/databases/test.js +168 -0
- package/packages/cli/core/file-walk/file-walk.js +31 -14
- package/packages/cli/core/generator/_add-on +15 -2
- package/packages/cli/core/generator/_endpoints +15 -82
- package/packages/cli/core/generator/_endpoints_basic +39 -0
- package/packages/cli/core/generator/_help +12 -11
- package/packages/cli/core/generator/_help_create +11 -0
- package/packages/cli/core/generator/{_service → _help_service} +4 -1
- package/packages/cli/core/generator/_models +20 -15
- package/packages/cli/core/generator/{_basic-models → _models_basic} +0 -2
- package/packages/cli/core/generator/_package +4 -3
- package/packages/cli/core/generator/index.js +302 -95
- package/packages/cli/core/helpers/math.js +55 -0
- package/packages/cli/core/helpers/poolEntity.js +31 -0
- package/packages/cli/core/index.js +96 -28
- package/packages/cli/core/origin/index.js +2 -0
- package/packages/cli/core/origin/whitelist/cors.js +91 -0
- package/packages/cli/core/services/http.express.js +338 -203
- package/packages/cli/core/test/utils.js +5 -5
- package/packages/lib/index.js +4 -0
- package/packages/lib/src/endpoint.js +98 -0
- package/packages/lib/src/salt.js +3 -0
- package/packages/lib/src/schema.js +62 -0
- package/packages/lib/src/user.js +196 -0
- package/packages/cli/core/generator/_create +0 -7
- package/packages/lib/beech.js +0 -136
- package/packages/lib/salt.js +0 -3
- package/packages/package.json +0 -20
- package/packages/src-/Add-on.js +0 -9
- package/packages/src-/endpoints/hello-endpoints.js +0 -118
- package/packages/src-/endpoints/test2-endpoints.js +0 -75
- package/packages/src-/endpoints/testSequalize-endpoints.js +0 -23
- package/packages/src-/helpers/Test2.js +0 -11
- package/packages/src-/helpers/my/Test.js +0 -11
- package/packages/src-/helpers/my/Test2.js +0 -11
- package/packages/src-/helpers/my/Test3.js +0 -11
- package/packages/src-/helpers/my/Test4.js +0 -11
- package/packages/src-/models/Jubu.js +0 -29
- package/packages/src-/models/Jubu2.js +0 -20
- package/packages/src-/models/Map_master.js +0 -22
- package/packages/src-/models/Test.js +0 -29
- package/packages/src-/models/Test2.js +0 -29
- package/packages/src-/models/User2Sequelize.js +0 -23
- package/packages/src-/models/Users-sqlite.js +0 -21
- package/packages/src-/models/Users.js +0 -53
- package/packages/src-/models/Uuuuuxxx.js +0 -23
- package/packages/src-/models/xxx/Uuuuuxxx.js +0 -23
- /package/packages/cli/core/generator/{_basic-helpers → _helpers_basic} +0 -0
|
@@ -1,177 +1,263 @@
|
|
|
1
1
|
const appRoot = require("app-root-path");
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const passport_config_file = appRoot + "
|
|
3
|
+
const passport_config_file = appRoot + "\\passport.config.js";
|
|
4
4
|
const md5 = require("md5");
|
|
5
|
-
const secret = require("../../../lib/salt").salt;
|
|
5
|
+
const secret = require("../../../lib/src/salt").salt;
|
|
6
|
+
const { findPassportPk } = require("../helpers/poolEntity");
|
|
7
|
+
const { Rand } = require("../helpers/math");
|
|
6
8
|
const { QueryTypes } = require("sequelize");
|
|
7
9
|
|
|
8
10
|
module.exports = {
|
|
9
11
|
init() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
passportTable,
|
|
47
|
-
passportUsernameField,
|
|
48
|
-
username,
|
|
49
|
-
passportPasswordField,
|
|
50
|
-
md5(password + secret)
|
|
51
|
-
], (err, result) => {
|
|
52
|
-
if (err) {
|
|
53
|
-
return done(err, null);
|
|
54
|
-
} else {
|
|
55
|
-
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
} else if (pool_base == "sequelize") {
|
|
59
|
-
// pool base is Sequelize
|
|
60
|
-
try {
|
|
61
|
-
let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
|
|
62
|
-
replacements: {
|
|
63
|
-
fields: passportFields,
|
|
64
|
-
username: username,
|
|
65
|
-
password: md5(password + secret)
|
|
66
|
-
},
|
|
67
|
-
type: QueryTypes.SELECT
|
|
68
|
-
});
|
|
69
|
-
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
70
|
-
} catch (error) {
|
|
71
|
-
return done(error, null);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
return done({ error: "Base pool SQL error." }, null);
|
|
75
|
-
}
|
|
76
|
-
} else {
|
|
77
|
-
return done(null, null, true);
|
|
78
|
-
}
|
|
79
|
-
}));
|
|
80
|
-
// passport jwt payload (decoder)
|
|
81
|
-
passport.use(new JWTStrategy({
|
|
82
|
-
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
|
|
83
|
-
secretOrKey: passport_config.secret
|
|
84
|
-
}, async (jwtPayload, done) => {
|
|
85
|
-
let pool = eval("sql." + passport_config.model.name);
|
|
86
|
-
if (pool) {
|
|
87
|
-
if (pool_base == "basic") {
|
|
88
|
-
// pool base is MySQL
|
|
89
|
-
pool.query("SELECT " + passportFields + " FROM ?? WHERE id = ?", [
|
|
90
|
-
passportTable,
|
|
91
|
-
jwtPayload.id
|
|
92
|
-
], (err, result) => {
|
|
93
|
-
if (err) {
|
|
94
|
-
return done(err, null);
|
|
95
|
-
} else {
|
|
96
|
-
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
} else if (pool_base == "sequelize") {
|
|
100
|
-
// pool base is Sequelize
|
|
101
|
-
try {
|
|
102
|
-
let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE id = :id", {
|
|
103
|
-
replacements: {
|
|
104
|
-
id: jwtPayload.id
|
|
105
|
-
},
|
|
106
|
-
type: QueryTypes.SELECT
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
try {
|
|
14
|
+
var passport_config;
|
|
15
|
+
const p1 = new Promise((resolve, reject) => {
|
|
16
|
+
/**
|
|
17
|
+
* Resolve ref:
|
|
18
|
+
* [0=passport_file_exists, 1=jwt_allow, 2=db_passport_map_is_connect]
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
if (fs.existsSync(passport_config_file)) {
|
|
22
|
+
const auth = require("./Credentials");
|
|
23
|
+
passport_config = require(passport_config_file);
|
|
24
|
+
if (passport_config.jwt_allow) {
|
|
25
|
+
global.Credentials = auth.credentials;
|
|
26
|
+
// loop check db connect is true
|
|
27
|
+
fs.readFile("./app.config.js", "utf-8", (err, data) => {
|
|
28
|
+
if(err) {
|
|
29
|
+
reject(err);
|
|
30
|
+
} else {
|
|
31
|
+
let mineConfDb = eval(data).database_config;
|
|
32
|
+
mineConfDb.filter((e, k) => {
|
|
33
|
+
if(e.name == passport_config.model.name) {
|
|
34
|
+
if(e.is_connect) {
|
|
35
|
+
resolve([true, true, true]);
|
|
36
|
+
} else {
|
|
37
|
+
// Database of Passport mapped is closed.
|
|
38
|
+
resolve([true, true, false]);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
if(mineConfDb.length == k+1) {
|
|
42
|
+
// Database of Passport mapped is Name not match.
|
|
43
|
+
resolve([true, true, null]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
107
48
|
});
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
49
|
+
} else {
|
|
50
|
+
global.Credentials = [];
|
|
51
|
+
resolve([true, false, null]);
|
|
111
52
|
}
|
|
112
53
|
} else {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
}));
|
|
119
|
-
|
|
120
|
-
// declare head authentication enpoint for all strategy
|
|
121
|
-
let auth_endpoint = (passport_config.auth_endpoint) ? (passport_config.auth_endpoint[ 0 ] === "/" ? passport_config.auth_endpoint : "/" + passport_config.auth_endpoint) : "/authentication";
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Passport Google Strategy
|
|
125
|
-
*
|
|
126
|
-
*/
|
|
127
|
-
let google_callbackURL = (passport_config.strategy.google.callbackURL) ? (passport_config.strategy.google.callbackURL[ 0 ] === "/" ? passport_config.strategy.google.callbackURL : "/" + passport_config.strategy.google.callbackURL) : "/google/callback";
|
|
128
|
-
passport.use(new GoogleStrategy({
|
|
129
|
-
clientID: passport_config.strategy.google.client_id,
|
|
130
|
-
clientSecret: passport_config.strategy.google.client_secret,
|
|
131
|
-
callbackURL: auth_endpoint + google_callbackURL
|
|
132
|
-
}, (accessToken, refreshToken, profile, done) => {
|
|
133
|
-
// find google user
|
|
134
|
-
let googleIdField = (passport_config.strategy.google.local_profile_fields.google_id) ? passport_config.strategy.google.local_profile_fields.google_id : "google_id";
|
|
135
|
-
this.findOrCreate(passport_config, "google", passportFields, passportTable, accessToken, refreshToken, profile, googleIdField, (err, res, dbFailed) => {
|
|
136
|
-
if (err) {
|
|
137
|
-
return done(err);
|
|
138
|
-
} else {
|
|
139
|
-
return done(err, res, dbFailed);
|
|
54
|
+
global.Credentials = [];
|
|
55
|
+
//const Requests = require("./_Request");
|
|
56
|
+
//global.Credentials = Requests.requests; ----> // [Closed] TODO check passport.config file if not exists show error when file src/ using the JWT (maybe for show JWT is ON/OFF)
|
|
57
|
+
resolve([false, null, null]);
|
|
140
58
|
}
|
|
141
59
|
});
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
60
|
+
Promise.all([p1]).then(final => {
|
|
61
|
+
// Checking passport file, allow, mapped
|
|
62
|
+
if(final[0][0] && final[0][1] && final[0][2]) {
|
|
63
|
+
var passport = require("passport")
|
|
64
|
+
LocalStrategy = require("passport-local").Strategy,
|
|
65
|
+
GoogleStrategy = require("passport-google-oauth").OAuth2Strategy,
|
|
66
|
+
FacebookStrategy = require('passport-facebook').Strategy;
|
|
67
|
+
var passportJWT = require("passport-jwt"),
|
|
68
|
+
JWTStrategy = passportJWT.Strategy,
|
|
69
|
+
ExtractJWT = passportJWT.ExtractJwt;
|
|
70
|
+
// declare constant
|
|
71
|
+
var passportUsernameField = passport_config.model.username_field || "username";
|
|
72
|
+
var passportPasswordField = passport_config.model.password_field || "password";
|
|
73
|
+
var passportTable = passport_config.model.table || "users";
|
|
74
|
+
var pool = eval("sql." + passport_config.model.name);
|
|
75
|
+
// find passport primary key
|
|
76
|
+
findPassportPk(pool_base, pool, passportTable, passport_config.model.fields, (err, passportFields) => {
|
|
77
|
+
if(err) {
|
|
78
|
+
resolve([err, true, true, true]);
|
|
79
|
+
} else {
|
|
80
|
+
// Passport initial with token (encoder)
|
|
81
|
+
passport.use(new LocalStrategy({
|
|
82
|
+
usernameField: passportUsernameField,
|
|
83
|
+
passwordField: passportPasswordField
|
|
84
|
+
}, async (username, password, done) => {
|
|
85
|
+
if (pool) {
|
|
86
|
+
if (pool_base == "basic") {
|
|
87
|
+
// pool base is MySQL
|
|
88
|
+
pool.query("SELECT " + passportFields + " FROM ?? WHERE ?? = ? AND ?? = ?", [
|
|
89
|
+
passportTable,
|
|
90
|
+
passportUsernameField,
|
|
91
|
+
username,
|
|
92
|
+
passportPasswordField,
|
|
93
|
+
md5(password + secret)
|
|
94
|
+
], (err, result) => {
|
|
95
|
+
if (err) {
|
|
96
|
+
return done(err, null);
|
|
97
|
+
} else {
|
|
98
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
} else if (pool_base == "sequelize") {
|
|
102
|
+
// pool base is Sequelize
|
|
103
|
+
try {
|
|
104
|
+
let result = await pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + passportUsernameField + " = :username AND " + passportPasswordField + " = :password", {
|
|
105
|
+
replacements: {
|
|
106
|
+
fields: passportFields,
|
|
107
|
+
username: username,
|
|
108
|
+
password: md5(password + secret)
|
|
109
|
+
},
|
|
110
|
+
type: QueryTypes.SELECT
|
|
111
|
+
});
|
|
112
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
113
|
+
} catch (error) {
|
|
114
|
+
return done(error, null);
|
|
115
|
+
}
|
|
116
|
+
} else {
|
|
117
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
return done(null, null, true);
|
|
121
|
+
}
|
|
122
|
+
}));
|
|
123
|
+
|
|
124
|
+
// Passport jwt payload (decoder)
|
|
125
|
+
passport.use(new JWTStrategy({
|
|
126
|
+
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
|
|
127
|
+
secretOrKey: passport_config.secret
|
|
128
|
+
}, async (jwtPayload, done) => {
|
|
129
|
+
let pool = eval("sql." + passport_config.model.name);
|
|
130
|
+
if (pool) {
|
|
131
|
+
if (pool_base == "basic") {
|
|
132
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", (err, pk) => {
|
|
133
|
+
if(err) {
|
|
134
|
+
return done(err, null);
|
|
135
|
+
} else {
|
|
136
|
+
let fieldPk = pk[0].Column_name;
|
|
137
|
+
// pool base is MySQL
|
|
138
|
+
pool.query("SELECT " + passportFields + " FROM ?? WHERE " + fieldPk + " = ?", [
|
|
139
|
+
passportTable,
|
|
140
|
+
jwtPayload[fieldPk]
|
|
141
|
+
], (err, result) => {
|
|
142
|
+
if (err) {
|
|
143
|
+
return done(err, null);
|
|
144
|
+
} else {
|
|
145
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
} else if (pool_base == "sequelize") {
|
|
151
|
+
// pool base is Sequelize
|
|
152
|
+
try {
|
|
153
|
+
pool.query("SHOW KEYS FROM " + passportTable + " WHERE Key_name = 'PRIMARY'", { type: QueryTypes.SELECT }).then((pk) => {
|
|
154
|
+
let fieldPk = pk[0].Column_name;
|
|
155
|
+
pool.query("SELECT " + passportFields + " FROM " + passportTable + " WHERE " + fieldPk + " = :pk", {
|
|
156
|
+
replacements: {
|
|
157
|
+
pk: + jwtPayload[fieldPk]
|
|
158
|
+
},
|
|
159
|
+
type: QueryTypes.SELECT,
|
|
160
|
+
}).then((result) => {
|
|
161
|
+
return done(null, JSON.parse(JSON.stringify(result[ 0 ] || null)));
|
|
162
|
+
}).catch((err) => {
|
|
163
|
+
return done(err, null);
|
|
164
|
+
});
|
|
165
|
+
}).catch((err) => {
|
|
166
|
+
return done(err, null);
|
|
167
|
+
});
|
|
168
|
+
} catch (error) {
|
|
169
|
+
return done(error, null);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
return done(null, null, true);
|
|
176
|
+
}
|
|
177
|
+
}));
|
|
178
|
+
|
|
179
|
+
// Declare head authentication enpoint for all strategy
|
|
180
|
+
let auth_endpoint = (passport_config.auth_endpoint) ? (passport_config.auth_endpoint[ 0 ] === "/" ? passport_config.auth_endpoint : "/" + passport_config.auth_endpoint) : "/authentication";
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Passport Google Strategy
|
|
184
|
+
*
|
|
185
|
+
*/
|
|
186
|
+
let google_callbackURL = (passport_config.strategy.google.callbackURL) ? (passport_config.strategy.google.callbackURL[ 0 ] === "/" ? passport_config.strategy.google.callbackURL : "/" + passport_config.strategy.google.callbackURL) : "/google/callback";
|
|
187
|
+
passport.use(new GoogleStrategy({
|
|
188
|
+
clientID: passport_config.strategy.google.client_id,
|
|
189
|
+
clientSecret: passport_config.strategy.google.client_secret,
|
|
190
|
+
callbackURL: auth_endpoint + google_callbackURL
|
|
191
|
+
}, (accessToken, refreshToken, profile, done) => {
|
|
192
|
+
// find google user
|
|
193
|
+
let googleIdField = (passport_config.strategy.google.local_profile_fields.google_id) ? passport_config.strategy.google.local_profile_fields.google_id : "google_id";
|
|
194
|
+
this.findOrCreate(passport_config, "google", passportFields, passportTable, accessToken, refreshToken, profile, googleIdField, (err, res, dbFailed) => {
|
|
195
|
+
if (err) {
|
|
196
|
+
return done(err);
|
|
197
|
+
} else {
|
|
198
|
+
return done(err, res, dbFailed);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Passport Facebook Strategy
|
|
205
|
+
*
|
|
206
|
+
*/
|
|
207
|
+
let facebook_callbackURL = (passport_config.strategy.facebook.callbackURL) ? (passport_config.strategy.facebook.callbackURL[ 0 ] === "/" ? passport_config.strategy.facebook.callbackURL : "/" + passport_config.strategy.facebook.callbackURL) : "/facebook/callback";
|
|
208
|
+
// merge fields permisions
|
|
209
|
+
let allow_permisions_fields = [ ...new Set([ ...[ 'id', 'displayName', 'name', 'photos', 'email', 'location' ], ...(passport_config.strategy.facebook.profileFieldsAllow || []) ]) ];
|
|
210
|
+
passport.use(new FacebookStrategy({
|
|
211
|
+
clientID: passport_config.strategy.facebook.app_id,
|
|
212
|
+
clientSecret: passport_config.strategy.facebook.app_secret,
|
|
213
|
+
callbackURL: auth_endpoint + facebook_callbackURL,
|
|
214
|
+
profileFields: allow_permisions_fields
|
|
215
|
+
}, (accessToken, refreshToken, profile, done) => {
|
|
216
|
+
// Check if the email permission is granted
|
|
217
|
+
/**
|
|
218
|
+
* Update : Permissions Reference for Meta Technologies APIs.
|
|
219
|
+
* Starting on or after October 27, 2023, if your app requests permission to use an endpoint to access an app user’s data
|
|
220
|
+
* Learn more : https://developers.facebook.com/docs/permissions
|
|
221
|
+
*
|
|
222
|
+
* From now! Disabled check if email permission granted
|
|
223
|
+
*/
|
|
224
|
+
//if (!profile.emails || profile.emails.length === 0) {
|
|
225
|
+
// return done(new Error('Email permission not granted.'));
|
|
226
|
+
//}
|
|
227
|
+
// find facebook user
|
|
228
|
+
let faecbookIdField = (passport_config.strategy.facebook.local_profile_fields.facebook_id) ? passport_config.strategy.facebook.local_profile_fields.facebook_id : "facebook_id";
|
|
229
|
+
this.findOrCreate(passport_config, "facebook", passportFields, passportTable, accessToken, refreshToken, profile, faecbookIdField, (err, res, dbFailed) => {
|
|
230
|
+
if (err) {
|
|
231
|
+
return done(err);
|
|
232
|
+
} else {
|
|
233
|
+
return done(err, res, dbFailed);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}));
|
|
237
|
+
// Everything is Perfectly
|
|
238
|
+
resolve([null, true, true, true]);
|
|
239
|
+
} // end if check err findPassportPk
|
|
240
|
+
}); // end findPassportPk
|
|
241
|
+
} else if(final[0][0] && final[0][1] && final[0][2] === false) {
|
|
242
|
+
// Database connection mapped is Closed.
|
|
243
|
+
resolve([`Database connection name \`${passport_config.model.name}\` is CLOSED. Checking ON/OFF inside app.conifg.js file.`, true, true, false]);
|
|
244
|
+
} else if(final[0][0] && final[0][1] && !final[0][2]) {
|
|
245
|
+
// Passport Database connection name is NOT MATCH.
|
|
246
|
+
resolve([`Connection name \`${passport_config.model.name}\` with Passport model name mapped is NOT MATCH. Checking name to match it.`, true, true, false]);
|
|
247
|
+
} else if(final[0][0] && !final[0][1] && final[0][2] === null) {
|
|
248
|
+
// JWT not allow
|
|
249
|
+
resolve([null, true, false, null]);
|
|
166
250
|
} else {
|
|
167
|
-
|
|
168
|
-
|
|
251
|
+
// JWT file not found, Or JWT not intitialize.
|
|
252
|
+
resolve([null, false, null, null]);
|
|
253
|
+
} // end if check Resolve ref:
|
|
254
|
+
}).catch(err => {
|
|
255
|
+
throw err;
|
|
169
256
|
});
|
|
257
|
+
} catch (error) {
|
|
258
|
+
throw error;
|
|
170
259
|
}
|
|
171
|
-
|
|
172
|
-
} catch (error) {
|
|
173
|
-
throw error;
|
|
174
|
-
}
|
|
260
|
+
});
|
|
175
261
|
},
|
|
176
262
|
findOrCreate(passport_config, strategy_name, passportFields, passportTable, accessToken, refreshToken, profile, idField, cb) {
|
|
177
263
|
let pool = eval("sql." + passport_config.model.name);
|
|
@@ -185,7 +271,7 @@ module.exports = {
|
|
|
185
271
|
// prepare data for store
|
|
186
272
|
let usr = passport_config.model.username_field || "username";
|
|
187
273
|
let psw = passport_config.model.password_field || "password";
|
|
188
|
-
let
|
|
274
|
+
let usrProfile = Rand(10);
|
|
189
275
|
let md5Psw = md5(profile.id + secret);
|
|
190
276
|
// check strategy name for store
|
|
191
277
|
if (strategy_name == "google") {
|
|
@@ -206,34 +292,51 @@ module.exports = {
|
|
|
206
292
|
].filter((el) => el != null));
|
|
207
293
|
// Store google profile
|
|
208
294
|
if (pool_base == "basic") {
|
|
209
|
-
//
|
|
210
|
-
|
|
295
|
+
// check null and remove it.
|
|
296
|
+
let basicReplacement = new Set([
|
|
211
297
|
passportTable,
|
|
212
298
|
usr,
|
|
213
299
|
psw,
|
|
214
300
|
idField,
|
|
215
301
|
fields,
|
|
216
|
-
|
|
302
|
+
usrProfile,
|
|
217
303
|
md5Psw,
|
|
218
304
|
profile.id,
|
|
219
305
|
values
|
|
220
|
-
]
|
|
306
|
+
]);
|
|
307
|
+
delete basicReplacement.delete(null);
|
|
308
|
+
basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
309
|
+
// pool base is MySQL
|
|
310
|
+
pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
|
|
221
311
|
data.result = result;
|
|
222
312
|
data.google = profile;
|
|
223
313
|
cb(err, data);
|
|
224
314
|
});
|
|
225
315
|
} else if (pool_base == "sequelize") {
|
|
316
|
+
// check null and remove it.
|
|
317
|
+
let sequelizeReplacement = new Set([
|
|
318
|
+
passportTable,
|
|
319
|
+
usr,
|
|
320
|
+
psw,
|
|
321
|
+
idField,
|
|
322
|
+
fields,
|
|
323
|
+
usrProfile,
|
|
324
|
+
md5Psw,
|
|
325
|
+
profile.id,
|
|
326
|
+
values
|
|
327
|
+
]);
|
|
328
|
+
sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
226
329
|
// pool base is Sequelize
|
|
227
330
|
try {
|
|
228
|
-
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}
|
|
331
|
+
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
|
|
229
332
|
replacements: {
|
|
230
|
-
usr:
|
|
231
|
-
psw:
|
|
232
|
-
idField:
|
|
233
|
-
|
|
333
|
+
usr: sequelizeReplacement[1],
|
|
334
|
+
psw: sequelizeReplacement[2],
|
|
335
|
+
idField: sequelizeReplacement[3],
|
|
336
|
+
usrProfile: usrProfile,
|
|
234
337
|
md5Psw: md5Psw,
|
|
235
338
|
profileId: profile.id,
|
|
236
|
-
values: values
|
|
339
|
+
values: values.length ? values : []
|
|
237
340
|
},
|
|
238
341
|
type: QueryTypes.INSERT
|
|
239
342
|
});
|
|
@@ -244,7 +347,7 @@ module.exports = {
|
|
|
244
347
|
cb(error, null);
|
|
245
348
|
}
|
|
246
349
|
} else {
|
|
247
|
-
cb({ error: "Base pool
|
|
350
|
+
cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
248
351
|
}
|
|
249
352
|
} else { // find found
|
|
250
353
|
let users = {};
|
|
@@ -255,7 +358,18 @@ module.exports = {
|
|
|
255
358
|
cb(err, users);
|
|
256
359
|
}
|
|
257
360
|
} else if (strategy_name == "facebook") {
|
|
258
|
-
|
|
361
|
+
// STEP 1: check email empty for username
|
|
362
|
+
if(passport_config.strategy.facebook.local_profile_fields.email) { // Now support only Google, Because Facebook requests permission: https://developers.facebook.com/docs/permissions
|
|
363
|
+
if(!profile.emails) {
|
|
364
|
+
return cb(JSON.stringify({
|
|
365
|
+
code: 500,
|
|
366
|
+
status: "ERR_FACEBOOK_PROFILE_PERMISSIONS",
|
|
367
|
+
error: "Facebook needed allow `email` and `public_profile` permisions: https://developers.facebook.com/docs/permissions"
|
|
368
|
+
}), null);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// STEP 2: find not found and create
|
|
372
|
+
if (!result[ 0 ]) {
|
|
259
373
|
// filter fields
|
|
260
374
|
let fields = [].concat.apply([], [
|
|
261
375
|
(passport_config.strategy.facebook.local_profile_fields.name) ? passport_config.strategy.facebook.local_profile_fields.name : null,
|
|
@@ -266,40 +380,57 @@ module.exports = {
|
|
|
266
380
|
// fileter values
|
|
267
381
|
let values = [].concat.apply([], [
|
|
268
382
|
(passport_config.strategy.facebook.local_profile_fields.name) ? profile.displayName : null,
|
|
269
|
-
(passport_config.strategy.facebook.local_profile_fields.email) ? profile.emails[ 0 ].value : null,
|
|
383
|
+
(passport_config.strategy.facebook.local_profile_fields.email) ? (profile.emails) ? profile.emails[ 0 ].value : null : null,
|
|
270
384
|
(passport_config.strategy.facebook.local_profile_fields.photos) ? profile.photos[ 0 ].value : null,
|
|
271
385
|
(passport_config.strategy.facebook.local_profile_fields.locate) ? profile._json.location.name : null
|
|
272
386
|
].filter((el) => el != null));
|
|
273
387
|
// Store facebook profile
|
|
274
388
|
if (pool_base == "basic") {
|
|
275
|
-
//
|
|
276
|
-
|
|
389
|
+
// check null and remove it.
|
|
390
|
+
let basicReplacement = new Set([
|
|
277
391
|
passportTable,
|
|
278
392
|
usr,
|
|
279
393
|
psw,
|
|
280
394
|
idField,
|
|
281
395
|
fields,
|
|
282
|
-
|
|
396
|
+
usrProfile,
|
|
283
397
|
md5Psw,
|
|
284
398
|
profile.id,
|
|
285
399
|
values
|
|
286
|
-
]
|
|
400
|
+
]);
|
|
401
|
+
delete basicReplacement.delete(null);
|
|
402
|
+
basicReplacement = Array.from(basicReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
403
|
+
// pool base is MySQL
|
|
404
|
+
pool.query("INSERT INTO ??(??,??,??" + (fields.length ? ",??)" : ")") + " VALUES(?,?,?" + (values.length ? ",?)" : ")"), basicReplacement, (err, result) => {
|
|
287
405
|
data.result = result;
|
|
288
406
|
data.facebook = profile;
|
|
289
407
|
cb(err, data);
|
|
290
408
|
});
|
|
291
409
|
} else if (pool_base == "sequelize") {
|
|
410
|
+
// check null and remove it.
|
|
411
|
+
let sequelizeReplacement = new Set([
|
|
412
|
+
passportTable,
|
|
413
|
+
usr,
|
|
414
|
+
psw,
|
|
415
|
+
idField,
|
|
416
|
+
fields,
|
|
417
|
+
usrProfile,
|
|
418
|
+
md5Psw,
|
|
419
|
+
profile.id,
|
|
420
|
+
values
|
|
421
|
+
]);
|
|
422
|
+
sequelizeReplacement = Array.from(sequelizeReplacement).filter(e => JSON.stringify(e) !== '[]');
|
|
292
423
|
// pool base is Sequelize
|
|
293
424
|
try {
|
|
294
|
-
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}
|
|
425
|
+
let result = await pool.query(`INSERT INTO ${passportTable}(${usr},${psw},${idField}${fields.length ? ',' + fields + ')' : ')'} VALUES(:usrProfile,:md5Psw,:profileId${values.length ? ',:values)' : ')'}`, {
|
|
295
426
|
replacements: {
|
|
296
|
-
usr:
|
|
297
|
-
psw:
|
|
298
|
-
idField:
|
|
299
|
-
|
|
427
|
+
usr: sequelizeReplacement[1],
|
|
428
|
+
psw: sequelizeReplacement[2],
|
|
429
|
+
idField: sequelizeReplacement[3],
|
|
430
|
+
usrProfile: usrProfile,
|
|
300
431
|
md5Psw: md5Psw,
|
|
301
432
|
profileId: profile.id,
|
|
302
|
-
values: values
|
|
433
|
+
values: values.length ? values : []
|
|
303
434
|
},
|
|
304
435
|
type: QueryTypes.INSERT
|
|
305
436
|
});
|
|
@@ -310,7 +441,7 @@ module.exports = {
|
|
|
310
441
|
cb(error, null);
|
|
311
442
|
}
|
|
312
443
|
} else {
|
|
313
|
-
cb({ error: "Base pool
|
|
444
|
+
cb({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
314
445
|
}
|
|
315
446
|
} else { // find found
|
|
316
447
|
let users = {};
|
|
@@ -352,11 +483,10 @@ module.exports = {
|
|
|
352
483
|
return cb(error, null);
|
|
353
484
|
}
|
|
354
485
|
} else {
|
|
355
|
-
return done({ error: "Base pool
|
|
486
|
+
return done({ error: "The Base pool error. UNKNOWN pool_base = '"+ pool_base +"'" }, null);
|
|
356
487
|
}
|
|
357
488
|
} catch (error) {
|
|
358
489
|
cb(error, null);
|
|
359
490
|
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
}
|
|
491
|
+
},
|
|
492
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
requests: (req, res, next) => {
|
|
3
|
+
console.log(res.statusCode);
|
|
4
|
+
console.log(req.url, req.method);
|
|
5
|
+
return res.status(401).json({
|
|
6
|
+
code: 404,
|
|
7
|
+
status: "404_NOT_FOUND",
|
|
8
|
+
error: "Passport config file not found.",
|
|
9
|
+
});
|
|
10
|
+
next();
|
|
11
|
+
},
|
|
12
|
+
};
|