porky_lib 0.9.4 → 0.9.5
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/Gemfile.lock +11 -8
- data/README.md +45 -6
- data/Rakefile +1 -0
- data/lib/porky_lib/file_service.rb +5 -1
- data/lib/porky_lib/file_service_helper.rb +7 -5
- data/lib/porky_lib/unencrypted/file_service.rb +5 -1
- data/lib/porky_lib/version.rb +1 -1
- data/lib/tasks/file.rake +85 -0
- data/porky_lib.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbd7245d269cc4567f5d51dac830da9baeb088df1b4fb26a47c57115b6b29292
|
4
|
+
data.tar.gz: b1c55f42e2b30acfbe3ca9d88bd55ac9ef5d4b2e080c44563ac7a065eaeb1ff4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44a202622d1b47fe683e051ef790664b18fe0314cff2f1dfed90e630e4f76582cae2ba826349c01b91275413c4df142f6ed92c86d4c309ff19fe74796dbbe236
|
7
|
+
data.tar.gz: d10b7f7b4ac97ef7c3fff635087445e9f92f69d72d5b5c985188afbaa02e77015b54afa4c478eae125fbd11f4a39bb53c67dfabf23f2f5cfb29f201a5772e6f4
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
porky_lib (0.9.
|
4
|
+
porky_lib (0.9.5)
|
5
5
|
aws-sdk-kms
|
6
6
|
aws-sdk-s3
|
7
7
|
msgpack
|
@@ -13,17 +13,17 @@ GEM
|
|
13
13
|
specs:
|
14
14
|
ast (2.4.0)
|
15
15
|
aws-eventstream (1.0.3)
|
16
|
-
aws-partitions (1.
|
17
|
-
aws-sdk-core (3.
|
16
|
+
aws-partitions (1.259.0)
|
17
|
+
aws-sdk-core (3.86.0)
|
18
18
|
aws-eventstream (~> 1.0, >= 1.0.2)
|
19
19
|
aws-partitions (~> 1, >= 1.239.0)
|
20
20
|
aws-sigv4 (~> 1.1)
|
21
21
|
jmespath (~> 1.0)
|
22
|
-
aws-sdk-kms (1.
|
22
|
+
aws-sdk-kms (1.27.0)
|
23
23
|
aws-sdk-core (~> 3, >= 3.71.0)
|
24
24
|
aws-sigv4 (~> 1.1)
|
25
|
-
aws-sdk-s3 (1.
|
26
|
-
aws-sdk-core (~> 3, >= 3.
|
25
|
+
aws-sdk-s3 (1.60.1)
|
26
|
+
aws-sdk-core (~> 3, >= 3.83.0)
|
27
27
|
aws-sdk-kms (~> 1)
|
28
28
|
aws-sigv4 (~> 1.1)
|
29
29
|
aws-sigv4 (1.1.0)
|
@@ -32,6 +32,8 @@ GEM
|
|
32
32
|
bundler (>= 1.2.0, < 3)
|
33
33
|
thor (~> 0.18)
|
34
34
|
byebug (11.0.1)
|
35
|
+
codacy-coverage (2.1.5)
|
36
|
+
simplecov
|
35
37
|
codecov (0.1.16)
|
36
38
|
json
|
37
39
|
simplecov
|
@@ -69,7 +71,7 @@ GEM
|
|
69
71
|
rspec-support (3.9.0)
|
70
72
|
rspec_junit_formatter (0.4.1)
|
71
73
|
rspec-core (>= 2, < 4, != 2.12.0)
|
72
|
-
rubocop (0.
|
74
|
+
rubocop (0.78.0)
|
73
75
|
jaro_winkler (~> 1.5.1)
|
74
76
|
parallel (~> 1.10)
|
75
77
|
parser (>= 2.6)
|
@@ -78,7 +80,7 @@ GEM
|
|
78
80
|
unicode-display_width (>= 1.4.0, < 1.7)
|
79
81
|
rubocop-performance (1.5.1)
|
80
82
|
rubocop (>= 0.71.0)
|
81
|
-
rubocop-rspec (1.37.
|
83
|
+
rubocop-rspec (1.37.1)
|
82
84
|
rubocop (>= 0.68.1)
|
83
85
|
rubocop_runner (2.2.0)
|
84
86
|
ruby-progressbar (1.10.1)
|
@@ -101,6 +103,7 @@ DEPENDENCIES
|
|
101
103
|
bundler
|
102
104
|
bundler-audit
|
103
105
|
byebug
|
106
|
+
codacy-coverage
|
104
107
|
codecov
|
105
108
|
msgpack
|
106
109
|
porky_lib!
|
data/README.md
CHANGED
@@ -160,7 +160,7 @@ file_data = PorkyLib::Unencrypted::FileService.read(bucket_name, file_key)
|
|
160
160
|
# Where file is the data to encrypt and upload to S3 (can be a path or raw data or ruby file object)
|
161
161
|
# bucket_name is the name of the S3 bucket to write to
|
162
162
|
# key_id is the ID of the CMK to use to generate a data encryption key to encrypt the file data
|
163
|
-
# options is an optional parameter for specifying optional metadata about the file
|
163
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
164
164
|
file_key = PorkyLib::FileService.write(file, bucket_name, key_id, options)
|
165
165
|
```
|
166
166
|
|
@@ -169,7 +169,7 @@ file_key = PorkyLib::FileService.write(file, bucket_name, key_id, options)
|
|
169
169
|
# Where file is the data to encrypt and upload to S3 (can be a path or ruby file object)
|
170
170
|
# bucket_name is the name of the S3 bucket to write to
|
171
171
|
# key_id is the ID of the CMK to use to generate a data encryption key to encrypt the file data
|
172
|
-
# options is an optional parameter for specifying optional metadata about the file
|
172
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
173
173
|
file_key = PorkyLib::FileService.write_file(file, bucket_name, key_id, options)
|
174
174
|
```
|
175
175
|
|
@@ -178,7 +178,7 @@ file_key = PorkyLib::FileService.write_file(file, bucket_name, key_id, options)
|
|
178
178
|
# Where data is the raw data to encrypt and upload to S3
|
179
179
|
# bucket_name is the name of the S3 bucket to write to
|
180
180
|
# key_id is the ID of the CMK to use to generate a data encryption key to encrypt the file data
|
181
|
-
# options is an optional parameter for specifying optional metadata about the file
|
181
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
182
182
|
file_key = PorkyLib::FileService.write_data(data, bucket_name, key_id, options)
|
183
183
|
```
|
184
184
|
|
@@ -187,7 +187,7 @@ file_key = PorkyLib::FileService.write_data(data, bucket_name, key_id, options)
|
|
187
187
|
# --- DEPRECATED --- Please use write_data or write_file instead of write
|
188
188
|
# Where file is the data to upload to S3 (can be a path or raw data or ruby file object)
|
189
189
|
# bucket_name is the name of the S3 bucket to write to
|
190
|
-
# options is an optional parameter for specifying optional metadata about the file
|
190
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
191
191
|
file_key = PorkyLib::Unencrypted::FileService.write(file, bucket_name, options)
|
192
192
|
```
|
193
193
|
|
@@ -195,7 +195,7 @@ file_key = PorkyLib::Unencrypted::FileService.write(file, bucket_name, options)
|
|
195
195
|
```ruby
|
196
196
|
# Where file is the data to encrypt and upload to S3 (can be a path or ruby file object)
|
197
197
|
# bucket_name is the name of the S3 bucket to write to
|
198
|
-
# options is an optional parameter for specifying optional metadata about the file
|
198
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
199
199
|
file_key = PorkyLib::Unencrypted::FileService.write_file(file, bucket_name, options)
|
200
200
|
```
|
201
201
|
|
@@ -203,7 +203,7 @@ file_key = PorkyLib::Unencrypted::FileService.write_file(file, bucket_name, opti
|
|
203
203
|
```ruby
|
204
204
|
# Where data is the raw data to encrypt and upload to S3
|
205
205
|
# bucket_name is the name of the S3 bucket to write to
|
206
|
-
# options is an optional parameter for specifying optional metadata about the file
|
206
|
+
# options is an optional parameter for specifying optional metadata about the file and the storage_class of the object
|
207
207
|
file_key = PorkyLib::Unencrypted::FileService.write_data(data, bucket_name, options)
|
208
208
|
```
|
209
209
|
|
@@ -224,6 +224,45 @@ To generate a new presigned GET url (used to download files directly from AWS S3
|
|
224
224
|
url = PorkyLib::Symmetric.instance.presigned_get_url(bucket_name, file_key)
|
225
225
|
```
|
226
226
|
|
227
|
+
## Rake task
|
228
|
+
If you want to write or read an encrypted file from the command line, there is a Rake write and read task.
|
229
|
+
|
230
|
+
> Note: the environment variables can be set globally or by prepending them to the rake task command
|
231
|
+
|
232
|
+
### Write file
|
233
|
+
|
234
|
+
Rake task name: `file:write`
|
235
|
+
|
236
|
+
Environment variables:
|
237
|
+
* Required
|
238
|
+
* `FILE_PATH` - Absolute or relative file path
|
239
|
+
* `CMK_KEY_ID` - Alias of the CMK key
|
240
|
+
* `AWS_S3_BUCKET` - AWS S3 bucket name
|
241
|
+
* `AWS_REGION` - AWS region name
|
242
|
+
* `AWS_ACCESS_KEY_ID` - AWS access key ID (credentials)
|
243
|
+
* `AWS_ACCESS_KEY` - AWS secret access key (credentials)
|
244
|
+
* Optional
|
245
|
+
* `AWS_S3_MOCK_CLIENT` - PorkyLib's AWS KMS mock client (defaults to `true`)
|
246
|
+
* `AWS_S3_MAX_FILE_SIZE` - Max file size (defaults to `1MB`)
|
247
|
+
* `AWS_S3_STORAGE_CLASS` - One of STANDARD, REDUCED_REDUNDANCY, STANDARD_IA, ONEZONE_IA, INTELLIGENT_TIERING, GLACIER, DEEP_ARCHIVE (defaults to `STANDARD`)
|
248
|
+
* `AWS_S3_KEEP_FILE_NAME` - Saves the file in AWS S3 with the original file name (defaults to `true`)
|
249
|
+
|
250
|
+
### Read file
|
251
|
+
|
252
|
+
Rake task name: `file:read`
|
253
|
+
|
254
|
+
Environment variables:
|
255
|
+
* Required
|
256
|
+
* `FILE_KEY` - AWS S3 object file key
|
257
|
+
* `AWS_S3_BUCKET` - AWS S3 bucket name
|
258
|
+
* `AWS_REGION` - AWS region name
|
259
|
+
* `AWS_ACCESS_KEY_ID` - AWS access key ID (credentials)
|
260
|
+
* `AWS_ACCESS_KEY` - AWS secret access key (credentials)
|
261
|
+
* Optional
|
262
|
+
* `AWS_S3_MOCK_CLIENT` - PorkyLib's AWS KMS mock client (defaults to `true`)
|
263
|
+
* `AWS_S3_MAX_FILE_SIZE` - Max file size (defaults to `1MB`)
|
264
|
+
* `DESTINATION` - Location to save the file (defaults to `FILE_KEY`)
|
265
|
+
|
227
266
|
## Development
|
228
267
|
|
229
268
|
Development on this project should occur on separate feature branches and pull requests should be submitted. When submitting a
|
data/Rakefile
CHANGED
@@ -77,7 +77,11 @@ class PorkyLib::FileService
|
|
77
77
|
raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(data, bucket_name, key_id)
|
78
78
|
raise FileSizeTooLargeError, "Data size is larger than maximum allowed size of #{max_file_size}" if data_size_invalid?(data)
|
79
79
|
|
80
|
-
file_key =
|
80
|
+
file_key = if options.key?(:file_name)
|
81
|
+
options[:file_name]
|
82
|
+
else
|
83
|
+
generate_file_key(options)
|
84
|
+
end
|
81
85
|
tempfile = encrypt_file_contents(data, key_id, file_key, options)
|
82
86
|
|
83
87
|
begin
|
@@ -36,11 +36,13 @@ module PorkyLib::FileServiceHelper
|
|
36
36
|
|
37
37
|
def perform_upload(bucket_name, file_key, tempfile, options)
|
38
38
|
obj = s3.bucket(bucket_name).object(file_key)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
|
40
|
+
upload_options = {
|
41
|
+
metadata: (options[:metadata] if options.key?(:metadata)),
|
42
|
+
storage_class: (options[:storage_class] if options.key?(:storage_class))
|
43
|
+
}.compact
|
44
|
+
|
45
|
+
obj.upload_file(tempfile.path, upload_options)
|
44
46
|
end
|
45
47
|
|
46
48
|
def s3
|
@@ -47,7 +47,11 @@ class PorkyLib::Unencrypted::FileService
|
|
47
47
|
raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(data, bucket_name)
|
48
48
|
raise FileSizeTooLargeError, "Data size is larger than maximum allowed size of #{max_file_size}" if data_size_invalid?(data)
|
49
49
|
|
50
|
-
file_key =
|
50
|
+
file_key = if options.key?(:file_name)
|
51
|
+
options[:file_name]
|
52
|
+
else
|
53
|
+
generate_file_key(options)
|
54
|
+
end
|
51
55
|
tempfile = write_tempfile(data, file_key)
|
52
56
|
|
53
57
|
begin
|
data/lib/porky_lib/version.rb
CHANGED
data/lib/tasks/file.rake
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'porky_lib'
|
4
|
+
|
5
|
+
namespace :file do
|
6
|
+
desc "Read a file from AWS S3"
|
7
|
+
task :read do
|
8
|
+
# Optional arguments
|
9
|
+
use_mock_client = ENV.fetch('AWS_S3_MOCK_CLIENT', 'true') == 'true'
|
10
|
+
max_file_size = ENV.fetch('AWS_S3_MAX_FILE_SIZE', 1_048_576).to_i
|
11
|
+
destination = ENV.fetch('DESTINATION', ENV['FILE_KEY'])
|
12
|
+
|
13
|
+
# Required arguments
|
14
|
+
arguments = {
|
15
|
+
file_key: ENV['FILE_KEY'],
|
16
|
+
aws_s3_bucket: ENV['AWS_S3_BUCKET'],
|
17
|
+
aws_region: ENV['AWS_REGION'],
|
18
|
+
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
19
|
+
aws_access_key: ENV['AWS_ACCESS_KEY']
|
20
|
+
}
|
21
|
+
|
22
|
+
# Checks presence of required arguments and configures porky_lib
|
23
|
+
check_arguments(arguments)
|
24
|
+
setup_porky_lib(arguments, use_mock_client, max_file_size)
|
25
|
+
|
26
|
+
# Reads and writes the file
|
27
|
+
message, = PorkyLib::FileService.instance.read(arguments[:aws_s3_bucket], arguments[:file_key])
|
28
|
+
file = File.open(destination, 'w')
|
29
|
+
file.puts(message)
|
30
|
+
file.close
|
31
|
+
|
32
|
+
puts "SUCCESS - Saved file: '#{destination}' with content of the bucket: '#{arguments[:aws_s3_bucket]}' with file_key: '#{arguments[:file_key]}'"
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Write a file to AWS S3"
|
36
|
+
task :write do
|
37
|
+
# Optional arguments
|
38
|
+
use_mock_client = ENV.fetch('AWS_S3_MOCK_CLIENT', 'true') == 'true'
|
39
|
+
max_file_size = ENV.fetch('AWS_S3_MAX_FILE_SIZE', 1_048_576).to_i
|
40
|
+
storage_class = ENV.fetch('AWS_S3_STORAGE_CLASS', 'STANDARD')
|
41
|
+
keep_file_name = ENV.fetch('AWS_S3_KEEP_FILE_NAME', 'true') == 'true'
|
42
|
+
|
43
|
+
# Required arguments
|
44
|
+
arguments = {
|
45
|
+
file_path: ENV['FILE_PATH'],
|
46
|
+
cmk_key_id: ENV['CMK_KEY_ID'],
|
47
|
+
aws_s3_bucket: ENV['AWS_S3_BUCKET'],
|
48
|
+
aws_region: ENV['AWS_REGION'],
|
49
|
+
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
50
|
+
aws_access_key: ENV['AWS_ACCESS_KEY']
|
51
|
+
}
|
52
|
+
|
53
|
+
# Checks presence of required arguments and configures porky_lib
|
54
|
+
check_arguments(arguments)
|
55
|
+
setup_porky_lib(arguments, use_mock_client, max_file_size)
|
56
|
+
|
57
|
+
write_options = {
|
58
|
+
storage_class: storage_class,
|
59
|
+
file_name: (File.basename(arguments[:file_path]) if keep_file_name)
|
60
|
+
}.compact
|
61
|
+
|
62
|
+
# Creates CMK key with empty tags and stores file
|
63
|
+
PorkyLib::Symmetric.instance.create_key([{}], arguments[:cmk_key_id]) unless PorkyLib::Symmetric.instance.cmk_alias_exists?(arguments[:cmk_key_id])
|
64
|
+
file_key = PorkyLib::FileService.instance.write_file(arguments[:file_path], arguments[:aws_s3_bucket], arguments[:cmk_key_id], write_options)
|
65
|
+
|
66
|
+
puts "SUCCESS - Created file: '#{arguments[:file_path]}' bucket: '#{arguments[:aws_s3_bucket]}' file_key: '#{file_key}'"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def check_arguments(arguments)
|
73
|
+
nil_arguments = []
|
74
|
+
arguments.map { |key, value| nil_arguments.push(key.to_s.upcase) if value.nil? && !key.nil? }
|
75
|
+
abort "ERROR - Need to provide as environment variables: #{nil_arguments.join(', ')}" unless nil_arguments.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def setup_porky_lib(arguments, use_mock_client, max_file_size)
|
79
|
+
PorkyLib::Config.configure(aws_region: arguments[:aws_region],
|
80
|
+
aws_key_id: arguments[:aws_access_key_id],
|
81
|
+
aws_key_secret: arguments[:aws_access_key],
|
82
|
+
aws_client_mock: use_mock_client,
|
83
|
+
max_file_size: max_file_size)
|
84
|
+
PorkyLib::Config.initialize_aws
|
85
|
+
end
|
data/porky_lib.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency 'bundler'
|
26
26
|
spec.add_development_dependency 'bundler-audit'
|
27
27
|
spec.add_development_dependency 'byebug'
|
28
|
+
spec.add_development_dependency 'codacy-coverage'
|
28
29
|
spec.add_development_dependency 'codecov'
|
29
30
|
spec.add_development_dependency 'msgpack'
|
30
31
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: porky_lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Fletcher
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-kms
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: codacy-coverage
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: codecov
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -390,6 +404,7 @@ files:
|
|
390
404
|
- lib/porky_lib/unencrypted.rb
|
391
405
|
- lib/porky_lib/unencrypted/file_service.rb
|
392
406
|
- lib/porky_lib/version.rb
|
407
|
+
- lib/tasks/file.rake
|
393
408
|
- porky_lib.gemspec
|
394
409
|
homepage: https://github.com/Zetatango/porky_lib
|
395
410
|
licenses: []
|