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

Merge pull request #6754 from mizozobu/feat/g2g-check-write-permission

feat: check write permission before g2g
Haku Mizuki 3 лет назад
Родитель
Сommit
d2783ef726

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

@@ -1,6 +1,7 @@
 import { createReadStream } from 'fs';
 import path from 'path';
 
+import { ErrorV3 } from '@growi/core';
 import express, { NextFunction, Request, Router } from 'express';
 import { body } from 'express-validator';
 import multer from 'multer';
@@ -16,7 +17,6 @@ import { TransferKey } from '~/utils/vo/transfer-key';
 
 import Crowi from '../../crowi';
 import { apiV3FormValidator } from '../../middlewares/apiv3-form-validator';
-import ErrorV3 from '../../models/vo/error-apiv3';
 
 import { generateOverwriteParams } from './import';
 import { ApiV3Response } from './interfaces/apiv3-response';

+ 36 - 1
packages/app/src/server/service/g2g-transfer.ts

@@ -1,3 +1,4 @@
+import { randomUUID } from 'crypto';
 import { createReadStream, ReadStream } from 'fs';
 import { Readable } from 'stream';
 
@@ -110,21 +111,55 @@ const generateAxiosRequestConfigWithTransferKey = (tk: TransferKey, additionalHe
   };
 };
 
+
+/**
+ * Check whether the storage is writable
+ * @param crowi Crowi instance
+ * @returns Whether the storage is writable
+ */
+const getWritePermission = async(crowi: any): Promise<boolean> => {
+  const { fileUploadService } = crowi;
+
+  let writable = true;
+  const fileStream = new Readable();
+  fileStream.push('This file was created during g2g transfer to check write permission. You can safely remove this file.');
+  fileStream.push(null); // EOF
+  const attachment = {
+    fileName: `${randomUUID()}.growi`,
+    filePath: '',
+    fileFormat: 'text/plain',
+  };
+
+  try {
+    await fileUploadService.uploadFile(fileStream, attachment);
+    // TODO: remove tmp file
+  }
+  catch (err) {
+    writable = false;
+    logger.error(err);
+  }
+
+  return writable;
+};
+
 /**
  * generate GROWIInfo
  * @param crowi Crowi instance
  * @returns
  */
-const generateGROWIInfo = (crowi: any): IDataGROWIInfo => {
+const generateGROWIInfo = async(crowi: any): Promise<IDataGROWIInfo> => {
   // TODO: add attachment file limit, storage total limit
   const { configManager } = crowi;
   const userUpperLimit = configManager.getConfig('crowi', 'security:userUpperLimit');
   const version = crowi.version;
+  const writable = await getWritePermission(crowi);
+
   const attachmentInfo = {
     type: configManager.getConfig('crowi', 'app:fileUploadType'),
     bucket: undefined,
     customEndpoint: undefined, // for S3
     uploadNamespace: undefined, // for GCS
+    writable,
   };
 
   // put storage location info to check storage identification