ConfigParser.cs
-
Jiří Kalvoda authoredJiří Kalvoda authored
Zpracování mailových nedoručenek (DSN)
Princip
Kdykoliv OSMO odesílá mail, umí do obálkového FROM přidat token (oddělený od jména uživatele pluskem), do kterého je zakódováno, kterého uživatele nebo pokusu o registraci se mail týká.
Pokud přijde nedoručenka, OSMO ji zpracuje a z tokenu v adrese jejího adresáta určí, ke komu patří. K uživatelům a probíhajícím registracím si pak poznamená informaci o nefunkčnosti e-mailové adresy a umí ji uživateli zobrazit.
Implementace
Nedoručenky se posílají na osmo-auto+token@mo.mff.cuni.cz, což se přepíše na mo-web+dsn@gimli.ms.mff.cuni.cz.
Účet mo-web má nakonfigurovaný následující filtr pro Sieve:
require ["envelope", "subaddress", "include", "mailbox", "vnd.dovecot.execute"];
# Základní systémová pravidla
include :global "default";
if envelope :detail :matches "To" ["dsn", "dsn+*"] {
if execute :pipe "osmo-send-dsn" ["https://osmo.matematickaolympiada.cz/"] {
redirect "spravce+osmo-dsn-ok@example.org";
} else {
redirect "spravce+osmo-dsn-error@example.org";
}
} else {
redirect "spravce+osmo-unknown@example.org";
}
To spustí program bin/send-dsn, nainstalovaný jako /usr/local/lib/dovecot/sieve-execute/osmo-send-dsn, a ten předá nedoručenku webové části OSMO. Pokud zrovna webová část neběží nebo neumí nedoručenku zpracovat, osmo-send-dsn selže, takže Sieve nedoručenku přepošle správci.
Webová část si vyparsuje token z hlavičkového To, takže interní přeposílání během doručování ji nezmate.
Skript bin/send-dsn je minimalistický, stačí mu Python se standardní knihovnou Pythonu a balíčkem requests. Skript může běžet pod jiným uživatelem, nebo dokonce na jiném stroji než zbytek OSMO.
Komunikace mezi bin/send-dsn a zbytkem OSMO je autorizována tajným klíčem. Web OSMO si ho přečte z DSN_API_KEY z configu, send-dsn ho hledá jako jediný řádek souboru ~/.config/osmo/dsn-api-key.