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}"