Explorar el Código

Merge branch 'feat/growi-bot' into fix/behavior-when-clicked-reset-button

zahmis hace 4 años
padre
commit
900fcd2ddc

+ 2 - 0
config/env.dev.js

@@ -24,4 +24,6 @@ module.exports = {
   // PROMSTER_ENABLED: true,
   // SLACK_SIGNING_SECRET: '',
   // SLACK_BOT_TOKEN: '',
+  SALT_FOR_GTOP_TOKEN: 'proxy',
+  SALT_FOR_PTOG_TOKEN: 'growi',
 };

+ 21 - 5
src/client/js/components/Admin/SlackIntegration/OfficialbotSettingsAccordion.jsx

@@ -1,20 +1,37 @@
-import React from 'react';
+import React, { useState } from 'react';
 import PropTypes from 'prop-types';
 import { useTranslation } from 'react-i18next';
 import { CopyToClipboard } from 'react-copy-to-clipboard';
+import loggerFactory from '@alias/logger';
 import Accordion from '../Common/Accordion';
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
-import { toastSuccess } from '../../../util/apiNotification';
+import { toastSuccess, toastError } from '../../../util/apiNotification';
 import { withUnstatedContainers } from '../../UnstatedUtils';
 import AppContainer from '../../../services/AppContainer';
 
+const logger = loggerFactory('growi:SlackBotSettings'); //
 
 const OfficialBotSettingsAccordion = (props) => {
   // TODO: apply i18n by GW-5878
   const { t } = useTranslation();
   const { appContainer } = props;
+  const [proxyUri, setProxyUri] = useState(null);
+
   const growiUrl = appContainer.config.crowi.url;
 
+  const updateProxyUri = async() => {
+    try {
+      await appContainer.apiv3.put('/slack-integration-settings/proxy-uri', {
+        proxyUri,
+      });
+      toastSuccess(t('toaster.update_successed', { target: t('Proxy URL') }));
+    }
+    catch (err) {
+      toastError(err);
+      logger.error(err);
+    }
+  };
+
   return (
     <div className="card border-0 rounded-lg shadow overflow-hidden">
       <Accordion
@@ -104,14 +121,13 @@ const OfficialBotSettingsAccordion = (props) => {
               <input
                 className="form-control"
                 type="text"
+                onChange={(e) => { setProxyUri(e.target.value) }}
               />
             </div>
           </div>
           <AdminUpdateButtonRow
             disabled={false}
-            // TODO: Add Proxy URL submit logic
-            // eslint-disable-next-line no-console
-            onClick={() => console.log('Update')}
+            onClick={() => updateProxyUri()}
           />
         </div>
       </Accordion>

+ 3 - 3
src/server/models/slack-app-integration.js

@@ -10,9 +10,9 @@ class SlackAppIntegration {
   static generateAccessToken() {
     const hasher1 = crypto.createHash('sha512');
     const hasher2 = crypto.createHash('sha512');
-    const tokenGtoP = hasher1.update(`${new Date().getTime().toString()}proxy`).digest('base64');
-    const tokenPtoG = hasher2.update(`${new Date().getTime().toString()}growi`).digest('base64');
-    return [tokenGtoP, tokenPtoG];
+    const tokenGtoP = hasher1.update(new Date().getTime().toString() + process.env.SALT_FOR_GTOP_TOKEN);
+    const tokenPtoG = hasher2.update(new Date().getTime().toString() + process.env.SALT_FOR_PTOG_TOKEN);
+    return [tokenGtoP.digest('base64'), tokenPtoG.digest('base64')];
   }
 
 }

+ 24 - 15
src/server/routes/apiv3/slack-integration-settings.js

@@ -2,8 +2,6 @@ const mongoose = require('mongoose');
 const express = require('express');
 const { body } = require('express-validator');
 const axios = require('axios');
-const crypto = require('crypto');
-
 const loggerFactory = require('@alias/logger');
 
 const { getConnectionStatuses } = require('@growi/slack');
@@ -82,14 +80,6 @@ module.exports = (crowi) => {
     return configManager.updateConfigsInTheSameNamespace('crowi', params, true);
   }
 
-  // eslint-disable-next-line no-unused-vars
-  function generateAccessToken(user) {
-    const hasher = crypto.createHash('sha512');
-    hasher.update(new Date().getTime() + user._id);
-
-    return hasher.digest('base64');
-  }
-
   async function getConnectionStatusesFromProxy(tokens) {
     const csv = tokens.join(',');
 
@@ -271,7 +261,7 @@ module.exports = (crowi) => {
   /**
    * @swagger
    *
-    *    /slack-integration/access-tokens:
+   *    /slack-integration/access-tokens:
    *      put:
    *        tags: [SlackIntegration]
    *        operationId: putAccessTokens
@@ -286,14 +276,14 @@ module.exports = (crowi) => {
     let checkTokens;
     let tokenGtoP;
     let tokenPtoG;
+    let generateTokens;
     do {
-      // TODO imple generate tokens at GW-5859. The following tokens is temporary.
-      tokenGtoP = 'v2';
-      tokenPtoG = 'v2';
+      generateTokens = SlackAppIntegration.generateAccessToken();
+      tokenGtoP = generateTokens[0];
+      tokenPtoG = generateTokens[1];
       // eslint-disable-next-line no-await-in-loop
       checkTokens = await SlackAppIntegration.findOne({ $or: [{ tokenGtoP }, { tokenPtoG }] });
     } while (checkTokens != null);
-
     try {
       const slackAppTokens = await SlackAppIntegration.create({ tokenGtoP, tokenPtoG });
       return res.apiv3(slackAppTokens, 200);
@@ -305,5 +295,24 @@ module.exports = (crowi) => {
     }
   });
 
+  router.put('/proxy-uri', loginRequiredStrictly, adminRequired, csrf, async(req, res) => {
+    const { proxyUri } = req.body;
+    console.log('proxyUri', proxyUri);
+
+    const requestParams = { 'slackbot:serverUri': proxyUri };
+
+    try {
+      await updateSlackBotSettings(requestParams);
+      crowi.slackBotService.publishUpdatedMessage();
+      return res.apiv3({});
+    }
+    catch (error) {
+      const msg = 'Error occured in updating Custom bot setting';
+      logger.error('Error', error);
+      return res.apiv3Err(new ErrorV3(msg, 'update-CustomBotSetting-failed'), 500);
+    }
+
+  });
+
   return router;
 };

+ 6 - 0
src/server/service/config-loader.js

@@ -410,6 +410,12 @@ const ENV_VAR_NAME_TO_CONFIG_INFO = {
     type:    TYPES.STRING,
     default: null,
   },
+  SERVER_URI: {
+    ns:      'crowi',
+    key:     'slackbot:serverUri',
+    type:    TYPES.STRING,
+    default: null,
+  },
   SLACK_BOT_TYPE: {
     ns:      'crowi',
     key:     'slackbot:currentBotType', // 'officialBot' || 'customBotWithoutProxy' || 'customBotWithProxy'