Class: Orthrus::SSH::RackApp

Inherits:
Object
  • Object
show all
Defined in:
lib/orthrus/ssh/rack_app.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sessions) ⇒ RackApp

Returns a new instance of RackApp.



6
7
8
# File 'lib/orthrus/ssh/rack_app.rb', line 6

def initialize(sessions)
  @sessions = sessions
end

Instance Attribute Details

#sessionsObject (readonly)

Returns the value of attribute sessions.



10
11
12
# File 'lib/orthrus/ssh/rack_app.rb', line 10

def sessions
  @sessions
end

Instance Method Details

#call(env) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/orthrus/ssh/rack_app.rb', line 12

def call(env)
  req = Rack::Request.new(env)

  case req.params['state']
  when 'find'
    find req
  when 'signed'
    verify req
  else
    [500, {}, ["unknown state"]]
  end
end

#find(req) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/orthrus/ssh/rack_app.rb', line 32

def find(req)
  user = req.params['user']
  id = req.params["id"]

  unless pub = @sessions.find_key(user, id)
    return form("code=unknown")
  end

  session, nonce = @sessions.new_session(user, pub)

  nonce = Rack::Utils.escape Utils.sha1_hash(nonce)

  form "code=check&session_id=#{session}&nonce=#{nonce}"
end

#form(body) ⇒ Object



25
26
27
28
29
30
# File 'lib/orthrus/ssh/rack_app.rb', line 25

def form(body)
  [200,
   { "Content-Type" => "application/x-www-form-urlencoded" },
   [body]
  ]
end

#verify(req) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/orthrus/ssh/rack_app.rb', line 47

def verify(req)
  id = req.params["session_id"].to_i
  nonce, pub = @sessions.find_session(id)

  nonce = Utils.sha1_hash(nonce)

  sig = req.params['sig']

  if pub.verify(sig, nonce, true)
    form "code=verified&access_token=1"
  else
    form "code=fail"
  end
end