roo_on_rails 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -1
- data/Gemfile +1 -0
- data/README.md +126 -68
- data/bin/console +5 -0
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails_3.gemfile +1 -0
- data/gemfiles/rails_3.gemfile.lock +36 -2
- data/gemfiles/rails_4.gemfile +1 -0
- data/gemfiles/rails_4.gemfile.lock +36 -2
- data/gemfiles/rails_5.gemfile +1 -0
- data/gemfiles/rails_5.gemfile.lock +36 -2
- data/gemfiles/rails_5_1.gemfile +1 -0
- data/gemfiles/rails_5_1.gemfile.lock +36 -2
- data/lib/roo_on_rails.rb +1 -0
- data/lib/roo_on_rails/checks/environment.rb +4 -0
- data/lib/roo_on_rails/checks/google_oauth/_template.rb +49 -0
- data/lib/roo_on_rails/checks/google_oauth/initializer.rb +43 -0
- data/lib/roo_on_rails/checks/papertrail/all.rb +21 -0
- data/lib/roo_on_rails/checks/papertrail/drain_exists.rb +64 -0
- data/lib/roo_on_rails/checks/papertrail/log_destination_exists.rb +39 -0
- data/lib/roo_on_rails/checks/papertrail/system_exists.rb +78 -0
- data/lib/roo_on_rails/checks/papertrail/system_named.rb +55 -0
- data/lib/roo_on_rails/checks/papertrail/token.rb +50 -0
- data/lib/roo_on_rails/config.rb +16 -0
- data/lib/roo_on_rails/default.env +4 -0
- data/lib/roo_on_rails/papertrail_client.rb +45 -0
- data/lib/roo_on_rails/rack/google_oauth.rb +34 -0
- data/lib/roo_on_rails/railties/google_auth.rb +36 -0
- data/lib/roo_on_rails/railties/sidekiq.rb +6 -2
- data/lib/roo_on_rails/version.rb +1 -1
- data/roo_on_rails.gemspec +5 -0
- metadata +70 -2
data/gemfiles/rails_5.gemfile
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.7.0)
|
5
5
|
dogstatsd-ruby
|
6
6
|
dotenv-rails (~> 2.1)
|
7
|
+
faraday
|
8
|
+
faraday_middleware
|
7
9
|
hashie (~> 3.4)
|
8
10
|
hirefire-resource
|
9
11
|
newrelic_rpm
|
10
12
|
octokit
|
13
|
+
omniauth-google-oauth2
|
11
14
|
platform-api (~> 2.0)
|
12
15
|
rack-ssl-enforcer
|
13
16
|
rack-timeout
|
@@ -70,6 +73,8 @@ GEM
|
|
70
73
|
coderay (1.1.1)
|
71
74
|
concurrent-ruby (1.0.5)
|
72
75
|
connection_pool (2.2.1)
|
76
|
+
crack (0.4.3)
|
77
|
+
safe_yaml (~> 1.0.0)
|
73
78
|
diff-lcs (1.3)
|
74
79
|
docile (1.1.5)
|
75
80
|
dogstatsd-ruby (3.0.0)
|
@@ -81,6 +86,8 @@ GEM
|
|
81
86
|
excon (0.57.1)
|
82
87
|
faraday (0.12.1)
|
83
88
|
multipart-post (>= 1.2, < 3)
|
89
|
+
faraday_middleware (0.11.0.1)
|
90
|
+
faraday (>= 0.7.4, < 1.0)
|
84
91
|
ffi (1.9.18)
|
85
92
|
formatador (0.2.5)
|
86
93
|
globalid (0.4.0)
|
@@ -99,7 +106,8 @@ GEM
|
|
99
106
|
guard (~> 2.1)
|
100
107
|
guard-compat (~> 1.1)
|
101
108
|
rspec (>= 2.99.0, < 4.0)
|
102
|
-
|
109
|
+
hashdiff (0.3.4)
|
110
|
+
hashie (3.5.6)
|
103
111
|
heroics (0.0.23)
|
104
112
|
erubis (~> 2.0)
|
105
113
|
excon
|
@@ -107,6 +115,7 @@ GEM
|
|
107
115
|
hirefire-resource (0.4.2)
|
108
116
|
i18n (0.8.4)
|
109
117
|
json (2.1.0)
|
118
|
+
jwt (1.5.6)
|
110
119
|
listen (3.1.5)
|
111
120
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
112
121
|
rb-inotify (~> 0.9, >= 0.9.7)
|
@@ -125,6 +134,7 @@ GEM
|
|
125
134
|
minitest (5.10.2)
|
126
135
|
moneta (0.8.1)
|
127
136
|
multi_json (1.12.1)
|
137
|
+
multi_xml (0.6.0)
|
128
138
|
multipart-post (2.0.0)
|
129
139
|
nenv (0.3.0)
|
130
140
|
newrelic_rpm (4.2.0.334)
|
@@ -134,8 +144,25 @@ GEM
|
|
134
144
|
notiffany (0.1.1)
|
135
145
|
nenv (~> 0.1)
|
136
146
|
shellany (~> 0.0)
|
147
|
+
oauth2 (1.4.0)
|
148
|
+
faraday (>= 0.8, < 0.13)
|
149
|
+
jwt (~> 1.0)
|
150
|
+
multi_json (~> 1.3)
|
151
|
+
multi_xml (~> 0.5)
|
152
|
+
rack (>= 1.2, < 3)
|
137
153
|
octokit (4.7.0)
|
138
154
|
sawyer (~> 0.8.0, >= 0.5.3)
|
155
|
+
omniauth (1.6.1)
|
156
|
+
hashie (>= 3.4.6, < 3.6.0)
|
157
|
+
rack (>= 1.6.2, < 3)
|
158
|
+
omniauth-google-oauth2 (0.5.0)
|
159
|
+
jwt (~> 1.5)
|
160
|
+
multi_json (~> 1.3)
|
161
|
+
omniauth (>= 1.1.1)
|
162
|
+
omniauth-oauth2 (>= 1.3.1)
|
163
|
+
omniauth-oauth2 (1.4.0)
|
164
|
+
oauth2 (~> 1.0)
|
165
|
+
omniauth (~> 1.2)
|
139
166
|
pg (0.21.0)
|
140
167
|
platform-api (2.1.0)
|
141
168
|
heroics (~> 0.0.23)
|
@@ -197,6 +224,7 @@ GEM
|
|
197
224
|
rspec-support (~> 3.6.0)
|
198
225
|
rspec-support (3.6.0)
|
199
226
|
ruby_dep (1.5.0)
|
227
|
+
safe_yaml (1.0.4)
|
200
228
|
sawyer (0.8.1)
|
201
229
|
addressable (>= 2.3.5, < 2.6)
|
202
230
|
faraday (~> 0.8, < 1.0)
|
@@ -225,6 +253,10 @@ GEM
|
|
225
253
|
tzinfo (1.2.3)
|
226
254
|
thread_safe (~> 0.1)
|
227
255
|
url (0.3.2)
|
256
|
+
webmock (3.0.1)
|
257
|
+
addressable (>= 2.3.6)
|
258
|
+
crack (>= 0.3.2)
|
259
|
+
hashdiff
|
228
260
|
websocket-driver (0.6.5)
|
229
261
|
websocket-extensions (>= 0.1.0)
|
230
262
|
websocket-extensions (0.1.2)
|
@@ -241,6 +273,7 @@ DEPENDENCIES
|
|
241
273
|
memfs
|
242
274
|
pg
|
243
275
|
pry-byebug
|
276
|
+
rack-test
|
244
277
|
rails (~> 5.0.0)
|
245
278
|
rake (~> 10.0)
|
246
279
|
roo_on_rails!
|
@@ -248,6 +281,7 @@ DEPENDENCIES
|
|
248
281
|
simplecov
|
249
282
|
sqlite3
|
250
283
|
thor (~> 0.19)
|
284
|
+
webmock
|
251
285
|
|
252
286
|
BUNDLED WITH
|
253
287
|
1.14.6
|
data/gemfiles/rails_5_1.gemfile
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.7.0)
|
5
5
|
dogstatsd-ruby
|
6
6
|
dotenv-rails (~> 2.1)
|
7
|
+
faraday
|
8
|
+
faraday_middleware
|
7
9
|
hashie (~> 3.4)
|
8
10
|
hirefire-resource
|
9
11
|
newrelic_rpm
|
10
12
|
octokit
|
13
|
+
omniauth-google-oauth2
|
11
14
|
platform-api (~> 2.0)
|
12
15
|
rack-ssl-enforcer
|
13
16
|
rack-timeout
|
@@ -70,6 +73,8 @@ GEM
|
|
70
73
|
coderay (1.1.1)
|
71
74
|
concurrent-ruby (1.0.5)
|
72
75
|
connection_pool (2.2.1)
|
76
|
+
crack (0.4.3)
|
77
|
+
safe_yaml (~> 1.0.0)
|
73
78
|
diff-lcs (1.3)
|
74
79
|
docile (1.1.5)
|
75
80
|
dogstatsd-ruby (3.0.0)
|
@@ -82,6 +87,8 @@ GEM
|
|
82
87
|
excon (0.57.1)
|
83
88
|
faraday (0.12.1)
|
84
89
|
multipart-post (>= 1.2, < 3)
|
90
|
+
faraday_middleware (0.11.0.1)
|
91
|
+
faraday (>= 0.7.4, < 1.0)
|
85
92
|
ffi (1.9.18)
|
86
93
|
formatador (0.2.5)
|
87
94
|
globalid (0.4.0)
|
@@ -100,7 +107,8 @@ GEM
|
|
100
107
|
guard (~> 2.1)
|
101
108
|
guard-compat (~> 1.1)
|
102
109
|
rspec (>= 2.99.0, < 4.0)
|
103
|
-
|
110
|
+
hashdiff (0.3.4)
|
111
|
+
hashie (3.5.6)
|
104
112
|
heroics (0.0.23)
|
105
113
|
erubis (~> 2.0)
|
106
114
|
excon
|
@@ -108,6 +116,7 @@ GEM
|
|
108
116
|
hirefire-resource (0.4.2)
|
109
117
|
i18n (0.8.4)
|
110
118
|
json (2.1.0)
|
119
|
+
jwt (1.5.6)
|
111
120
|
listen (3.1.5)
|
112
121
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
113
122
|
rb-inotify (~> 0.9, >= 0.9.7)
|
@@ -126,6 +135,7 @@ GEM
|
|
126
135
|
minitest (5.10.2)
|
127
136
|
moneta (0.8.1)
|
128
137
|
multi_json (1.12.1)
|
138
|
+
multi_xml (0.6.0)
|
129
139
|
multipart-post (2.0.0)
|
130
140
|
nenv (0.3.0)
|
131
141
|
newrelic_rpm (4.2.0.334)
|
@@ -135,8 +145,25 @@ GEM
|
|
135
145
|
notiffany (0.1.1)
|
136
146
|
nenv (~> 0.1)
|
137
147
|
shellany (~> 0.0)
|
148
|
+
oauth2 (1.4.0)
|
149
|
+
faraday (>= 0.8, < 0.13)
|
150
|
+
jwt (~> 1.0)
|
151
|
+
multi_json (~> 1.3)
|
152
|
+
multi_xml (~> 0.5)
|
153
|
+
rack (>= 1.2, < 3)
|
138
154
|
octokit (4.7.0)
|
139
155
|
sawyer (~> 0.8.0, >= 0.5.3)
|
156
|
+
omniauth (1.6.1)
|
157
|
+
hashie (>= 3.4.6, < 3.6.0)
|
158
|
+
rack (>= 1.6.2, < 3)
|
159
|
+
omniauth-google-oauth2 (0.5.0)
|
160
|
+
jwt (~> 1.5)
|
161
|
+
multi_json (~> 1.3)
|
162
|
+
omniauth (>= 1.1.1)
|
163
|
+
omniauth-oauth2 (>= 1.3.1)
|
164
|
+
omniauth-oauth2 (1.4.0)
|
165
|
+
oauth2 (~> 1.0)
|
166
|
+
omniauth (~> 1.2)
|
140
167
|
pg (0.21.0)
|
141
168
|
platform-api (2.1.0)
|
142
169
|
heroics (~> 0.0.23)
|
@@ -198,6 +225,7 @@ GEM
|
|
198
225
|
rspec-support (~> 3.6.0)
|
199
226
|
rspec-support (3.6.0)
|
200
227
|
ruby_dep (1.5.0)
|
228
|
+
safe_yaml (1.0.4)
|
201
229
|
sawyer (0.8.1)
|
202
230
|
addressable (>= 2.3.5, < 2.6)
|
203
231
|
faraday (~> 0.8, < 1.0)
|
@@ -226,6 +254,10 @@ GEM
|
|
226
254
|
tzinfo (1.2.3)
|
227
255
|
thread_safe (~> 0.1)
|
228
256
|
url (0.3.2)
|
257
|
+
webmock (3.0.1)
|
258
|
+
addressable (>= 2.3.6)
|
259
|
+
crack (>= 0.3.2)
|
260
|
+
hashdiff
|
229
261
|
websocket-driver (0.6.5)
|
230
262
|
websocket-extensions (>= 0.1.0)
|
231
263
|
websocket-extensions (0.1.2)
|
@@ -242,6 +274,7 @@ DEPENDENCIES
|
|
242
274
|
memfs
|
243
275
|
pg
|
244
276
|
pry-byebug
|
277
|
+
rack-test
|
245
278
|
rails (~> 5.1)
|
246
279
|
rake (~> 10.0)
|
247
280
|
roo_on_rails!
|
@@ -249,6 +282,7 @@ DEPENDENCIES
|
|
249
282
|
simplecov
|
250
283
|
sqlite3
|
251
284
|
thor (~> 0.19)
|
285
|
+
webmock
|
252
286
|
|
253
287
|
BUNDLED WITH
|
254
288
|
1.14.6
|
data/lib/roo_on_rails.rb
CHANGED
@@ -6,6 +6,8 @@ require 'roo_on_rails/checks/heroku/app_exists'
|
|
6
6
|
require 'roo_on_rails/checks/sidekiq/settings'
|
7
7
|
require 'roo_on_rails/checks/heroku/drains_metrics'
|
8
8
|
require 'roo_on_rails/checks/documentation/playbook'
|
9
|
+
require 'roo_on_rails/checks/google_oauth/initializer'
|
10
|
+
require 'roo_on_rails/checks/papertrail/all'
|
9
11
|
|
10
12
|
module RooOnRails
|
11
13
|
module Checks
|
@@ -15,6 +17,8 @@ module RooOnRails
|
|
15
17
|
requires Heroku::PrebootEnabled
|
16
18
|
requires Sidekiq::Settings
|
17
19
|
requires Documentation::Playbook
|
20
|
+
requires GoogleOauth::Initializer
|
21
|
+
requires Papertrail::All
|
18
22
|
|
19
23
|
def call
|
20
24
|
# nothing to do
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Google Oauth initializer, generated by RooOnRails
|
2
|
+
|
3
|
+
require 'roo_on_rails/rack/google_oauth'
|
4
|
+
|
5
|
+
Rails.application.config.middleware.use RooOnRails::Rack::GoogleOauth do |env|
|
6
|
+
# This is your auth strategy.
|
7
|
+
# Here you're supposed to do something with the OAuth payload and
|
8
|
+
# return a valid Rack response.
|
9
|
+
|
10
|
+
# A simple and insecure example:
|
11
|
+
#
|
12
|
+
require 'digest/md5'
|
13
|
+
auth_data = env['omniauth.auth']
|
14
|
+
naive_token = Digest::MD5.hexdigest(auth_data.info.email.downcase)
|
15
|
+
expires_in = Time.current + 60 * 60 * 24
|
16
|
+
headers = { 'Location' => '/' }
|
17
|
+
Rack::Utils.set_cookie_header!(headers, 'naive_auth_cookie', {
|
18
|
+
value: naive_token, expires: expires_in, path: '/'
|
19
|
+
})
|
20
|
+
[302, headers, ['You are being redirecred to /']]
|
21
|
+
|
22
|
+
# You can also hand it over to a Rails controller action, where the
|
23
|
+
# OAuth payload will be available in `request.env['omniauth.auth']`.
|
24
|
+
# If you do this, the controller will take care of returning a valid
|
25
|
+
# response for Rack.
|
26
|
+
#
|
27
|
+
# This is the recommenced approach as it makes it easier to use
|
28
|
+
# Rails encrypted cookies and other security features.
|
29
|
+
#
|
30
|
+
# For example:
|
31
|
+
# MyAuthController.action(:login).call(env)
|
32
|
+
end
|
33
|
+
|
34
|
+
# What to do in case of failure.
|
35
|
+
# Must be a 302 redirect.
|
36
|
+
# It can invoke a Rails controller action
|
37
|
+
#
|
38
|
+
OmniAuth.config.on_failure = proc do |env|
|
39
|
+
error = env['omniauth.error'] # e.g. #<OmniAuth::Strategies::OAuth2::CallbackError: OmniAuth::Strategies::OAuth2::CallbackError>
|
40
|
+
details = error.message # e.g. "invalid_hd | Invalid Hosted Domain"
|
41
|
+
error_type = env['omniauth.error.type'] # e.g. :invalid_credentials
|
42
|
+
|
43
|
+
Rails.logger.info("[RooOnRails] Login failed (#{error_type}): #{details}")
|
44
|
+
|
45
|
+
# To use a rails controller;
|
46
|
+
# MyAuthController.action(:login_failed).call(env)
|
47
|
+
|
48
|
+
[302, { 'Location' => '/' }, ['']]
|
49
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'roo_on_rails/config'
|
2
|
+
require 'roo_on_rails/checks/base'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module RooOnRails
|
6
|
+
module Checks
|
7
|
+
module GoogleOauth
|
8
|
+
class Initializer < Base
|
9
|
+
LOCATION = 'config/initializers/google_oauth.rb'.freeze
|
10
|
+
|
11
|
+
def intro
|
12
|
+
'Google Oauth protection'
|
13
|
+
end
|
14
|
+
|
15
|
+
def call
|
16
|
+
if RooOnRails::Config.google_auth_enabled?
|
17
|
+
check_initializer
|
18
|
+
else
|
19
|
+
pass 'Google Oauth is not enabled. Doing nothing'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def fix
|
24
|
+
FileUtils.cp(template, LOCATION)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def check_initializer
|
30
|
+
if File.exist? LOCATION
|
31
|
+
pass 'Google Oauth initializer is present. Doing nothing.'
|
32
|
+
else
|
33
|
+
fail! 'Google Oauth is enabled but the initializer is missing.'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def template
|
38
|
+
File.join(__dir__, '_template.rb')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'roo_on_rails/checks/env_specific'
|
2
|
+
require 'roo_on_rails/checks/papertrail/system_named'
|
3
|
+
|
4
|
+
module RooOnRails
|
5
|
+
module Checks
|
6
|
+
module Papertrail
|
7
|
+
# Wrapper for Papertrail setup checks.
|
8
|
+
class All < EnvSpecific
|
9
|
+
requires SystemNamed
|
10
|
+
|
11
|
+
def intro
|
12
|
+
"Checking for Papertrail setup in #{bold env}..."
|
13
|
+
end
|
14
|
+
|
15
|
+
def call
|
16
|
+
pass 'all Papertrail checks passed'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'roo_on_rails/checks/env_specific'
|
2
|
+
require 'roo_on_rails/checks/heroku/token'
|
3
|
+
require 'roo_on_rails/checks/heroku/app_exists'
|
4
|
+
require 'roo_on_rails/checks/papertrail/log_destination_exists'
|
5
|
+
|
6
|
+
module RooOnRails
|
7
|
+
module Checks
|
8
|
+
module Papertrail
|
9
|
+
# Check if a Heroku app is setup to a log drain to Papertrail
|
10
|
+
#
|
11
|
+
# Input context
|
12
|
+
# - heroku.api_client: a connected PlatformAPI client
|
13
|
+
# - heroku.app.{env}: an app name.
|
14
|
+
# - papertrail.dest.host, .port
|
15
|
+
#
|
16
|
+
# Output context:
|
17
|
+
# - papertrail.system_name.{env}: the drain token for this app, aka.
|
18
|
+
# "system name" in Papertrail. Looks like "d.{uuid}".
|
19
|
+
class DrainExists < EnvSpecific
|
20
|
+
requires Heroku::Token
|
21
|
+
requires Heroku::AppExists
|
22
|
+
requires LogDestinationExists
|
23
|
+
|
24
|
+
def intro
|
25
|
+
"Checking for Papertrail drain on #{bold app_name}..."
|
26
|
+
end
|
27
|
+
|
28
|
+
def call
|
29
|
+
# find the PT drain
|
30
|
+
data = client.log_drain.list(app_name).
|
31
|
+
select { |h| h['url'] =~ /papertrailapp/ }
|
32
|
+
fail! 'no Papertrail drain found' if data.empty?
|
33
|
+
fail! 'multiple Papertrail drains found' if data.length > 1
|
34
|
+
|
35
|
+
data = data.first
|
36
|
+
fail! "app is draining to #{data['url']} instead of #{papertrail_url}" if data['url'] != papertrail_url
|
37
|
+
|
38
|
+
pass "found drain setup with token #{data['token']}"
|
39
|
+
context.papertrail.system_name![env] = data['token']
|
40
|
+
end
|
41
|
+
|
42
|
+
def fix
|
43
|
+
client.log_drain.create(app_name, url: papertrail_url)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def app_name
|
49
|
+
context.heroku.app[env]
|
50
|
+
end
|
51
|
+
|
52
|
+
def client
|
53
|
+
context.heroku.api_client
|
54
|
+
end
|
55
|
+
|
56
|
+
def papertrail_url
|
57
|
+
format 'syslog+tls://%s:%s',
|
58
|
+
context.papertrail.dest.host,
|
59
|
+
context.papertrail.dest.port
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|