lib/fog/joyent/compute.rb in fog-1.3.1 vs lib/fog/joyent/compute.rb in fog-1.4.0

- old
+ new

@@ -1,9 +1,8 @@ -require File.expand_path(File.join(File.dirname(__FILE__), '..', 'joyent')) -require File.expand_path(File.join(File.dirname(__FILE__), 'errors')) +require 'fog/joyent' +require 'fog/joyent/errors' require 'fog/compute' -require 'multi_json' module Fog module Compute class Joyent < Fog::Service requires :joyent_username @@ -14,11 +13,11 @@ recognizes :joyent_keyfile model_path 'fog/joyent/models/compute' request_path 'fog/joyent/requests/compute' - # request :list_datacenters + request :list_datacenters # request :get_datacenter # Keys collection :keys model :key @@ -112,12 +111,19 @@ if options[:joyent_keyname] && options[:joyent_keyfile] if File.exists?(options[:joyent_keyfile]) @joyent_keyname = options[:joyent_keyname] @joyent_key = File.read(options[:joyent_keyfile]) - @rsa = OpenSSL::PKey::RSA.new(@joyent_key) + if @joyent_key.lines.first.include?('-----BEGIN DSA PRIVATE KEY-----') + @key = OpenSSL::PKey::DSA.new(@joyent_key) + elsif @joyent_key.lines.first.include?('-----BEGIN RSA PRIVATE KEY-----') + @key = OpenSSL::PKey::RSA.new(@joyent_key) + else + raise ArgumentError, "options[joyent_keyfile] provided must be an RSA or DSA private key" + end + @header_method = method(:header_for_signature_auth) else raise ArgumentError, "options[:joyent_keyfile] provided does not exist." end @@ -142,11 +148,11 @@ "Content-Type" => "application/json", "Accept" => "application/json" }.merge(request[:headers] || {}).merge(@header_method.call) if request[:body] - request[:body] = MultiJson.encode(request[:body]) + request[:body] = Fog::JSON.encode(request[:body]) end response = @connection.request(request) if response.headers["Content-Type"] == "application/json" @@ -159,11 +165,11 @@ end private def json_decode(body) - parsed = MultiJson.decode(body) + parsed = Fog::JSON.decode(body) decode_time_attrs(parsed) end def header_for_basic_auth { @@ -171,10 +177,19 @@ } end def header_for_signature_auth date = Time.now.utc.httpdate - signature = Base64.encode64(@rsa.sign("sha256", date)).delete("\r\n") + begin + signature = Base64.encode64(@key.sign("sha256", date)).delete("\r\n") + rescue OpenSSL::PKey::PKeyError => e + if e.message == 'wrong public key type' + puts 'ERROR: Your version of ruby/openssl does not suport DSA key signing' + puts 'see: http://bugs.ruby-lang.org/issues/4734' + puts 'workaround: Please use an RSA key instead' + end + raise + end key_id = "/#{@joyent_username}/keys/#{@joyent_keyname}" { "Date" => date, "Authorization" => "Signature keyId=\"#{key_id}\",algorithm=\"rsa-sha256\" #{signature}"