class Chef::Knife::UserPassword

def run

def run
  # check that correct number of args was passed, should be either

  # USERNAME PASSWORD or USERNAME --enable-external-auth

  #

  # note that you can't pass USERNAME PASSWORD --enable-external-auth

  unless (@name_args.length == 2 && !config[:enable_external_auth]) || (@name_args.length == 1 && config[:enable_external_auth])
    show_usage
    ui.fatal("You must pass two arguments")
    ui.fatal("Note that --enable-external-auth cannot be passed with a password")
    exit 1
  end
  user_name = @name_args[0]
  # note that this will be nil if config[:enable_external_auth] is true

  password = @name_args[1]
  # since the API does not pass back whether recovery_authentication_enabled is

  # true or false, there is no way of knowing if the user is using ldap or not,

  # so we will update the user every time, instead of checking if we are actually

  # changing anything before we PUT.

  result = root_rest.get("users/#{user_name}")
  result["password"] = password unless password.nil?
  # if --enable-external-auth was passed, enable it, else disable it.

  # there is never a situation where we would want to enable ldap

  # AND change the password. changing the password means that the user

  # wants to disable ldap and put user in recover (if they are using ldap).

  result["recovery_authentication_enabled"] = !config[:enable_external_auth]
  begin
    root_rest.put("users/#{user_name}", result)
  rescue => e
    raise e
  end
  ui.msg("Authentication info updated for #{user_name}.")
end