vagrant-docker-certificates-manager 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/lib/vagrant-docker-certificates-manager/VERSION +1 -1
- data/lib/vagrant-docker-certificates-manager/actions/uninstall.rb +1 -1
- data/lib/vagrant-docker-certificates-manager/config.rb +0 -1
- data/lib/vagrant-docker-certificates-manager/helpers.rb +36 -26
- data/lib/vagrant-docker-certificates-manager/util/os.rb +136 -50
- data/lib/vagrant-docker-certificates-manager/util/registry.rb +1 -1
- data/lib/vagrant-docker-certificates-manager/version.rb +7 -5
- data/locales/en.yml +0 -11
- data/locales/fr.yml +0 -11
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1f64aa238bae8dbe7da5f4b4554bc04baa2d70c955384ff64811e03ef684c791
|
|
4
|
+
data.tar.gz: ac5625a4e633a4e487ff814307920171db797da2a87a7f384da04f616d91c7e8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4cb997ec0c8d99ed7f221a634b0a0ff0e88aab81516d496c4b541adde7a1e85a88a9ea4ed6c902fafa593a8be6357f5706113def410561cb2b8eb22461a25745
|
|
7
|
+
data.tar.gz: 638c3572ab9ffa1d6ce7a7c7c4605022c41f257ffc801b30ed7fc3ee7a4d30a118b7a8b1871cf27f93c7b24308f5aca6d0db49810431ba8074bc54de58b275be
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.0](https://github.com/julienpoirou/vagrant-docker-certificates-manager/compare/v0.2.0...v0.3.0) (2026-03-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Fonctionnalités ✨
|
|
7
|
+
|
|
8
|
+
* **firefox:** Adding certificate management to Firefox ([6e067c3](https://github.com/julienpoirou/vagrant-docker-certificates-manager/commit/6e067c3a99f7963aa27b8cfc7b1e481a443af4ec))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Corrections 🐛
|
|
12
|
+
|
|
13
|
+
* **rubocop:** Migrate rubocop-rspec from require to plugins ([9a22642](https://github.com/julienpoirou/vagrant-docker-certificates-manager/commit/9a226421d98aab0d781fd1ac3d0845e5b1c43ff4))
|
|
14
|
+
* **rubocop:** Restore explicit *args for Ruby 3.1 compatibility ([595438d](https://github.com/julienpoirou/vagrant-docker-certificates-manager/commit/595438d061e2f1aafb7616b91110935ef4718a5c))
|
|
15
|
+
|
|
3
16
|
## [0.2.0](https://github.com/julienpoirou/vagrant-docker-certificates-manager/compare/v0.1.0...v0.2.0) (2025-08-20)
|
|
4
17
|
|
|
5
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.0
|
|
@@ -12,7 +12,7 @@ module VagrantDockerCertificatesManager
|
|
|
12
12
|
def initialize(app, env); @app = app; @env = env; end
|
|
13
13
|
|
|
14
14
|
def call(env)
|
|
15
|
-
cfg = env[:machine].config.
|
|
15
|
+
cfg = env[:machine].config.docker_certificates
|
|
16
16
|
UiHelpers.set_locale!(cfg.locale || "en")
|
|
17
17
|
if cfg.remove_on_destroy
|
|
18
18
|
Ui.say(env, :info, "uninstall.start", name: cfg.cert_name)
|
|
@@ -21,7 +21,8 @@ module VagrantDockerCertificatesManager
|
|
|
21
21
|
error: "❌",
|
|
22
22
|
version: "💾",
|
|
23
23
|
broom: "🧹",
|
|
24
|
-
question: "❓"
|
|
24
|
+
question: "❓",
|
|
25
|
+
bug: "🐛"
|
|
25
26
|
}.freeze
|
|
26
27
|
|
|
27
28
|
module_function
|
|
@@ -32,31 +33,28 @@ module VagrantDockerCertificatesManager
|
|
|
32
33
|
base = File.expand_path("../../locales", __dir__)
|
|
33
34
|
::I18n.load_path |= Dir[File.join(base, "*.yml")]
|
|
34
35
|
::I18n.available_locales = SUPPORTED
|
|
35
|
-
default = ((ENV["VDCM_LANG"] || ENV["LANG"] || "en")[0,2] rescue "en").to_sym
|
|
36
|
+
default = ((ENV["VDCM_LANG"] || ENV["LANG"] || "en")[0, 2] rescue "en").to_sym
|
|
36
37
|
::I18n.default_locale = SUPPORTED.include?(default) ? default : :en
|
|
37
38
|
::I18n.backend.load_translations
|
|
38
39
|
@i18n_setup = true
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def set_locale!(lang, strict: false)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
else
|
|
53
|
-
sym = :en
|
|
54
|
-
end
|
|
43
|
+
setup_i18n!
|
|
44
|
+
raw = (lang || ENV["VDCM_LANG"] || ENV["LANG"] || "en").to_s
|
|
45
|
+
sym = raw[0, 2].to_s.downcase.to_sym
|
|
46
|
+
sym = :en if sym.nil? || sym == :""
|
|
47
|
+
unless SUPPORTED.include?(sym)
|
|
48
|
+
if strict
|
|
49
|
+
raise UnsupportedLocaleError,
|
|
50
|
+
"#{e(:error)} Unsupported language: #{sym}. Available: #{SUPPORTED.join(', ')}"
|
|
51
|
+
else
|
|
52
|
+
sym = :en
|
|
55
53
|
end
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
end
|
|
55
|
+
::I18n.locale = sym
|
|
56
|
+
::I18n.backend.load_translations
|
|
57
|
+
sym
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
def e(key, no_emoji: false)
|
|
@@ -88,6 +86,20 @@ module VagrantDockerCertificatesManager
|
|
|
88
86
|
v.is_a?(Hash) ? v : {}
|
|
89
87
|
end
|
|
90
88
|
|
|
89
|
+
def exists?(key)
|
|
90
|
+
::I18n.exists?(ns_key(key), ::I18n.locale)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def our_key?(k)
|
|
94
|
+
OUR_SPACES.any? { |ns| k.start_with?("#{NAMESPACE}.#{ns}") || k.start_with?(ns) }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def debug_enabled?
|
|
98
|
+
ENV["VDCM_DEBUG"].to_s == "1"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# ── display ───────────────────────────────────────────────────────────────
|
|
102
|
+
|
|
91
103
|
def level_to_emoji(level)
|
|
92
104
|
case level
|
|
93
105
|
when :success then :success
|
|
@@ -114,10 +126,12 @@ module VagrantDockerCertificatesManager
|
|
|
114
126
|
end
|
|
115
127
|
|
|
116
128
|
def debug(env_or_ui, msg)
|
|
117
|
-
return unless
|
|
118
|
-
say(env_or_ui, :info, nil, raw: "#{e(:
|
|
129
|
+
return unless debug_enabled?
|
|
130
|
+
say(env_or_ui, :info, nil, raw: "#{e(:bug)} #{msg}")
|
|
119
131
|
end
|
|
120
132
|
|
|
133
|
+
# ── help ──────────────────────────────────────────────────────────────────
|
|
134
|
+
|
|
121
135
|
def print_general_help(no_emoji: false, ui: nil)
|
|
122
136
|
setup_i18n!
|
|
123
137
|
lines = []
|
|
@@ -142,7 +156,7 @@ module VagrantDockerCertificatesManager
|
|
|
142
156
|
usage = t("#{base}.usage", default: nil)
|
|
143
157
|
desc = t("#{base}.description", default: nil)
|
|
144
158
|
opts = t_hash("#{base}.options")
|
|
145
|
-
exs = ::I18n.t("#{base}.examples", default: [])
|
|
159
|
+
exs = ::I18n.t(ns_key("#{base}.examples"), default: [])
|
|
146
160
|
|
|
147
161
|
if title.nil? && usage.nil? && desc.nil? && opts.empty? && exs.empty?
|
|
148
162
|
return print_general_help(no_emoji: no_emoji, ui: ui)
|
|
@@ -171,9 +185,5 @@ module VagrantDockerCertificatesManager
|
|
|
171
185
|
lines.each { |ln| puts ln }
|
|
172
186
|
end
|
|
173
187
|
end
|
|
174
|
-
|
|
175
|
-
def our_key?(k)
|
|
176
|
-
OUR_SPACES.any? { |ns| k.start_with?("#{NAMESPACE}.#{ns}") || k.start_with?(ns) }
|
|
177
|
-
end
|
|
178
188
|
end
|
|
179
189
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "open3"
|
|
4
|
+
require "base64"
|
|
4
5
|
require_relative "cert"
|
|
5
6
|
|
|
6
7
|
module VagrantDockerCertificatesManager
|
|
@@ -9,50 +10,57 @@ module VagrantDockerCertificatesManager
|
|
|
9
10
|
|
|
10
11
|
def detect
|
|
11
12
|
if defined?(Vagrant) && Vagrant.const_defined?(:Util) && Vagrant::Util.const_defined?(:Platform)
|
|
12
|
-
return :mac
|
|
13
|
+
return :mac if Vagrant::Util::Platform.darwin?
|
|
13
14
|
return :windows if Vagrant::Util::Platform.windows?
|
|
14
|
-
return :linux
|
|
15
|
+
return :linux if Vagrant::Util::Platform.linux?
|
|
15
16
|
else
|
|
16
17
|
plat = RbConfig::CONFIG["host_os"].downcase
|
|
17
|
-
return :mac
|
|
18
|
+
return :mac if plat.include?("darwin")
|
|
18
19
|
return :windows if plat =~ /mswin|mingw|windows/
|
|
19
|
-
return :linux
|
|
20
|
+
return :linux if plat.include?("linux")
|
|
20
21
|
end
|
|
21
22
|
:unknown
|
|
22
23
|
end
|
|
23
24
|
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
# Runs an external command safely using the array form (no shell interpolation).
|
|
26
|
+
def run(*args)
|
|
27
|
+
out, err, st = Open3.capture3(*args)
|
|
26
28
|
[st.success?, out, err]
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
# ── macOS ─────────────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
def mac_add_trusted_cert(path, _name)
|
|
34
|
+
run("sudo", "security", "add-trusted-cert",
|
|
35
|
+
"-d", "-r", "trustRoot",
|
|
36
|
+
"-k", "/Library/Keychains/System.keychain",
|
|
37
|
+
path.to_s).first
|
|
32
38
|
end
|
|
33
39
|
|
|
34
40
|
def mac_has_cert_fingerprint?(fp)
|
|
35
|
-
ok, out,
|
|
36
|
-
|
|
37
|
-
out.include?(fp)
|
|
41
|
+
ok, out, = run("security", "find-certificate", "-a", "-Z",
|
|
42
|
+
"/Library/Keychains/System.keychain")
|
|
43
|
+
ok && out.include?(fp.to_s)
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
def mac_remove_by_fp(fp)
|
|
41
|
-
ok, out,
|
|
47
|
+
ok, out, = run("security", "find-certificate", "-a", "-Z",
|
|
48
|
+
"/Library/Keychains/System.keychain")
|
|
42
49
|
return true unless ok
|
|
43
|
-
hash = out.lines.find { |l| l =~ /SHA-1 hash:\s*#{fp}/i } ? fp : nil
|
|
50
|
+
hash = out.lines.find { |l| l =~ /SHA-1 hash:\s*#{Regexp.escape(fp)}/i } ? fp : nil
|
|
44
51
|
return true unless hash
|
|
45
|
-
run(
|
|
52
|
+
run("sudo", "security", "delete-certificate",
|
|
53
|
+
"-Z", hash.to_s, "/Library/Keychains/System.keychain").first
|
|
46
54
|
end
|
|
47
55
|
|
|
56
|
+
# ── Linux ─────────────────────────────────────────────────────────────────
|
|
57
|
+
|
|
48
58
|
def linux_install_cert(path, name, nss: true, firefox: false)
|
|
49
59
|
dest = "/usr/local/share/ca-certificates/#{Cert::MARKER.downcase}-#{name}.crt"
|
|
50
|
-
ok1, = run(
|
|
51
|
-
ok2, = run("sudo update-ca-certificates")
|
|
52
|
-
okn = true
|
|
53
|
-
|
|
54
|
-
okf = true
|
|
55
|
-
okf &&= linux_firefox_install(path, name) if firefox
|
|
60
|
+
ok1, = run("sudo", "cp", path.to_s, dest)
|
|
61
|
+
ok2, = run("sudo", "update-ca-certificates")
|
|
62
|
+
okn = nss ? linux_nss_install(path, name) : true
|
|
63
|
+
okf = firefox ? linux_firefox_install(path, name) : true
|
|
56
64
|
ok1 && ok2 && okn && okf
|
|
57
65
|
end
|
|
58
66
|
|
|
@@ -62,71 +70,149 @@ module VagrantDockerCertificatesManager
|
|
|
62
70
|
|
|
63
71
|
def linux_uninstall_cert(name, nss: true, firefox: false)
|
|
64
72
|
dest = "/usr/local/share/ca-certificates/#{Cert::MARKER.downcase}-#{name}.crt"
|
|
65
|
-
run(
|
|
66
|
-
run("sudo update-ca-certificates")
|
|
67
|
-
linux_nss_uninstall(name)
|
|
73
|
+
run("sudo", "rm", "-f", dest)
|
|
74
|
+
run("sudo", "update-ca-certificates")
|
|
75
|
+
linux_nss_uninstall(name) if nss
|
|
68
76
|
linux_firefox_uninstall(name) if firefox
|
|
69
77
|
true
|
|
70
78
|
end
|
|
71
79
|
|
|
72
80
|
def linux_nss_install(path, name)
|
|
73
|
-
db =
|
|
74
|
-
run(
|
|
81
|
+
db = "sql:#{File.join(Dir.home, '.pki', 'nssdb')}"
|
|
82
|
+
run("certutil", "-d", db, "-A", "-t", "C,,",
|
|
83
|
+
"-n", Cert.nickname_for(name), "-i", path.to_s).first
|
|
75
84
|
end
|
|
76
85
|
|
|
77
86
|
def linux_nss_uninstall(name)
|
|
78
|
-
db =
|
|
79
|
-
run(
|
|
87
|
+
db = "sql:#{File.join(Dir.home, '.pki', 'nssdb')}"
|
|
88
|
+
run("certutil", "-d", db, "-D", "-n", Cert.nickname_for(name))
|
|
80
89
|
true
|
|
81
90
|
end
|
|
82
91
|
|
|
83
92
|
def linux_firefox_profiles
|
|
84
|
-
home =
|
|
93
|
+
home = Dir.home
|
|
85
94
|
[
|
|
86
95
|
"#{home}/.mozilla/firefox",
|
|
87
96
|
"#{home}/.var/app/org.mozilla.firefox/.mozilla/firefox",
|
|
88
97
|
"#{home}/snap/firefox/common/.mozilla/firefox"
|
|
89
|
-
].select { |d| File.directory?(d) }
|
|
98
|
+
].select { |d| File.directory?(d) }
|
|
99
|
+
.flat_map { |base| Dir.glob(File.join(base, "*.default*")) }
|
|
90
100
|
end
|
|
91
101
|
|
|
92
102
|
def linux_firefox_install(path, name)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
linux_firefox_profiles.all? do |profile|
|
|
104
|
+
run("certutil", "-A",
|
|
105
|
+
"-n", Cert.nickname_for(name), "-t", "C,,",
|
|
106
|
+
"-i", path.to_s, "-d", "sql:#{profile}").first
|
|
96
107
|
end
|
|
97
108
|
end
|
|
98
109
|
|
|
99
110
|
def linux_firefox_uninstall(name)
|
|
100
111
|
linux_firefox_profiles.each do |profile|
|
|
101
|
-
run(
|
|
112
|
+
run("certutil", "-D", "-n", Cert.nickname_for(name), "-d", "sql:#{profile}")
|
|
113
|
+
end
|
|
114
|
+
true
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# ── Windows ───────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
# Firefox on Windows does not ship with NSS certutil, so we enable
|
|
120
|
+
# security.enterprise_roots.enabled in each profile's user.js instead.
|
|
121
|
+
# This makes Firefox delegate trust to the Windows system cert store,
|
|
122
|
+
# which already contains the CA installed by win_install_cert.
|
|
123
|
+
|
|
124
|
+
FIREFOX_ENTERPRISE_ROOTS_PREF = 'user_pref("security.enterprise_roots.enabled", true);'
|
|
125
|
+
FIREFOX_ENTERPRISE_ROOTS_KEY = "security.enterprise_roots.enabled"
|
|
126
|
+
|
|
127
|
+
def win_firefox_profiles
|
|
128
|
+
appdata = (ENV["APPDATA"] || File.join(Dir.home, "AppData", "Roaming")).tr("\\", "/")
|
|
129
|
+
base = "#{appdata}/Mozilla/Firefox/Profiles"
|
|
130
|
+
return [] unless File.directory?(base)
|
|
131
|
+
Dir.glob("#{base}/*").select { |d| File.directory?(d) }
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def win_firefox_enable_enterprise_roots
|
|
135
|
+
win_firefox_profiles.each do |profile|
|
|
136
|
+
user_js = File.join(profile, "user.js")
|
|
137
|
+
content = File.exist?(user_js) ? File.read(user_js) : ""
|
|
138
|
+
next if content.include?(FIREFOX_ENTERPRISE_ROOTS_KEY)
|
|
139
|
+
File.open(user_js, "a") { |f| f.puts FIREFOX_ENTERPRISE_ROOTS_PREF }
|
|
140
|
+
end
|
|
141
|
+
true
|
|
142
|
+
rescue StandardError
|
|
143
|
+
false
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def win_firefox_disable_enterprise_roots
|
|
147
|
+
win_firefox_profiles.each do |profile|
|
|
148
|
+
user_js = File.join(profile, "user.js")
|
|
149
|
+
next unless File.exist?(user_js)
|
|
150
|
+
updated = File.read(user_js)
|
|
151
|
+
.lines
|
|
152
|
+
.reject { |l| l.include?(FIREFOX_ENTERPRISE_ROOTS_KEY) }
|
|
153
|
+
.join
|
|
154
|
+
File.write(user_js, updated)
|
|
102
155
|
end
|
|
103
156
|
true
|
|
157
|
+
rescue StandardError
|
|
158
|
+
false
|
|
104
159
|
end
|
|
105
160
|
|
|
106
161
|
def win_install_cert(path, name)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
162
|
+
fp = Cert.sha1(path)
|
|
163
|
+
nick = Cert.nickname_for(name).gsub("'", "''")
|
|
164
|
+
abs = File.expand_path(path).tr("/", "\\").gsub("'", "''")
|
|
165
|
+
|
|
166
|
+
ps = <<~PS
|
|
167
|
+
$ErrorActionPreference = 'Stop'
|
|
168
|
+
Import-Certificate -FilePath '#{abs}' -CertStoreLocation Cert:\\LocalMachine\\Root | Out-Null
|
|
169
|
+
$cert = Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Thumbprint -eq '#{fp}' }
|
|
170
|
+
if ($cert) { $cert.FriendlyName = '#{nick}' }
|
|
171
|
+
PS
|
|
172
|
+
encoded = Base64.strict_encode64(ps.encode("UTF-16LE"))
|
|
173
|
+
|
|
174
|
+
# Try non-elevated first (works if already admin)
|
|
175
|
+
ok, = run("powershell", "-NoProfile", "-NonInteractive", "-EncodedCommand", encoded)
|
|
176
|
+
|
|
177
|
+
unless ok
|
|
178
|
+
# Elevate via UAC
|
|
179
|
+
elev = "Start-Process PowerShell -Verb RunAs -Wait " \
|
|
180
|
+
"-ArgumentList '-NonInteractive','-NoProfile','-EncodedCommand','#{encoded}'"
|
|
181
|
+
elev_encoded = Base64.strict_encode64(elev.encode("UTF-16LE"))
|
|
182
|
+
ok, = run("powershell", "-NoProfile", "-NonInteractive", "-EncodedCommand", elev_encoded)
|
|
183
|
+
return false unless ok
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
win_firefox_enable_enterprise_roots
|
|
115
187
|
true
|
|
116
188
|
end
|
|
117
189
|
|
|
118
190
|
def win_has_cert_fingerprint?(fp)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
ok, out, _ = run(%(powershell -NoProfile -NonInteractive -Command "#{ps}"))
|
|
125
|
-
ok && out.to_s.strip == "YES"
|
|
191
|
+
ps = "if (Get-ChildItem Cert:\\LocalMachine\\Root | " \
|
|
192
|
+
"Where-Object { $_.Thumbprint -eq '#{fp}' }) { 'YES' } else { 'NO' }"
|
|
193
|
+
ok, out, = run("powershell", "-NoProfile", "-NonInteractive",
|
|
194
|
+
"-EncodedCommand", Base64.strict_encode64(ps.encode("UTF-16LE")))
|
|
195
|
+
ok && out.to_s.strip == "YES"
|
|
126
196
|
end
|
|
127
197
|
|
|
128
198
|
def win_remove_by_fp(fp)
|
|
129
|
-
|
|
199
|
+
ps = <<~PS
|
|
200
|
+
$ErrorActionPreference = 'Stop'
|
|
201
|
+
Get-ChildItem Cert:\\LocalMachine\\Root |
|
|
202
|
+
Where-Object { $_.Thumbprint -eq '#{fp}' } |
|
|
203
|
+
Remove-Item
|
|
204
|
+
PS
|
|
205
|
+
encoded = Base64.strict_encode64(ps.encode("UTF-16LE"))
|
|
206
|
+
|
|
207
|
+
ok, = run("powershell", "-NoProfile", "-NonInteractive", "-EncodedCommand", encoded)
|
|
208
|
+
return true if ok
|
|
209
|
+
|
|
210
|
+
elev = "Start-Process PowerShell -Verb RunAs -Wait " \
|
|
211
|
+
"-ArgumentList '-NonInteractive','-NoProfile','-EncodedCommand','#{encoded}'"
|
|
212
|
+
elev_encoded = Base64.strict_encode64(elev.encode("UTF-16LE"))
|
|
213
|
+
ok = run("powershell", "-NoProfile", "-NonInteractive", "-EncodedCommand", elev_encoded).first
|
|
214
|
+
win_firefox_disable_enterprise_roots if ok
|
|
215
|
+
ok
|
|
130
216
|
end
|
|
131
217
|
end
|
|
132
218
|
end
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module VagrantDockerCertificatesManager
|
|
4
|
-
VERSION
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
unless defined?(VERSION)
|
|
5
|
+
VERSION = begin
|
|
6
|
+
path = File.expand_path("VERSION", __dir__)
|
|
7
|
+
File.exist?(path) ? File.read(path).strip : "0.1.0"
|
|
8
|
+
rescue StandardError
|
|
9
|
+
"0.1.0"
|
|
10
|
+
end
|
|
9
11
|
end
|
|
10
12
|
end
|
data/locales/en.yml
CHANGED
|
@@ -80,14 +80,3 @@ en:
|
|
|
80
80
|
success: "Certificate %{name} removed."
|
|
81
81
|
fail: "Failed to remove certificate %{name}."
|
|
82
82
|
skip: "Remove on destroy disabled; skipping."
|
|
83
|
-
|
|
84
|
-
errors:
|
|
85
|
-
invalid_path: "Invalid certificate path: %{path}"
|
|
86
|
-
missing_path_remove: "You must provide a path for removal."
|
|
87
|
-
not_found_for_remove: "No tracked certificate found for path: %{path}"
|
|
88
|
-
already_present: "The certificate %{name} already exists."
|
|
89
|
-
install_failed: "Certificate installation failed."
|
|
90
|
-
uninstall_failed: "Certificate removal failed."
|
|
91
|
-
remove_failed: "Remove failed."
|
|
92
|
-
os_unsupported: "Unsupported OS for this action."
|
|
93
|
-
unknown_command: "Unknown command: %{cmd}"
|
data/locales/fr.yml
CHANGED
|
@@ -80,14 +80,3 @@ fr:
|
|
|
80
80
|
success: "Certificat %{name} supprimé."
|
|
81
81
|
fail: "Échec de la suppression du certificat %{name}."
|
|
82
82
|
skip: "Suppression à la destruction désactivée ; on ignore."
|
|
83
|
-
|
|
84
|
-
errors:
|
|
85
|
-
invalid_path: "Chemin de certificat invalide : %{path}"
|
|
86
|
-
missing_path_remove: "Vous devez fournir un chemin à supprimer."
|
|
87
|
-
not_found_for_remove: "Aucun certificat suivi pour le chemin : %{path}"
|
|
88
|
-
already_present: "Le certificat %{name} existe déjà."
|
|
89
|
-
install_failed: "Échec de l'installation du certificat."
|
|
90
|
-
uninstall_failed: "Échec de la suppression du certificat."
|
|
91
|
-
remove_failed: "Échec de la suppression."
|
|
92
|
-
os_unsupported: "Système non pris en charge pour cette action."
|
|
93
|
-
unknown_command: "Commande inconnue : %{cmd}"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: vagrant-docker-certificates-manager
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Julien Poirou
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-03-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: i18n
|