Esempio n. 1
0
 public function assertEncode($string, $expect = true, $preserve = false)
 {
     if ($expect === true) {
         $expect = $string;
     }
     $encoder = new HTMLPurifier_PercentEncoder($preserve);
     $result = $encoder->encode($string);
     $this->assertIdentical($result, $expect);
 }
 /**
  * Generic validation method applicable for all schemes. May modify
  * this URI in order to get it into a compliant form.
  * @param HTMLPurifier_Config $config
  * @param HTMLPurifier_Context $context
  * @return bool True if validation/filtering succeeds, false if failure
  */
 public function validate($config, $context)
 {
     // ABNF definitions from RFC 3986
     $chars_sub_delims = '!$&\'()*+,;=';
     $chars_gen_delims = ':/?#[]@';
     $chars_pchar = $chars_sub_delims . ':@';
     // validate host
     if (!is_null($this->host)) {
         $host_def = new HTMLPurifier_AttrDef_URI_Host();
         $this->host = $host_def->validate($this->host, $config, $context);
         if ($this->host === false) {
             $this->host = null;
         }
     }
     // validate scheme
     // NOTE: It's not appropriate to check whether or not this
     // scheme is in our registry, since a URIFilter may convert a
     // URI that we don't allow into one we do.  So instead, we just
     // check if the scheme can be dropped because there is no host
     // and it is our default scheme.
     if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
         // support for relative paths is pretty abysmal when the
         // scheme is present, so axe it when possible
         $def = $config->getDefinition('URI');
         if ($def->defaultScheme === $this->scheme) {
             $this->scheme = null;
         }
     }
     // validate username
     if (!is_null($this->userinfo)) {
         $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
         $this->userinfo = $encoder->encode($this->userinfo);
     }
     // validate port
     if (!is_null($this->port)) {
         if ($this->port < 1 || $this->port > 65535) {
             $this->port = null;
         }
     }
     // validate path
     $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
     if (!is_null($this->host)) {
         // this catches $this->host === ''
         // path-abempty (hier and relative)
         // http://www.example.com/my/path
         // //www.example.com/my/path (looks odd, but works, and
         //                            recognized by most browsers)
         // (this set is valid or invalid on a scheme by scheme
         // basis, so we'll deal with it later)
         // file:///my/path
         // ///my/path
         $this->path = $segments_encoder->encode($this->path);
     } elseif ($this->path !== '') {
         if ($this->path[0] === '/') {
             // path-absolute (hier and relative)
             // http:/my/path
             // /my/path
             if (strlen($this->path) >= 2 && $this->path[1] === '/') {
                 // This could happen if both the host gets stripped
                 // out
                 // http://my/path
                 // //my/path
                 $this->path = '';
             } else {
                 $this->path = $segments_encoder->encode($this->path);
             }
         } elseif (!is_null($this->scheme)) {
             // path-rootless (hier)
             // http:my/path
             // Short circuit evaluation means we don't need to check nz
             $this->path = $segments_encoder->encode($this->path);
         } else {
             // path-noscheme (relative)
             // my/path
             // (once again, not checking nz)
             $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
             $c = strpos($this->path, '/');
             if ($c !== false) {
                 $this->path = $segment_nc_encoder->encode(substr($this->path, 0, $c)) . $segments_encoder->encode(substr($this->path, $c));
             } else {
                 $this->path = $segment_nc_encoder->encode($this->path);
             }
         }
     } else {
         // path-empty (hier and relative)
         $this->path = '';
         // just to be safe
     }
     // qf = query and fragment
     $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
     if (!is_null($this->query)) {
         $this->query = $qf_encoder->encode($this->query);
     }
     if (!is_null($this->fragment)) {
         $this->fragment = $qf_encoder->encode($this->fragment);
     }
     return true;
 }
 /**
  * Generic validation method applicable for all schemes. May modify
  * this URI in order to get it into a compliant form.
  * @param $config Instance of HTMLPurifier_Config
  * @param $context Instance of HTMLPurifier_Context
  * @return True if validation/filtering succeeds, false if failure
  */
 public function validate($config, $context)
 {
     // ABNF definitions from RFC 3986
     $chars_sub_delims = '!$&\'()*+,;=';
     $chars_gen_delims = ':/?#[]@';
     $chars_pchar = $chars_sub_delims . ':@';
     // validate scheme (MUST BE FIRST!)
     if (!is_null($this->scheme) && is_null($this->host)) {
         $def = $config->getDefinition('URI');
         if ($def->defaultScheme === $this->scheme) {
             $this->scheme = null;
         }
     }
     // validate host
     if (!is_null($this->host)) {
         $host_def = new HTMLPurifier_AttrDef_URI_Host();
         $this->host = $host_def->validate($this->host, $config, $context);
         if ($this->host === false) {
             $this->host = null;
         }
     }
     // validate username
     if (!is_null($this->userinfo)) {
         $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
         $this->userinfo = $encoder->encode($this->userinfo);
     }
     // validate port
     if (!is_null($this->port)) {
         if ($this->port < 1 || $this->port > 65535) {
             $this->port = null;
         }
     }
     // validate path
     $path_parts = array();
     $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
     if (!is_null($this->host)) {
         // path-abempty (hier and relative)
         $this->path = $segments_encoder->encode($this->path);
     } elseif ($this->path !== '' && $this->path[0] === '/') {
         // path-absolute (hier and relative)
         if (strlen($this->path) >= 2 && $this->path[1] === '/') {
             // This shouldn't ever happen!
             $this->path = '';
         } else {
             $this->path = $segments_encoder->encode($this->path);
         }
     } elseif (!is_null($this->scheme) && $this->path !== '') {
         // path-rootless (hier)
         // Short circuit evaluation means we don't need to check nz
         $this->path = $segments_encoder->encode($this->path);
     } elseif (is_null($this->scheme) && $this->path !== '') {
         // path-noscheme (relative)
         // (once again, not checking nz)
         $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
         $c = strpos($this->path, '/');
         if ($c !== false) {
             $this->path = $segment_nc_encoder->encode(substr($this->path, 0, $c)) . $segments_encoder->encode(substr($this->path, $c));
         } else {
             $this->path = $segment_nc_encoder->encode($this->path);
         }
     } else {
         // path-empty (hier and relative)
         $this->path = '';
         // just to be safe
     }
     // qf = query and fragment
     $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
     if (!is_null($this->query)) {
         $this->query = $qf_encoder->encode($this->query);
     }
     if (!is_null($this->fragment)) {
         $this->fragment = $qf_encoder->encode($this->fragment);
     }
     return true;
 }
 public function validate($config, $context)
 {
     $chars_sub_delims = '!$&\'()*+,;=';
     $chars_gen_delims = ':/?#[]@';
     $chars_pchar = $chars_sub_delims . ':@';
     if (!is_null($this->host)) {
         $host_def = new HTMLPurifier_AttrDef_URI_Host();
         $this->host = $host_def->validate($this->host, $config, $context);
         if ($this->host === false) {
             $this->host = null;
         }
     }
     if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
         $def = $config->getDefinition('URI');
         if ($def->defaultScheme === $this->scheme) {
             $this->scheme = null;
         }
     }
     if (!is_null($this->userinfo)) {
         $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
         $this->userinfo = $encoder->encode($this->userinfo);
     }
     if (!is_null($this->port)) {
         if ($this->port < 1 || $this->port > 65535) {
             $this->port = null;
         }
     }
     $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
     if (!is_null($this->host)) {
         $this->path = $segments_encoder->encode($this->path);
     } elseif ($this->path !== '') {
         if ($this->path[0] === '/') {
             if (strlen($this->path) >= 2 && $this->path[1] === '/') {
                 $this->path = '';
             } else {
                 $this->path = $segments_encoder->encode($this->path);
             }
         } elseif (!is_null($this->scheme)) {
             $this->path = $segments_encoder->encode($this->path);
         } else {
             $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
             $c = strpos($this->path, '/');
             if ($c !== false) {
                 $this->path = $segment_nc_encoder->encode(substr($this->path, 0, $c)) . $segments_encoder->encode(substr($this->path, $c));
             } else {
                 $this->path = $segment_nc_encoder->encode($this->path);
             }
         }
     } else {
         $this->path = '';
     }
     $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
     if (!is_null($this->query)) {
         $this->query = $qf_encoder->encode($this->query);
     }
     if (!is_null($this->fragment)) {
         $this->fragment = $qf_encoder->encode($this->fragment);
     }
     return true;
 }