diff options
author | Ash McKenzie <amckenzie@gitlab.com> | 2018-07-31 21:01:49 +1000 |
---|---|---|
committer | Ash McKenzie <amckenzie@gitlab.com> | 2018-08-01 10:12:04 +1000 |
commit | 2f733baacdf5d0dca98276cc9b6e895097d5e8d2 (patch) | |
tree | 0db1256260f546cc13f01b4025e0fa045f32f9d1 /lib | |
parent | cda96eb70992cc80d0dde8195df57d7b5c4a1429 (diff) | |
download | gitlab-shell-2f733baacdf5d0dca98276cc9b6e895097d5e8d2.tar.gz |
New Actor::Base, Actor::Key and Actor::User
Diffstat (limited to 'lib')
-rw-r--r-- | lib/actor.rb | 18 | ||||
-rw-r--r-- | lib/actor/base.rb | 50 | ||||
-rw-r--r-- | lib/actor/key.rb | 29 | ||||
-rw-r--r-- | lib/actor/user.rb | 19 |
4 files changed, 116 insertions, 0 deletions
diff --git a/lib/actor.rb b/lib/actor.rb new file mode 100644 index 0000000..eab1bc4 --- /dev/null +++ b/lib/actor.rb @@ -0,0 +1,18 @@ +require_relative 'actor/base' +require_relative 'actor/key' +require_relative 'actor/user' + +module Actor + class UnsupportedActorError < StandardError; end + + def self.new_from(str, audit_usernames: false) + case str + when Key.id_regex + Key.from(str, audit_usernames: audit_usernames) + when User.id_regex + User.from(str, audit_usernames: audit_usernames) + else + raise UnsupportedActorError + end + end +end diff --git a/lib/actor/base.rb b/lib/actor/base.rb new file mode 100644 index 0000000..76cc522 --- /dev/null +++ b/lib/actor/base.rb @@ -0,0 +1,50 @@ +module Actor + class Base + attr_reader :id + + def initialize(id, audit_usernames: false) + @id = id + @audit_usernames = audit_usernames + end + + def self.from(str, audit_usernames: false) + new(str.gsub(/#{identifier_prefix}-/, ''), audit_usernames: audit_usernames) + end + + def self.identifier_key + raise NotImplementedError + end + + def self.identifier_prefix + raise NotImplementedError + end + + def self.id_regex + raise NotImplementedError + end + + def username + raise NotImplementedError + end + + def identifier + "#{self.class.identifier_prefix}-#{id}" + end + + def log_username + audit_usernames? ? username : "#{klass_name.downcase} with identifier #{identifier}" + end + + private + + attr_reader :audit_usernames + + def klass_name + self.class.to_s.split('::')[-1] + end + + def audit_usernames? + audit_usernames + end + end +end diff --git a/lib/actor/key.rb b/lib/actor/key.rb new file mode 100644 index 0000000..411ef15 --- /dev/null +++ b/lib/actor/key.rb @@ -0,0 +1,29 @@ +require_relative 'base' +require_relative '../gitlab_net' + +module Actor + class Key < Base + ANONYMOUS_USER = 'Anonymous'.freeze + + alias key_id id + + def self.identifier_prefix + 'key'.freeze + end + + def self.identifier_key + 'key_id'.freeze + end + + def self.id_regex + /\Akey\-\d+\Z/ + end + + def username + @username ||= begin + user = GitlabNet.new.discover(key_id) + user ? "@#{user['username']}" : ANONYMOUS_USER + end + end + end +end diff --git a/lib/actor/user.rb b/lib/actor/user.rb new file mode 100644 index 0000000..55ba7f1 --- /dev/null +++ b/lib/actor/user.rb @@ -0,0 +1,19 @@ +require_relative 'base' + +module Actor + class User < Base + alias username identifier + + def self.identifier_prefix + 'user'.freeze + end + + def self.identifier_key + 'user_id'.freeze + end + + def self.id_regex + /\Auser\-\d+\Z/ + end + end +end |