Unicodeユーザー名でフィルタリングすると検索結果が表示されない

ユーザー名の検索で、Unicode(例:中国語の\p{Han})を含む場合に @+username で検索できないバグに遭遇しました。

原因は、lib\\search.rb 内の以下のコードで使用されている正規表現がASCII文字しかマッチしないためです。

advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i) do |posts, match|

正規表現にallowed_unicode_username_charactersを追加して(つまり、advanced_filter(/^\\@([a-zA-Z0-9_\\-.\\p{Han}]+)$/i)というルールを追加して)テストしたところ、正常に動作しました。

「いいね!」 3

素晴らしい、はい、確かにこれを修正したいと思います。サイト管理者がユニコードユーザー名をオプトインできるようにします。

PRを試していただけませんか?サイト管理者がユニコードユーザー名をオプトインする場合にのみ、この動作を変更する必要があります。

「いいね!」 2

プラグインを使用して、次のコードで advanced_filter を追加しており、ニーズを満たしています。

if SiteSetting.unicode_usernames?
    regexp = Regexp.new("(?i-mx:^\\@([a-zA-Z0-9_\\-#{SiteSetting.allowed_unicode_username_characters}]+)$)")
    Search.advanced_filter(regexp) do |posts, match|
      username = match.downcase
  
      user_id = User.where(staged: false).where(username_lower: username).pluck_first(:id)
  
      if !user_id && username == "me"
        user_id = @guardian.user&.id
      end
  
      if user_id
        posts.where("posts.user_id = #{user_id}")
      else
        posts.where("1 = 0")
      end
    end
  end

しかし、特に allowed_unicode_username_characters が変数である場合に、コアを適切に修正する方法がわかりません。簡単な、しかしおそらく間違った解決策は、advanced_filter(/^\\@([a-zA-Z0-9_\\-.]+)$/i)advanced_filter(/^\\@(.+)$/i) に変更することです。これは、advanced_filter(/^user:(.+)$/i) で行ったことと同様です。

「いいね!」 2

これはコアのバグなので、コアへのPRが最善の方法だと思います。PRではテストを追加する必要があります。

「いいね!」 2

OK、PRを送信しましたので、確認していただけます。

「いいね!」 3

マージされました。ご協力ありがとうございます!

「いいね!」 3

このトピックは、最後の返信から2日後に自動的に閉じられました。新しい返信は許可されていません。