2020-11-22 13:49:34 +01:00
|
|
|
class AuthD::Request
|
2023-06-13 02:32:15 +02:00
|
|
|
# Reset elements for which keys are present in `new_profile_entries`.
|
2023-06-13 03:15:08 +02:00
|
|
|
IPC::JSON.message EditProfileEntries, 7 do
|
2023-06-13 18:37:58 +02:00
|
|
|
property user : UserID? = nil
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
property new_profile_entries : Hash(String, JSON::Any)
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
def initialize(@new_profile_entries, @user = nil)
|
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?
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-12 01:03:52 +02:00
|
|
|
user = if u = @user
|
2023-06-12 14:40:03 +02:00
|
|
|
logged_user.assert_permission("authd", "*", User::PermissionLevel::Edit)
|
2023-06-12 01:03:52 +02:00
|
|
|
authd.user? u
|
2020-11-22 13:49:34 +01:00
|
|
|
else
|
2023-06-12 14:40:03 +02:00
|
|
|
logged_user
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
2023-06-14 01:46:38 +02:00
|
|
|
return Response::ErrorUserNotFound.new if user.nil?
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
new_profile_entries = user.profile || Hash(String, JSON::Any).new
|
2020-11-22 13:49:34 +01:00
|
|
|
|
2023-06-14 02:07:03 +02:00
|
|
|
invalid_profile_keys = Array(String).new
|
2023-06-12 01:03:52 +02:00
|
|
|
unless logged_user.admin
|
2020-11-22 13:49:34 +01:00
|
|
|
authd.configuration.read_only_profile_keys.each do |key|
|
2023-06-13 02:32:15 +02:00
|
|
|
if @new_profile_entries.has_key? key
|
2023-06-14 02:07:03 +02:00
|
|
|
invalid_profile_keys << key
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-06-14 02:07:03 +02:00
|
|
|
if invalid_profile_keys.size > 0
|
|
|
|
return Response::ErrorReadOnlyProfileKeys.new invalid_profile_keys
|
|
|
|
end
|
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
@new_profile_entries.each do |key, value|
|
|
|
|
new_profile_entries[key] = value
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|
|
|
|
|
2023-06-13 02:32:15 +02:00
|
|
|
user.profile = new_profile_entries
|
2020-11-22 13:49:34 +01:00
|
|
|
|
|
|
|
authd.users_per_uid.update user.uid.to_s, user
|
|
|
|
|
|
|
|
Response::User.new user.to_public
|
|
|
|
end
|
|
|
|
end
|
2023-06-12 01:03:52 +02:00
|
|
|
AuthD.requests << EditProfileEntries
|
2020-11-22 13:49:34 +01:00
|
|
|
end
|