Files
LowderPlay_cheburcheck/website/templates/result.html.tera
T
senya xdearboy :)andLowder fb3febd54e feat: subnets support
* add cidr subnet support

allows checking entire subnets using cidr notation (e.g. 1.1.1.0/24, 2001:db8::/32)

- parse ipv4/ipv6 subnets from input with / delimiter
- sample 256 addresses from large subnets for checking
- show actual subnet size in ui (e.g. "8.2K всего, показано 256")
- update search placeholder with cidr examples
- limit min prefix to /8 for ipv4 and /32 for ipv6 to prevent abuse

* chore: bump version

---------

Co-authored-by: Lowder <me@lowderplay.dev>
2026-03-03 00:54:50 +05:00

202 lines
8.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends 'base' %}
{% block content %}
{% include 'search-form' %}
{% set warning = whitelist and not domain %}
<div class="result-panel {% if warning %}whitelist-theme{% elif found %}blocked-theme{% else %}clean-theme{% endif %}">
<div class="result-header">
<div class="icon-box status-icon">
{% if whitelist %}
<i data-lucide="shield-alert" width="32" height="32"></i>
{% elif blocked %}
<i data-lucide="shield-x" width="32" height="32"></i>
{% else %}
<i data-lucide="shield-check" width="32" height="32"></i>
{% endif %}
</div>
{% if warning %}
<div>
<h2>Белый список</h2>
<p class="subheading text-sm">
Ресурс находится в белом списке
</p>
</div>
{% elif found %}
<div>
<h2>Заблокирован</h2>
<p class="subheading text-sm">Ресурс был найден в списках блокировок</p>
</div>
{% else %}
<div>
<h2>Доступен</h2>
<p class="subheading text-sm">Ограничений не обнаружено</p>
</div>
{% endif %}
</div>
<div class="target-info">
<div class="target-info-label">{{ target_type }}:</div>
<div class="target-value target-display">{{ target }}</div>
</div>
<div class="details-grid">
<div class="detail-section">
<h3 class="section-title">Сетевые данные</h3>
<div class="detail-row">
<span class="row-label">IP-адреса</span>
<div class="ip-list-container">
{% if ips | length == 1 %}
<span class="ip-item">{{ ips | first }}</span>
{% if subnet_size %}
<span class="ip-count">({{ subnet_size }} всего)</span>
{% endif %}
{% elif ips | length <= 5 %}
{% for ip in ips %}
<span class="ip-item">{{ ip }}</span>
{% endfor %}
{% if subnet_size %}
<span class="ip-count">({{ subnet_size }} всего)</span>
{% endif %}
{% else %}
<div class="ip-summary">
<span class="ip-range">{{ ips | first }} — {{ ips | last }}</span>
{% if subnet_size %}
<span class="ip-count">({{ subnet_size }} всего, показано {{ ips | length }})</span>
{% else %}
<span class="ip-count">({{ ips | length }} адресов)</span>
{% endif %}
</div>
<details class="ip-list-details">
<summary class="ip-list-toggle">
Показать все
</summary>
<div class="ip-list-expanded">
{% for ip in ips %}
<span class="ip-item">{{ ip }}</span>
{% endfor %}
</div>
</details>
{% endif %}
</div>
</div>
<div class="detail-row">
<span class="row-label">Хостинг / ISP</span>
<span class="row-value">{% if geo.organisation %}{{ geo.organisation }}{% else %}-{% endif %}</span>
</div>
<div class="detail-row">
<span class="row-label">Локация</span>
<span class="row-value">{{ geo.location }}</span>
</div>
<div class="detail-row">
<span class="row-label">ASN</span>
<span class="row-value">{% if geo.asn %}{{ geo.asn }}{% else %}-{% endif %}</span>
</div>
</div>
<div class="detail-section">
<h3 class="reason-header">Нахождение в списках</h3>
<div class="detail-row">
<span class="row-label">CDN</span>
{% if providers %}
<p class="row-value alert">НАЙДЕН</p>
{% else %}
<span class="row-value">Не найден</span>
{% endif %}
</div>
{% if providers %}
{% for provider, networks in providers %}
<div class="detail-row">
<span class="row-label">{{ provider }}</span>
<div>
{% for network in networks %}
<p class="row-value">{{ network.cidr }}</p>
{% endfor %}
</div>
</div>
{% endfor %}
{% endif %}
{% if whitelist %}
<div class="detail-row">
<a href="/kb/whitelist" class="row-label">Белый список (?)</a>
<span class="row-value success">
НАЙДЕН - <span class="hint"
title="Дата последнего сканирования, когда данный домен был найден в белом списке">
<script>
document.write(new Date("{{ whitelist.last_ok }}").toLocaleDateString());
</script>
</span>
</span>
</div>
{% endif %}
<div class="detail-row">
<span class="row-label">Реестр РКН</span>
{% if domain %}
<span class="row-value alert">ОГРАНИЧЕН</span>
{% elif blocked_subnets %}
<span class="row-value alert hint"
title="Адреса пересекаются с подсетями заблокированных доменов (не гарантирует блокировку)">
IP-АДРЕСА
</span>
{% else %}
<span class="row-value">Не найден</span>
{% endif %}
</div>
{% if domain %}
<div class="detail-row">
<span class="row-label">Заблокированный домен</span>
<span class="row-value">{{ domain }}</span>
</div>
{% endif %}
{% if blocked_subnets %}
<div class="detail-row">
<span class="row-label">Заблокированные подсети</span>
<div>
{% for network in blocked_subnets %}
<p class="row-value">{{ network }}</p>
{% endfor %}
</div>
</div>
{% endif %}
</div>
</div>
<div class="user-feedback-section">
<p class="feedback-prompt">У вас работает этот ресурс?</p>
<div class="feedback-buttons">
<button class="feedback-btn feedback-works" onclick="sendFeedback(true)">
<i data-lucide="thumbs-up" width="16" height="16"></i>
Работает
</button>
<button class="feedback-btn feedback-not-works" onclick="sendFeedback(false)">
<i data-lucide="thumbs-down" width="16" height="16"></i>
Не работает
</button>
</div>
<div class="feedback-status hidden">
<i data-lucide="thumbs-up" width="16" height="16"></i>
<span>Спасибо за ваш отзыв!</span>
</div>
</div>
</div>
<script>
function sendFeedback(works) {
document.querySelector('.feedback-buttons').classList.add('hidden');
document.querySelector('.feedback-prompt').classList.add('hidden');
document.querySelector('.feedback-status').classList.remove('hidden');
fetch(`/feedback/{{ id }}/${works}`, {
method: 'POST',
});
}
</script>
{% endblock content %}