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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 023a4ac2fc48aacbf0de2d60bfa2b91a8890318b623c2169538ea748db884367
4
- data.tar.gz: 8b709c9e9c8a637e80df487b3ca0381e9ff1cd0c2334941024819a842050e4b6
3
+ metadata.gz: 1f64aa238bae8dbe7da5f4b4554bc04baa2d70c955384ff64811e03ef684c791
4
+ data.tar.gz: ac5625a4e633a4e487ff814307920171db797da2a87a7f384da04f616d91c7e8
5
5
  SHA512:
6
- metadata.gz: 2cdba816ec1797ad404199e153bdb3e25b9b105bc62ea872d1068efbdaf0649e9e80ea8b1044c46f966b19e19cda29c85fb09c80af5632cf1acbe794e3152fc0
7
- data.tar.gz: 8697e75304b157574141dc5b7ebeef2d81ffcc4c6bb27d23277f45f25418a40bb8c1e3de045f8b7bb418adfff601d3eb7058b2af15df97d4ecf16e92f324274e
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.2.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.docker_certs
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)
@@ -19,7 +19,6 @@ module VagrantDockerCertificatesManager
19
19
  end
20
20
 
21
21
  def finalize!
22
- @cert_path = @container_name unless @container_name.to_s.strip.empty?
23
22
  @install_on_up = !!@install_on_up
24
23
  @remove_on_destroy = !!@remove_on_destroy
25
24
  @manage_firefox = !!@manage_firefox
@@ -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
- setup_i18n!
43
-
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
-
48
- unless SUPPORTED.include?(sym)
49
- if strict
50
- raise UnsupportedLocaleError,
51
- "#{e(:error)} Unsupported language: #{sym}. Available: #{SUPPORTED.join(', ')}"
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
- ::I18n.locale = sym
58
- ::I18n.backend.load_translations
59
- sym
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 ENV["VDCM_DEBUG"].to_s == "1"
118
- say(env_or_ui, :info, nil, raw: "#{e(:question)} #{msg}")
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 if Vagrant::Util::Platform.darwin?
13
+ return :mac if Vagrant::Util::Platform.darwin?
13
14
  return :windows if Vagrant::Util::Platform.windows?
14
- return :linux if Vagrant::Util::Platform.linux?
15
+ return :linux if Vagrant::Util::Platform.linux?
15
16
  else
16
17
  plat = RbConfig::CONFIG["host_os"].downcase
17
- return :mac if plat.include?("darwin")
18
+ return :mac if plat.include?("darwin")
18
19
  return :windows if plat =~ /mswin|mingw|windows/
19
- return :linux if plat.include?("linux")
20
+ return :linux if plat.include?("linux")
20
21
  end
21
22
  :unknown
22
23
  end
23
24
 
24
- def run(cmd)
25
- out, err, st = Open3.capture3(cmd)
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
- def mac_add_trusted_cert(path, name)
30
- ok, *_ = run(%(sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "#{path}"))
31
- ok
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, _ = run(%(security find-certificate -a -Z /Library/Keychains/System.keychain 2>/dev/null))
36
- return false unless ok
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, _ = run(%(security find-certificate -a -Z /Library/Keychains/System.keychain 2>/dev/null))
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(%(sudo security delete-certificate -Z #{hash} /Library/Keychains/System.keychain)).first
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(%(sudo cp "#{path}" "#{dest}"))
51
- ok2, = run("sudo update-ca-certificates")
52
- okn = true
53
- okn &&= linux_nss_install(path, name) if nss
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(%(sudo rm -f "#{dest}"))
66
- run("sudo update-ca-certificates")
67
- linux_nss_uninstall(name) if nss
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 = %(sql:"$HOME/.pki/nssdb")
74
- run(%(certutil -d #{db} -A -t "C,," -n "#{Cert.nickname_for(name)}" -i "#{path}")).first
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 = %(sql:"$HOME/.pki/nssdb")
79
- run(%(certutil -d #{db} -D -n "#{Cert.nickname_for(name)}"))
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 = ENV["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) }.flat_map { |base| Dir.glob(File.join(base, "*.default*")) }
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
- profiles = linux_firefox_profiles
94
- profiles.all? do |profile|
95
- run(%(certutil -A -n "#{Cert.nickname_for(name)}" -t "C,," -i "#{path}" -d "sql:#{profile}")).first
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(%(certutil -D -n "#{Cert.nickname_for(name)}" -d "sql:#{profile}"))
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
- ok, out, err = run(%(certutil -addstore -f "ROOT" "#{path}"))
108
- return false unless ok
109
- fp = Cert.sha1(path)
110
- ps = %(
111
- $cert = Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Thumbprint -eq "#{fp}" };
112
- if ($cert) { $cert.FriendlyName = "#{Cert.nickname_for(name)}"; }
113
- ).strip
114
- run(%(powershell -NoProfile -NonInteractive -Command "#{ps}"))
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
- ps = %q{
120
- $c = Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Thumbprint -eq "__FP__" };
121
- if ($c) { "YES" } else { "NO" }
122
- }.strip.gsub("__FP__", fp.to_s)
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
- run(%(certutil -delstore "ROOT" #{fp})).first
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
@@ -19,7 +19,7 @@ module VagrantDockerCertificatesManager
19
19
  ensure_dir!
20
20
  return {} unless File.exist?(db_path)
21
21
  JSON.parse(File.read(db_path))
22
- rescue
22
+ rescue StandardError
23
23
  {}
24
24
  end
25
25
 
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module VagrantDockerCertificatesManager
4
- VERSION = begin
5
- path = File.expand_path("VERSION", __dir__)
6
- File.exist?(path) ? File.read(path).strip : "0.1.0"
7
- rescue
8
- "0.1.0"
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.2.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: 2025-08-20 00:00:00.000000000 Z
11
+ date: 2026-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n