rack-simple_auth 1.0.3 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MANIFEST +4 -0
- data/checksum/rack-simple_auth-1.0.3.gem.sha512 +1 -0
- data/checksum/rack-simple_auth-1.0.4.gem.sha512 +1 -0
- data/lib/rack/simple_auth.rb +2 -0
- data/lib/rack/simple_auth/hmac/config.rb +1 -1
- data/lib/rack/simple_auth/hmac/middleware.rb +3 -151
- data/lib/rack/simple_auth/hmac/request.rb +156 -0
- data/lib/rack/simple_auth/hmac/response.rb +8 -0
- data/lib/rack/simple_auth/version.rb +1 -1
- data/rack-simple_auth.gemspec +1 -2
- metadata +9 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0166a62aa16634f85f815db10c9856bf39e9e11c
|
4
|
+
data.tar.gz: 7a4043bcbe808edfb1eeb580d737914b47637f90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f32b803d35245a9a37e665fff4b39fde60bc4c3431318bc8c7480b8d6a7fb1cae99a9aee3214634e059cd45f7674e01a2f074d201945e3a839b3001b1fb3365f
|
7
|
+
data.tar.gz: a257ea5f3f9f234c74e308932239280b118dda9f6475b0ffbffc91627fe08835803ea901af3e91f848089ef93f8f1c69786815c5cfdbf30ac5e9b80a65762638
|
data/MANIFEST
CHANGED
@@ -8,9 +8,13 @@ checksum/rack-simple_auth-0.1.2.gem.sha512
|
|
8
8
|
checksum/rack-simple_auth-1.0.0.gem.sha512
|
9
9
|
checksum/rack-simple_auth-1.0.0rc.gem.sha512
|
10
10
|
checksum/rack-simple_auth-1.0.1.gem.sha512
|
11
|
+
checksum/rack-simple_auth-1.0.3.gem.sha512
|
12
|
+
checksum/rack-simple_auth-1.0.4.gem.sha512
|
11
13
|
lib/rack/simple_auth.rb
|
12
14
|
lib/rack/simple_auth/hmac/config.rb
|
13
15
|
lib/rack/simple_auth/hmac/middleware.rb
|
16
|
+
lib/rack/simple_auth/hmac/request.rb
|
17
|
+
lib/rack/simple_auth/hmac/response.rb
|
14
18
|
lib/rack/simple_auth/logger.rb
|
15
19
|
lib/rack/simple_auth/version.rb
|
16
20
|
rack-simple_auth.gemspec
|
@@ -0,0 +1 @@
|
|
1
|
+
3c74fc621b80b95b3dcde055142e6900778c67c8e5ed3b550195c4d934c5aff5b7ab427b936dd725afc1aa5c118e7e7646a25e991be9f12f0c45e7621902f537
|
@@ -0,0 +1 @@
|
|
1
|
+
4dc93569f637e6d1e4e4f564efab90c192cba3f84d4368de83ff80b88d14dd642c8a234e64ee3a1167ab765651963d4a37873e34353cff7701cd5e5eef06bf2d
|
data/lib/rack/simple_auth.rb
CHANGED
@@ -63,163 +63,15 @@ module Rack
|
|
63
63
|
#
|
64
64
|
def call!(env)
|
65
65
|
env = env.dup
|
66
|
-
@request =
|
66
|
+
@request = Request.new(env, @config)
|
67
67
|
|
68
|
-
|
69
|
-
# logging & authorizing have to use the exact same messages, so don't call allowed_messages 2 times
|
70
|
-
# Call it 1 time and save this state
|
71
|
-
@allowed_messages = allowed_messages
|
72
|
-
|
73
|
-
if valid_request?
|
68
|
+
if @request.valid?
|
74
69
|
@app.call(env)
|
75
70
|
else
|
76
|
-
response =
|
71
|
+
response = Response.new('Unauthorized', 401, 'Content-Type' => 'text/html')
|
77
72
|
response.finish
|
78
73
|
end
|
79
74
|
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
##
|
84
|
-
# Checks for valid HMAC Request
|
85
|
-
#
|
86
|
-
# @return [TrueClass] if request is authorized
|
87
|
-
# @return [FalseClass] if request is not authorized or HTTP_AUTHORIZATION Header is not set
|
88
|
-
#
|
89
|
-
def valid_request?
|
90
|
-
log
|
91
|
-
|
92
|
-
return false if empty_header? || !authorized?
|
93
|
-
|
94
|
-
true
|
95
|
-
end
|
96
|
-
|
97
|
-
##
|
98
|
-
# Check if HTTP_AUTHORIZATION Header is set
|
99
|
-
#
|
100
|
-
# @return [TrueClass] if header is set
|
101
|
-
# @return [FalseClass] if header is not set
|
102
|
-
#
|
103
|
-
def empty_header?
|
104
|
-
@request.env['HTTP_AUTHORIZATION'].nil?
|
105
|
-
end
|
106
|
-
|
107
|
-
##
|
108
|
-
# Check if request is authorized
|
109
|
-
#
|
110
|
-
# @return [TrueClass] if request is authorized -> {#request_signature} is correct & {#request_message} is included
|
111
|
-
# in {#allowed_messages}
|
112
|
-
# @return [FalseClass] if request is not authorized
|
113
|
-
#
|
114
|
-
def authorized?
|
115
|
-
request_signature.eql?(@config.signature) && @allowed_messages.include?(request_message)
|
116
|
-
end
|
117
|
-
|
118
|
-
##
|
119
|
-
# Get request signature
|
120
|
-
#
|
121
|
-
# @return [String] signature of current request
|
122
|
-
#
|
123
|
-
def request_signature
|
124
|
-
@request.env['HTTP_AUTHORIZATION'].split(':').last
|
125
|
-
end
|
126
|
-
|
127
|
-
##
|
128
|
-
# Get encrypted request message
|
129
|
-
#
|
130
|
-
# @return [String] message of current request
|
131
|
-
#
|
132
|
-
def request_message
|
133
|
-
@request.env['HTTP_AUTHORIZATION'].split(':').first
|
134
|
-
end
|
135
|
-
|
136
|
-
##
|
137
|
-
# Builds Array of allowed message hashs between @tolerance via {#message}
|
138
|
-
#
|
139
|
-
# @return [Array]
|
140
|
-
def allowed_messages
|
141
|
-
messages = []
|
142
|
-
|
143
|
-
# Timestamp with milliseconds as Fixnum
|
144
|
-
date = (Time.now.to_f.freeze * 1000).to_i
|
145
|
-
(-(@config.tolerance)..0).step(1) do |i|
|
146
|
-
messages << OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @config.secret, message(date, i))
|
147
|
-
end
|
148
|
-
|
149
|
-
messages
|
150
|
-
end
|
151
|
-
|
152
|
-
##
|
153
|
-
# Get Message for current Request and delay
|
154
|
-
#
|
155
|
-
# @param [Fixnum] date [current date in timestamp format]
|
156
|
-
# @param [Fixnum] delay [delay in timestamp format]
|
157
|
-
#
|
158
|
-
# @return [String] message
|
159
|
-
def message(date, delay = 0)
|
160
|
-
date += delay
|
161
|
-
|
162
|
-
{ 'method' => @request.request_method, 'date' => date, 'data' => request_data }.to_json
|
163
|
-
end
|
164
|
-
|
165
|
-
##
|
166
|
-
# Get Request Data specified by @config.request_config
|
167
|
-
#
|
168
|
-
# @return [String|Hash] data
|
169
|
-
#
|
170
|
-
# Note: REFACTOR this shit..
|
171
|
-
def request_data
|
172
|
-
return @request.send(@config.request_config[method].to_sym) if valid_message_type?
|
173
|
-
|
174
|
-
fail "Not a valid option #{@config.request_config[method]} - Use either params or path"
|
175
|
-
end
|
176
|
-
|
177
|
-
##
|
178
|
-
# Request method for current request
|
179
|
-
#
|
180
|
-
# @return [String] Request Method [GET|POST|PUT|DELETE|PATCH]
|
181
|
-
#
|
182
|
-
def method
|
183
|
-
@request.request_method
|
184
|
-
end
|
185
|
-
|
186
|
-
##
|
187
|
-
# Check if message type for current request is valid
|
188
|
-
#
|
189
|
-
# @return [TrueClass] if message type for current request is path or params
|
190
|
-
# @return [FalseClass] if message type is invalid
|
191
|
-
#
|
192
|
-
def valid_message_type?
|
193
|
-
@config.request_config[method] == 'path' || @config.request_config[method] == 'params'
|
194
|
-
end
|
195
|
-
|
196
|
-
##
|
197
|
-
# Log to @config.logpath
|
198
|
-
# Contains:
|
199
|
-
# - allowed messages and received message
|
200
|
-
# - time when request was made
|
201
|
-
# - type of request
|
202
|
-
# - requested path
|
203
|
-
#
|
204
|
-
# Note: This is kinda slow under Rubinius
|
205
|
-
# (Rack::SimpleAuth::Logger.log has IO action, i think there are some performance issues)
|
206
|
-
#
|
207
|
-
def log
|
208
|
-
msg = "#{Time.new} - #{@request.request_method} #{@request.path} - 400 Unauthorized\n"
|
209
|
-
msg << "HTTP_AUTHORIZATION: #{@request.env['HTTP_AUTHORIZATION']}\n"
|
210
|
-
msg << "Auth Message Config: #{@config.request_config[@request.request_method]}\n"
|
211
|
-
|
212
|
-
if @allowed_messages
|
213
|
-
msg << "Allowed Encrypted Messages:\n"
|
214
|
-
@allowed_messages.each do |hash|
|
215
|
-
msg << "#{hash}\n"
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
msg << "Auth Signature: #{@config.signature}"
|
220
|
-
|
221
|
-
Rack::SimpleAuth::Logger.log(@config.logpath, @config.verbose, ENV['RACK_ENV'], msg)
|
222
|
-
end
|
223
75
|
end # Middleware
|
224
76
|
end # HMAC
|
225
77
|
end # SimpleAuth
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module Rack
|
2
|
+
module SimpleAuth
|
3
|
+
module HMAC
|
4
|
+
class Request < Rack::Request
|
5
|
+
def initialize(env, config)
|
6
|
+
@env = env
|
7
|
+
@config = config
|
8
|
+
@allowed_messages = allowed_messages
|
9
|
+
end
|
10
|
+
|
11
|
+
##
|
12
|
+
# Checks for valid HMAC Request
|
13
|
+
#
|
14
|
+
# @return [TrueClass] if request is authorized
|
15
|
+
# @return [FalseClass] if request is not authorized or HTTP_AUTHORIZATION Header is not set
|
16
|
+
#
|
17
|
+
def valid?
|
18
|
+
log
|
19
|
+
|
20
|
+
return false if empty_header? || !authorized?
|
21
|
+
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
##
|
28
|
+
# Builds Array of allowed message hashs between @tolerance via {#message}
|
29
|
+
#
|
30
|
+
# @return [Array]
|
31
|
+
def allowed_messages
|
32
|
+
messages = []
|
33
|
+
|
34
|
+
# Timestamp with milliseconds as Fixnum
|
35
|
+
date = (Time.now.to_f.freeze * 1000).to_i
|
36
|
+
(-(@config.tolerance)..0).step(1) do |i|
|
37
|
+
messages << OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @config.secret, build_message(date, i))
|
38
|
+
end
|
39
|
+
|
40
|
+
messages
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Build Message for current Request and delay
|
45
|
+
#
|
46
|
+
# @param [Fixnum] date [current date in timestamp format]
|
47
|
+
# @param [Fixnum] delay [delay in timestamp format]
|
48
|
+
#
|
49
|
+
# @return [String] message
|
50
|
+
def build_message(date, delay = 0)
|
51
|
+
date += delay
|
52
|
+
|
53
|
+
{ 'method' => self.request_method, 'date' => date, 'data' => data }.to_json
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Get Request Data specified by @config.request_config
|
58
|
+
#
|
59
|
+
# @return [String|Hash] data
|
60
|
+
#
|
61
|
+
# Note: REFACTOR this shit..
|
62
|
+
def data
|
63
|
+
return self.send(@config.request_config[method].to_sym) if valid_message_type?
|
64
|
+
|
65
|
+
fail "Not a valid option #{@config.request_config[method]} - Use either params or path"
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Check if HTTP_AUTHORIZATION Header is set
|
70
|
+
#
|
71
|
+
# @return [TrueClass] if header is set
|
72
|
+
# @return [FalseClass] if header is not set
|
73
|
+
#
|
74
|
+
def empty_header?
|
75
|
+
self.env['HTTP_AUTHORIZATION'].nil?
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# Check if request is authorized
|
80
|
+
#
|
81
|
+
# @return [TrueClass] if request is authorized -> {#signature} is correct & {#message} is included
|
82
|
+
# in {#allowed_messages}
|
83
|
+
# @return [FalseClass] if request is not authorized
|
84
|
+
#
|
85
|
+
def authorized?
|
86
|
+
signature.eql?(@config.signature) && @allowed_messages.include?(message)
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Get request signature
|
91
|
+
#
|
92
|
+
# @return [String] signature of current request
|
93
|
+
#
|
94
|
+
def signature
|
95
|
+
self.env['HTTP_AUTHORIZATION'].split(':').last
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# Get encrypted request message
|
100
|
+
#
|
101
|
+
# @return [String] message of current request
|
102
|
+
#
|
103
|
+
def message
|
104
|
+
self.env['HTTP_AUTHORIZATION'].split(':').first
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# Request method for current request
|
109
|
+
#
|
110
|
+
# @return [String] Request Method [GET|POST|PUT|DELETE|PATCH]
|
111
|
+
#
|
112
|
+
def method
|
113
|
+
self.request_method
|
114
|
+
end
|
115
|
+
|
116
|
+
##
|
117
|
+
# Check if message type for current request is valid
|
118
|
+
#
|
119
|
+
# @return [TrueClass] if message type for current request is path or params
|
120
|
+
# @return [FalseClass] if message type is invalid
|
121
|
+
#
|
122
|
+
def valid_message_type?
|
123
|
+
@config.request_config[method] == 'path' || @config.request_config[method] == 'params'
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Log to @config.logpath
|
128
|
+
# Contains:
|
129
|
+
# - allowed messages and received message
|
130
|
+
# - time when request was made
|
131
|
+
# - type of request
|
132
|
+
# - requested path
|
133
|
+
#
|
134
|
+
# Note: This is kinda slow under Rubinius
|
135
|
+
# (Rack::SimpleAuth::Logger.log has IO action, i think there are some performance issues)
|
136
|
+
#
|
137
|
+
def log
|
138
|
+
msg = "#{Time.new} - #{self.request_method} #{self.path} - 400 Unauthorized\n"
|
139
|
+
msg << "HTTP_AUTHORIZATION: #{self.env['HTTP_AUTHORIZATION']}\n"
|
140
|
+
msg << "Auth Message Config: #{@config.request_config[self.request_method]}\n"
|
141
|
+
|
142
|
+
if @allowed_messages
|
143
|
+
msg << "Allowed Encrypted Messages:\n"
|
144
|
+
@allowed_messages.each do |hash|
|
145
|
+
msg << "#{hash}\n"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
msg << "Auth Signature: #{@config.signature}"
|
150
|
+
|
151
|
+
Rack::SimpleAuth::Logger.log(@config.logpath, @config.verbose, ENV['RACK_ENV'], msg)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
data/rack-simple_auth.gemspec
CHANGED
@@ -28,8 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_development_dependency "coveralls", '~> 0.7'
|
29
29
|
spec.add_development_dependency 'codeclimate-test-reporter'
|
30
30
|
spec.add_development_dependency "rack-test", '~> 0.6'
|
31
|
-
spec.add_development_dependency 'rspec', '~>
|
31
|
+
spec.add_development_dependency 'rspec', '~> 3'
|
32
32
|
|
33
33
|
spec.add_development_dependency 'minitest', '~> 5.3'
|
34
|
-
spec.add_development_dependency 'minitest-reporters'
|
35
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-simple_auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benny1992
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: '3'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: '3'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: minitest
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,20 +122,6 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '5.3'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: minitest-reporters
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
125
|
description: SimpleAuth HMAC authentication
|
140
126
|
email:
|
141
127
|
- r3qnbenni@gmail.com
|
@@ -153,9 +139,13 @@ files:
|
|
153
139
|
- checksum/rack-simple_auth-1.0.0.gem.sha512
|
154
140
|
- checksum/rack-simple_auth-1.0.0rc.gem.sha512
|
155
141
|
- checksum/rack-simple_auth-1.0.1.gem.sha512
|
142
|
+
- checksum/rack-simple_auth-1.0.3.gem.sha512
|
143
|
+
- checksum/rack-simple_auth-1.0.4.gem.sha512
|
156
144
|
- lib/rack/simple_auth.rb
|
157
145
|
- lib/rack/simple_auth/hmac/config.rb
|
158
146
|
- lib/rack/simple_auth/hmac/middleware.rb
|
147
|
+
- lib/rack/simple_auth/hmac/request.rb
|
148
|
+
- lib/rack/simple_auth/hmac/response.rb
|
159
149
|
- lib/rack/simple_auth/logger.rb
|
160
150
|
- lib/rack/simple_auth/version.rb
|
161
151
|
- rack-simple_auth.gemspec
|
@@ -179,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
169
|
version: '0'
|
180
170
|
requirements: []
|
181
171
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.
|
172
|
+
rubygems_version: 2.3.0
|
183
173
|
signing_key:
|
184
174
|
specification_version: 4
|
185
175
|
summary: SimpleAuth HMAC authentication
|