diff --git a/mo/web/acct.py b/mo/web/acct.py index e4b8d5f0dab497222410729b07e48e8a8e1181f8..1051ecc72efca5d12d133a245a6bcfcb0af0660f 100644 --- a/mo/web/acct.py +++ b/mo/web/acct.py @@ -780,6 +780,30 @@ def user_validate_email(): return render_template('acct_validate_email.html', form=form) +def make_dsn_check_token(rr: db.RegRequest) -> str: + return mo.tokens.sign_token([str(rr.reg_id)], 'dsn-check') + + +@app.route('/acct/dsn-check/<token>') +def dsn_check(token): + # Jelikož nevyžadujeme login, nechceme předávat v URL přímo IDčka do databáze. + # Místo toho předáváme podepsaný token obsahující IDčko. + fields = mo.tokens.verify_token(token, 'dsn-check') + if not fields: + raise werkzeug.exceptions.NotFound() + + reg_id = int(fields[0]) + sess = db.get_session() + reg = sess.query(db.RegRequest).options(joinedload(db.RegRequest.dsn)).get(reg_id) + if not reg: + raise werkzeug.exceptions.NotFound() + + if reg.dsn is not None: + return render_template('acct_dsn_check.html', dsn=reg.dsn) + else: + return "" + + if getattr(config, 'INSECURE_TEST_LOGIN', False): @app.route('/test-login/<email>') def test_login(email: str): diff --git a/mo/web/templates/acct_dsn_check.html b/mo/web/templates/acct_dsn_check.html new file mode 100644 index 0000000000000000000000000000000000000000..5b14c3549c2429c01239a7e824e53dba3a705503 --- /dev/null +++ b/mo/web/templates/acct_dsn_check.html @@ -0,0 +1,22 @@ +<div class='alert alert-danger'> +E-mail se nepodařilo doručit. + +<table class='dsn-check-err'> + <tr> + <th>Kód chyby: + <td>{{ dsn.status|dsn_status }} + <tr> + <th>Chybová zpráva: + <td>{{ dsn.diag_code|or_dash }} + <tr> + <th>Vzdálený server: + <td>{{ dsn.remote_mta|or_dash }} +</table> +</div> + +{# + +{% set dsns = [dsn] %} +{% include "parts/dsn.html" %} + +#} diff --git a/mo/web/templates/parts/wait_for_email.html b/mo/web/templates/parts/wait_for_email.html new file mode 100644 index 0000000000000000000000000000000000000000..e281d29887cc83412582ee6b6fd3a8d684d18d8f --- /dev/null +++ b/mo/web/templates/parts/wait_for_email.html @@ -0,0 +1,56 @@ +<div id='dsn-report'> +<p> + Počkejte prosím, až vám přijde e-mail, a klikněte na odkaz v něm uvedený. +</p> +</div> + +{% if dsn_check_token %} + +<script type="text/javascript"> +let dsn_check_counter = 0; +let dsn_stop = false; + +function schedule_dsn_check() +{ + if (dsn_stop) + return; + + dsn_check_counter++; + if (dsn_check_counter > 100) + return; + + let timeout = 30_000; + if (dsn_check_counter < 10) + timeout = 5_000; + + window.setTimeout(function() { + console.log('DSN: Checking'); + fetch("{{ url_for('dsn_check', token=dsn_check_token) }}") + .then(response => { + if (response.status >= 400 && response.status <= 499) + dsn_stop = true; + if (response.ok) + return response.text(); + else + throw Error("Failed with status code " + response.status) + }) + .then((value) => { + if (value != "") { + console.log('DSN: Received report') + const report_div = document.getElementById("dsn-report"); + report_div.innerHTML = value; + dsn_stop = true; + } + schedule_dsn_check(); + }) + .catch(err => { + console.log('DSN: ' + err) + schedule_dsn_check(); + }); + }, timeout); +} + +schedule_dsn_check(); +</script> + +{% endif %} diff --git a/static/mo.css b/static/mo.css index 58864bb1305709a845685cddd59266091a9c935a..655fbfecbd27b6eb226224ddfb72299156cd504e 100644 --- a/static/mo.css +++ b/static/mo.css @@ -596,6 +596,21 @@ table.data input.form-control { margin: 2ex 2ex; } +/* Upozornění na nedoručený mail v registraci */ + +table.dsn-check-err { + border-collapse: collapse; + margin-top: 2ex; +} + +table.dsn-check-err tr td, table.dsn-check-err tr th { + padding-top: 0.1ex; +} + +table.dsn-check-err tr th { + padding-right: 2ex; +} + /* Vzhled pro mobily a úzké displeje */ @media only screen and (max-width: 600px) {