101 lines
2.4 KiB
Crystal
101 lines
2.4 KiB
Crystal
class AuthD::Request
|
|
IPC::JSON.message AddUser, 1 do
|
|
# Only clients that have the right shared key will be allowed
|
|
# to create users.
|
|
property shared_key : String
|
|
|
|
property login : String
|
|
property password : String
|
|
property email : String? = nil
|
|
property phone : String? = nil
|
|
property profile : Hash(String, JSON::Any)? = nil
|
|
|
|
def initialize(@shared_key, @login, @password, @email, @phone, @profile)
|
|
end
|
|
|
|
def handle(authd : AuthD::Service)
|
|
# No verification of the users' informations when an admin adds it.
|
|
# No mail address verification.
|
|
if @shared_key != authd.configuration.shared_key
|
|
return Response::Error.new "invalid authentication key"
|
|
end
|
|
|
|
if authd.users_per_login.get? @login
|
|
return Response::Error.new "login already used"
|
|
end
|
|
|
|
if authd.configuration.require_email && @email.nil?
|
|
return Response::Error.new "email required"
|
|
end
|
|
|
|
password_hash = authd.hash_password @password
|
|
|
|
uid = authd.new_uid
|
|
|
|
user = User.new uid, @login, password_hash
|
|
user.contact.email = @email unless @email.nil?
|
|
user.contact.phone = @phone unless @phone.nil?
|
|
|
|
@profile.try do |profile|
|
|
user.profile = profile
|
|
end
|
|
|
|
# We consider adding the user as a registration
|
|
user.date_registration = Time.local
|
|
|
|
authd.users << user
|
|
|
|
Response::UserAdded.new user.to_public
|
|
end
|
|
end
|
|
AuthD.requests << AddUser
|
|
|
|
|
|
IPC::JSON.message ModUser, 5 do
|
|
property shared_key : String
|
|
|
|
property user : Int32 | String
|
|
property password : String? = nil
|
|
property email : String? = nil
|
|
property phone : String? = nil
|
|
property avatar : String? = nil
|
|
|
|
def initialize(@shared_key, @user)
|
|
end
|
|
|
|
def handle(authd : AuthD::Service)
|
|
if @shared_key != authd.configuration.shared_key
|
|
return Response::Error.new "invalid authentication key"
|
|
end
|
|
|
|
uid_or_login = @user
|
|
user = if uid_or_login.is_a? Int32
|
|
authd.users_per_uid.get? uid_or_login.to_s
|
|
else
|
|
authd.users_per_login.get? uid_or_login
|
|
end
|
|
|
|
unless user
|
|
return Response::Error.new "user not found"
|
|
end
|
|
|
|
@password.try do |s|
|
|
user.password_hash = authd.hash_password s
|
|
end
|
|
|
|
@email.try do |email|
|
|
user.contact.email = email
|
|
end
|
|
|
|
@phone.try do |phone|
|
|
user.contact.phone = phone
|
|
end
|
|
|
|
authd.users_per_uid.update user.uid.to_s, user
|
|
|
|
Response::UserEdited.new user.uid
|
|
end
|
|
end
|
|
AuthD.requests << ModUser
|
|
end
|