login.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. const config = require("../../config.js")
  2. ,Slack = require("../slack.js").Slack
  3. ,GoogleOAuth = require("../googleOAuth.js").GoogleOAuth
  4. ,FacebookOAuth = require("../facebookOAuth.js").FacebookOAuth
  5. ,slackManager = require("../slackManager.js").SlackManager
  6. ,accountManager = require("../models/accounts.js").accountManager
  7. ,accountConfigManager = require("../models/accountConfig.js").accountConfigManager
  8. ,sessionManager = require("../session.js").SessionManager
  9. ,templates = require('./_templates.js');
  10. function checkTokens(service, req, res, cb) {
  11. switch (service) {
  12. case "slack":
  13. if (req.urlObj.queryTokens.code) {
  14. Slack.getUserId(req.urlObj.queryTokens.code, config.login.slack.redirect_uri, (id) => {
  15. if (id) {
  16. accountManager.fromSlackIdAuth(id, (account) => {
  17. if (account) {
  18. cb(account);
  19. } else if (config.allowNewAccounts) {
  20. var account = accountManager.createAccount();
  21. account.authSlackUserEmailAndTeam = id;
  22. accountManager.save(account, () => {
  23. cb(account);
  24. accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
  25. });
  26. } else {
  27. cb(false);
  28. }
  29. });
  30. } else {
  31. cb(null);
  32. }
  33. });
  34. } else {
  35. cb(null);
  36. }
  37. break;
  38. case "google":
  39. if (req.urlObj.queryTokens.code) {
  40. GoogleOAuth.getUserId(req.urlObj.queryTokens.code, (id) => {
  41. if (id) {
  42. accountManager.fromGoogleIdAuth(id, (account) => {
  43. if (account) {
  44. cb(account);
  45. } else if (config.allowNewAccounts) {
  46. var account = accountManager.createAccount();
  47. account.authGoogleUserId = id;
  48. accountManager.save(account, () => {
  49. cb(account);
  50. accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
  51. });
  52. } else {
  53. cb(false);
  54. }
  55. });
  56. } else {
  57. cb(null);
  58. }
  59. });
  60. } else {
  61. cb(null);
  62. }
  63. break;
  64. case "facebook":
  65. if (req.urlObj.queryTokens.code) {
  66. FacebookOAuth.getUserId(req.urlObj.queryTokens.code[0], (id) => {
  67. if (id) {
  68. accountManager.fromFacebookIdAuth(id, (account) => {
  69. if (account) {
  70. cb(account);
  71. } else if (config.allowNewAccounts) {
  72. var account = accountManager.createAccount();
  73. account.authFacebookUserId = id;
  74. accountManager.save(account, () => {
  75. cb(account);
  76. accountConfigManager.save(accountConfigManager.newConfigFor(account), () => {});
  77. });
  78. } else {
  79. cb(false);
  80. }
  81. });
  82. } else {
  83. cb(null);
  84. }
  85. });
  86. } else {
  87. cb(null);
  88. }
  89. break;
  90. case "android":
  91. if (req.urlObj.queryTokens.phoneAccess) {
  92. var self = this;
  93. accountManager.fromPhoneAccess(req.urlObj.queryTokens.phoneAccess, (acc) => {
  94. if (acc) {
  95. req.account = acc;
  96. req.session = sessionManager.lazyForRequest(req);
  97. req.session.setAccountId(req.reqT, acc.id);
  98. res.writeHeader("302", {
  99. Location: config.rootUrl,
  100. "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
  101. });
  102. sessionManager.saveSession(req.session);
  103. } else {
  104. res.writeHeader("302", {
  105. Location: "/login"
  106. });
  107. }
  108. res.end();
  109. });
  110. } else {
  111. res.writeHeader("302", {
  112. Location: "/login"
  113. });
  114. res.end();
  115. }
  116. break;
  117. default:
  118. cb(null);
  119. break;
  120. }
  121. }
  122. function makeLoginPage() {
  123. const
  124. slackUri = config.login.slack ? (config.login.slack.requestLoginUri
  125. +"?client_id=" +config.login.slack.clientId
  126. +"&scope=" +slackManager.getAuthScope().join(',')
  127. +"&redirect_uri=" +config.login.slack.redirect_uri) : "",
  128. googleUri = config.login.google ? (config.login.google.requestLoginUri
  129. +"?client_id=" +config.login.google.clientId
  130. +"&scope=" +(["openid", "email", "profile"]).join("%20")
  131. +"&redirect_uri=" +config.login.google.redirect_uri
  132. +"&response_type=code") : "",
  133. facebookUri = config.login.facebook ? (config.login.facebook.requestLoginUri
  134. +"?client_id=" +config.login.facebook.clientId
  135. +"&redirect_uri=" +config.login.facebook.redirect_uri) : null;
  136. return templates.header("Mimou - login", ["style.css"])
  137. +`<div class="login-services"><h1>Login</h1>`
  138. +(googleUri ? `<a href="${googleUri}"><img src="${config.rootUrl}btn_gogl_connect.png"></a>` : "")
  139. +(facebookUri ? `<a href="${facebookUri}"><img src="${config.rootUrl}btn_fcbk_connect.png"></a>` : "")
  140. +(slackUri ? `<a href="${slackUri}"><img src="${config.rootUrl}btn_slack_connect.png"></a>` : "")
  141. +`</div>`
  142. +templates.footer();
  143. }
  144. module.exports.match = function(url) {
  145. if (url.urlParts.length === 1) {
  146. return true;
  147. } else if (url.urlParts.length === 2 && (Object.keys(config.login).indexOf(url.urlParts[1]) >= 0 || url.urlParts[1] === "android")) {
  148. return true;
  149. }
  150. return false;
  151. };
  152. module.exports.exec = function(req, res, srv) {
  153. res.setHeader('Content-Type', "text/html; charset=UTF-8");
  154. if (!req.urlObj.urlParts[1]) {
  155. if (req.urlObj.queryTokens["native"]) {
  156. req.session = sessionManager.lazyForRequest(req);
  157. req.session.isNative = true;
  158. sessionManager.saveSession(req.session);
  159. res.writeHeader("200", {
  160. "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
  161. });
  162. }
  163. res.end(makeLoginPage());
  164. } else {
  165. checkTokens(req.urlObj.urlParts[1], req, res, (account) => {
  166. if (account) {
  167. req.account = account;
  168. req.session = sessionManager.lazyForRequest(req);
  169. req.session.setAccountId(req.reqT, account.id);
  170. if (req.session.isNative) {
  171. req.session.isNative = false;
  172. res.writeHeader("302", {
  173. Location: "intent:#Intent;scheme=mimou://open?token=" +account.generatePermanentPhoneAccess() +"&;package=com.knacki.mimou;end",
  174. "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
  175. });
  176. accountManager.save(account);
  177. } else {
  178. res.writeHeader("302", {
  179. Location: config.rootUrl,
  180. "Set-Cookie": "sessID="+req.session.sessId +'; Path=/'
  181. });
  182. }
  183. sessionManager.saveSession(req.session);
  184. res.end();
  185. } else if (account === null) {
  186. res.end(makeLoginPage());
  187. } else {
  188. srv.execTemplate(require("./_403.js"), req, res);
  189. }
  190. });
  191. }
  192. };
  193. module.exports.needLogin = false;