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

Merge pull request #2700 from weseek/imprv/separate-ses-settings

Imprv/separate ses settings
Yuki Takei 5 лет назад
Родитель
Сommit
666bb84a6b

+ 1 - 1
resource/locales/en_US/admin/admin.json

@@ -35,9 +35,9 @@
     "initialize_mail_settings": "initialize e-mail settings",
     "initialize_mail_settings": "initialize e-mail settings",
     "initialize_mail_modal_header": "Initialize e-mail settings",
     "initialize_mail_modal_header": "Initialize e-mail settings",
     "confirm_to_initialize_mail_settings": "You can't restore to the current settings. Are you sure you want to initialize e-mail settings?",
     "confirm_to_initialize_mail_settings": "You can't restore to the current settings. Are you sure you want to initialize e-mail settings?",
+    "ses_settings":"SES settings",
     "aws_settings": "AWS settings",
     "aws_settings": "AWS settings",
     "aws_access": "This is for AWS settings. If you complete AWS settings, file upload function, profile picture function etc will be enabled.",
     "aws_access": "This is for AWS settings. If you complete AWS settings, file upload function, profile picture function etc will be enabled.",
-    "no_smtp_setting": "If you do not have SMTP settings, e-mails will be sent via SES. You need to verify from e-mail address and production settings.",
     "change_setting": "Caution:if you change this setting not completed, you will not be able to access files you have uploaded so far.",
     "change_setting": "Caution:if you change this setting not completed, you will not be able to access files you have uploaded so far.",
     "region": "Region",
     "region": "Region",
     "bucket_name": "Bucket name",
     "bucket_name": "Bucket name",

+ 1 - 1
resource/locales/ja_JP/admin/admin.json

@@ -35,9 +35,9 @@
     "initialize_mail_settings": "設定を初期化",
     "initialize_mail_settings": "設定を初期化",
     "initialize_mail_modal_header": "メール設定の初期化",
     "initialize_mail_modal_header": "メール設定の初期化",
     "confirm_to_initialize_mail_settings": "一度初期化した設定は戻せません。本当に初期化しますか?",
     "confirm_to_initialize_mail_settings": "一度初期化した設定は戻せません。本当に初期化しますか?",
+    "ses_settings":"SES設定",
     "aws_settings": "AWS設定",
     "aws_settings": "AWS設定",
     "aws_access": "AWS にアクセスするための設定を行います。AWS の設定を完了させると、ファイルアップロード機能、プロフィール写真機能などが有効になります。",
     "aws_access": "AWS にアクセスするための設定を行います。AWS の設定を完了させると、ファイルアップロード機能、プロフィール写真機能などが有効になります。",
-    "no_smtp_setting": "また、SMTP の設定が無い場合、SES を利用したメール送信が行われます。FromメールアドレスのVerify、プロダクション利用設定をする必要があります。",
     "change_setting": "この設定を途中で変更すると、これまでにアップロードしたファイル等へのアクセスができなくなりますのでご注意下さい。",
     "change_setting": "この設定を途中で変更すると、これまでにアップロードしたファイル等へのアクセスができなくなりますのでご注意下さい。",
     "region": "リージョン",
     "region": "リージョン",
     "bucket_name": "バケット名",
     "bucket_name": "バケット名",

+ 2 - 1
resource/locales/zh_CN/admin/admin.json

@@ -35,9 +35,10 @@
     "initialize_mail_settings": "重置邮件设置",
     "initialize_mail_settings": "重置邮件设置",
     "initialize_mail_modal_header": "重置邮件设置",
     "initialize_mail_modal_header": "重置邮件设置",
     "confirm_to_initialize_mail_settings": "当前设置将被清空且不可恢复。确认重置?",
     "confirm_to_initialize_mail_settings": "当前设置将被清空且不可恢复。确认重置?",
+    "ses_settings":"SES设置",
 		"aws_settings": "AWS设置",
 		"aws_settings": "AWS设置",
 		"aws_access": "这是用于AWS设置的。如果您完成了AWS设置,文件上传功能,个人资料图片功能等将被启用。",
 		"aws_access": "这是用于AWS设置的。如果您完成了AWS设置,文件上传功能,个人资料图片功能等将被启用。",
-		"no_smtp_setting": "如果您没有SMTP设置,电子邮件将通过SES发送。您需要从电子邮件地址和生产设置进行验证。",
+		"": "如果您没有SMTP设置,电子邮件将通过SES发送。您需要从电子邮件地址和生产设置进行验证。",
 		"change_setting": "注意:如果你更改此设置未完成,您将无法访问迄今为止上传的文件。",
 		"change_setting": "注意:如果你更改此设置未完成,您将无法访问迄今为止上传的文件。",
 		"region": "Region",
 		"region": "Region",
 		"bucket_name": "Bucket name",
 		"bucket_name": "Bucket name",

+ 0 - 3
src/client/js/components/Admin/App/AwsSetting.jsx

@@ -41,9 +41,6 @@ class AwsSetting extends React.Component {
         <p className="card well">
         <p className="card well">
           {t('admin:app_setting.aws_access')}
           {t('admin:app_setting.aws_access')}
           <br />
           <br />
-          {t('admin:app_setting.no_smtp_setting')}
-          <br />
-          <br />
           <span className="text-danger">
           <span className="text-danger">
             <i className="ti-unlink"></i>
             <i className="ti-unlink"></i>
             {t('admin:app_setting.change_setting')}
             {t('admin:app_setting.change_setting')}

+ 3 - 3
src/client/js/components/Admin/App/SesSetting.jsx

@@ -22,8 +22,8 @@ function SmtpSetting(props) {
     const { t } = props;
     const { t } = props;
 
 
     try {
     try {
-      // TODO GW-3627 update ses setting
-      toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.mail_settings') }));
+      await adminAppContainer.updateSesSettingHandler();
+      toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.ses_settings') }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -34,7 +34,7 @@ function SmtpSetting(props) {
   return (
   return (
     <React.Fragment>
     <React.Fragment>
       <div id="mail-smtp" className="tab-pane active mt-5">
       <div id="mail-smtp" className="tab-pane active mt-5">
-        <label className="col-md-3 col-form-label text-left mb-3">SES {t('settings')}</label>
+        <label className="col-md-3 col-form-label text-left mb-3">{t('admin:app_setting.ses_settings')}</label>
 
 
         <div className="row form-group">
         <div className="row form-group">
           <label className="text-left text-md-right col-md-3 col-form-label">
           <label className="text-left text-md-right col-md-3 col-form-label">

+ 14 - 1
src/client/js/services/AdminAppContainer.js

@@ -260,7 +260,6 @@ export default class AdminAppContainer extends Container {
    */
    */
   async updateMailSettingHandler() {
   async updateMailSettingHandler() {
     const response = await this.appContainer.apiv3.put('/app-settings/mail-setting', {
     const response = await this.appContainer.apiv3.put('/app-settings/mail-setting', {
-      fromAddress: this.state.fromAddress,
       smtpHost: this.state.smtpHost,
       smtpHost: this.state.smtpHost,
       smtpPort: this.state.smtpPort,
       smtpPort: this.state.smtpPort,
       smtpUser: this.state.smtpUser,
       smtpUser: this.state.smtpUser,
@@ -270,6 +269,20 @@ export default class AdminAppContainer extends Container {
     return mailSettingParams;
     return mailSettingParams;
   }
   }
 
 
+  /**
+   * Update ses setting
+   * @memberOf AdminAppContainer
+   * @return {Array} Appearance
+   */
+  async updateSesSettingHandler() {
+    const response = await this.appContainer.apiv3.put('/app-settings/ses-setting', {
+      sesAccessKeyId: this.state.sesAccessKeyId,
+      sesSecretAccessKey: this.state.sesSecretAccessKey,
+    });
+    const { mailSettingParams } = response.data;
+    return mailSettingParams;
+  }
+
   /**
   /**
    * Initialize mail setting
    * Initialize mail setting
    * @memberOf AdminAppContainer
    * @memberOf AdminAppContainer

+ 58 - 1
src/server/routes/apiv3/app-settings.js

@@ -73,6 +73,16 @@ const ErrorV3 = require('../../models/vo/error-apiv3');
  *          smtpPassword:
  *          smtpPassword:
  *            type: string
  *            type: string
  *            description: password of client's smtp server
  *            description: password of client's smtp server
+ *      SesSettingParams:
+ *        description: SesSettingParams
+ *        type: object
+ *        properties:
+ *          accessKeyId:
+ *            type: string
+ *            description: accesskey id for authentification of AWS
+ *          secretAccessKey:
+ *            type: string
+ *            description: secret key for authentification of AWS
  *      AwsSettingParams:
  *      AwsSettingParams:
  *        description: AwsSettingParams
  *        description: AwsSettingParams
  *        type: object
  *        type: object
@@ -128,11 +138,15 @@ module.exports = (crowi) => {
       body('smtpUser').trim(),
       body('smtpUser').trim(),
       body('smtpPassword').trim(),
       body('smtpPassword').trim(),
     ],
     ],
+    sesSetting: [
+      body('sesAccessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
+      body('sesSecretAccessKey').trim(),
+    ],
     awsSetting: [
     awsSetting: [
       body('region').trim().matches(/^[a-z]+-[a-z]+-\d+$/).withMessage((value, { req }) => req.t('validation.aws_region')),
       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('customEndpoint').trim().matches(/^(https?:\/\/[^/]+|)$/).withMessage((value, { req }) => req.t('validation.aws_custom_endpoint')),
       body('bucket').trim(),
       body('bucket').trim(),
-      body('accessKeyId').trim().matches(/^[\da-zA-Z]+$/),
+      body('accessKeyId').trim().if(value => value !== '').matches(/^[\da-zA-Z]+$/),
       body('secretAccessKey').trim(),
       body('secretAccessKey').trim(),
     ],
     ],
     pluginSetting: [
     pluginSetting: [
@@ -173,6 +187,8 @@ module.exports = (crowi) => {
       smtpPort: crowi.configManager.getConfig('crowi', 'mail:smtpPort'),
       smtpPort: crowi.configManager.getConfig('crowi', 'mail:smtpPort'),
       smtpUser: crowi.configManager.getConfig('crowi', 'mail:smtpUser'),
       smtpUser: crowi.configManager.getConfig('crowi', 'mail:smtpUser'),
       smtpPassword: crowi.configManager.getConfig('crowi', 'mail:smtpPassword'),
       smtpPassword: crowi.configManager.getConfig('crowi', 'mail:smtpPassword'),
+      sesAccessKeyId: crowi.configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
+      sesSecretAccessKey: crowi.configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
       region: crowi.configManager.getConfig('crowi', 'aws:region'),
       region: crowi.configManager.getConfig('crowi', 'aws:region'),
       customEndpoint: crowi.configManager.getConfig('crowi', 'aws:customEndpoint'),
       customEndpoint: crowi.configManager.getConfig('crowi', 'aws:customEndpoint'),
       bucket: crowi.configManager.getConfig('crowi', 'aws:bucket'),
       bucket: crowi.configManager.getConfig('crowi', 'aws:bucket'),
@@ -442,6 +458,47 @@ module.exports = (crowi) => {
     }
     }
   });
   });
 
 
+  /**
+   * @swagger
+   *
+   *    /app-settings/ses-setting:
+   *      put:
+   *        tags: [AppSettings]
+   *        operationId: updateAppSettingSesSetting
+   *        summary: /app-settings/ses-setting
+   *        description: Update ses setting
+   *        requestBody:
+   *          required: true
+   *          content:
+   *            application/json:
+   *              schema:
+   *                $ref: '#/components/schemas/SesSettingParams'
+   *        responses:
+   *          200:
+   *            description: Succeeded to update ses setting
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  $ref: '#/components/schemas/SesSettingParams'
+   */
+  router.put('/ses-setting', loginRequiredStrictly, adminRequired, csrf, validator.sesSetting, apiV3FormValidator, async(req, res) => {
+
+    const requestSesSettingParams = {
+      'mail:sesAccessKeyId': req.body.sesAccessKeyId,
+      'mail:sesSecretAccessKey': req.body.sesSecretAccessKey,
+    };
+
+    try {
+      const mailSettingParams = await updateMailSettinConfig(requestSesSettingParams);
+      return res.apiv3({ mailSettingParams });
+    }
+    catch (err) {
+      const msg = 'Error occurred in updating ses setting';
+      logger.error('Error', err);
+      return res.apiv3Err(new ErrorV3(msg, 'update-ses-setting-failed'));
+    }
+  });
+
   /**
   /**
    * @swagger
    * @swagger
    *
    *

+ 3 - 3
src/server/service/mail.js

@@ -75,7 +75,7 @@ class MailService extends S2sMessageHandlable {
       this.mailer = this.createSMTPClient();
       this.mailer = this.createSMTPClient();
     }
     }
     // Priority 2. SES
     // Priority 2. SES
-    else if (configManager.getConfig('crowi', 'aws:accessKeyId') && configManager.getConfig('crowi', 'aws:secretAccessKey')) {
+    else if (configManager.getConfig('crowi', 'mail:sesAccessKeyId') && configManager.getConfig('crowi', 'mail:sesSecretAccessKey')) {
       this.mailer = this.createSESClient();
       this.mailer = this.createSESClient();
     }
     }
     else {
     else {
@@ -121,8 +121,8 @@ class MailService extends S2sMessageHandlable {
 
 
     if (!option) {
     if (!option) {
       option = { // eslint-disable-line no-param-reassign
       option = { // eslint-disable-line no-param-reassign
-        accessKeyId: configManager.getConfig('crowi', 'aws:accessKeyId'),
-        secretAccessKey: configManager.getConfig('crowi', 'aws:secretAccessKey'),
+        accessKeyId: configManager.getConfig('crowi', 'mail:sesAccessKeyId'),
+        secretAccessKey: configManager.getConfig('crowi', 'mail:sesSecretAccessKey'),
       };
       };
     }
     }