secure_string 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|