encrypt_env 1.2.1 → 1.3.1

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/bin/encrypt_env +20 -0
  3. data/lib/encrypt_env.rb +100 -11
  4. metadata +23 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d696c60bf3a51762a466ccae6de5a7fea2a18b9e5c9ee744708e9541e097f2c
4
- data.tar.gz: 36d4248ccbcf1c5121c28248dd045f40f3806c23be0519a3f01624148bb7c172
3
+ metadata.gz: 240ef0cad26ca9e4a003b59ed55a25ec1e40b749dfa489dde2dfbaf0079d6fc0
4
+ data.tar.gz: 3f2d327a4009e6ec03d99dd96a9149de9cf578d490b43c0897f2746fb7e7584f
5
5
  SHA512:
6
- metadata.gz: ebb16a54fda48f54342a9d2987dcdf95d37b2c32b20ee304428e4d435d794d1b6e5a303233e2c26104c3534756d37c1f1dc554025becb72ef55e3a6b9f62fa69
7
- data.tar.gz: 3add45fbf64eef00a7f0d131229bb9dab796f99bf43d0529d9f34b8dbd635a5e198d32afaed210cfd3c356dcfa7184215bfda83fca47b145d6cf6d1371fad1a9
6
+ metadata.gz: d47f5c3671c2e6a5ebba7626e20ac5de43c3f86ab08101253ab1f41f6094b5610a3e7dce373f86571eec8a7792fa62905ce285590b2cba310fae9cb89d6f8db7
7
+ data.tar.gz: f2dd54d20b33f8116fbd9c4e2f58ed00d92f30a85bb45db3525dacfd2b226dd01ff91635ddac3e32a8ddc7a2eb33c424301c99240beacc609afe17cf2a0f4b97
data/bin/encrypt_env CHANGED
@@ -27,6 +27,26 @@ elsif action == 'edit'
27
27
  EncryptEnv.edit
28
28
  end
29
29
  exit 0
30
+ elsif action == 'get'
31
+ key = argv[0]
32
+ env = argv[1]
33
+ EncryptEnv.valueof(key, env)
34
+ exit 0
35
+ elsif action == 'new'
36
+ key = argv[0]
37
+ env = argv[1]
38
+ EncryptEnv.update_variable(key, env, true)
39
+ exit 0
40
+ elsif action == 'update'
41
+ key = argv[0]
42
+ env = argv[1]
43
+ EncryptEnv.update_variable(key, env, false)
44
+ exit 0
45
+ elsif action == 'delete'
46
+ key = argv[0]
47
+ env = argv[1]
48
+ EncryptEnv.delete_variable(key, env)
49
+ exit 0
30
50
  elsif ['help', '--help', '-h'].include?(action)
31
51
  puts <<~HELP
32
52
  Usage:
data/lib/encrypt_env.rb CHANGED
@@ -32,8 +32,7 @@ class EncryptEnv
32
32
  elsif Dir["#{Dir.pwd}/config/secrets_*.yml.enc"].length.positive?
33
33
  @opt = 2
34
34
  else
35
- puts 'You must setup first to encrypt file!'
36
- exit
35
+ raise 'You must setup first to encrypt file!'
37
36
  end
38
37
  end
39
38
 
@@ -48,15 +47,19 @@ class EncryptEnv
48
47
  private_class_method def self.check_key_existence(env = nil)
49
48
  file_name = env.nil? ? 'master.key' : "master_#{env}.key"
50
49
  return if File.file?("#{Dir.pwd}/config/#{file_name}")
51
- # return if Dir["#{Dir.pwd}/config/master_*.key"].length.positive? && @opt == 2
52
50
  return if ENV.key?('MASTER_KEY')
53
51
 
54
- puts 'Please provide master key!'
55
- exit
52
+ message = env ? "Missing key of #{env} environment!" : 'Missing master key!'
53
+ raise message
56
54
  end
57
55
 
58
56
  private_class_method def self.load_master_key(env = nil)
59
- check_key_existence(env)
57
+ begin
58
+ check_key_existence(env)
59
+ rescue StandardError => e
60
+ raise e.message
61
+ end
62
+
60
63
  file_path = env ? "#{Dir.pwd}/config/master_#{env}.key" : "#{Dir.pwd}/config/master.key"
61
64
  key = File.file?(file_path) ? File.read(file_path).strip : ENV['MASTER_KEY']
62
65
  @master_key = [key].pack('H*')
@@ -82,7 +85,7 @@ class EncryptEnv
82
85
  end
83
86
 
84
87
  private_class_method def self.to_hash_type(raw_data)
85
- HashWithIndifferentAccess.new(YAML.load(raw_data, aliases: true))
88
+ HashWithIndifferentAccess.new(::YAML.load(raw_data, aliases: true))
86
89
  end
87
90
 
88
91
  private_class_method def self.load_encrypted_data(env = nil)
@@ -110,7 +113,11 @@ class EncryptEnv
110
113
  end
111
114
 
112
115
  private_class_method def self.decrypt(env = nil)
113
- load_master_key(env)
116
+ begin
117
+ load_master_key(env)
118
+ rescue StandardError => e
119
+ raise e.message
120
+ end
114
121
 
115
122
  decipher = OpenSSL::Cipher.new('aes-128-gcm')
116
123
  decipher.decrypt
@@ -125,8 +132,8 @@ class EncryptEnv
125
132
  @decrypted = to_hash_type(@raw_decrypted)
126
133
  # Catch error if master key is wrong
127
134
  rescue OpenSSL::Cipher::CipherError
128
- puts 'Master key is wrong!'
129
- exit
135
+ message = env ? "Master key of #{env} environment is wrong!" : 'Master key is wrong!'
136
+ raise message
130
137
  end
131
138
 
132
139
  private_class_method def self.all_decrypted_object
@@ -159,6 +166,10 @@ class EncryptEnv
159
166
  decrypt(env || current_env)
160
167
  @decrypted
161
168
  end
169
+ rescue StandardError => e
170
+ puts e.message
171
+ @have_error = true
172
+ {}
162
173
  end
163
174
 
164
175
  def self.setup
@@ -197,10 +208,88 @@ class EncryptEnv
197
208
  encrypt(File.read(f.path), env)
198
209
  @decrypted = nil
199
210
  end
211
+ rescue StandardError => e
212
+ puts e.message
200
213
  end
201
214
 
202
215
  def self.show(env = nil)
203
- jj secrets(env)
216
+ # require "awesome_print"
217
+ value = secrets(env)
218
+ # ap({})
219
+ # ap(value) unless @have_error
220
+ jj value unless @have_error
221
+ @have_error = false
222
+ end
223
+
224
+ def self.valueof(key, env = nil)
225
+ value = secrets(env)
226
+ unless value.key?(key)
227
+ puts "key '#{key}' does not exist!"
228
+ return
229
+ end
230
+ puts value[key]
231
+ end
232
+
233
+ def self.delete_variable(key, env = nil)
234
+ load_curr_opt unless @opt
235
+ if @opt == 1
236
+ puts 'Only for option 2!'
237
+ return
238
+ end
239
+
240
+ tail_confirm = env ? " in '#{env}' environent" : nil
241
+ confirm = "Really? You want to delete '#{key}'#{tail_confirm}? (y/n)"
242
+ puts confirm
243
+ a = $stdin.gets.chomp
244
+ return unless a == 'y'
245
+
246
+ value = secrets(env)
247
+
248
+ unless value.key?(key)
249
+ puts "#{key} does not exist!"
250
+ return
251
+ end
252
+
253
+ value.delete(key)
254
+ encrypt(value.to_hash.to_yaml, env || current_env)
255
+ puts "delete '#{key}' successfully!"
256
+ end
257
+
258
+ def self.update_variable(key, env = nil, add_variable = false)
259
+ load_curr_opt unless @opt
260
+ if @opt == 1
261
+ puts 'Only for option 2!'
262
+ return
263
+ end
264
+
265
+ value = secrets(env)
266
+ if add_variable && value.key?(key)
267
+ puts 'Key existed!'
268
+ return
269
+ end
270
+
271
+ if !value.key?(key) && !add_variable
272
+ tail_msg = env ? " in #{env} environment" : nil
273
+ puts "'#{key}' does not exist#{tail_msg}. You want to add '#{key}' as the new key? (y/n)"
274
+ a = $stdin.gets.chomp
275
+ return unless a == 'y'
276
+
277
+ add_variable = false
278
+ end
279
+
280
+ action = add_variable && 'add' || 'edit'
281
+ file_name = env ? "#{action}_#{key}_#{env}" : "#{action}_#{key}"
282
+
283
+ Tempfile.create(file_name) do |f|
284
+ f.write(value[key])
285
+ f.flush
286
+ f.rewind
287
+ system("vim #{f.path}")
288
+ new_value = File.read(f.path)
289
+ value[key] = new_value.strip
290
+ encrypt(value.to_hash.to_yaml, env || current_env)
291
+ @decrypted = nil
292
+ end
204
293
  end
205
294
  end
206
295
  # rubocop:enable Metrics/ClassLength
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: encrypt_env
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nhu Tan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-10 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2022-08-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.9.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.9'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.9.2
13
33
  description: Encrypts and decrypts environment variables
14
34
  email: nhutan2001@gmail.com
15
35
  executables: