]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Harmonize webfinger formatting and enable variable pre-mention character
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 10 Aug 2017 09:06:52 +0000 (11:06 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 10 Aug 2017 09:25:04 +0000 (11:25 +0200)
lib/nickname.php
lib/util.php
plugins/OStatus/OStatusPlugin.php

index 6e638c21b74039a3316532271493b060af5dab68..e21517497a18cd0587530bc14519fb9ebf310ff5 100644 (file)
@@ -54,7 +54,10 @@ class Nickname
      * We could probably use an email regex here, but mainly we are interested
      * in matching it in our URLs, like https://social.example/user@example.com
      */
-    const WEBFINGER_FMT = '[0-9a-zA-Z_]{1,64}\@[0-9a-zA-Z_-.]{3,255}';
+    const WEBFINGER_FMT = '(?:\w+[\w\-\_\.]*)?\w+\@'.URL_REGEX_DOMAIN_NAME;
+
+    // old one without support for -_. in nickname part:
+    // const WEBFINGER_FMT = '[0-9a-zA-Z_]{1,64}\@[0-9a-zA-Z_-.]{3,255}';
 
     /**
      * Regex fragment for checking a canonical nickname.
index d1d79d1282d566178d25c2c3bc9caed0b54815ac..07773a06f39d08f414ac27955f5a9c2f0dccd582 100644 (file)
@@ -768,7 +768,7 @@ function common_find_mentions($text, Profile $sender, Notice $parent=null)
             }
         }
 
-        $matches = common_find_mentions_raw($text);
+        $matches = common_find_mentions_raw($text, '@');
 
         foreach ($matches as $match) {
             try {
@@ -879,9 +879,10 @@ function common_find_mentions($text, Profile $sender, Notice $parent=null)
  * Should generally not be called directly; for use in common_find_mentions.
  *
  * @param string $text
+ * @param string $preMention Character(s) that signals a mention ('@', '!'...)
  * @return array of PCRE match arrays
  */
-function common_find_mentions_raw($text)
+function common_find_mentions_raw($text, $preMention='@')
 {
     $tmatches = array();
     preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /',
@@ -891,7 +892,7 @@ function common_find_mentions_raw($text)
 
     $atmatches = array();
     // the regexp's "(?!\@)" makes sure it doesn't matches the single "@remote" in "@remote@server.com"
-    preg_match_all('/'.Nickname::BEFORE_MENTIONS.'@(' . Nickname::DISPLAY_FMT . ')\b(?!\@)/',
+    preg_match_all('/'.Nickname::BEFORE_MENTIONS.preg_quote($preMention, '/').'(' . Nickname::DISPLAY_FMT . ')\b(?!\@)/',
                    $text,
                    $atmatches,
                    PREG_OFFSET_CAPTURE);
index 7f7f04c50a60bf5ca4044aad93346e824ebd2260..6f70d65ab279b33b5617243f2c7d2e2168145a81 100644 (file)
@@ -258,14 +258,16 @@ class OStatusPlugin extends Plugin
 
     /**
      * Webfinger matches: @user@example.com or even @user--one.george_orwell@1984.biz
+     * @param   string  $text       The text from which to extract webfinger IDs
+     * @param   string  $preMention Character(s) that signals a mention ('@', '!'...)
      *
      * @return  array   The matching IDs (without @ or acct:) and each respective position in the given string.
      */
-    static function extractWebfingerIds($text)
+    static function extractWebfingerIds($text, $preMention='@')
     {
         $wmatches = array();
         // Maybe this should harmonize with lib/nickname.php and Nickname::WEBFINGER_FMT
-        $result = preg_match_all('/(?<!\S)@((?:\w+[\w\-\_\.]*)?\w+@'.URL_REGEX_DOMAIN_NAME.')/',
+        $result = preg_match_all('/(?<!\S)'.preg_quote($preMention, '/').'('.Nickname::WEBFINGER_FMT.')/',
                        $text,
                        $wmatches,
                        PREG_OFFSET_CAPTURE);
@@ -279,15 +281,17 @@ class OStatusPlugin extends Plugin
 
     /**
      * Profile URL matches: @example.com/mublog/user
+     * @param   string  $text       The text from which to extract URL mentions
+     * @param   string  $preMention Character(s) that signals a mention ('@', '!'...)
      *
      * @return  array   The matching URLs (without @ or acct:) and each respective position in the given string.
      */
-    static function extractUrlMentions($text)
+    static function extractUrlMentions($text, $preMention='@')
     {
         $wmatches = array();
         // In the regexp below we need to match / _before_ URL_REGEX_VALID_PATH_CHARS because it otherwise gets merged
         // with the TLD before (but / is in URL_REGEX_VALID_PATH_CHARS anyway, it's just its positioning that is important)
-        $result = preg_match_all('/(?:^|\s+)@('.URL_REGEX_DOMAIN_NAME.'(?:\/['.URL_REGEX_VALID_PATH_CHARS.']*)*)/',
+        $result = preg_match_all('/(?:^|\s+)'.preg_quote($preMention, '/').'('.URL_REGEX_DOMAIN_NAME.'(?:\/['.URL_REGEX_VALID_PATH_CHARS.']*)*)/',
                        $text,
                        $wmatches,
                        PREG_OFFSET_CAPTURE);
@@ -312,7 +316,7 @@ class OStatusPlugin extends Plugin
     {
         $matches = array();
 
-        foreach (self::extractWebfingerIds($text) as $wmatch) {
+        foreach (self::extractWebfingerIds($text, '@') as $wmatch) {
             list($target, $pos) = $wmatch;
             $this->log(LOG_INFO, "Checking webfinger '$target'");
             $profile = null;