Falha na configuração do Discourse no nome de usuário SMTP com um /

Continuando a discussão de Mover de um contêiner autônomo para contêineres web e de dados separados:

Descrição do bug

Ao executar discourse-setup com um nome de usuário SMTP que contém uma barra (/), o script falha:

sed: expressão -e #1, caractere 74: opção desconhecida para `s’
DISCOURSE_SMTP_USER_NAME change failed.

Comportamento esperado

Nomes de usuário SMTP contendo barra (/) devem ser aceitos.

A barra (/) é um caractere válido para um nome de usuário SMTP, de acordo com RFC3696:

Sem aspas, as partes locais podem consistir em qualquer combinação de
caracteres alfabéticos, dígitos ou quaisquer caracteres especiais

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

Caminho corretivo

O script falha em um comando sed que, por padrão, usa a barra (/) como separador.

Como a barra (/) não é um caractere aceitável para a local-part de um endereço de e-mail, ela pode ser usada em vez da barra (/), sem nenhum efeito colateral que outro caractere como vírgula ou ponto e vírgula traria (exceto que as barras nos padrões sed devem ser escapadas — observe que usar colchetes (]) em vez disso removeria a necessidade de escapar barras — note que usar colchetes (]) em vez disso removeria a necessidade de escapar barras):

  • linha 589:
    smtp_domain=$(echo $notification_email | sed -e "s/.*@//") deve ser
    smtp_domain=$(echo $notification_email | sed -e "s:.*@::")
  • linha 648: DISCOURSE_DEVELOPER_EMAILS usa vírgula (,) para separar endereços de e-mail, então também poderia usar dois-pontos (:) com segurança
  • linha 675 é a origem do meu bug:
    sed -i -e "s/^ #\?DISCOURSE_SMTP_USER_NAME:.*/ DISCOURSE_SMTP_USER_NAME: $smtp_user_name/w $changelog" $web_file pode ser
    sed -i -e "s:^ #\?DISCOURSE_SMTP_USER_NAME:.*: DISCOURSE_SMTP_USER_NAME: $smtp_user_name:w $changelog" $web_file ou
    sed -i -e "s]^ #\?DISCOURSE_SMTP_USER_NAME:.*] DISCOURSE_SMTP_USER_NAME: $smtp_user_name]w $changelog" $web_file
  • o mesmo para a linha 684 (DISCOURSE_NOTIFICATION_EMAIL)
4 curtidas

Não estou no controle desse código, mas o escrevi há muito tempo. Essa é uma ótima solução. Eu deveria ter pensado nisso. Eu apostaria que um PR seria bem-vindo.

4 curtidas

Infelizmente perdi o acesso à minha conta do Github. Eles me pedem um código e eu não uso mais o e-mail vinculado, então simplesmente parei de usar essa plataforma, exceto para clonar código público.

1 curtida

Obrigado pelo relatório, adicionando pr-welcome caso alguém consiga enviar um patch.
Você sempre pode postar um .diff aqui e deixar um membro da comunidade levar o crédito :slight_smile:

4 curtidas

Aqui está um patch:

Correção de comandos sed para permitir endereços de e-mail compatíveis com RFC3696

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
 
     # define o valor padrão de smtp_domain aqui em vez de usar o padrão do Rails de 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 "Habilitando 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 curtidas

Você quis dizer para deixar a barra ali naquela?

2 curtidas

Obrigado por essa boa observação! Atualizei o patch.

3 curtidas