summaryrefslogtreecommitdiff
path: root/app/models/concerns/token_authenticatable_strategies
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-11-14 14:46:46 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-11-14 14:46:46 +0100
commit10b8fd71f6f4dd9c96cd2555a6b115d7baafb91d (patch)
tree528f439499b3c5c1e0d1a5e57b27bb799608fc9e /app/models/concerns/token_authenticatable_strategies
parent10ea75396b8fe22e4b2fd1514e5d07e7bd97bf08 (diff)
downloadgitlab-ce-10b8fd71f6f4dd9c96cd2555a6b115d7baafb91d.tar.gz
Refactor token authenticatable encrypted strategy
Diffstat (limited to 'app/models/concerns/token_authenticatable_strategies')
-rw-r--r--app/models/concerns/token_authenticatable_strategies/base.rb6
-rw-r--r--app/models/concerns/token_authenticatable_strategies/encrypted.rb27
2 files changed, 20 insertions, 13 deletions
diff --git a/app/models/concerns/token_authenticatable_strategies/base.rb b/app/models/concerns/token_authenticatable_strategies/base.rb
index 9aa04ba3d62..ef5ed0e577e 100644
--- a/app/models/concerns/token_authenticatable_strategies/base.rb
+++ b/app/models/concerns/token_authenticatable_strategies/base.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
module TokenAuthenticatableStrategies
+ attr_reader :klass, :token_field, :options
+
class Base
def initialize(klass, token_field, options)
@klass = klass
@@ -36,6 +38,10 @@ module TokenAuthenticatableStrategies
instance.save! if Gitlab::Database.read_write?
end
+ def fallback?
+ options[:fallback] == true
+ end
+
protected
def write_new_token(instance)
diff --git a/app/models/concerns/token_authenticatable_strategies/encrypted.rb b/app/models/concerns/token_authenticatable_strategies/encrypted.rb
index c68ac399594..822f0b1935c 100644
--- a/app/models/concerns/token_authenticatable_strategies/encrypted.rb
+++ b/app/models/concerns/token_authenticatable_strategies/encrypted.rb
@@ -7,45 +7,46 @@ module TokenAuthenticatableStrategies
def find_token_authenticatable(token, unscoped = false)
return unless token
+ encrypted_value = Gitlab::CryptoHelper.aes256_gcm_encrypt(token)
token_authenticatable = relation(unscoped)
- .find_by(token_field_name => Gitlab::CryptoHelper.aes256_gcm_encrypt(token))
+ .find_by(encrypted_field => encrypted_value)
- if @options[:fallback]
- token_authenticatable ||= fallback_strategy.find_token_authenticatable(token)
+ if fallback?
+ token_authenticatable ||= fallback_strategy
+ .find_token_authenticatable(token)
end
token_authenticatable
end
def get_token(instance)
- raw_token = instance.read_attribute(token_field_name)
+ raw_token = instance.read_attribute(encrypted_field)
token = Gitlab::CryptoHelper.aes256_gcm_decrypt(raw_token)
- token ||= fallback_strategy.get_token(instance) if @options[:fallback]
+ token ||= fallback_strategy.get_token(instance) if fallback?
end
def set_token(instance, token)
- raise ArgumentError unless token
+ raise ArgumentError unless token.present?
- instance[token_field_name] = Gitlab::CryptoHelper.aes256_gcm_encrypt(token)
- # instance[@token_field] = nil if @options[:fallback] # TODO this seems wrong
+ instance[encrypted_field] = Gitlab::CryptoHelper.aes256_gcm_encrypt(token)
end
protected
def fallback_strategy
@fallback_strategy ||= TokenAuthenticatableStrategies::Insecure
- .new(@klass, @token_field, @options)
+ .new(klass, token_field, options)
end
def token_set?(instance)
- raw_token = instance.read_attribute(token_field_name)
- raw_token ||= instance.read_attribute(@token_field) if @options[:fallback]
+ raw_token = instance.read_attribute(encrypted_field)
+ raw_token ||= instance.read_attribute(token_field) if fallback?
raw_token.present?
end
- def token_field_name
- "#{@token_field}_encrypted"
+ def encrypted_field
+ @encrypted_field ||= "#{@token_field}_encrypted"
end
end
end