diff --git a/src/cloud/common/CloudServer.rb b/src/cloud/common/CloudServer.rb index 47f49c326f..8d9dce4b9b 100755 --- a/src/cloud/common/CloudServer.rb +++ b/src/cloud/common/CloudServer.rb @@ -92,20 +92,9 @@ class CloudServer # Gets the data associated with a user # name:: _String_ the name of the user # [return] _Hash_ with the user data - def get_user(name) - user = nil - + def get_user_password(name) @user_pool.info - @user_pool.each{ |u| - if u.name==name - user=Hash.new - - user[:id] = u.id - user[:name] = u.name - user[:password] = u[:password] - end - } - return user + return @user_pool["USER[NAME=\"#{name}\"]/PASSWORD"] end ########################################################################### diff --git a/src/cloud/ec2/lib/EC2QueryServer.rb b/src/cloud/ec2/lib/EC2QueryServer.rb index 5acd526f0b..8b53b938b3 100644 --- a/src/cloud/ec2/lib/EC2QueryServer.rb +++ b/src/cloud/ec2/lib/EC2QueryServer.rb @@ -26,7 +26,7 @@ require 'CloudServer' require 'ImageEC2' ############################################################################### -# The EC2Query Server implements a EC2 compatible server based on the +# The EC2Query Server implements a EC2 compatible server based on the # OpenNebula Engine ############################################################################### class EC2QueryServer < CloudServer @@ -67,7 +67,7 @@ class EC2QueryServer < CloudServer super(config_file) @config.add_configuration_value("TEMPLATE_LOCATION",template) @config.add_configuration_value("VIEWS",views) - + if @config[:ssl_server] @server_host=@config[:ssl_server] else @@ -79,6 +79,15 @@ class EC2QueryServer < CloudServer print_configuration end + # Retrieve a client with the user credentials + # requestenv:: _Hash_ Hash containing the environment of the request + # [return] _Client_ client with the user credentials + def get_client(params) + usepassword = get_user() + return one_client_user(params['AWSAccessKeyId'], + get_user_()password) + end + ########################################################################### # Authentication functions ########################################################################### @@ -87,13 +96,13 @@ class EC2QueryServer < CloudServer # params:: of the request # [return] true if authenticated def authenticate?(params,env) - user = get_user(params['AWSAccessKeyId']) + user,password = get_user(params['AWSAccessKeyId']) return false if !user signature = case params['SignatureVersion'] when "1" then signature_version_1(params.clone, user[:password]) - when "2" then signature_version_2(params, - user[:password], + when "2" then signature_version_2(params, + user[:password], env, false) end @@ -113,20 +122,20 @@ class EC2QueryServer < CloudServer b64sig = Base64.b64encode(digest) return b64sig.strip end - - # Calculates signature version 2 + + # Calculates signature version 2 def signature_version_2(params, secret_key, env, urlencode=true) - signature_params = params.reject { |key,value| + signature_params = params.reject { |key,value| key=='Signature' or key=='file' } server_str = @server_host server_str = server_str + ":" + @server_port unless %w{2008-12-01 2009-11-30}.include? params["Version"] - canonical_str = AWS.canonical_string(signature_params, + canonical_str = AWS.canonical_string(signature_params, server_str, env['REQUEST_METHOD']) - + # Use the correct signature strength sha_strength = case params['SignatureMethod'] @@ -136,10 +145,10 @@ class EC2QueryServer < CloudServer end digest = OpenSSL::Digest::Digest.new(sha_strength) - b64hmac = + b64hmac = Base64.encode64( OpenSSL::HMAC.digest(digest, secret_key, canonical_str)).gsub("\n","") - + if urlencode return CGI::escape(b64hmac) else @@ -156,34 +165,34 @@ class EC2QueryServer < CloudServer one_client = one_client_user(user) image = ImageEC2.new(Image.build_xml, one_client) - + rc = add_image(image, params['file']) if OpenNebula.is_error?(rc) - return OpenNebula::Error.new('Unsupported'),400 + return OpenNebula::Error.new('Unsupported'),400 end - + erb_version = params['Version'] response = ERB.new(File.read(@config[:views]+"/register_image.erb")) return response.result(binding), 200 end - + def register_image(params) user = get_user(params['AWSAccessKeyId']) one_client = one_client_user(user) - + tmp, img=params['ImageLocation'].split('-') image = Image.new(Image.build_xml(img.to_i), one_client) - + # Enable the new Image rc = image.info if OpenNebula.is_error?(rc) return OpenNebula::Error.new('InvalidAMIID.NotFound'), 400 end - + image.enable - + erb_version = params['Version'] response = ERB.new(File.read(@config[:views]+"/register_image.erb")) @@ -192,15 +201,15 @@ class EC2QueryServer < CloudServer def describe_images(params) user = get_user(params['AWSAccessKeyId']) - one_client = one_client_user(user) + one_client = one_client_user(user) user_flag=-1 erb_impool = ImagePool.new(one_client, user_flag) erb_impool.info - + erb_user_name = user[:name] erb_version = params['Version'] - + response = ERB.new(File.read(@config[:views]+"/describe_images.erb")) a = response.result(binding) pp a @@ -218,23 +227,23 @@ class EC2QueryServer < CloudServer # Get the instance type and path instance_type_name = params['InstanceType'] instance_type = @instance_types[instance_type_name] - + path = get_template_path(params['InstanceType']) if OpenNebula.is_error?(path) return OpenNebula::Error.new('Unsupported'),400 end - + # Get the image tmp, img=params['ImageId'].split('-') - - # Build the VM + + # Build the VM erb_vm_info=Hash.new erb_vm_info[:img_id] = img.to_i erb_vm_info[:ec2_img_id] = params['ImageId'] erb_vm_info[:instance_type] = instance_type_name erb_vm_info[:template] = path erb_vm_info[:user_data] = params['UserData'] - + template = ERB.new(File.read(erb_vm_info[:template])) template_text = template.result(binding) @@ -245,15 +254,15 @@ class EC2QueryServer < CloudServer if OpenNebula::is_error?(rc) return OpenNebula::Error.new('Unsupported'),400 end - + vm.info - + erb_vm_info[:vm_id]=vm.id erb_vm_info[:vm]=vm erb_vm_info[:user_name] = user[:name] - + erb_version = params['Version'] - + response = ERB.new(File.read(@config[:views]+"/run_instances.erb")) return response.result(binding), 200 end @@ -262,7 +271,7 @@ class EC2QueryServer < CloudServer def describe_instances(params) # Get the user user = get_user(params['AWSAccessKeyId']) - one_client = one_client_user(user) + one_client = one_client_user(user) erb_user_name = user[:name] @@ -271,37 +280,37 @@ class EC2QueryServer < CloudServer erb_vmpool.info erb_version = params['Version'] - + response = ERB.new(File.read(@config[:views]+"/describe_instances.erb")) - + return response.result(binding), 200 end def terminate_instances(params) # Get the user user = get_user(params['AWSAccessKeyId']) - one_client = one_client_user(user) + one_client = one_client_user(user) vmid=params['InstanceId.1'] vmid=params['InstanceId.01'] if !vmid tmp, vmid=vmid.split('-') if vmid[0]==?i - + erb_vm = VirtualMachine.new(VirtualMachine.build_xml(vmid),one_client) rc = erb_vm.info - + return OpenNebula::Error.new('Unsupported'),400 if OpenNebula::is_error?(rc) - + if erb_vm.status == 'runn' rc = erb_vm.shutdown else rc = erb_vm.finalize end - + return OpenNebula::Error.new('Unsupported'),400 if OpenNebula::is_error?(rc) erb_version = params['Version'] - + response =ERB.new(File.read(@config[:views]+"/terminate_instances.erb")) return response.result(binding), 200 end @@ -312,8 +321,8 @@ private ########################################################################### def render_state(vm) ec2_state = EC2_STATES[ONE_STATES[vm.status]] - - return "#{ec2_state[:code]} + + return "#{ec2_state[:code]} #{ec2_state[:name]}" end diff --git a/src/cloud/occi/lib/OCCIServer.rb b/src/cloud/occi/lib/OCCIServer.rb index 88de9df234..04875e3179 100755 --- a/src/cloud/occi/lib/OCCIServer.rb +++ b/src/cloud/occi/lib/OCCIServer.rb @@ -216,7 +216,7 @@ class OCCIServer < CloudServer # [return] _String_,_Integer_ Update confirmation msg or error, # status code def put_compute(request, params) - vm_info = XMLUtilsElement.initialize_xml(xml_info, 'COMPUTE') + vm_info = XMLUtilsElement.initialize_xml(request.body.read, 'COMPUTE') # --- Get the VM and Action on it --- if vm_info['STATE'] != nil