2020-11-22 13:49:34 +01:00
|
|
|
class AuthD::Request
|
2023-06-13 03:15:08 +02:00
|
|
|
IPC::JSON.message SearchUser, 12 do
|
2023-06-13 02:32:15 +02:00
|
|
|
property regex : String? = nil
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-13 01:32:54 +02:00
|
|
|
# Since the list could be long, here is a way to get it at a reasonable pace.
|
|
|
|
property offset : Int32 = 0
|
|
|
|
# By default, authd will send 10 users at a time.
|
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
def initialize(@regex = nil, @offset = 0)
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
|
|
|
|
2023-06-10 17:26:12 +02:00
|
|
|
def handle(authd : AuthD::Service, fd : Int32)
|
2023-06-12 14:40:03 +02:00
|
|
|
logged_user = authd.get_logged_user_full? fd
|
2023-06-14 01:46:38 +02:00
|
|
|
return Response::ErrorMustBeAuthenticated.new if logged_user.nil?
|
2023-06-12 14:40:03 +02:00
|
|
|
logged_user.assert_permission("authd", "*", User::PermissionLevel::Read)
|
2023-06-12 01:56:31 +02:00
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
users = authd.users.to_a
|
2020-11-22 13:49:34 +01:00
|
|
|
matching_users = Array(AuthD::User::Public).new
|
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
# FIXME: could be optimized.
|
|
|
|
result = if regex = @regex
|
|
|
|
pattern = Regex.new regex, Regex::Options::IGNORE_CASE
|
|
|
|
users.each do |u|
|
|
|
|
if pattern =~ u.login || u.profile.try do |profile|
|
2024-02-17 18:13:12 +01:00
|
|
|
full_name = profile["full_name"]?
|
|
|
|
if full_name.nil?
|
|
|
|
false
|
|
|
|
else
|
|
|
|
pattern =~ full_name.as_s
|
|
|
|
end
|
|
|
|
end || u.contact.email.try do |email|
|
|
|
|
pattern =~ email
|
2023-06-13 02:32:15 +02:00
|
|
|
end
|
|
|
|
Baguette::Log.debug "#{u.login} matches #{pattern}"
|
|
|
|
matching_users << u.to_public
|
|
|
|
else
|
|
|
|
Baguette::Log.debug "#{u.login} doesn't match #{pattern}"
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
2023-06-13 02:32:15 +02:00
|
|
|
end
|
|
|
|
matching_users[offset..offset+10]
|
|
|
|
else
|
|
|
|
users[offset..offset+10].each do |u|
|
2020-11-22 13:49:34 +01:00
|
|
|
matching_users << u.to_public
|
|
|
|
end
|
2023-06-13 02:32:15 +02:00
|
|
|
matching_users
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
Response::MatchingUsers.new result
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
AuthD.requests << SearchUser
|
|
|
|
end
|