door_code 0.0.5 → 0.0.7
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.
- data/README.md +13 -11
- data/door_code.gemspec +2 -1
- data/lib/door_code/restricted_access.rb +27 -12
- metadata +13 -26
data/README.md
CHANGED
@@ -11,19 +11,20 @@ Rubygems:
|
|
11
11
|
|
12
12
|
Bundler:
|
13
13
|
|
14
|
-
gem 'door_code', '~> 0.0.
|
14
|
+
gem 'door_code', '~> 0.0.6'
|
15
15
|
|
16
|
-
|
16
|
+
## Configuration
|
17
17
|
|
18
|
-
In config.ru:
|
18
|
+
In config.ru or within your Sinatra app:
|
19
19
|
|
20
|
-
use DoorCode::RestrictedAccess, :code => '12345'
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
use DoorCode::RestrictedAccess,
|
25
|
-
|
26
|
-
|
20
|
+
use DoorCode::RestrictedAccess, :code => '12345' # code must be 3-6 digits
|
21
|
+
|
22
|
+
Optional options:
|
23
|
+
|
24
|
+
use DoorCode::RestrictedAccess,
|
25
|
+
:code => '12345', # set a single valid code
|
26
|
+
:codes => ['12345','6789'], # set multiple valid codes
|
27
|
+
:salt => "my super secret code" # use a custom salt for cookie encryption
|
27
28
|
|
28
29
|
In application.rb (Rails3) or environment.rb (Rails2):
|
29
30
|
|
@@ -36,9 +37,10 @@ There is a simple demo application running on Heroku at [http://doorcodedemo.her
|
|
36
37
|
## Notes
|
37
38
|
|
38
39
|
* The default code is '12345'
|
39
|
-
*
|
40
|
+
* All options passed to DoorCode are optional. If no valid codes are supplied, the default code will be activated
|
40
41
|
|
41
42
|
## To Do
|
42
43
|
|
43
44
|
* Allow specifying domains and paths to restrict access conditionally
|
45
|
+
* API for customization
|
44
46
|
* Write more tests
|
data/door_code.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "door_code"
|
6
|
-
s.version = '0.0.
|
6
|
+
s.version = '0.0.7'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ["Mike Fulcher", "Alex Neill", "Spencer Steffen"]
|
9
9
|
s.email = ["mike@plan9design.co.uk", "alex.neill@gmail.com", "spencer@citrusme.com"]
|
@@ -23,5 +23,6 @@ Gem::Specification.new do |s|
|
|
23
23
|
|
24
24
|
s.add_development_dependency 'shoulda', '2.11.3'
|
25
25
|
s.add_development_dependency 'rack-test', '0.5.7'
|
26
|
+
s.add_development_dependency 'sinatra', '1.1.0'
|
26
27
|
|
27
28
|
end
|
@@ -9,29 +9,44 @@ module DoorCode
|
|
9
9
|
def initialize app, options={}
|
10
10
|
@app = app
|
11
11
|
@salt = parse_salt(options[:salt])
|
12
|
-
|
12
|
+
# The code or codes can be supplied as either a single string or an array using either
|
13
|
+
# the ":code" or ":codes" key. ":codes" trumps ":code" if both are supplied
|
14
|
+
@codes = options[:codes] ? parse_codes(options[:codes]) : parse_codes(options[:code])
|
13
15
|
end
|
14
16
|
|
15
|
-
#
|
16
|
-
#
|
17
|
+
# Filters the supplied codes to ensure they are valid, and sets the DEFAULT_CODE if no
|
18
|
+
# valid codes are detected
|
19
|
+
def parse_codes(codes)
|
20
|
+
parsed_codes = codes.respond_to?(:any?) ? codes.map { |c| parse_code(c) } : [parse_code(codes)]
|
21
|
+
# If there are any valid codes supplied which are unique and valid,
|
22
|
+
# strip the default code out in order to circumvent a security hole
|
23
|
+
if parsed_codes.compact.uniq.empty?
|
24
|
+
parsed_codes << DEFAULT_CODE
|
25
|
+
p "DoorCode: no valid codes detected - activating default code"
|
26
|
+
end
|
27
|
+
parsed_codes.compact.uniq.map { |c| Digest::SHA1.hexdigest("--#{@salt}--#{c}--") }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Checks that the code provided is valid, returning nil if not
|
17
31
|
def parse_code(code)
|
18
32
|
parsed_code = code.to_s.gsub(/\D/, '')
|
19
|
-
if parsed_code == code
|
33
|
+
if parsed_code == code && (code.length < MIN_LENGTH || code.length > MAX_LENGTH)
|
20
34
|
# Means the supplied code contains only digits, which is good
|
21
35
|
# Just need to check that the code length is valid
|
22
|
-
parsed_code =
|
23
|
-
|
36
|
+
parsed_code = nil
|
37
|
+
p "DoorCode: invalid PIN code detected"
|
38
|
+
elsif parsed_code != code
|
24
39
|
# Means the supplied code contained non-digits, so revert to default
|
25
|
-
parsed_code =
|
40
|
+
parsed_code = nil
|
41
|
+
p "DoorCode: invalid PIN code detected"
|
26
42
|
end
|
27
|
-
|
43
|
+
parsed_code
|
28
44
|
end
|
29
45
|
|
30
|
-
|
31
46
|
# Ensures a salt is supplied, otherwise set to default
|
32
47
|
def parse_salt(salt)
|
33
48
|
if 0 < salt.to_s.length
|
34
|
-
salt = Digest::SHA1.hexdigest("
|
49
|
+
salt = Digest::SHA1.hexdigest("_door_code_secret_key")
|
35
50
|
end
|
36
51
|
salt
|
37
52
|
end
|
@@ -64,7 +79,7 @@ module DoorCode
|
|
64
79
|
|
65
80
|
# Is the supplied code valid for the current area
|
66
81
|
def valid_code?(code)
|
67
|
-
@code
|
82
|
+
@codes.include?(code)
|
68
83
|
end
|
69
84
|
|
70
85
|
# Check if the supplied code is valid;
|
@@ -105,7 +120,7 @@ module DoorCode
|
|
105
120
|
build_rack_objects
|
106
121
|
|
107
122
|
return @app.call(env) if confirmed?
|
108
|
-
p '
|
123
|
+
p 'DoorCode: Unauthorized personnel detected'
|
109
124
|
|
110
125
|
if request.post?
|
111
126
|
response['Content-Type'] = 'text/javascript' if request.xhr?
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: door_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 21
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 5
|
10
|
-
version: 0.0.5
|
5
|
+
version: 0.0.7
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Mike Fulcher
|
@@ -17,7 +12,7 @@ autorequire:
|
|
17
12
|
bindir: bin
|
18
13
|
cert_chain: []
|
19
14
|
|
20
|
-
date: 2011-02-
|
15
|
+
date: 2011-02-22 00:00:00 +00:00
|
21
16
|
default_executable:
|
22
17
|
dependencies:
|
23
18
|
- !ruby/object:Gem::Dependency
|
@@ -28,9 +23,6 @@ dependencies:
|
|
28
23
|
requirements:
|
29
24
|
- - ">="
|
30
25
|
- !ruby/object:Gem::Version
|
31
|
-
hash: 3
|
32
|
-
segments:
|
33
|
-
- 0
|
34
26
|
version: "0"
|
35
27
|
type: :runtime
|
36
28
|
version_requirements: *id001
|
@@ -42,11 +34,6 @@ dependencies:
|
|
42
34
|
requirements:
|
43
35
|
- - "="
|
44
36
|
- !ruby/object:Gem::Version
|
45
|
-
hash: 37
|
46
|
-
segments:
|
47
|
-
- 2
|
48
|
-
- 11
|
49
|
-
- 3
|
50
37
|
version: 2.11.3
|
51
38
|
type: :development
|
52
39
|
version_requirements: *id002
|
@@ -58,14 +45,20 @@ dependencies:
|
|
58
45
|
requirements:
|
59
46
|
- - "="
|
60
47
|
- !ruby/object:Gem::Version
|
61
|
-
hash: 5
|
62
|
-
segments:
|
63
|
-
- 0
|
64
|
-
- 5
|
65
|
-
- 7
|
66
48
|
version: 0.5.7
|
67
49
|
type: :development
|
68
50
|
version_requirements: *id003
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: sinatra
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - "="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.1.0
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id004
|
69
62
|
description: Rack middleware which requires that visitors to the site enter a 3-6 digit PIN code to gain access.
|
70
63
|
email:
|
71
64
|
- mike@plan9design.co.uk
|
@@ -102,18 +95,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
95
|
requirements:
|
103
96
|
- - ">="
|
104
97
|
- !ruby/object:Gem::Version
|
105
|
-
hash: 3
|
106
|
-
segments:
|
107
|
-
- 0
|
108
98
|
version: "0"
|
109
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
100
|
none: false
|
111
101
|
requirements:
|
112
102
|
- - ">="
|
113
103
|
- !ruby/object:Gem::Version
|
114
|
-
hash: 3
|
115
|
-
segments:
|
116
|
-
- 0
|
117
104
|
version: "0"
|
118
105
|
requirements: []
|
119
106
|
|