slack-ruby-bot-server 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/README.md +45 -8
- data/UPGRADING.md +28 -2
- data/lib/slack-ruby-bot-server.rb +1 -1
- data/lib/slack-ruby-bot-server/api/endpoints/teams_endpoint.rb +19 -5
- data/lib/slack-ruby-bot-server/config.rb +2 -0
- data/lib/slack-ruby-bot-server/config/database_adapters/activerecord.rb +4 -0
- data/lib/slack-ruby-bot-server/models/team/mongoid.rb +3 -0
- data/lib/slack-ruby-bot-server/service.rb +6 -6
- data/lib/slack-ruby-bot-server/version.rb +1 -1
- data/public/scripts/register.js +3 -1
- data/sample_apps/sample_app_activerecord/db/migrate/20170307164946_create_teams_table.rb +0 -1
- data/sample_apps/sample_app_activerecord/db/migrate/20190323181453_add_activated_fields.rb +7 -0
- data/sample_apps/sample_app_activerecord/db/schema.rb +6 -3
- metadata +3 -3
- data/lib/slack-ruby-bot-server/models.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86a1479af364899fd951bee2d75f30d3fd32d2ccb60f3804716d574746f1b85e
|
4
|
+
data.tar.gz: 88cfbd7ed0bec93439f327f5389f9bff6a8eeeb0eeeb2d89f35fa3b08cefc416
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9efdeede9435e4d5bca785b0dbd567a65119892a2521882477e3e5e79480257886375f2170dd54166e6e05fa9be186e4f8da2f878bdae0674c7b76061ac9e66a
|
7
|
+
data.tar.gz: 2a7bf1ee2397aaca5a3337503209009e679e0ebf5daaeed374c8a75fb4ffb102d7a4298d87a8c5c092789932f1f259919119c7959ee21f0c3130c8d90195b673
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2019-
|
3
|
+
# on 2019-03-23 14:16:02 -0400 using RuboCop version 0.58.2.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
### Changelog
|
2
2
|
|
3
|
+
#### 0.10.0 (2019/3/23)
|
4
|
+
|
5
|
+
* [#97](https://github.com/slack-ruby/slack-ruby-bot-server/pull/97): Added `Config#service_class` to override the `SlackRubyBotServer::Service.instance` singleton - [@dblock](https://github.com/dblock).
|
6
|
+
* [#96](https://github.com/slack-ruby/slack-ruby-bot-server/pull/96): Added `Team#bot_user_id`, `activated_user_id` and `activated_user_access_token` - [@dblock](https://github.com/dblock).
|
7
|
+
* [#95](https://github.com/slack-ruby/slack-ruby-bot-server/pull/95): Expose the optional `state` parameter that is returned from the Add to Slack button - [@aok-solutions](https://github.com/aok-solutions).
|
8
|
+
|
3
9
|
#### 0.9.0 (2019/2/25)
|
4
10
|
|
5
11
|
* [#93](https://github.com/slack-ruby/slack-ruby-bot-server/pull/93): Removed ping worker in favor of slack-ruby-client lower level ping - [@dblock](https://github.com/dblock).
|
data/Gemfile
CHANGED
@@ -5,6 +5,7 @@ when 'mongoid' then
|
|
5
5
|
gem 'kaminari-mongoid'
|
6
6
|
gem 'mongoid'
|
7
7
|
gem 'mongoid-scroll'
|
8
|
+
gem 'mongoid-shell'
|
8
9
|
when 'activerecord' then
|
9
10
|
gem 'activerecord', '~> 5.0.0'
|
10
11
|
gem 'otr-activerecord', '~> 1.2.1'
|
@@ -26,7 +27,6 @@ group :development, :test do
|
|
26
27
|
gem 'fabrication'
|
27
28
|
gem 'faker'
|
28
29
|
gem 'hyperclient'
|
29
|
-
gem 'mongoid-shell'
|
30
30
|
gem 'rack-server-pages'
|
31
31
|
gem 'rack-test'
|
32
32
|
gem 'rake'
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ A library that contains a [Grape](http://github.com/ruby-grape/grape) API servin
|
|
13
13
|
|
14
14
|
### Stable Release
|
15
15
|
|
16
|
-
You're reading the documentation for the **stable** release of slack-ruby-bot-server, v0.
|
16
|
+
You're reading the documentation for the **stable** release of slack-ruby-bot-server, v0.10.0. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
|
17
17
|
|
18
18
|
### Try Me
|
19
19
|
|
@@ -103,15 +103,15 @@ You can introduce custom behavior into the service lifecycle via callbacks. This
|
|
103
103
|
```ruby
|
104
104
|
instance = SlackRubyBotServer::Service.instance
|
105
105
|
|
106
|
-
instance.on :created do |team, error|
|
106
|
+
instance.on :created do |team, error, options|
|
107
107
|
# a new team has been registered
|
108
108
|
end
|
109
109
|
|
110
|
-
instance.on :deactivated do |team, error|
|
110
|
+
instance.on :deactivated do |team, error, options|
|
111
111
|
# an existing team has been deactivated in Slack
|
112
112
|
end
|
113
113
|
|
114
|
-
instance.on :error do |team, error|
|
114
|
+
instance.on :error do |team, error, options|
|
115
115
|
# an error has occurred
|
116
116
|
end
|
117
117
|
```
|
@@ -132,6 +132,25 @@ The following callbacks are supported. All callbacks receive a `team`, except `e
|
|
132
132
|
| deactivating | a team is being deactivated |
|
133
133
|
| deactivated | a team has been deactivated |
|
134
134
|
|
135
|
+
|
136
|
+
The [Add to Slack button](https://api.slack.com/docs/slack-button) also allows for an optional `state` parameter that will be returned on completion of the request. The `creating` and `created` callbacks include an options hash where this value can be accessed (to check for forgery attacks for instance).
|
137
|
+
```ruby
|
138
|
+
auth = OpenSSL::HMAC.hexdigest("SHA256", "key", "data")
|
139
|
+
```
|
140
|
+
```html
|
141
|
+
<a href="https://slack.com/oauth/authorize?scope=bot&client_id=<%= ENV['SLACK_CLIENT_ID'] %>&state=#{auth)"> ... </a>
|
142
|
+
```
|
143
|
+
```ruby
|
144
|
+
instance = SlackRubyBotServer::Service.instance
|
145
|
+
instance.on :creating do |team, error, options|
|
146
|
+
raise "Unauthorized response" unless options[:state] == auth
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
A number of extensions use service manager callbacks to implement useful functionality.
|
151
|
+
|
152
|
+
* [slack-ruby-bot-server-mailchimp](https://github.com/slack-ruby/slack-ruby-bot-server-mailchimp): Subscribes new bot users to a Mailchimp mailing list.
|
153
|
+
|
135
154
|
#### Server Class
|
136
155
|
|
137
156
|
You can override the server class to handle additional events, and configure the service to use it.
|
@@ -152,14 +171,32 @@ SlackRubyBotServer.configure do |config|
|
|
152
171
|
end
|
153
172
|
```
|
154
173
|
|
174
|
+
#### Service Class
|
175
|
+
|
176
|
+
You can override the service class to handle additional methods.
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
class MyService < SlackRubyBotServer::Service
|
180
|
+
def url
|
181
|
+
'https://www.example.com'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
SlackRubyBotServer.configure do |config|
|
186
|
+
config.service_class = MyService
|
187
|
+
end
|
188
|
+
|
189
|
+
SlackRubyBotServer::Service.instance # MyService
|
190
|
+
SlackRubyBotServer::Service.instance.url # https://www.example.com
|
191
|
+
```
|
192
|
+
|
155
193
|
### Access Tokens
|
156
194
|
|
157
|
-
By default the implementation of [Team](lib/slack-ruby-bot-server/models/team) stores a `bot_access_token` that grants a certain amount of privileges to the bot user as described in [Slack OAuth Docs](https://api.slack.com/docs/oauth). You may not want a bot user at all, or may require different auth scopes, such as `users.profile:read` to access user profile information via `Slack::Web::Client#users_profile_get`. To
|
195
|
+
By default the implementation of [Team](lib/slack-ruby-bot-server/models/team) stores a `bot_access_token` as `token` that grants a certain amount of privileges to the bot user as described in [Slack OAuth Docs](https://api.slack.com/docs/oauth) along with `activated_user_access_token` that represents the token of the installing user. You may not want a bot user at all, or may require different auth scopes, such as `users.profile:read` to access user profile information via `Slack::Web::Client#users_profile_get`. To change required scopes make the following changes.
|
158
196
|
|
159
197
|
1) Configure your app to require additional scopes in Slack API under _OAuth_, _Permissions_
|
160
|
-
2)
|
161
|
-
3)
|
162
|
-
4) Store the access token returned from `Slack::Web::Client#oauth_access` and scope when creating a team in your `Teams` API endpoint.
|
198
|
+
2) Change the _Add to Slack_ buttons to require the additional scope, eg. `https://slack.com/oauth/authorize?scope=bot,users.profile:read&client_id=...`
|
199
|
+
3) The access token with the requested scopes will be stored as `activated_user_access_token`.
|
163
200
|
|
164
201
|
You can see a sample implementation in [slack-sup#3a497b](https://github.com/dblock/slack-sup/commit/3a497b436d25d3a7738562655cda64b180ae0096).
|
165
202
|
|
data/UPGRADING.md
CHANGED
@@ -1,9 +1,35 @@
|
|
1
1
|
Upgrading Slack-Ruby-Bot-Server
|
2
2
|
===============================
|
3
3
|
|
4
|
+
### Upgrading to >= 0.10.0
|
5
|
+
|
6
|
+
#### New Team Fields
|
7
|
+
|
8
|
+
The following fields have been added to `Team`.
|
9
|
+
|
10
|
+
* `bot_user_id`: the bot `user_id` during installation
|
11
|
+
* `activated_user_id`: the installing Slack user `user_id`
|
12
|
+
* `activated_user_access_token`: the installing Slack user `access_token`
|
13
|
+
|
14
|
+
No action is required for Mongoid.
|
15
|
+
|
16
|
+
If you're using ActiveRecord, create a migration similar to [sample_apps/sample_app_activerecord/db/migrate/20190323181453_add_activated_fields.rb](sample_apps/sample_app_activerecord/db/migrate/20190323181453_add_activated_fields.rb) to add these fields.
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
class AddActivatedFields < ActiveRecord::Migration[5.0]
|
20
|
+
def change
|
21
|
+
add_column :teams, :bot_user_id, :string
|
22
|
+
add_column :teams, :activated_user_id, :string
|
23
|
+
add_column :teams, :activated_user_access_token, :string
|
24
|
+
end
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
See [#96](https://github.com/slack-ruby/slack-ruby-bot-server/pull/96) for more information.
|
29
|
+
|
4
30
|
### Upgrading to >= 0.9.0
|
5
31
|
|
6
|
-
|
32
|
+
#### Removed Ping Worker
|
7
33
|
|
8
34
|
The ping worker that was added in 0.7.0 has been removed in favor of a lower level implementation in slack-ruby-client. Remove any references to `ping` options.
|
9
35
|
|
@@ -11,7 +37,7 @@ See [slack-ruby-client#226](https://github.com/slack-ruby/slack-ruby-client/pull
|
|
11
37
|
|
12
38
|
### Upgrading to >= 0.8.0
|
13
39
|
|
14
|
-
|
40
|
+
#### Different Asynchronous I/O Library
|
15
41
|
|
16
42
|
The library now uses [async-websocket](https://github.com/socketry/async-websocket) instead of [celluloid-io](https://github.com/celluloid/celluloid-io). If your application is built on Celluloid you may need to make changes and use `Async::Reactor.run` and the likes.
|
17
43
|
|
@@ -2,6 +2,7 @@ require 'async/websocket'
|
|
2
2
|
|
3
3
|
require 'grape-swagger'
|
4
4
|
require 'slack-ruby-bot'
|
5
|
+
require 'slack-ruby-bot-server/service'
|
5
6
|
require 'slack-ruby-bot-server/server'
|
6
7
|
require 'slack-ruby-bot-server/config'
|
7
8
|
|
@@ -13,4 +14,3 @@ require "slack-ruby-bot-server/config/database_adapters/#{SlackRubyBotServer::Co
|
|
13
14
|
|
14
15
|
require 'slack-ruby-bot-server/api'
|
15
16
|
require 'slack-ruby-bot-server/app'
|
16
|
-
require 'slack-ruby-bot-server/service'
|
@@ -33,6 +33,7 @@ module SlackRubyBotServer
|
|
33
33
|
desc 'Create a team using an OAuth token.'
|
34
34
|
params do
|
35
35
|
requires :code, type: String
|
36
|
+
optional :state, type: String
|
36
37
|
end
|
37
38
|
post do
|
38
39
|
client = Slack::Web::Client.new
|
@@ -46,21 +47,34 @@ module SlackRubyBotServer
|
|
46
47
|
)
|
47
48
|
|
48
49
|
token = rc['bot']['bot_access_token']
|
50
|
+
bot_user_id = rc['bot']['bot_user_id']
|
51
|
+
user_id = rc['user_id']
|
52
|
+
access_token = rc['access_token']
|
49
53
|
team = Team.where(token: token).first
|
50
54
|
team ||= Team.where(team_id: rc['team_id']).first
|
51
|
-
|
55
|
+
|
56
|
+
if team
|
57
|
+
team.update_attributes!(
|
58
|
+
activated_user_id: user_id,
|
59
|
+
activated_user_access_token: access_token,
|
60
|
+
bot_user_id: bot_user_id
|
61
|
+
)
|
62
|
+
raise "Team #{team.name} is already registered." if team.active?
|
52
63
|
team.activate!(token)
|
53
|
-
elsif team
|
54
|
-
raise "Team #{team.name} is already registered."
|
55
64
|
else
|
56
65
|
team = Team.create!(
|
57
66
|
token: token,
|
58
67
|
team_id: rc['team_id'],
|
59
|
-
name: rc['team_name']
|
68
|
+
name: rc['team_name'],
|
69
|
+
activated_user_id: user_id,
|
70
|
+
activated_user_access_token: access_token,
|
71
|
+
bot_user_id: bot_user_id
|
60
72
|
)
|
61
73
|
end
|
62
74
|
|
63
|
-
|
75
|
+
options = params.slice(:state)
|
76
|
+
|
77
|
+
Service.instance.create!(team, options)
|
64
78
|
present team, with: Presenters::TeamPresenter
|
65
79
|
end
|
66
80
|
end
|
@@ -3,10 +3,12 @@ module SlackRubyBotServer
|
|
3
3
|
extend self
|
4
4
|
|
5
5
|
attr_accessor :server_class
|
6
|
+
attr_accessor :service_class
|
6
7
|
attr_accessor :database_adapter
|
7
8
|
|
8
9
|
def reset!
|
9
10
|
self.server_class = SlackRubyBotServer::Server
|
11
|
+
self.service_class = SlackRubyBotServer::Service
|
10
12
|
self.database_adapter = if defined?(::Mongoid)
|
11
13
|
:mongoid
|
12
14
|
elsif defined?(::ActiveRecord)
|
@@ -12,11 +12,15 @@ module SlackRubyBotServer
|
|
12
12
|
|
13
13
|
def self.init!
|
14
14
|
return if ActiveRecord::Base.connection.tables.include?('teams')
|
15
|
+
|
15
16
|
ActiveRecord::Base.connection.create_table :teams do |t|
|
16
17
|
t.string :team_id
|
17
18
|
t.string :name
|
18
19
|
t.string :domain
|
19
20
|
t.string :token
|
21
|
+
t.string :bot_user_id
|
22
|
+
t.string :activated_user_id
|
23
|
+
t.string :activated_user_access_token
|
20
24
|
t.boolean :active, default: true
|
21
25
|
t.timestamps
|
22
26
|
end
|
@@ -9,6 +9,9 @@ class Team
|
|
9
9
|
field :domain, type: String
|
10
10
|
field :token, type: String
|
11
11
|
field :active, type: Boolean, default: true
|
12
|
+
field :bot_user_id, type: String
|
13
|
+
field :activated_user_id, type: String
|
14
|
+
field :activated_user_access_token, type: String
|
12
15
|
|
13
16
|
include Methods
|
14
17
|
|
@@ -10,7 +10,7 @@ module SlackRubyBotServer
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.instance
|
13
|
-
@instance ||= new
|
13
|
+
@instance ||= SlackRubyBotServer::Config.service_class.new
|
14
14
|
end
|
15
15
|
|
16
16
|
def initialize
|
@@ -21,10 +21,10 @@ module SlackRubyBotServer
|
|
21
21
|
@callbacks[type.to_s] << block
|
22
22
|
end
|
23
23
|
|
24
|
-
def create!(team)
|
25
|
-
run_callbacks :creating, team
|
24
|
+
def create!(team, options = {})
|
25
|
+
run_callbacks :creating, team, nil, options
|
26
26
|
start!(team)
|
27
|
-
run_callbacks :created, team
|
27
|
+
run_callbacks :created, team, nil, options
|
28
28
|
end
|
29
29
|
|
30
30
|
def start!(team)
|
@@ -103,11 +103,11 @@ module SlackRubyBotServer
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
def run_callbacks(type, team = nil, error = nil)
|
106
|
+
def run_callbacks(type, team = nil, error = nil, options = {})
|
107
107
|
callbacks = @callbacks[type.to_s]
|
108
108
|
return false unless callbacks
|
109
109
|
callbacks.each do |c|
|
110
|
-
c.call team, error
|
110
|
+
c.call team, error, options
|
111
111
|
end
|
112
112
|
true
|
113
113
|
rescue StandardError => e
|
data/public/scripts/register.js
CHANGED
@@ -32,6 +32,7 @@ $(document).ready(function() {
|
|
32
32
|
|
33
33
|
// Slack OAuth
|
34
34
|
var code = $.url('?code')
|
35
|
+
var state = $.url('?state')
|
35
36
|
if (code) {
|
36
37
|
SlackRubyBotServer.message('Working, please wait ...');
|
37
38
|
$('#register').hide();
|
@@ -39,7 +40,8 @@ $(document).ready(function() {
|
|
39
40
|
type: "POST",
|
40
41
|
url: "/api/teams",
|
41
42
|
data: {
|
42
|
-
code: code
|
43
|
+
code: code,
|
44
|
+
state: state
|
43
45
|
},
|
44
46
|
success: function(data) {
|
45
47
|
SlackRubyBotServer.message('Team successfully registered!<br><br>DM <b>@bot</b> or create a <b>#channel</b> and invite <b>@bot</b> to it.');
|
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20_190_323_181_453) do
|
14
14
|
# These are extensions that must be enabled in order to support this database
|
15
15
|
enable_extension 'plpgsql'
|
16
16
|
|
@@ -20,7 +20,10 @@ ActiveRecord::Schema.define(version: 20_170_307_164_946) do
|
|
20
20
|
t.boolean 'active', default: true
|
21
21
|
t.string 'domain'
|
22
22
|
t.string 'token'
|
23
|
-
t.datetime 'created_at',
|
24
|
-
t.datetime 'updated_at',
|
23
|
+
t.datetime 'created_at', null: false
|
24
|
+
t.datetime 'updated_at', null: false
|
25
|
+
t.string 'bot_user_id'
|
26
|
+
t.string 'activated_user_id'
|
27
|
+
t.string 'activated_user_access_token'
|
25
28
|
end
|
26
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-ruby-bot-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-websocket
|
@@ -221,7 +221,6 @@ files:
|
|
221
221
|
- lib/slack-ruby-bot-server/ext/slack-ruby-bot.rb
|
222
222
|
- lib/slack-ruby-bot-server/ext/slack-ruby-bot/client.rb
|
223
223
|
- lib/slack-ruby-bot-server/info.rb
|
224
|
-
- lib/slack-ruby-bot-server/models.rb
|
225
224
|
- lib/slack-ruby-bot-server/models/team/activerecord.rb
|
226
225
|
- lib/slack-ruby-bot-server/models/team/methods.rb
|
227
226
|
- lib/slack-ruby-bot-server/models/team/mongoid.rb
|
@@ -252,6 +251,7 @@ files:
|
|
252
251
|
- sample_apps/sample_app_activerecord/config/newrelic.yml
|
253
252
|
- sample_apps/sample_app_activerecord/config/postgresql.yml
|
254
253
|
- sample_apps/sample_app_activerecord/db/migrate/20170307164946_create_teams_table.rb
|
254
|
+
- sample_apps/sample_app_activerecord/db/migrate/20190323181453_add_activated_fields.rb
|
255
255
|
- sample_apps/sample_app_activerecord/db/schema.rb
|
256
256
|
- sample_apps/sample_app_activerecord/spec/api/root_spec.rb
|
257
257
|
- sample_apps/sample_app_activerecord/spec/commands/help_spec.rb
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'slack-ruby-bot-server/models/team'
|