유니코드 사용자명으로 필터링하면 검색 결과가 없습니다

@+사용자이름으로 검색 상자에 입력해도 사용자 이름에 유니코드(예: 한자 \p{Han})가 포함된 경우 해당 사용자의 게시물을 검색할 수 없는 버그를 발견했습니다.

원인은 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개의 좋아요

네, 방금 PR을 만들었으니 확인해 보세요.

3개의 좋아요

병합했습니다. 기여해 주셔서 감사합니다!

3개의 좋아요

이 주제는 마지막 답변 후 2일 자동으로 닫혔습니다. 새로운 답변은 더 이상 허용되지 않습니다.