Настройка Discourse не удаётся при наличии символа / в имени пользователя SMTP

Продолжение обсуждения из Переход от отдельного контейнера к отдельным веб- и контейнерам данных:

Описание ошибки

При запуске discourse-setup с именем пользователя SMTP, содержащим /, скрипт завершается с ошибкой:

sed: -e выражение #1, символ 74: неизвестная опция для `s’
Изменение DISCOURSE_SMTP_USER_NAME не удалось.

Ожидаемое поведение

Имена пользователей SMTP, содержащие /, должны приниматься.

/ является допустимым символом для имени пользователя SMTP, согласно RFC3696:

Без кавычек локальная часть может состоять из любой комбинации
букв, цифр или любых специальных символов

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

Путь к исправлению

Скрипт завершается с ошибкой из-за команды 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 лайка

Вот патч:

Исправление команд sed для поддержки адресов электронной почты, соответствующих RFC3696

discourse-setup.fix-272514.patch.gz (601 байт)

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

     # установите значение по умолчанию для smtp_domain здесь, а не используйте значение по умолчанию Rails — 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 "Включение 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 лайка