From bba2fa2c06083bd514637c8e4384ce1ad8a6a10f Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 31 Dec 2016 22:09:33 +0000 Subject: [PATCH] Fix up signup process to use reCAPTCHA --- blocks/ORB/Login.pm | 267 +++++++++++-------- lang/en/login.lang | 41 ++- templates/default/images/account.png | Bin 0 -> 4165 bytes templates/default/login/signup.tem | 4 +- templates/default/login/signup_extrahead.tem | 3 +- 5 files changed, 179 insertions(+), 136 deletions(-) create mode 100755 templates/default/images/account.png diff --git a/blocks/ORB/Login.pm b/blocks/ORB/Login.pm index 1e3e99d..6088220 100755 --- a/blocks/ORB/Login.pm +++ b/blocks/ORB/Login.pm @@ -26,7 +26,8 @@ use strict; use parent qw(ORB); # This class extends the ORB block class use experimental qw(smartmatch); use Webperl::Utils qw(path_join is_defined_numeric); -use Data::Dumper; +use LWP::UserAgent; +use JSON; use v5.14; # ============================================================================ @@ -54,7 +55,7 @@ sub _signup_email { "block" => "login", "pathinfo" => [ "activate" ]); - my $status = $self -> {"messages"} -> queue_message(subject => $self -> {"template"} -> replace_langvar("LOGIN_REG_SUBJECT"), + my $status = $self -> {"messages"} -> queue_message(subject => $self -> {"template"} -> replace_langvar("LOGIN_SIGNUP_SUBJECT"), message => $self -> {"template"} -> load_template("login/email_signedup.tem", {"%(username)s" => $user -> {"username"}, "%(password)s" => $password, @@ -305,6 +306,147 @@ sub _validate_signin { } +## @method private $ _validate_recaptcha($response) +# Given a response code submitted as part of an operation by the user, ask the +# google reCAPTCHA validation service to check whether the response is valid. +# +# @param response The reCAPTCHA response code submitted by the user +# @return true if the code is valid, false if is not, undef on error. +sub _validate_recaptcha { + my $self = shift; + my $response = shift; + + $self -> clear_error(); + + my $ua = LWP::UserAgent -> new(); + + my $data = { + "secret" => $self -> {"settings"} -> {"config"} -> {"Login:recaptcha_secret"}, + "response" => $response, + "remoteip" => $self -> {"cgi"} -> remote_addr() + }; + + # Ask the recaptcha server to verify the response + my $resp = $ua -> post($self -> {"settings"} -> {"config"} -> {"Login:recaptcha_verify"}, $data); + if($resp -> is_success()) { + + # Convert the validator response + my $json = eval { decode_json($resp -> decoded_content()) }; + return $self -> self_error("JSON decoding failed: $@") if($@); + + $self -> log("recaptcha:status", "Validation response: ".($json -> {"success"} ? "successful" : "failed")." JSON: ".$resp -> decoded_content()); + + return 1 if($json -> {"success"}); + } else { + return $self -> self_error("HTTP problem: ".$resp -> status_line()); + } + + return 0; +} + + +## @method private @ _validate_signup() +# Determine whether the username, email, and security question provided by the user +# are valid. If they are, return true. +# +# @return The new user's record on success, an error string if the signup failed. +sub _validate_signup { + my $self = shift; + my $error = ""; + my $errors = ""; + my $args = {}; + + # User attempted self-register when it is disabled? Naughty user, no cookie! + return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(reason)s" => "{L_LOGIN_ERR_NOSELFREG}"}), $args) + unless($self -> {"settings"} -> {"config"} -> {"Login:allow_self_register"}); + + # Check that the username is provided and valid + ($args -> {"username"}, $error) = $self -> validate_string("username", {"required" => 1, + "nicename" => "{L_LOGIN_USERNAME}", + "minlen" => 2, + "maxlen" => 32, + "formattest" => '^[-\w ]+$', + "formatdesc" => "{L_LOGIN_ERR_BADUSERCHAR}" + }); + # Is the username valid? + if($error) { + $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $error}); + } else { + # Is the username in use? + my $user = $self -> {"session"} -> get_user($args -> {"username"}); + $errors .= $self -> {"template"} -> load_template("error/error.tem", + { "%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(reason)s" => $self -> {"template"} -> replace_langvar("LOGIN_ERR_USERINUSE", + { "%(url-recover)s" => $self -> build_url("block" => "login", "pathinfo" => [ "recover" ]) }) + }) + if($user); + } + + # And the email + ($args -> {"email"}, $error) = $self -> validate_string("email", {"required" => 1, + "nicename" => "{L_LOGIN_EMAIL}", + "minlen" => 2, + "maxlen" => 256 + }); + if($error) { + $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $error}); + } else { + + # Check that the address is structured in a vaguely valid way + # Yes, this is not fully RFC compliant, but frankly going down that road invites a + # level of utter madness that would make Azathoth himself utter "I say, steady on now..." + $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => "{L_LOGIN_ERR_BADEMAIL}"}) + if($args -> {"email"} !~ /^[\w.+-]+\@([\w-]+\.)+\w+$/); + + # Is the email address in use? + my $user = $self -> {"session"} -> {"auth"} -> {"app"} -> get_user_byemail($args -> {"email"}); + $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $self -> {"template"} -> replace_langvar("LOGIN_ERR_EMAILINUSE", + { "%(url-recover)s" => $self -> build_url("block" => "login", "pathinfo" => [ "recover" ]) }) + }) + if($user); + } + + # Pull the reCAPTCHA response code + ($args -> {"recaptcha"}, $error) = $self -> validate_string("g-recaptcha-response", {"required" => 1, + "nicename" => "{L_LOGIN_RECAPTCHA}", + "minlen" => 2, + "formattest" => '^[-\w]+$', + "formatdesc" => "{L_LOGIN_ERR_BADRECAPTCHA}" + }); + + # Halt here if there are any problems. + return ($self -> {"template"} -> load_template("error/error_list.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(errors)s" => $errors}), $args) + if($errors); + + # Is the response valid? + return ($self -> {"template"} -> load_template("error/error_list.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(errors)s" => "{L_LOGIN_ERR_RECAPTCHA}"}), $args) + unless($self -> _validate_recaptcha($args -> {"recaptcha"})); + + + # Get here an the user's details are okay, register the new user. + my $methodimpl = $self -> {"session"} -> {"auth"} -> get_authmethod_module($self -> {"settings"} -> {"config"} -> {"default_authmethod"}) + or return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(reason)s" => $self -> {"session"} -> {"auth"} -> errstr() }), + $args); + + my ($user, $password) = $methodimpl -> create_user($args -> {"username"}, $self -> {"settings"} -> {"config"} -> {"default_authmethod"}, $args -> {"email"}); + return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", + "%(reason)s" => $methodimpl -> errstr() }), + $args) + if(!$user); + + # Send registration email + my $err = $self -> _signup_email($user, $password); + return ($err, $args) if($err); + + # User is registered... + return ($user, $args); +} + + ## @method private @ validate_passchange() # Determine whether the password change request made by the user is valid. If the # password change is valid (passwords match, pass policy, and the old password is @@ -378,8 +520,8 @@ sub _validate_passchange { foreach my $name (@{$policy_fails -> {"policy_order"}}) { next if(!$policy_fails -> {$name}); $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(error)s" => "{L_LOGIN_".uc($name)."ERR}", - "%(set)s" => $policy_fails -> {$name} -> [1], - "%(require)s" => $policy_fails -> {$name} -> [0] }); + "%(set)s" => $policy_fails -> {$name} -> [1], + "%(require)s" => $policy_fails -> {$name} -> [0] }); } } @@ -404,103 +546,6 @@ sub _validate_passchange { } -## @method private @ _validate_signup() -# Determine whether the username, email, and security question provided by the user -# are valid. If they are, return true. -# -# @return The new user's record on success, an error string if the signup failed. -sub _validate_signup { - my $self = shift; - my $error = ""; - my $errors = ""; - my $args = {}; - - # User attempted self-register when it is disabled? Naughty user, no cookie! - return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", - "%(reason)s" => "{L_LOGIN_ERR_NOSELFREG}"}), $args) - unless($self -> {"settings"} -> {"config"} -> {"Login:allow_self_register"}); - - # Check that the username is provided and valid - ($args -> {"regname"}, $error) = $self -> validate_string("regname", {"required" => 1, - "nicename" => "{L_LOGIN_USERNAME}", - "minlen" => 2, - "maxlen" => 32, - "formattest" => '^[-\w ]+$', - "formatdesc" => "{L_LOGIN_ERR_BADUSERCHAR}" - }); - # Is the username valid? - if($error) { - $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $error}); - } else { - # Is the username in use? - my $user = $self -> {"session"} -> get_user($args -> {"regname"}); - $errors .= $self -> {"template"} -> load_template("error/error.tem", - { "%(message)s" => "{L_LOGIN_ERR_REGFAILED}", - "%(reason)s" => $self -> {"template"} -> replace_langvar("LOGIN_ERR_USERINUSE", - { "%(url-recover)s" => $self -> build_url("block" => "login", "pathinfo" => [ "recover" ]) }) - }) - if($user); - } - - # And the email - ($args -> {"email"}, $error) = $self -> validate_string("email", {"required" => 1, - "nicename" => "{L_LOGIN_EMAIL}", - "minlen" => 2, - "maxlen" => 256 - }); - if($error) { - $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $error}); - } else { - - # Check that the address is structured in a vaguely valid way - # Yes, this is not fully RFC compliant, but frankly going down that road invites a - # level of utter madness that would make Azathoth himself utter "I say, steady on now..." - $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => "{L_LOGIN_ERR_BADEMAIL}"}) - if($args -> {"email"} !~ /^[\w.+-]+\@([\w-]+\.)+\w+$/); - - # Is the email address in use? - my $user = $self -> {"session"} -> {"auth"} -> {"app"} -> get_user_byemail($args -> {"email"}); - $errors .= $self -> {"template"} -> load_template("error/error_item.tem", {"%(reason)s" => $self -> {"template"} -> replace_langvar("LOGIN_ERR_EMAILINUSE", - { "%(url-recover)s" => $self -> build_url("block" => "login", "pathinfo" => [ "recover" ]) }) - }) - if($user); - } - - # FIXME: Validate the recaptcha code here. - ($args -> {"recaptcha"}, $error) = $self -> validate_string("g-recaptcha-response", {"required" => 1, - "nicename" => "{L_LOGIN_RECAPTCHA}", - "minlen" => 2, - "maxlen" => 32, - "formattest" => '^[-\w]+$', - "formatdesc" => "{L_LOGIN_ERR_BADUSERCHAR}" - }); - - # Halt here if there are any problems. - return ($self -> {"template"} -> load_template("error/error_list.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", - "%(errors)s" => $errors}), $args) - if($errors); - - # Get here an the user's details are okay, register the new user. - my $methodimpl = $self -> {"session"} -> {"auth"} -> get_authmethod_module($self -> {"settings"} -> {"config"} -> {"default_authmethod"}) - or return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", - "%(reason)s" => $self -> {"session"} -> {"auth"} -> errstr() }), - $args); - - my ($user, $password) = $methodimpl -> create_user($args -> {"regname"}, $self -> {"settings"} -> {"config"} -> {"default_authmethod"}, $args -> {"email"}); - return ($self -> {"template"} -> load_template("error/error.tem", {"%(message)s" => "{L_LOGIN_ERR_REGFAILED}", - "%(reason)s" => $methodimpl -> errstr() }), - $args) - if(!$user); - - # Send registration email - my $err = $self -> signup_email($user, $password); - return ($err, $args) if($err); - - # User is registered... - return ($user, $args); -} - - ## @method private @ validate_actcode() # Determine whether the activation code provided by the user is valid # @@ -760,7 +805,7 @@ sub _generate_signup_form { return ("{L_LOGIN_SIGNUP_TITLE}", $self -> {"template"} -> load_template("login/signup.tem", {"%(error)s" => $error, - "%(sitekey)s" => $self -> {"settings"} -> {"config"} -> {"Login:self_register_sitekey"}, + "%(sitekey)s" => $self -> {"settings"} -> {"config"} -> {"Login:recaptcha_sitekey"}, "%(url-activate)s" => $self -> build_url("block" => "login", "pathinfo" => [ "activate" ]), "%(target)s" => $self -> build_url("block" => "login", "pathinfo" => [ "signup" ]), "%(username)s" => $args -> {"username"}, @@ -971,16 +1016,14 @@ sub _generate_signedup { my $url = $self -> build_url(block => "login", pathinfo => [ "activate" ]); - return ("{L_LOGIN_REG_DONETITLE}", - $self -> message_box("{L_LOGIN_REG_DONETITLE}", - "security", - "{L_LOGIN_REG_SUMMARY}", - "{L_LOGIN_REG_LONGDESC}", - undef, - "logincore", - [ {"message" => "{L_LOGIN_ACTIVATE}", - "colour" => "blue", - "action" => "location.href='$url'"} ])); + return ("{L_LOGIN_SIGNUP_DONETITLE}", + $self -> message_box(title => "{L_LOGIN_SIGNUP_DONETITLE}", + type => "account", + summary => "{L_LOGIN_SIGNUP_SUMMARY}", + message => "{L_LOGIN_SIGNUP_MESSAGE}", + buttons => [ {"message" => "{L_LOGIN_ACTIVATE}", + "colour" => "warning", + "href" => $url} ])); } diff --git a/lang/en/login.lang b/lang/en/login.lang index 123e8da..be49782 100755 --- a/lang/en/login.lang +++ b/lang/en/login.lang @@ -27,32 +27,31 @@ LOGIN_ERR_BADUSERCHAR = Illegal character in username. Usernames may only contai LOGIN_ERR_INVALID = Login failed: unknown username or password provided. # Registration-related stuff -LOGIN_REGISTER = Sign up -LOGIN_REG_INTRO = Create an account by choosing a username and giving a valid email address. A password will be emailed to you. -LOGIN_SECURITY = Security question -LOGIN_SEC_INTRO = In order to prevent abuse by automated spamming systems, please answer the following question to prove that you are a human.
Note: the answer is not case sensitive. -LOGIN_SEC_SUBMIT = Sign up +LOGIN_SIGNUP_TITLE = Sign up +LOGIN_SIGNUP_INTRO = Create an account by choosing a username and giving a valid email address. A password and activation code will be emailed to you, so you must have access to the email address. +LOGIN_SIGNUP = Sign up -LOGIN_ERR_NOSELFREG = Self-registration is not currently permitted. -LOGIN_ERR_REGFAILED = Registration failed -LOGIN_ERR_BADSECURE = You did not answer the security question correctly, please check your answer and try again. -LOGIN_ERR_BADEMAIL = The specified email address does not appear to be valid. -LOGIN_ERR_USERINUSE = The specified username is already in use. If you can't remember your password, please use the account recovery facility rather than attempt to make a new account. -LOGIN_ERR_EMAILINUSE = The specified email address is already in use. If you can't remember your username or password, please use the account recovery facility rather than attempt to make a new account. -LOGIN_ERR_INACTIVE = Your account is currently inactive. Please check your email for an 'Activation Required' email and follow the link it contains to activate your account. If you have not received an actication email, or need a new one, request a new activation email. +LOGIN_ERR_NOSELFREG = Self-registration is not currently permitted. +LOGIN_ERR_REGFAILED = Registration failed +LOGIN_ERR_BADRECAPTCHA = reCAPTCHA information in your request was missing or corrupt +LOGIN_ERR_RECAPTCHA = The reCAPTCHA verifcation step failed, please try again +LOGIN_ERR_BADEMAIL = The specified email address does not appear to be valid. +LOGIN_ERR_USERINUSE = The specified username is already in use. If you can't remember your password, please use the account recovery facility rather than attempt to make a new account. +LOGIN_ERR_EMAILINUSE = The specified email address is already in use. If you can't remember your username or password, please use the account recovery facility rather than attempt to make a new account. +LOGIN_ERR_INACTIVE = Your account is currently inactive. Please check your email for an 'Activation Required' email and follow the link it contains to activate your account. If you have not received an actication email, or need a new one, request a new activation email. # Registration done -LOGIN_REG_DONETITLE = Registration successful -LOGIN_REG_SUMMARY = Activation required! -LOGIN_REG_LONGDESC = A new user account has been created for you, and an email has been sent to you with your new account password and an activation link.

Please check your email for a message with the subject '{V_[sitename]} account created - Activation required!' and follow the instructions it contains to activate your account. +LOGIN_SIGNUP_DONETITLE = Signup successful +LOGIN_SIGNUP_SUMMARY = Activation required! +LOGIN_SIGNUP_MESSAGE = A new user account has been created for you, and an email has been sent to you with your new account password and an activation link.

Please check your email for a message with the subject '{V_[sitename]} account created - Activation required!' and follow the instructions it contains to activate your account. # Registration email -LOGIN_REG_SUBJECT = {V_[sitename]} account created - Activation required! -LOGIN_REG_GREETING = Hi %(username)s -LOGIN_REG_CREATED = A new account in the {V_[sitename]} system has just been created for you. Your username and password for the system are given below. -LOGIN_REG_ACTNEEDED = Before you can sign in, you must activate your account. To activate your account, please click on the following link, or copy and paste it into your web browser: -LOGIN_REG_ALTACT = Alternatively, enter the following code in the account activation form: -LOGIN_REG_ENJOY = Thank you for registering! +LOGIN_SIGNUP_SUBJECT = {V_[sitename]} account created - Activation required! +LOGIN_SIGNUP_GREETING = Hi %(username)s +LOGIN_SIGNUP_CREATED = A new account in the {V_[sitename]} system has just been created for you. Your username and password for the system are given below. +LOGIN_SIGNUP_ACTNEEDED = Before you can sign in, you must activate your account. To activate your account, please click on the following link, or copy and paste it into your web browser: +LOGIN_SIGNUP_ALTACT = Alternatively, enter the following code in the account activation form: +LOGIN_SIGNUP_ENJOY = Thank you for registering! # Activation related LOGIN_ACTCODE = Activation code diff --git a/templates/default/images/account.png b/templates/default/images/account.png new file mode 100755 index 0000000000000000000000000000000000000000..ff21d328a696d29fe307f330504fff2bd161314e GIT binary patch literal 4165 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
-
{L_LOGIN_REG_INTRO}
+
{L_LOGIN_SIGNUP_INTRO}
diff --git a/templates/default/login/signup_extrahead.tem b/templates/default/login/signup_extrahead.tem index 7100de8..efefa0c 100644 --- a/templates/default/login/signup_extrahead.tem +++ b/templates/default/login/signup_extrahead.tem @@ -1 +1,2 @@ - \ No newline at end of file + +