diff options
Diffstat (limited to 'lib/chef/resource/remote_file.rb')
-rw-r--r-- | lib/chef/resource/remote_file.rb | 84 |
1 files changed, 62 insertions, 22 deletions
diff --git a/lib/chef/resource/remote_file.rb b/lib/chef/resource/remote_file.rb index f631b4e579..190428938d 100644 --- a/lib/chef/resource/remote_file.rb +++ b/lib/chef/resource/remote_file.rb @@ -131,38 +131,78 @@ class Chef ) end - def remote_user(args = nil) - set_or_return( - :remote_user, - args, - :kind_of => String - ) - end + property :remote_user, String - def remote_user_domain(args = nil) - set_or_return( - :remote_user_domain, - args, - :kind_of => String - ) - end + property :remote_domain, String - def remote_user_password(args = nil) - set_or_return( - :remote_user_password, - args, - :kind_of => String - ) - end + property :remote_password, String, sensitive: true def sensitive(args = nil) - if ! remote_user_password.nil? + if remote_password true else super end end + def after_created + validate_identity_platform(remote_user, remote_password, remote_domain) + identity = qualify_user(remote_user, remote_password, remote_domain) + remote_domain(identity[:domain]) + remote_user(identity[:user]) + end + + def validate_identity_platform(specified_user, password = nil, specified_domain = nil) + if node[:platform_family] == "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 + private include Chef::Mixin::Uris |