secret_string 1.1.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f912f9e56675854f647fb6a965c6e3cfac83e999827249cdac00bbe096c3fc8
4
- data.tar.gz: dc352220e6220adc7555be9064855990f6171938621634db7eca177bf6ede15f
3
+ metadata.gz: 6a3f2a2c2ed72f290759aaa09d8319f2b8493ad872f2842b9b00f93db0f3023c
4
+ data.tar.gz: 1db00c50a1469d3851b8e0e90dcb56fe5a75a031a3662ffb615bb4db13fb5c77
5
5
  SHA512:
6
- metadata.gz: 18344af3842f3a6e1198bb29b85165ac8dd72a5b9de990a6c4d690882792b63b8cd29c2440293bbdefc7b3b1980334b0fba3da053f302d708ee1348451a9d4f7
7
- data.tar.gz: 20a5236e50e545c04df1e8de38187c92386dde543b76888681d3209fe9a05e46aa2dc38faa24b806523c034e899e250ecac9a7f351c91339f693001393b69f5c
6
+ metadata.gz: 99b41639952e0dad4f9e79c64481c80d824d70458e13943ea35ddc7db89a4fa543cc50190b6b1d8ea055977c09a78d15beb042316fbb2ed4008281825c150ab3
7
+ data.tar.gz: 82dfaf0c8dda03b3f411be18d542123c4caca4faed322cfe3034ca785788c08305c0a44860fd558e5affa680cc5cae77bb1af5f33247cc38b025a42f4655a2a7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # [v1.1.1](https://github.com/Muriel-Salvan/secret_string/compare/v1.1.0...v1.1.1) (2021-08-13 09:59:55)
2
+
3
+ ### Patches
4
+
5
+ * [[Fix] [#2] Handle frozen strings with correct exception messages before using them](https://github.com/Muriel-Salvan/secret_string/commit/b3e21e57613a6d39feca2118d272264cb77bdb5f)
6
+
1
7
  # [v1.1.0](https://github.com/Muriel-Salvan/secret_string/compare/v1.0.1...v1.1.0) (2021-07-07 10:21:42)
2
8
 
3
9
  ### Features
data/lib/secret_string.rb CHANGED
@@ -12,6 +12,8 @@ class SecretString
12
12
  # Parameters::
13
13
  # * *secret* (String): The secret to erase from memory
14
14
  def erase(secret)
15
+ raise 'Can\'t erase a frozen string' if secret.frozen?
16
+
15
17
  secret_size = secret.bytesize
16
18
  io = StringIO.new("\0" * secret_size)
17
19
  io.read(secret_size, secret)
@@ -21,16 +23,20 @@ class SecretString
21
23
  # Make sure the String will be erased at the end of its access.
22
24
  #
23
25
  # Parameters::
24
- # * *str* (String): String to protect
26
+ # * *str* (String): String to protect, unfrozen
25
27
  # * *silenced_str* (String): The protected representation of this string [default: 'XXXXX']
26
28
  # * Proc: Code called with the string secured
27
29
  # * Parameters::
28
30
  # * *secretstring* (SecretString): The secret string
29
31
  def protect(str, silenced_str: 'XXXXX')
30
- secret_string = SecretString.new(str, silenced_str: silenced_str)
31
- yield secret_string
32
- ensure
33
- secret_string.erase
32
+ raise 'Can\'t protect a frozen string' if str.frozen?
33
+
34
+ begin
35
+ secret_string = SecretString.new(str, silenced_str: silenced_str)
36
+ yield secret_string
37
+ ensure
38
+ secret_string.erase
39
+ end
34
40
  end
35
41
 
36
42
  end
@@ -38,9 +44,11 @@ class SecretString
38
44
  # Constructor
39
45
  #
40
46
  # Parameters::
41
- # * *str* (String): The original string to protect
47
+ # * *str* (String): The original string to protect, unfrozen
42
48
  # * *silenced_str* (String): The silenced representation of this string [default: 'XXXXX']
43
49
  def initialize(str, silenced_str: 'XXXXX')
50
+ raise 'Can\'t silence a frozen string' if str.frozen?
51
+
44
52
  @str = str
45
53
  # Make sure we manipulate @str without cloning or modifying it from now on.
46
54
  @silenced_str = silenced_str
@@ -1,5 +1,5 @@
1
1
  class SecretString
2
2
 
3
- VERSION = '1.1.0'
3
+ VERSION = '1.1.1'
4
4
 
5
5
  end
@@ -39,6 +39,14 @@ describe SecretString do
39
39
 
40
40
  end
41
41
 
42
+ context 'with a silenced frozen string' do
43
+
44
+ it 'fails to initialize a secret string frozen' do
45
+ expect { described_class.new('MySecret'.freeze, silenced_str: 'SilencedString') }.to raise_error 'Can\'t silence a frozen string'
46
+ end
47
+
48
+ end
49
+
42
50
  describe 'erase' do
43
51
 
44
52
  it 'erases a String' do
@@ -47,6 +55,11 @@ describe SecretString do
47
55
  expect(str).not_to eq 'MySecret'
48
56
  end
49
57
 
58
+ it 'fails to erase a frozen String' do
59
+ str = 'MySecret'.freeze
60
+ expect { described_class.erase(str) }.to raise_error 'Can\'t erase a frozen string'
61
+ end
62
+
50
63
  end
51
64
 
52
65
  describe 'protect' do
@@ -61,6 +74,17 @@ describe SecretString do
61
74
  expect(str.to_s).not_to eq 'MySecret'
62
75
  end
63
76
 
77
+ it 'fails to protect a frozen String' do
78
+ str = 'MySecret'.freeze
79
+ called = false
80
+ expect do
81
+ described_class.protect(str, silenced_str: 'SilencedString') do
82
+ called = true
83
+ end
84
+ end.to raise_error 'Can\'t protect a frozen string'
85
+ expect(called).to eq false
86
+ end
87
+
64
88
  end
65
89
 
66
90
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: secret_string
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-07 00:00:00.000000000 Z
11
+ date: 2021-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -72,9 +72,9 @@ email:
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files:
75
+ - CHANGELOG.md
75
76
  - README.md
76
77
  - LICENSE.md
77
- - CHANGELOG.md
78
78
  files:
79
79
  - CHANGELOG.md
80
80
  - LICENSE.md