Sha256: 50f2a88f1fc237ffae458c3e63ba403053ae4a3b6c4c246f80258b99bc4073a4

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

require 'openssl'

module RSolr
  module ClientCert
    class Error < Exception; end
      
    class Connection
      attr_reader :ssl_client_cert, :ssl_client_key
      
      def initialize opts = {}
        @ssl_client_cert = extract_client_cert(opts)
        @ssl_client_key = extract_client_key(opts)
      end
      
      def execute client, request_context
        resource = RestClient::Resource.new(
          request_context[:uri].to_s,
          :ssl_client_cert  =>  ssl_client_cert,
          :ssl_client_key   =>  ssl_client_key
        )
        result = {}
        resource.send(request_context[:method]) { |response, request, result, &block|
          result = {
            :status => response.net_http_res.code.to_i,
            :headers => response.net_http_res.to_hash,
            :body => response.net_http_res.body
          }
        }
        result
      end
      
      protected
      
      def extract_key_class(key_text)
        if key_text =~ /BEGIN (.+) PRIVATE KEY/
          OpenSSL::PKey.const_get($1.to_sym)
        else
          raise Error, "Cannot determine key type"
        end
      end
    
      def extract_client_key(opts)
        if opts[:ssl_client_key]
          opts[:ssl_client_key]
        elsif opts[:ssl_key_file]
          key_text = File.read(opts[:ssl_key_file])
          key_class = extract_key_class(key_text)
          key_class.new(key_text, opts[:ssl_key_pass].to_s)
        else
          raise Error, "No :ssl_client_key or :ssl_key_file provided"
        end
      end
    
      def extract_client_cert(opts)
        if opts[:ssl_client_cert]
          opts[:ssl_client_cert]
        elsif opts[:ssl_cert_file]
          OpenSSL::X509::Certificate.new(File.read(opts[:ssl_cert_file]))
        else
          raise Error, "No :ssl_client_key or :ssl_key_file provided"
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rsolr-client-cert-0.5.0 lib/rsolr/client_cert/connection.rb