Class: DBus::DBusCookieSHA1

Inherits:
Authenticator show all
Defined in:
lib/dbus/auth.rb

Overview

Authentication class using SHA1 crypto algorithm

Class for ‘CookieSHA1’ type authentication. Implements the AUTH DBUS_COOKIE_SHA1 mechanism.

Instance Method Summary collapse

Instance Method Details

#authenticateObject

the autenticate method (called in stage one of authentification)



52
53
54
55
56
57
# File 'lib/dbus/auth.rb', line 52

def authenticate
  require "etc"
  # number of retries we have for auth
  @retries = 1
  hex_encode(Etc.getlogin).to_s # server expects it to be binary
end

#data(hexdata) ⇒ Object

handles the interesting crypto stuff, check the rbus-project for more info: rbus.rubyforge.org/



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/dbus/auth.rb', line 65

def data(hexdata)
  require "digest/sha1"
  data = hex_decode(hexdata)
  # name of cookie file, id of cookie in file, servers random challenge
  context, id, s_challenge = data.split(" ")
  # Random client challenge
  c_challenge = 1.upto(s_challenge.bytesize / 2).map { rand(255).to_s }.join
  # Search cookie file for id
  path = File.join(ENV["HOME"], ".dbus-keyrings", context)
  DBus.logger.debug "path: #{path.inspect}"
  File.foreach(path) do |line|
    if line.index(id).zero?
      # Right line of file, read cookie
      cookie = line.split(" ")[2].chomp
      DBus.logger.debug "cookie: #{cookie.inspect}"
      # Concatenate and encrypt
      to_encrypt = [s_challenge, c_challenge, cookie].join(":")
      sha = Digest::SHA1.hexdigest(to_encrypt)
      # the almighty tcp server wants everything hex encoded
      hex_response = hex_encode("#{c_challenge} #{sha}")
      # Return response
      response = [:AuthOk, hex_response]
      return response
    end
  end
  # a little rescue magic
  unless @retries <= 0
    puts "ERROR: Could not auth, will now exit."
    puts "ERROR: Unable to locate cookie, retry in 1 second."
    @retries -= 1
    sleep 1
    data(hexdata)
  end
end

#hex_decode(encoded) ⇒ Object

decode hex to plain



107
108
109
# File 'lib/dbus/auth.rb', line 107

def hex_decode(encoded)
  encoded.scan(/[[:xdigit:]]{2}/).map { |h| h.hex.chr }.join
end

#hex_encode(plain) ⇒ Object

encode plain to hex



101
102
103
104
# File 'lib/dbus/auth.rb', line 101

def hex_encode(plain)
  return nil if plain.nil?
  plain.to_s.unpack("H*")[0]
end

#nameObject

returns the modules name



60
61
62
# File 'lib/dbus/auth.rb', line 60

def name
  "DBUS_COOKIE_SHA1"
end