const passport = require("passport"); const urlencode = require("urlencode"); const async = require("async"); const crypto = require("crypto"); const fs =require('fs') const path = require("path"); exports = module.exports = function (logger, rest, settings) { function index(req, res, next) { logger.info(req); // res.redirect("https://www.baidu.com"); } function getImg(req, res, next) { logger.info(req.url, "1231231231"); const parentdir = path.resolve(__dirname, "..") const paths = parentdir+'/build/public'+urlencode.decode(req.url, 'utf8') fs.readFile(paths,function(err,data){ console.log(err,data) if (err) { res.send('读取错误') } else { res.send(data) } }) } function indexPrefix(req, res) { // logger.info(req.csrfToken(),'req.cssadasdas'); res.send({data:req.csrfToken()}) // if (req.csrfToken) { // if (settings.prefix && settings.prefix.length > 1) { // res.redirect(settings.prefix.substring(0, settings.prefix.length - 1)); // } else { // res.render("index", { csrfToken: req.csrfToken() }); // } // } else res.render("index", { csrfToken: "" }); } function productDes(req, res, next) { if (req.csrfToken) res.render("chat/new-chat", { csrfToken: req.csrfToken() }); else res.render("chat/new-chat", { csrfToken: "" }); } function recharge(req, res) { var params = JSON.parse(urlencode.decode(req.query.params)); console.log(params); if (req.csrfToken) res.render("recharge", { recharge: params, csrfToken: req.csrfToken() }); else res.render("recharge", { recharge: params, csrfToken: "" }); } function register(req, res, next) { if (req.csrfToken) res.render("newRegister", { csrfToken: req.csrfToken() }); else res.render("newRegister", { csrfToken: "" }); } function mobileRegister(req, res) { if (req.csrfToken) res.render("registerMobile", { csrfToken: req.csrfToken() }); else res.render("registerMobile", { csrfToken: "" }); } function mobileRegisterSuccess(req, res) { if (req.csrfToken) res.render("registerMobileSuccess", { csrfToken: req.csrfToken() }); else res.render("registerMobileSuccess", { csrfToken: "" }); } function signIn(req, res, next) { // console.log(req); if (req.csrfToken) res.render("newLogin", { csrfToken: req.csrfToken() }); else res.render("newLogin", { csrfToken: "" }); } function doLogin(req, res, next) { passport.authenticate("local", function (err, user, info) { console.log("doLogin:", err, user, info); if (err) { return next(err); } if (!user) { return res.send(info); } req.logIn(user, function (err) { if (err) { return next(err); } return res.send({ ok: "登录成功", user_info: req.session.passport.user.user_info, }); }); })(req, res, next); } function signOut(req, res, next) { if ( req.session.passport && req.session.passport.user && req.session.passport.user.user_info && req.session.passport.user.user_info.user ) logger.info( req.session.passport.user.user_info.user, "You have successfully logged out" ); req.logout(); req.flash("success", "You have successfully logged out"); res.redirect("/"); } function smsCodes(req, res, next) { rest.postJson({ baseUrl: "url", url: "auth/smscodes", params: req.body, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { res.send({ code: 200, message: "发送成功" }); } else { res.send(data); } } } function tenants(req, res, next) { rest.register({ baseUrl: "url", url: "tenants", params: req.body, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function resetPass(req, res) { rest.putJson({ baseUrl: "url", url: "auth/user", params: { user: req.body.user, password: req.body.password, again_password: req.body.again_password, }, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function updatePassword(req, res) { rest.patchJson({ baseUrl: "url", url: "users/" + req.body.userId, params: { password: req.body.password, }, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function loadUserInfo(req, res) { settings; if (req.session.passport.user && req.session.passport.user.user_info) { res.send({ user_info: req.session.passport.user.user_info, prefix: settings.prefix, }); } else { res.send({ user_info: null, prefix: settings.prefix }); } } function getUploaderToken(req, res) { rest.postJson({ baseUrl: "ossUrl", url: "inits", params: req.body, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function getObjectTokenByID(req, res) { rest.get({ baseUrl: "ossUrl", url: "objects/" + req.body.file_id, params: {}, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function delOSSObject(req, res) { rest.del({ baseUrl: "ossUrl", url: "s3objects/" + req.body.request_id + "?bucket=" + req.body.bucket + "&file=" + req.body.name, params: {}, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); console.log(response.statusCode); if (response.statusCode < 300) { res.send({ delete: "ok" }); } } } function smsVerification(req, res) { rest.postJson({ baseUrl: "url", url: "auth/sms_verification", params: req.body, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { res.send({ code: 200, message: "发送成功" }); } else { res.send({ code: response.statusCode, message: data.message, errors: data.errors, }); } } } function healthMonitor(res) { res.statusCode = 200; return res.send("status ok"); } function updateUserRoles(req, res) { rest.putJson({ baseUrl: "url", url: "user_roles/" + req.body.user_id, params: req.body.roles, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { res.send({ back: "ok" }); } else { res.send(data); } } } function getRoles(req, res) { rest.get({ baseUrl: "url", url: "roles", params: {}, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function getUserRoles(req, res) { rest.get({ baseUrl: "url", url: "user_roles?user=" + urlencode(req.body.user) + "&limit=" + req.body.limit + "&offset=" + req.body.offset, params: {}, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function getTenant(req, res) { rest.get({ baseUrl: "url", url: "tenants/" + req.body.tenant_id, params: {}, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function updateTenant(req, res) { rest.putJson({ baseUrl: "url", url: "tenants/" + req.body.tenant_id, params: req.body.tenant, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function offer(req, res) { rest.get({ baseUrl: "hrUrl", url: "offers/" + req.params.requestId + "?tenant_id=" + req.query.tenant_id, params: {}, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { logger.info("back data:", data); //res.send(data); console.log(data); data["offerId"] = req.params.requestId; data["tenantId"] = req.query.tenant_id; res.render("offer", data); } } function onboardStatus(req, res) { rest.get({ baseUrl: "hrUrl", url: "onboard-status", params: {}, callback: _cb, req: req, res: res, options: {}, useUrl: true, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function dowloadApp(req, res) { var mobileAgent = req.headers["user-agent"].toLowerCase(); var agent = { android: mobileAgent.indexOf("android") > -1 || mobileAgent.indexOf("Adr") > -1, iPhone: mobileAgent.indexOf("iphone") > -1, iPad: mobileAgent.indexOf("ipad") > -1, }; if (agent.iPhone || agent.iPad) { res.redirect( 301, "https://itunes.apple.com/cn/app/%E8%96%AA%E5%91%97/id1140779439?l=en&mt=8" ); } else if (agent.android) { res.redirect( 301, "http://krhrimg.oss-cn-beijing.aliyuncs.com/appdownload/production/android/krhr-android.apk" ); } else { res.redirect( 301, "http://krhrimg.oss-cn-beijing.aliyuncs.com/appdownload/production/android/krhr-android.apk" ); } } function softwareLicense(res) { res.render("softwareLicense"); } function changePassForRegister(req, res) { var options = { baseUrl: "url", url: "users/" + req.body.user_id, params: { password: req.body.password, }, callback: _cb, req: req, res: res, options: {}, }; if (req.body.access_token) { console.log("@@@!!!!!!!!!!!!!!!!"); options.options = { accessToken: req.body.access_token, }; options["excludeToken"] = true; } rest.patchJson(options); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function changeTenant(req, res) { var params = { grant_type: "refresh_token", scope: "global_access:tenant_admin,tenant:" + req.body.id, refresh_token: req.session.passport.user.refreshToken, }; req.session.passport.user.token = ""; rest.postJson({ baseUrl: "url", url: settings.restful.url + "uaa" + settings.restful.version + "/auth/tokens", useUrl: true, params: params, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { console.log(data); logger.info("back data:", data); if (response.statusCode < 300) { req.session.passport.user.token = data.access_token; req.session.passport.user.refreshToken = data.refresh_token; req.session.passport.user.user_info = { user: data.user, perms: [], tenant: data.tenant, scope: data.scope, oss: req.session.passport.user.user_info.oss, }; req.session.save(function () { rest.get({ baseUrl: "url", url: settings.restful.url + "uaa" + settings.restful.version + "/perms/detail", useUrl: true, params: {}, callback: _scb, req: req, res: res, options: {}, }); }); } else { res.send({ code: response.statusCode, message: data.message, initialize_done: "n", }); } } function _scb(data1, response) { if (response.statusCode < 300 && data1.items) { req.session.passport.user.user_info.perms = data1.items; req.session.save(function () { // res.send({"code":200,"message":"切换租户成功"}); rest.get({ baseUrl: "url", url: settings.restful.url + "filemeta" + settings.restful.version + "/config", useUrl: true, params: {}, callback: _scb1, req: req, res: res, options: {}, }); }); } else { res.send({ code: response.statusCode, message: data1.message }); } } function _scb1(data2, response) { if (response.statusCode < 300 && data2 && data2.bucket) { req.session.passport.user.user_info.oss = data2; req.session.save(function () { res.send({ code: 200, message: "切换租户成功" }); }); } else { res.send({ code: 200, message: "切换租户失败" }); } } } function sendRejectOffer(req, res) { rest.get({ baseUrl: "hrUrl", url: req.body.url, //传一个参数 params: {}, callback: _cb, req: req, res: res, options: {}, excludeToken: true, useUrl: true, }); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { res.send({ action: "ok" }); } else { res.send(data); } } } function acceptOffer(req, res) { rest.get({ baseUrl: "hrUrl", url: req.body.url, //传一个参数 params: {}, callback: _cb, req: req, res: res, options: {}, excludeToken: true, useUrl: true, }); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { res.send({ action: "ok" }); } else { res.send(data); } } } function imTokens(req, res) { rest.post({ url: "auth/im_tokens", params: req.body, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function listChannels(req, res) { rest.get({ baseUrl: "chatUrl", url: "channels?page_size=10&page=0&status=active", params: req.body, callback: _cb, req: req, res: res, options: {}, }); function _cb(data, response) { logger.info("back data:", data); res.send(data); } } function filemeta(req, res) { var fullPath = settings.restful.url + "filemeta" + settings.restful.version + "/object-redirect"; fullPath = fullPath + "?" + "bucket=" + req.query.bucket + "&object=" + encodeURIComponent(req.query.object); console.info("fullPath::::::", fullPath); var options = { service_catalog: "", url: fullPath, useUrl: true, params: req.body, callback: _cb, req: req, res: res, options: {}, }; rest.get(options); function _cb(data, response) { if (data && data.download_url) { if (req.query.type && "json" == req.query.type) { res.send(data); } else { var url = data.download_url; let path = url.split("?")[0]; let pathArray = path.split("/"); let result = []; for (var i = 0; i < pathArray.length; i++) { if (i == pathArray.length - 1) { result.push(encodeURIComponent(pathArray[i])); } else { result.push(pathArray[i]); } } let result1 = result.join("/"); if (url.indexOf("?") !== -1) { result1 += "?" + url.split("?")[1]; } if (req.query.result_callback) { res.send(data); } else { res.redirect(301, result1); } } } else { res.send(data); } } } function getCustomerQrcode(req, res) { var fullPath = settings.restful.url + "crm" + settings.restful.version + "/customers/" + req.query.id + "/qrcode"; var options = { service_catalog: "", url: fullPath, useUrl: true, params: req.body, callback: _cb, req: req, res: res, options: {}, }; rest.get(options); function _cb(data, response) { if (data && data.url_path) { res.redirect(301, data.url_path); } else { res.send(data); } } } function getPositionQrcode(req, res) { var fullPath = settings.restful.url + "recruit" + settings.restful.version + "/positions/" + req.query.id + "/qrcode"; var options = { service_catalog: "", url: fullPath, useUrl: true, params: req.body, callback: _cb, req: req, res: res, options: {}, }; rest.get(options); function _cb(data, response) { if (data && data.url_path) { res.redirect(301, data.url_path); } else { res.send(data); } } } function getOSSConfig(req, res) { var fullPath = settings.restful.url + "filemeta" + settings.restful.version + "/config"; var options = { service_catalog: "", url: fullPath, useUrl: true, params: req.body, callback: _cb, req: req, res: res, options: {}, }; rest.get(options); function _cb(data, response) { if (data && data.bucket) { req.session.passport.user.user_info.oss = data; req.session.save(function () { res.send({ code: 200, message: "oss配置加载成功" }); }); } else { res.send({ code: 200, message: "oss配置加载失败" }); } } } function weidianTempLate(req, res) { const { params } = req; var fullPath = settings.restful.url + "socialwork/internal/minishop/" + params.id; var options = { service_catalog: "", url: fullPath, useUrl: true, params: req.body, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }; rest.get(options); function _cb(data, response) { logger.info("back data:", data); if (response.statusCode < 300) { const { shop_logo = [], shop_name = "", shop_comment = "" } = data; let imgUrl = ""; if (shop_logo.length > 0) { imgUrl = "http://oss.workai.com.cn/public/" + shop_logo[0].object; } res.render("template/weiDian", { imgUrl: imgUrl, shop_name: shop_name, shop_comment: shop_comment, }); } else { res.render("template/weiDian"); } } } function workaiSecurityOAuth(req, res) { var params = req.query; if (params.authorization_code) { var passport = { user: { refreshToken: "", token: "", service_catalog: {}, user_info: {}, err: null, }, }; async.waterfall( [ function (callback) { //第三方登录 var tempParams = { grant_type: "authorization_code_v1", code: params.authorization_code, }; // var tempParams={ // "grant_type":"password", // "username":"18510929499", // "scope":"global_access:tenant_admin", // "password":"a123456" // }; logger.info( "Third login", settings.restful.url + "uaa/v1/auth/tokens", tempParams ); rest.restful .postJson( settings.restful.url + "uaa/v1/auth/tokens", tempParams, { headers: { "Content-Type": "application/json", Accept: "application/json", }, } ) .on("success", function (data) { logger.info("Third login json data:", data); if (data.access_token) { var scopes = data.scope.split(","); passport.user.token = data.access_token; passport.user.refreshToken = data.refresh_token; passport.user.user_info = data.user || {}; passport.user.tenant_info = data.tenant; passport.user.customer_info = data.customer; passport.user.user_info.perms = data.perms; passport.user.type = data.user.type; passport.user.real_auth_status = data.user.real_auth_status; passport.user.credential_status = data.user.credential_status; passport.user.user_info.scope = scopes[0]; callback(null, data); } else { var err = new Error("Third login err"); passport.user.err = data.message; callback(err, data); } }) .on("error", function (err, response) { logger.error("Third login error", err); var err = new Error("Third login err"); callback(err, response); }) .on("fail", function (data, response) { logger.error("Third login fail", data); callback(data, response); }); }, function (data, callback) { //获取机构列表 var tempHead = {}; var ip = req.ip.match(/\d+\.\d+\.\d+\.\d+/)[0]; var user_agent = req.headers["user-agent"] || ""; tempHead["SXClientIP"] = ip; tempHead["User-Agent"] = user_agent; logger.info( "Third login tenants", settings.restful.url + "uaa/v1/tenants?all=true", { accessToken: data.access_token, headers: tempHead } ); rest.restful .get(settings.restful.url + "uaa/v1/tenants?all=true", { accessToken: data.access_token, headers: tempHead, }) .on("success", function (data1) { logger.info("Third login tenants list:", data1); if (data1 && data1.items && data1.items.length > 0) { callback(null, data1.items); } else { var err = new Error("Third login tenants list err"); passport.user.err = data.message; callback(err, data); } }) .on("error", function (err, response) { var err = new Error("Third login tenants list err"); callback(err, response); }) .on("fail", function (data, response) { callback(data, response); }); }, function (data, callback) { //刷新token if (data && data.length == 1) { var params = { grant_type: "refresh_token", scope: "global_access:tenant_admin,tenant:" + data[0].id, refresh_token: passport.user.refreshToken, }; passport.user.token = ""; logger.info( "Third login tokens", settings.restful.url + "uaa/v1/auth/tokens", params ); rest.restful .postJson(settings.restful.url + "uaa/v1/auth/tokens", params, { headers: { "Content-Type": "application/json", Accept: "application/json", }, }) .on("success", function (data2) { logger.info("Third login json data2:", data2); if (data2.access_token) { var scopes = data2.scope.split(","); passport.user.token = data2.access_token; passport.user.refreshToken = data2.refresh_token; passport.user.user_info = data2.user || {}; passport.user.tenant_info = data2.tenant; passport.user.customer_info = data2.customer; passport.user.user_info.perms = data2.perms; passport.user.type = data2.user.type; passport.user.real_auth_status = data2.user.real_auth_status; passport.user.credential_status = data2.user.credential_status; passport.user.user_info.scope = scopes[0]; passport.user.user_info.tenant = data2.tenant; passport.user.user_info.user = { credential_status: data2.credential_status, id: data2.id, is_root: data2.is_root, mobile: data2.mobile, name: data2.name, real_auth_status: data2.real_auth_status, status: data2.status, type: data2.type, wx_open_id: data2.wx_open_id, }; callback(null, data2); } else { var err = new Error("Third login err"); passport.user.err = data2.message; callback(err, data2); } }) .on("error", function (err, response) { logger.error("Third login error", err); var err = new Error("Third login err"); callback(err, response); }) .on("fail", function (data2, response) { logger.error("Third login fail", data2); callback(data2, response); }); } else if (data && data.length > 1) { // #/login/choose-tenant callback(null, data); } else { var err = new Error("Third login tenants list item error"); callback(err, data); } }, ], function (err, result) { if (err) { //登陆失败跳转失败页 res.render("loginerr", { err: err }); } else if (result instanceof Array && result.length > 1) { //登陆成功跳转选择机构页 req.session.passport = passport; req.session.save(function () { res.redirect(301, settings.prefix + "#login/choose-tenant"); }); } else { req.session.passport = passport; req.session.save(function () { rest.get({ baseUrl: "url", url: settings.restful.url + "uaa" + settings.restful.version + "/perms/detail", useUrl: true, params: {}, callback: _scb, req: req, res: res, options: {}, }); }); function _scb(data1, response) { if (response.statusCode < 300 && data1.items) { req.session.passport.user.user_info.perms = data1.items; req.session.save(function () { if (params.redirect_page) { res.redirect( 301, settings.prefix + "#" + params.redirect_page ); //登陆成功跳转首页 } else { res.redirect(301, settings.prefix + "#container/home"); //登陆成功跳转首页 } }); } else { if (params.redirect_page) { res.redirect( 301, settings.prefix + "#" + params.redirect_page ); //登陆成功跳转首页 } else { res.redirect(301, settings.prefix + "#container/home"); //登陆成功跳转首页 } } } } } ); } } function getTastLink(req, res) { var url = crypto.createHash("md5").update(req.body.id).digest("hex"); if (settings.prefix && settings.prefix.length > 1) { res.send( req.protocol + "://" + req.get("host") + settings.prefix.substring(0, settings.prefix.length - 1) + "/socialwork/freedom-jobs/emps/" + req.body.id + "/" + url ); } else { res.send({ url: req.protocol + "://" + req.get("host") + "/socialwork/freedom-jobs/emps/" + req.body.id + "/" + url, }); } } function freedomJobsEmp(req, res) { var id = req.params.id; // var url = crypto.createHash('md5').update(id).digest('hex'); if (false) { //验证未通过verification != url if (settings.prefix && settings.prefix.length > 1) { res.redirect(settings.prefix.substring(0, settings.prefix.length - 1)); } else { res.redirect("/"); } } else { //验证通过跳转,获取token存到session里 var passport = { user: { refreshToken: "", token: "", service_catalog: {}, user_info: {}, err: null, }, }; var tempParams = { grant_type: "client_credential", client_id: "340161778618994688", //多宝鱼环境 client_secret: "0f8c30aa3d15332652f62c3eaf22fdea", }; rest.restful .postJson(settings.restful.url + "uaa/v1/auth/tokens", tempParams, { headers: { "Content-Type": "application/json", Accept: "application/json", }, }) .on("success", function (data) { if (data.access_token) { var scopes = data.scope.split(","); passport.user.token = data.access_token; passport.user.refreshToken = data.refresh_token; passport.user.user_info = data.user; passport.user.tenant_info = data.tenant; passport.user.customer_info = data.customer; passport.user.user_info.perms = data.perms; passport.user.type = data.user.type; passport.user.real_auth_status = data.user.real_auth_status; passport.user.credential_status = data.user.credential_status; passport.user.user_info.scope = scopes[0]; req.session.passport = passport; req.session.save(function () { if (settings.prefix && settings.prefix.length > 1) { res.redirect( 301, settings.prefix.substring(0, settings.prefix.length - 1) + "/#task_assign/" + id ); } else { res.redirect(301, "/#task_assign/" + id); } }); } else { passport.user.err = data.message; } }) .on("error", function (err, response) { logger.error("Third login error", err); var err = new Error("Third login err"); callback(err, response); }) .on("fail", function (data) { logger.error("Third login fail", data); }); } } function getShortToken(req, res) { var params = { grant_type: "refresh_token", scope: req.session.passport.user.scope, refresh_token: req.session.passport.user.refreshToken, }; logger.info("getShortToken:", params); rest.postJson({ baseUrl: "url", url: settings.restful.url + "uaa" + settings.restful.version + "/auth/tokens", useUrl: true, params: params, callback: _cb, req: req, res: res, options: {}, excludeToken: true, }); function _cb(data, response) { console.log(data); logger.info("back data:", data); res.send({ code: response.statusCode, access_token: data.access_token }); } } return { index: index, indexPrefix, register: register, signIn: signIn, doLogin: doLogin, signOut: signOut, smsCodes: smsCodes, tenants: tenants, productDes: productDes, resetPass: resetPass, updatePassword: updatePassword, loadUserInfo: loadUserInfo, getUploaderToken: getUploaderToken, getObjectTokenByID, delOSSObject: delOSSObject, healthMonitor, smsVerification, updateUserRoles, getRoles, getUserRoles, getTenant, updateTenant, offer, onboardStatus, dowloadApp, mobileRegister, mobileRegisterSuccess, softwareLicense, recharge, changePassForRegister, changeTenant, sendRejectOffer, acceptOffer, imTokens, listChannels, filemeta, getCustomerQrcode, getPositionQrcode, getOSSConfig, weidianTempLate, workaiSecurityOAuth, getTastLink, freedomJobsEmp, getShortToken, getImg }; }; exports["@singleton"] = true; exports["@require"] = ["igloo/logger", "utils/rest", "igloo/settings"];