|
@@ -105,6 +105,28 @@ const ErrorV3 = require('../../models/vo/error-apiv3');
|
|
|
* secretAccessKey:
|
|
* secretAccessKey:
|
|
|
* type: string
|
|
* type: string
|
|
|
* description: secret key for authentification of AWS
|
|
* description: secret key for authentification of AWS
|
|
|
|
|
+ * GcsSettingParams:
|
|
|
|
|
+ * description: GcsSettingParams
|
|
|
|
|
+ * type: object
|
|
|
|
|
+ * properties:
|
|
|
|
|
+ * gcsApiKeyJsonPath:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: apiKeyJsonPath of gcp
|
|
|
|
|
+ * gcsBucket:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: bucket name of gcs
|
|
|
|
|
+ * gcsUploadNamespace:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: name space of gcs
|
|
|
|
|
+ * envGcsApiKeyJsonPath:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: Path of the JSON file that contains service account key to authenticate to GCP API
|
|
|
|
|
+ * envGcsBucket:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: Name of the GCS bucket
|
|
|
|
|
+ * envGcsUploadNamespace:
|
|
|
|
|
+ * type: string
|
|
|
|
|
+ * description: Directory name to create in the bucket
|
|
|
* PluginSettingParams:
|
|
* PluginSettingParams:
|
|
|
* description: PluginSettingParams
|
|
* description: PluginSettingParams
|
|
|
* type: object
|
|
* type: object
|
|
@@ -116,7 +138,6 @@ const ErrorV3 = require('../../models/vo/error-apiv3');
|
|
|
|
|
|
|
|
module.exports = (crowi) => {
|
|
module.exports = (crowi) => {
|
|
|
const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
|
|
const accessTokenParser = require('../../middlewares/access-token-parser')(crowi);
|
|
|
- const loginRequired = require('../../middlewares/login-required')(crowi);
|
|
|
|
|
const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
|
|
const loginRequiredStrictly = require('../../middlewares/login-required')(crowi);
|
|
|
const adminRequired = require('../../middlewares/admin-required')(crowi);
|
|
const adminRequired = require('../../middlewares/admin-required')(crowi);
|
|
|
const csrf = require('../../middlewares/csrf')(crowi);
|
|
const csrf = require('../../middlewares/csrf')(crowi);
|
|
@@ -147,11 +168,16 @@ module.exports = (crowi) => {
|
|
|
body('sesSecretAccessKey').trim(),
|
|
body('sesSecretAccessKey').trim(),
|
|
|
],
|
|
],
|
|
|
awsSetting: [
|
|
awsSetting: [
|
|
|
- body('region').trim().matches(/^[a-z]+-[a-z]+-\d+$/).withMessage((value, { req }) => req.t('validation.aws_region')),
|
|
|
|
|
- body('customEndpoint').trim().matches(/^(https?:\/\/[^/]+|)$/).withMessage((value, { req }) => req.t('validation.aws_custom_endpoint')),
|
|
|
|
|
- body('bucket').trim(),
|
|
|
|
|
- body('accessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
|
|
|
|
|
- body('secretAccessKey').trim(),
|
|
|
|
|
|
|
+ body('s3Region').trim().matches(/^[a-z]+-[a-z]+-\d+$/).withMessage((value, { req }) => req.t('validation.aws_region')),
|
|
|
|
|
+ body('s3CustomEndpoint').trim().matches(/^(https?:\/\/[^/]+|)$/).withMessage((value, { req }) => req.t('validation.aws_custom_endpoint')),
|
|
|
|
|
+ body('s3Bucket').trim(),
|
|
|
|
|
+ body('s3AccessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
|
|
|
|
|
+ body('s3SecretAccessKey').trim(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ gcsSetting: [
|
|
|
|
|
+ body('gcsApiKeyJsonPath').trim(),
|
|
|
|
|
+ body('gcsBucket').trim(),
|
|
|
|
|
+ body('gcsUploadNamespace').trim(),
|
|
|
],
|
|
],
|
|
|
pluginSetting: [
|
|
pluginSetting: [
|
|
|
body('isEnabledPlugins').isBoolean(),
|
|
body('isEnabledPlugins').isBoolean(),
|
|
@@ -178,7 +204,7 @@ module.exports = (crowi) => {
|
|
|
* type: object
|
|
* type: object
|
|
|
* description: app settings params
|
|
* description: app settings params
|
|
|
*/
|
|
*/
|
|
|
- router.get('/', accessTokenParser, loginRequired, adminRequired, async(req, res) => {
|
|
|
|
|
|
|
+ router.get('/', accessTokenParser, loginRequiredStrictly, adminRequired, async(req, res) => {
|
|
|
const appSettingsParams = {
|
|
const appSettingsParams = {
|
|
|
title: crowi.configManager.getConfig('crowi', 'app:title'),
|
|
title: crowi.configManager.getConfig('crowi', 'app:title'),
|
|
|
confidential: crowi.configManager.getConfig('crowi', 'app:confidential'),
|
|
confidential: crowi.configManager.getConfig('crowi', 'app:confidential'),
|
|
@@ -188,6 +214,7 @@ module.exports = (crowi) => {
|
|
|
envSiteUrl: crowi.configManager.getConfigFromEnvVars('crowi', 'app:siteUrl'),
|
|
envSiteUrl: crowi.configManager.getConfigFromEnvVars('crowi', 'app:siteUrl'),
|
|
|
isMailerSetup: crowi.mailService.isMailerSetup,
|
|
isMailerSetup: crowi.mailService.isMailerSetup,
|
|
|
fromAddress: crowi.configManager.getConfig('crowi', 'mail:from'),
|
|
fromAddress: crowi.configManager.getConfig('crowi', 'mail:from'),
|
|
|
|
|
+
|
|
|
transmissionMethod: crowi.configManager.getConfig('crowi', 'mail:transmissionMethod'),
|
|
transmissionMethod: crowi.configManager.getConfig('crowi', 'mail:transmissionMethod'),
|
|
|
smtpHost: crowi.configManager.getConfig('crowi', 'mail:smtpHost'),
|
|
smtpHost: crowi.configManager.getConfig('crowi', 'mail:smtpHost'),
|
|
|
smtpPort: crowi.configManager.getConfig('crowi', 'mail:smtpPort'),
|
|
smtpPort: crowi.configManager.getConfig('crowi', 'mail:smtpPort'),
|
|
@@ -195,11 +222,23 @@ module.exports = (crowi) => {
|
|
|
smtpPassword: crowi.configManager.getConfig('crowi', 'mail:smtpPassword'),
|
|
smtpPassword: crowi.configManager.getConfig('crowi', 'mail:smtpPassword'),
|
|
|
sesAccessKeyId: crowi.configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
|
|
sesAccessKeyId: crowi.configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
|
|
|
sesSecretAccessKey: crowi.configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
|
|
sesSecretAccessKey: crowi.configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
|
|
|
- region: crowi.configManager.getConfig('crowi', 'aws:region'),
|
|
|
|
|
- customEndpoint: crowi.configManager.getConfig('crowi', 'aws:customEndpoint'),
|
|
|
|
|
- bucket: crowi.configManager.getConfig('crowi', 'aws:bucket'),
|
|
|
|
|
- accessKeyId: crowi.configManager.getConfig('crowi', 'aws:accessKeyId'),
|
|
|
|
|
- secretAccessKey: crowi.configManager.getConfig('crowi', 'aws:secretAccessKey'),
|
|
|
|
|
|
|
+
|
|
|
|
|
+ fileUploadType: crowi.configManager.getConfig('crowi', 'app:fileUploadType'),
|
|
|
|
|
+ envFileUploadType: crowi.configManager.getConfigFromEnvVars('crowi', 'app:fileUploadType'),
|
|
|
|
|
+
|
|
|
|
|
+ s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
|
|
|
|
|
+ s3CustomEndpoint: crowi.configManager.getConfig('crowi', 'aws:s3CustomEndpoint'),
|
|
|
|
|
+ s3Bucket: crowi.configManager.getConfig('crowi', 'aws:s3Bucket'),
|
|
|
|
|
+ s3AccessKeyId: crowi.configManager.getConfig('crowi', 'aws:s3AccessKeyId'),
|
|
|
|
|
+ s3SecretAccessKey: crowi.configManager.getConfig('crowi', 'aws:s3SecretAccessKey'),
|
|
|
|
|
+ gcsUseOnlyEnvVars: crowi.configManager.getConfig('crowi', 'gcs:isGcsEnvPrioritizes'),
|
|
|
|
|
+ gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),
|
|
|
|
|
+ gcsBucket: crowi.configManager.getConfig('crowi', 'gcs:bucket'),
|
|
|
|
|
+ gcsUploadNamespace: crowi.configManager.getConfig('crowi', 'gcs:uploadNamespace'),
|
|
|
|
|
+ envGcsApiKeyJsonPath: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:apiKeyJsonPath'),
|
|
|
|
|
+ envGcsBucket: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:bucket'),
|
|
|
|
|
+ envGcsUploadNamespace: crowi.configManager.getConfigFromEnvVars('crowi', 'gcs:uploadNamespace'),
|
|
|
|
|
+
|
|
|
isEnabledPlugins: crowi.configManager.getConfig('crowi', 'plugin:isEnabledPlugins'),
|
|
isEnabledPlugins: crowi.configManager.getConfig('crowi', 'plugin:isEnabledPlugins'),
|
|
|
};
|
|
};
|
|
|
return res.apiv3({ appSettingsParams });
|
|
return res.apiv3({ appSettingsParams });
|
|
@@ -532,25 +571,25 @@ module.exports = (crowi) => {
|
|
|
*/
|
|
*/
|
|
|
router.put('/aws-setting', loginRequiredStrictly, adminRequired, csrf, validator.awsSetting, apiV3FormValidator, async(req, res) => {
|
|
router.put('/aws-setting', loginRequiredStrictly, adminRequired, csrf, validator.awsSetting, apiV3FormValidator, async(req, res) => {
|
|
|
const requestAwsSettingParams = {
|
|
const requestAwsSettingParams = {
|
|
|
- 'aws:region': req.body.region,
|
|
|
|
|
- 'aws:customEndpoint': req.body.customEndpoint,
|
|
|
|
|
- 'aws:bucket': req.body.bucket,
|
|
|
|
|
- 'aws:accessKeyId': req.body.accessKeyId,
|
|
|
|
|
- 'aws:secretAccessKey': req.body.secretAccessKey,
|
|
|
|
|
|
|
+ 'app:fileUploadType': req.body.fileUploadType,
|
|
|
|
|
+ 'aws:s3Region': req.body.s3Region,
|
|
|
|
|
+ 'aws:s3CustomEndpoint': req.body.s3CustomEndpoint,
|
|
|
|
|
+ 'aws:s3Bucket': req.body.s3Bucket,
|
|
|
|
|
+ 'aws:s3AccessKeyId': req.body.s3AccessKeyId,
|
|
|
|
|
+ 'aws:s3SecretAccessKey': req.body.s3SecretAccessKey,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- const { configManager } = crowi;
|
|
|
|
|
-
|
|
|
|
|
- // update config without publishing S2sMessage
|
|
|
|
|
- await configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
|
|
|
|
|
|
|
+ await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
|
|
|
|
|
+ await crowi.setUpFileUpload(true);
|
|
|
|
|
+ crowi.fileUploaderSwitchService.publishUpdatedMessage();
|
|
|
|
|
|
|
|
const awsSettingParams = {
|
|
const awsSettingParams = {
|
|
|
- region: crowi.configManager.getConfig('crowi', 'aws:region'),
|
|
|
|
|
- customEndpoint: crowi.configManager.getConfig('crowi', 'aws:customEndpoint'),
|
|
|
|
|
- bucket: crowi.configManager.getConfig('crowi', 'aws:bucket'),
|
|
|
|
|
- accessKeyId: crowi.configManager.getConfig('crowi', 'aws:accessKeyId'),
|
|
|
|
|
- secretAccessKey: crowi.configManager.getConfig('crowi', 'aws:secretAccessKey'),
|
|
|
|
|
|
|
+ s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
|
|
|
|
|
+ s3CustomEndpoint: crowi.configManager.getConfig('crowi', 'aws:s3CustomEndpoint'),
|
|
|
|
|
+ s3Bucket: crowi.configManager.getConfig('crowi', 'aws:s3Bucket'),
|
|
|
|
|
+ s3AccessKeyId: crowi.configManager.getConfig('crowi', 'aws:s3AccessKeyId'),
|
|
|
|
|
+ s3SecretAccessKey: crowi.configManager.getConfig('crowi', 'aws:s3SecretAccessKey'),
|
|
|
};
|
|
};
|
|
|
return res.apiv3({ awsSettingParams });
|
|
return res.apiv3({ awsSettingParams });
|
|
|
}
|
|
}
|
|
@@ -562,6 +601,57 @@ module.exports = (crowi) => {
|
|
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @swagger
|
|
|
|
|
+ *
|
|
|
|
|
+ * /app-settings/gcs-setting:
|
|
|
|
|
+ * put:
|
|
|
|
|
+ * tags: [AppSettings]
|
|
|
|
|
+ * operationId: updateAppSettingGcsSetting
|
|
|
|
|
+ * summary: /app-settings/gcs-setting
|
|
|
|
|
+ * description: Update gcs setting
|
|
|
|
|
+ * requestBody:
|
|
|
|
|
+ * required: true
|
|
|
|
|
+ * content:
|
|
|
|
|
+ * application/json:
|
|
|
|
|
+ * schema:
|
|
|
|
|
+ * $ref: '#/components/schemas/GcsSettingParams'
|
|
|
|
|
+ * responses:
|
|
|
|
|
+ * 200:
|
|
|
|
|
+ * description: Succeeded to update gcs setting
|
|
|
|
|
+ * content:
|
|
|
|
|
+ * application/json:
|
|
|
|
|
+ * schema:
|
|
|
|
|
+ * $ref: '#/components/schemas/GcsSettingParams'
|
|
|
|
|
+ */
|
|
|
|
|
+ router.put('/gcs-setting', loginRequiredStrictly, adminRequired, csrf, validator.gcsSetting, apiV3FormValidator, async(req, res) => {
|
|
|
|
|
+ const requestGcsSettingParams = {
|
|
|
|
|
+ 'app:fileUploadType': req.body.fileUploadType,
|
|
|
|
|
+ 'gcs:apiKeyJsonPath': req.body.gcsApiKeyJsonPath,
|
|
|
|
|
+ 'gcs:bucket': req.body.gcsBucket,
|
|
|
|
|
+ 'gcs:uploadNamespace': req.body.gcsUploadNamespace,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestGcsSettingParams, true);
|
|
|
|
|
+ await crowi.setUpFileUpload(true);
|
|
|
|
|
+ crowi.fileUploaderSwitchService.publishUpdatedMessage();
|
|
|
|
|
+
|
|
|
|
|
+ const gcsSettingParams = {
|
|
|
|
|
+ gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),
|
|
|
|
|
+ gcsBucket: crowi.configManager.getConfig('crowi', 'gcs:bucket'),
|
|
|
|
|
+ gcsUploadNamespace: crowi.configManager.getConfig('crowi', 'gcs:uploadNamespace'),
|
|
|
|
|
+ };
|
|
|
|
|
+ return res.apiv3({ gcsSettingParams });
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ const msg = 'Error occurred in updating aws setting';
|
|
|
|
|
+ logger.error('Error', err);
|
|
|
|
|
+ return res.apiv3Err(new ErrorV3(msg, 'update-awsSetting-failed'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* @swagger
|
|
* @swagger
|
|
|
*
|
|
*
|