|
| 1 | +class Slack::ApplicationController < ApplicationController |
| 2 | + skip_before_action :verify_authenticity_token |
| 3 | + before_action :valid_slack_request? |
| 4 | + |
| 5 | + private |
| 6 | + |
| 7 | + def valid_slack_request? |
| 8 | + @verified ||= verify_slack_signature |
| 9 | + end |
| 10 | + |
| 11 | + def verify_slack_signature |
| 12 | + timestamp = request.headers["X-Slack-Request-Timestamp"] |
| 13 | + signature = request.headers["X-Slack-Signature"] |
| 14 | + |
| 15 | + if Time.now.to_i - timestamp.to_i > 300 |
| 16 | + @verified = false |
| 17 | + return |
| 18 | + end |
| 19 | + |
| 20 | + base_string = "v0:#{timestamp}:#{request.raw_post}" |
| 21 | + my_signature = "v0=" + OpenSSL::HMAC.hexdigest( |
| 22 | + "SHA256", |
| 23 | + ENV["SLACK_SIGNING_SECRET"], |
| 24 | + base_string |
| 25 | + ) |
| 26 | + |
| 27 | + ActiveSupport::SecurityUtils.secure_compare(signature, my_signature) |
| 28 | + end |
| 29 | + |
| 30 | + def slack_client |
| 31 | + @slack_client ||= SlackClient::Client.instance |
| 32 | + end |
| 33 | + |
| 34 | + def open_view(view, trigger_id:) |
| 35 | + slack_client = SlackClient::Client.instance |
| 36 | + slack_client.views_open view: view, trigger_id: trigger_id |
| 37 | + rescue Slack::Web::Api::Errors::SlackError => e |
| 38 | + Rails.logger.error "Failed to open Slack modal: #{e.message} #{e.response_metadata}" |
| 39 | + head :unprocessable_entity |
| 40 | + end |
| 41 | + |
| 42 | + def send_message(message, channel_id:) |
| 43 | + SlackClient::Client.instance.chat_postMessage(channel: channel_id, blocks: message) |
| 44 | + rescue Slack::Web::Api::Errors::SlackError |
| 45 | + head :unprocessable_entity |
| 46 | + end |
| 47 | +end |
0 commit comments