phpBB-3.0.14 unter PHP 7 lauffähig anwenden

Erstellt von Franky, 26 April 2017, 16:31

Vorheriges Thema - Nächstes Thema

Franky

Die Frage, ob phpBB-3.0.14 mit PHP 7 läuft, stellen sich zur Zeit zahlreiche phpBB-Anwender. Aus meiner Sicht, gibt es eine Möglichkeit phpBB-3.0.14 unter PHP 7 anzuwenden. Lösungen der phpBB-Entwickler habe ich testweise umgesetzt. Bitte macht ein komplettes Backup des Forums und der Datenbank. Die genannten Änderungen beziehen sich auf den Bug im Standard-BBCode-System (andere Bugs in Verwendung mit PHP 7 sind mir nicht bekannt). Es ist nicht auszuschließen, dass eventuell weitere Bugs auftreten können. Daher empfehle ich grundsätzlich, die Codierungen vor Verwendung in einem Liveboard in einem Testforum mit mehreren Testern und verschiedenen Berechtigungen, ausgiebig zu prüfen und zu testen. Ich gebe keine Gewähr und die Code-Anwendung ist aus meiner Sicht verständlicher Weise euer eigenes Risiko.

Unbedingt vorher ein Backup von den Dateien und der Datenbank machen. Der Autor übernimmt keine Gewähr!

Datei:
phpBB3/includes/acp/acp_bbcodes.php


Finde Zeile (original Zeile 404)
Code (php.404) Alles auswählen
$replace = preg_replace('/(?<!\\\\)\$([0-9]+)/e', "'\${' . (\$1 + \$pad) . '}'", $replace);
Ersetzen mit
Code (php.404) Alles auswählen
$replace = preg_replace_callback('/(?<!\\\\)\$([0-9]+)/', function ($match) use ($pad) {
return '${' . ($match[1] + $pad) . '}';
}, $replace);

Finde Zeilen (original ab Zeile 469)
Code (php.469) Alles auswählen
      $fp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_match);
      $fp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $fp_replace);
      $sp_match = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_match);
      $sp_replace = preg_replace('#\[/?' . $bbcode_search . '#ie', "strtolower('\$0')", $sp_replace);

Ersetzen mit
Code (php.469) Alles auswählen
      $fp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
         return strtolower($match[0]);
      }, $fp_match);
      $fp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
         return strtolower($match[0]);
      }, $fp_replace);
      $sp_match = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
         return strtolower($match[0]);
      }, $sp_match);
      $sp_replace = preg_replace_callback('#\[/?' . $bbcode_search . '#i', function ($match) {
         return strtolower($match[0]);
      }, $sp_replace);

Franky

Datei:
phpBB3\includes\ucp\ucp_pm_options.php


Finde Zeile (original Zeile 507)
Code (php.507) Alles auswählen
preg_replace('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#e', "\${strtolower('\\2') . '_lang'}[constant('\\1')] = \$user->lang['PM_\\2']['\\3']", array_keys(get_defined_constants()));
Ersetzen mit
Code (php.507) Alles auswählen
preg_replace_callback('#^((RULE|ACTION|CHECK)_([A-Z0-9_]+))$#', function ($match) use(&$rule_lang, &$action_lang, &$check_lang, $user) {
${strtolower($match[2]) . '_lang'}[constant($match[1])] = $user->lang['PM_' . $match[2]][$match[3]];
},
array_keys(get_defined_constants()));

Franky

Datei:
phpBB3\includes\bbcode.php


Finde Zeile (original Zeile 112)
Code (php.112) Alles auswählen
$message = preg_replace($preg['search'], $preg['replace'], $message);
Ersetzen mit
Code (php.112) Alles auswählen
foreach ($preg['search'] as $key => $search)
{
if (is_callable($preg['replace'][$key]))
{
$message = preg_replace_callback($search, $preg['replace'][$key], $message);
}
else
{
$message = preg_replace($search, $preg['replace'][$key], $message);
}
}

Finde Zeile (original Zeile 211)
Code (php.211) Alles auswählen
                     '#\[quote(?:=&quot;(.*?)&quot;)?:$uid\]((?!\[quote(?:=&quot;.*?&quot;)?:$uid\]).)?#ise'   => "\$this->bbcode_second_pass_quote('\$1', '\$2')"
Ersetzen mit
Code (php.211) Alles auswählen
                     '#\[quote(?:=&quot;(.*?)&quot;)?:$uid\]((?!\[quote(?:=&quot;.*?&quot;)?:$uid\]).)?#is'   => function ($match) {
                        return $this->bbcode_second_pass_quote($match[1], $match[2]);
                     },

Finde Zeile (original Zeile 290)
Code (php.290) Alles auswählen
                     '#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise'   => "\$this->bbcode_second_pass_code('\$1', '\$2')",
Ersetzen mit
Code (php.290) Alles auswählen
                     '#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#is'   => function ($match) {
                        return $this->bbcode_second_pass_code($match[1], $match[2]);
                     },

Finde Zeile (original Zeile 300)
Code (php.300) Alles auswählen
                     '#\[list=([^\[]+):$uid\]#e'               => "\$this->bbcode_list('\$1')",
Ersetzen mit
Code (php.300) Alles auswählen
                     '#\[list=([^\[]+):$uid\]#'               => function ($match) {
                        return $this->bbcode_list($match[1]);
                     },

Finde Zeile (original Zeile 384)
Code (php.384) Alles auswählen
                  $bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
Ersetzen mit
Code (php.384) Alles auswählen
                  $bbcode_tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
                     return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
                  }, $bbcode_tpl);

Finde Zeile (original Zeile 488)
Code (php.488) Alles auswählen
      $tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
Ersetzen mit
Code (php.488) Alles auswählen
      $tpl = preg_replace_callback('/{L_([A-Z0-9_]+)}/', function ($match) use ($user) {
         return (!empty($user->lang[$match[1]])) ? $user->lang($match[1]) : ucwords(strtolower(str_replace('_', ' ', $match[1])));
      }, $tpl);

Franky

Datei:
phpBB3\includes\functions_content.php


Finde Zeilen (original Zeile ab 659)
Code (php.659) Alles auswählen
function make_clickable($text, $server_url = false, $class = 'postlink')
{
   if ($server_url === false)
   {
      $server_url = generate_board_url();
   }

   static $magic_url_match;
   static $magic_url_replace;
   static $static_class;

   if (!is_array($magic_url_match) || $static_class != $class)
   {
      $static_class = $class;
      $class = ($static_class) ? ' class="' . $static_class . '"' : '';
      $local_class = ($static_class) ? ' class="' . $static_class . '-local"' : '';

      $magic_url_match = $magic_url_replace = array();
      // Be sure to not let the matches cross over. ;)

      // relative urls for this board
      $magic_url_match[] = '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#ie';
      $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_LOCAL, '\$1', '\$2', '\$3', '$local_class')";

      // matches a xxxx://aaaaa.bbb.cccc. ...
      $magic_url_match[] = '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#ie';
      $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_FULL, '\$1', '\$2', '', '$class')";

      // matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing
      $magic_url_match[] = '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#ie';
      $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_WWW, '\$1', '\$2', '', '$class')";

      // matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode.
      $magic_url_match[] = '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/ie';
      $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_EMAIL, '\$1', '\$2', '', '')";
   }

   return preg_replace($magic_url_match, $magic_url_replace, $text);
}

Ersetzen mit
Code (php.659) Alles auswählen
function make_clickable($text, $server_url = false, $class = 'postlink')
{
   if ($server_url === false)
   {
      $server_url = generate_board_url();
   }
   static $static_class;
   static $magic_url_match_args;
   if (!isset($magic_url_match_args[$server_url]) || $static_class != $class)
   {
      $static_class = $class;
      $class = ($static_class) ? ' class="' . $static_class . '"' : '';
      $local_class = ($static_class) ? ' class="' . $static_class . '-local"' : '';
      if (!is_array($magic_url_match_args))
      {
         $magic_url_match_args = array();
      }
      // relative urls for this board
      $magic_url_match_args[$server_url][] = array(
         '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#iu',
         MAGIC_URL_LOCAL,
         $local_class,
      );
      // matches a xxxx://aaaaa.bbb.cccc. ...
      $magic_url_match_args[$server_url][] = array(
         '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#iu',
         MAGIC_URL_FULL,
         $class,
      );
      // matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing
      $magic_url_match_args[$server_url][] = array(
         '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#iu',
         MAGIC_URL_WWW,
         $class,
      );
      // matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode.
      $magic_url_match_args[$server_url][] = array(
         '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/iu',
         MAGIC_URL_EMAIL,
         '',
      );
   }

   foreach ($magic_url_match_args[$server_url] as $magic_args)
   {
      if (preg_match($magic_args[0], $text, $matches))
      {
         $text = preg_replace_callback($magic_args[0], function($matches) use ($magic_args)
         {
            $relative_url = isset($matches[3]) ? $matches[3] : '';
            return make_clickable_callback($magic_args[1], $matches[1], $matches[2], $relative_url, $magic_args[2]);
         }, $text);
      }
   }
   return $text;
}


Franky

Datei:
phpBB3\includes\message_parser.php


Finde Zeilen (original ab Zeile 50)
Code (php.50) Alles auswählen
      foreach ($this->bbcodes as $bbcode_name => $bbcode_data)
      {
         if (isset($bbcode_data['disabled']) && $bbcode_data['disabled'])
         {
            foreach ($bbcode_data['regexp'] as $regexp => $replacement)
            {
               if (preg_match($regexp, $this->message))
               {
                  $this->warn_msg[] = sprintf($user->lang['UNAUTHORISED_BBCODE'] , '[' . $bbcode_name . ']');
                  continue;
               }
            }
         }
         else
         {
            foreach ($bbcode_data['regexp'] as $regexp => $replacement)
            {
               // The pattern gets compiled and cached by the PCRE extension,
               // it should not demand recompilation
               if (preg_match($regexp, $this->message))
               {
                  $this->message = preg_replace($regexp, $replacement, $this->message);
                  $bitfield->set($bbcode_data['bbcode_id']);
               }
            }
         }
      }

      $this->bbcode_bitfield = $bitfield->get_base64();
   }

Ersetzen mit
Code (php.50) Alles auswählen
      foreach ($this->bbcodes as $bbcode_name => $bbcode_data)
      {
         if (isset($bbcode_data['disabled']) && $bbcode_data['disabled'])
         {
            foreach ($bbcode_data['regexp'] as $regexp => $replacement)
            {
               if (preg_match($regexp, $this->message))
               {
                  $this->warn_msg[] = sprintf($user->lang['UNAUTHORISED_BBCODE'] , '[' . $bbcode_name . ']');
                  continue;
               }
            }
         }
         else
         {
            foreach ($bbcode_data['regexp'] as $regexp => $replacement)
            {
               // The pattern gets compiled and cached by the PCRE extension,
               // it should not demand recompilation
               if (preg_match($regexp, $this->message))
               {
                  if (is_callable($replacement))
                  {
                     $this->message = preg_replace_callback($regexp, $replacement, $this->message);
                  }
                  else
                  {
                     $this->message = preg_replace($regexp, $replacement, $this->message);
                  }
                  $bitfield->set($bbcode_data['bbcode_id']);
               }
            }
         }
      }

      $this->bbcode_bitfield = $bitfield->get_base64();
   }

Finde Zeilen (original ab Zeile 103)
Code (php.103) Alles auswählen
   * Init bbcode data for later parsing
   */
   function bbcode_init($allow_custom_bbcode = true)
   {
      static $rowset;

Danach einfügen In einer neuen leeren Zeile danach einfügen (!Leerzeile nicht vergessen  einzufügen!)
Code (php.108) Alles auswählen


      $bbcode_class = $this;

Finde Zeilen (original ab Zeile 114)
Code (php.114) Alles auswählen
      $this->bbcodes = array(
         'code'         => array('bbcode_id' => 8,   'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uise' => "\$this->bbcode_code('\$1', '\$2')")),
         'quote'         => array('bbcode_id' => 0,   'regexp' => array('#\[quote(?:=&quot;(.*?)&quot;)?\](.+)\[/quote\]#uise' => "\$this->bbcode_quote('\$0')")),
         'attachment'   => array('bbcode_id' => 12,   'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uise' => "\$this->bbcode_attachment('\$1', '\$2')")),
         'b'            => array('bbcode_id' => 1,   'regexp' => array('#\[b\](.*?)\[/b\]#uise' => "\$this->bbcode_strong('\$1')")),
         'i'            => array('bbcode_id' => 2,   'regexp' => array('#\[i\](.*?)\[/i\]#uise' => "\$this->bbcode_italic('\$1')")),
         'url'         => array('bbcode_id' => 3,   'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiUe' => "\$this->validate_url('\$2', ('\$3') ? '\$3' : '\$4')")),
         'img'         => array('bbcode_id' => 4,   'regexp' => array('#\[img\](.*)\[/img\]#uiUe' => "\$this->bbcode_img('\$1')")),
         'size'         => array('bbcode_id' => 5,   'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uise' => "\$this->bbcode_size('\$1', '\$2')")),
         'color'         => array('bbcode_id' => 6,   'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uise' => "\$this->bbcode_color('\$1', '\$2')")),
         'u'            => array('bbcode_id' => 7,   'regexp' => array('#\[u\](.*?)\[/u\]#uise' => "\$this->bbcode_underline('\$1')")),
         'list'         => array('bbcode_id' => 9,   'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uise' => "\$this->bbcode_parse_list('\$0')")),
         'email'         => array('bbcode_id' => 10,   'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uise' => "\$this->validate_email('\$1', '\$2')")),
         'flash'         => array('bbcode_id' => 11,   'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#uie' => "\$this->bbcode_flash('\$1', '\$2', '\$3')"))
      );

Ersetzen mit
Code (php.114) Alles auswählen
      $this->bbcodes = array(
         'code'         => array('bbcode_id' => 8,   'regexp' => array('#\[code(?:=([a-z]+))?\](.+\[/code\])#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_code($match[1], $match[2]);
            }
         )),
         'quote'         => array('bbcode_id' => 0,   'regexp' => array('#\[quote(?:=&quot;(.*?)&quot;)?\](.+)\[/quote\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_quote($match[0]);
            }
         )),
         'attachment'   => array('bbcode_id' => 12,   'regexp' => array('#\[attachment=([0-9]+)\](.*?)\[/attachment\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_attachment($match[1], $match[2]);
            }
         )),
         'b'            => array('bbcode_id' => 1,   'regexp' => array('#\[b\](.*?)\[/b\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_strong($match[1]);
            }
         )),
         'i'            => array('bbcode_id' => 2,   'regexp' => array('#\[i\](.*?)\[/i\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_italic($match[1]);
            }
         )),
         'url'         => array('bbcode_id' => 3,   'regexp' => array('#\[url(=(.*))?\](?(1)((?s).*(?-s))|(.*))\[/url\]#uiU' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->validate_url($match[2], ($match[3]) ? $match[3] : $match[4]);
            }
         )),
         'img'         => array('bbcode_id' => 4,   'regexp' => array('#\[img\](.*)\[/img\]#uiU' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_img($match[1]);
            }
         )),
         'size'         => array('bbcode_id' => 5,   'regexp' => array('#\[size=([\-\+]?\d+)\](.*?)\[/size\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_size($match[1], $match[2]);
            }
         )),
         'color'         => array('bbcode_id' => 6,   'regexp' => array('!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+)\](.*?)\[/color\]!uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_color($match[1], $match[2]);
            }
         )),
         'u'            => array('bbcode_id' => 7,   'regexp' => array('#\[u\](.*?)\[/u\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_underline($match[1]);
            }
         )),
         'list'         => array('bbcode_id' => 9,   'regexp' => array('#\[list(?:=(?:[a-z0-9]|disc|circle|square))?].*\[/list]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_parse_list($match[0]);
            }
         )),
         'email'         => array('bbcode_id' => 10,   'regexp' => array('#\[email=?(.*?)?\](.*?)\[/email\]#uis' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->validate_email($match[1], $match[2]);
            }
         )),
         'flash'         => array('bbcode_id' => 11,   'regexp' => array('#\[flash=([0-9]+),([0-9]+)\](.*?)\[/flash\]#ui' => function ($match) use($bbcode_class)
            {
               return $bbcode_class->bbcode_flash($match[1], $match[2], $match[3]);
            }
         ))
      );

Finde Zeilen (original ab Zeile 725)
Code (php.725) Alles auswählen
      $in = preg_replace('#quote=&quot;(.*?)&quot;\]#ie', "'quote=&quot;' . str_replace(array('[', ']', '\\\"'), array('&#91;', '&#93;', '\"'), '\$1') . '&quot;]'", $in);
Ersetzen mit
Code (php.725) Alles auswählen
      $in = preg_replace_callback('#quote=&quot;(.*?)&quot;\]#i', function ($match) {
         return 'quote=&quot;' . str_replace(array('[', ']', '\\\"'), array('&#91;', '&#93;', '\"'), $match[1]) . '&quot;]';
      }, $in);

Finde Zeile (original Zeile 1431)
Code (php.1431) Alles auswählen
               $this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
Ersetzen mit
Code (php.1431) Alles auswählen
               $this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
                  return '[attachment='.($match[1] + 1).']' . $match[2] . '[/attachment]';
               }, $this->message);

Finde Zeile (original Zeile 1494)
Code (php.1494) Alles auswählen
               $this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "(\\1 == \$index) ? '' : ((\\1 > \$index) ? '[attachment=' . (\\1 - 1) . ']\\2[/attachment]' : '\\0')", $this->message);
Ersetzen mit
Code (php.1494) Alles auswählen
               $this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) use($index) {
                  return ($match[1] == $index) ? '' : (($match[1] > $index) ? '[attachment=' . ($match[1] - 1) . ']' . $match[2] . '[/attachment]' : $match[0]);
               }, $this->message);

Finde Zeile (original Zeile 1533)
Code (php.1533) Alles auswählen
                  $this->message = preg_replace('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#e', "'[attachment='.(\\1 + 1).']\\2[/attachment]'", $this->message);
Ersetzen mit
Code (php.1533) Alles auswählen
                  $this->message = preg_replace_callback('#\[attachment=([0-9]+)\](.*?)\[\/attachment\]#', function ($match) {
                     return '[attachment=' . ($match[1] + 1) . ']' . $match[2] . '[/attachment]';
                  }, $this->message);



Vielen Dank an Dennis der mich per E-Mail auf einen Fehler aufmerksam gemacht hat. Dieser wurde behoben und das Snippet nochmals überprüft.

Vielen Dank Dennis für deine Meldung  :)

Franky

Captcha Bug im Adminbereich beheben

öffnet phpBB/includes/captcha/plugins/

phpbb_captcha_gd_plugin.php
Finde Zeile (original Zeile 55)
Code (php.55) Alles auswählen
$instance =& new phpbb_captcha_gd();
Ersetzen mit
Code (php.55) Alles auswählen
$instance = new phpbb_captcha_gd();

phpbb_captcha_nogd_plugin.php
Finde Zeile (original Zeile 45)
Code (php.45) Alles auswählen
$instance =& new phpbb_captcha_nogd();
Ersetzen mit
Code (php.45) Alles auswählen
$instance = new phpbb_captcha_nogd();

phpbb_captcha_qa_plugin.php
Finde Zeile (original Zeile 104)
Code (php.104) Alles auswählen
$instance =& new phpbb_captcha_qa();
Ersetzen mit
Code (php.104) Alles auswählen
$instance = new phpbb_captcha_qa();

phpbb_recaptcha_plugin.php
Finde Zeile (original Zeile 59)
Code (php.59) Alles auswählen
$instance =& new phpbb_recaptcha();
Ersetzen mit
Code (php.59) Alles auswählen
$instance = new phpbb_recaptcha();