LLM/AI -gegenereerde aanbevelingen
\nhieronder staat een strakke patch die:\n\n- stopt met het gebruik van sed\n- construeert een percent-gecodeerde SMTP_URL\n- bewerkt containers/app.yml via Ruby’s YAML (Psych), zodat YAML-quoting/escaping wordt afgehandeld door een echte parser\n- verwijdert de per-sleutel SMTP-variabelen om tegenstrijdigheden te voorkomen\n\n toepassen met git apply -p0 in de discourse_docker repo.\n\n- - -\n\nPatch 1 -\n\ndiscourse-setup\n\n(schrijf SMTP met Ruby YAML, niet met sed)\n\ndiff\n--- a/discourse-setup\n+++ b/discourse-setup\n@@ -867,6 +867,77 @@ write_smtp_settings() {\n local app_yml=\"containers/app.yml\"\n [[ -f \"$app_yml\" ]] || die \"Cannot find $app_yml. Did you run bootstrap?\"\n\n+ # Bouw een URL-gecodeerde SMTP_URL met Python stdlib (geen shell escaping games)\n+ urlencode() {\n+ python3 - \u003c\u003c'PY'\n+import sys, urllib.parse\n+print(urllib.parse.quote(sys.stdin.read().strip(), safe='._~-'))\n+PY\n+ }\n+\n+ # BELANGRIJK: lees variabelen zonder backslash-vervorming\n+ # (deze komen van eerdere prompts; zorg ervoor dat -r wordt gebruikt bij het prompten)\n+ local addr=\"$smtp_address\"\n+ local port=\"$smtp_port\"\n+ local user_enc pass_enc\n+ user_enc=\"$(printf '%s' \"$smtp_user\" | urlencode)\"\n+ pass_enc=\"$(printf '%s' \"$smtp_password\" | urlencode)\"\n+ local smtp_url=\"smtp://${user_enc}:${pass_enc}@${addr}:${port}\"\n+\n+ # Gebruik Ruby om veilig YAML te laden/bewerken/dumpen (doodt 3 lagen van escaping)\n+ ruby - \u003c\u003c'RUBY' \"$app_yml\" \"$smtp_url\"\n+require \"yaml\"\n+require \"psych\"\n+path, url = ARGV\n+doc = YAML.safe_load(File.read(path), permitted_classes: [], aliases: true) || {}\n+\n+# Zorg ervoor dat de top-level structuur een Hash is en env heeft\n+unless doc.is_a?(Hash)\n+ abort \"containers/app.yml parseert niet naar een Hash\"\n+end\n+doc[\"env\"] ||= {}\n+env = doc[\"env\"]\n+\n+# Schrijf enkele regel SMTP_URL; verwijder per-sleutel variabelen om conflicten te voorkomen\n+env[\"SMTP_URL\"] = url\n+%w[DISCOURSE_SMTP_ADDRESS DISCOURSE_SMTP_PORT DISCOURSE_SMTP_USER_NAME DISCOURSE_SMTP_PASSWORD].each { |k| env.delete(k) }\n+\n+# Dump terug. (Psych behoudt strings veilig geciteerd zoals nodig.)\n+File.write(path, Psych.dump(doc))\n+RUBY\n+\n+ # snelle sanity check voor de klassieke "wachtwoord voorafgegaan door gebruikersnaam" mislukking\n+ python3 - \u003c\u003c'PY'\n+import re, sys\n+y = open(\"containers/app.yml\",\"r\",encoding=\"utf-8\").read()\n+m = re.search(r'^\\s*SMTP_URL:\\s*(?:\"|\\')?([^\\r\\n\"\\']+)', y, re.M)\n+assert m, \"SMTP_URL ontbreekt na schrijven\"\n+creds = m.group(1).split('@',1)[0].split('://',1)[-1]\n+assert \":\" in creds, \"SMTP_URL creds missen ':'\"\n+u, p = creds.split(':',1)\n+assert not p.startswith(u), \"Wachtwoord lijkt voorafgegaan door gebruikersnaam\"\n+print(\"SMTP_URL ziet er gezond uit.\")\n+PY\n+}\n+\n- # Schrijf per-sleutel SMTP-invoer (adres/poort/gebruikersnaam/wachtwoord)\n- # (legacy: uitgevoerd via sed-substituties)\n- # OPMERKING: historisch fragiel met speciale tekens\n- update_setting_yaml \"DISCOURSE_SMTP_ADDRESS\" \"$smtp_address\"\n- update_setting_yaml \"DISCOURSE_SMTP_PORT\" \"$smtp_port\"\n- update_setting_yaml \"DISCOURSE_SMTP_USER_NAME\" \"$smtp_user\"\n- update_setting_yaml \"DISCOURSE_SMTP_PASSWORD\" \"$smtp_password\"\n-}\n+ # (legacy per-sleutel schrijfacties verwijderd ten gunste van SMTP_URL via YAML)\n+}\n\n\ndan Patch 2 -\n\ntemplates/web.template.yml\n\n(om het veiligere pad te documenteren)\n\ndiff\n--- a/templates/web.template.yml\n+++ b/templates/web.template.yml\n@@ -68,6 +68,14 @@ params:\n DISCOURSE_SMTP_ENABLE_START_TLS: true\n #DISCOURSE_NOTIFICATION_EMAIL: noreply@example.com\n\n+ ## Voorkeurs SMTP-configuratie in één regel (ingesteld door discourse-setup):\n+ ## URL-codeer gebruikersnaam en wachtwoord; voorbeeld:\n+ ## SMTP_URL: \"smtp://user%40example.com:p%40ss%3Aword@smtp.example.com:587\"\n+ ##\n+ #SMTP_URL:\n+\n ## Als u SMTP_URL niet kunt gebruiken, kunt u in plaats daarvan per-sleutel variabelen instellen.\n ## Pas op dat het bewerken van die regels met shell-tools fragiel kan zijn als waarden\n ## tekens bevatten zoals @, :, /, \", \\, of nieuwe regels.\n\n\nwaarom dit werkt (en wat het vermijdt)\n\t•\tbash-laag: we interpoleren alleen eenvoudige variabelen; geheimen worden via stdin/argv aan Python/Ruby doorgegeven, niet via sed-regexes of shell-evaluaties.\n\t•\tsed-laag: volledig verwijderd.\n\t•\tYAML-laag: Ruby/Psych behandelt quoting en escaping correct; geen handmatig gemaakte quoting.\n\t•\tSMTP-credentials: %-encoding in SMTP_URL is de juiste plaats om speciale tekens voor authenticatie te coderen.\n\nals u de voorkeur geeft aan het behouden van per-sleutel variabelen, kan ik u een zusterpatch geven die dezelfde Ruby-YAML-aanpak gebruikt om DISCOURSE_SMTP_* direct in te stellen (nog steeds geen sed), maar de SMTP_URL-route is de schoonste omdat het één sleutel, één schrijfactie, één coderingstap is.\n