door_code 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -11,19 +11,20 @@ Rubygems:
11
11
 
12
12
  Bundler:
13
13
 
14
- gem 'door_code', '~> 0.0.3'
14
+ gem 'door_code', '~> 0.0.6'
15
15
 
16
- ### Then
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
- # to use a custom salt for cookie encryption
23
-
24
- use DoorCode::RestrictedAccess, :code => '12345', :salt => "my super secret code"
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
- * If the code passed to DoorCode is invalid (eg contains non-digits), the default code will be assigned
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.5'
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
- @code = parse_code(options[:code])
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
- # Ensures the code is good & valid, otherwise
16
- # reverts to the default
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 = DEFAULT_CODE if code.length < MIN_LENGTH || code.length > MAX_LENGTH
23
- else
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 = DEFAULT_CODE
40
+ parsed_code = nil
41
+ p "DoorCode: invalid PIN code detected"
26
42
  end
27
- Digest::SHA1.hexdigest("--#{@salt}--#{parsed_code}--")
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("Door Code Secret Key")
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 == 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 'Loading DoorCode::RestrictedAccess'
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
- segments:
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-21 00:00:00 +00:00
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