jam411 vor 3 Jahren
Ursprung
Commit
54b02119dc

+ 1 - 1
packages/app/config/rate-limiter.ts

@@ -33,7 +33,7 @@ export const defaultConfig: IApiRateLimitEndpointMap = {
     maxRequests: MAX_REQUESTS_TIER_1,
     maxRequests: MAX_REQUESTS_TIER_1,
     usersPerIpProspection: 100,
     usersPerIpProspection: 100,
   },
   },
-  '/invited/activateInvited': {
+  '/invited': {
     method: 'POST',
     method: 'POST',
     maxRequests: MAX_REQUESTS_TIER_2,
     maxRequests: MAX_REQUESTS_TIER_2,
   },
   },

+ 1 - 1
packages/app/src/components/InvitedForm.tsx

@@ -40,7 +40,7 @@ export const InvitedForm = (props: InvitedFormProps): JSX.Element => {
     };
     };
 
 
     try {
     try {
-      const res = await apiv3Post('/invited/activateInvited', { invitedForm });
+      const res = await apiv3Post('/invited', { invitedForm });
       const { redirectTo } = res.data;
       const { redirectTo } = res.data;
       router.push(redirectTo);
       router.push(redirectTo);
     }
     }

+ 5 - 2
packages/app/src/server/middlewares/invited-form-validator.ts

@@ -10,7 +10,10 @@ export const invitedRules = () => {
       .not()
       .not()
       .isEmpty()
       .isEmpty()
       .withMessage('message.Username field is required'),
       .withMessage('message.Username field is required'),
-    body('invitedForm.name').not().isEmpty().withMessage('message.Name field is required'),
+    body('invitedForm.name')
+      .not()
+      .isEmpty()
+      .withMessage('message.Name field is required'),
     body('invitedForm.password')
     body('invitedForm.password')
       .matches(/^[\x20-\x7F]*$/)
       .matches(/^[\x20-\x7F]*$/)
       .withMessage('message.Password has invalid character')
       .withMessage('message.Password has invalid character')
@@ -23,7 +26,7 @@ export const invitedRules = () => {
 };
 };
 
 
 // validation action
 // validation action
-export const invitedValidation = (req: Request, _res: any, next: () => any) => {
+export const invitedValidation = (req, _res, next) => {
   const form = req.body;
   const form = req.body;
 
 
   const errors = validationResult(req);
   const errors = validationResult(req);

+ 1 - 3
packages/app/src/server/routes/apiv3/index.js

@@ -2,7 +2,6 @@ import loggerFactory from '~/utils/logger';
 
 
 import { generateAddActivityMiddleware } from '../../middlewares/add-activity';
 import { generateAddActivityMiddleware } from '../../middlewares/add-activity';
 import injectUserRegistrationOrderByTokenMiddleware from '../../middlewares/inject-user-registration-order-by-token-middleware';
 import injectUserRegistrationOrderByTokenMiddleware from '../../middlewares/inject-user-registration-order-by-token-middleware';
-import * as invitedFormValidator from '../../middlewares/invited-form-validator';
 import * as loginFormValidator from '../../middlewares/login-form-validator';
 import * as loginFormValidator from '../../middlewares/login-form-validator';
 import * as registerFormValidator from '../../middlewares/register-form-validator';
 import * as registerFormValidator from '../../middlewares/register-form-validator';
 
 
@@ -50,13 +49,12 @@ module.exports = (crowi, app, isInstalled) => {
   routerForAuth.post('/login', applicationInstalled, loginFormValidator.loginRules(), loginFormValidator.loginValidation,
   routerForAuth.post('/login', applicationInstalled, loginFormValidator.loginRules(), loginFormValidator.loginValidation,
     addActivity, loginPassport.loginWithLocal, loginPassport.loginWithLdap, loginPassport.cannotLoginErrorHadnler, loginPassport.loginFailure);
     addActivity, loginPassport.loginWithLocal, loginPassport.loginWithLdap, loginPassport.cannotLoginErrorHadnler, loginPassport.loginFailure);
 
 
+  routerForAuth.use('/invited', require('./invited')(crowi));
   routerForAuth.use('/logout', require('./logout')(crowi));
   routerForAuth.use('/logout', require('./logout')(crowi));
 
 
   routerForAuth.post('/register',
   routerForAuth.post('/register',
     applicationInstalled, registerFormValidator.registerRules(), registerFormValidator.registerValidation, addActivity, login.register);
     applicationInstalled, registerFormValidator.registerRules(), registerFormValidator.registerValidation, addActivity, login.register);
 
 
-  routerForAuth.post('/invited/activateInvited',
-    applicationInstalled, invitedFormValidator.invitedRules(), invitedFormValidator.invitedValidation, login.invited);
 
 
   // installer
   // installer
   if (!isInstalled) {
   if (!isInstalled) {

+ 58 - 0
packages/app/src/server/routes/apiv3/invited.ts

@@ -0,0 +1,58 @@
+import express, { Request, Router } from 'express';
+
+import Crowi from '../../crowi';
+import { invitedRules, invitedValidation } from '../../middlewares/invited-form-validator';
+
+import { ApiV3Response } from './interfaces/apiv3-response';
+
+type InvitedFormRequest = Request & { form: any, user: any };
+
+module.exports = (crowi: Crowi): Router => {
+  const applicationInstalled = require('../../middlewares/application-installed')(crowi);
+  const debug = require('debug')('growi:routes:login');
+  const User = crowi.model('User');
+  const router = express.Router();
+
+  router.post('/', applicationInstalled, invitedRules(), invitedValidation, async(req: InvitedFormRequest, res: ApiV3Response) => {
+    if (!req.user) {
+      return res.apiv3({ redirectTo: '/login' });
+    }
+
+    if (req.method === 'POST' && req.form.isValid) {
+      const user = req.user;
+      const invitedForm = req.form.invitedForm || {};
+      const username = invitedForm.username;
+      const name = invitedForm.name;
+      const password = invitedForm.password;
+
+      // check user upper limit
+      const isUserCountExceedsUpperLimit = await User.isUserCountExceedsUpperLimit();
+      if (isUserCountExceedsUpperLimit) {
+        // req.flash('warningMessage', req.t('message.can_not_activate_maximum_number_of_users'));
+        return res.apiv3({ redirectTo: '/invited' });
+      }
+
+      const creatable = await User.isRegisterableUsername(username);
+      if (creatable) {
+        try {
+          await user.activateInvitedUser(username, name, password);
+          return res.apiv3({ redirectTo: '/' });
+        }
+        catch (err) {
+          // req.flash('warningMessage', req.t('message.failed_to_activate'));
+          return res.render('invited');
+        }
+      }
+      else {
+        // req.flash('warningMessage', req.t('message.unable_to_use_this_user'));
+        debug('username', username);
+        return res.render('invited');
+      }
+    }
+    else {
+      return res.render('invited');
+    }
+  });
+
+  return router;
+};

+ 5 - 7
packages/app/src/server/routes/login-passport.js

@@ -11,6 +11,7 @@ module.exports = function(crowi, app) {
   const logger = loggerFactory('growi:routes:login-passport');
   const logger = loggerFactory('growi:routes:login-passport');
   const passport = require('passport');
   const passport = require('passport');
   const ExternalAccount = crowi.model('ExternalAccount');
   const ExternalAccount = crowi.model('ExternalAccount');
+  const User = crowi.model('User');
   const passportService = crowi.passportService;
   const passportService = crowi.passportService;
 
 
   const activityEvent = crowi.event('activity');
   const activityEvent = crowi.event('activity');
@@ -100,7 +101,9 @@ module.exports = function(crowi, app) {
       }
       }
     });
     });
 
 
-    const { redirectTo } = req.session;
+    // check for redirection to '/invited'
+    const redirectTo = req.user.status === User.STATUS_INVITED ? '/invited' : req.session;
+
     // remove session.redirectTo
     // remove session.redirectTo
     delete req.session.redirectTo;
     delete req.session.redirectTo;
 
 
@@ -113,13 +116,8 @@ module.exports = function(crowi, app) {
         username: req.user.username,
         username: req.user.username,
       },
       },
     };
     };
-    await crowi.activityService.createActivity(parameters);
 
 
-    // for router.push() redirect to '/invited'
-    const User = crowi.model('User');
-    if (req.user.status === User.STATUS_INVITED) {
-      return res.apiv3({ redirectTo: '/invited' });
-    }
+    await crowi.activityService.createActivity(parameters);
 
 
     return res.apiv3({ redirectTo });
     return res.apiv3({ redirectTo });
   };
   };

+ 0 - 41
packages/app/src/server/routes/login.js

@@ -169,46 +169,5 @@ module.exports = function(crowi, app) {
     });
     });
   };
   };
 
 
-  actions.invited = async function(req, res) {
-    if (!req.user) {
-      return res.apiv3({ redirectTo: '/login' });
-    }
-
-    if (req.method === 'POST' && req.form.isValid) {
-      const user = req.user;
-      const invitedForm = req.form.invitedForm || {};
-      const username = invitedForm.username;
-      const name = invitedForm.name;
-      const password = invitedForm.password;
-
-      // check user upper limit
-      const isUserCountExceedsUpperLimit = await User.isUserCountExceedsUpperLimit();
-      if (isUserCountExceedsUpperLimit) {
-        req.flash('warningMessage', req.t('message.can_not_activate_maximum_number_of_users'));
-        return res.apiv3({ redirectTo: '/invited' });
-      }
-
-      const creatable = await User.isRegisterableUsername(username);
-      if (creatable) {
-        try {
-          await user.activateInvitedUser(username, name, password);
-          return res.apiv3({ redirectTo: '/' });
-        }
-        catch (err) {
-          req.flash('warningMessage', req.t('message.failed_to_activate'));
-          return res.render('invited');
-        }
-      }
-      else {
-        req.flash('warningMessage', req.t('message.unable_to_use_this_user'));
-        debug('username', username);
-        return res.render('invited');
-      }
-    }
-    else {
-      return res.render('invited');
-    }
-  };
-
   return actions;
   return actions;
 };
 };