Explorar o código

refactor index

yuken %!s(int64=3) %!d(string=hai) anos
pai
achega
fcd8acea76

+ 16 - 3
packages/app/src/server/middlewares/api-rate-limiter.ts

@@ -3,10 +3,23 @@ import { RateLimiterMemory } from 'rate-limiter-flexible';
 
 
 import loggerFactory from '~/utils/logger';
 import loggerFactory from '~/utils/logger';
 
 
-import { IApiRateLimitConfig } from '../interfaces/api-rate-limit-config';
+import { generateApiRateLimitConfig } from '../util/generateApiRateLimitConfig';
+
 
 
 const logger = loggerFactory('growi:middleware:api-rate-limit');
 const logger = loggerFactory('growi:middleware:api-rate-limit');
 
 
+const defaultMaxPoints = 100;
+const defaultConsumePoints = 10;
+const defaultDuration = 1;
+const opts = {
+  points: defaultMaxPoints, // set default value
+  duration: defaultDuration, // set default value
+};
+const rateLimiter = new RateLimiterMemory(opts);
+
+// generate ApiRateLimitConfig for api rate limiter
+const apiRateLimitConfig = generateApiRateLimitConfig();
+
 const consumePoints = async(rateLimiter: RateLimiterMemory, key: string, points: number, next: NextFunction) => {
 const consumePoints = async(rateLimiter: RateLimiterMemory, key: string, points: number, next: NextFunction) => {
   await rateLimiter.consume(key, points)
   await rateLimiter.consume(key, points)
     .then(() => {
     .then(() => {
@@ -17,14 +30,14 @@ const consumePoints = async(rateLimiter: RateLimiterMemory, key: string, points:
     });
     });
 };
 };
 
 
-module.exports = (rateLimiter: RateLimiterMemory, defaultPoints: number, apiRateLimitConfig: IApiRateLimitConfig) => {
+module.exports = () => {
 
 
   return async(req: Request, res: Response, next: NextFunction) => {
   return async(req: Request, res: Response, next: NextFunction) => {
 
 
     const endpoint = req.path;
     const endpoint = req.path;
     const key = req.ip + req.url;
     const key = req.ip + req.url;
 
 
-    let points = defaultPoints;
+    let points = defaultConsumePoints;
     Object.keys(apiRateLimitConfig).forEach((endpointInConfig) => {
     Object.keys(apiRateLimitConfig).forEach((endpointInConfig) => {
       if (endpointInConfig === endpoint) {
       if (endpointInConfig === endpoint) {
         const consumePointsInConfig = apiRateLimitConfig[endpointInConfig].consumePoints;
         const consumePointsInConfig = apiRateLimitConfig[endpointInConfig].consumePoints;

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

@@ -1,5 +1,4 @@
 import express from 'express';
 import express from 'express';
-import { RateLimiterMemory } from 'rate-limiter-flexible';
 
 
 import apiV1FormValidator from '../middlewares/apiv1-form-validator';
 import apiV1FormValidator from '../middlewares/apiv1-form-validator';
 import injectResetOrderByTokenMiddleware from '../middlewares/inject-reset-order-by-token-middleware';
 import injectResetOrderByTokenMiddleware from '../middlewares/inject-reset-order-by-token-middleware';
@@ -9,8 +8,6 @@ import * as registerFormValidator from '../middlewares/register-form-validator';
 import {
 import {
   generateUnavailableWhenMaintenanceModeMiddleware, generateUnavailableWhenMaintenanceModeMiddlewareForApi,
   generateUnavailableWhenMaintenanceModeMiddleware, generateUnavailableWhenMaintenanceModeMiddlewareForApi,
 } from '../middlewares/unavailable-when-maintenance-mode';
 } from '../middlewares/unavailable-when-maintenance-mode';
-import { generateApiRateLimitConfig } from '../util/generateApiRateLimitConfig';
-
 
 
 import * as allInAppNotifications from './all-in-app-notifications';
 import * as allInAppNotifications from './all-in-app-notifications';
 import * as forgotPassword from './forgot-password';
 import * as forgotPassword from './forgot-password';
@@ -20,18 +17,6 @@ import * as userActivation from './user-activation';
 const multer = require('multer');
 const multer = require('multer');
 const autoReap = require('multer-autoreap');
 const autoReap = require('multer-autoreap');
 
 
-const defaultMaxPoints = 100;
-const defaultConsumePoints = 10;
-const defaultDuration = 1;
-const opts = {
-  points: defaultMaxPoints, // set default value
-  duration: defaultDuration, // set default value
-};
-const rateLimiter = new RateLimiterMemory(opts);
-
-// generate ApiRateLimitConfig for api rate limiter
-const apiRateLimitConfig = generateApiRateLimitConfig();
-
 autoReap.options.reapOnError = true; // continue reaping the file even if an error occurs
 autoReap.options.reapOnError = true; // continue reaping the file even if an error occurs
 
 
 module.exports = function(crowi, app) {
 module.exports = function(crowi, app) {
@@ -45,7 +30,7 @@ module.exports = function(crowi, app) {
   const certifySharedFile = require('../middlewares/certify-shared-file')(crowi);
   const certifySharedFile = require('../middlewares/certify-shared-file')(crowi);
   const csrf = require('../middlewares/csrf')(crowi);
   const csrf = require('../middlewares/csrf')(crowi);
   const injectUserUISettings = require('../middlewares/inject-user-ui-settings-to-localvars')();
   const injectUserUISettings = require('../middlewares/inject-user-ui-settings-to-localvars')();
-  const apiRateLimiter = require('../middlewares/api-rate-limiter')(rateLimiter, defaultConsumePoints, apiRateLimitConfig);
+  const apiRateLimiter = require('../middlewares/api-rate-limiter')();
 
 
   const uploads = multer({ dest: `${crowi.tmpDir}uploads` });
   const uploads = multer({ dest: `${crowi.tmpDir}uploads` });
   const page = require('./page')(crowi, app);
   const page = require('./page')(crowi, app);

+ 3 - 12
packages/app/src/server/util/generateApiRateLimitConfig.ts

@@ -1,13 +1,4 @@
-// API_RATE_LIMIT_010_FOO_ENDPOINT=/_api/v3/foo
-// API_RATE_LIMIT_010_FOO_METHODS=GET,POST
-// API_RATE_LIMIT_010_FOO_CONSUME_POINTS=10
-
-export type ApiRateLimitConfig = {
-  [endpoint: string]: {
-    method: string,
-    consumePoints: number
-  }
-}
+import { IApiRateLimitConfig } from '../interfaces/api-rate-limit-config';
 
 
 const getKeyByValue = (object: Record<string, string>, value: string): string | undefined => {
 const getKeyByValue = (object: Record<string, string>, value: string): string | undefined => {
   return Object.keys(object).find(key => object[key] === value);
   return Object.keys(object).find(key => object[key] === value);
@@ -28,7 +19,7 @@ const getHighPriorityKey = (key1: string, key2: string): string => {
 };
 };
 
 
 // this method is called only one server starts
 // this method is called only one server starts
-export const generateApiRateLimitConfig = (): ApiRateLimitConfig => {
+export const generateApiRateLimitConfig = (): IApiRateLimitConfig => {
   const envVar = process.env;
   const envVar = process.env;
 
 
   const apiRateEndpointKeys = Object.keys(envVar).filter((key) => {
   const apiRateEndpointKeys = Object.keys(envVar).filter((key) => {
@@ -61,7 +52,7 @@ export const generateApiRateLimitConfig = (): ApiRateLimitConfig => {
     }
     }
   });
   });
 
 
-  const apiRateLimitConfig: ApiRateLimitConfig = {};
+  const apiRateLimitConfig: IApiRateLimitConfig = {};
   Object.keys(envVarEndpointFiltered).forEach((key) => {
   Object.keys(envVarEndpointFiltered).forEach((key) => {
     const target = key.replace('API_RATE_LIMIT_', '').replace('_ENDPOINT', '');
     const target = key.replace('API_RATE_LIMIT_', '').replace('_ENDPOINT', '');
     const endpoint = envVarEndpointFiltered[`API_RATE_LIMIT_${target}_ENDPOINT`];
     const endpoint = envVarEndpointFiltered[`API_RATE_LIMIT_${target}_ENDPOINT`];