Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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

captcha_abstract.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 8.99 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  namespace phpbb\captcha\plugins;
 015   
 016  /**
 017  * This class holds the code shared by the two default 3.0.x CAPTCHAs.
 018  */
 019  abstract class captcha_abstract
 020  {
 021      var $confirm_id;
 022      var $confirm_code;
 023      var $code;
 024      var $seed;
 025      var $attempts = 0;
 026      var $type;
 027      var $solved = 0;
 028      var $captcha_vars = false;
 029   
 030      /**
 031      * @var string name of the service.
 032      */
 033      protected $service_name;
 034   
 035      function init($type)
 036      {
 037          global $config, $db, $user;
 038   
 039          // read input
 040          $this->confirm_id = request_var('confirm_id', '');
 041          $this->confirm_code = request_var('confirm_code', '');
 042          $refresh = request_var('refresh_vc', false) && $config['confirm_refresh'];
 043   
 044          $this->type = (int) $type;
 045   
 046          if (!strlen($this->confirm_id) || !$this->load_code())
 047          {
 048              // we have no confirm ID, better get ready to display something
 049              $this->generate_code();
 050          }
 051          else if ($refresh)
 052          {
 053              $this->regenerate_code();
 054          }
 055      }
 056   
 057      function execute_demo()
 058      {
 059          global $user;
 060   
 061          $this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 062          $this->seed = hexdec(substr(unique_id(), 4, 10));
 063   
 064          // compute $seed % 0x7fffffff
 065          $this->seed -= 0x7fffffff * floor($this->seed / 0x7fffffff);
 066   
 067          $generator = $this->get_generator_class();
 068          $captcha = new $generator();
 069          define('IMAGE_OUTPUT', 1);
 070          $captcha->execute($this->code, $this->seed);
 071      }
 072   
 073      function execute()
 074      {
 075          if (empty($this->code))
 076          {
 077              if (!$this->load_code())
 078              {
 079                  // invalid request, bail out
 080                  return false;
 081              }
 082          }
 083          $generator = $this->get_generator_class();
 084          $captcha = new $generator();
 085          define('IMAGE_OUTPUT', 1);
 086          $captcha->execute($this->code, $this->seed);
 087      }
 088   
 089      function get_template()
 090      {
 091          global $config, $user, $template, $phpEx, $phpbb_root_path;
 092   
 093          if ($this->is_solved())
 094          {
 095              return false;
 096          }
 097          else
 098          {
 099              $link = append_sid($phpbb_root_path . 'ucp.' . $phpEx,  'mode=confirm&amp;confirm_id=' . $this->confirm_id . '&amp;type=' . $this->type);
 100              $contact_link = phpbb_get_board_contact_link($config, $phpbb_root_path, $phpEx);
 101              $explain = $user->lang(($this->type != CONFIRM_POST) ? 'CONFIRM_EXPLAIN' : 'POST_CONFIRM_EXPLAIN', '<a href="' . $contact_link . '">', '</a>');
 102   
 103              $template->assign_vars(array(
 104                  'CONFIRM_IMAGE_LINK'        => $link,
 105                  'CONFIRM_IMAGE'                => '<img src="' . $link . '" />',
 106                  'CONFIRM_IMG'                => '<img src="' . $link . '" />',
 107                  'CONFIRM_ID'                => $this->confirm_id,
 108                  'S_CONFIRM_CODE'            => true,
 109                  'S_TYPE'                    => $this->type,
 110                  'S_CONFIRM_REFRESH'            => ($config['enable_confirm'] && $config['confirm_refresh'] && $this->type == CONFIRM_REG) ? true : false,
 111                  'L_CONFIRM_EXPLAIN'            => $explain,
 112              ));
 113   
 114              return 'captcha_default.html';
 115          }
 116      }
 117   
 118      function get_demo_template($id)
 119      {
 120          global $config, $user, $template, $phpbb_admin_path, $phpEx;
 121   
 122          $variables = '';
 123   
 124          if (is_array($this->captcha_vars))
 125          {
 126              foreach ($this->captcha_vars as $captcha_var => $template_var)
 127              {
 128                  $variables .= '&amp;' . rawurlencode($captcha_var) . '=' . request_var($captcha_var, (int) $config[$captcha_var]);
 129              }
 130          }
 131   
 132          // acp_captcha has a delivery function; let's use it
 133          $template->assign_vars(array(
 134              'CONFIRM_IMAGE'        => append_sid($phpbb_admin_path . 'index.' . $phpEx, 'captcha_demo=1&amp;mode=visual&amp;i=' . $id . '&amp;select_captcha=' . $this->get_service_name()) . $variables,
 135              'CONFIRM_ID'        => $this->confirm_id,
 136          ));
 137   
 138          return 'captcha_default_acp_demo.html';
 139      }
 140   
 141      function get_hidden_fields()
 142      {
 143          $hidden_fields = array();
 144   
 145          // this is required for posting.php - otherwise we would forget about the captcha being already solved
 146          if ($this->solved)
 147          {
 148              $hidden_fields['confirm_code'] = $this->confirm_code;
 149          }
 150          $hidden_fields['confirm_id'] = $this->confirm_id;
 151          return $hidden_fields;
 152      }
 153   
 154      function garbage_collect($type)
 155      {
 156          global $db, $config;
 157   
 158          $sql = 'SELECT DISTINCT c.session_id
 159              FROM ' . CONFIRM_TABLE . ' c
 160              LEFT JOIN ' . SESSIONS_TABLE . ' s ON (c.session_id = s.session_id)
 161              WHERE s.session_id IS NULL' .
 162                  ((empty($type)) ? '' : ' AND c.confirm_type = ' . (int) $type);
 163          $result = $db->sql_query($sql);
 164   
 165          if ($row = $db->sql_fetchrow($result))
 166          {
 167              $sql_in = array();
 168              do
 169              {
 170                  $sql_in[] = (string) $row['session_id'];
 171              }
 172              while ($row = $db->sql_fetchrow($result));
 173   
 174              if (sizeof($sql_in))
 175              {
 176                  $sql = 'DELETE FROM ' . CONFIRM_TABLE . '
 177                      WHERE ' . $db->sql_in_set('session_id', $sql_in);
 178                  $db->sql_query($sql);
 179              }
 180          }
 181          $db->sql_freeresult($result);
 182      }
 183   
 184      function uninstall()
 185      {
 186          $this->garbage_collect(0);
 187      }
 188   
 189      function install()
 190      {
 191          return;
 192      }
 193   
 194      function validate()
 195      {
 196          global $config, $db, $user;
 197   
 198          if (empty($user->lang))
 199          {
 200              $user->setup();
 201          }
 202   
 203          $error = '';
 204          if (!$this->confirm_id)
 205          {
 206              $error = $user->lang['CONFIRM_CODE_WRONG'];
 207          }
 208          else
 209          {
 210              if ($this->check_code())
 211              {
 212                  $this->solved = true;
 213              }
 214              else
 215              {
 216                  $error = $user->lang['CONFIRM_CODE_WRONG'];
 217              }
 218          }
 219   
 220          if (strlen($error))
 221          {
 222              // okay, incorrect answer. Let's ask a new question.
 223              $this->new_attempt();
 224              return $error;
 225          }
 226          else
 227          {
 228              return false;
 229          }
 230      }
 231   
 232      /**
 233      * The old way to generate code, suitable for GD and non-GD. Resets the internal state.
 234      */
 235      function generate_code()
 236      {
 237          global $db, $user;
 238   
 239          $this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 240          $this->confirm_id = md5(unique_id($user->ip));
 241          $this->seed = hexdec(substr(unique_id(), 4, 10));
 242          $this->solved = 0;
 243          // compute $seed % 0x7fffffff
 244          $this->seed -= 0x7fffffff * floor($this->seed / 0x7fffffff);
 245   
 246          $sql = 'INSERT INTO ' . CONFIRM_TABLE . ' ' . $db->sql_build_array('INSERT', array(
 247                  'confirm_id'    => (string) $this->confirm_id,
 248                  'session_id'    => (string) $user->session_id,
 249                  'confirm_type'    => (int) $this->type,
 250                  'code'            => (string) $this->code,
 251                  'seed'            => (int) $this->seed)
 252          );
 253          $db->sql_query($sql);
 254      }
 255   
 256      /**
 257      * New Question, if desired.
 258      */
 259      function regenerate_code()
 260      {
 261          global $db, $user;
 262   
 263          $this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 264          $this->seed = hexdec(substr(unique_id(), 4, 10));
 265          $this->solved = 0;
 266          // compute $seed % 0x7fffffff
 267          $this->seed -= 0x7fffffff * floor($this->seed / 0x7fffffff);
 268   
 269          $sql = 'UPDATE ' . CONFIRM_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array(
 270                  'code'            => (string) $this->code,
 271                  'seed'            => (int) $this->seed)) . '
 272                  WHERE
 273                  confirm_id = \'' . $db->sql_escape($this->confirm_id) . '\'
 274                      AND session_id = \'' . $db->sql_escape($user->session_id) . '\'';
 275          $db->sql_query($sql);
 276      }
 277   
 278      /**
 279      * New Question, if desired.
 280      */
 281      function new_attempt()
 282      {
 283          global $db, $user;
 284   
 285          $this->code = gen_rand_string_friendly(mt_rand(CAPTCHA_MIN_CHARS, CAPTCHA_MAX_CHARS));
 286          $this->seed = hexdec(substr(unique_id(), 4, 10));
 287          $this->solved = 0;
 288          // compute $seed % 0x7fffffff
 289          $this->seed -= 0x7fffffff * floor($this->seed / 0x7fffffff);
 290   
 291          $sql = 'UPDATE ' . CONFIRM_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array(
 292                  'code'            => (string) $this->code,
 293                  'seed'            => (int) $this->seed)) . '
 294                  , attempts = attempts + 1
 295                  WHERE
 296                  confirm_id = \'' . $db->sql_escape($this->confirm_id) . '\'
 297                      AND session_id = \'' . $db->sql_escape($user->session_id) . '\'';
 298          $db->sql_query($sql);
 299      }
 300   
 301      /**
 302      * Look up everything we need for painting&checking.
 303      */
 304      function load_code()
 305      {
 306          global $db, $user;
 307   
 308          $sql = 'SELECT code, seed, attempts
 309              FROM ' . CONFIRM_TABLE . "
 310              WHERE confirm_id = '" . $db->sql_escape($this->confirm_id) . "'
 311                  AND session_id = '" . $db->sql_escape($user->session_id) . "'
 312                  AND confirm_type = " . $this->type;
 313          $result = $db->sql_query($sql);
 314          $row = $db->sql_fetchrow($result);
 315          $db->sql_freeresult($result);
 316   
 317          if ($row)
 318          {
 319              $this->code = $row['code'];
 320              $this->seed = $row['seed'];
 321              $this->attempts = $row['attempts'];
 322              return true;
 323          }
 324   
 325          return false;
 326      }
 327   
 328      function check_code()
 329      {
 330          return (strcasecmp($this->code, $this->confirm_code) === 0);
 331      }
 332   
 333      function get_attempt_count()
 334      {
 335          return $this->attempts;
 336      }
 337   
 338      function reset()
 339      {
 340          global $db, $user;
 341   
 342          $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
 343              WHERE session_id = '" . $db->sql_escape($user->session_id) . "'
 344                  AND confirm_type = " . (int) $this->type;
 345          $db->sql_query($sql);
 346   
 347          // we leave the class usable by generating a new question
 348          $this->generate_code();
 349      }
 350   
 351      function is_solved()
 352      {
 353          if (request_var('confirm_code', false) && $this->solved === 0)
 354          {
 355              $this->validate();
 356          }
 357          return (bool) $this->solved;
 358      }
 359   
 360      /**
 361      *  API function
 362      */
 363      function has_config()
 364      {
 365          return false;
 366      }
 367   
 368      /**
 369      * @return string the name of the service corresponding to the plugin
 370      */
 371      function get_service_name()
 372      {
 373          return $this->service_name;
 374      }
 375   
 376      /**
 377      * Set the name of the plugin
 378      *
 379      * @param string $name
 380      */
 381      public function set_name($name)
 382      {
 383          $this->service_name = $name;
 384      }
 385   
 386      /**
 387      * @return string the name of the class used to generate the captcha
 388      */
 389      abstract function get_generator_class();
 390  }
 391