index.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. const express = require('express');
  2. const router = express.Router();
  3. const { User } = require('../models');
  4. const { tokenStore } = require('../common/token');
  5. const requestWeChatToken = require('../common/wechat').requestToken;
  6. const requestCorpToken = require('../common/wechat-corp').requestToken;
  7. const {
  8. userRequired,
  9. adminRequired,
  10. allowRegister,
  11. } = require('../middlewares/web_auth');
  12. const config = require('../config');
  13. router.get('/', (req, res, next) => {
  14. let showGuidance = false;
  15. if (
  16. req.session.user &&
  17. !req.session.user.wechatAppId &&
  18. !req.session.user.corpId &&
  19. !req.session.user.smtpUser
  20. ) {
  21. showGuidance = true;
  22. }
  23. if (process.env.MODE === '1') {
  24. showGuidance = false;
  25. }
  26. res.render('index', {
  27. message: req.flash('message'),
  28. showGuidance,
  29. });
  30. });
  31. router.get('/login', (req, res, next) => {
  32. res.render('login', {
  33. message: req.flash('message'),
  34. });
  35. });
  36. router.post('/login', async (req, res, next) => {
  37. if (process.env.MODE === '1') {
  38. return res.render('register', {
  39. message: '当前运行模式为 Heroku 模式,该模式下禁止用户登录',
  40. isErrorMessage: true,
  41. });
  42. }
  43. let user = {
  44. username: req.body.username,
  45. password: req.body.password,
  46. };
  47. let message = '';
  48. res.locals.isErrorMessage = true;
  49. try {
  50. user = await User.findOne({ where: user });
  51. if (user) {
  52. req.session.user = user;
  53. req.flash(
  54. 'message',
  55. `欢迎${user.isAdmin ? '管理员' : '普通'}用户 ${
  56. user.username
  57. } 登录系统!`
  58. );
  59. return res.redirect('/');
  60. } else {
  61. message = '用户名或密码错误';
  62. }
  63. } catch (e) {
  64. console.error(e);
  65. message = e.message;
  66. }
  67. res.render('login', {
  68. message,
  69. });
  70. });
  71. router.get('/logout', userRequired, (req, res, next) => {
  72. req.session.user = undefined;
  73. req.flash('message', '已退出登录');
  74. res.redirect('/');
  75. });
  76. router.get('/register', allowRegister, (req, res, next) => {
  77. res.render('register');
  78. });
  79. router.post('/register', allowRegister, async (req, res, next) => {
  80. if (process.env.MODE === '1') {
  81. return res.render('register', {
  82. message: '当前运行模式为 Heroku 模式,该模式下禁止用户注册',
  83. isErrorMessage: true,
  84. });
  85. }
  86. let user = {
  87. username: req.body.username,
  88. password: req.body.password,
  89. };
  90. let message = '';
  91. try {
  92. user = await User.create(user);
  93. message = '用户创建成功,请登录';
  94. req.flash('message', message);
  95. return res.redirect('/login');
  96. } catch (e) {
  97. console.error(e);
  98. message = '用户名已被占用';
  99. }
  100. res.render('register', { message, isErrorMessage: true });
  101. });
  102. router.get('/configure', userRequired, (req, res, next) => {
  103. let showPasswordWarning = false;
  104. if (req.session.user && req.session.user.password === '123456') {
  105. showPasswordWarning = true;
  106. }
  107. res.locals.message = req.flash('message');
  108. res.locals.showPasswordWarning = showPasswordWarning;
  109. if (req.session.user.prefix === null) {
  110. req.session.user.prefix = req.session.user.username;
  111. }
  112. res.locals.verifyUrl = config.href + req.session.user.prefix + '/verify';
  113. res.render('configure', req.session.user);
  114. });
  115. router.post('/configure', userRequired, async (req, res, next) => {
  116. let id = req.session.user.id;
  117. let user = {
  118. // Common
  119. username: req.body.username,
  120. password: req.body.password,
  121. accessToken: req.body.accessToken,
  122. defaultMethod: req.body.defaultMethod,
  123. prefix: req.body.prefix,
  124. // WeChat public account
  125. wechatAppId: req.body.wechatAppId,
  126. wechatAppSecret: req.body.wechatAppSecret,
  127. wechatTemplateId: req.body.wechatTemplateId,
  128. wechatOpenId: req.body.wechatOpenId,
  129. wechatVerifyToken: req.body.wechatVerifyToken,
  130. // Email
  131. email: req.body.email,
  132. smtpServer: req.body.smtpServer,
  133. smtpUser: req.body.smtpUser,
  134. smtpPass: req.body.smtpPass,
  135. // WeChat corp
  136. corpId: req.body.corpId,
  137. corpAgentId: req.body.corpAgentId,
  138. corpAppSecret: req.body.corpAppSecret,
  139. corpUserId: req.body.corpUserId,
  140. };
  141. for (let field in user) {
  142. let value = user[field];
  143. value = value.trim();
  144. if (value || field === 'accessToken') {
  145. user[field] = value;
  146. } else {
  147. delete user[field];
  148. }
  149. }
  150. let message = '';
  151. try {
  152. let userObj = await User.findOne({
  153. where: {
  154. id: id,
  155. },
  156. });
  157. if (userObj) {
  158. await userObj.update(user);
  159. }
  160. if (userObj.prefix !== req.session.user.prefix) {
  161. tokenStore.delete(req.session.user.prefix);
  162. }
  163. req.session.user = userObj;
  164. tokenStore.set(userObj.prefix, {
  165. // Common
  166. accessToken: userObj.accessToken,
  167. defaultMethod: userObj.defaultMethod,
  168. // WeChat test account
  169. wechatAppId: userObj.wechatAppId,
  170. wechatAppSecret: userObj.wechatAppSecret,
  171. wechatTemplateId: userObj.wechatTemplateId,
  172. wechatOpenId: userObj.wechatOpenId,
  173. wechatVerifyToken: userObj.wechatVerifyToken,
  174. wechatToken: await requestWeChatToken(
  175. userObj.wechatAppId,
  176. userObj.wechatAppSecret
  177. ),
  178. // Email
  179. email: userObj.email,
  180. smtpServer: userObj.smtpServer,
  181. smtpUser: userObj.smtpUser,
  182. smtpPass: userObj.smtpPass,
  183. // WeChat corporation account
  184. corpId: userObj.corpId,
  185. corpAgentId: userObj.corpAgentId,
  186. corpAppSecret: userObj.corpAppSecret,
  187. corpUserId: userObj.corpUserId,
  188. corpToken: await requestCorpToken(userObj.corpId, userObj.corpAppSecret),
  189. });
  190. message = '配置更新成功';
  191. console.debug(tokenStore);
  192. } catch (e) {
  193. console.error(e);
  194. message = e.message;
  195. }
  196. req.flash('message', message);
  197. res.redirect('/configure');
  198. });
  199. module.exports = router;