vagrant-unbundled 2.2.10.0 → 2.2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -0
  3. data/Gemfile +1 -1
  4. data/README.md +4 -44
  5. data/RELEASE.md +1 -1
  6. data/contrib/zsh/_vagrant +3 -1
  7. data/contrib/zsh/generate_zsh_completion.rb +2 -3
  8. data/lib/vagrant.rb +0 -4
  9. data/lib/vagrant/action/builder.rb +6 -15
  10. data/lib/vagrant/action/builtin/box_add.rb +5 -1
  11. data/lib/vagrant/action/builtin/cloud_init_setup.rb +10 -15
  12. data/lib/vagrant/action/builtin/synced_folders.rb +8 -2
  13. data/lib/vagrant/action/runner.rb +1 -1
  14. data/lib/vagrant/box.rb +8 -2
  15. data/lib/vagrant/box_collection.rb +1 -1
  16. data/lib/vagrant/bundler.rb +43 -16
  17. data/lib/vagrant/machine.rb +8 -5
  18. data/lib/vagrant/machine_index.rb +1 -0
  19. data/lib/vagrant/plugin/v2/command.rb +2 -1
  20. data/lib/vagrant/shared_helpers.rb +8 -0
  21. data/lib/vagrant/util/downloader.rb +3 -2
  22. data/lib/vagrant/util/is_port_open.rb +1 -1
  23. data/lib/vagrant/util/mime.rb +92 -0
  24. data/lib/vagrant/util/platform.rb +2 -1
  25. data/lib/vagrant/util/template_renderer.rb +2 -2
  26. data/lib/vagrant/util/uploader.rb +7 -4
  27. data/plugins/commands/cap/command.rb +5 -1
  28. data/plugins/commands/cloud/auth/login.rb +20 -23
  29. data/plugins/commands/cloud/auth/logout.rb +2 -10
  30. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +57 -0
  31. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  32. data/plugins/commands/cloud/box/create.rb +33 -29
  33. data/plugins/commands/cloud/box/delete.rb +30 -24
  34. data/plugins/commands/cloud/box/show.rb +41 -31
  35. data/plugins/commands/cloud/box/update.rb +34 -26
  36. data/plugins/commands/cloud/client/client.rb +50 -81
  37. data/plugins/commands/cloud/list.rb +3 -4
  38. data/plugins/commands/cloud/locales/en.yml +9 -9
  39. data/plugins/commands/cloud/plugin.rb +10 -0
  40. data/plugins/commands/cloud/provider/create.rb +38 -28
  41. data/plugins/commands/cloud/provider/delete.rb +39 -29
  42. data/plugins/commands/cloud/provider/update.rb +37 -28
  43. data/plugins/commands/cloud/provider/upload.rb +44 -34
  44. data/plugins/commands/cloud/publish.rb +185 -108
  45. data/plugins/commands/cloud/search.rb +34 -21
  46. data/plugins/commands/cloud/util.rb +266 -162
  47. data/plugins/commands/cloud/version/create.rb +33 -28
  48. data/plugins/commands/cloud/version/delete.rb +35 -28
  49. data/plugins/commands/cloud/version/release.rb +35 -29
  50. data/plugins/commands/cloud/version/revoke.rb +36 -29
  51. data/plugins/commands/cloud/version/update.rb +29 -25
  52. data/plugins/commands/login/plugin.rb +0 -13
  53. data/plugins/guests/arch/cap/smb.rb +1 -1
  54. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  55. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  56. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +12 -2
  57. data/plugins/guests/darwin/plugin.rb +10 -0
  58. data/plugins/guests/debian/cap/change_host_name.rb +8 -7
  59. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +16 -41
  60. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +6 -0
  61. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +18 -5
  62. data/plugins/guests/linux/cap/reboot.rb +10 -5
  63. data/plugins/guests/redhat/cap/change_host_name.rb +6 -2
  64. data/plugins/guests/suse/cap/change_host_name.rb +32 -11
  65. data/plugins/guests/windows/cap/reboot.rb +8 -4
  66. data/plugins/kernel_v2/config/cloud_init.rb +7 -0
  67. data/plugins/kernel_v2/config/disk.rb +1 -1
  68. data/plugins/kernel_v2/config/vm.rb +5 -4
  69. data/plugins/providers/hyperv/action.rb +1 -1
  70. data/plugins/providers/virtualbox/cap/mount_options.rb +1 -1
  71. data/plugins/providers/virtualbox/model/storage_controller_array.rb +4 -6
  72. data/plugins/providers/virtualbox/provider.rb +2 -1
  73. data/plugins/synced_folders/smb/cap/mount_options.rb +21 -1
  74. data/plugins/synced_folders/smb/plugin.rb +10 -0
  75. data/scripts/website_push_www.sh +1 -1
  76. data/vagrant.gemspec +5 -6
  77. data/version.txt +1 -1
  78. metadata +1202 -1595
  79. data/plugins/commands/login/client.rb +0 -253
  80. data/plugins/commands/login/command.rb +0 -137
  81. data/plugins/commands/login/errors.rb +0 -24
  82. data/plugins/commands/login/locales/en.yml +0 -49
  83. data/scripts/website_push_docs.sh +0 -40
@@ -5,6 +5,8 @@ module VagrantPlugins
5
5
  module BoxCommand
6
6
  module Command
7
7
  class Create < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
11
  options = {}
10
12
 
@@ -19,13 +21,10 @@ module VagrantPlugins
19
21
  o.on("-d", "--description DESCRIPTION", String, "Full description of the box") do |d|
20
22
  options[:description] = d
21
23
  end
22
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address") do |u|
23
- options[:username] = u
24
- end
25
24
  o.on("-s", "--short-description DESCRIPTION", String, "Short description of the box") do |s|
26
25
  options[:short] = s
27
26
  end
28
- o.on("-p", "--private", "Makes box private") do |p|
27
+ o.on("-p", "--[no-]private", "Makes box private") do |p|
29
28
  options[:private] = p
30
29
  end
31
30
  end
@@ -38,35 +37,40 @@ module VagrantPlugins
38
37
  help: opts.help.chomp
39
38
  end
40
39
 
41
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
40
+ @client = client_login(@env)
42
41
 
43
- box = argv.first.split('/', 2)
44
- org = box[0]
45
- box_name = box[1]
46
- create_box(org, box_name, options, @client.token)
42
+ org, box_name = argv.first.split('/', 2)
43
+ create_box(org, box_name, @client.token, options.slice(:description, :short, :private))
47
44
  end
48
45
 
49
- # @param [String] - org
50
- # @param [String] - box_name
51
- # @param [Hash] - options
52
- def create_box(org, box_name, options, access_token)
53
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
54
- account = VagrantPlugins::CloudCommand::Util.account(org, access_token, server_url)
55
- box = VagrantCloud::Box.new(account, box_name, nil, options[:short], options[:description], access_token)
56
-
57
- begin
58
- success = box.create
59
- @env.ui.success(I18n.t("cloud_command.box.create_success", org: org, box_name: box_name))
60
- success = success.delete_if { |_, v| v.nil? }
61
- VagrantPlugins::CloudCommand::Util.format_box_results(success, @env)
62
- return 0
63
- rescue VagrantCloud::ClientError => e
64
- @env.ui.error(I18n.t("cloud_command.errors.box.create_fail", org: org, box_name: box_name))
65
- @env.ui.error(e)
66
- return 1
67
- end
46
+ # Create a new box
47
+ #
48
+ # @param [String] org Organization name of box
49
+ # @param [String] box_name Name of box
50
+ # @param [String] access_token User access token
51
+ # @param [Hash] options Options for box filtering
52
+ # @option options [String] :short Short description of box
53
+ # @option options [String] :description Full description of box
54
+ # @option options [Boolean] :private Set box visibility as private
55
+ # @return [Integer]
56
+ def create_box(org, box_name, access_token, options={})
57
+ account = VagrantCloud::Account.new(
58
+ custom_server: api_server_url,
59
+ access_token: access_token
60
+ )
61
+ box = account.organization(name: org).add_box(box_name)
62
+ box.short_description = options[:short] if options.key?(:short)
63
+ box.description = options[:description] if options.key?(:description)
64
+ box.private = options[:private] if options.key?(:private)
65
+ box.save
68
66
 
69
- return 1
67
+ @env.ui.success(I18n.t("cloud_command.box.create_success", org: org, box_name: box_name))
68
+ format_box_results(box, @env)
69
+ 0
70
+ rescue VagrantCloud::Error => e
71
+ @env.ui.error(I18n.t("cloud_command.errors.box.create_fail", org: org, box_name: box_name))
72
+ @env.ui.error(e.message)
73
+ 1
70
74
  end
71
75
  end
72
76
  end
@@ -5,6 +5,8 @@ module VagrantPlugins
5
5
  module BoxCommand
6
6
  module Command
7
7
  class Delete < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
11
  options = {}
10
12
 
@@ -16,8 +18,8 @@ module VagrantPlugins
16
18
  o.separator "Options:"
17
19
  o.separator ""
18
20
 
19
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address") do |u|
20
- options[:username] = u
21
+ o.on("-f", "--[no-]force", "Do not prompt for deletion confirmation") do |f|
22
+ options[:force] = f
21
23
  end
22
24
  end
23
25
 
@@ -29,34 +31,38 @@ module VagrantPlugins
29
31
  help: opts.help.chomp
30
32
  end
31
33
 
32
- @env.ui.warn(I18n.t("cloud_command.box.delete_warn", box: argv.first))
33
- cont = @env.ui.ask(I18n.t("cloud_command.continue"))
34
- return 1 if cont.strip.downcase != "y"
34
+ if !options[:force]
35
+ @env.ui.warn(I18n.t("cloud_command.box.delete_warn", box: argv.first))
36
+ cont = @env.ui.ask(I18n.t("cloud_command.continue"))
37
+ return 1 if cont.strip.downcase != "y"
38
+ end
35
39
 
36
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
40
+ @client = client_login(@env)
37
41
 
38
- box = argv.first.split('/', 2)
39
- org = box[0]
40
- box_name = box[1]
41
- delete_box(org, box_name, options[:username], @client.token)
42
+ org, box_name = argv.first.split('/', 2)
43
+ delete_box(org, box_name, @client.token)
42
44
  end
43
45
 
44
- def delete_box(org, box_name, username, access_token)
45
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
46
- account = VagrantPlugins::CloudCommand::Util.account(username, access_token, server_url)
47
- box = VagrantCloud::Box.new(account, box_name, nil, nil, nil, access_token)
48
-
49
- begin
50
- success = box.delete(org, box_name)
46
+ # Delete the requested box
47
+ #
48
+ # @param [String] org Organization name of box
49
+ # @param [String] box_name Name of box
50
+ # @param [String] access_token User access token
51
+ # @return [Integer]
52
+ def delete_box(org, box_name, access_token)
53
+ account = VagrantCloud::Account.new(
54
+ custom_server: api_server_url,
55
+ access_token: access_token
56
+ )
57
+ with_box(account: account, org: org, box: box_name) do |box|
58
+ box.delete
51
59
  @env.ui.success(I18n.t("cloud_command.box.delete_success", org: org, box_name: box_name))
52
- return 0
53
- rescue VagrantCloud::ClientError => e
54
- @env.ui.error(I18n.t("cloud_command.errors.box.delete_fail", org: org, box_name: box_name))
55
- @env.ui.error(e)
56
- return 1
60
+ 0
57
61
  end
58
-
59
- return 1
62
+ rescue VagrantCloud::Error => e
63
+ @env.ui.error(I18n.t("cloud_command.errors.box.delete_fail", org: org, box_name: box_name))
64
+ @env.ui.error(e.message)
65
+ 1
60
66
  end
61
67
  end
62
68
  end
@@ -5,8 +5,10 @@ module VagrantPlugins
5
5
  module BoxCommand
6
6
  module Command
7
7
  class Show < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
- options = {}
11
+ options = {quiet: true, versions: []}
10
12
 
11
13
  opts = OptionParser.new do |o|
12
14
  o.banner = "Usage: vagrant cloud box show [options] organization/box-name"
@@ -16,11 +18,11 @@ module VagrantPlugins
16
18
  o.separator "Options:"
17
19
  o.separator ""
18
20
 
19
- o.on("-u", "--username USERNAME_OR_EMAIL", String, "Vagrant Cloud username or email address") do |u|
20
- options[:username] = u
21
+ o.on("--versions VERSION", String, "Display box information for a specific version (can be defined multiple times)") do |v|
22
+ options[:versions] << v
21
23
  end
22
- o.on("--versions VERSION", String, "Display box information for a specific version") do |v|
23
- options[:version] = v
24
+ o.on("--[no-]auth", "Authenticate with Vagrant Cloud if required before searching") do |l|
25
+ options[:quiet] = !l
24
26
  end
25
27
  end
26
28
 
@@ -32,40 +34,48 @@ module VagrantPlugins
32
34
  help: opts.help.chomp
33
35
  end
34
36
 
35
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
36
- box = argv.first.split('/', 2)
37
+ @client = client_login(@env, options.slice(:quiet))
38
+ org, box_name = argv.first.split('/', 2)
37
39
 
38
- show_box(box[0], box[1], options, @client.token)
40
+ show_box(org, box_name, @client&.token, options.slice(:versions))
39
41
  end
40
42
 
41
- def show_box(org, box_name, options, access_token)
42
- username = options[:username]
43
-
44
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
45
- account = VagrantPlugins::CloudCommand::Util.account(username, access_token, server_url)
46
- box = VagrantCloud::Box.new(account, box_name, nil, nil, nil, access_token)
47
-
48
- begin
49
- success = box.read(org, box_name)
43
+ # Display the requested box to the user
44
+ #
45
+ # @param [String] org Organization name of box
46
+ # @param [String] box_name Name of box
47
+ # @param [String] access_token User access token
48
+ # @param [Hash] options Options for box filtering
49
+ # @option options [String] :versions Specific verisons of box
50
+ # @return [Integer]
51
+ def show_box(org, box_name, access_token, options={})
52
+ account = VagrantCloud::Account.new(
53
+ custom_server: api_server_url,
54
+ access_token: access_token
55
+ )
56
+ with_box(account: account, org: org, box: box_name) do |box|
57
+ if box && !Array(options[:versions]).empty?
58
+ box = box.versions.find_all{ |v| options[:versions].include?(v.version) }
59
+ else
60
+ box = [box]
61
+ end
50
62
 
51
- if options[:version]
52
- # show *this* version only
53
- results = success["versions"].select{ |v| v if v["version"] == options[:version] }.first
54
- if !results
55
- @env.ui.warn(I18n.t("cloud_command.box.show_filter_empty", version: options[:version], org: org, box_name: box_name))
56
- return 0
63
+ if !box.empty?
64
+ box.each do |b|
65
+ format_box_results(b, @env)
66
+ @env.ui.output("")
57
67
  end
68
+ 0
58
69
  else
59
- results = success
70
+ @env.ui.warn(I18n.t("cloud_command.box.show_filter_empty",
71
+ version: options[:version], org: org, box_name: box_name))
72
+ 1
60
73
  end
61
- results = results.delete_if { |_, v| v.nil? }
62
- VagrantPlugins::CloudCommand::Util.format_box_results(results, @env)
63
- return 0
64
- rescue VagrantCloud::ClientError => e
65
- @env.ui.error(I18n.t("cloud_command.errors.box.show_fail", org: org,box_name:box_name))
66
- @env.ui.error(e)
67
- return 1
68
74
  end
75
+ rescue VagrantCloud::Error => e
76
+ @env.ui.error(I18n.t("cloud_command.errors.box.show_fail", org: org,box_name:box_name))
77
+ @env.ui.error(e.message)
78
+ 1
69
79
  end
70
80
  end
71
81
  end
@@ -5,6 +5,8 @@ module VagrantPlugins
5
5
  module BoxCommand
6
6
  module Command
7
7
  class Update < Vagrant.plugin("2", :command)
8
+ include Util
9
+
8
10
  def execute
9
11
  options = {}
10
12
 
@@ -19,13 +21,10 @@ module VagrantPlugins
19
21
  o.on("-d", "--description DESCRIPTION", "Full description of the box") do |d|
20
22
  options[:description] = d
21
23
  end
22
- o.on("-u", "--username", "The username of the organization that will own the box") do |u|
23
- options[:username] = u
24
- end
25
24
  o.on("-s", "--short-description DESCRIPTION", "Short description of the box") do |s|
26
- options[:short_description] = s
25
+ options[:short] = s
27
26
  end
28
- o.on("-p", "--private", "Makes box private") do |p|
27
+ o.on("-p", "--[no-]private", "Makes box private") do |p|
29
28
  options[:private] = p
30
29
  end
31
30
  end
@@ -33,36 +32,45 @@ module VagrantPlugins
33
32
  # Parse the options
34
33
  argv = parse_options(opts)
35
34
  return if !argv
36
- if argv.empty? || argv.length > 1 || options.length == 0
35
+ if argv.empty? || argv.length > 1 || options.slice(:description, :short, :private).length == 0
37
36
  raise Vagrant::Errors::CLIInvalidUsage,
38
37
  help: opts.help.chomp
39
38
  end
40
39
 
41
- @client = VagrantPlugins::CloudCommand::Util.client_login(@env, options[:username])
42
- box = argv.first.split('/', 2)
40
+ @client = client_login(@env)
41
+ org, box_name = argv.first.split('/', 2)
43
42
 
44
- update_box(box[0], box[1], options, @client.token)
43
+ update_box(org, box_name, @client.token, options.slice(:short, :description, :private))
45
44
  end
46
45
 
47
- def update_box(org, box_name, options, access_token)
48
- server_url = VagrantPlugins::CloudCommand::Util.api_server_url
49
- account = VagrantPlugins::CloudCommand::Util.account(options[:username], access_token, server_url)
50
- box = VagrantCloud::Box.new(account, box_name, nil, nil, nil, access_token)
51
-
52
- options[:organization] = org
53
- options[:name] = box_name
54
- begin
55
- success = box.update(options)
46
+ # Update an existing box
47
+ #
48
+ # @param [String] org Organization name of box
49
+ # @param [String] box_name Name of box
50
+ # @param [String] access_token User access token
51
+ # @param [Hash] options Options for box filtering
52
+ # @option options [String] :short Short description of box
53
+ # @option options [String] :description Full description of box
54
+ # @option options [Boolean] :private Set box visibility as private
55
+ # @return [Integer]
56
+ def update_box(org, box_name, access_token, options={})
57
+ account = VagrantCloud::Account.new(
58
+ custom_server: api_server_url,
59
+ access_token: access_token
60
+ )
61
+ with_box(account: account, org: org, box: box_name) do |box|
62
+ box.short_description = options[:short] if options.key?(:short)
63
+ box.description = options[:description] if options.key?(:description)
64
+ box.private = options[:private] if options.key?(:private)
65
+ box.save
56
66
  @env.ui.success(I18n.t("cloud_command.box.update_success", org: org, box_name: box_name))
57
- success = success.delete_if{|_, v|v.nil?}
58
- VagrantPlugins::CloudCommand::Util.format_box_results(success, @env)
59
- return 0
60
- rescue VagrantCloud::ClientError => e
61
- @env.ui.error(I18n.t("cloud_command.errors.box.update_fail", org: org, box_name: box_name))
62
- @env.ui.error(e)
63
- return 1
67
+ format_box_results(box, @env)
68
+ 0
64
69
  end
65
- return 1
70
+ rescue VagrantCloud::Error => e
71
+ @env.ui.error(I18n.t("cloud_command.errors.box.update_fail", org: org, box_name: box_name))
72
+ @env.ui.error(e.message)
73
+ 1
66
74
  end
67
75
  end
68
76
  end
@@ -1,4 +1,3 @@
1
- require "rest_client"
2
1
  require "vagrant_cloud"
3
2
  require "vagrant/util/downloader"
4
3
  require "vagrant/util/presence"
@@ -7,6 +6,13 @@ require Vagrant.source_root.join("plugins/commands/cloud/errors")
7
6
  module VagrantPlugins
8
7
  module CloudCommand
9
8
  class Client
9
+ # @private
10
+ # Reset the cached values for scrubber. This is not considered a public
11
+ # API and should only be used for testing.
12
+ def self.reset!
13
+ class_variables.each(&method(:remove_class_variable))
14
+ end
15
+
10
16
  ######################################################################
11
17
  # Class that deals with managing users 'local' token for Vagrant Cloud
12
18
  ######################################################################
@@ -14,6 +20,7 @@ module VagrantPlugins
14
20
 
15
21
  include Vagrant::Util::Presence
16
22
 
23
+ attr_accessor :client
17
24
  attr_accessor :username_or_email
18
25
  attr_accessor :password
19
26
  attr_reader :two_factor_default_delivery_method
@@ -25,6 +32,7 @@ module VagrantPlugins
25
32
  def initialize(env)
26
33
  @logger = Log4r::Logger.new("vagrant::cloud::client")
27
34
  @env = env
35
+ @client = VagrantCloud::Client.new(access_token: token)
28
36
  end
29
37
 
30
38
  # Removes the token, effectively logging the user out.
@@ -38,14 +46,11 @@ module VagrantPlugins
38
46
  #
39
47
  # @return [Boolean]
40
48
  def logged_in?
41
- token = self.token
42
- return false if !token
43
- Vagrant::Util::CredentialScrubber.sensitive(token)
49
+ return false if !client.access_token
50
+ Vagrant::Util::CredentialScrubber.sensitive(client.access_token)
44
51
 
45
52
  with_error_handling do
46
- url = "#{Vagrant.server_url}/api/v1/authenticate" +
47
- "?access_token=#{token}"
48
- RestClient.get(url, content_type: :json)
53
+ client.authentication_token_validate
49
54
  true
50
55
  end
51
56
  rescue Errors::Unauthorized
@@ -62,23 +67,14 @@ module VagrantPlugins
62
67
  @logger.info("Logging in '#{username_or_email}'")
63
68
 
64
69
  Vagrant::Util::CredentialScrubber.sensitive(password)
65
- response = post(
66
- "/api/v1/authenticate", {
67
- user: {
68
- login: username_or_email,
69
- password: password
70
- },
71
- token: {
72
- description: description
73
- },
74
- two_factor: {
75
- code: code
76
- }
77
- }
78
- )
79
-
80
- Vagrant::Util::CredentialScrubber.sensitive(response["token"])
81
- response["token"]
70
+ with_error_handling do
71
+ r = client.authentication_token_create(username: username_or_email,
72
+ password: password, description: description, code: code)
73
+
74
+ Vagrant::Util::CredentialScrubber.sensitive(r[:token])
75
+ @client = VagrantCloud::Client.new(access_token: r[:token])
76
+ r[:token]
77
+ end
82
78
  end
83
79
 
84
80
  # Requests a 2FA code
@@ -87,50 +83,14 @@ module VagrantPlugins
87
83
  @env.ui.warn("Requesting 2FA code via #{delivery_method.upcase}...")
88
84
 
89
85
  Vagrant::Util::CredentialScrubber.sensitive(password)
90
- response = post(
91
- "/api/v1/two-factor/request-code", {
92
- user: {
93
- login: username_or_email,
94
- password: password
95
- },
96
- two_factor: {
97
- delivery_method: delivery_method.downcase
98
- }
99
- }
100
- )
101
-
102
- two_factor = response['two_factor']
103
- obfuscated_destination = two_factor['obfuscated_destination']
104
-
105
- @env.ui.success("2FA code sent to #{obfuscated_destination}.")
106
- end
107
-
108
- # Issues a post to a Vagrant Cloud path with the given payload.
109
- # @param [String] path
110
- # @param [Hash] payload
111
- # @return [Hash] response data
112
- def post(path, payload)
113
86
  with_error_handling do
114
- url = File.join(Vagrant.server_url, path)
115
-
116
- proxy = nil
117
- proxy ||= ENV["HTTPS_PROXY"] || ENV["https_proxy"]
118
- proxy ||= ENV["HTTP_PROXY"] || ENV["http_proxy"]
119
- RestClient.proxy = proxy
120
-
121
- response = RestClient::Request.execute(
122
- method: :post,
123
- url: url,
124
- payload: JSON.dump(payload),
125
- proxy: proxy,
126
- headers: {
127
- accept: :json,
128
- content_type: :json,
129
- user_agent: Vagrant::Util::Downloader::USER_AGENT,
130
- },
131
- )
132
-
133
- JSON.load(response.to_s)
87
+ r = client.authentication_request_2fa_code(
88
+ username: username_or_email, password: password, delivery_method: delivery_method)
89
+
90
+ two_factor = r[:two_factor]
91
+ obfuscated_destination = two_factor[:obfuscated_destination]
92
+
93
+ @env.ui.success("2FA code sent to #{obfuscated_destination}.")
134
94
  end
135
95
  end
136
96
 
@@ -138,12 +98,16 @@ module VagrantPlugins
138
98
  #
139
99
  # @param [String] token
140
100
  def store_token(token)
101
+ Vagrant::Util::CredentialScrubber.sensitive(token)
141
102
  @logger.info("Storing token in #{token_path}")
142
103
 
143
104
  token_path.open("w") do |f|
144
105
  f.write(token)
145
106
  end
146
107
 
108
+ # Reset after we store the token since this is now _our_ token
109
+ @client = VagrantCloud::Client.new(access_token: token)
110
+
147
111
  nil
148
112
  end
149
113
 
@@ -154,7 +118,9 @@ module VagrantPlugins
154
118
  # @return [String]
155
119
  def token
156
120
  if present?(ENV["VAGRANT_CLOUD_TOKEN"]) && token_path.exist?
157
- @env.ui.warn <<-EOH.strip
121
+ # Only show warning if it has not been previously shown
122
+ if !defined?(@@double_token_warning)
123
+ @env.ui.warn <<-EOH.strip
158
124
  Vagrant detected both the VAGRANT_CLOUD_TOKEN environment variable and a Vagrant login
159
125
  token are present on this system. The VAGRANT_CLOUD_TOKEN environment variable takes
160
126
  precedence over the locally stored token. To remove this error, either unset
@@ -163,21 +129,24 @@ the VAGRANT_CLOUD_TOKEN environment variable or remove the login token stored on
163
129
  ~/.vagrant.d/data/vagrant_login_token
164
130
 
165
131
  EOH
132
+ @@double_token_warning = true
133
+ end
166
134
  end
167
135
 
168
136
  if present?(ENV["VAGRANT_CLOUD_TOKEN"])
169
137
  @logger.debug("Using authentication token from environment variable")
170
- return ENV["VAGRANT_CLOUD_TOKEN"]
171
- end
172
-
173
- if token_path.exist?
138
+ t = ENV["VAGRANT_CLOUD_TOKEN"]
139
+ elsif token_path.exist?
174
140
  @logger.debug("Using authentication token from disk at #{token_path}")
175
- return token_path.read.strip
141
+ t = token_path.read.strip
142
+ elsif present?(ENV["ATLAS_TOKEN"])
143
+ @logger.warn("ATLAS_TOKEN detected within environment. Using ATLAS_TOKEN in place of VAGRANT_CLOUD_TOKEN.")
144
+ t = ENV["ATLAS_TOKEN"]
176
145
  end
177
146
 
178
- if present?(ENV["ATLAS_TOKEN"])
179
- @logger.warn("ATLAS_TOKEN detected within environment. Using ATLAS_TOKEN in place of VAGRANT_CLOUD_TOKEN.")
180
- return ENV["ATLAS_TOKEN"]
147
+ if !t.nil?
148
+ Vagrant::Util::CredentialScrubber.sensitive(t)
149
+ return t
181
150
  end
182
151
 
183
152
  @logger.debug("No authentication token in environment or #{token_path}")
@@ -189,22 +158,22 @@ EOH
189
158
 
190
159
  def with_error_handling(&block)
191
160
  yield
192
- rescue RestClient::Unauthorized
161
+ rescue Excon::Error::Unauthorized
193
162
  @logger.debug("Unauthorized!")
194
163
  raise Errors::Unauthorized
195
- rescue RestClient::BadRequest => e
164
+ rescue Excon::Error::BadRequest => e
196
165
  @logger.debug("Bad request:")
197
166
  @logger.debug(e.message)
198
167
  @logger.debug(e.backtrace.join("\n"))
199
- parsed_response = JSON.parse(e.response)
168
+ parsed_response = JSON.parse(e.response.body)
200
169
  errors = parsed_response["errors"].join("\n")
201
170
  raise Errors::ServerError, errors: errors
202
- rescue RestClient::NotAcceptable => e
171
+ rescue Excon::Error::NotAcceptable => e
203
172
  @logger.debug("Got unacceptable response:")
204
173
  @logger.debug(e.message)
205
174
  @logger.debug(e.backtrace.join("\n"))
206
175
 
207
- parsed_response = JSON.parse(e.response)
176
+ parsed_response = JSON.parse(e.response.body)
208
177
 
209
178
  if two_factor = parsed_response['two_factor']
210
179
  store_two_factor_information two_factor