/** * @see DataValue::parseUserValue * * @param string $value */ protected function parseUserValue($value) { if ($value === '') { $this->addErrorMsg('smw_emptystring'); return; } if (filter_var($value, FILTER_VALIDATE_URL) === false && preg_match('/((mailto\\:|(news|urn|tel|(ht|f)tp(s?))\\:\\/\\/){1}\\S+)/u', $value) === false) { $this->addErrorMsg(array('smw-datavalue-external-formatter-invalid-uri', $value)); return; } if (strpos($value, '$1') === false) { $this->addErrorMsg('smw-datavalue-external-formatter-uri-missing-placeholder'); return; } parent::parseUserValue($value); }
/** * @dataProvider emaProvider */ public function testEmaOutputFormatting($uri, $caption = false, $linker = null, $expected) { $instance = new UriValue('_ema'); $instance->setUserValue($uri, $caption); $this->assertOutputFormatting($instance, $linker, $expected); }
protected function parseUserValue($value) { $value = trim($value); $this->m_wikitext = $value; if ($this->m_caption === false) { $this->m_caption = $this->m_wikitext; } $scheme = $hierpart = $query = $fragment = ''; if ($value === '') { // do not accept empty strings $this->addError(wfMessage('smw_emptystring')->inContentLanguage()->text()); return; } switch ($this->m_mode) { case SMW_URI_MODE_URI: case SMW_URI_MODE_ANNOURI: $parts = explode(':', $value, 2); // try to split "schema:rest" if (count($parts) == 1) { // possibly add "http" as default $value = 'http://' . $value; $parts[1] = $parts[0]; $parts[0] = 'http'; } // check against blacklist $uri_blacklist = explode("\n", wfMessage('smw_uri_blacklist')->inContentLanguage()->text()); foreach ($uri_blacklist as $uri) { $uri = trim($uri); if ($uri !== '' && $uri == mb_substr($value, 0, mb_strlen($uri))) { // disallowed URI! $this->addError(wfMessage('smw_baduri', $value)->inContentLanguage()->text()); return; } } // decompose general URI components $scheme = $parts[0]; $parts = explode('?', $parts[1], 2); // try to split "hier-part?queryfrag" if (count($parts) == 2) { $hierpart = $parts[0]; $parts = explode('#', $parts[1], 2); // try to split "query#frag" $query = $parts[0]; $fragment = count($parts) == 2 ? $parts[1] : ''; } else { $query = ''; $parts = explode('#', $parts[0], 2); // try to split "hier-part#frag" $hierpart = $parts[0]; $fragment = count($parts) == 2 ? $parts[1] : ''; } // We do not validate the URI characters (the data item will do this) but we do some escaping: // encode most characters, but leave special symbols as given by user: $hierpart = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($hierpart)); $query = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($query)); $fragment = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($fragment)); /// NOTE: we do not support raw [ (%5D) and ] (%5E), although they are needed for ldap:// (but rarely in a wiki) /// NOTE: "+" gets encoded, as it is interpreted as space by most browsers when part of a URL; /// this prevents tel: from working directly, but we have a datatype for this anyway. if (substr($hierpart, 0, 2) === '//') { $hierpart = substr($hierpart, 2); } break; case SMW_URI_MODE_TEL: $scheme = 'tel'; if (substr($value, 0, 4) === 'tel:') { // accept optional "tel" $value = substr($value, 4); $this->m_wikitext = $value; } $hierpart = preg_replace('/(?<=[0-9]) (?=[0-9])/', '\\1-\\2', $value); $hierpart = str_replace(' ', '', $hierpart); if (substr($hierpart, 0, 2) == '00') { $hierpart = '+' . substr($hierpart, 2); } if (strlen(preg_replace('/[^0-9]/', '', $hierpart)) < 6 || preg_match('<[-+./][-./]>', $hierpart) || !SMWURIValue::isValidTelURI('tel:' . $hierpart)) { /// TODO: introduce error-message for "bad" phone number $this->addError(wfMessage('smw_baduri', $this->m_wikitext)->inContentLanguage()->text()); return; } break; case SMW_URI_MODE_EMAIL: $scheme = 'mailto'; if (strpos($value, 'mailto:') === 0) { // accept optional "mailto" $value = substr($value, 7); $this->m_wikitext = $value; } $check = Sanitizer::validateEmail($value); if (!$check) { /// TODO: introduce error-message for "bad" email $this->addError(wfMessage('smw_baduri', $value)->inContentLanguage()->text()); return; } $hierpart = str_replace(array('%3A', '%2F', '%23', '%40', '%3F', '%3D', '%26', '%25'), array(':', '/', '#', '@', '?', '=', '&', '%'), rawurlencode($value)); } // Now create the URI data item: try { $this->m_dataitem = new SMWDIUri($scheme, $hierpart, $query, $fragment, $this->m_typeid); } catch (SMWDataItemException $e) { $this->addError(wfMessage('smw_baduri', $this->m_wikitext)->inContentLanguage()->text()); } }
/** * @since 2.4 * * @param string $typeid */ public function __construct($typeid = '') { parent::__construct('_tel'); }