Discourse-setup が SMTP ユーザー名の / で失敗する

StandaloneコンテナからWebコンテナとデータコンテナを分離するからの議論を続けます。

バグの説明

discourse-setupを実行する際に、SMTPユーザー名に/が含まれていると、スクリプトが失敗します。

sed: -e 式 #1, 文字 74: sed の不正なオプションです
DISCOURSE_SMTP_USER_NAME の変更に失敗しました。

期待される動作

SMTPユーザー名に/が含まれている場合でも受け入れられるべきです。

/は、RFC3696によると、SMTPユーザー名の有効な文字です。

引用符なしの場合、ローカルパートは、

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

のいずれかの英数字または特殊文字の組み合わせで構成できます。

修正パス

スクリプトは、デフォルトで区切り文字として/を使用する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 @@
   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