class DandelionS1

Public Class Methods

new(opts={}) click to toggle source
Calls superclass method
# File lib/dandelion_s1.rb, line 12
def initialize(opts={})

  h = {root: 'www', static: [], passwords: {'user' => 'us3r'}}.merge(opts)
  
  @passwords = h[:passwords]
  access_list = h[:access]
  @app_root = Dir.pwd

  #@access_list = {'/do/r/hello3' => 'user'}
      
  if access_list then
    
    h2 = SimpleConfig.new(access_list).to_h
    conf_access = h2[:body] || h2
    @access_list = conf_access.inject({}) \
                                {|r,x| k,v = x; r.merge(k.to_s => v.split)}
  
  end
  
  h3 = %i(log pkg_src rsc_host rsc_package_src root static debug)\
      .inject({}) {|r,x| r.merge(x => h[x])}
  
  super(h3)
  @log.debug '@access_list: ' + @access_list.inspect if @log    
  @log.debug 'end of initialize' if @log
  
end

Public Instance Methods

call(e) click to toggle source
Calls superclass method
# File lib/dandelion_s1.rb, line 40
def call(e)

  request = e['REQUEST_PATH']
  @log.debug 'request: ' + request.inspect if @log
  
  return super(e) if request == '/login'
  r = @access_list.detect {|k,v| request =~ Regexp.new(k)} if @access_list
  private_user = r ? r.last : nil
  
  req = Rack::Request.new(e)
  user = req.session[:username]

  #@log.debug 'user: ' + user.inspect if @log
  #@log.debug '@e: ' + e.inspect if @log
  return jumpto '/login2?referer=' + e['PATH_INFO'] unless user
  
  if private_user.nil? then
    super(e)
  elsif (private_user.is_a? String and private_user == user) \
      or (private_user.is_a? Array and private_user.any? {|x| x == user})
    super(e)
  else
    jumpto '/unauthorised'
  end

end

Protected Instance Methods

default_routes(env, params) click to toggle source
Calls superclass method
# File lib/dandelion_s1.rb, line 69
def default_routes(env, params) 
  
  log = @log
  
  get '/login2/*' do
    params[:splat].inspect
    redirect '/login' + params[:splat].first
  end
  
  get '/login/*' do      
    url = params[:splat].any? ? params[:splat][0][/(?<=referer=).*/] : '/'
    login_form(referer: url)      
  end    
  
  post '/login' do
    
    h = @req.params

    if @passwords[h['username']] == h['password'] then
      
      @req.session[:username] = h['username']
      #'you are now logged in as ' + h['username']
      redirect h['referer']
      
    else
      
      login_form('Invalid username or password, try again.',401)
      
    end

    
  end
      
  get '/logout' do
    
    @req.session.clear
    'you are now logged out'
    
  end       
  
  get '/session' do
    
    #@req.session.expires
    #@req.session.options[:expire_after] = 1
    @req.session.options.inspect
    
  end
  
  get '/user' do
    
    if @req.session[:username] then
      'You are ' + @req.session[:username]
    else
      'you need to log in to view this page'
    end      
    
  end

  get '/unauthorised' do
    ['unauthorised user', 'text/plain', 403]      
  end
  
  super(env, params)   
 
end
login_form(msg='Log in to this site.', http_code=200, referer: '/') click to toggle source
# File lib/dandelion_s1.rb, line 135
  def login_form(msg='Log in to this site.', http_code=200, referer: '/')
    
s=<<EOF      
p #{msg}

login
  username: [     ]
  password: [     ]
  [! referer: #{referer}
   ]
  [login](/login)
EOF

    [Martile.new(s).to_s, 'text/slim', http_code]

  end