/**
  * @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);
 }
Example #3
0
 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');
 }