Added option to allow password reset (by Mithy).
authorJanusz Dobrowolski <janusz@frontaccounting.eu>
Sat, 26 Apr 2014 07:14:55 +0000 (09:14 +0200)
committerJanusz Dobrowolski <janusz@frontaccounting.eu>
Wed, 21 May 2014 12:23:16 +0000 (14:23 +0200)
access/login.php
access/password_reset.php [new file with mode: 0644]
admin/db/users_db.inc
config.default.php
includes/current_user.inc
includes/session.inc

index fbabe47ef317ca7ce1c3efa48e6223fba2df687a..799c91c175ff7f102c3b473cc7c7a6542f77ea5b 100644 (file)
@@ -29,6 +29,9 @@ function defaultCompany()
        else
        {
                $demo_text = _("Please login here");
+    if (@$allow_password_reset) {
+      $demo_text .= " "._("or")." <a href='$path_to_root/index.php?reset=1'>"._("request new password")."</a>";
+    }
        }
 
        if (check_faillog())
@@ -154,4 +157,4 @@ function defaultCompany()
        echo "</table><br><br>\n";
        echo "</body></html>\n";
 
-?>
\ No newline at end of file
+?>
diff --git a/access/password_reset.php b/access/password_reset.php
new file mode 100644 (file)
index 0000000..4ed58a2
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/**********************************************************************
+    Copyright (C) FrontAccounting, LLC.
+       Released under the terms of the GNU General Public License, GPL, 
+       as published by the Free Software Foundation, either version 3 
+       of the License, or (at your option) any later version.
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+    See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
+***********************************************************************/
+       if (!isset($path_to_root) || isset($_GET['path_to_root']) || isset($_POST['path_to_root']))
+               die(_("Restricted access"));
+       include_once($path_to_root . "/includes/ui.inc");
+       include_once($path_to_root . "/includes/page/header.inc");
+
+       $js = "<script language='JavaScript' type='text/javascript'>
+function defaultCompany()
+{
+       document.forms[0].company_login_name.options[".$_SESSION["wa_current_user"]->company."].selected = true;
+}
+</script>";
+       add_js_file('login.js');
+
+       if (!isset($def_coy))
+               $def_coy = 0;
+       $def_theme = "default";
+
+       $login_timeout = $_SESSION["wa_current_user"]->last_act;
+
+       $title = $app_title." ".$version." - "._("Password reset");
+       $encoding = isset($_SESSION['language']->encoding) ? $_SESSION['language']->encoding : "iso-8859-1";
+       $rtl = isset($_SESSION['language']->dir) ? $_SESSION['language']->dir : "ltr";
+       $onload = !$login_timeout ? "onload='defaultCompany()'" : "";
+
+       echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n";
+       echo "<html dir='$rtl' >\n";
+       echo "<head profile=\"http://www.w3.org/2005/10/profile\"><title>$title</title>\n";
+       echo "<meta http-equiv='Content-type' content='text/html; charset=$encoding' />\n";
+       echo "<link href='$path_to_root/themes/$def_theme/default.css' rel='stylesheet' type='text/css'> \n";
+       echo "<link href='$path_to_root/themes/default/images/favicon.ico' rel='icon' type='image/x-icon'> \n";
+       send_scripts();
+       echo $js;
+       echo "</head>\n";
+
+       echo "<body id='loginscreen' $onload>\n";
+
+       echo "<table class='titletext'><tr><td>$title</td></tr></table>\n";
+       
+       div_start('_page_body');
+       br();br();
+       start_form(false, false, @$_SESSION['timeout']['uri'], "resetform");
+       start_table(false, "class='login'");
+       start_row();
+       echo "<td align='center' colspan=2>";
+  echo "<a target='_blank' href='$power_url'><img src='$path_to_root/themes/$def_theme/images/logo_frontaccounting.png' alt='FrontAccounting' height='50' onload='fixPNG(this)' border='0' /></a>";
+       echo "</td>\n";
+       end_row();
+
+       echo "<input type='hidden' id=ui_mode name='ui_mode' value='".$_SESSION["wa_current_user"]->ui_mode."' />\n";
+       table_section_title(_("Version")." $version   Build $build_version - "._("Password reset"));
+
+       text_row(_("Email"), "email_entry_field", "", 20, 30);
+
+  if (isset($_SESSION['wa_current_user']->company))
+    $coy =  $_SESSION['wa_current_user']->company;
+  else
+    $coy = $def_coy;
+  if (!@$text_company_selection) {
+    echo "<tr><td>"._("Company")."</td><td><select name='company_login_name'>\n";
+    for ($i = 0; $i < count($db_connections); $i++)
+      echo "<option value=$i ".($i==$coy ? 'selected':'') .">" . $db_connections[$i]["name"] . "</option>";
+    echo "</select>\n";
+    echo "</td></tr>";
+  } else {
+//                     $coy = $def_coy;
+    text_row(_("Company"), "company_login_nickname", "", 20, 50);
+  }
+  start_row();
+  label_cell("Please enter your e-mail", "colspan=2 align='center' id='log_msg'");
+  end_row();
+       end_table(1);
+       echo "<center><input type='submit' value='&nbsp;&nbsp;"._("Send password -->")."&nbsp;&nbsp;' name='SubmitReset'
+                onclick='set_fullmode();' /></center>\n";
+
+       end_form(1);
+       $Ajax->addScript(true, "document.forms[0].password.focus();");
+
+    echo "<script language='JavaScript' type='text/javascript'>
+    //<![CDATA[
+            <!--
+            document.forms[0].email_entry_field.select();
+            document.forms[0].email_entry_field.focus();
+            //-->
+    //]]>
+    </script>";
+    div_end();
+       echo "<table class='bottomBar'>\n";
+       echo "<tr>";
+       if (isset($_SESSION['wa_current_user'])) 
+               $date = Today() . " | " . Now();
+       else    
+               $date = date("m/d/Y") . " | " . date("h.i am");
+       echo "<td class='bottomBarCell'>$date</td>\n";
+       echo "</tr></table>\n";
+       echo "<table class='footer'>\n";
+       echo "<tr>\n";
+       echo "<td><a target='_blank' href='$power_url' tabindex='-1'>$app_title $version - " . _("Theme:") . " " . $def_theme . "</a></td>\n";
+       echo "</tr>\n";
+       echo "<tr>\n";
+       echo "<td><a target='_blank' href='$power_url' tabindex='-1'>$power_by</a></td>\n";
+       echo "</tr>\n";
+       echo "</table><br><br>\n";
+       echo "</body></html>\n";
+
+?>
index 767dad30339d1363a6d1b2e1d3797683b457c036..7dfd7256a2a23a60fbd08a54a21f4abd97941d5f 100644 (file)
@@ -101,6 +101,17 @@ function get_user_by_login($user_id)
 
 //-----------------------------------------------------------------------------------------------
 
+function get_user_by_email($email)
+{
+       $sql = "SELECT * FROM ".TB_PREF."users WHERE email=".db_escape($email);
+
+       $result = db_query($sql, "could not get user for email $email");
+
+       return db_fetch($result);
+}
+
+//-----------------------------------------------------------------------------------------------
+
 function delete_user($id)
 {
        $sql="DELETE FROM ".TB_PREF."users WHERE id=".db_escape($id);
index 9bef6d927bdb56cc21c3dcb5e2cc42cc6ceea888..e3c3a6cf798580c79d75b0849de9ced8a6735dd0 100644 (file)
@@ -186,6 +186,9 @@ if (!isset($path_to_root) || isset($_GET['path_to_root']) || isset($_POST['path_
 
        $allow_demo_mode = false;
 
+    /* Whether to allow sending new password by e-mail */
+    $allow_password_reset = false;
+
        /* for uploaded item pictures */
        $pic_width              = 80;
        $pic_height     = 50;
index 7c7592e8139fa4da2c06e21941ae30305635c2d8..31f53ae6c411d79d26eb451cbf4024c8f6237c3d 100644 (file)
@@ -131,6 +131,32 @@ class current_user
                return $this->logged;
        }
 
+       function reset_password($company, $email) {
+               global $path_to_root, $app_title;
+
+               $this->set_company($company);
+               $this->logged = false;
+
+               set_global_connection();
+
+               $myrow = get_user_by_email($email);
+
+               if ($myrow['id'] != "") {
+
+                       $bytes = openssl_random_pseudo_bytes(8, $cstrong);
+                       $password   = base64_encode($bytes);
+
+                       $hash = md5($password);
+
+                       update_user_password($myrow['id'], $myrow['user_id'], $hash);
+
+                       mail($myrow['email'], _("New password for")." ".$app_title, $password);
+
+                       return true;
+               }
+       return false;
+    }
+
        function check_user_access()
        {
                global $security_groups;
index 869ce9a805820d5ee5ccb4145b72e07ebf850f00..1b9c5ce2daa48631079f207014ee2882f22f8cb3 100644 (file)
@@ -144,6 +144,35 @@ function login_fail()
        die();
 }
 
+function password_reset_fail()
+{
+       global $path_to_root;
+       
+  echo "<center><br><br><font size='5' color='red'><b>" . _("Incorrect Email") . "<b></font><br><br>";
+  echo "<b>" . _("The email address does not exist in the system.") . "<b><br><br>";
+
+  echo _("If you are not an authorized user, please contact your system administrator to obtain an account to enable you to use the system.");
+  echo "<br><a href='$path_to_root/index.php?reset=1'>" . _("Try again") . "</a>";
+  echo "</center>";
+
+       kill_login();
+       die();
+}
+
+function password_reset_success()
+{
+       global $path_to_root;
+
+  echo "<center><br><br><font size='5' color='green'><b>" . _("New password sent") . "<b></font><br><br>";
+  echo "<b>" . _("A new password has been sent to your mailbox.") . "<b><br><br>";
+
+  echo "<br><a href='$path_to_root/index.php'>" . _("Login here") . "</a>";
+  echo "</center>";
+       
+       kill_login();
+       die();
+}
+
 function check_faillog()
 {
        global $login_delay, $login_faillog, $login_max_attempts;
@@ -423,6 +452,33 @@ if (!defined('FA_LOGOUT_PHP_FILE')){
 
        if (!$_SESSION["wa_current_user"]->logged_in())
        {
+      if (@$allow_password_reset && !$allow_demo_mode
+        && (isset($_GET['reset']) || isset($_POST['email_entry_field']))) {
+                 if (!isset($_POST["email_entry_field"])) {
+        include($path_to_root . "/access/password_reset.php");
+        exit();
+      }
+      else {
+        if (isset($_POST["company_login_nickname"]) && !isset($_POST["company_login_name"])) {
+          for ($i = 0; $i < count($db_connections); $i++) {
+            if ($db_connections[$i]["name"] == $_POST["company_login_nickname"]) {
+              $_POST["company_login_name"] = $i;
+              unset($_POST["company_login_nickname"]);
+              break 1; // cannot pass variables to break from PHP v5.4 onwards
+            }
+          }
+        }
+        $_succeed = isset($db_connections[$_POST["company_login_name"]]) &&
+          $_SESSION["wa_current_user"]->reset_password($_POST["company_login_name"],
+          $_POST["email_entry_field"]);
+        if ($_succeed)
+        {
+          password_reset_success();
+        }
+
+        password_reset_fail();
+      }
+    }
                // Show login screen
                if (!isset($_POST["user_name_entry_field"]) or $_POST["user_name_entry_field"] == "")
                {