novy prehled prirazovani IP apod.

This commit is contained in:
JiriUhlir
2026-07-30 07:13:12 +02:00
parent 6beca6f79a
commit f67a3fc993
8 changed files with 1230 additions and 16 deletions
+37 -6
View File
@@ -759,11 +759,27 @@ def app_detail(app_id: str, request: Request, message: str = "", error: str = ""
row_class = "" if rule_enabled else " rule-disabled"
enabled_checked = bool_checked(rule_enabled)
ip_label = html.escape(rule.get("ip_cidr", "") or "")
# Pravidla navázaná na katalog IP adres drží IP/CIDR i popis podle katalogu, aby se obě
# místa nerozešla tady jsou proto jen ke čtení a mění se v centrální správě IP Access.
address_id = rule.get("address_id")
if address_id:
address_label = html.escape(rule.get("address_label") or rule.get("description") or "", quote=True)
source_cell = (
f'<a href="/portal/admin/ip-access?mode=address&amp;address_id={html.escape(str(address_id), quote=True)}" '
f'title="Spravovat v centrální správě IP Access">{address_label}</a>'
)
ip_cell = f'<input name="ip_cidr" value="{rule_ip}" form="{form_id}" readonly>'
description_cell = f'<input name="description" value="{rule_desc}" form="{form_id}" readonly>'
else:
source_cell = '<span class="muted">ručně</span>'
ip_cell = f'<input name="ip_cidr" value="{rule_ip}" form="{form_id}" required>'
description_cell = f'<input name="description" value="{rule_desc}" form="{form_id}">'
ip_access_rule_rows += f"""
<tr class="ip-rule-row{row_class}">
<td><input name="ip_cidr" value="{rule_ip}" form="{form_id}" required></td>
<td>{ip_cell}</td>
<td><select name="methods" form="{form_id}">{render_method_options(rule.get("methods", ""))}</select></td>
<td><input name="description" value="{rule_desc}" form="{form_id}"></td>
<td>{description_cell}</td>
<td>{source_cell}</td>
<td><label class="checkbox-label"><input type="checkbox" name="is_enabled" value="1" form="{form_id}"{enabled_checked}> Aktivní</label></td>
<td>
<form method="post" action="/portal/apps/{app_url_id}/ip-access-rules/{rid}/update" id="{form_id}" class="inline-form"></form>
@@ -776,7 +792,7 @@ def app_detail(app_id: str, request: Request, message: str = "", error: str = ""
"""
if not ip_access_rule_rows:
ip_access_rule_rows = '<tr><td colspan="5">Zatím nejsou evidovaná žádná IP access pravidla.</td></tr>'
ip_access_rule_rows = '<tr><td colspan="6">Zatím nejsou evidovaná žádná IP access pravidla.</td></tr>'
notice = ""
if message:
@@ -908,11 +924,19 @@ def app_detail(app_id: str, request: Request, message: str = "", error: str = ""
<strong>WRITE</strong> = POST, PUT, PATCH, DELETE; <strong>ALL</strong> = všechny běžné metody včetně GET.
Pravidla se zatím pouze ukládají (Caddy je začne vynucovat později).
</p>
<p class="inline-form">
<a class="btn btn-secondary" href="/portal/admin/ip-access?mode=service&amp;app_id={app_url_id}">
<i class="fa-solid fa-diagram-project" aria-hidden="true"></i> Hromadné přiřazení IP adres
</a>
<span class="muted">Pojmenované adresy z katalogu (sloupec Zdroj) se spravují centrálně —
tam jednou adresou obsloužíte i deset služeb.</span>
</p>
<table>
<tr>
<th>IP/CIDR</th>
<th>Methods</th>
<th>Description</th>
<th>Zdroj</th>
<th>Enabled</th>
<th>Actions</th>
</tr>
@@ -1281,12 +1305,19 @@ def save_app_ip_access_rule(
rule_ip = clean_optional(ip_cidr)
rule_methods = clean_optional(methods).upper()
if not rule_ip:
return redirect_app_detail(app_id, anchor="ip-access", error="IP/CIDR nesmí být prázdné.")
rule_description = description.strip()
if not rule_methods:
return redirect_app_detail(app_id, anchor="ip-access", error="Methods nesmí být prázdné.")
update_app_ip_access_rule(rule_id, app_id, rule_ip, rule_methods, description.strip(), bool(is_enabled))
# Pravidla z katalogu IP adres si IP/CIDR ani popis nedrží sama ty patří katalogu, jinak by
# se obě místa rozešla. Editovatelné odtud zůstávají jen metody a zapnutí/vypnutí.
if existing.get("address_id"):
rule_ip = existing.get("ip_cidr") or ""
rule_description = existing.get("description") or ""
elif not rule_ip:
return redirect_app_detail(app_id, anchor="ip-access", error="IP/CIDR nesmí být prázdné.")
update_app_ip_access_rule(rule_id, app_id, rule_ip, rule_methods, rule_description, bool(is_enabled))
log_audit_event(
user,
action="app.ip_access_rule.updated",