-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsecurity.html
More file actions
129 lines (129 loc) · 6.38 KB
/
Copy pathsecurity.html
File metadata and controls
129 lines (129 loc) · 6.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<!DOCTYPE html>
<!--
TopoJSON sources:
- CH: swiss-maps (https://github.com/interactivethings/swiss-maps), CC BY 4.0 swisstopo
- AT: GeoJSON-TopoJSON-Austria (https://github.com/ginseng666/GeoJSON-TopoJSON-Austria), CC BY 4.0 Statistik Austria
- DE: BKG VG250 via B42Labs/mxmap (https://github.com/B42Labs/mxmap), © GeoBasis-DE / BKG
-->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="preconnect" href="https://unpkg.com" crossorigin>
<link rel="preconnect" href="https://a.basemaps.cartocdn.com" crossorigin>
<link rel="preconnect" href="https://b.basemaps.cartocdn.com" crossorigin>
<link rel="preconnect" href="https://c.basemaps.cartocdn.com" crossorigin>
<link rel="preconnect" href="https://d.basemaps.cartocdn.com" crossorigin>
<title>Email Security of DACH Municipalities</title>
<meta name="description" content="Interactive map showing email security (SPF, DMARC) of ~15,300 municipalities in Germany, Austria, and Switzerland.">
<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/map.css">
<link rel="preload" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"></noscript>
<script defer src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script defer src="https://unpkg.com/topojson-client@3/dist/topojson-client.min.js"></script>
<script defer src="js/nav.js"></script>
<script defer src="js/map-shared.js"></script>
<script defer src="js/map-security.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>
<div class="header-right">
<button class="toggle-info" id="toggle-info" aria-expanded="true" aria-controls="info-bar">About ▴</button>
</div>
</header>
<section id="info-bar" aria-label="About this project">
<script>if(window.innerWidth<=600)document.getElementById('info-bar').classList.add('collapsed');</script>
<h2 class="info-title">Email Security of DACH Municipalities</h2>
<div class="info-grid">
<div class="info-card">
<h3>What is this?</h3>
<p>A map of ~15,300 municipalities in Germany, Austria, and Switzerland showing how well their email domains are protected against spoofing, based on SPF and DMARC configuration.</p>
</div>
<div class="info-card">
<h3>SPF</h3>
<p>Sender Policy Framework defines which mail servers are authorized to send email for a domain. "Good" means the record uses a hard fail (<code>-all</code>) policy, rejecting unauthorized senders.</p>
</div>
<div class="info-card">
<h3>DMARC</h3>
<p>Domain-based Message Authentication, Reporting & Conformance tells receivers what to do with unauthenticated mail. "Good" means the policy is set to <code>p=reject</code>.</p>
</div>
<div class="info-card">
<h3>Open source & open data</h3>
<p>Part of an ongoing research project. The code and data are on <a href="https://github.com/mxmap/secassure2026" target="_blank">GitHub</a>.</p>
<p id="generated"></p>
</div>
</div>
</section>
<main id="map" role="application" aria-label="Interactive map of DACH municipality email security">
<div id="map-loading" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000;background:rgba(255,255,255,0.85);font-size:15px;color:#555;">Loading map data…</div>
</main>
<script>
document.addEventListener('DOMContentLoaded', function () {
loadSecurityMap(
{ center: [49, 10.5], zoom: 6, minZoom: 4 },
[
{
label: 'Germany',
topoUrl: 'topo/de-gemeinden.json',
dataUrl: 'output/security/security_de.json',
topoObject: 'VG250_GEM',
featureCodeFn: function(f) { return String(f.id); },
REGION_CODES: {
'Schleswig-Holstein': 'SH', 'Hamburg': 'HH', 'Niedersachsen': 'NI',
'Bremen': 'HB', 'Nordrhein-Westfalen': 'NW', 'Hessen': 'HE',
'Rheinland-Pfalz': 'RP', 'Baden-Württemberg': 'BW', 'Bayern': 'BY',
'Saarland': 'SL', 'Berlin': 'BE', 'Brandenburg': 'BB',
'Mecklenburg-Vorpommern': 'MV', 'Sachsen': 'SN', 'Sachsen-Anhalt': 'ST',
'Thüringen': 'TH'
},
},
{
label: 'Austria',
topoUrl: 'topo/at-gemeinden.json',
dataUrl: 'output/security/security_at.json',
topoObject: 'gemeinden',
featureCodeFn: function(f) {
var iso = String(f.id || (f.properties && f.properties.iso) || '');
if (iso !== '90001' && iso.startsWith('9')) return '90001';
return iso;
},
REGION_CODES: {
'Burgenland': 'B', 'Kärnten': 'K', 'Niederösterreich': 'NÖ',
'Oberösterreich': 'OÖ', 'Salzburg': 'S', 'Steiermark': 'ST',
'Tirol': 'T', 'Vorarlberg': 'V', 'Wien': 'W'
},
},
{
label: 'Switzerland',
topoUrl: 'https://unpkg.com/swiss-maps@4.7.0/2026/ch-combined.json',
dataUrl: 'output/security/security_ch.json',
topoObject: 'municipalities',
featureCodeFn: function(f) { return String(f.id); },
REGION_CODES: {
'Kanton Zürich': 'ZH', 'Kanton Bern': 'BE', 'Kanton Luzern': 'LU',
'Kanton Uri': 'UR', 'Kanton Schwyz': 'SZ', 'Kanton Obwalden': 'OW',
'Kanton Nidwalden': 'NW', 'Kanton Glarus': 'GL', 'Kanton Zug': 'ZG',
'Kanton Freiburg': 'FR', 'Kanton Solothurn': 'SO', 'Kanton Basel-Stadt': 'BS',
'Kanton Basel-Landschaft': 'BL', 'Kanton Schaffhausen': 'SH',
'Kanton Appenzell Ausserrhoden': 'AR', 'Kanton Appenzell Innerrhoden': 'AI',
'Kanton St. Gallen': 'SG', 'Kanton Graubünden': 'GR', 'Kanton Aargau': 'AG',
'Kanton Thurgau': 'TG', 'Kanton Tessin': 'TI', 'Kanton Waadt': 'VD',
'Kanton Wallis': 'VS', 'Kanton Neuenburg': 'NE', 'Kanton Genf': 'GE',
'Kanton Jura': 'JU'
},
}
]
).catch(handleLoadError);
});
</script>
</body>
</html>