Class: ProxES::Middleware::Security

Inherits:
Object
  • Object
show all
Defined in:
lib/proxes/middleware/security.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, logger = nil) ⇒ Security

Returns a new instance of Security.



14
15
16
17
# File 'lib/proxes/middleware/security.rb', line 14

def initialize(app, logger = nil)
  @app = app
  @logger = logger || ::Ditty::Services::Logger.instance
end

Instance Attribute Details

#loggerObject (readonly)

Returns the value of attribute logger.



12
13
14
# File 'lib/proxes/middleware/security.rb', line 12

def logger
  @logger
end

Instance Method Details

#authorize(request) ⇒ Object



43
44
45
# File 'lib/proxes/middleware/security.rb', line 43

def authorize(request)
  Pundit.authorize(request.user, request, request.request_method.downcase + '?')
end

#call(env) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/proxes/middleware/security.rb', line 19

def call(env)
  request = ProxES::Request.from_env(env)
  log(request, 'BEFORE')

  check_basic request
  authorize request

  request.index = policy_scope(request) if request.indices?
  log(request, 'AFTER')

  @app.call env
end

#check_basic(request) ⇒ Object



32
33
34
35
36
37
38
39
40
41
# File 'lib/proxes/middleware/security.rb', line 32

def check_basic(request)
  auth = Rack::Auth::Basic::Request.new(request.env)
  return false unless auth.provided? && auth.basic?

  identity = ::Ditty::Identity.find(username: auth.credentials[0])
  identity ||= ::Ditty::Identity.find(username: CGI.unescape(auth.credentials[0]))
  return false unless identity && identity.authenticate(auth.credentials[1])
  request.env['rack.session'] ||= {}
  request.env['rack.session']['user_id'] = identity.user_id
end

#log(request, stage) ⇒ Object



51
52
53
54
55
56
# File 'lib/proxes/middleware/security.rb', line 51

def log(request, stage)
  logger.debug '============' + stage.ljust(56) + '============'
  logger.debug '= ' + "Request: #{request.detail}".ljust(76) + ' ='
  logger.debug '= ' + "Endpoint: #{request.endpoint}".ljust(76) + ' ='
  logger.debug '================================================================================'
end

#policy_scope(request) ⇒ Object



47
48
49
# File 'lib/proxes/middleware/security.rb', line 47

def policy_scope(request)
  Pundit.policy_scope(request.user, request)
end