web47core 1.0.2 → 1.0.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9e37f203836b0061d6a6a7be17633c998689e37fe15a29f90fca9878efba6996
4
- data.tar.gz: fc0b0bb51d21ba1813ed55be1e0963949f746e79c9d1ade65671c126494a260b
3
+ metadata.gz: 9e47d367b65524e64ca9fdfe7a20cd32913601f00e65cde6dd64b123731de01c
4
+ data.tar.gz: 82673c3c6a38c473e6207d14cbd5c6a7f7795e4aca35ae334884e08a9a2e2690
5
5
  SHA512:
6
- metadata.gz: 71cf329a809153b71e79db8da135d30ae37fd29f2f041d22bfe4867ea73db07b5bddf5de7b2dc9a70dbed5458b6e80bf39897e9148b767dfbf2e6ac885a5b076
7
- data.tar.gz: 6dc57e63cb0cef59aae8996424ab85bd93b90a885d9e69e6ca13a07dedc24873d90616ad0f753c3239cfab13209bb54acf3d61922aab33d0397dda3c95f3f527
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
@@ -0,0 +1,13 @@
1
+ .clipboard {
2
+ margin: 0 0 0 2px;
3
+ padding: 0;
4
+ span {
5
+ font-size: 1rem;
6
+ }
7
+ a.copy {
8
+ i.material-icons {
9
+ i.material-icons;
10
+ font-size: 1rem;
11
+ }
12
+ }
13
+ }
@@ -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(:p, class: 'stack-tight') do
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?('Test') || job_name.start_with?('Base')
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
@@ -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'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Web47core
4
- VERSION = '1.0.2'
4
+ VERSION = '1.0.7'
5
5
  end
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.2
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-18 00:00:00.000000000 Z
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