Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

auth_db.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 5.96 KiB


001  <?php
002  /**
003  * Database auth plug-in for phpBB3
004  *
005  * Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him.
006  *
007  * This is for authentication via the integrated user table
008  *
009  * @package login
010  * @version $Id$
011  * @copyright (c) 2005 phpBB Group
012  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
013  *
014  */
015   
016  /**
017  * @ignore
018  */
019  if (!defined('IN_PHPBB'))
020  {
021      exit;
022  }
023   
024  /**
025  * Login function
026  */
027  function login_db(&$username, &$password)
028  {
029      global $db, $config;
030   
031      // do not allow empty password
032      if (!$password)
033      {
034          return array(
035              'status'    => LOGIN_BREAK,
036              'error_msg'    => 'NO_PASSWORD_SUPPLIED',
037          );
038      }
039   
040      $sql = 'SELECT user_id, username, user_password, user_passchg, user_pass_convert, user_email, user_type, user_login_attempts
041          FROM ' . USERS_TABLE . "
042          WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
043      $result = $db->sql_query($sql);
044      $row = $db->sql_fetchrow($result);
045      $db->sql_freeresult($result);
046   
047      if (!$row)
048      {
049          return array(
050              'status'    => LOGIN_ERROR_USERNAME,
051              'error_msg'    => 'LOGIN_ERROR_USERNAME',
052              'user_row'    => array('user_id' => ANONYMOUS),
053          );
054      }
055   
056      // If there are too much login attempts, we need to check for an confirm image
057      // Every auth module is able to define what to do by itself...
058      if ($config['max_login_attempts'] && $row['user_login_attempts'] >= $config['max_login_attempts'])
059      {
060          $confirm_id = request_var('confirm_id', '');
061          $confirm_code = request_var('confirm_code', '');
062   
063          // Visual Confirmation handling
064          if (!$confirm_id)
065          {
066              return array(
067                  'status'        => LOGIN_ERROR_ATTEMPTS,
068                  'error_msg'        => 'LOGIN_ERROR_ATTEMPTS',
069                  'user_row'        => $row,
070              );
071          }
072          else
073          {
074              global $user;
075   
076              $sql = 'SELECT code
077                  FROM ' . CONFIRM_TABLE . "
078                  WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
079                      AND session_id = '" . $db->sql_escape($user->session_id) . "'
080                      AND confirm_type = " . CONFIRM_LOGIN;
081              $result = $db->sql_query($sql);
082              $confirm_row = $db->sql_fetchrow($result);
083              $db->sql_freeresult($result);
084   
085              if ($confirm_row)
086              {
087                  if (strcasecmp($confirm_row['code'], $confirm_code) === 0)
088                  {
089                      $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
090                          WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
091                              AND session_id = '" . $db->sql_escape($user->session_id) . "'
092                              AND confirm_type = " . CONFIRM_LOGIN;
093                      $db->sql_query($sql);
094                  }
095                  else
096                  {
097                      return array(
098                          'status'        => LOGIN_ERROR_ATTEMPTS,
099                          'error_msg'        => 'CONFIRM_CODE_WRONG',
100                          'user_row'        => $row,
101                      );
102                  }
103              }
104              else
105              {
106                  return array(
107                      'status'        => LOGIN_ERROR_ATTEMPTS,
108                      'error_msg'        => 'CONFIRM_CODE_WRONG',
109                      'user_row'        => $row,
110                  );
111              }
112          }
113      }
114   
115      // If the password convert flag is set we need to convert it
116      if ($row['user_pass_convert'])
117      {
118          // in phpBB2 passwords were used exactly as they were sent, with addslashes applied
119          $password_old_format = isset($_REQUEST['password']) ? (string) $_REQUEST['password'] : '';
120          $password_old_format = (!STRIP) ? addslashes($password_old_format) : $password_old_format;
121          $password_new_format = '';
122   
123          set_var($password_new_format, stripslashes($password_old_format), 'string');
124   
125          if ($password == $password_new_format)
126          {
127              if (!function_exists('utf8_to_cp1252'))
128              {
129                  global $phpbb_root_path, $phpEx;
130                  include($phpbb_root_path . 'includes/utf/data/recode_basic.' . $phpEx);
131              }
132   
133              // cp1252 is phpBB2's default encoding, characters outside ASCII range might work when converted into that encoding
134              if (md5($password_old_format) == $row['user_password'] || md5(utf8_to_cp1252($password_old_format)) == $row['user_password'])
135              {
136                  $hash = phpbb_hash($password_new_format);
137   
138                  // Update the password in the users table to the new format and remove user_pass_convert flag
139                  $sql = 'UPDATE ' . USERS_TABLE . '
140                      SET user_password = \'' . $db->sql_escape($hash) . '\',
141                          user_pass_convert = 0
142                      WHERE user_id = ' . $row['user_id'];
143                  $db->sql_query($sql);
144   
145                  $row['user_pass_convert'] = 0;
146                  $row['user_password'] = $hash;
147              }
148              else
149              {
150                  // Although we weren't able to convert this password we have to
151                  // increase login attempt count to make sure this cannot be exploited
152                  $sql = 'UPDATE ' . USERS_TABLE . '
153                      SET user_login_attempts = user_login_attempts + 1
154                      WHERE user_id = ' . $row['user_id'];
155                  $db->sql_query($sql);
156   
157                  return array(
158                      'status'        => LOGIN_ERROR_PASSWORD_CONVERT,
159                      'error_msg'        => 'LOGIN_ERROR_PASSWORD_CONVERT',
160                      'user_row'        => $row,
161                  );
162              }
163          }
164      }
165   
166      // Check password ...
167      if (!$row['user_pass_convert'] && phpbb_check_hash($password, $row['user_password']))
168      {
169          // Check for old password hash...
170          if (strlen($row['user_password']) == 32)
171          {
172              $hash = phpbb_hash($password);
173   
174              // Update the password in the users table to the new format
175              $sql = 'UPDATE ' . USERS_TABLE . "
176                  SET user_password = '" . $db->sql_escape($hash) . "',
177                      user_pass_convert = 0
178                  WHERE user_id = {$row['user_id']}";
179              $db->sql_query($sql);
180   
181              $row['user_password'] = $hash;
182          }
183   
184          if ($row['user_login_attempts'] != 0)
185          {
186              // Successful, reset login attempts (the user passed all stages)
187              $sql = 'UPDATE ' . USERS_TABLE . '
188                  SET user_login_attempts = 0
189                  WHERE user_id = ' . $row['user_id'];
190              $db->sql_query($sql);
191          }
192   
193          // User inactive...
194          if ($row['user_type'] == USER_INACTIVE || $row['user_type'] == USER_IGNORE)
195          {
196              return array(
197                  'status'        => LOGIN_ERROR_ACTIVE,
198                  'error_msg'        => 'ACTIVE_ERROR',
199                  'user_row'        => $row,
200              );
201          }
202   
203          // Successful login... set user_login_attempts to zero...
204          return array(
205              'status'        => LOGIN_SUCCESS,
206              'error_msg'        => false,
207              'user_row'        => $row,
208          );
209      }
210   
211      // Password incorrect - increase login attempts
212      $sql = 'UPDATE ' . USERS_TABLE . '
213          SET user_login_attempts = user_login_attempts + 1
214          WHERE user_id = ' . $row['user_id'];
215      $db->sql_query($sql);
216   
217      // Give status about wrong password...
218      return array(
219          'status'        => LOGIN_ERROR_PASSWORD,
220          'error_msg'        => 'LOGIN_ERROR_PASSWORD',
221          'user_row'        => $row,
222      );
223  }
224   
225  ?>