encrypted_store 0.2.0 → 0.2.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 +4 -4
- data/lib/encrypted_store/config.rb +132 -0
- data/lib/{ribbon/encrypted_store → encrypted_store}/crypto_hash.rb +2 -2
- data/lib/{ribbon/encrypted_store → encrypted_store}/errors.rb +2 -2
- data/lib/{ribbon/encrypted_store → encrypted_store}/instance.rb +3 -3
- data/lib/{ribbon/encrypted_store → encrypted_store}/mixins/active_record_mixin/encryption_key.rb +2 -2
- data/lib/{ribbon/encrypted_store → encrypted_store}/mixins/active_record_mixin/encryption_key_salt.rb +2 -2
- data/lib/{ribbon/encrypted_store → encrypted_store}/mixins/active_record_mixin.rb +6 -6
- data/lib/encrypted_store/mixins.rb +5 -0
- data/lib/encrypted_store/railtie.rb +21 -0
- data/lib/encrypted_store/version.rb +3 -0
- data/lib/encrypted_store.rb +28 -0
- data/lib/generators/encrypted_store/encrypt_table/encrypt_table_generator.rb +2 -2
- data/lib/generators/encrypted_store/install/install_generator.rb +2 -2
- data/lib/generators/encrypted_store/install/templates/initializer.rb +3 -3
- data/lib/generators/encrypted_store/upgrade/ZeroOneFive/zero_one_five_generator.rb +2 -2
- data/lib/tasks/encrypted_store.rake +2 -2
- metadata +16 -29
- data/lib/ribbon/encrypted_store/mixins.rb +0 -5
- data/lib/ribbon/encrypted_store/railtie.rb +0 -23
- data/lib/ribbon/encrypted_store/version.rb +0 -5
- data/lib/ribbon/encrypted_store.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f550704fe41a4ad0a8c31b2fe2090ee30100908
|
4
|
+
data.tar.gz: fdb84fa8b34644b1b1119d42e342760309873db2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e331f4483533fbf576989aeb3ef96ed5e3c6a43fc6d2d022501cdad49016a9e63d306add78701e4f19a0c014acb97283d99893064440ac98dc84fd6d55cdcfff
|
7
|
+
data.tar.gz: 1e64b1d0861ad3881d914411b79afe9b6e10467ea6b6a441981f3fe7d427219cc47e69fa258a2c3260fbb9383154ea28dfa5ae0b30a93e3928cb077da15d66b3
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module EncryptedStore
|
4
|
+
class Config
|
5
|
+
# Putting this here instead of in Errors because I may move this into a
|
6
|
+
# separate gem.
|
7
|
+
class ConfigError < StandardError; end
|
8
|
+
class NotAddableError < ConfigError; end
|
9
|
+
|
10
|
+
class ProcArray < Array
|
11
|
+
def push(*procs)
|
12
|
+
raise ConfigError, "May only add blocks" unless procs.all? { |p| p.is_a?(Proc) }
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(*args, &block)
|
17
|
+
map { |x| x.call(*args, &block) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class UndefinedValue
|
22
|
+
def !
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :name
|
28
|
+
|
29
|
+
def initialize(name=nil, &block)
|
30
|
+
@name = name
|
31
|
+
define(&block) if block_given?
|
32
|
+
end
|
33
|
+
|
34
|
+
def define(&block)
|
35
|
+
case block.arity
|
36
|
+
when 0 then instance_eval(&block)
|
37
|
+
when 1 then block.call(self)
|
38
|
+
else raise ConfigError, 'invalid config block arity'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Deep dup all the values.
|
43
|
+
def dup
|
44
|
+
super.tap do |new_config|
|
45
|
+
new_config.instance_variable_set(
|
46
|
+
:@_nested,
|
47
|
+
Hash[
|
48
|
+
_nested.map { |key, object|
|
49
|
+
[
|
50
|
+
key,
|
51
|
+
object.is_a?(Config) ? object.dup : object
|
52
|
+
]
|
53
|
+
}
|
54
|
+
]
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def method_missing(meth, *args, &block)
|
60
|
+
meth_str = meth.to_s
|
61
|
+
|
62
|
+
if /^(\w+)\=$/.match(meth_str)
|
63
|
+
_set($1, *args, &block)
|
64
|
+
elsif args.length > 0 || block_given?
|
65
|
+
_add(meth, *args, &block)
|
66
|
+
elsif /^(\w+)\?$/.match(meth_str)
|
67
|
+
!!_get($1)
|
68
|
+
else
|
69
|
+
_get_or_create_namespace(meth)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def merge_hash!(hash)
|
74
|
+
hash.each { |k, v|
|
75
|
+
if v.is_a?(Hash)
|
76
|
+
send(k).merge_hash!(v)
|
77
|
+
else
|
78
|
+
send("#{k}=", v)
|
79
|
+
end
|
80
|
+
}
|
81
|
+
|
82
|
+
self
|
83
|
+
end
|
84
|
+
|
85
|
+
def merge_config_file!(file)
|
86
|
+
merge_hash!(YAML.load_file(file))
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def _get(key)
|
91
|
+
_nested[key.to_sym]
|
92
|
+
end
|
93
|
+
|
94
|
+
def _get_or_create_namespace(key)
|
95
|
+
object = _get(key)
|
96
|
+
|
97
|
+
if object.is_a?(UndefinedValue)
|
98
|
+
object = _set(key, Config.new((name ? "#{name}." : '') + key.to_s))
|
99
|
+
end
|
100
|
+
|
101
|
+
object
|
102
|
+
end
|
103
|
+
|
104
|
+
def _set(key, *args, &block)
|
105
|
+
object = _args_to_object(*args, &block)
|
106
|
+
_nested[key.to_sym] = object
|
107
|
+
end
|
108
|
+
|
109
|
+
def _add(key, *args, &block)
|
110
|
+
raise NotAddableError, self.inspect if @_value && !@_value.is_a?(Array)
|
111
|
+
object = _args_to_object(*args, &block)
|
112
|
+
_set(key, object.is_a?(Proc) ? ProcArray.new : []) if !_get(key)
|
113
|
+
_get(key).push(object)
|
114
|
+
end
|
115
|
+
|
116
|
+
def _args_to_object(*args, &block)
|
117
|
+
if args.length == 1
|
118
|
+
args.first
|
119
|
+
elsif args.length > 1
|
120
|
+
args
|
121
|
+
elsif block_given?
|
122
|
+
block
|
123
|
+
else
|
124
|
+
raise ConfigError, 'must pass value or block'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def _nested
|
129
|
+
@_nested ||= Hash.new { |hash, key| hash[key] = UndefinedValue.new }
|
130
|
+
end
|
131
|
+
end # Config
|
132
|
+
end # EncryptedStore
|
@@ -2,7 +2,7 @@ require 'openssl'
|
|
2
2
|
require 'json'
|
3
3
|
require 'zlib'
|
4
4
|
|
5
|
-
module
|
5
|
+
module EncryptedStore
|
6
6
|
class CryptoHash < Hash
|
7
7
|
def initialize(data={})
|
8
8
|
super()
|
@@ -147,4 +147,4 @@ module Ribbon::EncryptedStore
|
|
147
147
|
self.class._calc_crc32(data)
|
148
148
|
end
|
149
149
|
end # CryptoHash
|
150
|
-
end #
|
150
|
+
end # EncryptedStore
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module EncryptedStore
|
2
2
|
module Errors
|
3
3
|
class Error < StandardError; end
|
4
4
|
|
@@ -13,4 +13,4 @@ module Ribbon::EncryptedStore
|
|
13
13
|
class InvalidKeySize < CryptoHashError; end
|
14
14
|
class UnsupportedVersionError < CryptoHashError; end
|
15
15
|
end # Errors
|
16
|
-
end #
|
16
|
+
end # EncryptedStore
|
@@ -1,7 +1,7 @@
|
|
1
|
-
module
|
1
|
+
module EncryptedStore
|
2
2
|
class Instance
|
3
3
|
def config(&block)
|
4
|
-
(@__config ||=
|
4
|
+
(@__config ||= Config.new).tap { |config|
|
5
5
|
if block_given?
|
6
6
|
config.define(&block)
|
7
7
|
end
|
@@ -27,4 +27,4 @@ module Ribbon::EncryptedStore
|
|
27
27
|
(@_decrypted_keys ||= {})[key_id] ||= key_model.find(key_id).decrypted_key
|
28
28
|
end
|
29
29
|
end # Instance
|
30
|
-
end #
|
30
|
+
end # EncryptedStore
|
data/lib/{ribbon/encrypted_store → encrypted_store}/mixins/active_record_mixin/encryption_key.rb
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'base64'
|
3
3
|
|
4
|
-
module
|
4
|
+
module EncryptedStore
|
5
5
|
module Mixins
|
6
6
|
module ActiveRecordMixin
|
7
7
|
class EncryptionKey < ActiveRecord::Base
|
@@ -74,4 +74,4 @@ module Ribbon::EncryptedStore
|
|
74
74
|
end # EncryptionKey
|
75
75
|
end # ActiveRecordMixin
|
76
76
|
end # Mixins
|
77
|
-
end #
|
77
|
+
end # EncryptedStore
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
|
3
|
-
module
|
3
|
+
module EncryptedStore
|
4
4
|
module Mixins
|
5
5
|
module ActiveRecordMixin
|
6
6
|
class EncryptionKeySalt < ActiveRecord::Base
|
@@ -25,4 +25,4 @@ module Ribbon::EncryptedStore
|
|
25
25
|
end # EncryptionKeySalt
|
26
26
|
end # ActiveRecordMixin
|
27
27
|
end # Mixins
|
28
|
-
end #
|
28
|
+
end # EncryptedStore
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
|
3
|
-
module
|
3
|
+
module EncryptedStore
|
4
4
|
module Mixins
|
5
5
|
module ActiveRecordMixin
|
6
|
-
autoload(:EncryptionKeySalt, '
|
7
|
-
autoload(:EncryptionKey, '
|
6
|
+
autoload(:EncryptionKeySalt, 'encrypted_store/mixins/active_record_mixin/encryption_key_salt')
|
7
|
+
autoload(:EncryptionKey, 'encrypted_store/mixins/active_record_mixin/encryption_key')
|
8
8
|
|
9
9
|
class << self
|
10
10
|
def included(base)
|
@@ -91,8 +91,8 @@ module Ribbon::EncryptedStore
|
|
91
91
|
self.encryption_key_id = record.encryption_key_id if record && record.encryption_key_id
|
92
92
|
end
|
93
93
|
|
94
|
-
iter_mag =
|
95
|
-
|
94
|
+
iter_mag = EncryptedStore.config.iteration_magnitude? ?
|
95
|
+
EncryptedStore.config.iteration_magnitude :
|
96
96
|
-1
|
97
97
|
|
98
98
|
@_reencrypting = false
|
@@ -105,4 +105,4 @@ module Ribbon::EncryptedStore
|
|
105
105
|
end
|
106
106
|
end # ActiveRecordMixin
|
107
107
|
end # Mixins
|
108
|
-
end #
|
108
|
+
end # EncryptedStore
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'encrypted_store'
|
2
|
+
require 'rails'
|
3
|
+
require 'rails/generators'
|
4
|
+
|
5
|
+
module EncryptedStore
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
railtie_name :encrypted_store
|
8
|
+
|
9
|
+
rake_tasks do
|
10
|
+
Dir[
|
11
|
+
File.expand_path("../../tasks", __FILE__) + '/**/*.rake'
|
12
|
+
].each { |rake_file| load rake_file }
|
13
|
+
end
|
14
|
+
|
15
|
+
generators do
|
16
|
+
Dir[
|
17
|
+
File.expand_path("../../generators", __FILE__) + '/**/*.rb'
|
18
|
+
].each { |generator| require generator }
|
19
|
+
end
|
20
|
+
end # Railtie
|
21
|
+
end # EncryptedStore
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'encrypted_store/version'
|
2
|
+
|
3
|
+
module EncryptedStore
|
4
|
+
require 'encrypted_store/railtie' if defined?(Rails)
|
5
|
+
autoload(:Config, 'encrypted_store/config')
|
6
|
+
autoload(:CryptoHash, 'encrypted_store/crypto_hash')
|
7
|
+
autoload(:Instance, 'encrypted_store/instance')
|
8
|
+
autoload(:Errors, 'encrypted_store/errors')
|
9
|
+
autoload(:Mixins, 'encrypted_store/mixins')
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def included(base)
|
13
|
+
if defined?(ActiveRecord) && base < ActiveRecord::Base
|
14
|
+
base.send(:include, Mixins::ActiveRecordMixin)
|
15
|
+
else
|
16
|
+
raise Errors::UnsupportedModelError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(meth, *args, &block)
|
21
|
+
instance.send(meth, *args, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def instance
|
25
|
+
@__instance ||= Instance.new
|
26
|
+
end
|
27
|
+
end # Class Methods
|
28
|
+
end # EncryptedStore
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module EncryptedStore
|
2
2
|
module Generators
|
3
3
|
class EncryptTableGenerator < Rails::Generators::Base
|
4
4
|
source_root File.expand_path('../templates', __FILE__)
|
@@ -9,4 +9,4 @@ module Ribbon::EncryptedStore
|
|
9
9
|
end
|
10
10
|
end # EncryptTableGenerator
|
11
11
|
end # Generators
|
12
|
-
end #
|
12
|
+
end # EncryptedStore
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rails/generators/active_record'
|
2
2
|
|
3
|
-
module
|
3
|
+
module EncryptedStore
|
4
4
|
module Generators
|
5
5
|
class InstallGenerator < Rails::Generators::Base
|
6
6
|
include Rails::Generators::Migration
|
@@ -23,4 +23,4 @@ module Ribbon::EncryptedStore
|
|
23
23
|
end
|
24
24
|
end # InstallEncryptedStoreGenerator
|
25
25
|
end # Generators
|
26
|
-
end #
|
26
|
+
end # EncryptedStore
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rails/generators/active_record'
|
2
2
|
|
3
|
-
module
|
3
|
+
module EncryptedStore
|
4
4
|
module Generators
|
5
5
|
module Upgrade
|
6
6
|
class ZeroOneFiveGenerator < Rails::Generators::Base
|
@@ -21,4 +21,4 @@ module Ribbon::EncryptedStore
|
|
21
21
|
end # ZeroOneFiveGenerator
|
22
22
|
end # Upgrade
|
23
23
|
end # Generators
|
24
|
-
end #
|
24
|
+
end # EncryptedStore
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'encrypted_store'
|
2
2
|
|
3
3
|
namespace :encrypted_store do
|
4
4
|
task :new_key, [:custom_key] => :environment do |t, args|
|
@@ -16,4 +16,4 @@ namespace :encrypted_store do
|
|
16
16
|
new_primary_key = EncryptedStore::Mixins::ActiveRecordMixin::EncryptionKey.rotate_keys
|
17
17
|
puts "Retired all key_ids and reencrypted records with new primary key: #{new_primary_key.id}"
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: encrypted_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Honer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-01-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bcrypt
|
@@ -31,20 +31,6 @@ dependencies:
|
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 3.1.3
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: ribbon-config
|
36
|
-
requirement: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.0
|
41
|
-
type: :runtime
|
42
|
-
prerelease: false
|
43
|
-
version_requirements: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.1.0
|
48
34
|
- !ruby/object:Gem::Dependency
|
49
35
|
name: database_cleaner
|
50
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -117,12 +103,23 @@ dependencies:
|
|
117
103
|
version: 4.0.0
|
118
104
|
description: Provides the EncryptedStore mixin
|
119
105
|
email:
|
120
|
-
- robert@
|
121
|
-
- kayvon@
|
106
|
+
- robert@payout.com
|
107
|
+
- kayvon@payout.com
|
122
108
|
executables: []
|
123
109
|
extensions: []
|
124
110
|
extra_rdoc_files: []
|
125
111
|
files:
|
112
|
+
- lib/encrypted_store.rb
|
113
|
+
- lib/encrypted_store/config.rb
|
114
|
+
- lib/encrypted_store/crypto_hash.rb
|
115
|
+
- lib/encrypted_store/errors.rb
|
116
|
+
- lib/encrypted_store/instance.rb
|
117
|
+
- lib/encrypted_store/mixins.rb
|
118
|
+
- lib/encrypted_store/mixins/active_record_mixin.rb
|
119
|
+
- lib/encrypted_store/mixins/active_record_mixin/encryption_key.rb
|
120
|
+
- lib/encrypted_store/mixins/active_record_mixin/encryption_key_salt.rb
|
121
|
+
- lib/encrypted_store/railtie.rb
|
122
|
+
- lib/encrypted_store/version.rb
|
126
123
|
- lib/generators/encrypted_store/encrypt_table/encrypt_table_generator.rb
|
127
124
|
- lib/generators/encrypted_store/install/install_generator.rb
|
128
125
|
- lib/generators/encrypted_store/install/templates/create_encryption_key_salts.rb
|
@@ -131,18 +128,8 @@ files:
|
|
131
128
|
- lib/generators/encrypted_store/upgrade/ZeroOneFive/templates/upgrade_encryption_key_salts_to_015.rb
|
132
129
|
- lib/generators/encrypted_store/upgrade/ZeroOneFive/templates/upgrade_encryption_keys_to_015.rb
|
133
130
|
- lib/generators/encrypted_store/upgrade/ZeroOneFive/zero_one_five_generator.rb
|
134
|
-
- lib/ribbon/encrypted_store.rb
|
135
|
-
- lib/ribbon/encrypted_store/crypto_hash.rb
|
136
|
-
- lib/ribbon/encrypted_store/errors.rb
|
137
|
-
- lib/ribbon/encrypted_store/instance.rb
|
138
|
-
- lib/ribbon/encrypted_store/mixins.rb
|
139
|
-
- lib/ribbon/encrypted_store/mixins/active_record_mixin.rb
|
140
|
-
- lib/ribbon/encrypted_store/mixins/active_record_mixin/encryption_key.rb
|
141
|
-
- lib/ribbon/encrypted_store/mixins/active_record_mixin/encryption_key_salt.rb
|
142
|
-
- lib/ribbon/encrypted_store/railtie.rb
|
143
|
-
- lib/ribbon/encrypted_store/version.rb
|
144
131
|
- lib/tasks/encrypted_store.rake
|
145
|
-
homepage: http://github.com/
|
132
|
+
homepage: http://github.com/payout/encrypted_store
|
146
133
|
licenses:
|
147
134
|
- BSD
|
148
135
|
metadata: {}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'ribbon/encrypted_store'
|
2
|
-
require 'rails'
|
3
|
-
require 'rails/generators'
|
4
|
-
|
5
|
-
module Ribbon
|
6
|
-
module EncryptedStore
|
7
|
-
class Railtie < Rails::Railtie
|
8
|
-
railtie_name :encrypted_store
|
9
|
-
|
10
|
-
rake_tasks do
|
11
|
-
Dir[
|
12
|
-
File.expand_path("../../../tasks", __FILE__) + '/**/*.rake'
|
13
|
-
].each { |rake_file| load rake_file }
|
14
|
-
end
|
15
|
-
|
16
|
-
generators do
|
17
|
-
Dir[
|
18
|
-
File.expand_path("../../../generators", __FILE__) + '/**/*.rb'
|
19
|
-
].each { |generator| require generator }
|
20
|
-
end
|
21
|
-
end # Railtie
|
22
|
-
end # EncryptedStore
|
23
|
-
end # Ribbon
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'ribbon/encrypted_store/version'
|
2
|
-
require 'ribbon/config'
|
3
|
-
|
4
|
-
module Ribbon
|
5
|
-
module EncryptedStore
|
6
|
-
require 'ribbon/encrypted_store/railtie' if defined?(Rails)
|
7
|
-
autoload(:CryptoHash, 'ribbon/encrypted_store/crypto_hash')
|
8
|
-
autoload(:Instance, 'ribbon/encrypted_store/instance')
|
9
|
-
autoload(:Errors, 'ribbon/encrypted_store/errors')
|
10
|
-
autoload(:Mixins, 'ribbon/encrypted_store/mixins')
|
11
|
-
|
12
|
-
class << self
|
13
|
-
def included(base)
|
14
|
-
if defined?(ActiveRecord) && base < ActiveRecord::Base
|
15
|
-
base.send(:include, Mixins::ActiveRecordMixin)
|
16
|
-
else
|
17
|
-
raise Errors::UnsupportedModelError
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def method_missing(meth, *args, &block)
|
22
|
-
instance.send(meth, *args, &block)
|
23
|
-
end
|
24
|
-
|
25
|
-
def instance
|
26
|
-
@__instance ||= Instance.new
|
27
|
-
end
|
28
|
-
end # Class Methods
|
29
|
-
end # EncryptedStore
|
30
|
-
end # Ribbon
|
31
|
-
|
32
|
-
# Create a shortcut to the module
|
33
|
-
EncryptedStore = Ribbon::EncryptedStore
|