porky_lib 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd1dfb255c5b91f06fe66af135ef84ef65fcb96bd02ad5150090619460bd7d86
4
- data.tar.gz: 5edbf7d85795d8aaff798d486c043464199c03542c924f297559835796b9d829
3
+ metadata.gz: 63d12d040a5b5f4c6b96940a29bd3ff771e713327fa7269488ea731b76fb59aa
4
+ data.tar.gz: a086399a4c16939060522f80e0e1421268781973ffd15e7fac42dfece572782a
5
5
  SHA512:
6
- metadata.gz: bc55b6280bce9d76a9d6553e239487f14712ba535fdf83c54006e6cd27c67e8babda30e58632fbf1d76f531bc8c822b96d34a1e0a5209cf4098f436567bd951d
7
- data.tar.gz: 3e428d8b741ba820b43ef1dc891dd0cd2b3ae81d9b2ba0d578705c84296ade1c4b510eb69e706c8d5869e4153884f1af2a5cd1a22fed09e226a9d694134b6035
6
+ metadata.gz: cd5e4418205489c4705648c575d23011a139eac1622202e638b3bb20a0a8e753996601b52be9ba05cf4148f3e1b8779b944c7fb87f0c8af834a1c42554b99c8e
7
+ data.tar.gz: 29b4c3e1243a851e61b2a288666dcd98a6f1d6f4f892a4f250cc0d3edcaf81562a19202dc016dce201b2cb2a0c92df2fe601f8cb64ab822ceb2e04aadcfbb505
data/.rubocop.yml CHANGED
@@ -9,6 +9,7 @@ AllCops:
9
9
  - node_modules/**/*
10
10
  - output/**/*
11
11
  - vendor/**/*
12
+ - spec/porky_lib/data/*
12
13
  TargetRubyVersion: 2.3.7
13
14
  RSpec:
14
15
  Patterns:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- porky_lib (0.9.2)
4
+ porky_lib (0.9.3)
5
5
  aws-sdk-kms
6
6
  aws-sdk-s3
7
7
  msgpack
@@ -13,8 +13,8 @@ GEM
13
13
  specs:
14
14
  ast (2.4.0)
15
15
  aws-eventstream (1.0.3)
16
- aws-partitions (1.228.0)
17
- aws-sdk-core (3.72.0)
16
+ aws-partitions (1.232.0)
17
+ aws-sdk-core (3.72.1)
18
18
  aws-eventstream (~> 1.0, >= 1.0.2)
19
19
  aws-partitions (~> 1, >= 1.228.0)
20
20
  aws-sigv4 (~> 1.1)
@@ -22,7 +22,7 @@ GEM
22
22
  aws-sdk-kms (1.25.0)
23
23
  aws-sdk-core (~> 3, >= 3.71.0)
24
24
  aws-sigv4 (~> 1.1)
25
- aws-sdk-s3 (1.51.0)
25
+ aws-sdk-s3 (1.53.0)
26
26
  aws-sdk-core (~> 3, >= 3.71.0)
27
27
  aws-sdk-kms (~> 1)
28
28
  aws-sigv4 (~> 1.1)
@@ -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.15)
35
+ codecov (0.1.16)
36
36
  json
37
37
  simplecov
38
38
  url
@@ -69,7 +69,7 @@ GEM
69
69
  rspec-support (3.9.0)
70
70
  rspec_junit_formatter (0.4.1)
71
71
  rspec-core (>= 2, < 4, != 2.12.0)
72
- rubocop (0.75.1)
72
+ rubocop (0.76.0)
73
73
  jaro_winkler (~> 1.5.1)
74
74
  parallel (~> 1.10)
75
75
  parser (>= 2.6)
data/README.md CHANGED
@@ -156,21 +156,57 @@ file_data = PorkyLib::Unencrypted::FileService.read(bucket_name, file_key)
156
156
 
157
157
  ### To Write To AWS S3
158
158
  ```ruby
159
- # Where file is the data to encrypt and upload to S3 (can be raw data or ruby file object)
159
+ # --- DEPRECATED --- Please use write_data or write_file instead of write
160
+ # Where file is the data to encrypt and upload to S3 (can be a path or raw data or ruby file object)
160
161
  # bucket_name is the name of the S3 bucket to write to
161
162
  # key_id is the ID of the CMK to use to generate a data encryption key to encrypt the file data
162
163
  # options is an optional parameter for specifying optional metadata about the file
163
164
  file_key = PorkyLib::FileService.write(file, bucket_name, key_id, options)
164
165
  ```
165
166
 
166
- ### To Write Unencrypted Files To AWS S3
167
+ ### To Write Files To AWS S3
168
+ ```ruby
169
+ # Where file is the data to encrypt and upload to S3 (can be a path or ruby file object)
170
+ # bucket_name is the name of the S3 bucket to write to
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
173
+ file_key = PorkyLib::FileService.write_file(file, bucket_name, key_id, options)
174
+ ```
175
+
176
+ ### To Write Data To AWS S3
177
+ ```ruby
178
+ # Where data is the raw data to encrypt and upload to S3
179
+ # bucket_name is the name of the S3 bucket to write to
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
182
+ file_key = PorkyLib::FileService.write_data(data, bucket_name, key_id, options)
183
+ ```
184
+
185
+ ### To Write Unencrypted To AWS S3
167
186
  ```ruby
168
- # Where file is the data to upload to S3 (can be raw data or ruby file object)
187
+ # --- DEPRECATED --- Please use write_data or write_file instead of write
188
+ # Where file is the data to upload to S3 (can be a path or raw data or ruby file object)
169
189
  # bucket_name is the name of the S3 bucket to write to
170
190
  # options is an optional parameter for specifying optional metadata about the file
171
191
  file_key = PorkyLib::Unencrypted::FileService.write(file, bucket_name, options)
172
192
  ```
173
193
 
194
+ ### To Write Unencrypted Files To AWS S3
195
+ ```ruby
196
+ # Where file is the data to encrypt and upload to S3 (can be a path or ruby file object)
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
199
+ file_key = PorkyLib::Unencrypted::FileService.write_file(file, bucket_name, options)
200
+ ```
201
+
202
+ ### To Write Unencrypted Data To AWS S3
203
+ ```ruby
204
+ # Where data is the raw data to encrypt and upload to S3
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
207
+ file_key = PorkyLib::Unencrypted::FileService.write_data(data, bucket_name, options)
208
+ ```
209
+
174
210
  ### Generate S3 Presigned POST URL
175
211
  To generate a new presigned POST url (used to upload files directly to AWS S3):
176
212
  ```ruby
@@ -3,6 +3,8 @@
3
3
  require 'singleton'
4
4
 
5
5
  class PorkyLib::FileService
6
+ extend Gem::Deprecate
7
+
6
8
  include Singleton
7
9
  include PorkyLib::FileServiceHelper
8
10
 
@@ -56,9 +58,25 @@ class PorkyLib::FileService
56
58
 
57
59
  def write(file, bucket_name, key_id, options = {})
58
60
  raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name, key_id)
59
- raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if file_size_invalid?(file)
60
61
 
61
- data = file_data(file)
62
+ if file?(file)
63
+ write_file(file, bucket_name, key_id, options)
64
+ else
65
+ write_data(file, bucket_name, key_id, options)
66
+ end
67
+ end
68
+ deprecate :write, 'write_file or write_data', 2020, 1
69
+
70
+ def write_file(file, bucket_name, key_id, options = {})
71
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name, key_id)
72
+
73
+ write_data(read_file(file), bucket_name, key_id, options)
74
+ end
75
+
76
+ def write_data(data, bucket_name, key_id, options = {})
77
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(data, bucket_name, key_id)
78
+ raise FileSizeTooLargeError, "Data size is larger than maximum allowed size of #{max_file_size}" if data_size_invalid?(data)
79
+
62
80
  file_key = generate_file_key(options)
63
81
  tempfile = encrypt_file_contents(data, key_id, file_key, options)
64
82
 
@@ -74,11 +92,12 @@ class PorkyLib::FileService
74
92
  end
75
93
 
76
94
  def overwrite_file(file, file_key, bucket_name, key_id, options = {})
77
- raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name, key_id)
95
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if overwrite_input_invalid?(file, file_key, bucket_name, key_id)
78
96
  raise FileServiceError, 'Invalid input. file_key cannot be nil if overwriting an existing file' if file_key.nil?
79
- raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if file_size_invalid?(file)
80
97
 
81
98
  data = file_data(file)
99
+ raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if data_size_invalid?(data)
100
+
82
101
  tempfile = encrypt_file_contents(data, key_id, file_key, options)
83
102
 
84
103
  begin
@@ -90,6 +109,7 @@ class PorkyLib::FileService
90
109
  # Remove tempfile from disk
91
110
  tempfile.unlink
92
111
  end
112
+ deprecate :overwrite_file, :none, 2020, 0o1
93
113
 
94
114
  def presigned_post_url(bucket_name, options = {})
95
115
  file_name = options[:file_name] || SecureRandom.uuid
@@ -158,7 +178,11 @@ class PorkyLib::FileService
158
178
  @s3_client ||= Aws::S3::Client.new
159
179
  end
160
180
 
161
- def input_invalid?(file, bucket_name, key_id)
162
- file.nil? || bucket_name.nil? || key_id.nil?
181
+ def input_invalid?(file_or_data, bucket_name, key_id)
182
+ file_or_data.nil? || bucket_name.nil? || key_id.nil?
183
+ end
184
+
185
+ def overwrite_input_invalid?(file_or_data, file_key, bucket_name, key_id)
186
+ file_or_data.nil? || file_key.nil? || bucket_name.nil? || key_id.nil?
163
187
  end
164
188
  end
@@ -3,17 +3,27 @@
3
3
  require 'aws-sdk-s3'
4
4
 
5
5
  module PorkyLib::FileServiceHelper
6
- def file_size_invalid?(file_or_content)
7
- if a_file?(file_or_content)
8
- File.size(file_or_content) > max_size
6
+ extend Gem::Deprecate
7
+
8
+ class FileServiceError < StandardError; end
9
+
10
+ def data_size_invalid?(data)
11
+ data.bytesize > max_size
12
+ end
13
+
14
+ def file_data(file_or_content)
15
+ if file?(file_or_content)
16
+ read_file(file_or_content)
9
17
  else
10
- file_or_content.bytesize > max_size
18
+ file_or_content
11
19
  end
12
20
  end
21
+ deprecate :file_data, :none, 2020, 1
13
22
 
14
- def file_data(file_or_content)
15
- a_file?(file_or_content) ? File.read(file_or_content) : file_or_content
23
+ def file?(file_or_content)
24
+ a_file?(file_or_content) || a_path?(file_or_content)
16
25
  end
26
+ deprecate :file?, :none, 2020, 1
17
27
 
18
28
  def write_tempfile(file_contents, file_key)
19
29
  tempfile = Tempfile.new(file_key)
@@ -23,6 +33,16 @@ module PorkyLib::FileServiceHelper
23
33
  tempfile
24
34
  end
25
35
 
36
+ def read_file(file)
37
+ raise FileServiceError, 'file cannot be nil' if file.nil?
38
+ return file if !a_file?(file) && contain_null_byte?(file)
39
+ raise FileServiceError, 'The specified file does not exist' unless File.file?(file)
40
+
41
+ File.read(file)
42
+ rescue Errno::EACCES
43
+ raise FileServiceError, 'The specified file cannot be read, no permissions'
44
+ end
45
+
26
46
  def perform_upload(bucket_name, file_key, tempfile, options)
27
47
  obj = s3.bucket(bucket_name).object(file_key)
28
48
  if options.key?(:metadata)
@@ -58,4 +78,17 @@ module PorkyLib::FileServiceHelper
58
78
  def a_file?(file_or_content)
59
79
  !file_or_content.is_a?(String)
60
80
  end
81
+
82
+ def a_path?(content_or_path)
83
+ return false if contain_null_byte?(content_or_path)
84
+
85
+ File.file?(content_or_path)
86
+ end
87
+
88
+ def contain_null_byte?(data)
89
+ null_byte = (+"\u0000").force_encoding("ASCII-8BIT")
90
+ data = (+data).force_encoding("ASCII-8BIT")
91
+
92
+ data.include?(null_byte)
93
+ end
61
94
  end
@@ -3,6 +3,8 @@
3
3
  require 'singleton'
4
4
 
5
5
  class PorkyLib::Unencrypted::FileService
6
+ extend Gem::Deprecate
7
+
6
8
  include Singleton
7
9
  include PorkyLib::FileServiceHelper
8
10
 
@@ -26,10 +28,27 @@ class PorkyLib::Unencrypted::FileService
26
28
 
27
29
  def write(file, bucket_name, options = {})
28
30
  raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name)
29
- raise FileSizeTooLargeError, "File size is larger than maximum allowed size of #{max_file_size}" if file_size_invalid?(file)
31
+
32
+ if file?(file)
33
+ write_file(file, bucket_name, options)
34
+ else
35
+ write_data(file, bucket_name, options)
36
+ end
37
+ end
38
+ deprecate :write, 'write_file or write_data', 2020, 1
39
+
40
+ def write_file(file, bucket_name, options = {})
41
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(file, bucket_name)
42
+
43
+ write_data(read_file(file), bucket_name, options)
44
+ end
45
+
46
+ def write_data(data, bucket_name, options = {})
47
+ raise FileServiceError, 'Invalid input. One or more input values is nil' if input_invalid?(data, bucket_name)
48
+ raise FileSizeTooLargeError, "Data size is larger than maximum allowed size of #{max_file_size}" if data_size_invalid?(data)
30
49
 
31
50
  file_key = generate_file_key(options)
32
- tempfile = write_tempfile(file_data(file), file_key)
51
+ tempfile = write_tempfile(data, file_key)
33
52
 
34
53
  begin
35
54
  perform_upload(bucket_name, file_key, tempfile, options)
@@ -42,7 +61,7 @@ class PorkyLib::Unencrypted::FileService
42
61
 
43
62
  private
44
63
 
45
- def input_invalid?(file, bucket_name)
46
- file.nil? || bucket_name.nil?
64
+ def input_invalid?(file_or_data, bucket_name)
65
+ file_or_data.nil? || bucket_name.nil?
47
66
  end
48
67
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PorkyLib
4
- VERSION = "0.9.2"
4
+ VERSION = "0.9.3"
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.9.2
4
+ version: 0.9.3
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-10-29 00:00:00.000000000 Z
11
+ date: 2019-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-kms