Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions css/content.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/* content.css — styles for text-heavy pages (impressum, datenschutz) */
main {
max-width: 640px;
margin: 0 auto;
padding: 40px 20px 60px;
}
main h1 {
font-size: 22px;
font-weight: 700;
color: #1a1a2e;
margin-bottom: 24px;
}
main h2 {
font-size: 16px;
font-weight: 600;
color: #1a1a2e;
margin-top: 28px;
margin-bottom: 8px;
}
main p, main ul {
font-size: 14px;
color: #444;
line-height: 1.7;
margin-bottom: 12px;
}
main ul { padding-left: 20px; }
main li { margin-bottom: 4px; }
main a { color: #2563eb; text-decoration: none; }
main a:hover { text-decoration: underline; }
main code {
font-size: 13px;
background: #f0f1f5;
padding: 1px 5px;
border-radius: 3px;
}
footer {
max-width: 640px;
margin: 0 auto;
padding: 16px 20px 32px;
font-size: 12px;
color: #999;
border-top: 1px solid #e5e7eb;
}
footer a { color: #2563eb; text-decoration: none; }
footer a:hover { text-decoration: underline; }
55 changes: 55 additions & 0 deletions datenschutz.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, follow">
<title>Datenschutzerklärung — Municipality Emails</title>
<link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon/favicon-16x16.png">
<link rel="manifest" href="favicon/site.webmanifest">
<link rel="stylesheet" href="css/shared.css">
<link rel="stylesheet" href="css/content.css">
<script defer src="js/nav.js"></script>
</head>
<body>
<header id="header">
<div class="header-left">
<h1 class="brand"><a href="index.html">Municipality Emails</a></h1>
<nav id="nav"></nav>
</div>
</header>
<main>
<h1>Datenschutzerklärung</h1>

<h2>1. Allgemeines</h2>
<p>Diese Datenschutzerklärung erläutert, wie auf dieser Website mit Personendaten umgegangen wird. Die verantwortliche Person ist im <a href="impressum.html">Impressum</a> aufgeführt.</p>

<h2>2. Hosting</h2>
<p>Diese Website wird über <strong>GitHub Pages</strong> (GitHub Inc., USA) bereitgestellt. Beim Aufruf der Website wird Ihre IP-Adresse an die Server von GitHub übermittelt. Dies ist technisch notwendig, um die Website auszuliefern. Weitere Informationen finden Sie in der <a href="https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement" target="_blank">Datenschutzerklärung von GitHub</a>.</p>

<h2>3. Externe Ressourcen</h2>
<p>Zur Darstellung der Karten werden externe Ressourcen von Drittanbietern geladen. Dabei wird Ihre IP-Adresse an die jeweiligen Server übermittelt:</p>
<ul>
<li><code>unpkg.com</code> — Leaflet-Kartenbibliothek und Gemeindegrenzen (TopoJSON)</li>
<li><code>basemaps.cartocdn.com</code> — Kartenkacheln (CARTO)</li>
</ul>

<h2>4. Cookies</h2>
<p>Diese Website verwendet keine Cookies.</p>

<h2>5. Keine Erhebung personenbezogener Daten</h2>
<p>Diese Website enthält keine Formulare, kein Tracking, keine Analysedienste und keine Werbung. Es werden keine personenbezogenen Daten über die in den Abschnitten 2 und 3 beschriebenen technisch notwendigen Übermittlungen hinaus erhoben.</p>

<h2>6. Ihre Rechte</h2>
<p>Sie haben gemäss dem Bundesgesetz über den Datenschutz (nDSG) sowie der EU-Datenschutz-Grundverordnung (DSGVO) das Recht auf Auskunft, Berichtigung, Löschung und Herausgabe Ihrer Personendaten. Für entsprechende Anfragen wenden Sie sich bitte an die im <a href="impressum.html">Impressum</a> genannte Kontaktadresse.</p>

<h2>7. Änderungen</h2>
<p>Diese Datenschutzerklärung kann jederzeit angepasst werden. Die jeweils aktuelle Fassung ist auf dieser Seite abrufbar.</p>
</main>
<footer>
&copy; David Huser &middot; <a href="impressum.html">Impressum</a>
</footer>
</body>
</html>
45 changes: 45 additions & 0 deletions impressum.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, follow">
<title>Impressum — Municipality Emails</title>
<link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="favicon/favicon-16x16.png">
<link rel="manifest" href="favicon/site.webmanifest">
<link rel="stylesheet" href="css/shared.css">
<link rel="stylesheet" href="css/content.css">
<script defer src="js/nav.js"></script>
</head>
<body>
<header id="header">
<div class="header-left">
<h1 class="brand"><a href="index.html">Municipality Emails</a></h1>
<nav id="nav"></nav>
</div>
</header>
<main>
<h1>Impressum</h1>

<h2>Angaben gemäss Art. 3 UWG / § 5 DDG / § 5 ECG</h2>
<p>
David Huser<br>
E-Mail: davidhus@pm.me
</p>

<h2>Verantwortlich für den Inhalt</h2>
<p>David Huser, Mario Bischof, Ronald Petrlic, Alexej Ochsner</p>

<h2>Haftungsausschluss</h2>
<p>Die Daten auf dieser Website basieren auf DNS-Einträgen und anderen öffentlichen Ressourcen. DNS-Einträge zeigen das Mail-Routing und autorisierte Absender an, nicht zwingend den tatsächlichen Speicherort der Daten. Es wird keine Gewähr für die Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen übernommen.</p>

<h2>Urheberrecht</h2>
<p>Der Quellcode dieses Projekts steht unter der <a href="https://opensource.org/licenses/MIT">MIT-Lizenz</a> und ist auf <a href="https://github.com/mxmap/esorics2026" target="_blank">GitHub</a> verfügbar.</p>
</main>
<footer>
&copy; David Huser, Mario Bischof, Ronald Petrlic, Alexej Ochsner &middot; <a href="datenschutz.html">Datenschutzerklärung</a>
</footer>
</body>
</html>
6 changes: 3 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,16 @@ <h2>Municipality Email Maps</h2>
<p>Interactive maps showing email infrastructure of ~15,300 municipalities in Germany, Austria, and Switzerland, based on public DNS records and network signals.</p>
<div class="map-list">
<a href="providers.html" class="map-card">
<h3>Email Providers</h3>
<h3>📨 Email Providers</h3>
<p>Which provider handles each municipality's official email? Classified by jurisdiction: US cloud (Microsoft, Google, AWS), domestic, or foreign.</p>
</a>
<a href="security.html" class="map-card">
<h3>Email Security</h3>
<h3>🛡️ Email Security</h3>
<p>How well are municipality email domains protected against spoofing? Based on SPF and DMARC configuration.</p>
</a>
</div>
<div class="landing-footer">
<p>Open source &amp; open data on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
<p>Part of an ongoing research project currently in peer review. Open source &amp; open data on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
</div>
</div>
</body>
Expand Down
6 changes: 4 additions & 2 deletions js/map-providers.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ var COLOR_SCHEMES = {
default: {
'us-cloud': { high: '#ffa199', medium: '#ffccb6', low: '#cccccc' },
'domestic': { high: '#88faaa', medium: '#daffc2', low: '#cccccc' },
'foreign': { high: '#f5c842', medium: '#fde7c4', low: '#cccccc' },
'foreign': { high: '#f8c936', medium: '#fde89a', low: '#cccccc' },
lake: '#89B3D6',
},
colorblind: {
Expand Down Expand Up @@ -464,6 +464,7 @@ function loadUnifiedProviderMap(mapConfig, countries) {
};

var latestGenerated = null;
var latestCommit = null;

for (var ci = 0; ci < results.length; ci++) {
var data = results[ci].data;
Expand All @@ -473,6 +474,7 @@ function loadUnifiedProviderMap(mapConfig, countries) {

if (data.generated && (!latestGenerated || data.generated > latestGenerated)) {
latestGenerated = data.generated;
latestCommit = data.commit;
}

var keys = Object.keys(muni);
Expand All @@ -490,7 +492,7 @@ function loadUnifiedProviderMap(mapConfig, countries) {
}

if (latestGenerated) {
showGenerated({ generated: latestGenerated, commit: results[0].data.commit });
showGenerated({ generated: latestGenerated, commit: latestCommit });
}

var hatchSvg = 'data:image/svg+xml,' +
Expand Down
4 changes: 3 additions & 1 deletion js/map-security.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ function loadSecurityMap(mapConfig, countries) {
var catCounts = { 'both': 0, 'spf-only': 0, 'dmarc-only': 0, 'none': 0, 'no-data': 0 };

var latestGenerated = null;
var latestCommit = null;

for (var ci = 0; ci < results.length; ci++) {
var data = results[ci].data;
Expand All @@ -109,6 +110,7 @@ function loadSecurityMap(mapConfig, countries) {

if (data.generated && (!latestGenerated || data.generated > latestGenerated)) {
latestGenerated = data.generated;
latestCommit = data.commit;
}

var keys = Object.keys(muni);
Expand All @@ -123,7 +125,7 @@ function loadSecurityMap(mapConfig, countries) {
}

if (latestGenerated) {
showGenerated({ generated: latestGenerated, commit: results[0].data.commit });
showGenerated({ generated: latestGenerated, commit: latestCommit });
}

var hatchSvg = 'data:image/svg+xml,' +
Expand Down
6 changes: 3 additions & 3 deletions js/map-shared.js
Original file line number Diff line number Diff line change
Expand Up @@ -387,8 +387,8 @@ function addDownloadButton(map, filename) {
var btn = document.createElement('button');
btn.className = 'toggle-info';
btn.id = 'download-btn';
btn.innerHTML = '\u2913 Download';
btn.setAttribute('aria-label', 'Download map as PNG');
btn.innerHTML = '\u2913 Download HQ image';
btn.setAttribute('aria-label', 'Download map as high-quality PNG (~50 MB)');

var headerRight = document.querySelector('.header-right');
var aboutBtn = document.getElementById('toggle-info');
Expand All @@ -400,7 +400,7 @@ function addDownloadButton(map, filename) {
setTimeout(function () {
exportMapImage(map, filename, function () {
btn.disabled = false;
btn.innerHTML = '\u2913 Download';
btn.innerHTML = '\u2913 Download HQ image';
});
}, 50);
});
Expand Down
8 changes: 8 additions & 0 deletions js/nav.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,19 @@
toggle.textContent = '\u22EF';
nav.appendChild(toggle);

var extras = [
{ href: 'impressum.html', label: 'Impressum', match: ['impressum.html'] },
{ href: 'datenschutz.html', label: 'Datenschutz', match: ['datenschutz.html'] },
];

var menu = document.createElement('div');
menu.className = 'nav-menu';
primary.forEach(function (link) {
menu.appendChild(makeLink(link, 'nav-menu-mobile'));
});
extras.forEach(function (link) {
menu.appendChild(makeLink(link));
});
nav.appendChild(menu);

toggle.addEventListener('click', function (e) {
Expand Down
2 changes: 1 addition & 1 deletion providers.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ <h3>How does it work?</h3>
</div>
<div class="info-card">
<h3>Open source &amp; open data</h3>
<p>The code and data are on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
<p>Part of an ongoing research project currently in peer review. The code and data are on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
<p id="generated"></p>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion security.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ <h3>DMARC</h3>
</div>
<div class="info-card">
<h3>Open source &amp; open data</h3>
<p>The code and data are on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
<p>Part of an ongoing research project currently in peer review. The code and data are on <a href="https://github.com/davidhuser/paper-municipality-emails" target="_blank">GitHub</a>.</p>
<p id="generated"></p>
</div>
</div>
Expand Down