summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Leitzen <pleitzen@gitlab.com>2019-08-15 06:19:45 +0200
committerPeter Leitzen <pleitzen@gitlab.com>2019-08-15 06:19:45 +0200
commit302512c559fea57f99df3072acfa63b5259f8c3b (patch)
tree30080637e263d8c7cb71e87a17f28f22391f2729
parenta32a30783fff15ee906c2c053e1e6cde59cbaff7 (diff)
downloadgitlab-ce-pl-63450-Zoom-service-intagration-as-project-service.tar.gz
WIP: Introduce prop_accessor_encryptedpl-63450-Zoom-service-intagration-as-project-service
-rw-r--r--app/models/project_services/zoom_service.rb7
-rw-r--r--app/models/service.rb42
-rw-r--r--app/models/testing.rb8
3 files changed, 56 insertions, 1 deletions
diff --git a/app/models/project_services/zoom_service.rb b/app/models/project_services/zoom_service.rb
index 5addbfdb72c..1c7e063d94a 100644
--- a/app/models/project_services/zoom_service.rb
+++ b/app/models/project_services/zoom_service.rb
@@ -1,8 +1,13 @@
# frozen_string_literal: true
class ZoomService < Service
- prop_accessor :api_key, :api_secret
+ prop_accessor_encrypted :api_key, :api_secret,
+ mode: :per_attribute_iv,
+ key: Settings.attr_encrypted_db_key_base_truncated,
+ algorithm: 'aes-256-gcm'
+
validates :api_key, :api_secret, presence: true, if: :activated?
+
def title
'Zoom'
end
diff --git a/app/models/service.rb b/app/models/service.rb
index a0cee39cbb6..58ee4d6378b 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -202,6 +202,48 @@ class Service < ApplicationRecord
end
end
+ module PropResolver
+ def new(service)
+ @service = service
+ end
+
+ def method_missing(method, value, *_args)
+ case method
+ when /^encrypted_.*?=$/
+ prop = method.to_s.delete('=')
+ @service.prop_accessor[prop] = value
+ when /^encrypted_/
+ super || @service.prop_accessor[method.to_s]
+ else
+ super
+ end
+ end
+ end
+
+ def self.prop_accessor_encrypted(*attributes, **options)
+ @@_encrypted_props ||= Class.new do
+ extend AttrEncrypted
+ prepend PropResolver
+ end
+ @@_encrypted_props.attr_encrypted(*attributes, **options)
+
+ attributes.each do |attribute|
+ prop_accessor \
+ "encrypted_#{attribute}",
+ "encrypted_#{attribute}_iv",
+ "encrypted_#{attribute}_salt"
+
+ # delegate
+ define_method(attribute) do
+ @@_encrypted_props.public_send(attribute)
+ end
+
+ define_method(:"#{attribute}=") do |value|
+ @@_encrypted_props.public_send(:"#{attribute}=", value)
+ end
+ end
+ end
+
# Provide convenient boolean accessor methods
# for each serialized property.
# Also keep track of updated properties in a similar way as ActiveModel::Dirty
diff --git a/app/models/testing.rb b/app/models/testing.rb
new file mode 100644
index 00000000000..4290229faad
--- /dev/null
+++ b/app/models/testing.rb
@@ -0,0 +1,8 @@
+class Testing
+ extend AttrEncrypted
+
+ attr_encrypted :api_key, :api_secret,
+ mode: :per_attribute_iv,
+ key: Settings.attr_encrypted_db_key_base_truncated,
+ algorithm: 'aes-256-gcm'
+end