유니코드 문자가 포함된 사용자 이름 변경 문제

사용자 이름을 원래 이름으로 되돌리는 데 문제가 있습니다. (phpBB에서 가져온 데이터에서 일부 사용자 이름을 변경해야 했는데, 예를 들어 Möp를 Moep으로 변경했습니다.) 사용자 이름을 다시 변경하려고 하면 500 오류가 발생하며, 사용자를 새로고침해도 여전히 umlaut가 없는 이름으로 표시됩니다. 혹시 해결 방법을 아시는 분 계신가요? 유니코드 설정은 활성화되어 있고, umlaut 사용도 허용되어 있으며, 외부 시스템 아바타 활성화도 켜져 있습니다.

로그를 확인해서 어떤 내용이 있는지 살펴봐야 합니다. /logs에 있을 수도 있고, /var/discourse/shared/standalone/log/rails/production.log를 확인해야 할 수도 있습니다(제 생각에는 logs가 아니라 log인 것 같습니다).

아, 감사합니다. 로그 파일이 있는지, 있다면 어디에 있는지 전혀 몰랐습니다. 이제 알았네요. :slight_smile:

다음과 같은 내용을 찾았습니다:

Started PUT "/users/moep/preferences/username" for xxxx:c5:9f0d:4c00:xxxx:e179:xxxx:xxxx at 2022-11-23 15:53:52 +0000
Processing by UsersController#username as */*
  Parameters: {"new_username"=>"Möp", "username"=>"moep"}
Completed 500 Internal Server Error in 338ms (ActiveRecord: 0.0ms | Allocations: 137204)
Encoding::CompatibilityError (incompatible character encodings: ASCII-8BIT and UTF-8)
app/models/user.rb:1806:in `username_validator'
app/services/username_changer.rb:35:in `change'
app/services/username_changer.rb:13:in `change'
app/controllers/users_controller.rb:202:in `username'

더 많은 로그가 있지만, 이것만으로 충분할 것 같아 이렇게 공유합니다. 필요하다면 더 제공할 수 있습니다.

참고로, 여러 개의 사용자 이름을 시도해 보았지만 비슷한 문제를 겪었습니다.

@pfaffman 로그에서 500 오류가 나는 원인을 확인해 주실 수 있나요? :slight_smile:

사용자 이름의 문자를 좋아하지 않았습니다. 왜 그런지는 모르겠어요.

방금 사용자 이름을 "moep"에서 “Möp”(Möp)으로 변경하는 테스트를 해보았고, 정상적으로 작동했습니다.

  • 사용 중인 Discourse 버전은 무엇인가요?
  • 표준 설치 환경인가요?
  • Discourse 앞에 리버스 프록시(reverse proxy)가 구성되어 있나요?
  • 어떤 브라우저를 사용 중인가요?
  • allowed_unicode_username_characters 설정 값은 무엇인가요?
  • rails 콘솔에서 이름 변경이 작동하나요?
    ./launcher enter app
    rails c
    
    user = User.find_by_username("moep")
    new_username = "Möp"
    UsernameChanger.change(user, new_username, Discourse.system_user)
    

최신 버전입니다. 현재는 2.9.0.beta12여야 합니다.

네. Discourse 인스턴스를 여러 개 실행할 계획이라 컨테이너 이름만 변경했습니다. 하지만 현재 실행 중인 것은 하나뿐입니다.

Apache 2.4

Chrome, Brave.

[äöüßÄÖÜẞ]

이것도 작동하지 않습니다:

=> "Wägi"
[6] pry(main)> UsernameChanger.change(user, new_username, Discourse.system_user)
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
from /var/www/discourse/plugins/discourse-migratepassword/plugin.rb:78:in `+'

여기서 "Waegi"를 "Wägi"로 변경하려고 시도했습니다.

알아본 점: 컨테이너에 새로운 템플릿 버전을 사용하고 있으며, 다음 정보가 포함되어 있습니다:

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  DISCOURSE_DEFAULT_LOCALE: de

구형 템플릿(2019년경)에는 다음 내용만 있었습니다:

env:
  LANG: en_US.UTF-8
  DISCOURSE_DEFAULT_LOCALE: de

이것이 문제와 관련이 있을까요? 그리고 이것이 독일어가 주요 언어인 Discourse 설치에 대한 올바른 설정인가요?

아, 그리고 discourse-migratepassword가 에러를 발생시키고 있다는 것도 이제야 알았습니다. 이것이 phpBB에서 Discourse로 모든 것을 가져오기 전에 사용자 이름을 변경했던 이유입니다.

discourse-migratepassword를 비활성화하고 사용자 이름을 변경한 후 다시 활성화하는 것이 도움이 될까요? phpBB에서 가져온 후에도 활성화되어 있어야 하는 discourse-migratepassword가 처리하는 다른 작업은 무엇인가요?

discourse-migratepassword 플러그인이 유니코드 사용자 이름과 호환되지 않는 것 같습니다.
cc @michaeld

네, 플러그인을 비활성화하면 이 문제가 해결될 것입니다.

이 플러그인은 가져오기 _중_에는 유용하지 않으며, 가져오기 _후_에만 유용합니다. 사용자들이 이전 비밀번호로 로그인할 수 있도록 허용하기 때문입니다.

네, 감사합니다. 그러면 플러그인을 비활성화하고 사용자 이름을 변경한 뒤, 바로 다시 활성화하는 것이 맞죠? 다시 한번 감사합니다! :slight_smile:

사용자를 비활성화한 후 이름을 변경하는 방식으로 해결되었습니다. 다시 한번 감사합니다. :slight_smile:

궁금한 점이 있습니다: discourse-migratepassword에 이 유니코드 문제가 있는 것 같은데, 움라우트(umlaut)가 포함된 사용자들은 이제 기존 phpBB 비밀번호로 로그인할 수 있을까요?

처음 로그인할 때 비밀번호가 Discourse 비밀번호로 저장된다고 확신합니다. 따라서 더 이상 해당 비밀번호가 필요하지 않습니다. 가져온 비밀번호로 로그인하려는 사람은 이미 그렇게 했을 것으로 보입니다.

이 문제를 재현할 수 없습니다. 유니코드 및 허용 문자 설정이 동일한데, 동일한 사용자명을 가진 사용자를 만든 후 Möp로 이름 변경까지 해보았습니다. 이 문제가 발생하려면 제가 인지하지 못한 다른 요인이 있는 것일까요?

이상하네요. 제가 시도한 모든 사용자 이름에서 이 문제가 발생했습니다. 유니코드 문자로는 ä, ö, ü 같은 독일어 움라우트만 있었습니다. 또 다른 예로는 Waegi가 Wägi로 바뀌는 경우가 있었습니다.

이 문제는 phpBB3에서 Discourse로 가져오는 스크립트에서 처음 발생했고, 그래서 phpBB에서 모든 움라우트 사용자의 이름을 변경한 뒤 가져오기 스크립트를 다시 실행했습니다. 분명히 Discourse에서도 사용자들을 원래의 사용자 이름 그대로 다시 사용하고 싶었거든요.