authd/src/requests/search.cr

53 lines
1.4 KiB
Crystal
Raw Normal View History

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
property regex : String? = nil
2020-11-22 13:49:34 +01: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.
def initialize(@regex = nil, @offset = 0)
2020-11-22 13:49:34 +01:00
end
def handle(authd : AuthD::Service, fd : Int32)
logged_user = authd.get_logged_user_full? fd
2023-06-14 01:46:38 +02:00
return Response::ErrorMustBeAuthenticated.new if logged_user.nil?
logged_user.assert_permission("authd", "*", User::PermissionLevel::Read)
users = authd.users.to_a
2020-11-22 13:49:34 +01:00
matching_users = Array(AuthD::User::Public).new
# 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|
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
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
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
matching_users
2020-11-22 13:49:34 +01:00
end
Response::MatchingUsers.new result
2020-11-22 13:49:34 +01:00
end
end
AuthD.requests << SearchUser
end