web47core 1.0.2 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascript/clipboard.coffee +34 -0
- data/app/assets/stylesheets/clipboard.scss +13 -0
- data/app/helpers/core_link_helper.rb +1 -1
- data/lib/app/jobs/cron/job_tab.rb +1 -1
- data/lib/app/models/concerns/cipher_able.rb +51 -0
- data/lib/app/models/concerns/encrypted_password.rb +41 -0
- data/lib/web47core.rb +2 -0
- data/lib/web47core/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e47d367b65524e64ca9fdfe7a20cd32913601f00e65cde6dd64b123731de01c
|
4
|
+
data.tar.gz: 82673c3c6a38c473e6207d14cbd5c6a7f7795e4aca35ae334884e08a9a2e2690
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60930a3608223f8ddf7f93f51206c8f2a8ab7779b59a022dc32489edf02f838e91b7ec1f620b005bd784c2ae609c9d53d8028f1c2332f03f3ff587601920cbe0
|
7
|
+
data.tar.gz: 238254a8922918c08ea3074fb70af71b0c9e8f01ac9567b689a2d6d696655e220feff73e6c605e53102aa5422c4827040742d6a366b5338cdbc6e399262add81
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# Enable copy capability to the machines copy/paste buffer
|
3
|
+
#
|
4
|
+
$(document).ready ->
|
5
|
+
if clipboardEnabled()
|
6
|
+
$('a.copy').on 'click', (e) ->
|
7
|
+
node = e.target
|
8
|
+
textField = document.createElement('textarea')
|
9
|
+
node.parentNode.insertBefore(textField, node)
|
10
|
+
try
|
11
|
+
textField.innerText = $(this).data('clipboard-text')
|
12
|
+
textField.select()
|
13
|
+
textField.focus()
|
14
|
+
if document.execCommand('copy')
|
15
|
+
M.toast({html: 'Copied!'}, 3000);
|
16
|
+
else
|
17
|
+
M.toast({html: 'Unable to copy text'}, 3000);
|
18
|
+
catch error
|
19
|
+
M.toast({html: 'Unable to copy text'}, 3000);
|
20
|
+
finally
|
21
|
+
textField.parentNode.removeChild(textField)
|
22
|
+
|
23
|
+
else
|
24
|
+
$('.copy').hide()
|
25
|
+
|
26
|
+
#
|
27
|
+
# Test that we can issue the execCommand for copy and that it returns
|
28
|
+
#
|
29
|
+
clipboardEnabled = ->
|
30
|
+
try
|
31
|
+
document.execCommand('copy')
|
32
|
+
true
|
33
|
+
catch error
|
34
|
+
false
|
@@ -17,7 +17,7 @@ module CoreLinkHelper
|
|
17
17
|
# Setup the text as copy text
|
18
18
|
#
|
19
19
|
def copy_tag(copy_text, options = {})
|
20
|
-
content_tag(:
|
20
|
+
content_tag(:div, class: 'clipboard') do
|
21
21
|
concat(content_tag(:span) { copy_text })
|
22
22
|
concat(copy_text_tag(copy_text, options))
|
23
23
|
concat(download_tag(options[:download_url], options)) if options[:download_url].present?
|
@@ -38,7 +38,7 @@ module Cron
|
|
38
38
|
def job_names
|
39
39
|
@job_names ||= all_jobs.collect do |job|
|
40
40
|
job_name = job.to_s
|
41
|
-
next if FRAMEWORK_CLASSES.include?(job_name) || job_name.end_with?('
|
41
|
+
next if FRAMEWORK_CLASSES.include?(job_name) || job_name.end_with?('_test') || job_name.start_with?('base_')
|
42
42
|
|
43
43
|
job_name.underscore
|
44
44
|
end.compact
|
@@ -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 EncryptedPassword
|
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/encrypted_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.7
|
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
|
@@ -570,7 +570,9 @@ files:
|
|
570
570
|
- LICENSE
|
571
571
|
- README.md
|
572
572
|
- app/assets/images/1x1.png
|
573
|
+
- app/assets/javascript/clipboard.coffee
|
573
574
|
- app/assets/javascript/flash.coffee
|
575
|
+
- app/assets/stylesheets/clipboard.scss
|
574
576
|
- app/controllers/exceptions_controller.rb
|
575
577
|
- app/controllers/notifications_controller.rb
|
576
578
|
- app/controllers/status_controller.rb
|
@@ -631,9 +633,11 @@ files:
|
|
631
633
|
- lib/app/models/audit_log.rb
|
632
634
|
- lib/app/models/concerns/app47_logger.rb
|
633
635
|
- lib/app/models/concerns/cdn_url.rb
|
636
|
+
- lib/app/models/concerns/cipher_able.rb
|
634
637
|
- lib/app/models/concerns/core_account.rb
|
635
638
|
- lib/app/models/concerns/core_system_configuration.rb
|
636
639
|
- lib/app/models/concerns/email_able.rb
|
640
|
+
- lib/app/models/concerns/encrypted_password.rb
|
637
641
|
- lib/app/models/concerns/role_able.rb
|
638
642
|
- lib/app/models/concerns/search_able.rb
|
639
643
|
- lib/app/models/concerns/secure_fields.rb
|