web47core 1.0.5 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/app/models/concerns/cipher_able.rb +51 -0
- data/lib/app/models/concerns/secure_password.rb +41 -0
- data/lib/web47core.rb +2 -0
- data/lib/web47core/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f9275f3f097ae096f3de33a7b387e107d1a0e08fa01ae37d369a22e814db22d
|
4
|
+
data.tar.gz: 3a2080a56ef021eccb2e398ec51f9c1bd474450924c00e1b8a0f82ad6fd13473
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d7013d8e16ae68be5adfe2f8b38a9536d8acb4fda7b7907f0afe1d41c0fcda941a86bcef4c021d079211907c6a9081cdc22a5744eb6f7042fc94a9169edb0d4
|
7
|
+
data.tar.gz: 36bc38a23ee63292623e95d32035d9b7962ff1070c71f91d424ea62a65393f704bdee0544c9fad97ce0f0f1f2495e700559c5b61f9a9a81401d4e02adb3b19e5
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#
|
2
|
+
# A mixin to help with encrypting data in a secure way
|
3
|
+
#
|
4
|
+
module CipherAble
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
# Add to the model
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
#
|
10
|
+
# Fields
|
11
|
+
#
|
12
|
+
field :secret_key, type: BSON::Binary
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# Encrypt the given text
|
18
|
+
#
|
19
|
+
def encrypt(text)
|
20
|
+
cipher.encrypt_and_sign(text)
|
21
|
+
rescue StandardError => error
|
22
|
+
App47Logger.log_error("Unable to encrypt text for #{inspect}", error)
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Decrypt the given text
|
28
|
+
#
|
29
|
+
def decrypt(text)
|
30
|
+
cipher.decrypt_and_verify(text)
|
31
|
+
rescue StandardError => error
|
32
|
+
App47Logger.log_warn("Unable to decrypt text for #{inspect}", error)
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Get the cipher directly
|
38
|
+
#
|
39
|
+
def cipher
|
40
|
+
generate_key if secret_key.blank?
|
41
|
+
ActiveSupport::MessageEncryptor.new(secret_key.data)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def generate_key
|
47
|
+
len = ActiveSupport::MessageEncryptor.key_len
|
48
|
+
salt = SecureRandom.random_bytes(len)
|
49
|
+
set secret_key: BSON::Binary.new(ActiveSupport::KeyGenerator.new(id.to_s).generate_key(salt, len))
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#
|
2
|
+
# Hold onto a secure password supporting both storage (setting) and retrieval ()getting) the password.
|
3
|
+
#
|
4
|
+
# The security will lie in the key that is offered by the object. By default it will be the ID of the object
|
5
|
+
# however it should really use be combined with some other known value like account.id or something
|
6
|
+
#
|
7
|
+
module SecurePassword
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
#
|
10
|
+
# Base class extension
|
11
|
+
#
|
12
|
+
def self.included(base)
|
13
|
+
base.class_eval do
|
14
|
+
include CipherAble
|
15
|
+
#
|
16
|
+
# Fields
|
17
|
+
#
|
18
|
+
field :encrypted_password, type: String
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# Retrieve the password
|
24
|
+
#
|
25
|
+
def password
|
26
|
+
cipher.decrypt_and_verify(encrypted_password)
|
27
|
+
rescue StandardError => error
|
28
|
+
App47Logger.log_warn("Unable to retrieve password for #{inspect}", error)
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Set the password
|
34
|
+
#
|
35
|
+
def password=(password)
|
36
|
+
set encrypted_password: cipher.encrypt_and_sign(password)
|
37
|
+
rescue StandardError => error
|
38
|
+
App47Logger.log_error("Unable to store password for #{inspect}", error)
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
data/lib/web47core.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'web47core/config'
|
2
2
|
require 'app/models/concerns/app47_logger'
|
3
|
+
require 'app/models/concerns/cipher_able'
|
3
4
|
require 'app/models/concerns/cdn_url'
|
4
5
|
require 'app/models/concerns/email_able'
|
5
6
|
require 'app/models/concerns/search_able'
|
@@ -10,6 +11,7 @@ require 'app/models/concerns/switchboard_able'
|
|
10
11
|
require 'app/models/concerns/core_system_configuration'
|
11
12
|
require 'app/models/concerns/core_account'
|
12
13
|
require 'app/models/concerns/secure_fields'
|
14
|
+
require 'app/models/concerns/secure_password'
|
13
15
|
require 'app/models/delayed_job'
|
14
16
|
require 'app/models/redis_configuration'
|
15
17
|
require 'app/models/notification'
|
data/lib/web47core/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web47core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schroeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -633,12 +633,14 @@ files:
|
|
633
633
|
- lib/app/models/audit_log.rb
|
634
634
|
- lib/app/models/concerns/app47_logger.rb
|
635
635
|
- lib/app/models/concerns/cdn_url.rb
|
636
|
+
- lib/app/models/concerns/cipher_able.rb
|
636
637
|
- lib/app/models/concerns/core_account.rb
|
637
638
|
- lib/app/models/concerns/core_system_configuration.rb
|
638
639
|
- lib/app/models/concerns/email_able.rb
|
639
640
|
- lib/app/models/concerns/role_able.rb
|
640
641
|
- lib/app/models/concerns/search_able.rb
|
641
642
|
- lib/app/models/concerns/secure_fields.rb
|
643
|
+
- lib/app/models/concerns/secure_password.rb
|
642
644
|
- lib/app/models/concerns/standard_model.rb
|
643
645
|
- lib/app/models/concerns/switchboard_able.rb
|
644
646
|
- lib/app/models/concerns/time_zone_able.rb
|