SMTP 사용자 이름에 '/'가 있으면 Discourse 설치가 실패합니다

Move from standalone container to separate web and data containers에서 이어지는 토론입니다:

버그 설명

/ 문자가 포함된 SMTP 사용자 이름으로 discourse-setup을 실행하면 스크립트가 실패합니다:

sed: -e expression #1, char 74: unknown option to `s’
DISCOURSE_SMTP_USER_NAME change failed.

기대되는 동작

/ 문자가 포함된 SMTP 사용자 이름도 허용되어야 합니다.

RFC3696에 따르면 /는 SMTP 사용자 이름에 유효한 문자입니다:

Without quotes, local-parts may consist of any combination of
alphabetic characters, digits, or any of the special characters

 ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

수정 방법

스크립트는 기본적으로 /를 구분자로 사용하는 sed 명령에서 실패합니다.
이메일 주소의 local-part에 콜론(:)은 허용되지 않는 문자이므로, 쉼표나 세미콜론과 같은 다른 문자가 초래할 수 있는 부수 효과(예: sed 패턴에서 콜론은 이스케이프해야 함 — ]를 사용하면 콜론을 이스케이프할 필요가 없음) 없이 / 대신 사용할 수 있습니다:

  • 589번째 줄:
    smtp_domain=$(echo $notification_email | sed -e "s/.*@//") 은
    smtp_domain=$(echo $notification_email | sed -e "s:.*@::") 이어야 합니다.
  • 648번째 줄: DISCOURSE_DEVELOPER_EMAILS는 이메일 주소를 구분하기 위해 ,를 사용하므로, :도 안전하게 사용할 수 있습니다.
  • 675번째 줄은 이 버그의 원인입니다:
    sed -i -e "s/^ #\?DISCOURSE_SMTP_USER_NAME:.*/ DISCOURSE_SMTP_USER_NAME: $smtp_user_name/w $changelog" $web_file 은
    sed -i -e "s:^ #\?DISCOURSE_SMTP_USER_NAME\:.*: DISCOURSE_SMTP_USER_NAME\: $smtp_user_name:w $changelog" $web_file 또는
    sed -i -e "s]^ #\?DISCOURSE_SMTP_USER_NAME:.*] DISCOURSE_SMTP_USER_NAME: $smtp_user_name]w $changelog" $web_file 로 수정할 수 있습니다.
  • 684번째 줄(DISCOURSE_NOTIFICATION_EMAIL)도 마찬가지입니다.
4개의 좋아요

저는 그 코드에 대한 통제권이 없지만, 오래전에 제가 작성한 코드입니다. 정말 좋은 해결책이네요. 제가 그걸 생각했어야 했는데. PR을 환영할 것 같네요.

4개의 좋아요

불행히도 제 GitHub 계정 접근 권한을 잃었습니다. 플랫폼 측에서 특정 코드를 요구하는데, 해당 계정에 연결된 이메일을 더 이상 사용하지 않아, 공개된 코드를 클론하는 용도 외에는 그 플랫폼을 거의 사용하지 않고 있습니다.

1개의 좋아요

리포트 감사합니다. 누군가 패치를 제출할 수 있도록 pr-welcome 태그를 달아두었습니다.

여기에 .diff 파일을 직접 올리고 커뮤니티 멤버가 크레딧을 받는 것도 좋은 방법입니다 :slight_smile:

4개의 좋아요

패치가 있습니다:

RFC3696에 준수하는 이메일 주소를 허용하도록 sed 명령 수정

discourse-setup.fix-272514.patch.gz (601 Bytes)

diff --git a/discourse-setup b/discourse-setup
index 0daafcb..121982e 100755
--- a/discourse-setup
+++ b/discourse-setup
@@ -586,7 +586,7 @@ ask_user_for_config() {
     fi

     # set smtp_domain default value here rather than use Rails default of localhost
-    smtp_domain=$(echo $notification_email | sed -e "s/.*@//")
+    smtp_domain=$(echo $notification_email | sed -e "s].*@]]")

     if [ ! -z $letsencrypt_account_email ]
     then
@@ -645,7 +645,7 @@ ask_user_for_config() {
     update_ok="n"
   fi

-  sed -i -e "s/^  DISCOURSE_DEVELOPER_EMAILS:.*/  DISCOURSE_DEVELOPER_EMAILS: \'$developer_emails\'/w $changelog" $web_file
+  sed -i -e "s]^  DISCOURSE_DEVELOPER_EMAILS:.*]  DISCOURSE_DEVELOPER_EMAILS: \'$developer_emails\']w $changelog" $web_file
   if [ -s $changelog ]
   then
     rm $changelog
@@ -672,7 +672,7 @@ ask_user_for_config() {
     update_ok="n"
   fi

-  sed -i -e "s/^  #\?DISCOURSE_SMTP_USER_NAME:.*/  DISCOURSE_SMTP_USER_NAME: $smtp_user_name/w $changelog" $web_file
+  sed -i -e "s]^  #\?DISCOURSE_SMTP_USER_NAME:.*]  DISCOURSE_SMTP_USER_NAME: $smtp_user_name]w $changelog" $web_file
   if [ -s $changelog ]
   then
     rm $changelog
@@ -681,7 +681,7 @@ ask_user_for_config() {
     update_ok="n"
   fi

-  sed -i -e "s/^  #\?DISCOURSE_NOTIFICATION_EMAIL:.*/  DISCOURSE_NOTIFICATION_EMAIL: $notification_email/w $changelog" $web_file
+  sed -i -e "s]^  #\?DISCOURSE_NOTIFICATION_EMAIL:.*]  DISCOURSE_NOTIFICATION_EMAIL: $notification_email]w $changelog" $web_file
   if [ -s $changelog ]
   then
     rm $changelog
@@ -745,7 +745,7 @@ ask_user_for_config() {
   then
     echo "Enabling Let's Encrypt"
   fi
-  sed -i -e "s/^  #\?LETSENCRYPT_ACCOUNT_EMAIL:.*/  LETSENCRYPT_ACCOUNT_EMAIL: $letsencrypt_account_email/w $changelog" $web_file
+  sed -i -e "s]^  #\?LETSENCRYPT_ACCOUNT_EMAIL:.*]  LETSENCRYPT_ACCOUNT_EMAIL: $letsencrypt_account_email]w $changelog" $web_file
   if [ -s $changelog ]
   then
     rm $changelog
3개의 좋아요

여기 슬래시를 남겨두신 건 의도하신 건가요?

2개의 좋아요

좋은 지적 감사합니다! 패치를 수정했습니다.

3개의 좋아요