PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/htroot/manager/processors/login.processor.php

https://github.com/gunf/novo-isaak.local
PHP | 301 lines | 281 code | 11 blank | 9 comment | 29 complexity | bbbacf173b95e4d964f5769b5481ab4c MD5 | raw file
  1. <?php
  2. require_once(strtr(realpath(dirname(__FILE__)), '\\', '/').'/../includes/protect.inc.php');
  3. // set the include_once path
  4. if(version_compare(phpversion(), "4.3.0")>=0) {
  5. set_include_path(get_include_path() . PATH_SEPARATOR . "../includes/");
  6. } else {
  7. ini_set("include_path", "../includes/"); // include path the old way
  8. }
  9. define("IN_MANAGER_MODE", "true"); // we use this to make sure files are accessed through
  10. // the manager instead of seperately.
  11. // include the database configuration file
  12. include_once "config.inc.php";
  13. // start session
  14. startCMSSession();
  15. // connect to the database
  16. if(@!$modxDBConn = mysql_connect($database_server, $database_user, $database_password)) {
  17. die("Failed to create the database connection!");
  18. } else {
  19. mysql_select_db($dbase);
  20. @mysql_query("{$database_connection_method} {$database_connection_charset}");
  21. }
  22. // get the settings from the database
  23. include_once "settings.inc.php";
  24. // include version info
  25. include_once "version.inc.php";
  26. // include the logger
  27. include_once "log.class.inc.php";
  28. // include the crypto thing
  29. include_once "crypt.class.inc.php";
  30. // Initialize System Alert Message Queque
  31. if (!isset($_SESSION['SystemAlertMsgQueque'])) $_SESSION['SystemAlertMsgQueque'] = array();
  32. $SystemAlertMsgQueque = &$_SESSION['SystemAlertMsgQueque'];
  33. // include_once the error handler
  34. include_once "error.class.inc.php";
  35. $e = new errorHandler;
  36. // initiate the content manager class
  37. include_once "document.parser.class.inc.php";
  38. $modx = new DocumentParser;
  39. $modx->loadExtension("ManagerAPI");
  40. $modx->getSettings();
  41. $etomite = &$modx; // for backward compatibility
  42. $username = $modx->db->escape($_REQUEST['username']);
  43. $givenPassword = $modx->db->escape($_REQUEST['password']);
  44. $captcha_code = $_REQUEST['captcha_code'];
  45. $rememberme= $_REQUEST['rememberme'];
  46. $failed_allowed = $modx->config["failed_login_attempts"];
  47. // invoke OnBeforeManagerLogin event
  48. $modx->invokeEvent("OnBeforeManagerLogin",
  49. array(
  50. "username" => $username,
  51. "userpassword" => $givenPassword,
  52. "rememberme" => $rememberme
  53. ));
  54. $sql = "SELECT $dbase.`".$table_prefix."manager_users`.*, $dbase.`".$table_prefix."user_attributes`.* FROM $dbase.`".$table_prefix."manager_users`, $dbase.`".$table_prefix."user_attributes` WHERE BINARY $dbase.`".$table_prefix."manager_users`.username = '".$username."' and $dbase.`".$table_prefix."user_attributes`.internalKey=$dbase.`".$table_prefix."manager_users`.id;";
  55. $rs = mysql_query($sql);
  56. $limit = mysql_num_rows($rs);
  57. if($limit==0 || $limit>1) {
  58. jsAlert($e->errors[900]);
  59. return;
  60. }
  61. $row = mysql_fetch_assoc($rs);
  62. $internalKey = $row['internalKey'];
  63. $dbasePassword = $row['password'];
  64. $failedlogins = $row['failedlogincount'];
  65. $blocked = $row['blocked'];
  66. $blockeduntildate = $row['blockeduntil'];
  67. $blockedafterdate = $row['blockedafter'];
  68. $registeredsessionid = $row['sessionid'];
  69. $role = $row['role'];
  70. $lastlogin = $row['lastlogin'];
  71. $nrlogins = $row['logincount'];
  72. $fullname = $row['fullname'];
  73. $email = $row['email'];
  74. // get the user settings from the database
  75. $sql = "SELECT setting_name, setting_value FROM $dbase.`".$table_prefix."user_settings` WHERE user='".$internalKey."' AND setting_value!=''";
  76. $rs = mysql_query($sql);
  77. while ($row = mysql_fetch_assoc($rs)) {
  78. ${$row['setting_name']} = $row['setting_value'];
  79. }
  80. // blocked due to number of login errors.
  81. if($failedlogins>=$failed_allowed && $blockeduntildate>time()) {
  82. @session_destroy();
  83. session_unset();
  84. jsAlert($e->errors[902]);
  85. return;
  86. }
  87. // blocked due to number of login errors, but get to try again
  88. if($failedlogins>=$failed_allowed && $blockeduntildate<time()) {
  89. $sql = "UPDATE $dbase.`".$table_prefix."user_attributes` SET failedlogincount='0', blockeduntil='".(time()-1)."' where internalKey=$internalKey";
  90. $rs = mysql_query($sql);
  91. }
  92. // this user has been blocked by an admin, so no way he's loggin in!
  93. if($blocked=="1") {
  94. @session_destroy();
  95. session_unset();
  96. jsAlert($e->errors[903]);
  97. return;
  98. }
  99. // blockuntil: this user has a block until date
  100. if($blockeduntildate>time()) {
  101. @session_destroy();
  102. session_unset();
  103. jsAlert("You are blocked and cannot log in! Please try again later.");
  104. return;
  105. }
  106. // blockafter: this user has a block after date
  107. if($blockedafterdate>0 && $blockedafterdate<time()) {
  108. @session_destroy();
  109. session_unset();
  110. jsAlert("You are blocked and cannot log in! Please try again later.");
  111. return;
  112. }
  113. // allowed ip
  114. if ($allowed_ip) {
  115. if(($hostname = gethostbyaddr($_SERVER['REMOTE_ADDR'])) && ($hostname != $_SERVER['REMOTE_ADDR'])) {
  116. if(gethostbyname($hostname) != $_SERVER['REMOTE_ADDR']) {
  117. jsAlert("Your hostname doesn't point back to your IP!");
  118. return;
  119. }
  120. }
  121. if(!in_array($_SERVER['REMOTE_ADDR'], explode(',',str_replace(' ','',$allowed_ip)))) {
  122. jsAlert("You are not allowed to login from this location.");
  123. return;
  124. }
  125. }
  126. // allowed days
  127. if ($allowed_days) {
  128. $date = getdate();
  129. $day = $date['wday']+1;
  130. if (strpos($allowed_days,"$day")===false) {
  131. jsAlert("You are not allowed to login at this time. Please try again later.");
  132. return;
  133. }
  134. }
  135. // invoke OnManagerAuthentication event
  136. $rt = $modx->invokeEvent("OnManagerAuthentication",
  137. array(
  138. "userid" => $internalKey,
  139. "username" => $username,
  140. "userpassword" => $givenPassword,
  141. "savedpassword" => $dbasePassword,
  142. "rememberme" => $rememberme
  143. ));
  144. // check if plugin authenticated the user
  145. if (!$rt||(is_array($rt) && !in_array(TRUE,$rt))) {
  146. // check user password - local authentication
  147. if($dbasePassword != md5($givenPassword)) {
  148. jsAlert($e->errors[901]);
  149. $newloginerror = 1;
  150. }
  151. }
  152. if($use_captcha==1) {
  153. if (!isset ($_SESSION['veriword'])) {
  154. jsAlert('Captcha is not configured properly.');
  155. return;
  156. }
  157. elseif ($_SESSION['veriword'] != $captcha_code) {
  158. jsAlert($e->errors[905]);
  159. $newloginerror = 1;
  160. }
  161. }
  162. if($newloginerror) {
  163. //increment the failed login counter
  164. $failedlogins += 1;
  165. $sql = "update $dbase.`".$table_prefix."user_attributes` SET failedlogincount='$failedlogins' where internalKey=$internalKey";
  166. $rs = mysql_query($sql);
  167. if($failedlogins>=$failed_allowed) {
  168. //block user for too many fail attempts
  169. $sql = "update $dbase.`".$table_prefix."user_attributes` SET blockeduntil='".(time()+($blocked_minutes*60))."' where internalKey=$internalKey";
  170. $rs = mysql_query($sql);
  171. } else {
  172. //sleep to help prevent brute force attacks
  173. $sleep = (int)$failedlogins/2;
  174. if($sleep>5) $sleep = 5;
  175. sleep($sleep);
  176. }
  177. @session_destroy();
  178. session_unset();
  179. return;
  180. }
  181. $currentsessionid = session_id();
  182. $_SESSION['usertype'] = 'manager'; // user is a backend user
  183. // get permissions
  184. $_SESSION['mgrShortname']=$username;
  185. $_SESSION['mgrFullname']=$fullname;
  186. $_SESSION['mgrEmail']=$email;
  187. $_SESSION['mgrValidated']=1;
  188. $_SESSION['mgrInternalKey']=$internalKey;
  189. $_SESSION['mgrFailedlogins']=$failedlogins;
  190. $_SESSION['mgrLastlogin']=$lastlogin;
  191. $_SESSION['mgrLogincount']=$nrlogins; // login count
  192. $_SESSION['mgrRole']=$role;
  193. $sql="SELECT * FROM $dbase.`".$table_prefix."user_roles` WHERE id=".$role.";";
  194. $rs = mysql_query($sql);
  195. $row = mysql_fetch_assoc($rs);
  196. $_SESSION['mgrPermissions'] = $row;
  197. // successful login so reset fail count and update key values
  198. if(isset($_SESSION['mgrValidated'])) {
  199. $sql = "update $dbase.`".$table_prefix."user_attributes` SET failedlogincount=0, logincount=logincount+1, lastlogin=thislogin, thislogin=".time().", sessionid='$currentsessionid' where internalKey=$internalKey";
  200. $rs = mysql_query($sql);
  201. }
  202. // get user's document groups
  203. $dg='';$i=0;
  204. $tblug = $dbase.".`".$table_prefix."member_groups`";
  205. $tbluga = $dbase.".`".$table_prefix."membergroup_access`";
  206. $sql = "SELECT uga.documentgroup
  207. FROM $tblug ug
  208. INNER JOIN $tbluga uga ON uga.membergroup=ug.user_group
  209. WHERE ug.member =".$internalKey;
  210. $rs = mysql_query($sql);
  211. while ($row = mysql_fetch_row($rs)) $dg[$i++]=$row[0];
  212. $_SESSION['mgrDocgroups'] = $dg;
  213. if($rememberme == '1') {
  214. $_SESSION['modx.mgr.session.cookie.lifetime']= intval($modx->config['session.cookie.lifetime']);
  215. // Set a cookie separate from the session cookie with the username in it.
  216. // Are we using secure connection? If so, make sure the cookie is secure
  217. global $https_port;
  218. $secure = ( (isset ($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') || $_SERVER['SERVER_PORT'] == $https_port);
  219. if ( version_compare(PHP_VERSION, '5.2', '<') ) {
  220. setcookie('modx_remember_manager', $_SESSION['mgrShortname'], time()+60*60*24*365, MODX_BASE_URL, '; HttpOnly' , $secure );
  221. } else {
  222. setcookie('modx_remember_manager', $_SESSION['mgrShortname'], time()+60*60*24*365, MODX_BASE_URL, NULL, $secure, true);
  223. }
  224. } else {
  225. $_SESSION['modx.mgr.session.cookie.lifetime']= 0;
  226. // Remove the Remember Me cookie
  227. setcookie ('modx_remember_manager', "", time() - 3600, MODX_BASE_URL);
  228. }
  229. $log = new logHandler;
  230. $log->initAndWriteLog("Logged in", $modx->getLoginUserID(), $_SESSION['mgrShortname'], "58", "-", "MODx");
  231. // invoke OnManagerLogin event
  232. $modx->invokeEvent("OnManagerLogin",
  233. array(
  234. "userid" => $internalKey,
  235. "username" => $username,
  236. "userpassword" => $givenPassword,
  237. "rememberme" => $rememberme
  238. ));
  239. // check if we should redirect user to a web page
  240. $tbl = $modx->getFullTableName("user_settings");
  241. $id = $modx->db->getValue("SELECT setting_value FROM $tbl WHERE user='$internalKey' AND setting_name='manager_login_startup'");
  242. if(isset($id) && $id>0) {
  243. $header = 'Location: '.$modx->makeUrl($id,'','','full');
  244. if($_POST['ajax']==1) echo $header;
  245. else header($header);
  246. }
  247. else {
  248. $header = 'Location: '.$modx->config['site_url'].'manager/';
  249. if($_POST['ajax']==1) echo $header;
  250. else header($header);
  251. }
  252. // show javascript alert
  253. function jsAlert($msg){
  254. global $modx;
  255. if($_POST['ajax']==1) echo $msg."\n";
  256. else {
  257. echo "<script>window.setTimeout(\"alert('".addslashes($modx->db->escape($msg))."')\",10);history.go(-1)</script>";
  258. }
  259. }
  260. ?>