Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   1  <?php
   2  
   3  /**
   4   * Validates an integer.
   5   * @note While this class was modeled off the CSS definition, no currently
   6   *       allowed CSS uses this type.  The properties that do are: widows,
   7   *       orphans, z-index, counter-increment, counter-reset.  Some of the
   8   *       HTML attributes, however, find use for a non-negative version of this.
   9   */
  10  class HTMLPurifier_AttrDef_Integer extends HTMLPurifier_AttrDef
  11  {
  12  
  13      /**
  14       * Whether or not negative values are allowed.
  15       * @type bool
  16       */
  17      protected $negative = true;
  18  
  19      /**
  20       * Whether or not zero is allowed.
  21       * @type bool
  22       */
  23      protected $zero = true;
  24  
  25      /**
  26       * Whether or not positive values are allowed.
  27       * @type bool
  28       */
  29      protected $positive = true;
  30  
  31      /**
  32       * @param $negative Bool indicating whether or not negative values are allowed
  33       * @param $zero Bool indicating whether or not zero is allowed
  34       * @param $positive Bool indicating whether or not positive values are allowed
  35       */
  36      public function __construct($negative = true, $zero = true, $positive = true)
  37      {
  38          $this->negative = $negative;
  39          $this->zero = $zero;
  40          $this->positive = $positive;
  41      }
  42  
  43      /**
  44       * @param string $integer
  45       * @param HTMLPurifier_Config $config
  46       * @param HTMLPurifier_Context $context
  47       * @return bool|string
  48       */
  49      public function validate($integer, $config, $context)
  50      {
  51          $integer = $this->parseCDATA($integer);
  52          if ($integer === '') {
  53              return false;
  54          }
  55  
  56          // we could possibly simply typecast it to integer, but there are
  57          // certain fringe cases that must not return an integer.
  58  
  59          // clip leading sign
  60          if ($this->negative && $integer[0] === '-') {
  61              $digits = substr($integer, 1);
  62              if ($digits === '0') {
  63                  $integer = '0';
  64              } // rm minus sign for zero
  65          } elseif ($this->positive && $integer[0] === '+') {
  66              $digits = $integer = substr($integer, 1); // rm unnecessary plus
  67          } else {
  68              $digits = $integer;
  69          }
  70  
  71          // test if it's numeric
  72          if (!ctype_digit($digits)) {
  73              return false;
  74          }
  75  
  76          // perform scope tests
  77          if (!$this->zero && $integer == 0) {
  78              return false;
  79          }
  80          if (!$this->positive && $integer > 0) {
  81              return false;
  82          }
  83          if (!$this->negative && $integer < 0) {
  84              return false;
  85          }
  86  
  87          return $integer;
  88      }
  89  }
  90  
  91  // vim: et sw=4 sts=4