From c6e87d9655617d7d4b334b3e565cdac3abe443b0 Mon Sep 17 00:00:00 2001 From: nimisha Date: Mon, 30 Jan 2017 18:13:02 +0530 Subject: Fixing review comments Signed-off-by: nimisha --- lib/chef/resource/execute.rb | 90 ++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 29 deletions(-) (limited to 'lib/chef/resource/execute.rb') diff --git a/lib/chef/resource/execute.rb b/lib/chef/resource/execute.rb index d0e4d958f6..cf81a24cec 100644 --- a/lib/chef/resource/execute.rb +++ b/lib/chef/resource/execute.rb @@ -135,37 +135,11 @@ class Chef ) end - def user(arg = nil) - set_or_return( - :user, - arg, - :kind_of => [ String, Integer ] - ) - end - - def domain(arg = nil) - set_or_return( - :domain, - arg, - :kind_of => [ String ] - ) - end + property :user, [ String, Integer ] - def password(arg = nil) - set_or_return( - :password, - arg, - :kind_of => [ String ] - ) - end + property :domain, String - def sensitive(args = nil) - if ! password.nil? - true - else - super - end - end + property :password, String, sensitive: true def self.set_guard_inherited_attributes(*inherited_attributes) @class_inherited_attributes = inherited_attributes @@ -183,6 +157,64 @@ class Chef ancestor_attributes.concat(@class_inherited_attributes ? @class_inherited_attributes : []).uniq end + def after_created + validate_identity_platform(user, password, domain) + identity = qualify_user(user, password, domain) + domain(identity[:domain]) + user(identity[:user]) + end + + def validate_identity_platform(specified_user, password = nil, specified_domain = nil) + if Chef::Platform.windows? + if specified_user && password.nil? + raise ArgumentError, "A value for `password` must be specified when a value for `user` is specified on the Windows platform" + end + else + if password || specified_domain + raise Exceptions::UnsupportedPlatform, "Values for `domain` and `password` are only supported on the Windows platform" + end + end + end + + def qualify_user(specified_user, password = nil, specified_domain = nil) + domain = specified_domain + user = specified_user + + if specified_user.nil? && ! specified_domain.nil? + raise ArgumentError, "The domain `#{specified_domain}` was specified, but no user name was given" + end + + # if domain is provided in both username and domain + if specified_user && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain + raise ArgumentError, "The domain is provided twice. Username: `#{specified_user}`, Domain: `#{specified_domain}`. Please specify domain only once." + end + + if ! specified_user.nil? && specified_domain.nil? + # Splitting username of format: Domain\Username + domain_and_user = user.split('\\') + + if domain_and_user.length == 2 + domain = domain_and_user[0] + user = domain_and_user[1] + elsif domain_and_user.length == 1 + # Splitting username of format: Username@Domain + domain_and_user = user.split("@") + if domain_and_user.length == 2 + domain = domain_and_user[1] + user = domain_and_user[0] + elsif domain_and_user.length != 1 + raise ArgumentError, "The specified user name `#{user}` is not a syntactically valid user name" + end + end + end + + if ( password || domain ) && user.nil? + raise ArgumentError, "A value for `password` or `domain` was specified without specification of a value for `user`" + end + + { domain: domain, user: user } + end + set_guard_inherited_attributes( :cwd, :environment, -- cgit v1.2.1