fastlane-plugin-match_keystore 0.1.10 → 0.1.15

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: 1e26b0b531512693d08eedc46159379bded6984aa802a32f6d6296d94a0116c3
4
- data.tar.gz: ae4ba30e68e58c3c85bfa15a6a57ec0ab93fd98fc90bf23c597124e57235d4c5
3
+ metadata.gz: 87a32db98559102adaf6fd2b1d7da31143fe593fa0ed170865a1da8b3ef5d4d8
4
+ data.tar.gz: 4c3b0130a705055ad7d9e6c51f8ac1a19c2a4a2df96ddca7011d72275487bb89
5
5
  SHA512:
6
- metadata.gz: 8c5983fd39c9d8d92b9981d153e59e21121eb992bb52f04d882b99918e199d1a6edf96588a8a905d3f17b26856a3aa66da7f8f63a587be4d969c29370fbbc3a5
7
- data.tar.gz: 961c71d337aed1417bf10cbe1b682974fb2c262a830ff04efa99f9a063f32c7ad15345b5a8344a170cded7bdd53eb1ae56839a43e3f571b59a273f385feeec18
6
+ metadata.gz: 9522a73a0ca9b71adcc82f8d986c39a68d2c7b64f4273df5736933d1a0db43c4e9f6aa3414cfe538c99c513f2d3eeb06efb93e2624844ca9fac045b62f7a989d
7
+ data.tar.gz: 0f7fe8a732b905f6bf751d42e87c622412e1e446561e2e8b0ee534997d562246afbe5deef77827002f8ca3198cf07a490603aef684815ec06f38d9de836a0f6c
data/README.md CHANGED
@@ -24,13 +24,18 @@ The keystore properties are encrypted with AES in order to secure sensitive data
24
24
 
25
25
  ```ruby
26
26
  lane :release_and_sign do |options|
27
- gradle(task: "clean")
27
+ gradle(task: "clean")
28
28
  gradle(task: 'assemble', build_type: 'Release')
29
29
 
30
30
  signed_apk_path = match_keystore(
31
31
  git_url: "https://github.com/<GITHUB_USERNAME>/keystores.git", # Please use a private Git repository !
32
32
  package_name: "com.your.package.name",
33
33
  apk_path: "/app/build/outputs/apk/app-release.apk" # Or path without APK: /app/build/outputs/apk/
34
+ # Optional:
35
+ match_secret: "A-very-str0ng-password!", # The secret use to encrypt/decrypt Keystore passwords on Git repo (for CI)
36
+ existing_keystore: "assets/existing-keystore.jks", # Optional, if needed to import an existing keystore
37
+ override_keystore: true, # Optional, override an existing Keystore on Git repo
38
+ keystore_data: "assets/keystore.json" # Optional, all data required to create a new Keystore (use to bypass prompt)
34
39
  )
35
40
 
36
41
  # Return the path of signed APK (useful for other lanes such as `publish_to_firebase`, `upload_to_play_store`)
@@ -15,11 +15,21 @@ module Fastlane
15
15
 
16
16
  class MatchKeystoreAction < Action
17
17
 
18
+ def self.openssl_path
19
+ path = "/usr/local/opt/openssl@1.1/bin"
20
+ path
21
+ end
22
+
18
23
  def self.to_md5(value)
19
24
  hash_value = Digest::MD5.hexdigest value
20
25
  hash_value
21
26
  end
22
27
 
28
+ def self.sha512(value)
29
+ hash_value = Digest::SHA512.hexdigest value
30
+ hash_value
31
+ end
32
+
23
33
  def self.load_json(json_path)
24
34
  file = File.read(json_path)
25
35
  data_hash = JSON.parse(file)
@@ -55,7 +65,7 @@ module Fastlane
55
65
 
56
66
  def self.get_build_tools
57
67
  android_home = self.get_android_home()
58
- build_tools_root = android_home + '/build-tools'
68
+ build_tools_root = File.join(android_home, '/build-tools')
59
69
 
60
70
  sub_dirs = Dir.glob(File.join(build_tools_root, '*', ''))
61
71
  build_tools_last_version = ''
@@ -66,39 +76,181 @@ module Fastlane
66
76
  build_tools_last_version
67
77
  end
68
78
 
69
- def self.check_openssl_version
70
- output = `openssl version`
71
- if !output.start_with?("OpenSSL")
72
- raise "Please install OpenSSL 1.1.1 at least https://www.openssl.org/"
79
+ def self.check_ssl_version(forceOpenSSL)
80
+ libressl_min = '2.9'
81
+ openssl_min = '1.1.1'
82
+
83
+ openssl = self.openssl(forceOpenSSL)
84
+ output = `#{openssl} version`
85
+ if !output.start_with?("LibreSSL") && !output.start_with?("OpenSSL")
86
+ raise "Please install OpenSSL '#{openssl_min}' at least OR LibreSSL #{libressl_min}' at least"
87
+ end
88
+ UI.message("SSL/TLS protocol library: '#{output.strip!}'")
89
+
90
+ # Check minimum verion:
91
+ vesion = output.to_str.scan(/[0-9\.]{1,}/).first
92
+ UI.message("SSL/TLS protocol version: '#{vesion}'")
93
+ if self.is_libre_ssl(forceOpenSSL)
94
+ if Gem::Version.new(vesion) < Gem::Version.new(libressl_min)
95
+ raise "Minimum version for LibreSSL is '#{libressl_min}', please update it. Use homebrew is your are Mac user, and update ~/.bah_profile or ~/.zprofile"
96
+ end
97
+ else
98
+ if Gem::Version.new(vesion) > Gem::Version.new(openssl_min)
99
+ raise "Minimum version for OpenSSL is '#{openssl_min}' please update it. Use homebrew is your are Mac user, and update ~/.bah_profile or ~/.zprofile"
100
+ end
101
+ end
102
+
103
+ output.strip
104
+ end
105
+
106
+ def self.openssl(forceOpenSSL)
107
+ if forceOpenSSL
108
+ path = openssl_path
109
+ output = "#{path}/openssl"
110
+ else
111
+ output = "openssl"
112
+ end
113
+ output
114
+ end
115
+
116
+ def self.is_libre_ssl(forceOpenSSL)
117
+ result = false
118
+ openssl = self.openssl(forceOpenSSL)
119
+ output = `#{openssl} version`
120
+ if output.start_with?("LibreSSL")
121
+ result = true
73
122
  end
74
- UI.message("OpenSSL version: " + output.strip)
123
+ result
75
124
  end
76
125
 
77
126
  def self.gen_key(key_path, password)
78
- `rm -f #{key_path}`
79
- `echo "#{password}" | openssl dgst -sha512 | awk '{print $2}' | cut -c1-128 > #{key_path}`
127
+ `rm -f '#{key_path}'`
128
+ shaValue = self.sha512(password)
129
+ `echo "#{shaValue}" > '#{key_path}'`
80
130
  end
81
131
 
82
- def self.encrypt_file(clear_file, encrypt_file, key_path)
83
- `rm -f #{encrypt_file}`
84
- `openssl enc -aes-256-cbc -salt -pbkdf2 -in #{clear_file} -out #{encrypt_file} -pass file:#{key_path}`
132
+ def self.encrypt_file(clear_file, encrypt_file, key_path, forceOpenSSL)
133
+ `rm -f '#{encrypt_file}'`
134
+ libre_ssl = self.is_libre_ssl(forceOpenSSL)
135
+ openssl_bin = self.openssl(forceOpenSSL)
136
+ `#{openssl_bin} enc -aes-256-cbc -salt -pbkdf2 -in '#{clear_file}' -out '#{encrypt_file}' -pass file:'#{key_path}'`
85
137
  end
86
138
 
87
- def self.decrypt_file(encrypt_file, clear_file, key_path)
88
- `rm -f #{clear_file}`
89
- `openssl enc -d -aes-256-cbc -pbkdf2 -in #{encrypt_file} -out #{clear_file} -pass file:#{key_path}`
139
+ def self.decrypt_file(encrypt_file, clear_file, key_path, forceOpenSSL)
140
+ `rm -f '#{clear_file}'`
141
+ libre_ssl = self.is_libre_ssl(forceOpenSSL)
142
+ openssl_bin = self.openssl(forceOpenSSL)
143
+ `#{openssl_bin} enc -d -aes-256-cbc -pbkdf2 -in '#{encrypt_file}' -out '#{clear_file}' -pass file:'#{key_path}'`
144
+ end
145
+
146
+ def self.assert_equals(test_name, excepted, value)
147
+ puts "Unit Test: #{test_name}"
148
+ if value != excepted
149
+ puts " - Excepted: #{excepted}"
150
+ puts " - Returned: #{value}"
151
+ raise "Unit Test - #{test_name} error!"
152
+ else
153
+ puts " - OK"
154
+ end
155
+ end
156
+
157
+ def self.test_security
158
+
159
+ self.check_ssl_version(false)
160
+
161
+ # Clear temp files
162
+ temp_dir = File.join(Dir.pwd, '/temp/')
163
+ FileUtils.rm_rf(temp_dir)
164
+ Dir.mkdir(temp_dir)
165
+
166
+ fakeValue = "4esfsf4dsfds!efs5ZDOJF"
167
+ # Check MD5
168
+ md5value = self.to_md5(fakeValue)
169
+ excepted = "1c815cd208fe08076c9e7b6595d121d1"
170
+ self.assert_equals("MD5", excepted, md5value)
171
+
172
+ # Check SHA-512
173
+ shaValue = self.sha512(fakeValue)
174
+ excepted = "cc6a7b0d89cc61c053f7018a305672bdb82bc07e5015f64bb063d9662be4ec81ec8afa819b009de266482b6bd56b7068def2524c32f5b5d4d9db49ee4578499d"
175
+ self.assert_equals("SHA-512", excepted, shaValue)
176
+
177
+ # Check SHA-512-File
178
+ key_path = File.join(Dir.pwd, '/temp/key.txt')
179
+ self.gen_key(key_path, fakeValue)
180
+ shaValue = self.get_file_content(key_path).strip!
181
+ excepted = "cc6a7b0d89cc61c053f7018a305672bdb82bc07e5015f64bb063d9662be4ec81ec8afa819b009de266482b6bd56b7068def2524c32f5b5d4d9db49ee4578499d"
182
+ self.assert_equals("SHA-512-File", excepted, shaValue)
183
+
184
+
185
+ # Check LibreSSL
186
+ result = self.is_libre_ssl(false)
187
+ self.assert_equals("Is-LibreSSL", true, result)
188
+ result = self.is_libre_ssl(true)
189
+ self.assert_equals("Is-LibreSSL", false, result)
190
+
191
+ # Encrypt OpenSSL
192
+ clear_file = File.join(Dir.pwd, '/temp/clear.txt')
193
+ openssl_encrypt_file = File.join(Dir.pwd, '/temp/openssl_encrypted.txt')
194
+ self.content_to_file(clear_file, fakeValue)
195
+ self.encrypt_file(clear_file, openssl_encrypt_file, key_path, true)
196
+ result = File.file?(openssl_encrypt_file) && File.size(openssl_encrypt_file) > 10
197
+ self.assert_equals("Encrypt-OpenSSL", true, result)
198
+
199
+ # Encrypt LibreSSL
200
+ encrypt_file_libre = File.join(Dir.pwd, '/temp/libressl_encrypted.txt')
201
+ self.content_to_file(clear_file, fakeValue)
202
+ self.encrypt_file(clear_file, encrypt_file_libre, key_path, false)
203
+ result = File.file?(encrypt_file_libre) && File.size(encrypt_file_libre) > 10
204
+ self.assert_equals("Encrypt-LibreSSL", true, result)
205
+
206
+ # exit!
207
+
208
+ # Decrypt OpenSSL (from OpenSSL)
209
+ openssl_clear_file = File.join(Dir.pwd, '/temp/openssl_clear.txt')
210
+ self.decrypt_file(openssl_encrypt_file, openssl_clear_file, key_path, true)
211
+ decrypted = self.get_file_content(openssl_clear_file).strip!
212
+ self.assert_equals("Decrypt-OpenSSL", fakeValue, decrypted)
213
+
214
+ # Decrypt LibreSSL (from LibreSSL)
215
+ libressl_clear_file = File.join(Dir.pwd, '/temp/libressl_clear.txt')
216
+ self.decrypt_file(encrypt_file_libre, libressl_clear_file, key_path, false)
217
+ decrypted = self.get_file_content(libressl_clear_file).strip!
218
+ self.assert_equals("Decrypt-LibreSSL", fakeValue, decrypted)
219
+
220
+ # Decrypt LibreSSL (from OpenSSL)
221
+ libressl_clear_file = File.join(Dir.pwd, '/temp/libressl_from_openssl_clear.txt')
222
+ self.decrypt_file(openssl_encrypt_file, libressl_clear_file, key_path, false)
223
+ decrypted = self.get_file_content(libressl_clear_file).strip!
224
+ self.assert_equals("Decrypt-LibreSSL-from-OpenSSL", fakeValue, decrypted)
225
+
226
+ # Decrypt OpenSSL (from LibreSSL)
227
+ openssl_clear_file = File.join(Dir.pwd, '/temp/openssl_from_libressl_clear.txt')
228
+ self.decrypt_file(encrypt_file_libre, openssl_clear_file, key_path, true)
229
+ decrypted = self.get_file_content(openssl_clear_file).strip!
230
+ self.assert_equals("Decrypt-OpenSSL-from-LibreSSL", fakeValue, decrypted)
231
+
90
232
  end
91
233
 
92
234
  def self.sign_apk(apk_path, keystore_path, key_password, alias_name, alias_password, zip_align)
93
235
 
94
236
  build_tools_path = self.get_build_tools()
237
+ UI.message("Build-tools path: #{build_tools_path}")
95
238
 
96
239
  # https://developer.android.com/studio/command-line/zipalign
97
240
  if zip_align == true
98
241
  apk_path_aligned = apk_path.gsub(".apk", "-aligned.apk")
99
- `rm -f #{apk_path_aligned}`
100
- `#{build_tools_path}zipalign 4 #{apk_path} #{apk_path_aligned}`
242
+ `rm -f '#{apk_path_aligned}'`
243
+ UI.message("Aligning APK (zipalign): #{apk_path}")
244
+ output = `#{build_tools_path}zipalign -v 4 '#{apk_path}' '#{apk_path_aligned}'`
245
+ puts ""
246
+ puts output
247
+
248
+ if !File.file?(apk_path_aligned)
249
+ raise "Aligned APK not exists!"
250
+ end
251
+
101
252
  else
253
+ UI.message("No zip align!")
102
254
  apk_path_aligned = apk_path
103
255
  end
104
256
  apk_path_signed = apk_path.gsub(".apk", "-signed.apk")
@@ -106,13 +258,37 @@ module Fastlane
106
258
  apk_path_signed = apk_path_signed.gsub("--", "-")
107
259
 
108
260
  # https://developer.android.com/studio/command-line/apksigner
109
- `rm -f #{apk_path_signed}`
110
- `#{build_tools_path}apksigner sign --ks #{keystore_path} --ks-key-alias '#{alias_name}' --ks-pass pass:'#{key_password}' --key-pass pass:'#{alias_password}' --v1-signing-enabled true --v2-signing-enabled true --out #{apk_path_signed} #{apk_path_aligned}`
111
-
112
- `#{build_tools_path}apksigner verify #{apk_path_signed}`
113
- `rm -f #{apk_path_aligned}`
261
+ `rm -f '#{apk_path_signed}'`
262
+ UI.message("Signing APK: #{apk_path_aligned}")
263
+ output = `#{build_tools_path}apksigner sign --ks '#{keystore_path}' --ks-key-alias '#{alias_name}' --ks-pass pass:'#{key_password}' --key-pass pass:'#{alias_password}' --v1-signing-enabled true --v2-signing-enabled true --v4-signing-enabled false --out '#{apk_path_signed}' '#{apk_path_aligned}'`
264
+ puts ""
265
+ puts output
266
+
267
+ UI.message("Verifing APK signature: #{apk_path_signed}")
268
+ output = `#{build_tools_path}apksigner verify '#{apk_path_signed}'`
269
+ puts ""
270
+ puts output
271
+ `rm -f '#{apk_path_aligned}'`
114
272
 
115
273
  apk_path_signed
274
+ end
275
+
276
+ def self.resolve_dir(path)
277
+ if !File.directory?(path)
278
+ path = File.join(Dir.pwd, path)
279
+ end
280
+ path
281
+ end
282
+
283
+ def self.resolve_file(path)
284
+ if !File.file?(path)
285
+ path = File.join(Dir.pwd, path)
286
+ end
287
+ path
288
+ end
289
+
290
+ def self.content_to_file(file_path, content)
291
+ `echo #{content} > #{file_path}`
116
292
  end
117
293
 
118
294
  def self.get_file_content(file_path)
@@ -129,9 +305,7 @@ module Fastlane
129
305
 
130
306
  if !apk_path.to_s.end_with?(".apk")
131
307
 
132
- if !File.directory?(apk_path)
133
- apk_path = File.join(Dir.pwd, apk_path)
134
- end
308
+ apk_path = self.resolve_dir(apk_path)
135
309
 
136
310
  pattern = File.join(apk_path, '*.apk')
137
311
  files = Dir[pattern]
@@ -144,11 +318,7 @@ module Fastlane
144
318
  end
145
319
 
146
320
  else
147
-
148
- if !File.file?(apk_path)
149
- apk_path = File.join(Dir.pwd, apk_path)
150
- end
151
-
321
+ apk_path = self.resolve_file(apk_path)
152
322
  end
153
323
 
154
324
  apk_path
@@ -174,6 +344,14 @@ module Fastlane
174
344
  match_secret = params[:match_secret]
175
345
  override_keystore = params[:override_keystore]
176
346
  keystore_data = params[:keystore_data]
347
+ clear_keystore = params[:clear_keystore]
348
+ unit_test = params[:unit_test]
349
+
350
+ # Test OpenSSL/LibreSSL
351
+ if unit_test
352
+ result_test = self.test_security
353
+ exit!
354
+ end
177
355
 
178
356
  # Init constants:
179
357
  keystore_name = 'keystore.jks'
@@ -189,7 +367,7 @@ module Fastlane
189
367
  end
190
368
 
191
369
  # Check OpenSSL:
192
- self.check_openssl_version
370
+ self.check_ssl_version(false)
193
371
 
194
372
  # Init workign local directory:
195
373
  dir_name = ENV['HOME'] + '/.match_keystore'
@@ -219,37 +397,44 @@ module Fastlane
219
397
  raise "The security key '#{key_name}' is malformed, or not initialized!"
220
398
  end
221
399
 
222
- # Create repo directory to sync remote Keystores repository:
400
+ # Clear repo Keystore (local) - mostly for testing:
223
401
  repo_dir = File.join(dir_name, self.to_md5(git_url))
224
- # UI.message(repo_dir)
402
+ if clear_keystore && File.directory?(repo_dir)
403
+ FileUtils.rm_rf(repo_dir)
404
+ UI.message("Local repo keystore (#{repo_dir}) directory deleted!")
405
+ end
406
+
407
+ # Create repo directory to sync remote Keystores repository:
225
408
  unless File.directory?(repo_dir)
226
409
  UI.message("Creating 'repo' directory...")
227
410
  FileUtils.mkdir_p(repo_dir)
228
411
  end
229
412
 
230
- # Cloning GIT remote repository:
231
- gitDir = repo_dir + '/.git'
232
- unless File.directory?(gitDir)
413
+ # Check if package name defined:
414
+ if package_name.to_s.strip.empty?
415
+ raise "Package name is not defined!"
416
+ end
417
+
418
+ # Define paths:
419
+ keystoreAppDir = File.join(repo_dir, package_name)
420
+ keystore_path = File.join(keystoreAppDir, keystore_name)
421
+ properties_path = File.join(keystoreAppDir, properties_name)
422
+ properties_encrypt_path = File.join(keystoreAppDir, properties_encrypt_name)
423
+
424
+ # Cloning/pulling GIT remote repository:
425
+ gitDir = File.join(repo_dir, '/.git')
426
+ if !File.directory?(gitDir)
233
427
  UI.message("Cloning remote Keystores repository...")
234
428
  puts ''
235
429
  `git clone #{git_url} #{repo_dir}`
236
430
  puts ''
431
+ else
432
+ UI.message("Pulling remote Keystores repository...")
433
+ puts ''
434
+ `cd #{repo_dir} && git pull`
435
+ puts ''
237
436
  end
238
437
 
239
- # Create sub-directory for Android app:
240
- if package_name.to_s.strip.empty?
241
- raise "Package name is not defined!"
242
- end
243
- keystoreAppDir = repo_dir + '/' + package_name
244
- unless File.directory?(keystoreAppDir)
245
- UI.message("Creating '#{package_name}' keystore directory...")
246
- FileUtils.mkdir_p(keystoreAppDir)
247
- end
248
-
249
- keystore_path = keystoreAppDir + '/' + keystore_name
250
- properties_path = keystoreAppDir + '/' + properties_name
251
- properties_encrypt_path = keystoreAppDir + '/' + properties_encrypt_name
252
-
253
438
  # Load parameters from JSON for CI or Unit Tests:
254
439
  if keystore_data != nil && File.file?(keystore_data)
255
440
  data_json = self.load_json(keystore_data)
@@ -266,6 +451,7 @@ module Fastlane
266
451
 
267
452
  # Create keystore with command
268
453
  override_keystore = !existing_keystore.to_s.strip.empty? && File.file?(existing_keystore)
454
+ UI.message("Existing Keystore: #{existing_keystore}")
269
455
  if !File.file?(keystore_path) || override_keystore
270
456
 
271
457
  if File.file?(keystore_path)
@@ -286,7 +472,7 @@ module Fastlane
286
472
  end
287
473
 
288
474
  # https://developer.android.com/studio/publish/app-signing
289
- if !File.file?(existing_keystore)
475
+ if existing_keystore.to_s.strip.empty? || !File.file?(existing_keystore)
290
476
  UI.message("Generating Android Keystore...")
291
477
 
292
478
  full_name = self.prompt2(text: "Certificate First and Last Name: ", value: data_full_name)
@@ -298,11 +484,11 @@ module Fastlane
298
484
 
299
485
  keytool_parts = [
300
486
  "keytool -genkey -v",
301
- "-keystore #{keystore_path}",
302
- "-alias #{alias_name}",
487
+ "-keystore '#{keystore_path}'",
488
+ "-alias '#{alias_name}'",
303
489
  "-keyalg RSA -keysize 2048 -validity 10000",
304
- "-storepass #{alias_password} ",
305
- "-keypass #{key_password}",
490
+ "-storepass '#{alias_password}'",
491
+ "-keypass '#{key_password}'",
306
492
  "-dname \"CN=#{full_name}, OU=#{org_unit}, O=#{org}, L=#{city_locality}, S=#{state_province}, C=#{country}\"",
307
493
  ]
308
494
  sh keytool_parts.join(" ")
@@ -317,6 +503,7 @@ module Fastlane
317
503
  FileUtils.remove_dir(properties_path)
318
504
  end
319
505
 
506
+ # Build URL:
320
507
  store_file = git_url + '/' + package_name + '/' + keystore_name
321
508
 
322
509
  out_file = File.new(properties_path, "w")
@@ -326,24 +513,24 @@ module Fastlane
326
513
  out_file.puts("aliasPassword=#{alias_password}")
327
514
  out_file.close
328
515
 
329
- self.encrypt_file(properties_path, properties_encrypt_path, key_path)
516
+ self.encrypt_file(properties_path, properties_encrypt_path, key_path, false)
330
517
  File.delete(properties_path)
331
518
 
332
519
  # Print Keystore data in repo:
333
- keystore_info_path = keystoreAppDir + '/' + keystore_info_name
334
- `yes "" | keytool -list -v -keystore #{keystore_path} -storepass #{key_password} > #{keystore_info_path}`
520
+ keystore_info_path = File.join(keystoreAppDir, keystore_info_name)
521
+ `yes "" | keytool -list -v -keystore '#{keystore_path}' -storepass '#{key_password}' > '#{keystore_info_path}'`
335
522
 
336
523
  UI.message("Upload new Keystore to remote repository...")
337
524
  puts ''
338
- `cd #{repo_dir} && git add .`
339
- `cd #{repo_dir} && git commit -m "[ADD] Keystore for app '#{package_name}'."`
340
- `cd #{repo_dir} && git push`
525
+ `cd '#{repo_dir}' && git add .`
526
+ `cd '#{repo_dir}' && git commit -m "[ADD] Keystore for app '#{package_name}'."`
527
+ `cd '#{repo_dir}' && git push`
341
528
  puts ''
342
529
 
343
530
  else
344
531
  UI.message "Keystore file already exists, continue..."
345
532
 
346
- self.decrypt_file(properties_encrypt_path, properties_path, key_path)
533
+ self.decrypt_file(properties_encrypt_path, properties_path, key_path, false)
347
534
 
348
535
  properties = self.load_properties(properties_path)
349
536
  key_password = properties['keyPassword']
@@ -448,7 +635,17 @@ module Fastlane
448
635
  env_name: "MATCH_KEYSTORE_JSON_PATH",
449
636
  description: "Required data to import an existing keystore, or create a new one",
450
637
  optional: true,
451
- type: String)
638
+ type: String),
639
+ FastlaneCore::ConfigItem.new(key: :clear_keystore,
640
+ env_name: "MATCH_KEYSTORE_CLEAR",
641
+ description: "Clear the local keystore (false by default)",
642
+ optional: true,
643
+ type: Boolean),
644
+ FastlaneCore::ConfigItem.new(key: :unit_test,
645
+ env_name: "MATCH_KEYSTORE_UNIT_TESTS",
646
+ description: "launch Unit Tests (false by default)",
647
+ optional: true,
648
+ type: Boolean)
452
649
  ]
453
650
  end
454
651
 
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module MatchKeystore
3
- VERSION = "0.1.10"
3
+ VERSION = "0.1.15"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-match_keystore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher NEY
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-14 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -167,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  - !ruby/object:Gem::Version
168
168
  version: '0'
169
169
  requirements: []
170
- rubygems_version: 3.0.6
170
+ rubygems_version: 3.0.3
171
171
  signing_key:
172
172
  specification_version: 4
173
173
  summary: Easily sync your Android keystores across your team