secure_string 1.1.2 → 1.2.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.
- data/README.rdoc +8 -3
- data/lib/securize_string/base64_methods.rb +25 -9
- data/spec/base64_methods_spec.rb +20 -10
- data/spec/example_spec.rb +2 -2
- data/spec/spec_helper.rb +9 -1
- metadata +4 -14
data/README.rdoc
CHANGED
@@ -79,7 +79,7 @@ Additionally, you can get at the byte data in various ways:
|
|
79
79
|
|
80
80
|
ss.to_hex --> "48656c6c6f20576f726c6421"
|
81
81
|
ss.to_i --> 22405534230753928650781647905
|
82
|
-
ss.to_base64 --> "SGVsbG8gV29ybGQh"
|
82
|
+
ss.to_base64 --> "SGVsbG8gV29ybGQh\n"
|
83
83
|
|
84
84
|
One can initialize a SecureString from any of these types like so:
|
85
85
|
|
@@ -99,7 +99,7 @@ All of these create equal-valued strings to <tt>"HelloWorld!"</tt>.
|
|
99
99
|
|
100
100
|
The SecureString::Base64Methods module adds +to_base64+, which we've seen:
|
101
101
|
|
102
|
-
SecureString.new("Hello World!").to_base64 --> "SGVsbG8gV29ybGQh"
|
102
|
+
SecureString.new("Hello World!").to_base64 --> "SGVsbG8gV29ybGQh\n"
|
103
103
|
|
104
104
|
It also adds +from_base64+, which can decode a Base64 encoded string. The
|
105
105
|
following example shows the various ways of decoding Bas64 data:
|
@@ -234,7 +234,12 @@ or directly via e-mail at:
|
|
234
234
|
mailto:jeff@paploo.net
|
235
235
|
|
236
236
|
= Version History
|
237
|
-
[1.
|
237
|
+
[1.2.0 - 2010-May-17] Re-wrote Base64 module to address problems with RFC 2045 vs. RFC 4648 compatibility.
|
238
|
+
* Added testing against source strings that generate incompatible encodings between RFC 2045 and RFC 4648.
|
239
|
+
* (FEATURE) added option to strip newlines from the returned base64 string.
|
240
|
+
* (CHANGE) to_base64 defaults to the standard Base64 instead of websafe Base64.
|
241
|
+
* (FIX) added option to decode as websafe Base64.
|
242
|
+
[1.1.2 - 2010-Nov-08] Minor gemspec file change for compatibility with bundler.
|
238
243
|
[1.1.1 - 2010-Nov-05] Backed down requirements to ruby 1.9.x; Bugfixes and minor changes.
|
239
244
|
* Tested in 1.9.1 and 1.9.2.
|
240
245
|
* Added some documentation and tests on String encodings.
|
@@ -13,17 +13,33 @@ module SecurizeString
|
|
13
13
|
# SecurizeString::Base64Methods to a class.
|
14
14
|
module InstanceMethods
|
15
15
|
|
16
|
-
# Encodes to Base64.
|
17
|
-
#
|
18
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
# Encodes to Base64.
|
17
|
+
#
|
18
|
+
# By deault, this is the normal RFC 2045 Base64 encoding.
|
19
|
+
#
|
20
|
+
# If the <tt>url_safe</tt> option is set to true, then the RFC 4648
|
21
|
+
# encoding is used, which uses a slightly different encoding mechanism
|
22
|
+
# which is sometimes compatible, but often incompatible with RFC 2045.
|
23
|
+
#
|
24
|
+
# If the <tt>nobreak</tt> option is set to true, all line feeds are
|
25
|
+
# removed from the input.
|
26
|
+
def to_base64(opts={})
|
27
|
+
raise ArgumentError, "__method__ expects an argument hash but got #{opts.class.name}" unless opts.kind_of?(Hash)
|
28
|
+
data = (opts[:url_safe] ? Base64.urlsafe_encode64(self) : Base64.encode64(self))
|
29
|
+
data.delete!("\n\r") if opts[:no_break] # Delete on \n and \r is about 3x faster than gsub on /\s+/.
|
30
|
+
return data
|
22
31
|
end
|
23
32
|
|
24
|
-
#
|
25
|
-
|
26
|
-
|
33
|
+
# Decodes from base64.
|
34
|
+
#
|
35
|
+
# By default, this decodes the normal RFC 2045 Base64.
|
36
|
+
#
|
37
|
+
# If the <tt>url_safe</tt> option is set to true, then it decodes the
|
38
|
+
# RFC 4648 encoding, which uses a slightly different encoding mechanism
|
39
|
+
# which is sometimes compatible, but often incompatible with RFC 2045.
|
40
|
+
def from_base64(opts={})
|
41
|
+
raise ArgumentError, "__method__ expects an argument hash but got #{opts.class.name}" unless opts.kind_of?(Hash)
|
42
|
+
return (opts[:url_safe] ? Base64.urlsafe_decode64(self) : Base64.decode64(self))
|
27
43
|
end
|
28
44
|
|
29
45
|
end
|
data/spec/base64_methods_spec.rb
CHANGED
@@ -11,27 +11,30 @@ describe "SecureString" do
|
|
11
11
|
it 'should convert self to Base64; not URL safe' do
|
12
12
|
@messages.each do |message|
|
13
13
|
ss = SecureString.new(message[:string])
|
14
|
-
#
|
15
|
-
ss.to_base64
|
16
|
-
# Now, compare the data itself (no line-feeds).
|
17
|
-
ss.to_base64(false).delete("\n").should == message[:base64].delete("\n")
|
14
|
+
# Compare the data with the base ruby methods.
|
15
|
+
ss.to_base64.should == Base64.encode64(message[:string])
|
18
16
|
end
|
19
17
|
end
|
20
18
|
|
21
19
|
it 'should convert self to Base64; URL safe' do
|
22
20
|
@messages.each do |message|
|
23
21
|
ss = SecureString.new(message[:string])
|
24
|
-
#
|
25
|
-
ss.to_base64(true).
|
26
|
-
# Now compare the result with the line-feed less expected value.
|
27
|
-
ss.to_base64(true).should == message[:base64].delete("\n")
|
22
|
+
# Compare the result with the base ruby methods.
|
23
|
+
ss.to_base64(:url_safe => true).should == Base64.urlsafe_encode64(message[:string])
|
28
24
|
end
|
29
25
|
end
|
30
26
|
|
31
|
-
it 'should
|
27
|
+
it 'should convert base64 with no line breaks' do
|
32
28
|
@messages.each do |message|
|
33
29
|
ss = SecureString.new(message[:string])
|
34
|
-
ss.to_base64.should ==
|
30
|
+
ss.to_base64(:no_break => true).should == message[:base64].delete("\n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should default to NOT URL safe' do
|
35
|
+
@messages.each do |message|
|
36
|
+
ss = SecureString.new(message[:string])
|
37
|
+
ss.to_base64.should == ss.to_base64(:url_safe => false)
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
@@ -42,6 +45,13 @@ describe "SecureString" do
|
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
48
|
+
it 'should gracefully error if you provide something other than a hash to options.' do
|
49
|
+
@messages.each do |message|
|
50
|
+
ss = SecureString.new(message[:string])
|
51
|
+
(lambda {ss.to_base64(true)}).should raise_error(ArgumentError)
|
52
|
+
(lambda {ss.from_base64(true)}).should raise_error(ArgumentError)
|
53
|
+
end
|
54
|
+
end
|
45
55
|
end
|
46
56
|
|
47
57
|
end
|
data/spec/example_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe "Examples" do
|
|
10
10
|
|
11
11
|
ss.to_hex.should == "48656c6c6f20576f726c6421"
|
12
12
|
ss.to_i.should == 22405534230753928650781647905
|
13
|
-
ss.to_base64.should == "SGVsbG8gV29ybGQh"
|
13
|
+
ss.to_base64.should == "SGVsbG8gV29ybGQh\n"
|
14
14
|
|
15
15
|
ss1 = SecureString.new(:data, "Hello World!")
|
16
16
|
ss2 = SecureString.new(:hex, "48656c6c6f20576f726c6421")
|
@@ -24,7 +24,7 @@ describe "Examples" do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'should perform the base64 example' do
|
27
|
-
SecureString.new("Hello World!").to_base64.should == "SGVsbG8gV29ybGQh"
|
27
|
+
SecureString.new("Hello World!").to_base64.should == "SGVsbG8gV29ybGQh\n"
|
28
28
|
|
29
29
|
(SecureString.new(:base64, "SGVsbG8gV29ybGQh") == "Hello World!" ).should be_true
|
30
30
|
(SecureString.new("SGVsbG8gV29ybGQh") == "Hello World!" ).should be_false
|
data/spec/spec_helper.rb
CHANGED
@@ -8,7 +8,7 @@ MESSAGES = [
|
|
8
8
|
:string => "Hello",
|
9
9
|
:hex => "48656c6c6f",
|
10
10
|
:int => 310939249775,
|
11
|
-
:base64 => "SGVsbG8="
|
11
|
+
:base64 => "SGVsbG8=" # Leave off the \n on purpose so that we can make sure it handles that case appropriately when instantiating using base64.
|
12
12
|
},
|
13
13
|
|
14
14
|
{
|
@@ -16,5 +16,13 @@ MESSAGES = [
|
|
16
16
|
:hex => "5468697320697320612074657374206f662074686520656d657267656e63792062726f6164636173742073797374656d3b2074686973206973206f6e6c79206120746573742e",
|
17
17
|
:int => 1244344095146357680190496293767338268850834164562379171846588371816488740307922111470765515885864931093899586331709567338989540039042962957732585272476408412061178229806,
|
18
18
|
:base64 => "VGhpcyBpcyBhIHRlc3Qgb2YgdGhlIGVtZXJnZW5jeSBicm9hZGNhc3Qgc3lz\ndGVtOyB0aGlzIGlzIG9ubHkgYSB0ZXN0Lg==\n"
|
19
|
+
},
|
20
|
+
|
21
|
+
# This one tests a special case where url safe encodes differently than the standard.
|
22
|
+
{
|
23
|
+
:string => "HI?",
|
24
|
+
:hex => "48493f",
|
25
|
+
:int => 4737343,
|
26
|
+
:base64 => "SEk/\n"
|
19
27
|
}
|
20
28
|
].freeze
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: secure_string
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
version: 1.1.2
|
4
|
+
prerelease:
|
5
|
+
version: 1.2.0
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Jeff Reinecke
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
13
|
+
date: 2011-05-17 00:00:00 -07:00
|
18
14
|
default_executable:
|
19
15
|
dependencies: []
|
20
16
|
|
@@ -61,23 +57,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
57
|
requirements:
|
62
58
|
- - ">="
|
63
59
|
- !ruby/object:Gem::Version
|
64
|
-
segments:
|
65
|
-
- 1
|
66
|
-
- 9
|
67
|
-
- 0
|
68
60
|
version: 1.9.0
|
69
61
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
62
|
none: false
|
71
63
|
requirements:
|
72
64
|
- - ">="
|
73
65
|
- !ruby/object:Gem::Version
|
74
|
-
segments:
|
75
|
-
- 0
|
76
66
|
version: "0"
|
77
67
|
requirements: []
|
78
68
|
|
79
69
|
rubyforge_project:
|
80
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.5.0
|
81
71
|
signing_key:
|
82
72
|
specification_version: 3
|
83
73
|
summary: A String subclass for simple handling of binary data and encryption.
|