88 lines
2.6 KiB
Crystal
88 lines
2.6 KiB
Crystal
class AuthD::Request
|
|
IPC::JSON.message Register, 1 do
|
|
property login : String
|
|
property password : String
|
|
property email : String? = nil
|
|
property profile : Hash(String, JSON::Any)? = nil
|
|
|
|
def initialize(@login, @password, @email, @profile)
|
|
end
|
|
|
|
def handle(authd : AuthD::Service, fd : Int32)
|
|
unless authd.configuration.registrations
|
|
return Response::ErrorRegistrationsClosed.new
|
|
end
|
|
|
|
if authd.users_per_login.get? @login
|
|
return Response::ErrorAlreadyUsedLogin.new
|
|
end
|
|
|
|
acceptable_login_regex = "[a-zA-Z][-_ a-zA-Z0-9']+"
|
|
pattern = Regex.new acceptable_login_regex, Regex::Options::IGNORE_CASE
|
|
return Response::ErrorInvalidLoginFormat.new unless pattern =~ @login
|
|
|
|
if authd.configuration.require_email && @email.nil?
|
|
return Response::ErrorMailRequired.new
|
|
end
|
|
|
|
if ! @email.nil?
|
|
# Test on the email address format.
|
|
grok = Grok.new [ "%{EMAILADDRESS:email}" ]
|
|
result = grok.parse @email.not_nil!
|
|
email = result["email"]?
|
|
|
|
return Response::ErrorInvalidEmailFormat.new if email.nil?
|
|
end
|
|
|
|
# In this case we should not accept its registration.
|
|
return Response::ErrorPasswordTooShort.new if @password.size < 20
|
|
return Response::ErrorPasswordTooLong.new if @password.size > 100
|
|
|
|
uid = authd.new_uid
|
|
password = authd.hash_password @password
|
|
|
|
user = User.new uid, @login, password
|
|
user.contact.email = @email unless @email.nil?
|
|
user.contact.new_activation_key
|
|
|
|
@profile.try do |profile|
|
|
user.profile = profile
|
|
end
|
|
|
|
user.date_registration = Time.local
|
|
|
|
begin
|
|
mailer_exe = authd.configuration.mailer_exe
|
|
template_name = authd.configuration.activation_template
|
|
|
|
u_login = user.login
|
|
u_email = user.contact.email.not_nil!
|
|
u_activation_key = user.contact.activation_key.not_nil!
|
|
|
|
# Once the user is created and stored, we try to contact him.
|
|
unless Process.run(mailer_exe,
|
|
# PARAMETERS
|
|
[ "send", template_name, u_email ],
|
|
# ENV
|
|
{ "HOME" => "/", "LOGIN" => u_login, "TOKEN" => u_activation_key },
|
|
true # clear environment
|
|
# input: Process::Redirect::Inherit,
|
|
# output: Process::Redirect::Inherit,
|
|
# error: Process::Redirect::Inherit
|
|
).success?
|
|
raise "cannot contact user #{u_login} address #{u_email}"
|
|
end
|
|
rescue e
|
|
Baguette::Log.error "mailer: #{e}"
|
|
return Response::ErrorCannotContactUser.new
|
|
end
|
|
|
|
# add the user only if we were able to send the confirmation mail
|
|
authd.users << user
|
|
authd.new_uid_commit uid
|
|
Response::UserAdded.new user.to_public
|
|
end
|
|
end
|
|
AuthD.requests << Register
|
|
end
|