# 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 53
    def authenticate
      require 'etc'
      #number of retries we have for auth
      @retries = 1
      return "#{hex_encode(Etc.getlogin)}" #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 66
    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 = Array.new(s_challenge.bytesize/2).map{|obj|obj=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 108
    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 102
    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 61
    def name
      return 'DBUS_COOKIE_SHA1'
    end