]> git.cworth.org Git - turbot/blob - turbot/slack.py
Add notes on how to update the Google sheets credentials
[turbot] / turbot / slack.py
1 import hashlib
2 import hmac
3 import os
4 import boto3
5
6 if 'SLACK_SIGNING_SECRET' in os.environ:
7     slack_signing_secret = os.environ['SLACK_SIGNING_SECRET']
8 else:
9     ssm = boto3.client('ssm')
10     response = ssm.get_parameter(Name='SLACK_SIGNING_SECRET',
11                                  WithDecryption=True)
12     slack_signing_secret = response['Parameter']['Value']
13     os.environ['SLACK_SIGNING_SECRET'] = slack_signing_secret
14
15 slack_signing_secret = bytes(os.environ['SLACK_SIGNING_SECRET'], 'utf-8')
16
17 def slack_is_valid_request(slack_signature, timestamp, body):
18     """Returns True if the timestamp and body correspond to signature.
19
20     This implements the Slack signature verification using the slack
21     signing secret (obtained via an SSM parameter in code above)."""
22
23     content = "v0:{}:{}".format(timestamp, body).encode('utf-8')
24
25     signature = 'v0=' + hmac.new(slack_signing_secret,
26                                  content,
27                                  hashlib.sha256).hexdigest()
28
29     if hmac.compare_digest(signature, slack_signature):
30         return True
31     else:
32         print("Bad signature: {} != {}".format(signature, slack_signature))
33         return False
34
35 def slack_channel_members(slack_client, channel_id):
36     members = []
37
38     cursor = None
39     while True:
40         if cursor:
41             response = slack_client.conversations_members(channel=channel_id,
42                                                           cursor=cursor)
43         else:
44             response = slack_client.conversations_members(channel=channel_id)
45
46         if response['ok']:
47             members += response['members']
48         else:
49             print("Error querying members of channel {}: {}"
50                   .format(channel_id, response['error']))
51             return members
52
53         cursor = None
54         if 'next_cursor' in response['response_metadata']:
55             cursor = response['response_metadata']['next_cursor']
56
57         if not cursor or cursor == '':
58             break
59
60     return members
61
62 def slack_send_message(slack_client, channel_id, text, blocks=None):
63     if blocks:
64         slack_client.chat_postMessage(channel=channel_id,
65                                       text=text, blocks=blocks)
66     else:
67         slack_client.chat_postMessage(channel=channel_id, text=text)