Sha256: b5146a85062dc183985af6b525925d531b15f661dbce5ab068658f1aa1de5c2b

Contents?: true

Size: 1.77 KB

Versions: 16

Compression:

Stored size: 1.77 KB

Contents

require 'digest/md5'
require 'net/http'

module Net
  module HTTPHeader
    def digest_auth(username, password, response)
      @header['Authorization'] = DigestAuthenticator.new(username, password,
          @method, @path, response).authorization_header
    end


    class DigestAuthenticator
      def initialize(username, password, method, path, response_header)
        @username = username
        @password = password
        @method   = method
        @path     = path
        @response = parse(response_header)
      end

      def authorization_header
        @cnonce = md5(random)
        header = [%Q(Digest username="#{@username}"),
          %Q(realm="#{@response['realm']}"),
          %Q(nonce="#{@response['nonce']}"),
          %Q(uri="#{@path}"),
          %Q(response="#{request_digest}")]
        [%Q(cnonce="#{@cnonce}"),
          %Q(opaque="#{@response['opaque']}"),
          %Q(qop="#{@response['qop']}"),
          %Q(nc="0")].each { |field| header << field } if qop_present?
        header
      end

    private

      def parse(response_header)
        response_header['www-authenticate'] =~ /^(\w+) (.*)/
        params = {}
        $2.gsub(/(\w+)="(.*?)"/) { params[$1] = $2 }
        params
      end

      def qop_present?
        @response.has_key?('qop') and not @response['qop'].empty?
      end

      def random
        "%x" % (Time.now.to_i + rand(65535))
      end

      def request_digest
        a = [md5(a1), @response['nonce'], md5(a2)]
        a.insert(2, "0", @cnonce, @response['qop']) if qop_present?
        md5(a.join(":"))
      end

      def md5(str)
        Digest::MD5.hexdigest(str)
      end

      def a1
        [@username, @response['realm'], @password].join(":")
      end

      def a2
        [@method, @path].join(":")
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 3 rubygems

Version Path
httparty-0.8.3 lib/httparty/net_digest_auth.rb
httparty-0.8.2 lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.6.alpha vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.5 vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.4 vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.3 vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.2 vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
nutshell-crm-0.0.1 vendor/bundle/gems/httparty-0.8.1/lib/httparty/net_digest_auth.rb
httparty-0.8.1 lib/httparty/net_digest_auth.rb
httparty-0.8.0 lib/httparty/net_digest_auth.rb
httparty2-0.7.10 lib/httparty/net_digest_auth.rb
httparty-0.7.8 lib/httparty/net_digest_auth.rb
httparty-0.7.7 lib/httparty/net_digest_auth.rb
httparty-0.7.6 lib/httparty/net_digest_auth.rb
httparty-0.7.4 lib/httparty/net_digest_auth.rb
httparty-0.7.3 lib/httparty/net_digest_auth.rb