porky_lib 0.8.0 → 0.9.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: 99fe9eed54e08ab3c553aa2fb80256f6b7aaccac49fee918c1c12f713b93bef8
4
- data.tar.gz: c3174d94c93b20e609b0058395893a5fa5a011e26df50acdc3727f4b7d9d73dd
3
+ metadata.gz: b1430e614f2d820b689e17b99735c4c7b24ba907640d427d2bd77c577e06017b
4
+ data.tar.gz: 278c2837a1a5eeefdb1ee584f69c07e448cad649777da8ac49fd51d477949b92
5
5
  SHA512:
6
- metadata.gz: 20fc71c1519a16e5950d98a8437f8c08df4fbec90ede3a12247f5569005632b790b1f8de3a845ef96736e4202cf50724c4316e0aad24a545cf5a19f683cde925
7
- data.tar.gz: d22574f96074ea36500af793b730cab786f9939ee62050c3d800823c789334109de6ad7f2fcda1e12b4b020bee40a16ccad71947cb8bb72083a18ae1af21b802
6
+ metadata.gz: 0b3499e0acf1bb5df6e6382d2eacb0fff863f1a3d493fe864fb25662c21c9cb27aae26fbc46c39fdca1a19ae54976d47e095a230dc5cbea66b66b5132e1edf51
7
+ data.tar.gz: d13230909d362eda803d787b1ff0fdcd3331bfa2672b9e4696f6d3e1128367317b32595bd56284dc2c81f22fd78b63107553ae3de1e7e3953601e933f10abc00
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- porky_lib (0.8.0)
4
+ porky_lib (0.9.0)
5
5
  aws-sdk-kms
6
6
  aws-sdk-s3
7
7
  msgpack
@@ -32,7 +32,7 @@ GEM
32
32
  bundler (>= 1.2.0, < 3)
33
33
  thor (~> 0.18)
34
34
  byebug (11.0.1)
35
- codecov (0.1.14)
35
+ codecov (0.1.15)
36
36
  json
37
37
  simplecov
38
38
  url
@@ -44,10 +44,10 @@ GEM
44
44
  json (2.2.0)
45
45
  msgpack (1.3.1)
46
46
  parallel (1.17.0)
47
- parser (2.6.3.0)
47
+ parser (2.6.4.1)
48
48
  ast (~> 2.4.0)
49
49
  rainbow (3.0.0)
50
- rake (12.3.3)
50
+ rake (13.0.0)
51
51
  rbnacl (5.0.0)
52
52
  ffi
53
53
  rbnacl-libsodium (1.0.16)
@@ -56,11 +56,11 @@ GEM
56
56
  rspec-core (~> 3.8.0)
57
57
  rspec-expectations (~> 3.8.0)
58
58
  rspec-mocks (~> 3.8.0)
59
- rspec-collection_matchers (1.1.3)
59
+ rspec-collection_matchers (1.2.0)
60
60
  rspec-expectations (>= 2.99.0.beta1)
61
61
  rspec-core (3.8.0)
62
62
  rspec-support (~> 3.8.0)
63
- rspec-expectations (3.8.2)
63
+ rspec-expectations (3.8.4)
64
64
  diff-lcs (>= 1.2.0, < 2.0)
65
65
  rspec-support (~> 3.8.0)
66
66
  rspec-mocks (3.8.1)
@@ -78,11 +78,11 @@ GEM
78
78
  unicode-display_width (>= 1.4.0, < 1.7)
79
79
  rubocop-performance (1.4.1)
80
80
  rubocop (>= 0.71.0)
81
- rubocop-rspec (1.35.0)
82
- rubocop (>= 0.60.0)
81
+ rubocop-rspec (1.36.0)
82
+ rubocop (>= 0.68.1)
83
83
  rubocop_runner (2.2.0)
84
84
  ruby-progressbar (1.10.1)
85
- simplecov (0.17.0)
85
+ simplecov (0.17.1)
86
86
  docile (~> 1.1)
87
87
  json (>= 1.8, < 3)
88
88
  simplecov-html (~> 0.10.0)
data/README.md CHANGED
@@ -147,6 +147,13 @@ alias_exists = PorkyLib::Symmetric.instance.cmk_alias_exists?(key_alias)
147
147
  file_data = PorkyLib::FileService.read(bucket_name, file_key)
148
148
  ```
149
149
 
150
+ ### To Read Unencrypted Files From AWS S3
151
+ ```ruby
152
+ # Where bucket_name is the name of the S3 bucket to read from
153
+ # file_key is file identifier of the file/data that was written to S3.
154
+ file_data = PorkyLib::Unencrypted::FileService.read(bucket_name, file_key)
155
+ ```
156
+
150
157
  ### To Write To AWS S3
151
158
  ```ruby
152
159
  # Where file is the data to encrypt and upload to S3 (can be raw data or path to a file on disk)
@@ -156,6 +163,14 @@ file_data = PorkyLib::FileService.read(bucket_name, file_key)
156
163
  file_key = PorkyLib::FileService.write(file, bucket_name, key_id, options)
157
164
  ```
158
165
 
166
+ ### To Write Unencrypted Files To AWS S3
167
+ ```ruby
168
+ # Where file is the data to upload to S3 (can be raw data or path to a file on disk)
169
+ # bucket_name is the name of the S3 bucket to write to
170
+ # options is an optional parameter for specifying optional metadata about the file
171
+ file_key = PorkyLib::Unencrypted::FileService.write(file, bucket_name, options)
172
+ ```
173
+
159
174
  ### Generate S3 Presigned POST URL
160
175
  To generate a new presigned POST url (used to upload files directly to AWS S3):
161
176
  ```ruby
data/lib/porky_lib.rb CHANGED
@@ -5,4 +5,6 @@ module PorkyLib
5
5
  require 'porky_lib/file_service'
6
6
  require 'porky_lib/symmetric'
7
7
  require 'porky_lib/version'
8
+ require 'porky_lib/unencrypted'
9
+ require 'porky_lib/file_service_helper'
8
10
  end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'aws-sdk-s3'
4
3
  require 'singleton'
4
+ require 'porky_lib/file_service_helper'
5
5
 
6
6
  class PorkyLib::FileService
7
7
  include Singleton
8
+ include FileServiceHelper
8
9
 
9
10
  class FileServiceError < StandardError; end
10
11
  class FileSizeTooLargeError < StandardError; end
@@ -59,7 +60,7 @@ class PorkyLib::FileService
59
60
  raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if file_size_invalid?(file)
60
61
 
61
62
  data = file_data(file)
62
- file_key = options.key?(:directory) ? "#{options[:directory]}/#{SecureRandom.uuid}" : SecureRandom.uuid
63
+ file_key = generate_file_key(options)
63
64
  tempfile = encrypt_file_contents(data, key_id, file_key, options)
64
65
 
65
66
  begin
@@ -114,40 +115,6 @@ class PorkyLib::FileService
114
115
 
115
116
  private
116
117
 
117
- def input_invalid?(file, bucket_name, key_id)
118
- file.nil? || bucket_name.nil? || key_id.nil?
119
- end
120
-
121
- def file_size_invalid?(file)
122
- file.bytesize > max_size || (File.file?(file) && File.size(file) > max_size)
123
- end
124
-
125
- def file_data(file)
126
- File.file?(file) ? File.read(file) : file
127
- end
128
-
129
- def max_size
130
- PorkyLib::Config.config[:max_file_size]
131
- end
132
-
133
- def max_file_size
134
- {
135
- B: 1024,
136
- KB: 1024 * 1024,
137
- MB: 1024 * 1024 * 1024,
138
- GB: 1024 * 1024 * 1024 * 1024
139
- }.each_pair { |symbol, bytes| return "#{(max_size.to_f / (bytes / 1024)).round(2)}#{symbol}" if max_size < bytes }
140
- end
141
-
142
- def perform_upload(bucket_name, file_key, tempfile, options)
143
- obj = s3.bucket(bucket_name).object(file_key)
144
- if options.key?(:metadata)
145
- obj.upload_file(tempfile.path, metadata: options[:metadata])
146
- else
147
- obj.upload_file(tempfile.path)
148
- end
149
- end
150
-
151
118
  def decrypt_file_contents(tempfile)
152
119
  file_contents = tempfile.read
153
120
 
@@ -184,14 +151,6 @@ class PorkyLib::FileService
184
151
  }.to_json
185
152
  end
186
153
 
187
- def write_tempfile(file_contents, file_key)
188
- tempfile = Tempfile.new(file_key)
189
- tempfile << file_contents
190
- tempfile.close
191
-
192
- tempfile
193
- end
194
-
195
154
  def presign_url_expires_in
196
155
  PorkyLib::Config.config[:presign_url_expires_in]
197
156
  end
@@ -200,7 +159,7 @@ class PorkyLib::FileService
200
159
  @s3_client ||= Aws::S3::Client.new
201
160
  end
202
161
 
203
- def s3
204
- @s3 ||= Aws::S3::Resource.new
162
+ def input_invalid?(file, bucket_name, key_id)
163
+ file.nil? || bucket_name.nil? || key_id.nil?
205
164
  end
206
165
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-s3'
4
+
5
+ module FileServiceHelper
6
+ def file_size_invalid?(file)
7
+ file.bytesize > max_size || (File.file?(file) && File.size(file) > max_size)
8
+ end
9
+
10
+ def file_data(file)
11
+ File.file?(file) ? File.read(file) : file
12
+ end
13
+
14
+ def write_tempfile(file_contents, file_key)
15
+ tempfile = Tempfile.new(file_key)
16
+ tempfile << file_contents
17
+ tempfile.close
18
+
19
+ tempfile
20
+ end
21
+
22
+ def perform_upload(bucket_name, file_key, tempfile, options)
23
+ obj = s3.bucket(bucket_name).object(file_key)
24
+ if options.key?(:metadata)
25
+ obj.upload_file(tempfile.path, metadata: options[:metadata])
26
+ else
27
+ obj.upload_file(tempfile.path)
28
+ end
29
+ end
30
+
31
+ def s3
32
+ @s3 ||= Aws::S3::Resource.new
33
+ end
34
+
35
+ def max_size
36
+ PorkyLib::Config.config[:max_file_size]
37
+ end
38
+
39
+ def max_file_size
40
+ {
41
+ B: 1024,
42
+ KB: 1024 * 1024,
43
+ MB: 1024 * 1024 * 1024,
44
+ GB: 1024 * 1024 * 1024 * 1024
45
+ }.each_pair { |symbol, bytes| return "#{(max_size.to_f / (bytes / 1024)).round(2)}#{symbol}" if max_size < bytes }
46
+ end
47
+
48
+ def generate_file_key(options)
49
+ options.key?(:directory) ? "#{options[:directory]}/#{SecureRandom.uuid}" : SecureRandom.uuid
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PorkyLib::Unencrypted
4
+ require 'porky_lib/unencrypted/file_service'
5
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+ require 'porky_lib/file_service_helper'
5
+
6
+ class PorkyLib::Unencrypted::FileService
7
+ include Singleton
8
+ include FileServiceHelper
9
+
10
+ class FileServiceError < StandardError; end
11
+ class FileSizeTooLargeError < StandardError; end
12
+
13
+ def read(bucket_name, file_key, options = {})
14
+ tempfile = Tempfile.new
15
+
16
+ begin
17
+ object = s3.bucket(bucket_name).object(file_key)
18
+ raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if object.content_length > max_size
19
+
20
+ object.download_file(tempfile.path, options)
21
+ rescue Aws::Errors::ServiceError, Seahorse::Client::NetworkingError => e
22
+ raise FileServiceError, "Attempt to download a file from S3 failed.\n#{e.message}"
23
+ end
24
+
25
+ tempfile.read
26
+ end
27
+
28
+ def write(file, bucket_name, options = {})
29
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name)
30
+ raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if file_size_invalid?(file)
31
+
32
+ file_key = generate_file_key(options)
33
+ tempfile = write_tempfile(file_data(file), file_key)
34
+
35
+ begin
36
+ perform_upload(bucket_name, file_key, tempfile, options)
37
+ rescue Aws::Errors::ServiceError, Seahorse::Client::NetworkingError => e
38
+ raise FileServiceError, "Attempt to upload a file to S3 failed.\n#{e.message}"
39
+ end
40
+
41
+ file_key
42
+ end
43
+
44
+ private
45
+
46
+ def input_invalid?(file, bucket_name)
47
+ file.nil? || bucket_name.nil?
48
+ end
49
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PorkyLib
4
- VERSION = "0.8.0"
4
+ VERSION = "0.9.0"
5
5
  end
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.8.0
4
+ version: 0.9.0
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-09-12 00:00:00.000000000 Z
11
+ date: 2019-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-kms
@@ -385,7 +385,10 @@ files:
385
385
  - lib/porky_lib/aws/kms/client.rb
386
386
  - lib/porky_lib/config.rb
387
387
  - lib/porky_lib/file_service.rb
388
+ - lib/porky_lib/file_service_helper.rb
388
389
  - lib/porky_lib/symmetric.rb
390
+ - lib/porky_lib/unencrypted.rb
391
+ - lib/porky_lib/unencrypted/file_service.rb
389
392
  - lib/porky_lib/version.rb
390
393
  - porky_lib.gemspec
391
394
  homepage: https://github.com/Zetatango/porky_lib