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 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