UNPKG

isite

Version:

Create High Level Multi-Language Web Site [Fast and Easy]

1,204 lines (1,076 loc) 38.5 kB
module.exports = function init(____0) { ____0.$users = ____0.connectCollection({ collection: ____0.options.security.users_collection, db: ____0.options.security.db, }); ____0.$roles = ____0.connectCollection({ collection: ____0.options.security.roles_collection, db: ____0.options.security.db, }); /** Email Must Not Duplicate but can be null */ ____0.$users.dropIndexes(() => { ____0.$users.createIndex({ email: 1 }, { unique: true, partialFilterExpression: { email: { $exists: true } } }, () => {}); ____0.$users.createIndex({ username: 1 }, { unique: true, partialFilterExpression: { username: { $exists: true } } }, () => {}); ____0.$users.createIndex({ mobile: 1 }, { unique: true, partialFilterExpression: { mobile: { $exists: true } } }, () => {}); }); ____0.$roles.deleteDuplicate( { name: 1, }, (err, result) => { ____0.$roles.createUnique( { name: 1, }, () => {}, ); }, ); const security = function () {}; ____0.on(['please add user', '[user][save]'], (u, callback) => { callback = callback || function () {}; if (u.email === undefined || u.password === undefined) { callback( { message: 'Email or Password not set', }, null, ); return; } u.email = u.email.trim().toLowerCase(); security.getUser( { email: u.email, }, (err, u2) => { if (u2) { u.id = u2.id; if (u.role) { u.roles = [u.role]; delete u.role; } security.updateUser(u); callback(null, u); } else { if (u.role) { u.roles = [u.role]; delete u.role; } security.addUser(u); callback(null, u); } }, ); }); ____0.on(['[user][add]'], (u, callback) => { callback = callback || function () {}; security.addUser(u, (err, doc) => { callback(err, doc); }); }); ____0.on(['[user][update]'], (u, callback) => { callback = callback || function () {}; security.updateUser(u, (err, result) => { callback(err, result); }); }); ____0.on(['[user][delete]'], (u, callback) => { callback = callback || function () {}; security.deleteUser(u, (err, result) => { callback(err, result); }); }); security.$users = ____0.$users; security.roles = []; security.permissions = []; security.users = []; security.addKey = function (key) { security.users.push({ id: key, key: key, isAdmin: !0, email: key, password: key, $psermissions: ['*'], roles: ['*'], permissions: [ { name: '*', }, ], branchList: [ { company: { id: 1000000, }, branch: { id: 1000000, }, }, ], }); }; ____0.options.security.keys.forEach((key) => { if (!key) { return; } security.addKey(key); }); ____0.options.security.users.forEach((user, i) => { if (!user.id) { user.id = security.users.length + 1; } security.users.push({ is_admin: !0, $psermissions: ['*'], roles: ['*'], permissions: [ { name: '*', }, ], branch_list: [ { company: { id: 1000000, name_ar: ____0._x0f1xo('3758577347381765211627694539135245595691'), name_en: ____0._x0f1xo('3758577347381765211627694539135245595691'), users_count: 100, branch_count: 100, }, branch: { id: 1000000, name_ar: ____0._x0f1xo('3758577347381765211623734138825443129191'), name_en: ____0._x0f1xo('3758577347381765211623734138825443129191'), }, }, ], profile: { name: user.email, }, ref_info: { _id: '', }, ...user, }); }); security.addPermissions = function (list, callback) { callback = callback || function () {}; if (typeof list === 'string') { ____0.readFile(list, (err, file) => { if (!err) { let arr = ____0.fromJson(file.content); for (let i = 0; i < arr.length; i++) { security.permissions.push(arr[i]); } } callback(security.permissions); }); } else if (typeof list === 'object') { for (let i = 0; i < list.length; i++) { security.permissions.push(list[i]); } callback(security.permissions); } }; security.addRole = function (role, callback) { callback = callback || function () {}; ____0.$roles.add(role, (err, doc) => { if (!err && doc) { doc.module_name = 'custom'; security.addRoles([doc]); } callback(err, doc); }); }; security.updateRole = security.editeRole = function (role, callback) { callback = callback || function () {}; ____0.$roles.update(role, (err, result) => { if (!err) { security.roles.forEach((r) => { if (r.id == role.id) { r = role; } }); } callback(err, result); }); }; security.deleteRole = security.removeRole = function (role, callback) { callback = callback || function () {}; ____0.$roles.delete( { where: { id: role.id, }, }, (err, result) => { if (!err) { security.roles.forEach((r, i) => { if (r.name == role.name) { security.roles.splice(i, 1); } }); } callback(err, result); }, ); }; security.addRoles = function (list, callback) { callback = callback || function () {}; if (typeof list === 'string') { let arr = ____0.readFileSync(list); if (arr) { arr = ____0.fromJson(arr); for (let i = 0; i < arr.length; i++) { security.roles.push(arr[i]); } } callback(security.roles); } else if (Array.isArray(list)) { for (let i = 0; i < list.length; i++) { security.roles.push(list[i]); } callback(security.roles); } return security.roles; }; security.busy = !1; security.removeUserFinger = function (obj) { delete obj.$req; delete obj.$res; return obj; }; security.getUserFinger = function (obj) { let req = obj.$req; let res = obj.$res; let userFinger = { id: null, email: null, date: ____0.getDate(), ip: null, }; if (req && req.session && req.session.user) { req.session.user.profile = req.session.user.profile || {}; userFinger.id = req.session.user.id; userFinger.email = req.session.user.email; userFinger.name = req.session.user.profile.name || userFinger.email; userFinger.name_ar = req.session.user.profile.name_ar || userFinger.email; userFinger.name_en = req.session.user.profile.name_en || userFinger.email; userFinger.ip = req.ip; } else { } return userFinger; }; security.handleUser = function (_user) { _user.roles = _user.roles || []; _user.permissions = _user.permissions || []; _user.$permissions = []; _user.$permissions_info = []; _user.permissions.forEach((p) => { if (p.name && !_user.$permissions.some((_p) => _p == p.name)) { _user.$permissions.push(p.name); } }); if (_user.role) { security.roles .filter((r) => r.name == _user.role.name) .map((r) => r.permissions) .forEach((ps) => { ps.forEach((p) => { if (!_user.$permissions.some((_p) => _p == p)) { _user.$permissions.push(p); } security.permissions.forEach((p2) => { if (p2.name == p) { _user.$permissions_info.push(p2); } }); }); }); } _user.roles.forEach((role) => { if (role === '*') { _user.$permissions.push('*'); } delete role.permissions; security.roles .filter((r) => r.name == role.name) .map((r) => r.permissions) .forEach((ps) => { ps.forEach((p) => { if (_user.$permissions.filter((_p) => _p == p).length === 0) _user.$permissions.push(p); security.permissions.forEach((p2) => { if (p2.name == '*') { } if (p2.name == p) { _user.$permissions_info.push(p2); } }); }); }); }); return _user; }; security.loadAllUsers = function (callback) { callback = callback || function () {}; ____0.$users.findMany( { limit: 10000, select: {}, }, function (err, docs) { if (!docs) { docs = []; } callback(err, docs); }, ); }; security.loadAllRoles = function (callback) { callback = callback || function () {}; ____0.$roles.findMany( { limit: 10000, select: {}, }, function (err, docs) { if (!docs) { docs = []; } callback(err, docs); }, ); }; security.getUsers = function (options, callback) { callback = callback || function () {}; ____0.$users.findMany(options, function (err, docs, count) { if (!err && docs) { docs.forEach((doc) => { doc = Object.assign(doc, security.handleUser(doc)); }); } callback(err, docs, count); }); }; security.getUser = function (_user, callback) { callback = callback || function () {}; let index = security.users.findIndex( (user) => (_user.id && user.id == _user.id) || (_user._id && user._id == _user._id) || (!user.key && _user.email && user.email === _user.email.trim().toLowerCase()) || (!user.key && _user.username && user.username === _user.username.trim().toLowerCase()) || (!user.key && _user.mobile && user.mobile === _user.mobile.trim().toLowerCase()) || (user.key && _user.key && user.key === _user.key) || (user.key && _user.email && user.key === ____0.x0md50x(_user.email.trim().toLowerCase())), ); if (index !== -1) { security.users[index].$memory = !0; security.users[index] = security.handleUser(security.users[index]); callback(null, security.users[index]); return; } else { ____0.$users.findOne( { where: _user, select: {}, }, function (err, doc) { if (!err && doc) { doc = security.handleUser(doc); security.users.push(doc); } callback(err, doc); }, ); } }; security.isUserExists = function (user, callback) { callback = callback || function () {}; if (typeof user !== 'object' || typeof user.email !== 'string' || user.email == '') { callback({ message: 'email not set', }); return; } for (var i = 0; i < security.users.length; i++) { var _user = security.users[i]; if (_user.email == user.email.trim().toLowerCase() && _user.password == user.password) { callback(null, { ..._user }); return; } } ____0.$users.findOne( { where: { email: user.email.toLowerCase(), }, }, function (err, doc) { if (doc) { doc = security.handleUser(doc); callback(err, doc); security.users.push(doc); } else { callback( { message: 'User Not Exists', }, null, ); } }, ); }; security.login = function (user, callback) { callback = callback || function () {}; let $req = user.$req; let $res = user.$res; delete user.$req; delete user.$res; if (user && user.email && user.password) { user.email = user.email.trim().toLowerCase(); } else if (user && user.mobile && user.password) { user.mobile = user.mobile.trim().toLowerCase(); } else if (user && user.username && user.password) { user.username = user.username.trim().toLowerCase(); } for (var i = 0; i < security.users.length; i++) { var _user = security.users[i]; if ( (!_user.key && user.email && _user.email === user.email && _user.password === user.password) || (!_user.key && user.mobile && _user.mobile === user.mobile && _user.password === user.password) || (!_user.key && user.username && _user.username === user.username && _user.password === user.password) || (_user.key && user.key && _user.key === user.key) || (_user.key && user.email && user.password && _user.key === ____0.x0md50x(user.email + user.password)) ) { if ($req) { $req.session.user = _user; $req.session.user_id = _user.id; $req.session.$save(); } else { console.log('$req Not Exists in security.login'); } callback(null, _user); ____0.call('user login', { db: ____0.$users.db, collection: ____0.$users.collection, doc: _user, $res: $res, $req: $req, }); return; } } ____0.$users.findOne( { where: user, }, function (err, doc) { if (doc) { doc = security.handleUser(doc); security.users.push(doc); if ($req) { $req.session.user = doc; $req.session.user_id = doc.id; $req.session.$save(); } callback(null, doc); ____0.call('user login', { db: ____0.$users.db, collection: ____0.$users.collection, doc: doc, $res: $res, $req: $req, }); } else { if (err) { callback(err); } else { callback({ message: 'User Credential Not Correct ', }); } ____0.call('security error', { message: 'User Credential Not Correct ', }); } }, ); }; security.register = function (user, callback) { callback = callback || function () {}; let $req = user.$req; let $res = user.$res; delete user.$req; delete user.$res; if (user && user.email && user.password) { user.email = user.email.trim().toLowerCase(); } else if (user && user.mobile && user.password) { user.mobile = user.mobile.trim().toLowerCase(); } else if (user && user.username && user.password) { user.username = user.username.trim().toLowerCase(); } security.isUserExists(user, function (err, u) { if (u) { callback({ message: 'Register Error , User Exists', }); } else { user.profile = user.profile || { name: user.email, }; user.permissions = user.permissions || []; user.roles = user.roles || []; ____0.$users.insertOne(user, function (err, doc) { if (doc) { doc = security.handleUser(doc); security.users.push(doc); if ($req) { $req.session.user = doc; $req.session.user_id = doc.id; $req.session.$save(); } ____0.call('user register', { db: ____0.$users.db, collection: ____0.$users.collection, doc: doc, $res: $res, $req: $req, }); } callback(err, doc); if (err) { ____0.call('security error', err); } }); } }); }; security.logout = function (req, res, callback) { callback = callback || function () {}; if (security.isUserLogin(req, res)) { let _user = req.session.user; ____0.call('user logout', { db: ____0.$users.db, collection: ____0.$users.collection, doc: _user, }); } req.session.user = null; req.session.user_id = null; req.session.$save(); req.session.accessToken = req.host + new Date().getTime().toString() + '_' + Math.random(); req.session.accessToken = ____0.x0md50x(req.session.accessToken); req.session.$save(); res.set('Access-Token', req.session.accessToken); res.cookie('access_token', req.session.accessToken); callback(null, !0); }; security.addUser = function (user, callback) { callback = callback || function () {}; let $req = user.$req; let $res = user.$res; delete user.$req; delete user.$res; if (user && user.email && user.password) { user.email = user.email.trim().toLowerCase(); } else if (user && user.mobile && user.password) { user.mobile = user.mobile.trim().toLowerCase(); } else if (user && user.username && user.password) { user.username = user.username.trim().toLowerCase(); } if (!user.email) { user.email = user.username || user.mobile || 'Not Set'; } security.isUserExists(user, function (err, u) { if (u) { callback({ message: 'Error , User Exists', }); return; } else { user.profile = user.profile || {}; user.permissions = user.permissions || []; user.roles = user.roles || []; user.added_user_info = security.getUserFinger({ $req: $req, $res: $res, }); ____0.$users.insertOne(user, function (err, doc) { if (doc) { doc = Object.assign(doc, security.handleUser(doc)); security.users.push(doc); ____0.call('user add', { db: ____0.$users.db, collection: ____0.$users.collection, doc: doc, $req: $req, $res: $res, }); } callback(err, doc); if (err) { ____0.call('security error', err); } }); } }); }; security.updateUser = function (user, callback) { callback = callback || function () {}; let $req = user.$req; let $res = user.$res; delete user.$req; delete user.$res; let where = {}; if (user.id) { where.id = user.id; } else if (user.email) { where.email = user.email.trim().toLowerCase(); } else if (user.mobile) { where.mobile = user.mobile.trim().toLowerCase(); } else if (user.username) { where.username = user.username.trim().toLowerCase(); } ____0.$users.update( { where: where, set: user, $req: $req, $res: $res, }, function (err, result) { callback(err, result); if (!err && result && result.doc) { let index = security.users.findIndex((u) => u.id == result.doc.id); if (index >= 0) { security.users[index] = { ...security.users[index], ...result.doc }; } } }, ); }; security.deleteUser = function (user, callback) { callback = callback || function () {}; ____0.$users.deleteOne( { id: user.id, }, function (err, result) { if (err) { callback(err, result); } else { for (let i = 0; i < security.users.length; i++) { let element = security.users[i]; if (element.id == user.id) { security.users.splice(i, 1); break; } } callback(err, result); if (!err && result) { ____0.call('user delete', result); } } }, ); }; security.isUserLogin = function (req, res) { if (req.session.user) { return !0; } return !1; }; security.isUserHasPermission = function (req, res, permission) { let user = req.session.user; if (typeof permission == 'string') { let ok = !0; if (permission == '*') { return ok; } if (permission.startsWith('!')) { permission = permission.substring(1); ok = !1; } if (permission == 'login') { if (user) { return ok; } else { return !ok; } } if (user && user.$permissions && user.$permissions.some((p) => p == '*')) { return ok; } if (user && user.$permissions) { for (var i = 0; i < user.$permissions.length; i++) { var p = user.$permissions[i]; if (permission == p) { return ok; } } } return !ok; } return !1; }; security.isUserHasPermissions = function (req, res, permissions) { let user = req.session.user; let arr = []; let any = !0; if (typeof permissions === 'string') { if (permissions.like('*&&*')) { any = !1; } permissions = permissions.split('&&').join(',').split('||').join(',').split(','); } permissions.forEach((p) => { if (p) { arr.push(security.isUserHasPermission(req, res, p.trim())); } }); let out = !1; if (any) { arr.forEach((p) => { if (p) { out = !0; } }); return out || !1; } else { arr.forEach((p) => { if (!p) { out = !1; } }); return out && !0; } return !1; }; security.isUserHasRole = function (req, res, role) { let user = req.session.user; if (typeof role == 'string') { let ok = !0; if (role.startsWith('!')) { role = role.substring(1); ok = !1; } if (user && user.role) { if (role == user.role.name) { return ok; } if (user.role == '*') { return ok; } } if (user && user.roles) { for (var i = 0; i < user.roles.length; i++) { var p = user.roles[i]; if (role == p.name) { return ok; } if (p == '*') { return ok; } } } return !ok; } return !1; }; security.isUserHasRoles = function (req, res, roles) { let user = req.session.user; let arr = []; let any = !0; if (typeof roles === 'string') { if (roles.like('*&&*')) { any = !1; } roles = roles.split('&&').join(',').split('||').join(',').split(','); } roles.forEach((p) => { arr.push(security.isUserHasRole(req, res, p.trim())); }); let out = !1; if (any) { arr.forEach((p) => { if (p) { out = !0; } }); return out || !1; } else { arr.forEach((p) => { if (!p) { out = !1; } }); return out && !0; } return !1; }; security.getUserPermissions = function (req, res) { let user = req.session.user; if (user && user.permissions) { return user.permissions; } return []; }; security.getUserRoles = function (req, res) { let user = req.session.user; if (user && user.roles) { return user.roles; } return []; }; security.addUserPermission = function (id, permission, callback) { callback = callback || function () {}; let user = security.getUser( { id: id, }, function (err, user) { if (user) { if (typeof permission == 'string') { permission = { name: permission, }; } user.permissions.push(permission); ____0.$users.updateOne( { where: { id: id, }, set: { permissions: user.permissions, }, }, function (err, result) { if (err) { callback(err, result); } else { callback(err, result); } }, ); } else { callback(err, null); } }, ); }; ____0.post('/x-security/api/user/login', function (req, res) { let response = { accessToken: req.session.accessToken, }; if (req.body.$encript) { if (req.body.$encript === '64') { req.body.email = ____0.fromBase64(req.body.email); req.body.password = ____0.fromBase64(req.body.password); } else if (req.body.$encript === '123') { req.body.email = ____0.from123(req.body.email); req.body.password = ____0.from123(req.body.password); } } if (security.isUserLogin(req, res)) { response.error = 'Login Error , You Are Loged '; response.done = !0; res.json(response); return; } security.login( { ...req.body, $req: req, $res: res, }, function (err, user) { if (!err) { response.user = user; response.done = !0; } else { response.error = err.message; } res.json(response); }, ); }); ____0.post('/x-security/api/user/logout', function (req, res) { let response = {}; ____0.security.logout(req, res, () => { response.done = !0; response.accessToken = req.session.accessToken; res.json(response); }); }); ____0.post('/x-security/api/user/register', function (req, res) { let response = { accessToken: req.session.accessToken, }; if (req.body.$encript) { if (req.body.$encript === '64') { req.body.email = ____0.fromBase64(req.body.email); req.body.password = ____0.fromBase64(req.body.password); } else if (req.body.$encript === '123') { req.body.email = ____0.from123(req.body.email); req.body.password = ____0.from123(req.body.password); } } if (security.isUserLogin(req, res)) { response.error = 'Register Error , You Are Loged '; res.json(response); } else { security.register( { permissions: [], ...req.body, ip: req.ip, $req: req, $res: res, }, function (err, user) { if (!err) { response.user = user; response.done = !0; } else { response.error = err.message; } res.json(response); }, ); } }); ____0.post('/x-security/api/user/add', function (req, res) { let response = { accessToken: req.session.accessToken, }; if (!security.isUserLogin(req, res)) { response.error = 'Error , You Are Not Loged '; res.json(response); } else { security.addUser( { permissions: [], ...req.body, ip: req.ip, $req: req, $res: res, }, function (err, user) { if (!err) { response.user = user; response.done = !0; } else { response.error = err.message; } res.json(response); }, ); } }); ____0.post('/x-security/api/user/get', function (req, res) { let response = { accessToken: req.session.accessToken, }; security.getUser(req.body.id, function (err, user) { if (err) { response.error = err.message; } else { response.user = user; } res.json(response); }); }); ____0.post('/x-security/api/user/delete', function (req, res) { let response = { accessToken: req.session.accessToken, }; security.deleteUser( { id: req.body.id, }, function (err, result) { if (err) { response.error = err.message; } else { if (result.count == 1) { response.done = !0; } } res.json(response); }, ); }); ____0.post('/x-security/api/user/update', function (req, res) { let response = { accessToken: req.session.accessToken, }; let user = {}; user.id = req.body.id; if (req.body.email) { user.email = req.body.email; } user.$req = req; user.$res = res; security.updateUser(user, function (err, result) { if (err) { response.error = err.message; } else { if (result.count == 1) { response.done = !0; } } res.json(response); }); }); ____0.post('/x-security/api/user/add/permission', function (req, res) { let response = { accessToken: req.session.accessToken, }; if (req.body.id && req.body.permission) { let user = {}; user.id = req.body.id; user.permission = req.body.permission; security.addUserPermission(user.id, user.permission, function (err, result) { if (err) { response.error = err.message; } else { if (result.count == 1) { response.done = !0; } } res.json(response); }); } else { response.error = 'id or permission not set'; res.json(response); } }); ____0.all('/x-security/api/user/info', function (req, res) { let response = { accessToken: req.session.accessToken, }; response.user = req.session.user; res.json(response); }); ____0.all('/x-security/api/users/info', function (req, res) { res.json(security.users); }); if (____0.isFileExistsSync(____0.dir + '/json/permissions.json')) { security.addPermissions(____0.dir + '/json/permissions.json'); } if (____0.isFileExistsSync(____0.dir + '/json/roles.json')) { security.addRoles(____0.dir + '/json/roles.json'); } security.loadAllRoles((err, docs) => { docs.forEach((doc) => { doc.module_name = 'custom'; }); security.addRoles(docs); }); return security; };