Developer guide     >     Developing Extensions     >     Examples

Login, password recovery

This is a ready to use login and password recovery Extension including an example Template. To install the example please follow the instructions:
 
  • Install the Extension
  • Create a new Template called Login and upload the login.html 
  • Assign that Template to a Page (this is your login Page)
  • Configure that login Page in the Extension settings available through the Extension administration panel
 
The login Page will be displayed in case a User does not own sufficient permissions to perform a Page request. Therefore you should setup Usergroups with differing permissions to test this out. 
  1. <?php
  2.     namespace com\yg;
  3.  
  4.     class PwdrecoveryLogin extends \PageExtension {
  5.         public $info = array(
  6.             "NAME" => "Password Recovery & Login Extension",
  7.             "DEVELOPERNAME" => "yeager GmbH",
  8.             "VERSION" => "1.0",
  9.             "API" => "1.0",
  10.             "DESCRIPTION" => "Password Recovery & Login Extension",
  11.             "PAGEDESCRIPTION" => "Password Recovery & Login Extension",
  12.             "URL" => "http://www.yeager.cm/",
  13.             "TYPE" => EXTENSION_PAGE,
  14.             "ASSIGNMENT" => EXTENSION_ASSIGNMENT_EXT_CONTROLLED
  15.         );
  16.  
  17.         public function install () {
  18.             if ( parent::install() ) {
  19.                
  20.                 // add properties for password recovery
  21.                 $this->extensionPropertySettings->add("Password recovery settings", "HEADLINE_RECOVERY", "HEADLINE");
  22.                 $this->extensionPropertySettings->add("Sender E-Mail address", "FROM_EMAIL", "TEXT");
  23.                 $this->extensionPropertySettings->add("Sender name", "FROM_NAME", "TEXT");
  24.                 $this->extensionPropertySettings->add("E-Mail Subject", "SUBJECT", "TEXT");
  25.                 $this->extensionPropertySettings->add("E-Mail content displayed before recovery link", "BODY_PT1", "TEXTAREA");
  26.                 $this->extensionPropertySettings->add("E-Mail content displayed after recovery link", "BODY_PT2", "TEXTAREA");
  27.  
  28.                 // add properties for login
  29.                 $this->extensionPropertySettings->add("Login settings", "HEADLINE_LOGIN", "HEADLINE");
  30.                 $this->extensionPropertySettings->add("Login Page", "STANDARD_LOGIN", "PAGE");
  31.                 $this->extensionPropertySettings->add("Fallback target Page after successful login", "STANDARD_REFERRER", "PAGE");
  32.                
  33.                 // add properties for logout
  34.                 $this->extensionPropertySettings->add("Logout settings", "HEADLINE_LOGOUT", "HEADLINE");
  35.                 $this->extensionPropertySettings->add("Page which will be loaded after logout", "STANDARD_LOGOUT_REFERRER", "PAGE");
  36.                 $this->extensionPropertySettings->add("Logout action", "LOGOUT_ACTION", "TEXT");
  37.                
  38.                 // set standardvalues for password recovery
  39.                 $this->extensionProperties->setValue('FROM_EMAIL', 'no-reply@example.com');
  40.                 $this->extensionProperties->setValue('FROM_NAME', 'Password service');
  41.                 $this->extensionProperties->setValue('SUBJECT', 'Your password');
  42.                 $this->extensionProperties->setValue('BODY_PT1', 'Dear user,\n\nplease click following link in order to reset your password:\n');
  43.                 $this->extensionProperties->setValue('BODY_PT2', '\n\nBest,\nXXX');
  44.                 $this->extensionProperties->setValue('LOGOUT_ACTION', 'logout');
  45.  
  46.                 return parent::setInstalled();
  47.             } else {
  48.                 return false;
  49.             }
  50.         }
  51.  
  52.         public function uninstall () {
  53.             if ( parent::uninstall() ) {
  54.                 return parent::setUnInstalled();
  55.             } else {
  56.                 return false;
  57.             }
  58.         }
  59.  
  60.         public function onRender ($args = NULL) {
  61.             $action = sApp()->request->parameters["action"];
  62.             sSmarty()->assign("action", $action);
  63.            
  64.             /* LOGIN */
  65.            
  66.             if ($action == "login") {
  67.  
  68.                 $email = sApp()->request->parameters['email'];
  69.                 $password = sApp()->request->parameters['password'];
  70.                 $yg_login_referrer = sApp()->request->parameters["yg_login_referrer"];
  71.  
  72.                 sUserMgr()->impersonate(sUserMgr()->getAdministratorID());
  73.                 $extproperties = $this->extensionProperties->get();
  74.                
  75.                 if ($yg_login_referrer == '') $yg_login_referrer = $extproperties['STANDARD_REFERRER']['URL'];
  76.                 sSmarty()->assign("yg_login_referrer", $yg_login_referrer);                
  77.                
  78.                 $userid = sUserMgr()->validate($email, $password);
  79.  
  80.                 sUserMgr()->unimpersonate();
  81.  
  82.                 if ($userid === false) {
  83.                     sSmarty()->assign("yg_login_error_code", "1");
  84.                     sSmarty()->assign('action', $action);
  85.                     sSmarty()->assign("email", $email);
  86.                 } else {
  87.                     sApp()->session->setPSessionVar("username", $email);
  88.                     sApp()->session->setPSessionVar("password", $password);
  89.                     sApp()->session->setPSessionVar("isvalidated", true);
  90.                     sApp()->session->cookie_time = 60*60*24*365*10;
  91.                     http_redirect($yg_login_referrer);
  92.                 }
  93.             }
  94.  
  95.             /* LOGOUT */
  96.             if ($action == $this->extensionProperties->getValue('LOGOUT_ACTION')) {
  97.                 $extproperties = $this->extensionProperties->get();
  98.                 $logout_referrer = $extproperties['STANDARD_LOGOUT_REFERRER']['URL'];
  99.                 sApp()->session->setPSessionVar('username', '');
  100.                 sApp()->session->setPSessionVar('password', '');
  101.                 sApp()->session->setPSessionVar('isvalidated', false);
  102.                 http_redirect($logout_referrer);
  103.             }
  104.            
  105.             /* PASSWORD RECOVERY */
  106.  
  107.             if ($action == "pwd_step1") {
  108.  
  109.                 sUserMgr()->impersonate(sUserMgr()->getAdministratorID());
  110.                 $email = sApp()->request->parameters["user_email"];
  111.                 $user_info = sUserMgr()->getByLogin($email);
  112.  
  113.                 if ($user_info) {
  114.                     $user = sUserMgr()->getUser($user_info['ID']);
  115.                     sUserMgr()->unimpersonate();
  116.                     $expireTS = time() + 60*60*24;
  117.                     $token = $user->generateToken($expireTS);
  118.  
  119.                     $page = $this->getPage();
  120.                     $pageUrl = $page->getUrl();
  121.  
  122.                     // Generate path for recovery URL                  
  123.                     $passwordResetUrl = sApp()->request->prefix.'://'.sApp()->request->http_host;
  124.                     $passwordResetUrl .= $pageUrl.'?action=pwd_step2&user_token='.urlencode($token);
  125.  
  126.                     echo($passwordResetUrl);
  127.  
  128.                     \framework\import("org.phpmailer.phpmailer");
  129.                     $mail = new \PHPMailer();
  130.                     $mail->Encoding = '8bit';
  131.                     $mail->CharSet  = 'utf-8';
  132.                     $mail->From  = $this->extensionProperties->getValue("FROM_EMAIL");
  133.                     $mail->FromName = $this->extensionProperties->getValue("FROM_NAME");
  134.                     $mail->Subject  = $this->extensionProperties->getValue("SUBJECT");
  135.                     $mail->Body  = $this->extensionProperties->getValue("BODY_PT1");
  136.                     $mail->Body .= "\n".$passwordResetUrl."\n";
  137.                     $mail->Body .= $this->extensionProperties->getValue("BODY_PT2");
  138.                     $mail->AddAddress($email);
  139.                     $smtpServer = (string)sapp()->config->getVar('CONFIG/MAILINGS/SMTP');
  140.                     if ($smtpServer) {
  141.                         $mail->IsSMTP();
  142.                         $mail->Host = $smtpServer;
  143.                     }
  144.                     $mail->Send();
  145.                     $mail->ClearAddresses();
  146.                     sSmarty()->assign('recovery_mail_sent', true);
  147.                 } else if(strlen(trim($email)) > 0) {
  148.                     sSmarty()->assign('error_step1', true);
  149.                 }
  150.             }
  151.  
  152.             if ($action == "pwd_step2") {
  153.                 $error_step2 = false;
  154.                 $form_send = sApp()->request->parameters['form_send'];
  155.                 sSmarty()->assign('form_send', $form_send);
  156.                 $token = sApp()->request->parameters['user_token'];
  157.                 sSmarty()->assign('user_token', $token);
  158.  
  159.                 $valid_token = \sUserMgr()->getUserIdByToken($token);
  160.                 if (!$valid_token) {
  161.                     $error_step2 = true;
  162.                     $error_token = true;
  163.                     sSmarty()->assign('error_step2', $error_step2);
  164.                     sSmarty()->assign('error_token', $error_token);
  165.                 }
  166.  
  167.                 if ($form_send == true && $valid_token == true) {
  168.                     $user_password = sapp()->request->parameters['user_password'];
  169.                     $user_password_repeat = sapp()->request->parameters['user_password_repeat'];
  170.                    
  171.                     $user_id = sUserMgr()->getUserIdByToken($token);
  172.                    
  173.                     sUserMgr()->impersonate(sUserMgr()->getAdministratorID());
  174.                     $user = sUserMgr()->getUser($user_id);
  175.                     sUserMgr()->unimpersonate();
  176.  
  177.                     $user_info = $user->get();
  178.  
  179.                     if ($user_info) {
  180.                         // Check if password is secure enough
  181.                         if($user_password != $user_password_repeat) {
  182.                             $error_repeat = true;
  183.                             sSmarty()->assign('error_repeat', $error_repeat);
  184.                             $error_step2 = true;
  185.                         }
  186.  
  187.                         $password_ok = sUserMgr()->verifyPasswordStrength($user_password);
  188.                         if (!$password_ok) {
  189.                             $error_chars = true;
  190.                             sSmarty()->assign('error_chars', $error_chars);
  191.                             $error_step2 = true;
  192.                         }
  193.  
  194.                         if (!$error_step2) {
  195.                             sUserMgr()->impersonate(sUserMgr()->getAdministratorID());
  196.                             $user = sUserMgr()->getUser($user_info['ID']);
  197.                             $user->setPassword($user_password);
  198.                             $user->removeToken();
  199.                             sUserMgr()->unimpersonate();
  200.                         } else {
  201.                             sSmarty()->assign('error_step2', $error_step2);
  202.                         }
  203.                     } else {
  204.                         $error_step2 = true;
  205.                         sSmarty()->assign('error_step2', $error_step2);
  206.                     }
  207.                 }
  208.             }
  209.             return true;
  210.         }
  211.  
  212.         public function onAccessDenied ($args = NULL) {
  213.  
  214.             sUserMgr()->impersonate(sUserMgr()->getAdministratorID());
  215.             $extproperties = $this->extensionProperties->get();
  216.             $loginUrl = $extproperties['STANDARD_LOGIN']['URL'];
  217.             sUserMgr()->unimpersonate();
  218.  
  219.             $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
  220.             $protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0, strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")) . $s;
  221.             $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
  222.             $referrer = $protocol . "://" . $_SERVER['SERVER_NAME'] . $port . $_SERVER['REQUEST_URI'];
  223.             $loginUrl .= "?yg_login_referrer=".$referrer;
  224.            
  225.             http_redirect($loginUrl);
  226.  
  227.         }
  228.  
  229.     }
  230.  
  231. ?>