diff --git a/plugins/passwordResetPlugin/loginResetDispatcher.php b/plugins/passwordResetPlugin/loginResetDispatcher.php
new file mode 100644
index 0000000..d53f8fe
--- /dev/null
+++ b/plugins/passwordResetPlugin/loginResetDispatcher.php
@@ -0,0 +1,418 @@
+.
+ *
+ * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
+ * California 94120-7775, or email info@knowledgetree.com.
+ *
+ * The interactive user interfaces in modified source and object code versions
+ * of this program must display Appropriate Legal Notices, as required under
+ * Section 5 of the GNU General Public License version 3.
+ *
+ * In accordance with Section 7(b) of the GNU General Public License version 3,
+ * these Appropriate Legal Notices must retain the display of the "Powered by
+ * KnowledgeTree" logo and retain the original copyright notice. If the display of the
+ * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
+ * must display the words "Powered by KnowledgeTree" and retain the original
+ * copyright notice.
+ * Contributor( s): ______________________________________
+ */
+
+// main library routines and defaults
+require_once('../../config/dmsDefaults.php');
+require_once(KT_LIB_DIR . '/templating/templating.inc.php');
+require_once(KT_LIB_DIR . '/session/control.inc');
+require_once(KT_LIB_DIR . '/session/Session.inc');
+require_once(KT_LIB_DIR . '/users/User.inc');
+require_once(KT_LIB_DIR . '/authentication/authenticationutil.inc.php');
+require_once(KT_LIB_DIR . '/help/help.inc.php');
+require_once(KT_LIB_DIR . '/help/helpreplacement.inc.php');
+require_once(KT_LIB_DIR . '/widgets/fieldWidgets.php');
+
+require_once('loginUtil.inc.php');
+
+class loginResetDispatcher extends KTDispatcher {
+
+ function do_main() {
+ global $default;
+ $oPage = $GLOBALS['main'];
+
+ // Check if the user is trying to reset their password.
+ $reset_password = $this->checkReset();
+
+ KTUtil::save_base_kt_url();
+
+ if (is_a($oUser, 'User')) {
+ $res = $this->performLogin($oUser);
+ if ($res) {
+ $oUser = array($res);
+ }
+ }
+ if (is_array($oUser) && count($oUser)) {
+ if (empty($_REQUEST['errorMessage'])) {
+ $_REQUEST['errorMessage'] = array();
+ } else {
+ $_REQUEST['errorMessage'] = array($_REQUEST['errorMessage']);
+ }
+ foreach ($oUser as $oError) {
+ $_REQUEST['errorMessage'][] = $oError->getMessage();
+ }
+ $_REQUEST['errorMessage'] = join('.
', $_REQUEST['errorMessage']);
+ }
+
+ if(!loginUtil::check()) { // bounce here, potentially.
+ // User is already logged in - get the redirect
+ $redirect = KTUtil::arrayGet($_REQUEST, 'redirect');
+
+ $cookietest = KTUtil::randomString();
+ setcookie("CookieTestCookie", $cookietest, 0);
+
+ $this->redirectTo('checkCookie', array(
+ 'cookieVerify' => $cookietest,
+ 'redirect' => $redirect,
+ ));
+ exit(0);
+ }
+
+ header('Content-type: text/html; charset=UTF-8');
+
+ $errorMessage = KTUtil::arrayGet($_REQUEST, 'errorMessage');
+ session_start();
+
+ $errorMessageConfirm = $_SESSION['errormessage']['login'];
+
+ $redirect = KTUtil::arrayGet($_REQUEST, 'redirect');
+
+ // Get the list of languages
+ $oReg =& KTi18nregistry::getSingleton();
+ $aRegisteredLangs = $oReg->geti18nLanguages('knowledgeTree');
+ $aLanguageNames = $oReg->getLanguages('knowledgeTree');
+ $aRegisteredLanguageNames = array();
+
+ if(!empty($aRegisteredLangs))
+ {
+ foreach (array_keys($aRegisteredLangs) as $sLang) {
+ $aRegisteredLanguageNames[$sLang] = $aLanguageNames[$sLang];
+ }
+
+ asort($aRegisteredLanguageNames);
+ }
+ $sLanguageSelect = $default->defaultLanguage;
+
+ // extra disclaimer, if plugin is enabled
+ $oRegistry =& KTPluginRegistry::getSingleton();
+ $oPlugin =& $oRegistry->getPlugin('ktstandard.disclaimers.plugin');
+ if (!PEAR::isError($oPlugin) && !is_null($oPlugin)) {
+ $sDisclaimer = $oPlugin->getLoginDisclaimer();
+ }
+
+ $js = array();
+ $css = array();
+ $js[] = '/thirdpartyjs/extjs/adapter/ext/ext-base.js';
+ $js[] = '/thirdpartyjs/extjs/ext-all.js';
+ $css[] = '/thirdpartyjs/extjs/resources/css/ext-all.css';
+
+ // Include additional js and css files
+ $oPlugin =& $oRegistry->getPlugin('password.reset.plugin');
+ $js[] = $oPlugin->getURLPath('resources/passwordReset.js');
+ $css[] = $oPlugin->getURLPath('resources/passwordReset.css');
+
+ $sUrl = KTUtil::addQueryStringSelf('action=');
+
+ $oTemplating =& KTTemplating::getSingleton();
+ $oTemplate = $oTemplating->loadTemplate('login_reset');
+ $aTemplateData = array(
+ 'errorMessage' => $errorMessage,
+ 'errorMessageConfirm' => $errorMessageConfirm,
+ 'redirect' => $redirect,
+ 'systemVersion' => $default->systemVersion,
+ 'versionName' => $default->versionName,
+ 'languages' => $aRegisteredLanguageNames,
+ 'selected_language' => $sLanguageSelect,
+ 'disclaimer' => $sDisclaimer,
+ 'js' => $js,
+ 'css' => $css,
+ 'sUrl' => $sUrl,
+ 'smallVersion' => substr($default->versionName,-17),
+ 'reset_password' => $reset_password
+ );
+ return $oTemplate->render($aTemplateData);
+ }
+
+ function simpleRedirectToMain($errorMessage, $url, $params) {
+ $params[] = 'errorMessage='. urlencode($errorMessage);
+ $url .= '?' . join('&', $params);
+ redirect($url);
+ exit(0);
+ }
+
+ function do_login() {
+ $aExtra = array();
+
+ if(!loginUtil::check()) { // bounce here, potentially.
+ // User is already logged in - get the redirect
+ $redirect = KTUtil::arrayGet($_REQUEST, 'redirect');
+
+ $cookietest = KTUtil::randomString();
+ setcookie("CookieTestCookie", $cookietest, 0);
+
+ $this->redirectTo('checkCookie', array(
+ 'cookieVerify' => $cookietest,
+ 'redirect' => $redirect,
+ ));
+ exit(0);
+ }
+
+ global $default;
+
+ $language = KTUtil::arrayGet($_REQUEST, 'language');
+ if (empty($language)) {
+ $language = $default->defaultLanguage;
+ }
+ setcookie("kt_language", $language, 2147483647, '/');
+
+ $redirect = KTUtil::arrayGet($_REQUEST, 'redirect');
+
+ $url = $_SERVER["PHP_SELF"];
+ $queryParams = array();
+
+ if ($redirect !== null) {
+ $queryParams[] = 'redirect=' . urlencode($redirect);
+ }
+
+ $username = KTUtil::arrayGet($_REQUEST,'username');
+ $password = KTUtil::arrayGet($_REQUEST,'password');
+
+ if (empty($username)) {
+ $this->simpleRedirectToMain(_kt('Please enter your username.'), $url, $queryParams);
+ }
+
+ $oUser =& User::getByUsername($username);
+ if (PEAR::isError($oUser) || ($oUser === false)) {
+ if (is_a($oUser, 'ktentitynoobjects')) {
+ loginUtil::handleUserDoesNotExist($username, $password, $aExtra);
+ }
+ $this->simpleRedirectToMain(_kt('Login failed. Please check your username and password, and try again.'), $url, $queryParams);
+ exit(0);
+ }
+
+ if (empty($password)) {
+ $this->simpleRedirectToMain(_kt('Please enter your password.'), $url, $queryParams);
+ }
+
+ $authenticated = KTAuthenticationUtil::checkPassword($oUser, $password);
+
+ if (PEAR::isError($authenticated)) {
+ $this->simpleRedirectToMain(_kt('Authentication failure. Please try again.'), $url, $queryParams);
+ exit(0);
+ }
+
+ if ($authenticated !== true) {
+ $this->simpleRedirectToMain(_kt('Login failed. Please check your username and password, and try again.'), $url, $queryParams);
+ exit(0);
+ }
+
+ $res = loginUtil::performLogin($oUser);
+
+ if ($res) {
+ $this->simpleRedirectToMain($res->getMessage(), $url, $queryParams);
+ exit(0);
+ }
+ }
+
+ function do_autoSignup() {
+ $oSource =& $this->oValidator->validateAuthenticationSource($_REQUEST['source_id']);
+ $oProvider =& KTAuthenticationUtil::getAuthenticationProviderForSource($oSource);
+ $oDispatcher = $oProvider->getSignupDispatcher($oSource);
+ $oDispatcher->subDispatch($this);
+ exit(0);
+ }
+
+ function do_checkCookie() {
+ $cookieTest = KTUtil::arrayGet($_COOKIE, "CookieTestCookie", null);
+ $cookieVerify = KTUtil::arrayGet($_REQUEST, 'cookieVerify', null);
+
+ $url = $_SERVER["PHP_SELF"];
+ $queryParams = array();
+ $redirect = KTUtil::arrayGet($_REQUEST, 'redirect');
+
+ if ($redirect !== null) {
+ $queryParams[] = 'redirect='. urlencode($redirect);
+ }
+
+ if ($cookieTest !== $cookieVerify) {
+ Session::destroy();
+ $this->simpleRedirectToMain(_kt('You must have cookies enabled to use the document management system.'), $url, $queryParams);
+ exit(0);
+ }
+
+ // check for a location to forward to
+ if ($redirect !== null) {
+ $url = $redirect;
+ // else redirect to the dashboard if there is none
+ } else {
+ $url = KTUtil::kt_url();
+
+ $config = KTConfig::getSingleton();
+ $redirectToBrowse = $config->get('KnowledgeTree/redirectToBrowse', false);
+ $redirectToDashboardList = $config->get('KnowledgeTree/redirectToBrowseExceptions', '');
+
+ if ($redirectToBrowse)
+ {
+ $exceptionsList = explode(',', str_replace(' ','',$redirectToDashboardList));
+ $user = User::get($_SESSION['userID']);
+ $username = $user->getUserName();
+ $url .= (in_array($username, $exceptionsList))?'/dashboard.php':'/browse.php';
+ }
+ else
+ {
+ $url .= '/dashboard.php';
+ }
+ }
+ exit(redirect($url));
+ }
+
+ function checkReset() {
+ $resetKey = (isset($_REQUEST['pword_reset'])) ? $_REQUEST['pword_reset'] : '';
+ if(!empty($resetKey)){
+ // Get the user id from the key
+ $aKey = explode('_', $resetKey);
+ $id = isset($aKey[1]) ? $aKey[1] : '';
+
+ // Match the key to the one stored in the database and check the expiry date
+ $storedKey = KTUtil::getSystemSetting('password_reset_key-'.$id);
+ $expiry = KTUtil::getSystemSetting('password_reset_expire-'.$id);
+
+ if($expiry < time()){
+ $_REQUEST['errorMessage'] = _kt('The password reset key has expired, please send a new request.');
+ }else if($storedKey != $resetKey){
+ $_REQUEST['errorMessage'] = _kt('Unauthorised access denied.');
+ }else{
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function do_sendResetRequest(){
+ $email = $_REQUEST['email'];
+ $user = $_REQUEST['username'];
+
+ // Check that the user and email match up in the database
+ $sQuery = 'SELECT id FROM users WHERE username = ? AND email = ?';
+ $aParams = array($user, $email);
+ $id = DBUtil::getOneResultKey(array($sQuery, $aParams), 'id');
+
+ if(!is_numeric($id) || $id < 1) {
+ return _kt('Please check that you have entered a valid username and email address.');
+ }
+
+ // Generate a random key that expires after 24 hours
+ $expiryDate = time()+86400;
+ $randomKey = rand(20000, 100000)."_{$id}_".KTUtil::getSystemIdentifier();
+ KTUtil::setSystemSetting('password_reset_expire-'.$id, $expiryDate);
+ KTUtil::setSystemSetting('password_reset_key-'.$id, $randomKey);
+
+ // Create the link to reset the password
+ $query = 'pword_reset='.$randomKey;
+ $url = KTUtil::addQueryStringSelf($query);
+// $url = KTUtil::kt_url() . '/login.php?' . $query;
+
+ $subject = APP_NAME . ': ' . _kt('password reset request');
+
+ $body = '
'; + $body .= _kt('You have requested to reset the password for your account. To confirm that the request was submitted by you + click on the link below, you will then be able to reset your password.'); + $body .= "
'; + $body .= _kt('Your password has been successfully reset, click the link below to login.'); + $body .= "
{$disclaimer}
+
+
+ {* Added for live *}
+ {i18n}Access to this service is subject to the KnowledgeTreeLive Terms and Conditions of use.{/i18n}
+ {i18n}© 2008 KnowledgeTree Inc. All Rights Reserved{/i18n}
+
+ {* Removed for live
+ {i18n arg_appname="$appname"}#appname# Version{/i18n} {$versionName}
+ {i18n}Document Management Software{/i18n}
+ {i18n}© 2008 KnowledgeTree Inc.{/i18n}
+ {if ($smallVersion == 'Community Edition')}
+ {i18n}This program is free software and published under the GNU General Public License version 3{/i18n}
+ {else}
+ {i18n}All rights reserved.{/i18n}
+ {/if}
+ *}
+