slack-app-integration.js 1.7 KB

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