From 32e98c7f66b73f6262ed95e11fac1a939a592de0 Mon Sep 17 00:00:00 2001 From: Quitta Date: Fri, 20 Sep 2013 23:36:19 +0200 Subject: [PATCH] forgot password added --- .../ams_lib/autoload/mail_handler.php | 2 +- .../ryzom_ams/ams_lib/translations/en.ini | 46 +++++++++++- .../ryzom_ams/ams_lib/translations/fr.ini | 42 ++++++++++- .../ryzom_ams/www/html/autoload/webusers.php | 34 ++++++--- .../www/html/func/forgot_password.php | 50 +++++++++++++ .../www/html/func/reset_password.php | 44 +++++++++++ .../www/html/inc/forgot_password.php | 8 ++ .../ryzom_ams/www/html/inc/reset_password.php | 31 ++++++++ .../tools/server/ryzom_ams/www/html/index.php | 25 +++++-- .../server/ryzom_ams/www/html/sql/install.php | 4 +- .../ryzom_ams/www/html/sql/ticketsql.sql | 4 +- .../www/html/sql/ticketsystemmodel.mwb | Bin 19332 -> 19324 bytes .../www/html/templates/forgot_password.tpl | 55 ++++++++++++++ .../ryzom_ams/www/html/templates/login.tpl | 4 +- .../www/html/templates/reset_password.tpl | 70 ++++++++++++++++++ .../www/html/templates/reset_success.tpl | 47 ++++++++++++ 16 files changed, 439 insertions(+), 27 deletions(-) create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/forgot_password.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/func/reset_password.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/forgot_password.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/inc/reset_password.php create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/forgot_password.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_password.tpl create mode 100644 code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_success.tpl diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php index 0f434fcf9..dde8d4e02 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php @@ -345,7 +345,7 @@ class Mail_Handler{ } //if ticket id is found, that means it is a reply on an existing ticket - if($ticket_id){ + if($ticket_id && is_numeric($ticket_id) && $ticket_id > 0){ $ticket = new Ticket(); $ticket->load_With_TId($ticket_id); diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini index db50a7398..4c8f45b3a 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/en.ini @@ -8,6 +8,31 @@ home_info = "Welcome to the Ryzom Core - Account Management System" [settings] +[forgot_password] +title = "Forgot your password?" +forgot_password_message = "Fill in your account's emailaddress to reset the password!" +email_tag = "Email Address" +email_tooltip = "The emailaddress related to the account of which you forgot the password." +email_default = "Email" +email_doesnt_exist = "That emailaddress doesn't match any user!" +email_sent = "An email with further instructions has been sent to the emailaddress!" + +[reset_password] +title = "Reset your password" +reset_password_message = "Fill in your new password!" + +password_tag = "Desired Password" +password_tooltip = "Pick a hard to guess password (it must be 5-20 characters)." +password_message = "Password must be 5-20 characters." +password_default = "Password" + +cpassword_tag = "Confirm Password" +cpassword_tooltip = "Retype your Password" +cpassword_message = "Retype your Password" +cpassword_default = "Re-enter Password" + + + [syncing] syncing_title = "LibDB-Query List" syncing_info = "Here you can see the entire list of elements in the LibDB-Query table. You can easily remove elements and by pressing 'Synchronize' you can start the syncing process manually!" @@ -97,7 +122,8 @@ userlist_info = "welcome to the userlist" login_info = "Please login with your Username and Password." login_error_message = "The username/password were not correct!" login_register_message ="Register If you don't have an account yet, create one" -login_register_message_here = "here" +login_here = "here" +login_forgot_password_message = "In case you forgot your password, click" [logout] logout_message = "You've been logged out successfully!" @@ -105,6 +131,14 @@ login_title = "Login" login_timer = "You will be redirected to the login page in " login_text = "Or click here if you don't want to wait!" + +[reset_success] +reset_success_message = "You've changed the password succesfully!" +reset_success_title = "Login" +reset_success_timer = "You will be redirected to the login page in " +login_text = "Or click here if you don't want to wait!" + + [register_feedback] status_ok = "You registered like a baws!" status_shardoffline = "It seems the shard is offline, you can use the web-account, but you will need to wait for the shard." @@ -191,4 +225,14 @@ email_subject_warn_unknown_sender = "You tried to reply to someone's ticket!" email_body_warn_unknown_sender = "It seems you tried to reply to someone's ticket, However this email address isn't linked to any account, please use the matching email address to that account! This action is notified to the real ticket owner!" +;=========================================================================== + +;FORGOTPASSWORD +;=========================================================================== +email_subject_forgot_password = "Request to reset your password" +email_body_forgot_password_header = "A request to reset your account's password has been made, you can do this by going to the following link: +" +email_body_forgot_password_footer = " +---------- +If you didn't make this request, please ignore this message." ;=========================================================================== \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini index 6e9a66ab0..da25a0194 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/translations/fr.ini @@ -7,6 +7,29 @@ home_info = "Bienvenue sur le Ryzom Core - Account Management System" [settings] +[forgot_password] +title = "Oubliez votre passport?" +forgot_password_message = "Entrer votre email address pour reseter le passport!" +email_tag = "Email Address" +email_tooltip = "le emailaddress liee au compte dont vous avez oublie le mot de passe." +email_default = "Email" +email_doesnt_exist = "C'est emailaddress ne correspond pas a n'importe quel utilisateur!" +email_sent = "Un e-mail avec des instructions a ete envoye a l'adresse email!" + +[reset_password] +title = "reset votre email" +reset_password_message = "Entrer votre nouveaux mot de passe!" + +password_tag = "desire Mot de passe:" +password_tooltip = "Prendre un mot de passe dificille, il faut etre 5-20 caracteres" +password_message = "mot de passe doit être 5-20 caractères." +password_default = "Mot de passe" + +cpassword_tag = "Confirmer le mot de passe:" +cpassword_message = "Retapez votre mot de passe" +cpassword_tooltip = "Retapez votre mot de passe" +cpassword_default = "Re-entrer mot de passe" + [syncing] syncing_title = "LibDB-Query Liste" syncing_info = "Ici vous pouvez voir la liste complete des elements dans le tableau libdb-Query. Vous pouvez facilement supprimer des elements et appuyant sur 'Synchroniser', vous pouvez commencer le processus de synchronisation manuellement!" @@ -93,7 +116,8 @@ userlist_info = "bienvenue sur le userlist page!" login_info = "S'il vous plait vous connecter avec votre nom d'utilisateur et mot de passe." login_error_message = "Le remplie nom d'utilisateur / mot de passe ne sont pas correctes!" login_register_message =" Inscrivez-vous Si vous n'avez pas encore de compte, creez-en un" -login_register_message_here = "ici" +login_here = "ici" +login_forgot_password_message = "Dans le cas ou vous avez oublie votre mot de passe, cliquez" [logout] logout_message = "Vous avez été déconnecté avec succès!" @@ -101,6 +125,12 @@ login_title = "Identifier" login_timer = "Vous serez redirigé vers la page de connexion à " login_text = "Ou cliquez ici si vous ne voulez pas attendre!" +[reset_success] +logout_message = "Vous avez changez votre passport bien!" +login_title = "Identifier" +login_timer = "Vous serez redirigé vers la page de connexion à " +login_text = "Ou cliquez ici si vous ne voulez pas attendre!" + [register_feedback] status_ok = "Vous vous êtes inscrit comme un patron!" status_shardoffline = "Il semble que le shard est déconnecté, vous pouvez utiliser le web-compte, mais vous devrez attendre pour le tesson." @@ -187,4 +217,14 @@ email_subject_warn_unknown_sender = "Vous avez tent email_body_warn_unknown_sender = "Il semble que vous avez essayé de répondre à la billetterie de quelqu'un, mais cette adresse e-mail n'est pas liée à un compte, veuillez utiliser l'adresse e-mail correspondant à ce compte! Cet acte est notifié au propriétaire du billet de vrai!" +;=========================================================================== + +;FORGOTPASSWORD +;=========================================================================== +email_subject_forgot_password = "Demande pour reinitialiser votre mot de passe" +email_body_forgot_password_header = "Une demande de reinitialiser le mot de passe de votre compte a ete faite, vous pouvez le faire en allant sur le lien suivant: +" +email_body_forgot_password_footer = " +---------- +Si vous n'avez pas fait cette demande, s'il vous plait ignorer ce message." ;=========================================================================== \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php index a2ca530a8..cd6d38ed3 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php @@ -154,6 +154,16 @@ class WebUsers extends Users{ } return $this->email; } + + /** + * get the hashed password + */ + public function getHashedPass(){ + $dbw = new DBLayer("web"); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE UId=:id", array('id' => $this->uId)); + $row = $statement->fetch(); + return $row['Password']; + } /** @@ -221,17 +231,19 @@ class WebUsers extends Users{ * @return ok if it worked, if the lib or shard is offline it will return liboffline or shardoffline. */ public function setPassword($user, $pass){ - $reply = WebUsers::setAmsPassword($user, $pass); - $values = Array('user' => $user, 'pass' => $pass); - try { - //make connection with and put into shard db - $dbw = new DBLayer("web"); - $dbw->execute("UPDATE ams_user SET Password = :pass WHERE Login = :user ",$values); - } - catch (PDOException $e) { - //ERROR: the web DB is offline - } - return $reply; + + $hashpass = crypt($pass, WebUsers::generateSALT()); + $reply = WebUsers::setAmsPassword($user, $hashpass); + $values = Array('user' => $user, 'pass' => $hashpass); + try { + //make connection with and put into shard db + $dbw = new DBLayer("web"); + $dbw->execute("UPDATE ams_user SET Password = :pass WHERE Login = :user ",$values); + } + catch (PDOException $e) { + //ERROR: the web DB is offline + } + return $reply; } diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/forgot_password.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/forgot_password.php new file mode 100644 index 000000000..3ec14667b --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/forgot_password.php @@ -0,0 +1,50 @@ +getUsername(); + $target_hashedPass = $webUser->getHashedPass(); + $hashed_key = hash('sha512',$target_hashedPass); + + if ( isset( $_COOKIE['Language'] ) ) { + $lang = $_COOKIE['Language']; + }else{ + global $DEFAULT_LANGUAGE; + $lang = $DEFAULT_LANGUAGE; + } + + global $AMS_TRANS; + $variables = parse_ini_file( $AMS_TRANS . '/' . $lang . '.ini', true ); + $mailText = array(); + foreach ( $variables['email'] as $key => $value ){ + $mailText[$key] = $value; + } + + //create the reset url + global $WEBPATH; + $resetURL = $WEBPATH . "?page=reset_password&user=". $target_username . "&email=" . $email . "&key=" . $hashed_key; + //set email stuff + $recipient = $email; + $subject = $mailText['email_subject_forgot_password']; + $body = $mailText['email_body_forgot_password_header'] . $resetURL . $mailText['email_body_forgot_password_footer']; + Mail_Handler::send_mail($recipient, $subject, $body, NULL); + $result['EMAIL_SUCCESS'] = 'TRUE'; + $result['prevEmail'] = $email; + $result['no_visible_elements'] = 'TRUE'; + helpers :: loadtemplate( 'forgot_password', $result); + exit; + + +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/func/reset_password.php b/code/ryzom/tools/server/ryzom_ams/www/html/func/reset_password.php new file mode 100644 index 000000000..c665b72a4 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/func/reset_password.php @@ -0,0 +1,44 @@ +getHashedPass()) == $key) ){ + $params = Array( 'user' => $user, 'CurrentPass' => "dummy", 'NewPass' => $password, 'ConfirmNewPass' => $confirmpass, 'adminChangesOther' => true); + $result = $webUser->check_change_password($params); + if ($result == "success"){ + $result = array(); + $status = WebUsers::setPassword($user, $password); + if($status == 'ok'){ + $result['SUCCESS_PASS'] = "OK"; + }else if($status == 'shardoffline'){ + $result['SUCCESS_PASS'] = "SHARDOFF"; + } + $result['no_visible_elements'] = 'TRUE'; + helpers :: loadtemplate( 'reset_success', $result); + exit; + } + $GETString = ""; + foreach($_GET as $key => $value){ + $GETString = $GETString . $key . '=' . $value . "&"; + } + if($GETString != ""){ + $GETString = '?'.$GETString; + } + $result['getstring'] = $GETString; + $result['prevNewPass'] = $password; + $result['prevConfirmNewPass'] = $confirmpass; + $result['no_visible_elements'] = 'TRUE'; + helpers :: loadtemplate( 'reset_password', $result); + exit; + + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/inc/forgot_password.php b/code/ryzom/tools/server/ryzom_ams/www/html/inc/forgot_password.php new file mode 100644 index 000000000..c8c7dd410 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/inc/forgot_password.php @@ -0,0 +1,8 @@ +getHashedPass()) == $key) ){ + //you are allowed on the page! + + $GETString = ""; + foreach($_GET as $key => $value){ + $GETString = $GETString . $key . '=' . $value . "&"; + } + if($GETString != ""){ + $GETString = '?'.$GETString; + } + $pageElements['getstring'] = $GETString; + + return $pageElements; + + }else{ + global $WEBPATH; + $_SESSION['error_code'] = "403"; + header("Location: ".$WEBPATH."?page=error"); + exit; + } +} \ No newline at end of file diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/index.php b/code/ryzom/tools/server/ryzom_ams/www/html/index.php index b7b12e11b..40b4e6535 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/index.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/index.php @@ -33,12 +33,23 @@ if ( ! isset( $_GET["page"]) ){ if(isset($_SESSION['user'])){ $page = $_GET["page"]; }else{ - if($_GET["page"] == 'register'){ - $page = 'register'; - }else{ - $page = 'login'; - } - + switch($_GET["page"]){ + case 'register': + $page = 'register'; + break; + case 'forgot_password': + $page = 'forgot_password'; + break; + case 'reset_password': + $page = 'reset_password'; + break; + case 'error': + $page = 'error'; + break; + default: + $page = 'login'; + break; + } } } @@ -80,7 +91,7 @@ if(isset($_SESSION['ticket_user'])){ //hide sidebar + topbar in case of login/register -if($page == 'login' || $page == 'register' || $page == 'logout'){ +if($page == 'login' || $page == 'register' || $page == 'logout' || $page == 'forgot_password' || $page == 'reset_password'){ $return['no_visible_elements'] = 'TRUE'; }else{ $return['no_visible_elements'] = 'FALSE'; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php index 1859fbf25..0130f1a65 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php @@ -383,9 +383,9 @@ `Body` VARCHAR(400) NULL , `Status` VARCHAR(45) NULL , `Attempts` VARCHAR(45) NULL DEFAULT 0 , - `UserId` INT(10) UNSIGNED NOT NULL , + `UserId` INT(10) UNSIGNED NULL , `MessageId` VARCHAR(45) NULL , - `TicketId` INT UNSIGNED NOT NULL , + `TicketId` INT UNSIGNED NULL , `Sender` INT(10) UNSIGNED NULL , PRIMARY KEY (`MailId`) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql index 452a8f1d5..2fd0a6049 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql @@ -309,9 +309,9 @@ CREATE TABLE IF NOT EXISTS `mydb`.`email` ( `Body` VARCHAR(400) NULL , `Status` VARCHAR(45) NULL , `Attempts` VARCHAR(45) NULL DEFAULT 0 , - `UserId` INT(10) UNSIGNED NOT NULL , + `UserId` INT(10) UNSIGNED NULL , `MessageId` VARCHAR(45) NULL , - `TicketId` INT UNSIGNED NOT NULL , + `TicketId` INT UNSIGNED NULL , `Sender` INT(10) UNSIGNED NULL , PRIMARY KEY (`MailId`) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb index 29fea1b36fe7c5a3113394f41cb980ca44c644e0..090f61a7f00bab1c255dfc3163b2319b80c9a432 100644 GIT binary patch delta 17126 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 TDF)MDCfj+-G0vVG>#Ys|^i*8j delta 17112 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

0`PI8!{bKU@dr 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 o& +

+ + +
+ +
+{/block} + + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/login.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/login.tpl index 15d18f3e3..d003906c5 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/templates/login.tpl +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/login.tpl @@ -12,7 +12,7 @@
{$login_info}
-
+
@@ -43,7 +43,7 @@
{/if}
- {$login_register_message} {$login_register_message_here}! + {$login_register_message} {$login_here}.
{$login_forgot_password_message} {$login_here}
diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_password.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_password.tpl new file mode 100644 index 000000000..5592d7f40 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_password.tpl @@ -0,0 +1,70 @@ +{extends file="layout.tpl"} +{block name=content} + +
+ +
+ +
+ +
+{/block} + + diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_success.tpl b/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_success.tpl new file mode 100644 index 000000000..fed77e893 --- /dev/null +++ b/code/ryzom/tools/server/ryzom_ams/www/html/templates/reset_success.tpl @@ -0,0 +1,47 @@ +{extends file="layout.tpl"} +{block name=content} + +
+ +
+ +
+ +
+{/block} +