slack-app-integration.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const crypto = require('crypto');
  2. const mongoose = require('mongoose');
  3. const { defaultSupportedCommandsNameForBroadcastUse, defaultSupportedCommandsNameForSingleUse } = require('@growi/slack');
  4. const schema = new mongoose.Schema({
  5. tokenGtoP: { type: String, required: true, unique: true },
  6. tokenPtoG: { type: String, required: true, unique: true },
  7. isPrimary: { type: Boolean, unique: true, sparse: true },
  8. supportedCommandsForBroadcastUse: { type: [String], default: defaultSupportedCommandsNameForBroadcastUse },
  9. supportedCommandsForSingleUse: { type: [String], default: defaultSupportedCommandsNameForSingleUse },
  10. });
  11. class SlackAppIntegration {
  12. crowi;
  13. static generateAccessTokens(saltForGtoP, saltForPtoG) {
  14. const now = new Date().getTime();
  15. const hasher1 = crypto.createHash('sha512');
  16. const hasher2 = crypto.createHash('sha512');
  17. const tokenGtoP = hasher1.update(`gtop-${saltForGtoP}-${now.toString()}`).digest('base64');
  18. const tokenPtoG = hasher2.update(`ptog-${saltForPtoG}-${now.toString()}`).digest('base64');
  19. return [tokenGtoP, tokenPtoG];
  20. }
  21. static async generateUniqueAccessTokens() {
  22. let duplicateTokens;
  23. let tokenGtoP;
  24. let tokenPtoG;
  25. let generateTokens;
  26. // get salt strings
  27. const saltForGtoP = this.crowi.configManager.getConfig('crowi', 'slackbot:withProxy:saltForGtoP');
  28. const saltForPtoG = this.crowi.configManager.getConfig('crowi', 'slackbot:withProxy:saltForPtoG');
  29. do {
  30. generateTokens = this.generateAccessTokens(saltForGtoP, saltForPtoG);
  31. tokenGtoP = generateTokens[0];
  32. tokenPtoG = generateTokens[1];
  33. // eslint-disable-next-line no-await-in-loop
  34. duplicateTokens = await this.findOne({ $or: [{ tokenGtoP }, { tokenPtoG }] });
  35. } while (duplicateTokens != null);
  36. return { tokenGtoP, tokenPtoG };
  37. }
  38. }
  39. module.exports = function(crowi) {
  40. SlackAppIntegration.crowi = crowi;
  41. schema.loadClass(SlackAppIntegration);
  42. return mongoose.model('SlackAppIntegration', schema);
  43. };