Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.
   1  <?php
   2  namespace ParagonIE\ConstantTime;
   3  
   4  /**
   5   *  Copyright (c) 2016 - 2017 Paragon Initiative Enterprises.
   6   *  Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
   7   *
   8   *  Permission is hereby granted, free of charge, to any person obtaining a copy
   9   *  of this software and associated documentation files (the "Software"), to deal
  10   *  in the Software without restriction, including without limitation the rights
  11   *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12   *  copies of the Software, and to permit persons to whom the Software is
  13   *  furnished to do so, subject to the following conditions:
  14   *
  15   *  The above copyright notice and this permission notice shall be included in all
  16   *  copies or substantial portions of the Software.
  17   *
  18   *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19   *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20   *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21   *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22   *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23   *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  24   *  SOFTWARE.
  25   */
  26  
  27  /**
  28   * Class Binary
  29   *
  30   * Binary string operators that don't choke on
  31   * mbstring.func_overload
  32   *
  33   * @package ParagonIE\ConstantTime
  34   */
  35  abstract class Binary
  36  {
  37      /**
  38       * Safe string length
  39       *
  40       * @ref mbstring.func_overload
  41       *
  42       * @param string $str
  43       * @return int
  44       */
  45      public static function safeStrlen($str)
  46      {
  47          if (\function_exists('mb_strlen')) {
  48              return (int) \mb_strlen($str, '8bit');
  49          } else {
  50              return (int) \strlen($str);
  51          }
  52      }
  53  
  54      /**
  55       * Safe substring
  56       *
  57       * @ref mbstring.func_overload
  58       *
  59       * @staticvar boolean $exists
  60       * @param string $str
  61       * @param int $start
  62       * @param int $length
  63       * @return string
  64       * @throws \TypeError
  65       */
  66      public static function safeSubstr(
  67          $str,
  68          $start = 0,
  69          $length = \null
  70      ) {
  71          if (\function_exists('mb_substr')) {
  72              // mb_substr($str, 0, null, '8bit') returns an empty string on PHP
  73              // 5.3, so we have to find the length ourselves.
  74              if (\is_null($length)) {
  75                  if ($start >= 0) {
  76                      $length = self::safeStrlen($str) - $start;
  77                  } else {
  78                      $length = -$start;
  79                  }
  80              }
  81              // $length calculation above might result in a 0-length string
  82              if ($length === 0) {
  83                  return '';
  84              }
  85              return \mb_substr($str, $start, $length, '8bit');
  86          }
  87          if ($length === 0) {
  88              return '';
  89          }
  90          // Unlike mb_substr(), substr() doesn't accept null for length
  91          if (!is_null($length)) {
  92              return \substr($str, $start, $length);
  93          } else {
  94              return \substr($str, $start);
  95          }
  96      }
  97  }