slack-app-integration.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. supportedCommandsForBroadcastUse: { type: [String], default: [] },
  7. supportedCommandsForSingleUse: { type: [String], default: [] },
  8. });
  9. class SlackAppIntegration {
  10. static generateAccessTokens() {
  11. const now = new Date().getTime();
  12. const hasher1 = crypto.createHash('sha512');
  13. const hasher2 = crypto.createHash('sha512');
  14. const tokenGtoP = hasher1.update(`gtop${now.toString()}${process.env.SALT_FOR_GTOP_TOKEN}`).digest('base64');
  15. const tokenPtoG = hasher2.update(`ptog${now.toString()}${process.env.SALT_FOR_PTOG_TOKEN}`).digest('base64');
  16. return [tokenGtoP, tokenPtoG];
  17. }
  18. static async generateUniqueAccessTokens() {
  19. let duplicateTokens;
  20. let tokenGtoP;
  21. let tokenPtoG;
  22. let generateTokens;
  23. do {
  24. generateTokens = this.generateAccessTokens();
  25. tokenGtoP = generateTokens[0];
  26. tokenPtoG = generateTokens[1];
  27. // eslint-disable-next-line no-await-in-loop
  28. duplicateTokens = await this.findOne({ $or: [{ tokenGtoP }, { tokenPtoG }] });
  29. } while (duplicateTokens != null);
  30. return { tokenGtoP, tokenPtoG };
  31. }
  32. }
  33. module.exports = function(crowi) {
  34. SlackAppIntegration.crowi = crowi;
  35. schema.loadClass(SlackAppIntegration);
  36. return mongoose.model('SlackAppIntegration', schema);
  37. };