class DBus::DBusCookieSHA1
Authentication class using SHA1 crypto algorithm¶ ↑
Class for 'CookieSHA1' type authentication. Implements the AUTH DBUS_COOKIE_SHA1 mechanism.
Public Instance Methods
authenticate()
click to toggle source
the autenticate method (called in stage one of authentification)
# 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)
click to toggle source
handles the interesting crypto stuff, check the rbus-project for more info: rbus.rubyforge.org/
# 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) == 0 # 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)
click to toggle source
decode hex to plain
# 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)
click to toggle source
encode plain to hex
# File lib/dbus/auth.rb, line 101 def hex_encode(plain) return nil if plain.nil? plain.to_s.unpack("H*")[0] end
name()
click to toggle source
returns the modules name
# File lib/dbus/auth.rb, line 60 def name "DBUS_COOKIE_SHA1" end