Allow registration before first IP update

This commit is contained in:
StasonJatham committed 2026-05-22 16:14:59 +02:00
1 parent 9f5cee8a0e
commit c19e5170a0
5 files changed
+29 -20

No files matched your search

+1 -1
View File
@@ -84,7 +84,7 @@ async def activate_dashboard(
management_slug,
account,
dashboard_csrf_token(management_slug, account),
"Registration needs a public source IP. Try again from your home connection or use the API with myip.",
"The supplied IP address is invalid. Leave IP fields empty and let the router send the first update.",
client_ip(request, settings),
),
status_code=400,
+13 -12
View File
@@ -72,21 +72,21 @@ class DdnsService:
ipaddr: str | None,
myipv6: str | None,
ip6addr: str | None,
) -> None:
) -> bool:
if not dns_backend_configured(self.settings):
return
return False
source_ip = client_ip(request, self.settings)
source_fallback = source_ip if _is_global_ip(source_ip) else ""
try:
ipv4, ipv6, update_ipv4, update_ipv6 = parse_update_ips(
source_fallback,
myip,
ipaddr,
myipv6,
ip6addr,
)
except BadIpError as exc:
raise BadIpError("registration needs a public source IP or myip/myipv6 parameter") from exc
supplied_ip = any(value and value.strip() for value in (myip, ipaddr, myipv6, ip6addr))
if not supplied_ip and not source_fallback:
return False
ipv4, ipv6, update_ipv4, update_ipv6 = parse_update_ips(
source_fallback,
myip,
ipaddr,
myipv6,
ip6addr,
)
lock = self._lock_for(hostname)
with lock:
planned = self.store.preview_update(hostname, ipv4, ipv6, update_ipv4=update_ipv4, update_ipv6=update_ipv6)
@@ -115,6 +115,7 @@ class DdnsService:
raise
result = self.store.commit_update_result(planned)
self.store.log_update_event(hostname, result.ipv4, result.ipv6, UPDATED, "initial dns registered", source_ip)
return True
def apply_update(
self,
+1 -1
View File
@@ -183,7 +183,7 @@ def _render_api_docs_page(settings: DdnsSettings, request_ip: str | None = None)
<h2>Endpoints</h2>
<ol class="simple-steps text-start">
<li><strong>POST /api/v1/hostnames.</strong> Create a pending hostname and private setup values. The response includes <code>registration_url</code>.</li>
<li><strong>GET or POST /api/v1/router/register/&lt;karl_secret&gt;.</strong> Register the hostname after secrets are saved. Uses the request IP, or <code>myip</code>/<code>myipv6</code>, for the initial DNS record.</li>
<li><strong>GET or POST /api/v1/router/register/&lt;karl_secret&gt;.</strong> Register the hostname after secrets are saved. Publishes an initial DNS record when a public request IP or explicit <code>myip</code>/<code>myipv6</code> value is available; otherwise the first router update publishes it.</li>
<li><strong>GET or POST /api/v1/router/update/&lt;karl_secret&gt;.</strong> Router-friendly update endpoint. Supports <code>myip</code>, <code>ipaddr</code>, <code>myipv6</code>, and <code>ip6addr</code>.</li>
<li><strong>GET /api/v1/hostnames/&lt;karl_secret&gt;.</strong> Read hostname status and recent history.</li>
<li><strong>POST /api/v1/hostnames/&lt;karl_secret&gt;/rotate-update-url.</strong> Replace the private router update URL.</li>