vagrant-unbundled 2.2.10.0 → 2.2.14.0

Sign up to get free protection for your applications and to get access to all the features.
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