PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/administrator/index.php

https://bitbucket.org/dgough/annamaria-daneswood-25102012
PHP | 286 lines | 182 code | 41 blank | 63 comment | 51 complexity | fac830dd893f0f67304f3f4878d5ef5b MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /**
  3. * @version $Id: index.php 6022 2006-12-18 22:30:07Z friesengeist $
  4. * @package Joomla
  5. * @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.
  6. * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
  7. * Joomla! is free software. This version may have been modified pursuant
  8. * to the GNU General Public License, and as distributed it includes or
  9. * is derivative of works licensed under the GNU General Public License or
  10. * other free or open source software licenses.
  11. * See COPYRIGHT.php for copyright notices and details.
  12. */
  13. // Set flag that this is a parent file
  14. define( '_VALID_MOS', 1 );
  15. if (!file_exists( '../configuration.php' )) {
  16. header( 'Location: ../installation/index.php' );
  17. exit();
  18. }
  19. require( '../globals.php' );
  20. require( '../configuration.php' );
  21. // SSL check - $http_host returns <live site url>:<port number if it is 443>
  22. $http_host = explode(':', $_SERVER['HTTP_HOST'] );
  23. if( (!empty( $_SERVER['HTTPS'] ) && strtolower( $_SERVER['HTTPS'] ) != 'off' || isset( $http_host[1] ) && $http_host[1] == 443) && substr( $mosConfig_live_site, 0, 8 ) != 'https://' ) {
  24. $mosConfig_live_site = 'https://'.substr( $mosConfig_live_site, 7 );
  25. }
  26. require_once( '../includes/joomla.php' );
  27. include_once ( $mosConfig_absolute_path . '/language/'. $mosConfig_lang .'.php' );
  28. //Installation sub folder check, removed for work with SVN
  29. if (file_exists( '../installation/index.php' ) && $_VERSION->SVN == 0) {
  30. define( '_INSTALL_CHECK', 1 );
  31. include ($mosConfig_absolute_path .'/offline.php');
  32. exit();
  33. }
  34. $option = strtolower( strval( mosGetParam( $_REQUEST, 'option', NULL ) ) );
  35. // mainframe is an API workhorse, lots of 'core' interaction routines
  36. $mainframe = new mosMainFrame( $database, $option, '..', true );
  37. if (isset( $_POST['submit'] ) || isset($_COOKIE['admin_login'])) {
  38. $cookie = explode('|',base64_decode(mosGetParam($_COOKIE,'admin_login','')));
  39. $cName = isset($cookie[0]) ? $cookie[0] : NULL;
  40. $cPass = isset($cookie[1]) ? $cookie[1] : NULL;
  41. $cSess = isset($cookie[2]) ? $cookie[2] : NULL;
  42. /** escape and trim to minimise injection of malicious sql */
  43. $usrname = stripslashes( mosGetParam( $_POST, 'usrname', $cName ) );
  44. $pass = stripslashes( mosGetParam( $_POST, 'pass', $cPass ) );
  45. if($pass == NULL) {
  46. echo "<script>alert('Please enter a password'); document.location.href='index.php?mosmsg=Please enter a password'</script>\n";
  47. //Remove the cookie
  48. setcookie('admin_login', '', time() - 3600);
  49. exit();
  50. }
  51. $query = "SELECT COUNT(*)"
  52. . "\n FROM #__users"
  53. . "\n WHERE ("
  54. // Administrators
  55. . "\n gid = 24"
  56. // Super Administrators
  57. . "\n OR gid = 25"
  58. . "\n )"
  59. ;
  60. $database->setQuery( $query );
  61. $count = intval( $database->loadResult() );
  62. if ($count < 1) {
  63. mosErrorAlert( _LOGIN_NOADMINS );
  64. }
  65. $my = null;
  66. $query = "SELECT u.*, m.*"
  67. . "\n FROM #__users AS u"
  68. . "\n LEFT JOIN #__messages_cfg AS m ON u.id = m.user_id AND m.cfg_name = 'auto_purge'"
  69. . "\n WHERE u.username = " . $database->Quote( $usrname )
  70. . "\n AND u.block = 0"
  71. ;
  72. $database->setQuery( $query );
  73. $database->loadObject( $my );
  74. /** find the user group (or groups in the future) */
  75. if (@$my->id) {
  76. $grp = $acl->getAroGroup( $my->id );
  77. $my->gid = $grp->group_id;
  78. $my->usertype = $grp->name;
  79. // Conversion to new type
  80. if ((strpos($my->password, ':') === false) && $my->password == md5($pass)) {
  81. // Old password hash storage but authentic ... lets convert it
  82. $salt = mosMakePassword(16);
  83. $crypt = md5($pass.$salt);
  84. $my->password = $crypt.':'.$salt;
  85. // Now lets store it in the database
  86. $query = 'UPDATE #__users ' .
  87. 'SET password = '.$database->Quote($my->password) .
  88. 'WHERE id = '.(int)$my->id;
  89. $database->setQuery($query);
  90. if (!$database->query()) {
  91. // This is an error but not sure what to do with it ... we'll still work for now
  92. }
  93. }
  94. list($hash, $salt) = explode(':', $my->password);
  95. if($cPass != null){
  96. $cryptpass = $pass;
  97. }else{
  98. $cryptpass = md5($pass.$salt);
  99. }
  100. if ( strcmp( $hash, $cryptpass ) || !$acl->acl_check( 'administration', 'login', 'users', $my->usertype ) || (isset($cPass) && $cPass != $cryptpass)) {
  101. //Remove the admin login cookie
  102. setcookie('admin_login','', time() - 3600);
  103. mosErrorAlert("Incorrect Username, Password, or Access Level. Please try again", "document.location.href='index.php'");
  104. }
  105. // construct Session ID
  106. $logintime = time();
  107. $session_id = md5( $my->id . $my->username . $my->usertype . $logintime );
  108. session_name( md5( $mosConfig_live_site ) );
  109. session_id( $session_id );
  110. session_start();
  111. // add Session ID entry to DB
  112. $query = "INSERT INTO #__session"
  113. . "\n SET time = " . $database->Quote( $logintime ) . ", session_id = " . $database->Quote( $session_id ) . ", userid = " . (int) $my->id . ", usertype = " . $database->Quote( $my->usertype) . ", username = " . $database->Quote( $my->username )
  114. ;
  115. $database->setQuery( $query );
  116. if (!$database->query()) {
  117. echo $database->stderr();
  118. }
  119. // check if site designated as a production site
  120. // for a demo site allow multiple logins with same user account
  121. if ( $_VERSION->SITE == 1 && $my->gid < 25 /* Organic mod, allows multiple logins for S Admins */ ) {
  122. // delete other open admin sessions for same account
  123. $query = "DELETE FROM #__session"
  124. . "\n WHERE userid = " . (int) $my->id
  125. . "\n AND username = " . $database->Quote( $my->username )
  126. . "\n AND usertype = " . $database->Quote( $my->usertype )
  127. . "\n AND session_id != " . $database->Quote( $session_id )
  128. // this ensures that frontend sessions are not purged
  129. . "\n AND guest = 1"
  130. . "\n AND gid = 0"
  131. ;
  132. $database->setQuery( $query );
  133. if (!$database->query()) {
  134. echo $database->stderr();
  135. }
  136. }
  137. $_SESSION['session_id'] = $session_id;
  138. $_SESSION['session_user_id'] = $my->id;
  139. $_SESSION['session_username'] = $my->username;
  140. $_SESSION['session_usertype'] = $my->usertype;
  141. $_SESSION['session_gid'] = $my->gid;
  142. $_SESSION['session_logintime'] = $logintime;
  143. $_SESSION['session_user_params'] = $my->params;
  144. $_SESSION['session_userstate'] = array();
  145. session_write_close();
  146. //Save login data if user has option enable
  147. $params = new mosParameters($my->params);
  148. if($params->get('keep_session',0)){
  149. //Remove any stale session entries
  150. $database->setQuery("DELETE FROM #__session WHERE session_id = '$cSess'");
  151. $database->query();
  152. $value = base64_encode($usrname.'|'.$cryptpass.'|'.$session_id);
  153. //Save login data
  154. setcookie('admin_login',$value, time() + 31536000);
  155. }
  156. $expired = 'index2.php';
  157. // check if site designated as a production site
  158. // for a demo site disallow expired page functionality
  159. if ( $_VERSION->SITE == 1 && @$mosConfig_admin_expired === '1' ) {
  160. $file = $mainframe->getPath( 'com_xml', 'com_users' );
  161. $params =& new mosParameters( $my->params, $file, 'component' );
  162. $now = time();
  163. // expired page functionality handling
  164. $expired = $params->def( 'expired', '' );
  165. $expired_time = $params->def( 'expired_time', '' );
  166. // if now expired link set or expired time is more than half the admin session life set, simply load normal admin homepage
  167. $checktime = ( $mosConfig_session_life_admin ? $mosConfig_session_life_admin : 1800 ) / 2;
  168. if (!$expired || ( ( $now - $expired_time ) > $checktime ) ) {
  169. $expired = 'index2.php';
  170. }
  171. // link must also be a Joomla link to stop malicious redirection
  172. if ( strpos( $expired, 'index2.php?option=com_' ) !== 0 ) {
  173. $expired = 'index2.php';
  174. }
  175. // clear any existing expired page data
  176. $params->set( 'expired', '' );
  177. $params->set( 'expired_time', '' );
  178. // param handling
  179. if (is_array( $params->toArray() )) {
  180. $txt = array();
  181. foreach ( $params->toArray() as $k=>$v) {
  182. $txt[] = "$k=$v";
  183. }
  184. $saveparams = implode( "\n", $txt );
  185. }
  186. // save cleared expired page info to user data
  187. $query = "UPDATE #__users"
  188. . "\n SET params = " . $database->Quote( $saveparams )
  189. . "\n WHERE id = " . (int) $my->id
  190. . "\n AND username = " . $database->Quote( $my->username )
  191. . "\n AND usertype = " . $database->Quote( $my->usertype )
  192. ;
  193. $database->setQuery( $query );
  194. $database->query();
  195. }
  196. // check if auto_purge value set
  197. if ( $my->cfg_name == 'auto_purge' ) {
  198. $purge = $my->cfg_value;
  199. } else {
  200. // if no value set, default is 7 days
  201. $purge = 7;
  202. }
  203. // calculation of past date
  204. $past = date( 'Y-m-d H:i:s', time() - $purge * 60 * 60 * 24 );
  205. // if purge value is not 0, then allow purging of old messages
  206. if ($purge != 0) {
  207. // purge old messages at day set in message configuration
  208. $query = "DELETE FROM #__messages"
  209. . "\n WHERE date_time < " . $database->Quote( $past )
  210. . "\n AND user_id_to = " . (int) $my->id
  211. ;
  212. $database->setQuery( $query );
  213. if (!$database->query()) {
  214. echo $database->stderr();
  215. }
  216. }
  217. /** cannot using mosredirect as this stuffs up the cookie in IIS */
  218. // redirects page to admin homepage by default or expired page
  219. echo "<script>document.location.href='$expired';</script>\n";
  220. exit();
  221. } else {
  222. //Remove the admin login cookie
  223. setcookie('admin_login','', time() - 3600);
  224. mosErrorAlert("Incorrect Username, Password, or Access Level. Please try again", "document.location.href='index.php?mosmsg=Incorrect Username, Password, or Access Level. Please try again'");
  225. }
  226. } else {
  227. //Restore session and check if we need to redirect user
  228. /*
  229. session_name( md5( $mosConfig_live_site ) );
  230. session_start();
  231. $myparams = mosGetParam( $_SESSION, 'session_user_params', '' );
  232. $params = new mosParameters($myparams);
  233. $query = "SELECT count(username) FROM #__session WHERE username = '".mosGetParam($_SESSION,'session_username','')."'";
  234. $database->setQuery( $query );
  235. $has_session = $database->loadResult();
  236. //Redirect to index2
  237. if($params->get('keep_session',0) && $has_session) mosRedirect($mosConfig_live_site.'/administrator/index2.php');
  238. */
  239. initGzip();
  240. $path = $mosConfig_absolute_path . '/administrator/templates/' . $mainframe->getTemplate() . '/login.php';
  241. require_once( $path );
  242. doGzip();
  243. }
  244. ?>