home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 April / PCWorld_2005-04_cd.bin / akce / web / phpbb2plus / phpBB2_plus_1.52.exe / phpBB2 / login.php < prev    next >
PHP Script  |  2004-11-18  |  14KB  |  358 lines

  1. <?php
  2. /***************************************************************************
  3.  *                                login.php
  4.  *                            -------------------
  5.  *   begin                : Saturday, Feb 13, 2001
  6.  *   copyright            : (C) 2001 The phpBB Group
  7.  *   email                : support@phpbb.com
  8.  *
  9.  *   $Id: login.php,v 1.47.2.15 2004/03/18 18:15:51 acydburn Exp $
  10.  *
  11.  *
  12.  ***************************************************************************/
  13.  
  14. /***************************************************************************
  15.  *
  16.  *   This program is free software; you can redistribute it and/or modify
  17.  *   it under the terms of the GNU General Public License as published by
  18.  *   the Free Software Foundation; either version 2 of the License, or
  19.  *   (at your option) any later version.
  20.  *
  21.  ***************************************************************************/
  22.  
  23. //
  24. // Allow people to reach login page if
  25. // board is shut down
  26. //
  27. define("IN_LOGIN", true);
  28.  
  29. define('IN_PHPBB', true);
  30. $phpbb_root_path = './';
  31. include($phpbb_root_path . 'extension.inc');
  32. include($phpbb_root_path . 'common.'.$phpEx);
  33.  
  34. //
  35. // Set page ID for session management
  36. //
  37. $userdata = session_pagestart($user_ip, PAGE_LOGIN);
  38. init_userprefs($userdata);
  39. //
  40. // End session management
  41. //
  42.  
  43. // session id check
  44. if (!empty($HTTP_POST_VARS['sid']) || !empty($HTTP_GET_VARS['sid']))
  45. {
  46.     $sid = (!empty($HTTP_POST_VARS['sid'])) ? $HTTP_POST_VARS['sid'] : $HTTP_GET_VARS['sid'];
  47. }
  48. else
  49. {
  50.     $sid = '';
  51. }
  52.  
  53. if( isset($HTTP_POST_VARS['login']) || isset($HTTP_GET_VARS['login']) || isset($HTTP_POST_VARS['logout']) || isset($HTTP_GET_VARS['logout']) )
  54. {
  55.     if( ( isset($HTTP_POST_VARS['login']) || isset($HTTP_GET_VARS['login']) ) && !$userdata['session_logged_in'] )
  56.     {
  57.         $username = isset($HTTP_POST_VARS['username']) ? phpbb_clean_username($HTTP_POST_VARS['username']) : '';
  58.         $password = isset($HTTP_POST_VARS['password']) ? $HTTP_POST_VARS['password'] : '';
  59.  
  60.         $sql = "SELECT user_id, username, user_password, user_active, user_level, user_badlogin, user_blocktime, user_email, user_lang, user_timezone,user_passwd_change
  61.             FROM " . USERS_TABLE . "
  62.             WHERE username = '" . str_replace("\\'", "''", $username) . "'";
  63.         if ( !($result = $db->sql_query($sql)) )
  64.         {
  65.             message_die(GENERAL_ERROR, 'Error in obtaining userdata', '', __LINE__, __FILE__, $sql);
  66.         }
  67.  
  68.         if( $row = $db->sql_fetchrow($result) )
  69.         {
  70.             if( $row['user_level'] != ADMIN && $board_config['board_disable'] )
  71.             {
  72.                 redirect(append_sid("portal.$phpEx", true));
  73.             }
  74.             else
  75.             {
  76.                 // Start add - Protect user account MOD
  77.                 if ($row['user_blocktime']<time() )
  78.                 {
  79.                 // End add - Protect user account MOD
  80.                 if( md5($password) == $row['user_password'] && $row['user_active'] )
  81.                 {
  82.                     $autologin = ( isset($HTTP_POST_VARS['autologin']) ) ? TRUE : 0;
  83.  
  84.                     $session_id = session_begin($row['user_id'], $user_ip, PAGE_INDEX, FALSE, $autologin);
  85.  
  86.                     if( $session_id )
  87.                     {
  88.                         // Start add - Protect user account MOD
  89.                         $sql = "UPDATE " . USERS_TABLE . " SET user_badlogin='0'
  90.                             WHERE username = '" . str_replace("\'", "''", $username) . "'";
  91.                         if ( !($result = $db->sql_query($sql)) )
  92.                         {
  93.                             message_die(GENERAL_ERROR, 'Error updating correct login data', '', __LINE__, __FILE__, $sql);
  94.                         }
  95.                         // End add - Protect user account MOD
  96.                         $url = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "portal.$phpEx";
  97.                         // Start add - Protect user account MOD
  98. if ($session_id['user_id']!=ANONYMOUS)
  99. {
  100. include($phpbb_root_path . "includes/functions_validate.$phpEx");
  101. $pass_result = validate_complex_password ($username, $password);
  102. if ( $session_id['user_passwd_change']==0 || $pass_result['error']== true)
  103. {
  104.     //force a change of password, do not allow a secound login
  105.     $sql = "UPDATE " . USERS_TABLE . " SET user_passwd_change='-9999'
  106.     WHERE user_id = '" . $session_id['user_id'] . "'";
  107.     if ( !($result = $db->sql_query($sql)) )
  108.     {
  109.         message_die(GENERAL_ERROR, 'Error updating correct login data2', '', __LINE__, __FILE__, $sql);
  110.     }
  111.     $url .= ( ereg( "\?" , $url) ) ? '&ch_passwd=1' : '?ch_passwd=1';
  112. } else
  113. if (  intval((time()-$session_id['user_passwd_change']) / 86400) >= $board_config['max_password_age'])
  114. {
  115.     session_end($session_id['session_id'], $session_id['user_id']);
  116.     $message = $lang['Passwd_have_expired'] . '<br /><br /><a href="'.append_sid("profile.$phpEx?mode=sendpassword").'">'.$lang['Send_new_passwd'].'</a><br /><br />' .  sprintf($lang['Click_return_portal'], '<a href="' . append_sid("portal.$phpEx") . '">', '</a>');
  117.     message_die(GENERAL_MESSAGE, $message);
  118. } else
  119. if (  intval((time()-$session_id['user_passwd_change']) / 86400)+(($board_config['max_password_age']<14) ? 1 : 14) >= $board_config['max_password_age'] )
  120. {
  121.     $url .= ( ereg( "\?" , $url) ) ? '&ch_passwd=1' : '?ch_passwd=1';
  122. }
  123. }
  124. // End add - Protect user account MOD
  125.                         redirect(append_sid($url, true));
  126.                     }
  127.                     else
  128.                     {
  129.                         message_die(CRITICAL_ERROR, "Couldn't start session : login", "", __LINE__, __FILE__);
  130.                     }
  131.                 }
  132.                 else
  133.                 {
  134.                     $redirect = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : '';
  135.                     $redirect = str_replace('?', '&', $redirect);
  136.                     
  137.                     if (strstr(urldecode($redirect), "\n") || strstr(urldecode($redirect), "\r"))
  138.                     {
  139.                         message_die(GENERAL_ERROR, 'Tried to redirect to potentially insecure url.');
  140.                     }
  141.                     
  142.                     $template->assign_vars(array(
  143.                         'META' => "<meta http-equiv=\"refresh\" content=\"3;url=login.$phpEx?redirect=$redirect\">")
  144.                     );
  145.                     // Start add - Protect user account MOD
  146. if ($row['user_active'] )
  147. {
  148.     //count bad login
  149.     // block the user for X min
  150.     if (($row['user_badlogin']+1) % $board_config['max_login_error'])
  151.     {
  152.         $sql = "UPDATE " . USERS_TABLE . " SET user_badlogin=user_badlogin+1
  153.             WHERE username = '" . str_replace("\'", "''", $username) . "'";
  154.         if ( !($result = $db->sql_query($sql)) )
  155.         {
  156.             message_die(GENERAL_ERROR, 'Error updating bad login data'.$user_ip, '', __LINE__, __FILE__, $sql);
  157.         }
  158.     } else
  159.     {
  160.         $blocktime = ", user_block_by='$user_ip', user_blocktime='" . (time()+($board_config['block_time']*60)) . "'";
  161.         $sql = "UPDATE " . USERS_TABLE . " SET user_badlogin=user_badlogin+1 $blocktime
  162.             WHERE username = '" . str_replace("\'", "''", $username) . "'";
  163.         if ( !($result = $db->sql_query($sql)) )
  164.         {
  165.             message_die(GENERAL_ERROR, 'Error updating bad login data'.$user_ip, '', __LINE__, __FILE__, $sql);
  166.         }
  167.  
  168.         if ($row['user_email']  && $row['user_blocktime']<(time()-3600))
  169.         {
  170.               include($phpbb_root_path . 'includes/emailer.'.$phpEx); 
  171.             $server_name = trim($board_config['server_name']);
  172.                    $emailer = new emailer($board_config['smtp_delivery']); 
  173.                     $emailer->email_address($row['user_email']); 
  174.                  $email_headers = "To: \"".$row['username']."\" <".$row['user_email']. ">\r\n"; 
  175.                     $email_headers .= "From: \"".$board_config['sitename']."\" <".$board_config['board_email'].">\r\n"; 
  176.                    $email_headers .= "X-AntiAbuse: Board servername - " . $server_name . "\r\n"; 
  177.                    $email_headers .= "X-AntiAbuse: User IP - " . decode_ip($user_ip) . "\r\n"; 
  178.         $emailer->use_template('bad_login', $row['user_lang']);
  179.                     $emailer->extra_headers($email_headers); 
  180.                    $emailer->assign_vars(array( 
  181.                        'USER' => '"'.$row['username'].'"',
  182.                 'BLOCK_TIME' => $board_config['block_time'],
  183.                        'BAD_LOGINS' => $row['user_badlogin']+1, 
  184.                 'BLOCK_UNTIL' => create_date ($lang['Time_format'],time()+($board_config['block_time']*60),$row['user_timezone']),
  185.                        'SITENAME' => $board_config['sitename'], 
  186.                           'BOARD_EMAIL' => $board_config['board_email'])); 
  187.                    $emailer->send(); 
  188.                    $emailer->reset(); 
  189.         }
  190.     }
  191. }
  192. // End add - Protect user account MOD
  193.  
  194.                     $message = $lang['Error_login'] . '<br /><br />' . sprintf($lang['Click_return_login'], "<a href=\"login.$phpEx?redirect=$redirect\">", '</a>') . '<br /><br />' .  sprintf($lang['Click_return_index'], '<a href="' . append_sid("index.$phpEx") . '">', '</a>');
  195.  
  196.                     message_die(GENERAL_MESSAGE, $message);
  197.                 }
  198.                 // Start add - Protect user account MOD
  199. } else
  200. {
  201.     $message = (($lang['Error_login_tomutch'])?$lang['Error_login_tomutch']:$lang['Error_login']) . '<br /><br />' . sprintf($lang['Click_return_login'], '<a href="' . append_sid("login.$phpEx?redirect=$redirect") . '">', '</a>') . '<br /><br />' .  sprintf($lang['Click_return_index'], '<a href="' . append_sid("index.$phpEx") . '">', '</a>');
  202.     message_die(GENERAL_MESSAGE, $message);
  203. }
  204. // End add - Protect user account MOD
  205.  
  206.             }
  207.         }
  208.         else
  209.         {
  210.             $redirect = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "";
  211.             $redirect = str_replace("?", "&", $redirect);
  212.             
  213.             if (strstr(urldecode($redirect), "\n") || strstr(urldecode($redirect), "\r"))
  214.             {
  215.                 message_die(GENERAL_ERROR, 'Tried to redirect to potentially insecure url.');
  216.             }
  217.             
  218.             $template->assign_vars(array(
  219.                 'META' => "<meta http-equiv=\"refresh\" content=\"3;url=login.$phpEx?redirect=$redirect\">")
  220.             );
  221.  
  222.             $message = $lang['Error_login'] . '<br /><br />' . sprintf($lang['Click_return_login'], "<a href=\"login.$phpEx?redirect=$redirect\">", '</a>') . '<br /><br />' .  sprintf($lang['Click_return_index'], '<a href="' . append_sid("index.$phpEx") . '">', '</a>');
  223.  
  224.             message_die(GENERAL_MESSAGE, $message);
  225.         }
  226.     }
  227.     else if( ( isset($HTTP_GET_VARS['logout']) || isset($HTTP_POST_VARS['logout']) ) && $userdata['session_logged_in'] )
  228.     {
  229.         if( $userdata['session_logged_in'] )
  230.         {
  231.             session_end($userdata['session_id'], $userdata['user_id']);
  232.         }
  233.  
  234.         if (!empty($HTTP_POST_VARS['redirect']) || !empty($HTTP_GET_VARS['redirect']))
  235.         {
  236.             $url = (!empty($HTTP_POST_VARS['redirect'])) ? htmlspecialchars($HTTP_POST_VARS['redirect']) : htmlspecialchars($HTTP_GET_VARS['redirect']);
  237.             $url = str_replace('&', '&', $url);
  238.             redirect(append_sid($url, true));
  239.         }
  240.         else
  241.         {
  242.             redirect(append_sid("portal.$phpEx", true));
  243.         }
  244.     }
  245.     else
  246.     {
  247.         $url = ( !empty($HTTP_POST_VARS['redirect']) ) ? str_replace('&', '&', htmlspecialchars($HTTP_POST_VARS['redirect'])) : "portal.$phpEx";
  248.         // Start add - Protect user account MOD
  249. if ($session_id['user_id']!=ANONYMOUS)
  250. {
  251. include($phpbb_root_path . "includes/functions_validate.$phpEx");
  252. $pass_result = validate_complex_password ($username, $password);
  253. if ( $session_id['user_passwd_change']==0 || $pass_result['error']== true)
  254. {
  255.     //force a change of password, do not allow a secound login
  256.     $sql = "UPDATE " . USERS_TABLE . " SET user_passwd_change='-9999'
  257.     WHERE user_id = '" . $session_id['user_id'] . "'";
  258.     if ( !($result = $db->sql_query($sql)) )
  259.     {
  260.         message_die(GENERAL_ERROR, 'Error updating correct login data2', '', __LINE__, __FILE__, $sql);
  261.     }
  262.     $url .= ( ereg( "\?" , $url) ) ? '&ch_passwd=1' : '?ch_passwd=1';
  263. } else
  264. if (  intval((time()-$session_id['user_passwd_change']) / 86400) >= $board_config['max_password_age'])
  265. {
  266.     session_end($session_id['session_id'], $session_id['user_id']);
  267.     $message = $lang['Passwd_have_expired'] . '<br /><br /><a href="'.append_sid("profile.$phpEx?mode=sendpassword").'">'.$lang['Send_new_passwd'].'</a><br /><br />' .  sprintf($lang['Click_return_portal'], '<a href="' . append_sid("portal.$phpEx") . '">', '</a>');
  268.     message_die(GENERAL_MESSAGE, $message);
  269. } else
  270. if (  intval((time()-$session_id['user_passwd_change']) / 86400)+(($board_config['max_password_age']<14) ? 1 : 14) >= $board_config['max_password_age'] )
  271. {
  272.     $url .= ( ereg( "\?" , $url) ) ? '&ch_passwd=1' : '?ch_passwd=1';
  273. }
  274. }
  275. // End add - Protect user account MOD
  276.         redirect(append_sid($url, true));
  277.     }
  278. }
  279. else
  280. {
  281.     //
  282.     // Do a full login page dohickey if
  283.     // user not already logged in
  284.     //
  285.     if( !$userdata['session_logged_in'] )
  286.     {
  287.         $page_title = $lang['Login'];
  288.         include($phpbb_root_path . 'includes/page_header.'.$phpEx);
  289.  
  290.         $template->set_filenames(array(
  291.             'body' => 'login_body.tpl')
  292.         );
  293.  
  294.         if( isset($HTTP_POST_VARS['redirect']) || isset($HTTP_GET_VARS['redirect']) )
  295.         {
  296.             $forward_to = $HTTP_SERVER_VARS['QUERY_STRING'];
  297.  
  298.             if( preg_match("/^redirect=([a-z0-9\.#\/\?&=\+\-_]+)/si", $forward_to, $forward_matches) )
  299.             {
  300.                 $forward_to = ( !empty($forward_matches[3]) ) ? $forward_matches[3] : $forward_matches[1];
  301.                 $forward_match = explode('&', $forward_to);
  302.  
  303.                 if(count($forward_match) > 1)
  304.                 {
  305.                     $forward_page = '';
  306.  
  307.                     for($i = 1; $i < count($forward_match); $i++)
  308.                     {
  309.                         if( !ereg("sid=", $forward_match[$i]) )
  310.                         {
  311.                             if( $forward_page != '' )
  312.                             {
  313.                                 $forward_page .= '&';
  314.                             }
  315.                             $forward_page .= $forward_match[$i];
  316.                         }
  317.                     }
  318.                     $forward_page = $forward_match[0] . '?' . $forward_page;
  319.                 }
  320.                 else
  321.                 {
  322.                     $forward_page = $forward_match[0];
  323.                 }
  324.             }
  325.         }
  326.         else
  327.         {
  328.             $forward_page = '';
  329.         }
  330.  
  331.         $username = ( $userdata['user_id'] != ANONYMOUS ) ? $userdata['username'] : '';
  332.  
  333.         $s_hidden_fields = '<input type="hidden" name="redirect" value="' . $forward_page . '" />';
  334.  
  335.         make_jumpbox('viewforum.'.$phpEx, $forum_id);
  336.         $template->assign_vars(array(
  337.             'USERNAME' => $username,
  338.  
  339.             'L_ENTER_PASSWORD' => $lang['Enter_password'],
  340.             'L_SEND_PASSWORD' => $lang['Forgotten_password'],
  341.  
  342.             'U_SEND_PASSWORD' => append_sid("profile.$phpEx?mode=sendpassword"),
  343.  
  344.             'S_HIDDEN_FIELDS' => $s_hidden_fields)
  345.         );
  346.  
  347.         $template->pparse('body');
  348.  
  349.         include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
  350.     }
  351.     else
  352.     {
  353.         redirect(append_sid("portal.$phpEx", true));
  354.     }
  355.  
  356. }
  357.  
  358. ?>