templates_dnsbl_lists_DATA = \
src/templates/dnsbl/lists/index.html \
src/templates/dnsbl/lists/reports.html \
+ src/templates/dnsbl/lists/sources.html \
src/templates/dnsbl/lists/show.html
templates_dnsbl_listsdir = $(templates_dnsbldir)/lists
</div>
</div>
</section>
-
- {# Sources #}
- {% if sources %}
- <section class="section">
- <div class="container">
- <h5 class="title is-5">{{ _("Sources") }}</h5>
-
- <table class="table is-fullwidth is-striped is-hoverable is-narrow">
- <thead>
- <tr>
- <th>
- {{ _("Name") }}
- </th>
-
- <th class="has-text-right">
- {{ _("Last Update") }}
- </th>
-
- <th class="has-text-right">
- {{ _("Listed Domains") }}
- </th>
- </tr>
- </thead>
-
- <tbody>
- {% for source in sorted(sources) %}
- <tr>
- <td>
- <a href="{{ source.url }}" target="_blank">
- {{ source.name }}
- </a>
-
- <br>
-
- <small class="has-text-grey">
- {{ source.license }}
- </small>
- </td>
-
- <td class="has-text-right">
- {{ locale.format_date(source.updated_at, shorter=True) }}
- </td>
-
- <td class="has-text-right">
- {{ format_number(source.total_domains) }}
-
- <br>
-
- {# Dead Domains #}
- {% if source.total_domains and source.dead_domains %}
- <small>
- {{ _("Dead Domains: %s") % format_percent(source.dead_domains / source.total_domains) }}
- </small>
- {% end %}
- </td>
- </tr>
- {% end %}
- </tbody>
- </table>
- </div>
- </section>
- {% end %}
{% end block %}
--- /dev/null
+{% extends "../../base.html" %}
+
+{% block head %}
+ {% module OpenGraph(
+ title=_("IPFire DNSBL - %s - Sources") % list,
+ description=list.description,
+ ) %}
+{% end block %}
+
+{% block title %}{{ _("IPFire DNSBL") }} - {{ list }} - {{ _("Sources") }}{% end block %}
+
+{% block container %}
+ <section class="hero is-dark">
+ <div class="hero-body">
+ <div class="container">
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li>
+ <a href="/dnsbl">
+ {{ _("IPFire DNSBL") }}
+ </a>
+ </li>
+
+ <li>
+ <a href="/dnsbl/lists">
+ {{ _("Lists") }}
+ </a>
+ </li>
+
+ <li>
+ <a href="/dnsbl/lists/{{ list.slug }}">
+ {{ list }}
+ </a>
+ </li>
+
+ <li class="is-active">
+ <a href="#" aria-current="page">{{ _("Sources") }}</a>
+ </li>
+ </ul>
+ </nav>
+
+ <h1 class="title">
+ {{ _("Sources: %s") % list }}
+ </h1>
+ </div>
+ </div>
+ </section>
+
+ <section class="section">
+ <div class="container">
+ <h5 class="title is-5">{{ _("Sources") }}</h5>
+
+ <table class="table is-fullwidth is-striped is-hoverable is-narrow">
+ <thead>
+ <tr>
+ <th>
+ {{ _("Name") }}
+ </th>
+
+ <th class="has-text-right">
+ {{ _("Last Update") }}
+ </th>
+
+ <th class="has-text-right">
+ {{ _("Listed Domains") }}
+ </th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {% for source in sorted(sources) %}
+ <tr>
+ <td>
+ <a href="{{ source.url }}" target="_blank">
+ {{ source.name }}
+ </a>
+
+ <br>
+
+ <small class="has-text-grey">
+ {{ source.license }}
+ </small>
+ </td>
+
+ <td class="has-text-right">
+ {{ locale.format_date(source.updated_at, shorter=True) }}
+ </td>
+
+ <td class="has-text-right">
+ {{ format_number(source.total_domains) }}
+
+ <br>
+
+ {# Dead Domains #}
+ {% if source.total_domains and source.dead_domains %}
+ <small>
+ {{ _("Dead Domains: %s") % format_percent(source.dead_domains / source.total_domains) }}
+ </small>
+ {% end %}
+ </td>
+ </tr>
+ {% end %}
+ </tbody>
+ </table>
+ </div>
+ </section>
+{% end block %}
(r"/dnsbl/lists", dnsbl.ListsHandler),
(r"/dnsbl/lists/(\w+)", dnsbl.ListHandler),
(r"/dnsbl/lists/(\w+)/reports", dnsbl.ListReportsHandler),
+ (r"/dnsbl/lists/(\w+)/sources", dnsbl.ListSourcesHandler),
(r"/dnsbl/report", dnsbl.SubmitReportHandler),
(r"/dnsbl/reports/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})", dnsbl.ReportHandler),
(r"/dnsbl/search", dnsbl.SearchHandler),
if not list:
raise tornado.web.HTTPError(404, "Could not find list '%s'" % slug)
- # Fetch the sources
- sources = await list.get_sources()
-
- # Fetch some recent reports
- reports = await list.get_reports(limit=25)
-
# Render the page
- self.render("dnsbl/lists/show.html", list=list, sources=sources, reports=reports)
+ self.render("dnsbl/lists/show.html", list=list)
class ListReportsHandler(base.AnalyticsMixin, BaseHandler):
self.render("dnsbl/lists/reports.html", list=list, reports=reports)
+class ListSourcesHandler(base.AnalyticsMixin, BaseHandler):
+ async def get(self, slug):
+ # Fetch the list
+ list = await self.backend.dnsbl.get_list(slug)
+ if not list:
+ raise tornado.web.HTTPError(404, "Could not find list '%s'" % slug)
+
+ # Fetch the sources
+ sources = await list.get_sources()
+
+ # Render the page
+ self.render("dnsbl/lists/sources.html", list=list, sources=sources)
+
+
class SubmitReportHandler(base.AnalyticsMixin, BaseHandler):
async def get(self):
# Fetch all lists