| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- const config = require("../../config.js")
- ,Slack = require("../slack.js").Slack
- ,GoogleOAuth = require("../googleOAuth.js").GoogleOAuth
- ,FacebookOAuth = require("../facebookOAuth.js").FacebookOAuth
- ,slackManager = require("../slackManager.js").SlackManager
- ,accountManager = require("../models/accounts.js").accountManager
- ,accountConfigManager = require("../models/accountConfig.js").accountConfigManager
- ,sessionManager = require("../session.js").SessionManager
- ,templates = require('./_templates.js');
- function checkTokens(service, req, res, cb) {
- switch (service) {
- case "slack":
- if (req.urlObj.queryTokens.code) {
- Slack.getUserId(req.urlObj.queryTokens.code, config.login.slack.redirect_uri, (id) => {
- if (id) {
- accountManager.fromSlackIdAuth(id, (account) => {
- if (account) {
- cb(account);
- } else if (config.allowNewAccounts) {
- var account = accountManager.createAccount();
- account.authSlackUserEmailAndTeam = id;
- accountManager.save(account, () => {
- cb(account);
- accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
- });
- } else {
- cb(false);
- }
- });
- } else {
- cb(null);
- }
- });
- } else {
- cb(null);
- }
- break;
- case "google":
- if (req.urlObj.queryTokens.code) {
- GoogleOAuth.getUserId(req.urlObj.queryTokens.code, (id) => {
- if (id) {
- accountManager.fromGoogleIdAuth(id, (account) => {
- if (account) {
- cb(account);
- } else if (config.allowNewAccounts) {
- var account = accountManager.createAccount();
- account.authGoogleUserId = id;
- accountManager.save(account, () => {
- cb(account);
- accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
- });
- } else {
- cb(false);
- }
- });
- } else {
- cb(null);
- }
- });
- } else {
- cb(null);
- }
- break;
- case "facebook":
- if (req.urlObj.queryTokens.code) {
- FacebookOAuth.getUserId(req.urlObj.queryTokens.code[0], (id) => {
- if (id) {
- accountManager.fromFacebookIdAuth(id, (account) => {
- if (account) {
- cb(account);
- } else if (config.allowNewAccounts) {
- var account = accountManager.createAccount();
- account.authFacebookUserId = id;
- accountManager.save(account, () => {
- cb(account);
- accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
- });
- } else {
- cb(false);
- }
- });
- } else {
- cb(null);
- }
- });
- } else {
- cb(null);
- }
- break;
- case "android":
- if (req.urlObj.queryTokens.phoneAccess) {
- var self = this;
- accountManager.fromPhoneAccess(req.urlObj.queryTokens.phoneAccess, (acc) => {
- if (acc) {
- req.account = acc;
- req.session = sessionManager.lazyForRequest(req);
- req.session.setAccountId(req.reqT, acc.id);
- res.writeHeader("302", {
- Location: config.rootUrl,
- "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
- });
- sessionManager.saveSession(req.session);
- } else {
- res.writeHeader("302", {
- Location: "/login"
- });
- }
- res.end();
- });
- } else {
- res.writeHeader("302", {
- Location: "/login"
- });
- res.end();
- }
- break;
- default:
- cb(null);
- break;
- }
- }
- function makeLoginPage() {
- const
- slackUri = config.login.slack ? (config.login.slack.requestLoginUri
- +"?client_id=" +config.login.slack.clientId
- +"&scope=" +slackManager.getAuthScope().join(',')
- +"&redirect_uri=" +config.login.slack.redirect_uri) : "",
- googleUri = config.login.google ? (config.login.google.requestLoginUri
- +"?client_id=" +config.login.google.clientId
- +"&scope=" +(["openid", "email", "profile"]).join("%20")
- +"&redirect_uri=" +config.login.google.redirect_uri
- +"&response_type=code") : "",
- facebookUri = config.login.facebook ? (config.login.facebook.requestLoginUri
- +"?client_id=" +config.login.facebook.clientId
- +"&redirect_uri=" +config.login.facebook.redirect_uri) : null;
- return templates.header("Mimou - login", ["style.css"])
- +`<div class="login-services"><h1>Login</h1>`
- +(googleUri ? `<a href="${googleUri}"><img src="${config.rootUrl}btn_gogl_connect.png"></a>` : "")
- +(facebookUri ? `<a href="${facebookUri}"><img src="${config.rootUrl}btn_fcbk_connect.png"></a>` : "")
- +(slackUri ? `<a href="${slackUri}"><img src="${config.rootUrl}btn_slack_connect.png"></a>` : "")
- +`</div>`
- +templates.footer();
- }
- module.exports.match = function(url) {
- if (url.urlParts.length === 1) {
- return true;
- } else if (url.urlParts.length === 2 && (Object.keys(config.login).indexOf(url.urlParts[1]) >= 0 || url.urlParts[1] === "android")) {
- return true;
- }
- return false;
- };
- module.exports.exec = function(req, res, srv) {
- res.setHeader('Content-Type', "text/html; charset=UTF-8");
- if (!req.urlObj.urlParts[1]) {
- if (req.urlObj.queryTokens["native"]) {
- req.session = sessionManager.lazyForRequest(req);
- req.session.isNative = true;
- sessionManager.saveSession(req.session);
- res.writeHeader("200", {
- "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
- });
- }
- res.end(makeLoginPage());
- } else {
- checkTokens(req.urlObj.urlParts[1], req, res, (account) => {
- if (account) {
- req.account = account;
- req.session = sessionManager.lazyForRequest(req);
- req.session.setAccountId(req.reqT, account.id);
- if (req.session.isNative) {
- req.session.isNative = false;
- res.writeHeader("302", {
- Location: "intent:#Intent;scheme=mimou://open?token=" +account.generatePermanentPhoneAccess() +"&;package=com.knacki.mimou;end",
- "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
- });
- accountManager.save(account);
- } else {
- res.writeHeader("302", {
- Location: config.rootUrl,
- "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
- });
- }
- sessionManager.saveSession(req.session);
- res.end();
- } else if (account === null) {
- res.end(makeLoginPage());
- } else {
- srv.execTemplate(require("./_403.js"), req, res);
- }
- });
- }
- };
- module.exports.needLogin = false;
|