Update copy to post-July-2026 reality and notify on signups
All checks were successful
Build and Deploy PunktFri / build-and-deploy (push) Successful in 1m20s
All checks were successful
Build and Deploy PunktFri / build-and-deploy (push) Successful in 1m20s
- Rewrite copy from "this will happen" to "this has happened": direct registration closed 1 July 2026, transition ends 30 June 2028 - Fix timeline (30 June 2028, not 1 July), update FAQ + JSON-LD, add FAQ on registering new domains now - Send signup notification mail to henrik@i80.dk via smtp.i80.dk, with credentials from Consul KV - Fix CI health check URL (punktfri.dk) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -63,10 +63,10 @@ jobs:
|
|||||||
- name: Health check
|
- name: Health check
|
||||||
run: |
|
run: |
|
||||||
sleep 20
|
sleep 20
|
||||||
curl -f https://punktfri.i80.dk/health || echo "Service not yet available"
|
curl -f https://punktfri.dk/health || echo "Service not yet available"
|
||||||
|
|
||||||
- name: Notify deployment status
|
- name: Notify deployment status
|
||||||
run: |
|
run: |
|
||||||
echo "Deployment completed!"
|
echo "Deployment completed!"
|
||||||
echo "Service: https://punktfri.i80.dk"
|
echo "Service: https://punktfri.dk"
|
||||||
echo "Health: https://punktfri.i80.dk/health"
|
echo "Health: https://punktfri.dk/health"
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ Visit `http://localhost:5000`
|
|||||||
| `LOG_FILE` | `signups.log` | Signup log file path |
|
| `LOG_FILE` | `signups.log` | Signup log file path |
|
||||||
| `ADMIN_USER` | `admin` | Admin username |
|
| `ADMIN_USER` | `admin` | Admin username |
|
||||||
| `ADMIN_PASS` | `punktfri2024` | Admin password |
|
| `ADMIN_PASS` | `punktfri2024` | Admin password |
|
||||||
|
| `NOTIFY_EMAIL` | `henrik@i80.dk` | Receives a mail on every signup |
|
||||||
|
| `SMTP_HOST` | *(empty)* | SMTP server; notifications are skipped when unset |
|
||||||
|
| `SMTP_PORT` | `587` | SMTP port (STARTTLS) |
|
||||||
|
| `SMTP_USER` / `SMTP_PASS` | *(empty)* | SMTP login (Consul KV `punktfri/smtp_user`, `punktfri/smtp_pass` in Nomad) |
|
||||||
|
| `SMTP_FROM` | `SMTP_USER` | Sender address (Consul KV `punktfri/smtp_from`) |
|
||||||
|
|
||||||
Change `ADMIN_USER` and `ADMIN_PASS` before deploying publicly.
|
Change `ADMIN_USER` and `ADMIN_PASS` before deploying publicly.
|
||||||
|
|
||||||
|
|||||||
48
app.py
48
app.py
@@ -1,6 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
import smtplib
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
import threading
|
||||||
|
from email.message import EmailMessage
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
from flask import Flask, render_template, request, redirect, url_for, g, Response, send_from_directory
|
from flask import Flask, render_template, request, redirect, url_for, g, Response, send_from_directory
|
||||||
@@ -10,6 +13,12 @@ LOG_FILE = os.environ.get("LOG_FILE", "signups.log")
|
|||||||
ADMIN_USER = os.environ.get("ADMIN_USER", "admin")
|
ADMIN_USER = os.environ.get("ADMIN_USER", "admin")
|
||||||
ADMIN_PASS = os.environ.get("ADMIN_PASS", "punktfri2024")
|
ADMIN_PASS = os.environ.get("ADMIN_PASS", "punktfri2024")
|
||||||
PORT = int(os.environ.get("PORT", 5000))
|
PORT = int(os.environ.get("PORT", 5000))
|
||||||
|
NOTIFY_EMAIL = os.environ.get("NOTIFY_EMAIL", "henrik@i80.dk")
|
||||||
|
SMTP_HOST = os.environ.get("SMTP_HOST", "")
|
||||||
|
SMTP_PORT = int(os.environ.get("SMTP_PORT", 587))
|
||||||
|
SMTP_USER = os.environ.get("SMTP_USER", "")
|
||||||
|
SMTP_PASS = os.environ.get("SMTP_PASS", "")
|
||||||
|
SMTP_FROM = os.environ.get("SMTP_FROM", "") or SMTP_USER
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
@@ -20,6 +29,41 @@ _fh.setFormatter(logging.Formatter("%(asctime)s %(message)s"))
|
|||||||
signup_logger.addHandler(_fh)
|
signup_logger.addHandler(_fh)
|
||||||
|
|
||||||
|
|
||||||
|
def build_notification(navn, email, domaener, egne_ns, kommentar):
|
||||||
|
msg = EmailMessage()
|
||||||
|
msg["Subject"] = f"PunktFri: ny tilmelding fra {navn}"
|
||||||
|
msg["From"] = SMTP_FROM
|
||||||
|
msg["To"] = NOTIFY_EMAIL
|
||||||
|
msg["Reply-To"] = email
|
||||||
|
msg.set_content(
|
||||||
|
f"Ny interessetilkendegivelse på punktfri.dk\n\n"
|
||||||
|
f"Navn: {navn}\n"
|
||||||
|
f"E-mail: {email}\n"
|
||||||
|
f"Antal domæner: {domaener}\n"
|
||||||
|
f"Egne navneservere: {egne_ns}\n"
|
||||||
|
f"Kommentar:\n{kommentar or '(ingen)'}\n"
|
||||||
|
)
|
||||||
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
def _send(msg):
|
||||||
|
try:
|
||||||
|
with smtplib.SMTP(SMTP_HOST, SMTP_PORT, timeout=15) as s:
|
||||||
|
s.starttls()
|
||||||
|
if SMTP_USER:
|
||||||
|
s.login(SMTP_USER, SMTP_PASS)
|
||||||
|
s.send_message(msg)
|
||||||
|
except Exception:
|
||||||
|
app.logger.exception("Kunne ikke sende tilmeldingsnotifikation til %s", NOTIFY_EMAIL)
|
||||||
|
|
||||||
|
|
||||||
|
def notify_signup(**fields):
|
||||||
|
if not SMTP_HOST:
|
||||||
|
app.logger.warning("SMTP_HOST ikke sat — springer notifikation over")
|
||||||
|
return
|
||||||
|
threading.Thread(target=_send, args=(build_notification(**fields),), daemon=True).start()
|
||||||
|
|
||||||
|
|
||||||
def get_db():
|
def get_db():
|
||||||
db = getattr(g, "_database", None)
|
db = getattr(g, "_database", None)
|
||||||
if db is None:
|
if db is None:
|
||||||
@@ -105,6 +149,10 @@ def index():
|
|||||||
f"SIGNUP navn={navn!r} email={email!r} domaener={domaener} "
|
f"SIGNUP navn={navn!r} email={email!r} domaener={domaener} "
|
||||||
f"egne_ns={egne_ns} kommentar={kommentar!r}"
|
f"egne_ns={egne_ns} kommentar={kommentar!r}"
|
||||||
)
|
)
|
||||||
|
notify_signup(
|
||||||
|
navn=navn, email=email, domaener=domaener,
|
||||||
|
egne_ns=egne_ns, kommentar=kommentar,
|
||||||
|
)
|
||||||
return redirect(url_for("tak"))
|
return redirect(url_for("tak"))
|
||||||
|
|
||||||
return render_template("index.html", error=error)
|
return render_template("index.html", error=error)
|
||||||
|
|||||||
@@ -104,6 +104,19 @@ job "punktfri" {
|
|||||||
DATABASE = "/app/instance/punktfri.db"
|
DATABASE = "/app/instance/punktfri.db"
|
||||||
LOG_FILE = "/app/instance/signups.log"
|
LOG_FILE = "/app/instance/signups.log"
|
||||||
TZ = "Europe/Copenhagen"
|
TZ = "Europe/Copenhagen"
|
||||||
|
NOTIFY_EMAIL = "henrik@i80.dk"
|
||||||
|
SMTP_HOST = "smtp.i80.dk"
|
||||||
|
SMTP_PORT = "587"
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
data = <<EOT
|
||||||
|
SMTP_USER={{ keyOrDefault "punktfri/smtp_user" "" }}
|
||||||
|
SMTP_PASS={{ keyOrDefault "punktfri/smtp_pass" "" }}
|
||||||
|
SMTP_FROM={{ keyOrDefault "punktfri/smtp_from" "" }}
|
||||||
|
EOT
|
||||||
|
destination = "secrets/app.env"
|
||||||
|
env = true
|
||||||
}
|
}
|
||||||
|
|
||||||
resources {
|
resources {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://punktfri.dk/</loc>
|
<loc>https://punktfri.dk/</loc>
|
||||||
<lastmod>2026-05-22</lastmod>
|
<lastmod>2026-09-19</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
|
|||||||
@@ -824,6 +824,11 @@ footer {
|
|||||||
box-shadow: 0 0 0 4px var(--primary-bg);
|
box-shadow: 0 0 0 4px var(--primary-bg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.timeline-marker.is-past {
|
||||||
|
background: var(--border);
|
||||||
|
border-color: var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
.timeline-marker.is-future {
|
.timeline-marker.is-future {
|
||||||
background: var(--white);
|
background: var(--white);
|
||||||
border-color: var(--border);
|
border-color: var(--border);
|
||||||
|
|||||||
@@ -10,8 +10,9 @@
|
|||||||
<h1>Punkt<span class="accent">Fri</span> <span class="h1-subtitle">— Non-profit registrator for .dk-domæner</span></h1>
|
<h1>Punkt<span class="accent">Fri</span> <span class="h1-subtitle">— Non-profit registrator for .dk-domæner</span></h1>
|
||||||
<p class="tagline">Dit .dk-domæne. Din infrastruktur. Ingen forhandler.</p>
|
<p class="tagline">Dit .dk-domæne. Din infrastruktur. Ingen forhandler.</p>
|
||||||
<p class="intro">
|
<p class="intro">
|
||||||
Punktum dk kræver fra 2026 en akkrediteret registrator for alle .dk-domæner — også dem du har
|
Det er sket. Den 1. juli 2026 lukkede Punktum dk for direkte registrering af nye .dk-domæner,
|
||||||
administreret selv i årtier uden at bede nogen om hjælp. <strong>90-150 kr/domæne/år for noget du ikke har brug for.</strong>
|
og nedtællingen er i gang for dem, du har administreret selv i årtier uden at bede nogen om hjælp:
|
||||||
|
senest 30. juni 2028 skal de også have en registrator. <strong>90–150 kr/domæne/år for noget du ikke har brug for.</strong>
|
||||||
Du har ikke bedt om et mellemled. Din infrastruktur virker. PunktFri er et initiativ fra selvhostere,
|
Du har ikke bedt om et mellemled. Din infrastruktur virker. PunktFri er et initiativ fra selvhostere,
|
||||||
der heller ikke vil betale kommerciel pris for noget, de aldrig har haft brug for.
|
der heller ikke vil betale kommerciel pris for noget, de aldrig har haft brug for.
|
||||||
</p>
|
</p>
|
||||||
@@ -27,8 +28,8 @@
|
|||||||
Du har kørt BIND, PowerDNS, Knot eller tilsvarende i årevis. Du har sat DNSSEC op selv
|
Du har kørt BIND, PowerDNS, Knot eller tilsvarende i årevis. Du har sat DNSSEC op selv
|
||||||
— med DS-records, signering og det hele — og det har bare virket. Du har administreret dine
|
— med DS-records, signering og det hele — og det har bare virket. Du har administreret dine
|
||||||
domæner direkte hos Punktum dk uden nogensinde at have brug for hjælp fra dem til noget som helst.
|
domæner direkte hos Punktum dk uden nogensinde at have brug for hjælp fra dem til noget som helst.
|
||||||
Nu kræver de alligevel at du har en kommerciel forhandler som mellemmand. Intet ændrer sig teknisk.
|
Alligevel har de nu gjort en kommerciel forhandler til et krav. Teknisk er intet ændret.
|
||||||
Det er ren administration — og det skal du nu betale 90–150 kr/år for per domæne. Det er absurd,
|
Det er ren administration — og den koster nu 90–150 kr/år per domæne. Det er absurd,
|
||||||
og det ved vi godt.
|
og det ved vi godt.
|
||||||
</p>
|
</p>
|
||||||
<div class="target-grid">
|
<div class="target-grid">
|
||||||
@@ -122,33 +123,33 @@
|
|||||||
<p>
|
<p>
|
||||||
Punktum dk A/S er den danske registry — det centrale register for alle .dk-domæner.
|
Punktum dk A/S er den danske registry — det centrale register for alle .dk-domæner.
|
||||||
Lidt ligesom Tinglysningsretten er for ejendomme: de er registret, ikke en udbyder.
|
Lidt ligesom Tinglysningsretten er for ejendomme: de er registret, ikke en udbyder.
|
||||||
Indtil nu har tekniske brugere kunnet administrere domæner direkte hos Punktum dk uden mellemmand.
|
Tekniske brugere har i årevis kunnet administrere deres domæner direkte hos Punktum dk uden mellemmand.
|
||||||
Det slutter nu.
|
Det er slut: modellen er lukket for nye domæner, og for de eksisterende løber tiden ud.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="timeline">
|
<div class="timeline">
|
||||||
|
<div class="timeline-item">
|
||||||
|
<div class="timeline-marker is-past"></div>
|
||||||
|
<div class="timeline-body">
|
||||||
|
<span class="timeline-date">Før 1. juli 2026</span>
|
||||||
|
<h3>Direkte registrering hos Punktum dk</h3>
|
||||||
|
<p>Som registrant kunne du oprette, betale og administrere dine .dk-domæner direkte hos Punktum dk — uden mellemmand.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="timeline-item">
|
<div class="timeline-item">
|
||||||
<div class="timeline-marker is-now"></div>
|
<div class="timeline-marker is-now"></div>
|
||||||
<div class="timeline-body">
|
<div class="timeline-body">
|
||||||
<span class="timeline-date">Nu — maj 2026</span>
|
<span class="timeline-date">1. juli 2026 <span class="timeline-badge">Gældende nu</span></span>
|
||||||
<h3>Direkte registrering virker stadig</h3>
|
<h3>Direkte registrering er lukket for nye domæner</h3>
|
||||||
<p>Har du administreret dine domæner direkte hos Punktum dk, kører det fortsat. Men det ændrer sig meget snart.</p>
|
<p>Punktum dk har lukket for oprettelse af nye domæner uden mellemled. Nye .dk-domæner oprettes nu kun via en registrator — uanset om du bruger deres services eller ej — og registrering og fornyelse sker ét år ad gangen. Dine eksisterende, direkte registrerede domæner kører videre, men kun indtil overgangsperioden udløber.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="timeline-item">
|
<div class="timeline-item">
|
||||||
<div class="timeline-marker is-soon"></div>
|
<div class="timeline-marker is-soon"></div>
|
||||||
<div class="timeline-body">
|
<div class="timeline-body">
|
||||||
<span class="timeline-date">1. juli 2026 <span class="timeline-badge">Snart</span></span>
|
<span class="timeline-date">30. juni 2028 <span class="timeline-badge">Næste frist</span></span>
|
||||||
<h3>Nye .dk-domæner kræver registrator</h3>
|
<h3>Overgangsperioden udløber</h3>
|
||||||
<p>Direkte registrering af nye domæner hos Punktum dk udgår. Du skal have en akkrediteret registrator — uanset om du bruger deres services eller ej.</p>
|
<p>Herefter skal alle .dk-domæner ligge hos en registrator — også dem, du i dag har direkte hos Punktum dk. Teknisk ændres intet, men mellemleddet er obligatorisk.</p>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="timeline-item">
|
|
||||||
<div class="timeline-marker is-future"></div>
|
|
||||||
<div class="timeline-body">
|
|
||||||
<span class="timeline-date">1. juli 2028</span>
|
|
||||||
<h3>Alle eksisterende domæner skal overføres</h3>
|
|
||||||
<p>Også domæner registreret direkte hos Punktum dk skal nu have en registrator som formelt mellemled. Intet ændrer sig teknisk — men det administrative led er obligatorisk.</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -215,7 +216,14 @@
|
|||||||
<details class="faq-item">
|
<details class="faq-item">
|
||||||
<summary>Hvornår er PunktFri klar?</summary>
|
<summary>Hvornår er PunktFri klar?</summary>
|
||||||
<div class="faq-answer">
|
<div class="faq-answer">
|
||||||
<p>Vi arbejder på det. Målet er at have forening stiftet og akkreditering ansøgt inden 1. juli 2026-deadlinen for nye domæner. Tilmeldingerne her er afgørende for, om vi har den kritiske masse til at gå videre — juridisk, teknisk og organisatorisk.</p>
|
<p>Vi arbejder på det. Den frist, der betyder mest for selvhostere med eksisterende domæner, er 30. juni 2028 — og målet er at være klar i god tid før. Tilmeldingerne her er afgørende for, om vi har den kritiske masse til at gå videre — juridisk, teknisk og organisatorisk.</p>
|
||||||
|
</div>
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details class="faq-item">
|
||||||
|
<summary>Jeg skal bruge et nyt .dk-domæne nu — hvad gør jeg?</summary>
|
||||||
|
<div class="faq-answer">
|
||||||
|
<p>Siden 1. juli 2026 skal nye domæner oprettes via en registrator. Indtil PunktFri er akkrediteret, må du bruge en eksisterende registrator. Når PunktFri er klar, kan du flytte domænet til os — dine navneservere og zoner er upåvirkede af en registratorflytning.</p>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@@ -227,9 +235,9 @@
|
|||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details class="faq-item">
|
<details class="faq-item">
|
||||||
<summary>Hvad sker der med mine domæner, hvis jeg intet gør inden 2028?</summary>
|
<summary>Hvad sker der med mine domæner, hvis jeg intet gør inden 30. juni 2028?</summary>
|
||||||
<div class="faq-answer">
|
<div class="faq-answer">
|
||||||
<p>Punktum dk har endnu ikke offentliggjort præcis, hvad der sker — men de vil sandsynligvis tvinge en overflytning til en registrator, du ikke selv har valgt. Det er bedre at vælge sin registrator på egne præmisser og i god tid.</p>
|
<p>Punktum dk har meldt ud, at de selv vil afgøre, hvad der sker med domæner, som ikke er flyttet til en registrator inden 30. juni 2028. I værste fald risikerer du at miste kontrollen over domænet. Mange har desuden forældede kontaktoplysninger hos Punktum dk, hvilket kan trække en overførsel i langdrag — så vent ikke til sidste øjeblik, og vælg din registrator på egne præmisser.</p>
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
@@ -284,7 +292,15 @@
|
|||||||
"name": "Hvornår er PunktFri klar?",
|
"name": "Hvornår er PunktFri klar?",
|
||||||
"acceptedAnswer": {
|
"acceptedAnswer": {
|
||||||
"@type": "Answer",
|
"@type": "Answer",
|
||||||
"text": "Vi arbejder på det. Målet er at have forening stiftet og akkreditering ansøgt inden 1. juli 2026-deadlinen for nye domæner. Tilmeldingerne her er afgørende for, om vi har den kritiske masse til at gå videre — juridisk, teknisk og organisatorisk."
|
"text": "Vi arbejder på det. Den frist, der betyder mest for selvhostere med eksisterende domæner, er 30. juni 2028 — og målet er at være klar i god tid før. Tilmeldingerne her er afgørende for, om vi har den kritiske masse til at gå videre — juridisk, teknisk og organisatorisk."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "Jeg skal bruge et nyt .dk-domæne nu — hvad gør jeg?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Siden 1. juli 2026 skal nye domæner oprettes via en registrator. Indtil PunktFri er akkrediteret, må du bruge en eksisterende registrator. Når PunktFri er klar, kan du flytte domænet til os — dine navneservere og zoner er upåvirkede af en registratorflytning."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -297,10 +313,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"@type": "Question",
|
"@type": "Question",
|
||||||
"name": "Hvad sker der med mine domæner, hvis jeg intet gør inden 2028?",
|
"name": "Hvad sker der med mine domæner, hvis jeg intet gør inden 30. juni 2028?",
|
||||||
"acceptedAnswer": {
|
"acceptedAnswer": {
|
||||||
"@type": "Answer",
|
"@type": "Answer",
|
||||||
"text": "Punktum dk har endnu ikke offentliggjort præcis, hvad der sker — men de vil sandsynligvis tvinge en overflytning til en registrator, du ikke selv har valgt. Det er bedre at vælge sin registrator på egne præmisser og i god tid."
|
"text": "Punktum dk har meldt ud, at de selv vil afgøre, hvad der sker med domæner, som ikke er flyttet til en registrator inden 30. juni 2028. I værste fald risikerer du at miste kontrollen over domænet. Mange har desuden forældede kontaktoplysninger hos Punktum dk, hvilket kan trække en overførsel i langdrag — så vent ikke til sidste øjeblik, og vælg din registrator på egne præmisser."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
Jo flere selvhostere der tilkendegiver interesse, jo bedre argumenterer vi overfor
|
Jo flere selvhostere der tilkendegiver interesse, jo bedre argumenterer vi overfor
|
||||||
Punktum dk og potentielle medstiftere. Send dem linket.
|
Punktum dk og potentielle medstiftere. Send dem linket.
|
||||||
</p>
|
</p>
|
||||||
<div class="share-text" id="shareText">Punktum dk kræver fra 2026 en registrator for alle .dk-domæner — også for selvhostere med egne navneservere. PunktFri er et non-profit initiativ, der bygger præcis det mellemled, der mangler: kostpris, demokratisk styring, ingen indblanding i din infrastruktur. Tilmeld din interesse: https://punktfri.dk</div>
|
<div class="share-text" id="shareText">Punktum dk har lukket for direkte registrering af .dk-domæner — nye domæner kræver nu en registrator, og senest 30. juni 2028 gælder det også eksisterende, selv for selvhostere med egne navneservere. PunktFri er et non-profit initiativ, der bygger præcis det mellemled, der mangler: kostpris, demokratisk styring, ingen indblanding i din infrastruktur. Tilmeld din interesse: https://punktfri.dk</div>
|
||||||
<button class="copy-btn" onclick="copyShare()">Kopiér tekst</button>
|
<button class="copy-btn" onclick="copyShare()">Kopiér tekst</button>
|
||||||
<span class="copy-confirm" id="copyConfirm">Kopieret!</span>
|
<span class="copy-confirm" id="copyConfirm">Kopieret!</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -90,3 +90,30 @@ def test_signup_duplicate_email(client):
|
|||||||
r = client.post("/", data=data)
|
r = client.post("/", data=data)
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
assert "allerede" in r.data.decode("utf-8")
|
assert "allerede" in r.data.decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def test_signup_sends_notification(client, monkeypatch):
|
||||||
|
sent = []
|
||||||
|
monkeypatch.setattr(app_module, "SMTP_HOST", "smtp.example")
|
||||||
|
monkeypatch.setattr(app_module, "_send", sent.append)
|
||||||
|
monkeypatch.setattr(app_module.threading, "Thread",
|
||||||
|
lambda target, args, daemon: type("T", (), {"start": lambda self: target(*args)})())
|
||||||
|
client.post("/", data={
|
||||||
|
"navn": "Notif Test", "email": "notif@test.dk",
|
||||||
|
"domaener": "4", "egne_ns": "ja", "kommentar": "hej",
|
||||||
|
})
|
||||||
|
assert len(sent) == 1
|
||||||
|
msg = sent[0]
|
||||||
|
assert msg["To"] == "henrik@i80.dk"
|
||||||
|
assert msg["Reply-To"] == "notif@test.dk"
|
||||||
|
assert "Notif Test" in msg["Subject"]
|
||||||
|
assert "hej" in msg.get_content()
|
||||||
|
|
||||||
|
|
||||||
|
def test_signup_without_smtp_skips_notification(client, monkeypatch):
|
||||||
|
monkeypatch.setattr(app_module, "SMTP_HOST", "")
|
||||||
|
monkeypatch.setattr(app_module, "_send", lambda m: pytest.fail("should not send"))
|
||||||
|
r = client.post("/", data={
|
||||||
|
"navn": "X", "email": "nosmtp@test.dk", "domaener": "1", "egne_ns": "nej",
|
||||||
|
})
|
||||||
|
assert r.status_code == 302
|
||||||
|
|||||||
Reference in New Issue
Block a user