Просмотр исходного кода

refactor: transfer key generation & parse logic

mizozobu 3 лет назад
Родитель
Сommit
e133fa076b

+ 0 - 3
packages/app/src/server/models/transfer-key.ts

@@ -2,11 +2,8 @@ import { Model, Schema, HydratedDocument } from 'mongoose';
 
 import { ITransferKey } from '~/interfaces/transfer-key';
 
-import loggerFactory from '../../utils/logger';
 import { getOrCreateModel } from '../util/mongoose-utils';
 
-const logger = loggerFactory('growi:models:transfer-key');
-
 interface ITransferKeyMethods {
   findOneActiveTransferKey(key: string): Promise<HydratedDocument<ITransferKey, ITransferKeyMethods> | null>;
 }

+ 11 - 14
packages/app/src/server/routes/apiv3/g2g-transfer.ts

@@ -6,7 +6,6 @@ import express, { NextFunction, Request, Router } from 'express';
 import { body } from 'express-validator';
 import multer from 'multer';
 
-import { SupportedAction } from '~/interfaces/activity';
 import GrowiArchiveImportOption from '~/models/admin/growi-archive-import-option';
 import TransferKeyModel from '~/server/models/transfer-key';
 import { isG2GTransferError } from '~/server/models/vo/g2g-transfer-error';
@@ -110,7 +109,7 @@ module.exports = (crowi: Crowi): Router => {
   };
 
   // Local middleware to check if key is valid or not
-  const verifyAndExtractTransferKey = async(req: Request & { transferKey: TransferKey }, res: ApiV3Response, next: NextFunction) => {
+  const validateTransferKey = async(req: Request, res: ApiV3Response, next: NextFunction) => {
     const key = req.headers[X_GROWI_TRANSFER_KEY_HEADER_NAME];
 
     if (typeof key !== 'string') {
@@ -130,9 +129,8 @@ module.exports = (crowi: Crowi): Router => {
       return res.apiv3Err(new ErrorV3('Transfer key has expired or not found.', 'transfer_key_expired_or_not_found'), 404);
     }
 
-    // Inject transferKey to req
     try {
-      req.transferKey = TransferKey.parse(transferKey.keyString);
+      TransferKey.parse(transferKey.keyString);
     }
     catch (err) {
       logger.error(err);
@@ -147,14 +145,14 @@ module.exports = (crowi: Crowi): Router => {
   const pushRouter = express.Router();
 
   // eslint-disable-next-line max-len
-  receiveRouter.get('/files', verifyAndExtractTransferKey, async(req: Request & { transferKey: TransferKey, operatorUserId: string }, res: ApiV3Response) => {
+  receiveRouter.get('/files', validateTransferKey, async(req: Request, res: ApiV3Response) => {
     const files = await crowi.fileUploadService.listFiles();
     return res.apiv3({ files });
   });
 
   // Auto import
   // eslint-disable-next-line max-len
-  receiveRouter.post('/', uploads.single('transferDataZipFile'), verifyAndExtractTransferKey, async(req: Request & { transferKey: TransferKey, operatorUserId: string }, res: ApiV3Response) => {
+  receiveRouter.post('/', uploads.single('transferDataZipFile'), validateTransferKey, async(req: Request, res: ApiV3Response) => {
     const { file } = req;
 
     const zipFile = importService.getFile(file.filename);
@@ -284,8 +282,8 @@ module.exports = (crowi: Crowi): Router => {
   });
 
   // This endpoint uses multer's MemoryStorage since the received data should be persisted directly on attachment storage.
-  receiveRouter.post('/attachment', uploadsForAttachment.single('content'), verifyAndExtractTransferKey,
-    async(req: Request & { transferKey: TransferKey }, res: ApiV3Response) => {
+  receiveRouter.post('/attachment', uploadsForAttachment.single('content'), validateTransferKey,
+    async(req: Request, res: ApiV3Response) => {
       const { file } = req;
       const { attachmentMetadata } = req.body;
 
@@ -312,7 +310,7 @@ module.exports = (crowi: Crowi): Router => {
       return res.apiv3({ message: 'Successfully imported attached file.' });
     });
 
-  receiveRouter.get('/growi-info', verifyAndExtractTransferKey, async(req: Request & { transferKey: TransferKey }, res: ApiV3Response) => {
+  receiveRouter.get('/growi-info', validateTransferKey, async(req: Request, res: ApiV3Response) => {
     let growiInfo: IDataGROWIInfo;
     try {
       growiInfo = await g2gTransferReceiverService.answerGROWIInfo();
@@ -332,12 +330,11 @@ module.exports = (crowi: Crowi): Router => {
 
   // eslint-disable-next-line max-len
   receiveRouter.post('/generate-key', accessTokenParser, adminRequiredIfInstalled, appSiteUrlRequiredIfNotInstalled, async(req: Request, res: ApiV3Response) => {
-    const strAppSiteUrl = req.body.appSiteUrl ?? crowi.configManager?.getConfig('crowi', 'app:siteUrl');
+    const appSiteUrl = req.body.appSiteUrl ?? crowi.configManager?.getConfig('crowi', 'app:siteUrl');
 
-    // Generate transfer key string
-    let appSiteUrl: URL;
+    let appSiteOrigin: string;
     try {
-      appSiteUrl = new URL(strAppSiteUrl);
+      appSiteOrigin = new URL(appSiteUrl).origin;
     }
     catch (err) {
       logger.error(err);
@@ -347,7 +344,7 @@ module.exports = (crowi: Crowi): Router => {
     // Save TransferKey document
     let transferKeyString: string;
     try {
-      transferKeyString = await g2gTransferReceiverService.createTransferKey(appSiteUrl);
+      transferKeyString = await g2gTransferReceiverService.createTransferKey(appSiteOrigin);
     }
     catch (err) {
       logger.error(err);

+ 4 - 13
packages/app/src/server/service/g2g-transfer.ts

@@ -115,10 +115,10 @@ interface Receiver {
    * DO NOT USE TransferKeyModel.create() directly, instead, use this method to create a TransferKey document.
    * This method receives appSiteUrl to create a TransferKey document and returns generated transfer key string.
    * UUID is the same value as the created document's _id.
-   * @param {URL} appSiteUrl URL type appSiteUrl
+   * @param {string} appSiteUrl appSiteUrl
    * @returns {string} Transfer key string (e.g. http://localhost:3000__grw_internal_tranferkey__<uuid>)
    */
-  createTransferKey(appSiteUrl: URL): Promise<string>
+  createTransferKey(appSiteUrl: string): Promise<string>
   /**
    * Receive transfer request and import data.
    * @param {Readable} zippedGROWIDataStream
@@ -502,18 +502,9 @@ export class G2GTransferReceiverService implements Receiver {
     return generateGROWIInfo(this.crowi);
   }
 
-  public async createTransferKey(appSiteUrl: URL): Promise<string> {
+  public async createTransferKey(appSiteUrl: string): Promise<string> {
     const uuid = new MongooseTypes.ObjectId().toString();
-
-    // Generate transfer key string
-    let transferKeyString: string;
-    try {
-      transferKeyString = TransferKey.generateKeyString(uuid, appSiteUrl);
-    }
-    catch (err) {
-      logger.error(err);
-      throw err;
-    }
+    const transferKeyString = TransferKey.generateKeyString(uuid, appSiteUrl);
 
     // Save TransferKey document
     let tkd;

+ 3 - 3
packages/app/src/utils/vo/transfer-key.ts

@@ -48,11 +48,11 @@ export class TransferKey {
   /**
    * Generates transfer key string (e.g. https://example.com:8080__grw_internal_tranferkey__key)
    * @param {string} key Key generated by GROWI
-   * @param {URL} appUrl GROWI app site url
+   * @param {string} appUrl GROWI app site url
    * @returns {string} Transfer key string
    */
-  static generateKeyString(key: string, appUrl: URL): string {
-    return `${key}${TransferKey._internalSeperator}${appUrl.origin}`;
+  static generateKeyString(key: string, appUrl: string): string {
+    return `${key}${TransferKey._internalSeperator}${appUrl}`;
   }
 
 }