Skip to content

Commit 19798b3

Browse files
authored
Merge branch 'internetstandards:main' into main
2 parents 611b13e + 6fbee2b commit 19798b3

File tree

5 files changed

+155
-44
lines changed

5 files changed

+155
-44
lines changed

Changelog.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@ _Compared to the latest 1.10 release._
2020

2121
- ...
2222

23+
## 1.10.5
24+
25+
- Fixed an issue in 1.10.x where [DNSSEC test could return false negatives](https://github.com/internetstandards/Internet.nl/issues/1869)
26+
due to an interaction between cached responses and the CD and AD flags.
27+
- Added news post.
28+
2329
## 1.10.4
2430

2531
- Updated our security.txt.
26-
- Updated Django
32+
- Updated Django version.
2733

2834
## 1.10.3
2935

checks/resolver.py

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44
import dns
55
from django.conf import settings
66
from dns.edns import EDECode
7-
from dns.exception import ValidationFailure
87
from dns.flags import Flag, EDNSFlag
98
from dns.message import Message, make_query
109
from dns.query import udp_with_fallback
1110
from dns.rdatatype import RdataType
1211
from dns.rdtypes.ANY import TLSA, CAA
13-
from dns.resolver import Resolver, NXDOMAIN, NoAnswer
12+
from dns.resolver import Resolver, NXDOMAIN, NoAnswer, NoNameservers
1413
import socket
1514

1615
DNS_TIMEOUT = 5
@@ -41,44 +40,44 @@ def from_message(cls, message: Message):
4140
return cls(DNSSECStatus.INSECURE)
4241

4342

44-
def dns_resolve_a(qname: str, allow_bogus=True) -> list[str]:
45-
rrset, dnssec_status = dns_resolve(qname, RdataType.A, allow_bogus)
43+
def dns_resolve_a(qname: str) -> list[str]:
44+
rrset, dnssec_status = dns_resolve(qname, RdataType.A)
4645
return [rr.address for rr in rrset]
4746

4847

49-
def dns_resolve_aaaa(qname: str, allow_bogus=True) -> list[str]:
50-
rrset, dnssec_status = dns_resolve(qname, RdataType.AAAA, allow_bogus)
48+
def dns_resolve_aaaa(qname: str) -> list[str]:
49+
rrset, dnssec_status = dns_resolve(qname, RdataType.AAAA)
5150
return [rr.address for rr in rrset]
5251

5352

54-
def dns_resolve_mx(qname: str, allow_bogus=True) -> list[tuple[str, int]]:
55-
rrset, dnssec_status = dns_resolve(qname, RdataType.MX, allow_bogus)
53+
def dns_resolve_mx(qname: str) -> list[tuple[str, int]]:
54+
rrset, dnssec_status = dns_resolve(qname, RdataType.MX)
5655
return [(str(rr.exchange), rr.preference) for rr in rrset]
5756

5857

59-
def dns_resolve_ns(qname: str, allow_bogus=True) -> list[str]:
60-
rrset, dnssec_status = dns_resolve(qname, RdataType.NS, allow_bogus)
58+
def dns_resolve_ns(qname: str) -> list[str]:
59+
rrset, dnssec_status = dns_resolve(qname, RdataType.NS)
6160
return [str(rr.target) for rr in rrset]
6261

6362

64-
def dns_resolve_tlsa(qname: str, allow_bogus=True) -> tuple[list[TLSA], DNSSECStatus]:
65-
rrset, dnssec_status = dns_resolve(qname, RdataType.TLSA, allow_bogus)
63+
def dns_resolve_tlsa(qname: str) -> tuple[list[TLSA], DNSSECStatus]:
64+
rrset, dnssec_status = dns_resolve(qname, RdataType.TLSA, guarantee_accurate_secure=True)
6665
return rrset, dnssec_status
6766

6867

69-
def dns_resolve_txt(qname: str, allow_bogus=True) -> list[str]:
70-
rrset, dnssec_status = dns_resolve(qname, RdataType.TXT, allow_bogus)
68+
def dns_resolve_txt(qname: str) -> list[str]:
69+
rrset, dnssec_status = dns_resolve(qname, RdataType.TXT)
7170
return ["".join([dns.rdata._escapify(s) for s in rr.strings]) for rr in rrset]
7271

7372

74-
def dns_resolve_spf(qname: str, allow_bogus=True) -> Optional[str]:
75-
strings = dns_resolve_txt(qname, allow_bogus)
73+
def dns_resolve_spf(qname: str) -> Optional[str]:
74+
strings = dns_resolve_txt(qname)
7675
spf_records = [s for s in strings if s.lower().startswith("v=spf1")]
7776
return spf_records[0] if len(spf_records) == 1 else None
7877

7978

80-
def dns_resolve_soa(qname: str, allow_bogus=True, raise_on_no_answer=True) -> DNSSECStatus:
81-
rrset, dnssec_status = dns_resolve(qname, RdataType.SOA, allow_bogus, raise_on_no_answer)
79+
def dns_resolve_soa(qname: str, raise_on_no_answer=True) -> DNSSECStatus:
80+
rrset, dnssec_status = dns_resolve(qname, RdataType.SOA, raise_on_no_answer, guarantee_accurate_secure=True)
8281
return dnssec_status
8382

8483

@@ -89,7 +88,9 @@ def dns_resolve_caa(qname: str) -> tuple[str, Iterable[CAA.CAA]]:
8988
"""
9089
while True:
9190
try:
92-
answer = _get_resolver().resolve(dns.name.from_text(qname), RdataType.CAA, raise_on_no_answer=True)
91+
answer = _get_resolver(cd_flag=True).resolve(
92+
dns.name.from_text(qname), RdataType.CAA, raise_on_no_answer=True
93+
)
9394
return str(answer.canonical_name), answer.rrset
9495
except (NoAnswer, NXDOMAIN):
9596
qname = dns_climb_tree(qname)
@@ -98,7 +99,7 @@ def dns_resolve_caa(qname: str) -> tuple[str, Iterable[CAA.CAA]]:
9899

99100

100101
def dns_resolve_reverse(ipaddr: str) -> list[str]:
101-
answer = _get_resolver().resolve_address(ipaddr)
102+
answer = _get_resolver(cd_flag=True).resolve_address(ipaddr)
102103
return [rr.to_text() for rr in answer.rrset]
103104

104105

@@ -111,11 +112,32 @@ def dns_check_ns_connectivity(probe_qname: str, target_ip: str, port: int = 53)
111112
return False
112113

113114

114-
def dns_resolve(qname: str, rr_type: RdataType, allow_bogus=True, raise_on_no_answer=True):
115-
answer = _get_resolver().resolve(dns.name.from_text(qname), rr_type, raise_on_no_answer=raise_on_no_answer)
116-
dnssec_status = DNSSECStatus.from_message(answer.response)
117-
if dnssec_status == DNSSECStatus.BOGUS and not allow_bogus:
118-
raise ValidationFailure()
115+
def dns_resolve(qname: str, rr_type: RdataType, raise_on_no_answer=True, guarantee_accurate_secure=False):
116+
"""
117+
Resolve the provided qname/record type.
118+
Returns the RRset and the DNSSEC status, with a caveat.
119+
120+
raise_on_no_answer: if True, raises NoAnswer for no answer, if False, no exception raised
121+
122+
guarantee_accurate_secure:
123+
Certain caching scenarios may lead us to falsely mark a response as insecure, when it is secure,
124+
due to a missing AD bit when a response for the same qname was cached to resolve a different query,
125+
in combination with our CD flag.
126+
This is OK in most cases, but when it is not, we need to do a double query to prevent this,
127+
enabled with guarantee_accurate_secure=True.
128+
https://github.com/internetstandards/Internet.nl/issues/1869
129+
"""
130+
resolve_params = {"qname": dns.name.from_text(qname), "rdtype": rr_type, "raise_on_no_answer": raise_on_no_answer}
131+
if guarantee_accurate_secure:
132+
try:
133+
answer = _get_resolver(cd_flag=False).resolve(**resolve_params)
134+
dnssec_status = DNSSECStatus.from_message(answer.response)
135+
except NoNameservers: # dnspython's translation for servfail
136+
answer = _get_resolver(cd_flag=True).resolve(**resolve_params)
137+
dnssec_status = DNSSECStatus.BOGUS
138+
else:
139+
answer = _get_resolver(cd_flag=True).resolve(**resolve_params)
140+
dnssec_status = DNSSECStatus.from_message(answer.response)
119141
return answer.rrset, dnssec_status
120142

121143

@@ -126,22 +148,29 @@ def dns_climb_tree(qname: str) -> Optional[str]:
126148
return parent.to_text()
127149

128150

129-
_resolver = None
151+
_resolver_without_cd = None
152+
_resolver_with_cd = None
130153

131154

132-
def _get_resolver():
155+
def _get_resolver(cd_flag: bool):
133156
# Resolvers are thread safe once configured
134-
global _resolver
135-
if not _resolver:
136-
_resolver = _create_resolver()
137-
return _resolver
138-
139-
140-
def _create_resolver() -> Resolver:
157+
global _resolver_with_cd
158+
if not _resolver_with_cd:
159+
_resolver_with_cd = _create_resolver(cd_flag=True)
160+
global _resolver_without_cd
161+
if not _resolver_without_cd:
162+
_resolver_without_cd = _create_resolver(cd_flag=False)
163+
if cd_flag:
164+
return _resolver_with_cd
165+
return _resolver_without_cd
166+
167+
168+
def _create_resolver(cd_flag: bool) -> Resolver:
141169
resolver = Resolver(configure=False)
142170
resolver.nameservers = [socket.gethostbyname(settings.RESOLVER_INTERNAL_VALIDATING)]
143171
resolver.edns = True
144-
resolver.flags = Flag.CD
172+
if cd_flag:
173+
resolver.flags = Flag.CD
145174
resolver.ednsflags = EDNSFlag.DO
146175
resolver.lifetime = DNS_TIMEOUT
147176
return resolver

translations/en/main.po

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
1111
"POT-Creation-Date: 2015-02-16 23:27+0100\n"
12-
"PO-Revision-Date: 2025-06-08 18:07:12.983915\n"
12+
"PO-Revision-Date: 2025-10-03 10:27:32.303872\n"
1313
"Last-Translator: \n"
1414
"Language-Team: \n"
1515
"Language: \n"
@@ -1923,6 +1923,9 @@ msgstr "Error: Invalid 'contactemail' value \"{property_value}\""
19231923
msgid "detail tech data caa invalid-property-contactphone-value"
19241924
msgstr "Error: Invalid 'contactphone' value \"{property_value}\""
19251925

1926+
msgid "detail tech data caa invalid-property-encoding"
1927+
msgstr "Error: Invalid encoding in '{property_name}'"
1928+
19261929
msgid "detail tech data caa invalid-property-iodef-value"
19271930
msgstr "Error: Invalid 'iodef' value \"{property_value}\""
19281931

@@ -1935,9 +1938,6 @@ msgstr ""
19351938
"{invalid_character_position} in '{property_name}' value \"{property_value}\""
19361939
" "
19371940

1938-
msgid "detail tech data caa invalid-property-encoding"
1939-
msgstr "Error: Invalid encoding in '{property_name}'"
1940-
19411941
msgid "detail tech data caa invalid-reserved-property"
19421942
msgstr "Error: Invalid reserved property \"{property_tag}\""
19431943

translations/nl/main.po

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
1111
"POT-Creation-Date: 2015-02-16 23:27+0100\n"
12-
"PO-Revision-Date: 2025-06-08 18:07:12.857023\n"
12+
"PO-Revision-Date: 2025-10-03 10:27:32.187405\n"
1313
"Last-Translator: \n"
1414
"Language-Team: \n"
1515
"Language: \n"
@@ -1932,6 +1932,9 @@ msgstr "Fout: Ongeldige 'contactemail'-waarde \"{property_value}\""
19321932
msgid "detail tech data caa invalid-property-contactphone-value"
19331933
msgstr "Fout: Ongeldige 'contactphone'-waarde \"{property_value}\""
19341934

1935+
msgid "detail tech data caa invalid-property-encoding"
1936+
msgstr "Fout: Ongeldige encoding in '{property_name}'"
1937+
19351938
msgid "detail tech data caa invalid-property-iodef-value"
19361939
msgstr "Fout: Ongeldige 'iodef'-waarde \"{property_value}\""
19371940

@@ -1944,9 +1947,6 @@ msgstr ""
19441947
"{invalid_character_position} in '{property_name}'-waarde "
19451948
"\"{property_value}\""
19461949

1947-
msgid "detail tech data caa invalid-property-encoding"
1948-
msgstr "Fout: Ongeldige encoding in '{property_name}'"
1949-
19501950
msgid "detail tech data caa invalid-reserved-property"
19511951
msgstr "Fout: Ongeldige gereserveerde property \"{property_tag}\""
19521952

translations/nl/news.po

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ msgstr ""
44

55
msgid "article .index"
66
msgstr ""
7+
"plis-meeting-sept-2025\n"
78
"release-1.10\n"
89
"release-1.9\n"
910
"terugblik-10-jarig-jubileum\n"
@@ -1146,6 +1147,81 @@ msgstr ""
11461147
msgid "article paneldiscussie-the-power-of-internet-standards title"
11471148
msgstr "Paneldiscussie: The Power of Internet Standards"
11481149

1150+
msgid "article plis-meeting-sept-2025 body"
1151+
msgstr ""
1152+
"## Introductie van ECP\n"
1153+
"Céline van der Kruk, hoofd Communicatie bij ECP, gaf een introductie van ECP, de administratieve basis van het Platform Internetstandaarden.\n"
1154+
" \n"
1155+
"[ECP](https://ecp.nl/) is een onafhankelijk en neutraal platform dat publiek-private samenwerking organiseert rondom uiteenlopende digitaliseringsthema’s, waaronder digitale veiligheid en vertrouwen. ECP voert jaarlijks tientallen projecten uit en werkt hierbij samen met honderden partners.\n"
1156+
" \n"
1157+
"Daarnaast organiseert ECP veel evenementen. Op de agenda voor dit jaar staan bijvoorbeeld nog de [kick-off van de Cybersecuritymaand](https://alertonline.veiliginternetten.nl/dit-doet-ons-netwerk/kick-off-cybersecuritymaand/) (oktober) door Alert Online op 29 september, het [ECP Jaarfestival](https://ecp.nl/ecp-jaarfestival/) op 20 november en de ECP Eindejaarssociëteit in december. Ook biedt ECP ondersteuning bij de organisatie van de [ONE Conference](https://one-conference.nl/) op 30 september en 1 oktober.\n"
1158+
" \n"
1159+
"Het Platform Internetstandaarden test regelmatig of websites, e-mail en internetverbindingen van bezoekers aan ECP-evenementen voldoen aan moderne internetstandaarden. Ook delen we nieuws van het platform in de ECP-nieuwsbrieven. We zijn op zoek naar hoe we de samenwerking tussen het platform en ECP nog verder kunnen versterken. Ideeën zijn altijd welkom!\n"
1160+
"\n"
1161+
"## Update over MANRS\n"
1162+
"Andrei Robachevsky, Technical Director van het Internet Integrity program van de Global Cyber Alliance (GCA), gaf een update over MANRS.\n"
1163+
"\n"
1164+
"[Mutually Agreed Norms for Routing Security (MANRS)](https://manrs.org/) is een wereldwijd initiatief dat het internet helpt beschermen tegen de meest voorkomende routing-bedreigingen. Dit initiatief werd in 2014 opgezet door de Internet Society, die het secretariaat en de operationele taken in januari 2024 heeft overgedragen aan de Global Cyber Alliance (GCA).\n"
1165+
"\n"
1166+
"MANRS biedt basiseisen, ‘acties’ genoemd, die zijn georganiseerd in [programma’s](https://manrs.org/programs/) voor verschillende doelgroepen. Het begon met een programma voor Network Operators en is later uitgebreid met programma’s voor Internet Exchange Points, CDN en Cloud Providers en Equipment Vendors.\n"
1167+
"\n"
1168+
"Deelnemers aan MANRS verbinden zich aan het uitvoeren van de acties, waarbij de juiste implementatie wordt gemeten en gepubliceerd via het [MANRS Observatory](https://observatory.manrs.org/#/overview). De community groeit al jaren gestaag: wereldwijd doen inmiddels meer dan 1.200 organisaties mee.\n"
1169+
"\n"
1170+
"Er wordt gewerkt aan [MANRS+](https://manrs.org/about/manrs-working-group/), een initiatief dat is opgezet om tegemoet te komen aan de wensen van ondernemingen voor betere beveiliging van internetverkeer. Zo kunnen organisaties bijvoorbeeld hun communicatieketen beter beschermen en makkelijker kiezen voor aanbieders die actief werk maken van veilige internetroutes door MANRS+ te ondersteunen.\n"
1171+
"\n"
1172+
"De MANRS+ werkgroep heeft al een overzicht van [maatregelen](https://manrs.org/wp-content/uploads/2025/02/MANRS-Controls-20250204.pdf) opgesteld en in samenwerking met SIDN Labs een eerste [prototype](https://manrs.org/2025/09/manrs-assessing-the-feasibility-of-routing-security-compliance-tests/) ontwikkeld om te testen of aanbieders aan deze eisen voldoen. Er worden nu organisaties gezocht die willen meedoen aan een praktijkproef. Ook wordt nagedacht over een nieuw programma, speciaal voor zakelijke gebruikers die hoge eisen stellen aan routingveiligheid.\n"
1173+
"\n"
1174+
"Ten slotte is het proces voor het ontwikkelen en wijzigen van MANRS-standaarden officieel vastgelegd. Dit [MANRS Development Process](https://manrs.org/manrs-development-process/) is een bottom-up, op consensus gebaseerd proces, waaraan alle leden van de MANRS-community kunnen bijdragen. Het proces is ook gebruikt om het [MANRS Community Charter](https://manrs.org/about/governance/community-charter/) te actualiseren.\n"
1175+
"\n"
1176+
"## Terugblik en vooruitblik op evenementen\n"
1177+
"De vorige bijeenkomst van het Platform Internetstandaarden vond plaats op 19 juni 2025 bij SURF in Utrecht. Sindsdien waren platformleden actief bij diverse externe evenementen, als organisator, spreker of bezoeker.\n"
1178+
"\n"
1179+
"Alena Muravska (RIPE NCC) nam deel aan IGF 2025 op 24 juni in Lillestrøm, Noorwegen, waar zij bijdroeg aan de [lancering van de Global Internet Standards Testing Community (GISTC)](https://intgovforum.org/en/content/igf-2025-launch-award-event-96-empower-the-global-internet-standards-testing-community).\n"
1180+
"\n"
1181+
"Elger Jonker (Internet.nl) en Benjamin Broersma (Forum Standaardisatie) waren aanwezig bij WHY2025 van 8 tot 12 augustus 2025 in Geestmerambacht. Elger verzorgde de sessie ‘[How we made the Netherlands more secure and accessible using transparency](https://program.why2025.org/why2025/talk/3ZMKFQ/)’, Benjamin gaf de sessie ‘[How (not) to configure your domainname [internet.nl]](https://program.why2025.org/why2025/talk/XVET7C/)’.\n"
1182+
"\n"
1183+
"Aan de [Dag van de Domeinnaam 2025](https://www.verenigingvanregistrars.nl/dag-van-de-domeinnaam/) op 16 september in Amsterdam namen Benjamin Broersma en Marco Hogewoning (Ministerie van Economische Zaken) deel. Dit jaar waren er voor het eerst mini-interviews met experts uit het veld, waaraan Benjamin deelnam namens het Platform Internetstandaarden. Ook is gemeten of de websites, e-mail en internetverbindingen van bezoekers voldeden aan moderne internetstandaarden.\n"
1184+
"\n"
1185+
"Vooruitkijkend staan er ook weer belangrijke evenementen op de agenda, zoals [OARC 43](https://indico.dns-oarc.net/event/51/) (26 en 27 september), [NLNOG Day 2025](https://nlnog.net/nlnog-day-2025/) (30 september), [ONE Conference](https://one-conference.nl/) (30 september en 1 oktober), [SEEDIG 10](https://seedig.net/seedig-10/) (10 en 11 oktober), [ICANN84](https://meetings.icann.org/en/meetings/icann84/) (25 tot 30 oktober), [RIPE 91](https://www.ripe.net/meetings/calendar/ripe-91/) (20 tot 24 oktober) en [IETF 124](https://www.ietf.org/meeting/124/) (1 tot 7 november).\n"
1186+
"\n"
1187+
"## Ontwikkelingen rond Internet.nl\n"
1188+
"Benjamin Broersma, adviseur bij Forum Standaardisatie, en Elger Jonker, ontwikkelaar van het Internet.nl-dashboard, gaven een update over actuele ontwikkelingen rond Internet.nl.\n"
1189+
"\n"
1190+
"Belangrijke ontwikkelingen voor de website en de API zijn de implementatie van de nieuwe [ICT-beveiligingsrichtlijnen voor Transport Layer Security (TLS)](https://www.ncsc.nl/documenten/publicaties/2025/juni/01/ict-beveiligingsrichtlijnen-voor-transport-layer-security-2025-05) van het NCSC, een [vernieuwd ontwerp van de website](https://dev3.internet.nl/) en de overname van [Have DANE?](https://havedane.net/).\n"
1191+
"\n"
1192+
"Voor het dashboard zijn de verbeterde stabiliteit en integratie van de nieuwe subtest voor [Certification Authority Authorization (CAA)](https://internet.nl/faqs/https/) belangrijke ontwikkelingen. Ook is het dashboard nu via een API benaderbaar.\n"
1193+
"\n"
1194+
"## Standardisation with Chinese Characteristics?\n"
1195+
"Alexandre Ferreira Gomes, hoofdauteur van het rapport '[Standardisation with Chinese Characteristics?](https://www.chinakennisnetwerk.nl/publications/standardisation-chinese-characteristics)' van het China Knowledge Network en het Clingendael Instituut, gaf een presentatie over de belangrijkste bevindingen uit het rapport.\n"
1196+
"\n"
1197+
"De invloed van China in internationale standaardisatie groeit, iets wat de aanwezigen ook merken. Men heeft zowel de kwaliteit van Chinese bijdragen zien toenemen, als het volume. Het grote volume zorgt ervoor dat het onmogelijk is om bij te blijven. Prioriteren is noodzakelijk.\n"
1198+
"\n"
1199+
"Het rapport roept op tot langdurige betrokkenheid en vroege inzet van de Europese Unie en haar lidstaten, vanwege de geopolitieke betekenis van standaardisatie. Een illustratief citaat uit het rapport is: ‘Third-tier companies make products; second-tier companies make technology; first-tier companies make standards’. Vervang ‘companies’ door ‘countries’ en je ziet waarom investeren in standaarden zo belangrijk is.\n"
1200+
"\n"
1201+
"## En verder…\n"
1202+
"Verder is teruggeblikt op de vorige bijeenkomst, is stilgestaan bij het jaarplan en de bijdragen voor 2026, zijn de plannen voor de volgende bijeenkomst besproken en werd de [certificatenregen van de Internet Cleanup Foundation](https://internetcleanup.foundation/2025/06/aankondiging-certificatenregen-22-tot-26-september-2025/) aangekondigd. Er werd afgesloten met een borrel.\n"
1203+
" \n"
1204+
"Geïnteresseerd in de onderwerpen waarover het Platform Internetstandaarden spreekt?\n"
1205+
"Voor meer informatie over moderne internetstandaarden of activiteiten van het Platform Internetstandaarden, volg ons op [LinkedIn](https://www.linkedin.com/company/internet-nl/) of [Mastodon](https://mastodon.nl/@internet_nl)."
1206+
1207+
msgid "article plis-meeting-sept-2025 date"
1208+
msgstr "1 oktober 2025"
1209+
1210+
msgid "article plis-meeting-sept-2025 lead"
1211+
msgstr ""
1212+
"Op donderdag 18 september kwam het Platform Internetstandaarden samen voor "
1213+
"de derde bijeenkomst van dit jaar. De bijeenkomst vond plaats bij ECP | "
1214+
"Platform voor de InformatieSamenleving in Den Haag, waar het platform "
1215+
"gastvrij werd ontvangen. Op de agenda stonden onder andere een introductie "
1216+
"van ECP, een update over MANRS, een terugblik en vooruitblik op evenementen,"
1217+
" ontwikkelingen rond Internet.nl en een presentatie van het rapport "
1218+
"‘Standardisation with Chinese Characteristics?’ van CKN en Clingendael. "
1219+
"Gerben Klein Baltink zat de bijeenkomst voor, waaraan in totaal 16 "
1220+
"deelnemers meededen."
1221+
1222+
msgid "article plis-meeting-sept-2025 title"
1223+
msgstr "Terugblik Platform Internetstandaarden bijeenkomst 18 september 2025"
1224+
11491225
msgid "article release-1.10 body"
11501226
msgstr ""
11511227
"## Wat is CAA?\n"

0 commit comments

Comments
 (0)