Class: DoorCode::RestrictedAccess

Inherits:
Object
  • Object
show all
Defined in:
lib/door_code.rb

Constant Summary collapse

MIN_LENGTH =
3
MAX_LENGTH =
6
DEFAULT_CODE =
'12345'

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ RestrictedAccess

Returns a new instance of RestrictedAccess.



9
10
11
12
# File 'lib/door_code.rb', line 9

def initialize app, options={}
  @app = app
  @code = parse_code(options[:code])
end

Instance Method Details

#build_rack_objectsObject



93
94
95
96
# File 'lib/door_code.rb', line 93

def build_rack_objects
  @request = Rack::Request.new(@env)
  @response = Rack::Response.new
end

#call(env) ⇒ Object

Where the magic happens…



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/door_code.rb', line 99

def call env
  @env = env
  build_rack_objects
  
  return @app.call(env) if confirmed?
  p 'Loading DoorCode::RestrictedAccess'
  
  if post?
    response['Content-Type'] = 'text/javascript' if xhr?
    validate_code! # Validate the user's code and set a cookie if valid
  else
    index = ::File.read(::File.dirname(__FILE__) + '/index.html')
    index_with_code_length = index.gsub(/\{\{codeLength\}\}/, code_length)
    response.write index_with_code_length
  end
  
  # Render response
  return response.finish
end

#code_lengthObject



89
90
91
# File 'lib/door_code.rb', line 89

def code_length
  @code.length.to_s
end

#confirm!Object

Set a cookie for the correct value (server value may change) Also set up Success message



77
78
79
80
# File 'lib/door_code.rb', line 77

def confirm!
  xhr? ? response.write('success') : response.redirect('/')
  response.set_cookie(cookie_name, {:value => supplied_code, :path => "/"})
end

#confirmed?Boolean

Is there a valid code for the area set in the cookie

Returns:

  • (Boolean)


71
72
73
# File 'lib/door_code.rb', line 71

def confirmed?
  request.cookies[cookie_name] && valid_code?(request.cookies[cookie_name])
end


29
30
31
# File 'lib/door_code.rb', line 29

def cookie_name
  'door_code'
end

#parse_code(code) ⇒ Object

Ensures the code is good & valid, otherwise reverts to the default



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/door_code.rb', line 16

def parse_code code
  parsed_code = code.gsub(/\D/, '')
  if parsed_code == code
    # Means the supplied code contains only digits, which is good
    # Just need to check that the code length is valid
    parsed_code = DEFAULT_CODE if code.length < MIN_LENGTH || code.length > MAX_LENGTH
  else
    # Means the supplied code contained non-digits, so revert to default
    parsed_code = DEFAULT_CODE
  end
  parsed_code
end

#post?Boolean

Is the request verb POST?

Returns:

  • (Boolean)


44
45
46
# File 'lib/door_code.rb', line 44

def post?
  request.request_method == 'POST'
end

#requestObject

Rack::Request wrapper around @env



34
35
36
# File 'lib/door_code.rb', line 34

def request
  @request ||= Rack::Request.new(@env)
end

#responseObject

Rack::Response object with which to respond with



39
40
41
# File 'lib/door_code.rb', line 39

def response
  @response ||= Rack::Response.new
end

#supplied_codeObject

Code supplied from user



54
55
56
# File 'lib/door_code.rb', line 54

def supplied_code
  request.params['code']
end

#unconfirm!Object

Delete and invalid cookies Also set up Failure message



84
85
86
87
# File 'lib/door_code.rb', line 84

def unconfirm!
  xhr? ? response.write('failure') : response.redirect('/')
  response.delete_cookie(supplied_code)
end

#valid_code?(code) ⇒ Boolean

Is the supplied code vaid for the current area

Returns:

  • (Boolean)


59
60
61
# File 'lib/door_code.rb', line 59

def valid_code? code
  @code == code
end

#validate_code!Object

Check if the supplied code is valid; Either sets a confirming cookie and Success message or delete any door code cookie and set Failure message



66
67
68
# File 'lib/door_code.rb', line 66

def validate_code!
  valid_code?(supplied_code) ? confirm! : unconfirm!
end

#xhr?Boolean

Was the request called via AJAX?

Returns:

  • (Boolean)


49
50
51
# File 'lib/door_code.rb', line 49

def xhr?
  @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest"
end