diff options
author | Peter Leitzen <pleitzen@gitlab.com> | 2019-08-15 06:19:45 +0200 |
---|---|---|
committer | Peter Leitzen <pleitzen@gitlab.com> | 2019-08-15 06:19:45 +0200 |
commit | 302512c559fea57f99df3072acfa63b5259f8c3b (patch) | |
tree | 30080637e263d8c7cb71e87a17f28f22391f2729 | |
parent | a32a30783fff15ee906c2c053e1e6cde59cbaff7 (diff) | |
download | gitlab-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.rb | 7 | ||||
-rw-r--r-- | app/models/service.rb | 42 | ||||
-rw-r--r-- | app/models/testing.rb | 8 |
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 |