crumbl 0.0.4 → 0.0.5
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 +13 -5
- data/README.md +29 -7
- data/bin/crumbl +25 -11
- data/crumbl.gemspec +4 -4
- data/lib/crumbl/base.rb +35 -16
- data/lib/crumbl/version.rb +2 -2
- data/test/test_crumbl.rb +45 -18
- metadata +19 -19
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzQ4NDViMWE2Y2RhMDc5ZmI3YzJlN2VhNzdlMjM1ODBiM2M5ZmQyOQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTNhMTQwMmVlY2YyMjNlNDk0YzBlNGQ0ZTM1OGM5YjJmMDA4ZWI3OQ==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YzBmZjZiMDQyZjFjMWI4ZWJiN2I1NmUxODA2OWVjNzgzZTc4NjdlYzk1NjNi
|
10
|
+
NjQ0NDBlOWNiYjA2MTUzMzNkNmRlZjg4ZDkyNzc2MDNjNDE3MDk5OTdlNmM2
|
11
|
+
MWJmODlhYTgxZDQyODdhZTIyMWQ5MTcxZmZlNWQ5YmY5YWJjYWE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
N2ZmNmRhMjA3ZjBjZWNjN2ZhNzU1YmMzNmY3M2Q4YWZhODZkYTFkZjJiN2Rk
|
14
|
+
Y2E3NDE3ZWJiZTk4MWU5YjhmYWQ2MmZjMDE4YTU5M2ZiNDkwNDE1YmI2OTQ5
|
15
|
+
NTU5Yjk3ZTE4N2IwNTljODcxNjEyMWIwNzliZjhkN2ZmY2VkY2M=
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
crumbl
|
2
2
|
============
|
3
3
|
|
4
|
-
Command line tool for reading and
|
4
|
+
Command line tool for reading and writing encoded or encrypted Rails sessions
|
5
5
|
|
6
6
|
[](https://travis-ci.org/dlanner/crumbl)
|
7
7
|
|
@@ -13,8 +13,8 @@ Command line tool for reading and manipulating encoded or encrypted Rails cookie
|
|
13
13
|
#### Decrypt Rails 4 encrypted cookie:
|
14
14
|
|
15
15
|
```
|
16
|
-
$ crumbl decrypt "secret key base"
|
17
|
-
{
|
16
|
+
$ crumbl decrypt "secret key base" V25qdmEwZVp3ME9HNXU5ZkxzM2srQlFrcU1FQ3dGYit1YmtlRVVnVVRROD0tLTI0U2t1cXZhNDhucGtxMnIyVTFXN2c9PQ==--62bb4aa196b53de5cc993e6377be37d704aaf372
|
17
|
+
{:session_type=>"user"}
|
18
18
|
```
|
19
19
|
|
20
20
|
#### Encrypt Rails 4 cookie:
|
@@ -22,14 +22,14 @@ $ crumbl decrypt "secret key base" RWRWZ0xHSEsrNmx1TlZFOEpmcCtNVEY4QjdKelNETWlNd
|
|
22
22
|
$ crumbl encrypt "secret key base"
|
23
23
|
Data to encrypt:
|
24
24
|
crumbl> {:session_type=>"admin"}
|
25
|
-
=>
|
25
|
+
=> Z1FpV2FHRjVXQmtRQUJiamo4Vm1XSThpK0xVMlVNSUVFblpRODAvcFA0WT0tLWNlSW4zdzM1VGNmNHZNR1pSVUxMaUE9PQ==--da1cab0cf5b4a6429c9afba06294dcee5da32172
|
26
26
|
```
|
27
27
|
|
28
28
|
#### Decode Rails 3 signed cookie:
|
29
29
|
|
30
30
|
```
|
31
|
-
#
|
32
|
-
{
|
31
|
+
# crumbl decode BAhJIh17OnNlc3Npb25fdHlwZT0+ImFkbWluIn0GOgZFVA==--4f4881f111cd39dc06b8189580088b1472daf045
|
32
|
+
{:session_type=>"admin"}
|
33
33
|
```
|
34
34
|
|
35
35
|
#### Encode Rails 3 signed cookie:
|
@@ -38,6 +38,28 @@ crumbl> {:session_type=>"admin"}
|
|
38
38
|
$ crumbl encode "signing key"
|
39
39
|
Data to encode:
|
40
40
|
crumbl> {:session_type=>"admin"}
|
41
|
-
=>
|
41
|
+
=> BAhJIh17OnNlc3Npb25fdHlwZT0+ImFkbWluIn0GOgZFVA==--4f4881f111cd39dc06b8189580088b1472daf045
|
42
42
|
|
43
43
|
```
|
44
|
+
|
45
|
+
# Options
|
46
|
+
|
47
|
+
#### JSON Input:
|
48
|
+
```
|
49
|
+
$ crumbl encrypt "secret key base"
|
50
|
+
Data to encrypt:
|
51
|
+
crumbl> {"allowed_ip": "1.2.3.4"}
|
52
|
+
=> K0hjc1FYdW9hUWVkRFA2MFhHVFE4dmhWalVCSndITWtlanhVRW1ZYmM3TT0tLXhvQm1EZWZhRnZLT3E3SFgzQTFhU3c9PQ==--b9e14fdf3c4f216824a3336079853b63cbaf5d47
|
53
|
+
```
|
54
|
+
|
55
|
+
|
56
|
+
#### Command-Line Options
|
57
|
+
```
|
58
|
+
$ crumbl help
|
59
|
+
Commands:
|
60
|
+
crumbl decode [COOKIE] # Decode a Rails 3 cookie [COOKIE]
|
61
|
+
crumbl decrypt [KEY BASE] [COOKIE] # Decrypt Rails 4 [COOKIE] using secret key base [KEY BASE]
|
62
|
+
crumbl encode [KEY] # Encode [DATA] as a Rails 3 cookie signed with secret key [KEY]
|
63
|
+
crumbl encrypt [KEY BASE] # Encrypt Rails 4 [DATA] using secret key base [KEY BASE]
|
64
|
+
crumbl help [COMMAND] # Describe available commands or one specific command
|
65
|
+
```
|
data/bin/crumbl
CHANGED
@@ -12,33 +12,43 @@ end
|
|
12
12
|
class CrumblCmd < Thor
|
13
13
|
desc "decode [COOKIE]", "Decode a Rails 3 cookie [COOKIE]"
|
14
14
|
def decode(cookie)
|
15
|
-
puts Crumbl.decode cookie
|
15
|
+
puts Crumbl.new.decode cookie
|
16
16
|
end
|
17
17
|
|
18
18
|
desc "encode [KEY]", "Encode [DATA] as a Rails 3 cookie signed with secret key [KEY]"
|
19
19
|
def encode(key)
|
20
20
|
puts "Data to encode: "
|
21
21
|
data = read_eval
|
22
|
-
encoded = Crumbl.encode data, key
|
22
|
+
encoded = Crumbl.new.encode data, key
|
23
23
|
show_result encoded
|
24
24
|
end
|
25
25
|
|
26
26
|
desc "decrypt [KEY BASE] [COOKIE]", "Decrypt Rails 4 [COOKIE] using secret key base [KEY BASE]"
|
27
|
-
method_option :iterations, :aliases => "-i",
|
28
|
-
method_option :encrypted_cookie_salt, :aliases => "-e"
|
29
|
-
method_option :encrypted_signed_cookie_salt, :aliases => "-s"
|
27
|
+
method_option :iterations, :aliases => "-i", :type => :numeric
|
28
|
+
method_option :encrypted_cookie_salt, :aliases => "-e"
|
29
|
+
method_option :encrypted_signed_cookie_salt, :aliases => "-s"
|
30
30
|
def decrypt(secret_key_base, cookie)
|
31
|
-
|
31
|
+
crumbl = Crumbl.new do |opts|
|
32
|
+
opts[:iterations] = options[:iterations]
|
33
|
+
opts[:encrypted_cookie_salt] = options[:encrypted_cookie_salt]
|
34
|
+
opts[:encrypted_signed_cookie_salt] = options[:encrypted_signed_cookie_salt]
|
35
|
+
end
|
36
|
+
puts crumbl.decrypt cookie, secret_key_base
|
32
37
|
end
|
33
38
|
|
34
39
|
desc "encrypt [KEY BASE]", "Encrypt Rails 4 [DATA] using secret key base [KEY BASE]"
|
35
|
-
method_option :iterations, :aliases => "-i", :
|
36
|
-
method_option :encrypted_cookie_salt, :aliases => "-e"
|
37
|
-
method_option :encrypted_signed_cookie_salt, :aliases => "-s"
|
40
|
+
method_option :iterations, :aliases => "-i", :type => :numeric
|
41
|
+
method_option :encrypted_cookie_salt, :aliases => "-e"
|
42
|
+
method_option :encrypted_signed_cookie_salt, :aliases => "-s"
|
38
43
|
def encrypt(secret_key_base)
|
39
44
|
puts "Data to encrypt: "
|
40
45
|
data = read_eval
|
41
|
-
|
46
|
+
crumbl = Crumbl.new do |opts|
|
47
|
+
opts[:iterations] = options[:iterations]
|
48
|
+
opts[:encrypted_cookie_salt] = options[:encrypted_cookie_salt]
|
49
|
+
opts[:encrypted_signed_cookie_salt] = options[:encrypted_signed_cookie_salt]
|
50
|
+
end
|
51
|
+
encrypted = crumbl.encrypt data, secret_key_base
|
42
52
|
show_result encrypted
|
43
53
|
end
|
44
54
|
|
@@ -46,7 +56,11 @@ class CrumblCmd < Thor
|
|
46
56
|
def read_eval
|
47
57
|
print "crumbl> "
|
48
58
|
input = get_input
|
49
|
-
|
59
|
+
if input.is_json?
|
60
|
+
result = JSON.parse(input)
|
61
|
+
else
|
62
|
+
result = input
|
63
|
+
end
|
50
64
|
end
|
51
65
|
|
52
66
|
def show_result result
|
data/crumbl.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.name = 'crumbl'
|
8
8
|
s.version = Crumbl::VERSION
|
9
9
|
s.date = '2014-10-08'
|
10
|
-
s.summary = "Read and
|
11
|
-
s.description = "Command line tool for reading and
|
10
|
+
s.summary = "Read and write encoded or encrypted Rails cookies"
|
11
|
+
s.description = "Command line tool for reading and writing encoded or encrypted Rails cookies"
|
12
12
|
s.authors = ["David Lanner"]
|
13
13
|
s.email = 'dhlanner2@gmail.com'
|
14
14
|
s.files = `git ls-files -z`.split("\x0")
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.homepage =
|
19
19
|
'https://github.com/dlanner/crumbl'
|
20
20
|
s.license = 'MIT'
|
21
|
-
s.
|
21
|
+
s.add_development_dependency "minitest", "~> 5"
|
22
22
|
s.add_runtime_dependency "thor"
|
23
|
-
s.add_runtime_dependency "activesupport", '~> 4.
|
23
|
+
s.add_runtime_dependency "activesupport", '~> 4.2.0'
|
24
24
|
end
|
data/lib/crumbl/base.rb
CHANGED
@@ -1,34 +1,53 @@
|
|
1
1
|
require 'active_support/all'
|
2
|
-
require 'rack'
|
3
2
|
|
4
|
-
|
3
|
+
class Crumbl
|
5
4
|
|
6
5
|
DEFAULT_ITERATIONS = 1000
|
7
6
|
DEFAULT_ENCRYPTED_COOKIE_SALT = "encrypted cookie"
|
8
7
|
DEFAULT_ENCRYPTED_SIGNED_COOKIE_SALT = "signed encrypted cookie"
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
attr_accessor :options
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@options = {}
|
13
|
+
yield @options if block_given?
|
14
|
+
options[:iterations] ||= DEFAULT_ITERATIONS
|
15
|
+
options[:encrypted_cookie_salt] ||= DEFAULT_ENCRYPTED_COOKIE_SALT
|
16
|
+
options[:encrypted_signed_cookie_salt] ||= DEFAULT_ENCRYPTED_SIGNED_COOKIE_SALT
|
17
|
+
end
|
18
|
+
|
19
|
+
def decode cookie
|
20
|
+
Marshal.load(Base64.decode64(cookie))
|
12
21
|
end
|
13
22
|
|
14
|
-
def
|
23
|
+
def encode data, key
|
15
24
|
cookie_verifier = ActiveSupport::MessageVerifier.new(key)
|
16
25
|
cookie_verifier.generate data
|
17
26
|
end
|
18
27
|
|
19
|
-
def
|
20
|
-
|
21
|
-
secret = key_generator.generate_key(encrypted_cookie_salt)
|
22
|
-
sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt)
|
23
|
-
encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
|
28
|
+
def decrypt cookie, secret_key_base
|
29
|
+
encryptor = build_message_encryptor(secret_key_base)
|
24
30
|
encryptor.decrypt_and_verify(cookie)
|
25
31
|
end
|
26
32
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
def encrypt data, secret_key_base
|
34
|
+
encryptor = build_message_encryptor(secret_key_base)
|
35
|
+
encryptor.encrypt_and_sign(data.to_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def build_message_encryptor secret_key_base
|
41
|
+
key_generator = ActiveSupport::KeyGenerator.new(secret_key_base, iterations: options[:iterations])
|
42
|
+
secret = key_generator.generate_key(options[:encrypted_cookie_salt])
|
43
|
+
sign_secret = key_generator.generate_key(options[:encrypted_signed_cookie_salt])
|
44
|
+
ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
class String
|
50
|
+
def is_json?
|
51
|
+
!!JSON.parse(self) rescue false
|
33
52
|
end
|
34
53
|
end
|
data/lib/crumbl/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.0.
|
1
|
+
class Crumbl
|
2
|
+
VERSION = "0.0.5"
|
3
3
|
end
|
data/test/test_crumbl.rb
CHANGED
@@ -10,47 +10,74 @@ class CrumblTest < Minitest::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_decrypt_encrypted
|
13
|
-
encrypted = Crumbl.encrypt(@data, @key_base)
|
14
|
-
decrypted = Crumbl.decrypt(encrypted, @key_base)
|
15
|
-
assert_equal @data, decrypted
|
13
|
+
encrypted = Crumbl.new.encrypt(@data, @key_base)
|
14
|
+
decrypted = Crumbl.new.decrypt(encrypted, @key_base)
|
15
|
+
assert_equal @data, eval(decrypted)
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_custom_iterations_equal
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
crumbl = Crumbl.new do |opts|
|
20
|
+
opts[:iterations] = @custom_iterations
|
21
|
+
opts[:encrypted_cookie_salt] = @custom_encrypted_cookie_salt
|
22
|
+
opts[:encrypted_signed_cookie_salt] = @custom_encrypted_signed_cookie_salt
|
23
|
+
end
|
24
|
+
encrypted = crumbl.encrypt(@data, @key_base)
|
25
|
+
decrypted = crumbl.decrypt(encrypted, @key_base)
|
26
|
+
assert_equal @data, eval(decrypted)
|
22
27
|
end
|
23
28
|
|
24
29
|
def test_custom_iterations_not_equal
|
25
|
-
encrypted = Crumbl.encrypt(@data, @key_base)
|
30
|
+
encrypted = Crumbl.new.encrypt(@data, @key_base)
|
26
31
|
assert_raises ActiveSupport::MessageVerifier::InvalidSignature do
|
27
|
-
Crumbl.
|
32
|
+
crumbl = Crumbl.new do |opts|
|
33
|
+
opts[:iterations] = @custom_iterations
|
34
|
+
end
|
35
|
+
crumbl.decrypt(encrypted, @key_base)
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
31
39
|
def test_custom_encrypted_cookie_salt_equal
|
32
|
-
|
33
|
-
|
34
|
-
|
40
|
+
crumbl = Crumbl.new do |opts|
|
41
|
+
opts[:encrypted_cookie_salt] = @custom_encrypted_cookie_salt
|
42
|
+
end
|
43
|
+
encrypted = crumbl.encrypt(@data, @key_base)
|
44
|
+
decrypted = crumbl.decrypt(encrypted, @key_base)
|
45
|
+
assert_equal @data, eval(decrypted)
|
35
46
|
end
|
36
47
|
|
37
48
|
def test_custom_encrypted_cookie_salt_not_equal
|
38
|
-
encrypted = Crumbl.encrypt(@data, @key_base)
|
49
|
+
encrypted = Crumbl.new.encrypt(@data, @key_base)
|
39
50
|
assert_raises ActiveSupport::MessageEncryptor::InvalidMessage do
|
40
|
-
Crumbl.
|
51
|
+
crumbl = Crumbl.new do |opts|
|
52
|
+
opts[:encrypted_cookie_salt] = @custom_encrypted_cookie_salt
|
53
|
+
end
|
54
|
+
crumbl.decrypt(encrypted, @key_base)
|
41
55
|
end
|
42
56
|
end
|
43
57
|
|
44
58
|
def test_custom_encrypted_signed_cookie_salt_equal
|
45
|
-
|
46
|
-
|
47
|
-
|
59
|
+
crumbl = Crumbl.new do |opts|
|
60
|
+
opts[:encrypted_signed_cookie_salt] = @custom_encrypted_signed_cookie_salt
|
61
|
+
end
|
62
|
+
encrypted = crumbl.encrypt(@data, @key_base)
|
63
|
+
decrypted = crumbl.decrypt(encrypted, @key_base)
|
64
|
+
assert_equal @data, eval(decrypted)
|
48
65
|
end
|
49
66
|
|
50
67
|
def test_custom_encrypted_signed_cookie_salt_not_equal
|
51
|
-
encrypted = Crumbl.encrypt(@data, @key_base)
|
68
|
+
encrypted = Crumbl.new.encrypt(@data, @key_base)
|
52
69
|
assert_raises ActiveSupport::MessageVerifier::InvalidSignature do
|
53
|
-
|
70
|
+
crumbl = Crumbl.new do |opts|
|
71
|
+
opts[:encrypted_signed_cookie_salt] = @custom_encrypted_signed_cookie_salt
|
72
|
+
end
|
73
|
+
crumbl.decrypt(encrypted, @key_base)
|
54
74
|
end
|
55
75
|
end
|
76
|
+
|
77
|
+
def test_accepts_json
|
78
|
+
json_data = @data.to_json.to_s
|
79
|
+
encrypted = Crumbl.new.encrypt(json_data, @key_base)
|
80
|
+
decrypted = Crumbl.new.decrypt(encrypted, @key_base)
|
81
|
+
assert_equal HashWithIndifferentAccess.new(@data), HashWithIndifferentAccess.new(JSON.parse(decrypted))
|
82
|
+
end
|
56
83
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crumbl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Lanner
|
@@ -11,48 +11,48 @@ cert_chain: []
|
|
11
11
|
date: 2014-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: minitest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '5'
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: thor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ! '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4.
|
47
|
+
version: 4.2.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 4.
|
55
|
-
description: Command line tool for reading and
|
54
|
+
version: 4.2.0
|
55
|
+
description: Command line tool for reading and writing encoded or encrypted Rails
|
56
56
|
cookies
|
57
57
|
email: dhlanner2@gmail.com
|
58
58
|
executables:
|
@@ -60,8 +60,8 @@ executables:
|
|
60
60
|
extensions: []
|
61
61
|
extra_rdoc_files: []
|
62
62
|
files:
|
63
|
-
-
|
64
|
-
-
|
63
|
+
- .gitignore
|
64
|
+
- .travis.yml
|
65
65
|
- Gemfile
|
66
66
|
- LICENSE
|
67
67
|
- README.md
|
@@ -83,12 +83,12 @@ require_paths:
|
|
83
83
|
- bin
|
84
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
|
-
- -
|
86
|
+
- - ! '>='
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '0'
|
89
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
@@ -96,6 +96,6 @@ rubyforge_project:
|
|
96
96
|
rubygems_version: 2.4.2
|
97
97
|
signing_key:
|
98
98
|
specification_version: 4
|
99
|
-
summary: Read and
|
99
|
+
summary: Read and write encoded or encrypted Rails cookies
|
100
100
|
test_files:
|
101
101
|
- test/test_crumbl.rb
|