/** * Custom validation rules * Validate the array of links * @param $value * @param $context * @return boolean */ public static function validateLinksArray($value, $context) { $patten = '/[\\s|\\,]+/'; // replace all delineter simbols $value = preg_replace($patten, '|', $value); // split all links in arra $links = preg_split('/\\|/', $value); foreach ($links as $link) { if (!Validation::url($link)) { return false; } } return true; }
/** * Default validation rules set. * * @param \Cake\Validation\Validator $validator The validator object * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator) { $validator->allowEmpty('url')->add('url', 'checkUrl', ['rule' => function ($url, $context) { $plainString = strpos($url, 'javascript:') === 0 || strpos($url, 'mailto:') === 0 || strpos($url, 'tel:') === 0 || strpos($url, 'sms:') === 0 || strpos($url, '#') === 0 || strpos($url, '?') === 0 || strpos($url, '//') === 0 || strpos($url, '://') !== false; if ($plainString) { return true; } else { $full = Validation::url($url); $internal = str_starts_with($url, '/'); return $full || $internal; } }, 'message' => __d('menu', 'Invalid URL. Internal links must start with "/", e.g. "/article-my-first-article{0}"', CONTENT_EXTENSION), 'provider' => 'table'])->requirePresence('title')->add('title', ['notBlank' => ['rule' => 'notBlank', 'message' => __d('menu', 'You need to provide a title.')], 'length' => ['rule' => ['minLength', 3], 'message' => __d('menu', 'Title need to be at least 3 characters long.')]])->add('activation', 'validActivation', ['rule' => function ($value, $context) { return in_array($value, ['auto', 'any', 'none', 'php']); }, 'message' => __d('menu', 'Please select an activation method.'), 'provider' => 'table'])->allowEmpty('active')->add('active', 'validPHP', ['rule' => function ($value, $context) { if (!empty($context['data']['activation']) && $context['data']['activation'] === 'php') { return strpos($value, '<?php') !== false && strpos($value, '?>') !== false; } return true; }, 'message' => __d('menu', 'Invalid PHP code, make sure that tags "<?php" & "?>" are present.')]); return $validator; }
/** * Checks if a URL is valid AND accessible (returns false otherwise) * * Options: * - allowEmpty TRUE/FALSE (TRUE: if empty => return TRUE) * - required TRUE/FALSE (TRUE: overrides allowEmpty) * - autoComplete (default: TRUE) * - deep (default: TRUE) * * @param array|string $url Full URL starting with http://... * @param array $options * @param array $context * @return bool Success */ public function validateUrl($url, array $options = [], array $context = []) { if (empty($url)) { if (!empty($options['allowEmpty']) && empty($options['required'])) { return true; } return false; } if (!isset($options['autoComplete']) || $options['autoComplete'] !== false) { $url = $this->_autoCompleteUrl($url); } if (!isset($options['strict']) || $options['strict'] !== false) { $options['strict'] = true; } // validation if (!Validation::url($url, $options['strict']) && env('REMOTE_ADDR') && env('REMOTE_ADDR') !== '127.0.0.1') { return false; } // same domain? if (!empty($options['sameDomain']) && env('HTTP_HOST')) { $is = parse_url($url, PHP_URL_HOST); $expected = env('HTTP_HOST'); if (mb_strtolower($is) !== mb_strtolower($expected)) { return false; } } if (isset($options['deep']) && $options['deep'] === false) { return true; } return $this->_validUrl($url); }
/** * testUrl method * * @return void */ public function testUrl() { $this->assertTrue(Validation::url('http://www.cakephp.org')); $this->assertTrue(Validation::url('http://cakephp.org')); $this->assertTrue(Validation::url('http://www.cakephp.org/somewhere#anchor')); $this->assertTrue(Validation::url('http://192.168.0.1')); $this->assertTrue(Validation::url('https://www.cakephp.org')); $this->assertTrue(Validation::url('https://cakephp.org')); $this->assertTrue(Validation::url('https://www.cakephp.org/somewhere#anchor')); $this->assertTrue(Validation::url('https://192.168.0.1')); $this->assertTrue(Validation::url('ftps://www.cakephp.org/pub/cake')); $this->assertTrue(Validation::url('ftps://cakephp.org/pub/cake')); $this->assertTrue(Validation::url('ftps://192.168.0.1/pub/cake')); $this->assertTrue(Validation::url('ftp://www.cakephp.org/pub/cake')); $this->assertTrue(Validation::url('ftp://cakephp.org/pub/cake')); $this->assertTrue(Validation::url('ftp://192.168.0.1/pub/cake')); $this->assertTrue(Validation::url('sftp://192.168.0.1/pub/cake')); $this->assertTrue(Validation::url('https://my.domain.com/gizmo/app?class=MySip;proc=start')); $this->assertTrue(Validation::url('www.domain.tld')); $this->assertTrue(Validation::url('http://123456789112345678921234567893123456789412345678951234567896123.com')); $this->assertTrue(Validation::url('http://www.domain.com/blogs/index.php?blog=6&tempskin=_rss2')); $this->assertTrue(Validation::url('http://www.domain.com/blogs/parenth()eses.php')); $this->assertTrue(Validation::url('http://www.domain.com/index.php?get=params&get2=params')); $this->assertTrue(Validation::url('http://www.domain.com/ndex.php?get=params&get2=params#anchor')); $this->assertTrue(Validation::url('http://www.domain.com/real%20url%20encodeing')); $this->assertTrue(Validation::url('http://en.wikipedia.org/wiki/Architectural_pattern_(computer_science)')); $this->assertTrue(Validation::url('http://www.cakephp.org', true)); $this->assertTrue(Validation::url('http://example.com/~userdir/')); $this->assertTrue(Validation::url('http://underscore_subdomain.example.org')); $this->assertTrue(Validation::url('http://_jabber._tcp.gmail.com')); $this->assertTrue(Validation::url('http://www.domain.longttldnotallowed')); $this->assertFalse(Validation::url('ftps://256.168.0.1/pub/cake')); $this->assertFalse(Validation::url('ftp://256.168.0.1/pub/cake')); $this->assertFalse(Validation::url('http://w_w.domain.co_m')); $this->assertFalse(Validation::url('http://www.domain.12com')); $this->assertFalse(Validation::url('http://www.-invaliddomain.tld')); $this->assertFalse(Validation::url('http://www.domain.-invalidtld')); $this->assertFalse(Validation::url('http://this-domain-is-too-loooooong-by-icann-rules-maximum-length-is-63.com')); $this->assertFalse(Validation::url('http://www.underscore_domain.org')); $this->assertFalse(Validation::url('http://_jabber._tcp.g_mail.com')); $this->assertFalse(Validation::url('http://en.(wikipedia).org/')); $this->assertFalse(Validation::url('http://www.domain.com/fakeenco%ode')); $this->assertFalse(Validation::url('--.example.com')); $this->assertFalse(Validation::url('www.cakephp.org', true)); $this->assertTrue(Validation::url('http://example.com/~userdir/subdir/index.html')); $this->assertTrue(Validation::url('http://www.zwischenraume.de')); $this->assertTrue(Validation::url('http://www.zwischenraume.cz')); $this->assertTrue(Validation::url('http://www.last.fm/music/浜崎あゆみ'), 'utf8 path failed'); $this->assertTrue(Validation::url('http://www.electrohome.ro/images/239537750-284232-215_300[1].jpg')); $this->assertTrue(Validation::url('http://www.eräume.foo')); $this->assertTrue(Validation::url('http://äüö.eräume.foo')); $this->assertTrue(Validation::url('http://cakephp.org:80')); $this->assertTrue(Validation::url('http://cakephp.org:443')); $this->assertTrue(Validation::url('http://cakephp.org:2000')); $this->assertTrue(Validation::url('http://cakephp.org:27000')); $this->assertTrue(Validation::url('http://cakephp.org:65000')); $this->assertTrue(Validation::url('[2001:0db8::1428:57ab]')); $this->assertTrue(Validation::url('[::1]')); $this->assertTrue(Validation::url('[2001:0db8::1428:57ab]:80')); $this->assertTrue(Validation::url('[::1]:80')); $this->assertTrue(Validation::url('http://[2001:0db8::1428:57ab]')); $this->assertTrue(Validation::url('http://[::1]')); $this->assertTrue(Validation::url('http://[2001:0db8::1428:57ab]:80')); $this->assertTrue(Validation::url('http://[::1]:80')); $this->assertFalse(Validation::url('[1::2::3]')); }
/** * Prepares this task and the package to be installed. * * @return bool True on success */ protected function _init() { $this->params['source'] = str_replace('"', '', $this->params['source']); if (function_exists('ini_set')) { ini_set('max_execution_time', 300); } elseif (function_exists('set_time_limit')) { set_time_limit(300); } if (is_readable($this->params['source']) && is_dir($this->params['source'])) { $this->_sourceType = self::TYPE_DIR; return $this->_getFromDirectory(); } elseif (is_readable($this->params['source']) && !is_dir($this->params['source'])) { $this->_sourceType = self::TYPE_ZIP; return $this->_getFromFile(); } elseif (Validation::url($this->params['source'])) { $this->_sourceType = self::TYPE_URL; return $this->_getFromUrl(); } $this->err(__d('installer', 'Unable to resolve the given source ({0}).', [$this->params['source']])); return false; }
/** * Sanitize the options array * * @param array $options Array of options, keyed from default settings * @return array Clean options array */ protected function _cleanOptions($options) { if (!isset($options['size']) || empty($options['size']) || !is_numeric($options['size'])) { unset($options['size']); } else { $options['size'] = min(max($options['size'], 1), 512); } if (!$options['rating'] || !in_array(mb_strtolower($options['rating']), $this->_allowedRatings)) { unset($options['rating']); } if (!$options['default']) { unset($options['default']); } else { if (!in_array($options['default'], $this->_defaultIcons) && !Validation::url($options['default'])) { unset($options['default']); } } return $options; }