i18n: prepare translation of about pages

This commit is contained in:
Vincent Breitmoser 2019-09-30 12:53:20 +02:00
parent 6236d3bf40
commit cdc1afb6d1
No known key found for this signature in database
GPG Key ID: 7BD18320DEADFA11
19 changed files with 1224 additions and 270 deletions

View File

@ -9,3 +9,45 @@ trans.None = po/hagrid/hagrid.pot
trans.de = po/hagrid/de.po
type = PO
[hagrid.about-about]
minimum_perc = 100
source_file = templates-untranslated/about/about.html.hbs
file_filter = templates-translated/<lang>/about/about.html.hbs
source_lang = en
type = HTML
[hagrid.about-faq]
minimum_perc = 100
source_file = templates-untranslated/about/faq.html.hbs
file_filter = templates-translated/<lang>/about/faq.html.hbs
source_lang = en
type = HTML
[hagrid.about-news]
minimum_perc = 100
source_file = templates-untranslated/about/news.html.hbs
file_filter = templates-translated/<lang>/about/news.html.hbs
source_lang = en
type = HTML
[hagrid.about-privacy]
minimum_perc = 100
source_file = templates-untranslated/about/privacy.html.hbs
file_filter = templates-translated/<lang>/about/privacy.html.hbs
source_lang = en
type = HTML
[hagrid.about-stats]
minimum_perc = 100
source_file = templates-untranslated/about/stats.html.hbs
file_filter = templates-translated/<lang>/about/stats.html.hbs
source_lang = en
type = HTML
[hagrid.about-usage]
minimum_perc = 100
source_file = templates-untranslated/about/usage.html.hbs
file_filter = templates-translated/<lang>/about/usage.html.hbs
source_lang = en
type = HTML

View File

@ -305,5 +305,5 @@
<p>
Cheers!
<span style="font-size: x-large;">🍻</span>
</div>
{{/layout}}

View File

@ -31,4 +31,3 @@
</p>
</div>
{{/layout}}

View File

@ -1,5 +1,4 @@
{{#> layout }}
{{#with page}}
<div class="about usage">
<center><h2><a href="/about">About</a> | <a href="/about/news">News</a> | Usage | <a href="/about/faq">FAQ</a> | <a href="/about/stats">Stats</a> | <a href="/about/privacy">Privacy</a></h2></center>
@ -94,7 +93,7 @@
You can try this shortcut for uploading your key, which outputs
a direct link to the verification page:
<blockquote>
gpg --export your_address@example.net | curl -T - {{ ../base_uri }}
gpg --export your_address@example.net | curl -T - {{ base_uri }}
</blockquote>
</li>
<li>
@ -157,5 +156,4 @@
</p>
</div>
{{/with}}
{{/layout}}

View File

@ -25,7 +25,7 @@
<hr />
<p>
<strong>{{ text "News:" }}</strong> <a href="/about/news#2019-09-12-three-months-later">Three months after launch ✨</a> (2019-09-12)
<strong>{{ text "News:" }}</strong> {{ text "<a href=\"/about/news#2019-09-12-three-months-later\">Three months after launch ✨</a> (2019-09-12)" }}
</p>
{{/with}}
{{/layout}}

13
make-translated-templates Executable file
View File

@ -0,0 +1,13 @@
#!/bin/zsh
for i in dist/templates-translated/**/*.hbs; do
local template_path=${${i#dist/templates-translated/}:h}
if [[ ! -d dist/templates/localized/$template_path ]]; then
echo mkdir -p dist/templates/localized/$template_path/
mkdir -p dist/templates/localized/$template_path/
fi
echo "cat ${i:h}/template-prefix $i ${i:h}/template-suffix >! dist/templates/localized/$template_path/${i:t}"
cat ${i:h}/template-prefix $i ${i:h}/template-suffix >! dist/templates/localized/$template_path/${i:t}
done

View File

@ -15,15 +15,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/mail.rs:105
#: src/mail.rs:104
msgid "Verify {} for your key on {}"
msgstr "Bestätige {} für deinen Schlüssel auf {}"
#: src/mail.rs:132
#: src/mail.rs:131
msgid "Manage your key on {}"
msgstr "Schlüssel-Verwaltung auf {}"
#: src/mail.rs:159
#: src/mail.rs:158
msgid "Your key upload on {}"
msgstr "Hochgeladener Schlüssel auf {}"
@ -82,14 +82,20 @@ msgid "News:"
msgstr "News:"
#: src/gettext_strings.rs:15
msgid ""
"<a href=\"/about/news#2019-09-12-three-months-later\">Three months after "
"launch ✨</a> (2019-09-12)"
msgstr ""
#: src/gettext_strings.rs:16
msgid "v{{ version }} built from"
msgstr "v{{ version }}, Revision"
#: src/gettext_strings.rs:16
#: src/gettext_strings.rs:17
msgid "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
msgstr "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
#: src/gettext_strings.rs:17
#: src/gettext_strings.rs:18
msgid ""
"Background image retrieved from <a href=\"https://www.toptal.com/designers/"
"subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0"
@ -97,23 +103,23 @@ msgstr ""
"Hintergrund von <a href=\"https://www.toptal.com/designers/subtlepatterns/"
"subtle-grey/\">Subtle Patterns</a> unter CC BY-SA 3.0"
#: src/gettext_strings.rs:18
#: src/gettext_strings.rs:19
msgid "Maintenance Mode"
msgstr "Wartungsarbeiten"
#: src/gettext_strings.rs:19
#: src/gettext_strings.rs:20
msgid "Manage your key"
msgstr "Schlüssel verwalten"
#: src/gettext_strings.rs:20
#: src/gettext_strings.rs:21
msgid "Enter any verified e-mail address of your key"
msgstr "Eine Adresse des zu verwaltenden Schlüssels"
#: src/gettext_strings.rs:21
#: src/gettext_strings.rs:22
msgid "Send link"
msgstr "Sende Link"
#: src/gettext_strings.rs:22
#: src/gettext_strings.rs:23
msgid ""
"We will send you an e-mail with a link you can use to remove any of your e-"
"mail addresses from search."
@ -121,7 +127,7 @@ msgstr ""
"Du wirst eine E-Mail mit einem Link erhalten, der es erlaubt, Adressen aus "
"der Suche zu entfernen."
#: src/gettext_strings.rs:23
#: src/gettext_strings.rs:24
msgid ""
"Managing the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
@ -129,15 +135,15 @@ msgstr ""
"Verwaltung des Schlüssels <span class=\"fingerprint\"><a href="
"\"{{ key_link }}\" target=\"_blank\">{{ key_fpr }}</a></span>."
#: src/gettext_strings.rs:24
#: src/gettext_strings.rs:25
msgid "Your key is published with the following identity information:"
msgstr "Dieser Schlüssel ist veröffentlicht mit diesen Identitäten:"
#: src/gettext_strings.rs:25
#: src/gettext_strings.rs:26
msgid "Delete"
msgstr ""
#: src/gettext_strings.rs:26
#: src/gettext_strings.rs:27
msgid ""
"Clicking \"delete\" on any address will remove it from this key. It will no "
"longer appear in a search.<br /> To add another address, <a href=\"/upload"
@ -147,7 +153,7 @@ msgstr ""
"entfernt werden. <br /> Um eine Adresse hinzuzufügen, muss der Schlüssel <a "
"href=\"/upload\">erneut hochgeladen</a> werden."
#: src/gettext_strings.rs:27
#: src/gettext_strings.rs:28
msgid ""
"Your key is published as only non-identity information. (<a href=\"/about\" "
"target=\"_blank\">what does this mean?</a>)"
@ -155,13 +161,13 @@ msgstr ""
"Dieser Schlüssel ist jetzt ohne Identitäts-Informationen veröffentlicht (<a "
"href=\"/about\" target=\"_blank\">was heisst das?</a>)"
#: src/gettext_strings.rs:28
#: src/gettext_strings.rs:29
msgid "To add an address, <a href=\"/upload\">upload</a> the key again."
msgstr ""
"Um eine Identität hinzuzufügen, lade den Schlüssel <a href=\"/upload"
"\">erneut hoch</a>."
#: src/gettext_strings.rs:29
#: src/gettext_strings.rs:30
msgid ""
"We have sent an email with further instructions to <span class=\"email"
"\">{{ address }}</span>."
@ -169,11 +175,11 @@ msgstr ""
"Eine E-Mail mit den nächsten Schritten wurde an <span class=\"email"
"\">{{ address }}</span> gesendet."
#: src/gettext_strings.rs:30
#: src/gettext_strings.rs:31
msgid "This address was already verified."
msgstr "Diese Adresse war bereits bestätigt."
#: src/gettext_strings.rs:31
#: src/gettext_strings.rs:32
msgid ""
"Your key <span class=\"fingerprint\">{{ key_fpr }}</span> is now published "
"for the identity <a href=\"{{userid_link}}\" target=\"_blank\"><span class="
@ -183,29 +189,29 @@ msgstr ""
"veröffentlicht mit der Identität <a href=\"{{userid_link}}\" target=\"_blank"
"\"><span class=\"email\">{{ userid }}</span></a>."
#: src/gettext_strings.rs:32
#: src/gettext_strings.rs:33
msgid "Verification failed! Perhaps the link you used was expired?"
msgstr ""
"Bei der Bestätigung ist ein Fehler aufgetreten! Vielleicht war das Zeitlimit "
"für den Link abgelaufen?"
#: src/gettext_strings.rs:33
#: src/gettext_strings.rs:34
msgid "You can <a href=\"/upload\">try uploading again</a>."
msgstr "Du kannst den Upload <a href=\"/upload\">erneut versuchen</a>."
#: src/gettext_strings.rs:34
#: src/gettext_strings.rs:35
msgid "Upload your key"
msgstr "Schlüssel hochladen"
#: src/gettext_strings.rs:35
#: src/gettext_strings.rs:36
msgid "Your public key"
msgstr "Dein Schlüssel"
#: src/gettext_strings.rs:36
#: src/gettext_strings.rs:37
msgid "Upload"
msgstr "Upload"
#: src/gettext_strings.rs:37
#: src/gettext_strings.rs:38
msgid ""
"Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and "
"<a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
@ -214,7 +220,7 @@ msgstr ""
"\">Übersicht</a> und <a target=\"_blank\" href=\"/about/usage"
"\">Nutzungshinweise</a>."
#: src/gettext_strings.rs:38
#: src/gettext_strings.rs:39
msgid ""
"You uploaded the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
@ -222,11 +228,11 @@ msgstr ""
"Schlüssel <span class=\"fingerprint\"><a href=\"{{ key_link }}\" target="
"\"_blank\">{{key_fpr}}</a></span> erfolgreich hochgeladen."
#: src/gettext_strings.rs:39
#: src/gettext_strings.rs:40
msgid "This key is revoked."
msgstr "Dieser Schlüssel ist widerrufen."
#: src/gettext_strings.rs:40
#: src/gettext_strings.rs:41
msgid ""
"It is published without identity information and can't be made available for "
"search by e-mail address"
@ -234,11 +240,11 @@ msgstr ""
"Er wird veröffentlicht ohne Identitäten, ist aber nicht für eine Suche nach "
"E-Mail Adresse verfügbar."
#: src/gettext_strings.rs:41
#: src/gettext_strings.rs:42
msgid "what does this mean?"
msgstr "was heisst das?"
#: src/gettext_strings.rs:42
#: src/gettext_strings.rs:43
msgid ""
"This key is now published with the following identity information (<a href="
"\"/about\" target=\"_blank\">what does this mean?</a>):"
@ -246,11 +252,11 @@ msgstr ""
"Dieser Schlüssel ist mit folgenden Identitäten veröffentlicht (<a href=\"/"
"about\" target=\"_blank\">was heisst das?</a>):"
#: src/gettext_strings.rs:43
#: src/gettext_strings.rs:44
msgid "Published"
msgstr "Veröffentlicht"
#: src/gettext_strings.rs:44
#: src/gettext_strings.rs:45
msgid ""
"This key is now published with only non-identity information (<a href=\"/"
"about\" target=\"_blank\">what does this mean?</a>)"
@ -258,7 +264,7 @@ msgstr ""
"Dieser Schlüssel ist jetzt ohne Identitäts-Informationen veröffentlicht (<a "
"href=\"/about\" target=\"_blank\">was heisst das?</a>)"
#: src/gettext_strings.rs:45
#: src/gettext_strings.rs:46
msgid ""
"To make the key available for search by e-mail address, you can verify it "
"belongs to you:"
@ -266,11 +272,11 @@ msgstr ""
"Um den Schlüssel für eine Suche per E-Mail Adresse verfügbar zu machen, muss "
"die entsprechende Adresse bestätigt werden:"
#: src/gettext_strings.rs:46
#: src/gettext_strings.rs:47
msgid "Verification Pending"
msgstr "Bestätigung wird erwartet"
#: src/gettext_strings.rs:47
#: src/gettext_strings.rs:48
msgid ""
"<strong>Note:</strong> Some providers delay e-mails for up to 15 minutes to "
"prevent spam. Please be patient."
@ -278,11 +284,11 @@ msgstr ""
"<strong>Hinweis:</strong> Manche Provider verzögern den Empfang von Emails "
"um bis zu 15 Minuten, um Spam zu verhindern. Bitte einen Moment Geduld."
#: src/gettext_strings.rs:48
#: src/gettext_strings.rs:49
msgid "Send Verification Mail"
msgstr "Bestätigungs-E-Mail senden"
#: src/gettext_strings.rs:49
#: src/gettext_strings.rs:50
msgid ""
"This key contains one identity that could not be parsed as an email address."
"<br /> This identity can't be published on <span class=\"brand\">keys."
@ -294,7 +300,7 @@ msgstr ""
"\">keys.openpgp.org</span> veröffentlicht werden. (<a href=\"/about/faq#non-"
"email-uids\" target=\"_blank\">warum?</a>)"
#: src/gettext_strings.rs:50
#: src/gettext_strings.rs:51
msgid ""
"This key contains {{ count_unparsed }} identities that could not be parsed "
"as an email address.<br /> These identities can't be published on <span "
@ -306,7 +312,7 @@ msgstr ""
"auf <span class=\"brand\">keys.openpgp.org</span> veröffentlicht werden. (<a "
"href=\"/about/faq#non-email-uids\" target=\"_blank\">warum?</a>)"
#: src/gettext_strings.rs:51
#: src/gettext_strings.rs:52
msgid ""
"This key contains one revoked identity, which is not published. (<a href=\"/"
"about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
@ -315,7 +321,7 @@ msgstr ""
"veröffentlicht. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Warum?"
"</a>)"
#: src/gettext_strings.rs:52
#: src/gettext_strings.rs:53
msgid ""
"This key contains {{ count_revoked }} revoked identities, which are not "
"published. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
@ -324,11 +330,11 @@ msgstr ""
"werden nicht veröffentlicht. (<a href=\"/about/faq#revoked-uids\" target="
"\"_blank\">Warum?</a>)"
#: src/gettext_strings.rs:53
#: src/gettext_strings.rs:54
msgid "Your keys have been successfully uploaded:"
msgstr "Schlüssel erfolgreich hochgeladen:"
#: src/gettext_strings.rs:54
#: src/gettext_strings.rs:55
msgid ""
"<strong>Note:</strong> To make keys searchable by address, you must upload "
"them individually."
@ -336,11 +342,11 @@ msgstr ""
"<strong>Hinweis:</strong> Schlüssel müssen einzeln hochgeladen werden, um "
"sie für die Suche per E-Mail-Adresse zu bestätigen."
#: src/gettext_strings.rs:55
#: src/gettext_strings.rs:56
msgid "Verifying your email address…"
msgstr "E-Mail Adresse wird bestätigt..."
#: src/gettext_strings.rs:56
#: src/gettext_strings.rs:57
msgid ""
"If the process doesn't complete after a few seconds, <input type=\"submit\" "
"class=\"textbutton\" value=\"click here\" />."
@ -348,15 +354,15 @@ msgstr ""
"Wenn der Vorgang nicht in einigen Sekunden erfolgreich ist, <input type="
"\"submit\" class=\"textbutton\" value=\"klicke hier\"/>."
#: src/gettext_strings.rs:58
#: src/gettext_strings.rs:59
msgid "Manage your key on {{domain}}"
msgstr "Schlüssel-Verwaltung auf {{domain}}"
#: src/gettext_strings.rs:60
#: src/gettext_strings.rs:61
msgid "Hi,"
msgstr "Hi,"
#: src/gettext_strings.rs:61
#: src/gettext_strings.rs:62
msgid ""
"this is an automated message from <a rel=\"nofollow\" href="
"\"{{ base_uri }}\" style=\"text-decoration:none; color: "
@ -366,22 +372,22 @@ msgstr ""
"\"{{ base_uri }}\" style=\"text-decoration:none; color: "
"#333\"><tt>{{ domain }}</tt></a>."
#: src/gettext_strings.rs:62
#: src/gettext_strings.rs:63
msgid "If you didn't request this message, please ignore it."
msgstr "Falls dies unerwartet ist, bitte die Nachricht ignorieren."
#: src/gettext_strings.rs:63
#: src/gettext_strings.rs:64
msgid "OpenPGP key: <tt>{{ primary_fp }}</tt>"
msgstr "OpenPGP Schlüssel: <tt>{{ primary_fp }}</tt>"
#: src/gettext_strings.rs:64
#: src/gettext_strings.rs:65
msgid ""
"To manage and delete listed addresses on this key, please follow the link "
"below:"
msgstr ""
"Du kannst die Identitäten dieses Schlüssels unter folgendem Link verwalten:"
#: src/gettext_strings.rs:65
#: src/gettext_strings.rs:66
msgid ""
"You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/"
"about</a>."
@ -389,7 +395,7 @@ msgstr ""
"Weitere Informationen findest du unter <a href=\"{{base_uri}}/about"
"\">{{ domain }}/about</a>."
#: src/gettext_strings.rs:66
#: src/gettext_strings.rs:67
msgid ""
"Greetings from the <a rel=\"nofollow\" href=\"{{ base_uri }}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
@ -397,7 +403,7 @@ msgstr ""
"Das <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-decoration:none; "
"color: #333\"><tt>keys.openpgp.org</tt></a> Team"
#: src/gettext_strings.rs:69
#: src/gettext_strings.rs:70
msgid ""
"this is an automated message from {{domain}}. If you didn't\n"
"request this message, please ignore it."
@ -405,30 +411,30 @@ msgstr ""
"dies ist eine automatisierte Nachricht von {{domain}}. Falls dies unerwartet "
"ist, bitte die Nachricht ignorieren."
#: src/gettext_strings.rs:70
#: src/gettext_strings.rs:71
msgid "OpenPGP key: {{primary_fp}}"
msgstr "OpenPGP Schlüssel: {{primary_fp}}"
#: src/gettext_strings.rs:71
#: src/gettext_strings.rs:72
msgid ""
"To manage and delete listed addresses on this key, please follow\n"
"the link below:"
msgstr ""
"Du kannst die Identitäten dieses Schlüssels unter folgendem Link verwalten:"
#: src/gettext_strings.rs:72
#: src/gettext_strings.rs:73
msgid "You can find more info at {{base_uri}}/about"
msgstr "Weiter Informationen findest du unter {{base_uri}}/about"
#: src/gettext_strings.rs:73
#: src/gettext_strings.rs:74
msgid "Greetings from the keys.openpgp.org team"
msgstr "Das keys.openpgp.org Team"
#: src/gettext_strings.rs:75
#: src/gettext_strings.rs:76
msgid "Verify {{userid}} for your key on {{domain}}"
msgstr "Bestätige {{userid}} für deinen Schlüssel auf {{domain}}"
#: src/gettext_strings.rs:78
#: src/gettext_strings.rs:79
msgid ""
"this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" "
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
@ -439,11 +445,11 @@ msgstr ""
"#333\"><tt>{{ domain }}</tt></a>. Falls dies unerwartet ist, bitte die "
"Nachricht ignorieren."
#: src/gettext_strings.rs:79
#: src/gettext_strings.rs:80
msgid "OpenPGP key: <tt>{{primary_fp}}</tt>"
msgstr "OpenPGP Schlüssel: <tt>{{primary_fp}}</tt>"
#: src/gettext_strings.rs:80
#: src/gettext_strings.rs:81
msgid ""
"To let others find this key from your email address \"<a rel=\"nofollow\" "
"href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", "
@ -453,7 +459,7 @@ msgstr ""
"\"text-decoration:none; color: #333\">{{userid}}</a>\" verfügbar zu machen, "
"klicke diesen Link:"
#: src/gettext_strings.rs:81
#: src/gettext_strings.rs:82
msgid ""
"You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</"
"a>."
@ -461,7 +467,7 @@ msgstr ""
"Weiter Informationen findest du unter <a href=\"{{base_uri}}/about"
"\">{{domain}}/about</a>."
#: src/gettext_strings.rs:82
#: src/gettext_strings.rs:83
msgid ""
"Greetings from the <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
@ -469,7 +475,7 @@ msgstr ""
"Grüße vom <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-decoration:"
"none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
#: src/gettext_strings.rs:87
#: src/gettext_strings.rs:88
msgid ""
"To let others find this key from your email address \"{{userid}}\",\n"
"please follow the link below:"
@ -478,11 +484,11 @@ msgstr ""
"machen,\n"
"klicke diesen Link:"
#: src/gettext_strings.rs:91
#: src/gettext_strings.rs:92
msgid "Your key upload on {{domain}}"
msgstr "Hochgeladener Schlüssel auf {{domain}}"
#: src/gettext_strings.rs:94
#: src/gettext_strings.rs:95
msgid ""
"this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" "
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
@ -493,7 +499,7 @@ msgstr ""
"#333\"><tt>{{ domain }}</tt></a>. Falls dies unerwartet ist, bitte die "
"Nachricht ignorieren."
#: src/gettext_strings.rs:96
#: src/gettext_strings.rs:97
msgid ""
"This key was just uploaded for the first time, and is now published without "
"identity information. If you want to allow others to find this key by e-mail "
@ -503,7 +509,7 @@ msgstr ""
"Identitäten veröffentlicht. Um diesen Schlüssel für eine Suche nach E-Mail "
"Adresse verfügbar zu machen, folge diesem Link:"
#: src/gettext_strings.rs:101
#: src/gettext_strings.rs:102
msgid ""
"this is an automated message from {{domain}}. If you didn't upload your key\n"
"there, please ignore this message."
@ -512,7 +518,7 @@ msgstr ""
"ist,\n"
"bitte die Nachricht ignorieren."
#: src/gettext_strings.rs:103
#: src/gettext_strings.rs:104
msgid ""
"This key was just uploaded for the first time, and is now published without\n"
"identity information. If you want to allow others to find this key by e-"

View File

@ -12,15 +12,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/mail.rs:105
#: src/mail.rs:104
msgid "Verify {} for your key on {}"
msgstr "Verify {} for your key on {}"
#: src/mail.rs:132
#: src/mail.rs:131
msgid "Manage your key on {}"
msgstr "Manage your key on {}"
#: src/mail.rs:159
#: src/mail.rs:158
msgid "Your key upload on {}"
msgstr "Your key upload on {}"
@ -76,14 +76,20 @@ msgid "News:"
msgstr "News:"
#: src/gettext_strings.rs:15
msgid ""
"<a href=\"/about/news#2019-09-12-three-months-later\">Three months after "
"launch ✨</a> (2019-09-12)"
msgstr ""
#: src/gettext_strings.rs:16
msgid "v{{ version }} built from"
msgstr "v{{ version }} built from"
#: src/gettext_strings.rs:16
#: src/gettext_strings.rs:17
msgid "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
msgstr "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
#: src/gettext_strings.rs:17
#: src/gettext_strings.rs:18
msgid ""
"Background image retrieved from <a href=\"https://www.toptal.com/designers/"
"subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0"
@ -91,69 +97,69 @@ msgstr ""
"Background image retrieved from <a href=\"https://www.toptal.com/designers/"
"subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0"
#: src/gettext_strings.rs:18
#: src/gettext_strings.rs:19
msgid "Maintenance Mode"
msgstr "Maintenance Mode"
#: src/gettext_strings.rs:19
#: src/gettext_strings.rs:20
msgid "Manage your key"
msgstr "Manage your key"
#: src/gettext_strings.rs:20
#: src/gettext_strings.rs:21
msgid "Enter any verified e-mail address of your key"
msgstr "Enter any verified e-mail address of your key"
#: src/gettext_strings.rs:21
#: src/gettext_strings.rs:22
msgid "Send link"
msgstr "Send link"
#: src/gettext_strings.rs:22
msgid ""
"We will send you an e-mail with a link you can use to remove any of your e-"
"mail addresses from search."
msgstr ""
"We will send you an e-mail with a link you can use to remove any of your e-"
"mail addresses from search."
#: src/gettext_strings.rs:23
msgid ""
"We will send you an e-mail with a link you can use to remove any of your e-"
"mail addresses from search."
msgstr ""
"We will send you an e-mail with a link you can use to remove any of your e-"
"mail addresses from search."
#: src/gettext_strings.rs:24
msgid ""
"Managing the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
msgstr ""
"Managing the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
#: src/gettext_strings.rs:24
#: src/gettext_strings.rs:25
msgid "Your key is published with the following identity information:"
msgstr "Your key is published with the following identity information:"
#: src/gettext_strings.rs:25
#: src/gettext_strings.rs:26
msgid "Delete"
msgstr ""
#: src/gettext_strings.rs:26
msgid ""
"Clicking \"delete\" on any address will remove it from this key. It will no "
"longer appear in a search.<br /> To add another address, <a href=\"/upload"
"\">upload</a> the key again."
msgstr ""
"Clicking \"delete\" on any address will remove it from this key. It will no "
"longer appear in a search.<br /> To add another address, <a href=\"/upload"
"\">upload</a> the key again."
#: src/gettext_strings.rs:27
msgid ""
"Clicking \"delete\" on any address will remove it from this key. It will no "
"longer appear in a search.<br /> To add another address, <a href=\"/upload"
"\">upload</a> the key again."
msgstr ""
"Clicking \"delete\" on any address will remove it from this key. It will no "
"longer appear in a search.<br /> To add another address, <a href=\"/upload"
"\">upload</a> the key again."
#: src/gettext_strings.rs:28
msgid ""
"Your key is published as only non-identity information. (<a href=\"/about\" "
"target=\"_blank\">what does this mean?</a>)"
msgstr ""
"Your key is published as only non-identity information. (<a href=\"/about\" "
"target=\"_blank\">what does this mean?</a>)"
#: src/gettext_strings.rs:28
#: src/gettext_strings.rs:29
msgid "To add an address, <a href=\"/upload\">upload</a> the key again."
msgstr "To add an address, <a href=\"/upload\">upload</a> the key again."
#: src/gettext_strings.rs:29
#: src/gettext_strings.rs:30
#, fuzzy
msgid ""
"We have sent an email with further instructions to <span class=\"email"
@ -162,11 +168,11 @@ msgstr ""
"We have sent an email with further instructions to <span class=\"email"
"\">{{ address }}</span>"
#: src/gettext_strings.rs:30
#: src/gettext_strings.rs:31
msgid "This address was already verified."
msgstr "This address was already verified."
#: src/gettext_strings.rs:31
#: src/gettext_strings.rs:32
msgid ""
"Your key <span class=\"fingerprint\">{{ key_fpr }}</span> is now published "
"for the identity <a href=\"{{userid_link}}\" target=\"_blank\"><span class="
@ -176,48 +182,48 @@ msgstr ""
"for the identity <a href=\"{{userid_link}}\" target=\"_blank\"><span class="
"\"email\">{{ userid }}</span></a>."
#: src/gettext_strings.rs:32
#: src/gettext_strings.rs:33
msgid "Verification failed! Perhaps the link you used was expired?"
msgstr "Verification failed! Perhaps the link you used was expired?"
#: src/gettext_strings.rs:33
#: src/gettext_strings.rs:34
msgid "You can <a href=\"/upload\">try uploading again</a>."
msgstr "You can <a href=\"/upload\">try uploading again</a>."
#: src/gettext_strings.rs:34
#: src/gettext_strings.rs:35
#, fuzzy
msgid "Upload your key"
msgstr "Manage your key"
#: src/gettext_strings.rs:35
#: src/gettext_strings.rs:36
msgid "Your public key"
msgstr "Your public key"
#: src/gettext_strings.rs:36
#: src/gettext_strings.rs:37
msgid "Upload"
msgstr "Upload"
#: src/gettext_strings.rs:37
msgid ""
"Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and "
"<a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
msgstr ""
"Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and "
"<a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
#: src/gettext_strings.rs:38
msgid ""
"Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and "
"<a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
msgstr ""
"Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and "
"<a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
#: src/gettext_strings.rs:39
msgid ""
"You uploaded the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
msgstr ""
"You uploaded the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" "
"target=\"_blank\">{{ key_fpr }}</a></span>."
#: src/gettext_strings.rs:39
#: src/gettext_strings.rs:40
msgid "This key is revoked."
msgstr "This key is revoked."
#: src/gettext_strings.rs:40
#: src/gettext_strings.rs:41
msgid ""
"It is published without identity information and can't be made available for "
"search by e-mail address"
@ -225,11 +231,11 @@ msgstr ""
"It is published without identity information and can't be made available for "
"search by e-mail address"
#: src/gettext_strings.rs:41
#: src/gettext_strings.rs:42
msgid "what does this mean?"
msgstr "what does this mean?"
#: src/gettext_strings.rs:42
#: src/gettext_strings.rs:43
msgid ""
"This key is now published with the following identity information (<a href="
"\"/about\" target=\"_blank\">what does this mean?</a>):"
@ -237,54 +243,54 @@ msgstr ""
"This key is now published with the following identity information (<a href="
"\"/about\" target=\"_blank\">what does this mean?</a>):"
#: src/gettext_strings.rs:43
#: src/gettext_strings.rs:44
msgid "Published"
msgstr "Published"
#: src/gettext_strings.rs:44
msgid ""
"This key is now published with only non-identity information (<a href=\"/"
"about\" target=\"_blank\">what does this mean?</a>)"
msgstr ""
"This key is now published with only non-identity information (<a href=\"/"
"about\" target=\"_blank\">what does this mean?</a>)"
#: src/gettext_strings.rs:45
msgid ""
"This key is now published with only non-identity information (<a href=\"/"
"about\" target=\"_blank\">what does this mean?</a>)"
msgstr ""
"This key is now published with only non-identity information (<a href=\"/"
"about\" target=\"_blank\">what does this mean?</a>)"
#: src/gettext_strings.rs:46
msgid ""
"To make the key available for search by e-mail address, you can verify it "
"belongs to you:"
msgstr ""
"To make the key available for search by e-mail address, you can verify it "
"belongs to you:"
#: src/gettext_strings.rs:46
#: src/gettext_strings.rs:47
msgid "Verification Pending"
msgstr "Verification Pending"
#: src/gettext_strings.rs:47
#: src/gettext_strings.rs:48
msgid ""
"<strong>Note:</strong> Some providers delay e-mails for up to 15 minutes to "
"prevent spam. Please be patient."
msgstr ""
#: src/gettext_strings.rs:48
#: src/gettext_strings.rs:49
msgid "Send Verification Mail"
msgstr "Send Verification Mail"
#: src/gettext_strings.rs:49
msgid ""
"This key contains one identity that could not be parsed as an email address."
"<br /> This identity can't be published on <span class=\"brand\">keys."
"openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank"
"\">why?</a>)"
msgstr ""
"This key contains one identity that could not be parsed as an email address."
"<br /> This identity can't be published on <span class=\"brand\">keys."
"openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank"
"\">why?</a>)"
#: src/gettext_strings.rs:50
msgid ""
"This key contains one identity that could not be parsed as an email address."
"<br /> This identity can't be published on <span class=\"brand\">keys."
"openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank"
"\">why?</a>)"
msgstr ""
"This key contains one identity that could not be parsed as an email address."
"<br /> This identity can't be published on <span class=\"brand\">keys."
"openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank"
"\">why?</a>)"
#: src/gettext_strings.rs:51
msgid ""
"This key contains {{ count_unparsed }} identities that could not be parsed "
"as an email address.<br /> These identities can't be published on <span "
"class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-"
@ -295,14 +301,14 @@ msgstr ""
"class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-"
"uids\" target=\"_blank\">why?</a>)"
#: src/gettext_strings.rs:51
#: src/gettext_strings.rs:52
#, fuzzy
msgid ""
"This key contains one revoked identity, which is not published. (<a href=\"/"
"about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
msgstr "This key contains one revoked identity, which is not published."
#: src/gettext_strings.rs:52
#: src/gettext_strings.rs:53
#, fuzzy
msgid ""
"This key contains {{ count_revoked }} revoked identities, which are not "
@ -311,11 +317,11 @@ msgstr ""
"This key contains {{ count_revoked }} revoked identities, which are not "
"published."
#: src/gettext_strings.rs:53
#: src/gettext_strings.rs:54
msgid "Your keys have been successfully uploaded:"
msgstr "Your keys have been successfully uploaded:"
#: src/gettext_strings.rs:54
#: src/gettext_strings.rs:55
msgid ""
"<strong>Note:</strong> To make keys searchable by address, you must upload "
"them individually."
@ -323,11 +329,11 @@ msgstr ""
"<strong>Note:</strong> To make keys searchable by address, you must upload "
"them individually."
#: src/gettext_strings.rs:55
#: src/gettext_strings.rs:56
msgid "Verifying your email address…"
msgstr "Verifying your email address…"
#: src/gettext_strings.rs:56
#: src/gettext_strings.rs:57
msgid ""
"If the process doesn't complete after a few seconds, <input type=\"submit\" "
"class=\"textbutton\" value=\"click here\" />."
@ -335,15 +341,15 @@ msgstr ""
"If the process doesn't complete after a few seconds, <input type=\"submit\" "
"class=\"textbutton\" value=\"click here\" />."
#: src/gettext_strings.rs:58
#: src/gettext_strings.rs:59
msgid "Manage your key on {{domain}}"
msgstr "Manage your key on {{domain}}"
#: src/gettext_strings.rs:60
#: src/gettext_strings.rs:61
msgid "Hi,"
msgstr "Hi,"
#: src/gettext_strings.rs:61
#: src/gettext_strings.rs:62
msgid ""
"this is an automated message from <a rel=\"nofollow\" href="
"\"{{ base_uri }}\" style=\"text-decoration:none; color: "
@ -353,39 +359,39 @@ msgstr ""
"\"{{ base_uri }}\" style=\"text-decoration:none; color: "
"#333\"><tt>{{ domain }}</tt></a>."
#: src/gettext_strings.rs:62
#: src/gettext_strings.rs:63
msgid "If you didn't request this message, please ignore it."
msgstr "If you didn't request this message, please ignore it."
#: src/gettext_strings.rs:63
#: src/gettext_strings.rs:64
msgid "OpenPGP key: <tt>{{ primary_fp }}</tt>"
msgstr "OpenPGP key: <tt>{{ primary_fp }}</tt>"
#: src/gettext_strings.rs:64
msgid ""
"To manage and delete listed addresses on this key, please follow the link "
"below:"
msgstr ""
"To manage and delete listed addresses on this key, please follow the link "
"below:"
#: src/gettext_strings.rs:65
msgid ""
"You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/"
"about</a>."
"To manage and delete listed addresses on this key, please follow the link "
"below:"
msgstr ""
"You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/"
"about</a>."
"To manage and delete listed addresses on this key, please follow the link "
"below:"
#: src/gettext_strings.rs:66
msgid ""
"You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/"
"about</a>."
msgstr ""
"You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/"
"about</a>."
#: src/gettext_strings.rs:67
msgid ""
"Greetings from the <a rel=\"nofollow\" href=\"{{ base_uri }}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
msgstr ""
"Greetings from the <a rel=\"nofollow\" href=\"{{ base_uri }}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
#: src/gettext_strings.rs:69
#: src/gettext_strings.rs:70
#, fuzzy
msgid ""
"this is an automated message from {{domain}}. If you didn't\n"
@ -393,11 +399,11 @@ msgid ""
msgstr ""
"this is an automated message from {{domain}}. If you didn't upload your key"
#: src/gettext_strings.rs:70
#: src/gettext_strings.rs:71
msgid "OpenPGP key: {{primary_fp}}"
msgstr "OpenPGP key: {{primary_fp}}"
#: src/gettext_strings.rs:71
#: src/gettext_strings.rs:72
#, fuzzy
msgid ""
"To manage and delete listed addresses on this key, please follow\n"
@ -406,19 +412,19 @@ msgstr ""
"To manage and delete listed addresses on this key, please follow the link "
"below:"
#: src/gettext_strings.rs:72
#: src/gettext_strings.rs:73
msgid "You can find more info at {{base_uri}}/about"
msgstr "You can find more info at {{base_uri}}/about"
#: src/gettext_strings.rs:73
#: src/gettext_strings.rs:74
msgid "Greetings from the keys.openpgp.org team"
msgstr "Greetings from the keys.openpgp.org team"
#: src/gettext_strings.rs:75
#: src/gettext_strings.rs:76
msgid "Verify {{userid}} for your key on {{domain}}"
msgstr "Verify {{userid}} for your key on {{domain}}"
#: src/gettext_strings.rs:78
#: src/gettext_strings.rs:79
msgid ""
"this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" "
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
@ -428,48 +434,48 @@ msgstr ""
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
"didn't request this message, please ignore it."
#: src/gettext_strings.rs:79
#: src/gettext_strings.rs:80
msgid "OpenPGP key: <tt>{{primary_fp}}</tt>"
msgstr "OpenPGP key: <tt>{{primary_fp}}</tt>"
#: src/gettext_strings.rs:80
msgid ""
"To let others find this key from your email address \"<a rel=\"nofollow\" "
"href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", "
"please click the link below:"
msgstr ""
"To let others find this key from your email address \"<a rel=\"nofollow\" "
"href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", "
"please click the link below:"
#: src/gettext_strings.rs:81
msgid ""
"You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</"
"a>."
"To let others find this key from your email address \"<a rel=\"nofollow\" "
"href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", "
"please click the link below:"
msgstr ""
"You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</"
"a>."
"To let others find this key from your email address \"<a rel=\"nofollow\" "
"href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", "
"please click the link below:"
#: src/gettext_strings.rs:82
msgid ""
"You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</"
"a>."
msgstr ""
"You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</"
"a>."
#: src/gettext_strings.rs:83
msgid ""
"Greetings from the <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
msgstr ""
"Greetings from the <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-"
"decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
#: src/gettext_strings.rs:87
#: src/gettext_strings.rs:88
#, fuzzy
msgid ""
"To let others find this key from your email address \"{{userid}}\",\n"
"please follow the link below:"
msgstr "To let others find this key from your email address \"{{userid}}\","
#: src/gettext_strings.rs:91
#: src/gettext_strings.rs:92
msgid "Your key upload on {{domain}}"
msgstr "Your key upload on {{domain}}"
#: src/gettext_strings.rs:94
#: src/gettext_strings.rs:95
msgid ""
"this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" "
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
@ -479,7 +485,7 @@ msgstr ""
"style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you "
"didn't upload your key there, please ignore this message."
#: src/gettext_strings.rs:96
#: src/gettext_strings.rs:97
msgid ""
"This key was just uploaded for the first time, and is now published without "
"identity information. If you want to allow others to find this key by e-mail "
@ -489,7 +495,7 @@ msgstr ""
"identity information. If you want to allow others to find this key by e-mail "
"address, please follow this link:"
#: src/gettext_strings.rs:101
#: src/gettext_strings.rs:102
#, fuzzy
msgid ""
"this is an automated message from {{domain}}. If you didn't upload your key\n"
@ -497,7 +503,7 @@ msgid ""
msgstr ""
"this is an automated message from {{domain}}. If you didn't upload your key"
#: src/gettext_strings.rs:103
#: src/gettext_strings.rs:104
#, fuzzy
msgid ""
"This key was just uploaded for the first time, and is now published without\n"

View File

@ -12,15 +12,15 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
#: src/mail.rs:105
#: src/mail.rs:104
msgid "Verify {} for your key on {}"
msgstr ""
#: src/mail.rs:132
#: src/mail.rs:131
msgid "Manage your key on {}"
msgstr ""
#: src/mail.rs:159
#: src/mail.rs:158
msgid "Your key upload on {}"
msgstr ""
@ -69,270 +69,274 @@ msgid "News:"
msgstr ""
#: src/gettext_strings.rs:15
msgid "v{{ version }} built from"
msgid "<a href=\"/about/news#2019-09-12-three-months-later\">Three months after launch ✨</a> (2019-09-12)"
msgstr ""
#: src/gettext_strings.rs:16
msgid "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
msgid "v{{ version }} built from"
msgstr ""
#: src/gettext_strings.rs:17
msgid "Background image retrieved from <a href=\"https://www.toptal.com/designers/subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0"
msgid "Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>"
msgstr ""
#: src/gettext_strings.rs:18
msgid "Maintenance Mode"
msgid "Background image retrieved from <a href=\"https://www.toptal.com/designers/subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0"
msgstr ""
#: src/gettext_strings.rs:19
msgid "Manage your key"
msgid "Maintenance Mode"
msgstr ""
#: src/gettext_strings.rs:20
msgid "Enter any verified e-mail address of your key"
msgid "Manage your key"
msgstr ""
#: src/gettext_strings.rs:21
msgid "Send link"
msgid "Enter any verified e-mail address of your key"
msgstr ""
#: src/gettext_strings.rs:22
msgid "We will send you an e-mail with a link you can use to remove any of your e-mail addresses from search."
msgid "Send link"
msgstr ""
#: src/gettext_strings.rs:23
msgid "Managing the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" target=\"_blank\">{{ key_fpr }}</a></span>."
msgid "We will send you an e-mail with a link you can use to remove any of your e-mail addresses from search."
msgstr ""
#: src/gettext_strings.rs:24
msgid "Your key is published with the following identity information:"
msgid "Managing the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" target=\"_blank\">{{ key_fpr }}</a></span>."
msgstr ""
#: src/gettext_strings.rs:25
msgid "Delete"
msgid "Your key is published with the following identity information:"
msgstr ""
#: src/gettext_strings.rs:26
msgid "Clicking \"delete\" on any address will remove it from this key. It will no longer appear in a search.<br /> To add another address, <a href=\"/upload\">upload</a> the key again."
msgid "Delete"
msgstr ""
#: src/gettext_strings.rs:27
msgid "Your key is published as only non-identity information. (<a href=\"/about\" target=\"_blank\">what does this mean?</a>)"
msgid "Clicking \"delete\" on any address will remove it from this key. It will no longer appear in a search.<br /> To add another address, <a href=\"/upload\">upload</a> the key again."
msgstr ""
#: src/gettext_strings.rs:28
msgid "To add an address, <a href=\"/upload\">upload</a> the key again."
msgid "Your key is published as only non-identity information. (<a href=\"/about\" target=\"_blank\">what does this mean?</a>)"
msgstr ""
#: src/gettext_strings.rs:29
msgid "We have sent an email with further instructions to <span class=\"email\">{{ address }}</span>."
msgid "To add an address, <a href=\"/upload\">upload</a> the key again."
msgstr ""
#: src/gettext_strings.rs:30
msgid "This address was already verified."
msgid "We have sent an email with further instructions to <span class=\"email\">{{ address }}</span>."
msgstr ""
#: src/gettext_strings.rs:31
msgid "Your key <span class=\"fingerprint\">{{ key_fpr }}</span> is now published for the identity <a href=\"{{userid_link}}\" target=\"_blank\"><span class=\"email\">{{ userid }}</span></a>."
msgid "This address was already verified."
msgstr ""
#: src/gettext_strings.rs:32
msgid "Verification failed! Perhaps the link you used was expired?"
msgid "Your key <span class=\"fingerprint\">{{ key_fpr }}</span> is now published for the identity <a href=\"{{userid_link}}\" target=\"_blank\"><span class=\"email\">{{ userid }}</span></a>."
msgstr ""
#: src/gettext_strings.rs:33
msgid "You can <a href=\"/upload\">try uploading again</a>."
msgid "Verification failed! Perhaps the link you used was expired?"
msgstr ""
#: src/gettext_strings.rs:34
msgid "Upload your key"
msgid "You can <a href=\"/upload\">try uploading again</a>."
msgstr ""
#: src/gettext_strings.rs:35
msgid "Your public key"
msgid "Upload your key"
msgstr ""
#: src/gettext_strings.rs:36
msgid "Upload"
msgid "Your public key"
msgstr ""
#: src/gettext_strings.rs:37
msgid "Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and <a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
msgid "Upload"
msgstr ""
#: src/gettext_strings.rs:38
msgid "You uploaded the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" target=\"_blank\">{{ key_fpr }}</a></span>."
msgid "Need more info? Check our <a target=\"_blank\" href=\"/about\">intro</a> and <a target=\"_blank\" href=\"/about/usage\">usage guide</a>!"
msgstr ""
#: src/gettext_strings.rs:39
msgid "This key is revoked."
msgid "You uploaded the key <span class=\"fingerprint\"><a href=\"{{ key_link }}\" target=\"_blank\">{{ key_fpr }}</a></span>."
msgstr ""
#: src/gettext_strings.rs:40
msgid "It is published without identity information and can't be made available for search by e-mail address"
msgid "This key is revoked."
msgstr ""
#: src/gettext_strings.rs:41
msgid "what does this mean?"
msgid "It is published without identity information and can't be made available for search by e-mail address"
msgstr ""
#: src/gettext_strings.rs:42
msgid "This key is now published with the following identity information (<a href=\"/about\" target=\"_blank\">what does this mean?</a>):"
msgid "what does this mean?"
msgstr ""
#: src/gettext_strings.rs:43
msgid "Published"
msgid "This key is now published with the following identity information (<a href=\"/about\" target=\"_blank\">what does this mean?</a>):"
msgstr ""
#: src/gettext_strings.rs:44
msgid "This key is now published with only non-identity information (<a href=\"/about\" target=\"_blank\">what does this mean?</a>)"
msgid "Published"
msgstr ""
#: src/gettext_strings.rs:45
msgid "To make the key available for search by e-mail address, you can verify it belongs to you:"
msgid "This key is now published with only non-identity information (<a href=\"/about\" target=\"_blank\">what does this mean?</a>)"
msgstr ""
#: src/gettext_strings.rs:46
msgid "Verification Pending"
msgid "To make the key available for search by e-mail address, you can verify it belongs to you:"
msgstr ""
#: src/gettext_strings.rs:47
msgid "<strong>Note:</strong> Some providers delay e-mails for up to 15 minutes to prevent spam. Please be patient."
msgid "Verification Pending"
msgstr ""
#: src/gettext_strings.rs:48
msgid "Send Verification Mail"
msgid "<strong>Note:</strong> Some providers delay e-mails for up to 15 minutes to prevent spam. Please be patient."
msgstr ""
#: src/gettext_strings.rs:49
msgid "This key contains one identity that could not be parsed as an email address.<br /> This identity can't be published on <span class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank\">why?</a>)"
msgid "Send Verification Mail"
msgstr ""
#: src/gettext_strings.rs:50
msgid "This key contains {{ count_unparsed }} identities that could not be parsed as an email address.<br /> These identities can't be published on <span class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank\">why?</a>)"
msgid "This key contains one identity that could not be parsed as an email address.<br /> This identity can't be published on <span class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank\">why?</a>)"
msgstr ""
#: src/gettext_strings.rs:51
msgid "This key contains one revoked identity, which is not published. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
msgid "This key contains {{ count_unparsed }} identities that could not be parsed as an email address.<br /> These identities can't be published on <span class=\"brand\">keys.openpgp.org</span>. (<a href=\"/about/faq#non-email-uids\" target=\"_blank\">why?</a>)"
msgstr ""
#: src/gettext_strings.rs:52
msgid "This key contains {{ count_revoked }} revoked identities, which are not published. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
msgid "This key contains one revoked identity, which is not published. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
msgstr ""
#: src/gettext_strings.rs:53
msgid "Your keys have been successfully uploaded:"
msgid "This key contains {{ count_revoked }} revoked identities, which are not published. (<a href=\"/about/faq#revoked-uids\" target=\"_blank\">Why?</a>)"
msgstr ""
#: src/gettext_strings.rs:54
msgid "<strong>Note:</strong> To make keys searchable by address, you must upload them individually."
msgid "Your keys have been successfully uploaded:"
msgstr ""
#: src/gettext_strings.rs:55
msgid "Verifying your email address…"
msgid "<strong>Note:</strong> To make keys searchable by address, you must upload them individually."
msgstr ""
#: src/gettext_strings.rs:56
msgid "Verifying your email address…"
msgstr ""
#: src/gettext_strings.rs:57
msgid "If the process doesn't complete after a few seconds, <input type=\"submit\" class=\"textbutton\" value=\"click here\" />."
msgstr ""
#: src/gettext_strings.rs:58
#: src/gettext_strings.rs:59
msgid "Manage your key on {{domain}}"
msgstr ""
#: src/gettext_strings.rs:60
#: src/gettext_strings.rs:61
msgid "Hi,"
msgstr ""
#: src/gettext_strings.rs:61
#: src/gettext_strings.rs:62
msgid "this is an automated message from <a rel=\"nofollow\" href=\"{{ base_uri }}\" style=\"text-decoration:none; color: #333\"><tt>{{ domain }}</tt></a>."
msgstr ""
#: src/gettext_strings.rs:62
#: src/gettext_strings.rs:63
msgid "If you didn't request this message, please ignore it."
msgstr ""
#: src/gettext_strings.rs:63
#: src/gettext_strings.rs:64
msgid "OpenPGP key: <tt>{{ primary_fp }}</tt>"
msgstr ""
#: src/gettext_strings.rs:64
#: src/gettext_strings.rs:65
msgid "To manage and delete listed addresses on this key, please follow the link below:"
msgstr ""
#: src/gettext_strings.rs:65
#: src/gettext_strings.rs:66
msgid "You can find more info at <a href=\"{{ base_uri }}/about\">{{ domain }}/about</a>."
msgstr ""
#: src/gettext_strings.rs:66
#: src/gettext_strings.rs:67
msgid "Greetings from the <a rel=\"nofollow\" href=\"{{ base_uri }}\" style=\"text-decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
msgstr ""
#: src/gettext_strings.rs:69
#: src/gettext_strings.rs:70
msgid "this is an automated message from {{domain}}. If you didn't\nrequest this message, please ignore it."
msgstr ""
#: src/gettext_strings.rs:70
#: src/gettext_strings.rs:71
msgid "OpenPGP key: {{primary_fp}}"
msgstr ""
#: src/gettext_strings.rs:71
#: src/gettext_strings.rs:72
msgid "To manage and delete listed addresses on this key, please follow\nthe link below:"
msgstr ""
#: src/gettext_strings.rs:72
#: src/gettext_strings.rs:73
msgid "You can find more info at {{base_uri}}/about"
msgstr ""
#: src/gettext_strings.rs:73
#: src/gettext_strings.rs:74
msgid "Greetings from the keys.openpgp.org team"
msgstr ""
#: src/gettext_strings.rs:75
#: src/gettext_strings.rs:76
msgid "Verify {{userid}} for your key on {{domain}}"
msgstr ""
#: src/gettext_strings.rs:78
#: src/gettext_strings.rs:79
msgid "this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you didn't request this message, please ignore it."
msgstr ""
#: src/gettext_strings.rs:79
#: src/gettext_strings.rs:80
msgid "OpenPGP key: <tt>{{primary_fp}}</tt>"
msgstr ""
#: src/gettext_strings.rs:80
#: src/gettext_strings.rs:81
msgid "To let others find this key from your email address \"<a rel=\"nofollow\" href=\"#\" style=\"text-decoration:none; color: #333\">{{userid}}</a>\", please click the link below:"
msgstr ""
#: src/gettext_strings.rs:81
#: src/gettext_strings.rs:82
msgid "You can find more info at <a href=\"{{base_uri}}/about\">{{domain}}/about</a>."
msgstr ""
#: src/gettext_strings.rs:82
#: src/gettext_strings.rs:83
msgid "Greetings from the <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-decoration:none; color: #333\"><tt>keys.openpgp.org</tt></a> team"
msgstr ""
#: src/gettext_strings.rs:87
#: src/gettext_strings.rs:88
msgid "To let others find this key from your email address \"{{userid}}\",\nplease follow the link below:"
msgstr ""
#: src/gettext_strings.rs:91
#: src/gettext_strings.rs:92
msgid "Your key upload on {{domain}}"
msgstr ""
#: src/gettext_strings.rs:94
#: src/gettext_strings.rs:95
msgid "this is an automated message from <a rel=\"nofollow\" href=\"{{base_uri}}\" style=\"text-decoration:none; color: #333\"><tt>{{domain}}</tt></a>. If you didn't upload your key there, please ignore this message."
msgstr ""
#: src/gettext_strings.rs:96
#: src/gettext_strings.rs:97
msgid "This key was just uploaded for the first time, and is now published without identity information. If you want to allow others to find this key by e-mail address, please follow this link:"
msgstr ""
#: src/gettext_strings.rs:101
#: src/gettext_strings.rs:102
msgid "this is an automated message from {{domain}}. If you didn't upload your key\nthere, please ignore this message."
msgstr ""
#: src/gettext_strings.rs:103
#: src/gettext_strings.rs:104
msgid "This key was just uploaded for the first time, and is now published without\nidentity information. If you want to allow others to find this key by e-mail\naddress, please follow this link:"
msgstr ""

View File

@ -12,6 +12,7 @@ fn _dummy() {
t!("You can also <a href=\"/upload\">upload</a> or <a href=\"/manage\">manage</a> your key.");
t!("Find out more <a href=\"/about\">about this service</a>.");
t!("News:");
t!("<a href=\"/about/news#2019-09-12-three-months-later\">Three months after launch ✨</a> (2019-09-12)");
t!("v{{ version }} built from");
t!("Powered by <a href=\"https://sequoia-pgp.org\">Sequoia-PGP</a>");
t!("Background image retrieved from <a href=\"https://www.toptal.com/designers/subtlepatterns/subtle-grey/\">Subtle Patterns</a> under CC BY-SA 3.0");

View File

@ -628,6 +628,22 @@ pub mod tests {
db.check_consistency().unwrap();
}
#[test]
fn about_translation() {
let (_tmpdir, config) = configuration().unwrap();
let rocket = rocket_factory(rocket::custom(config)).unwrap();
let client = Client::new(rocket).expect("valid rocket instance");
// Check that we see the landing page.
let mut response = client.get("/about")
.header(Header::new("Accept-Language", "de"))
.dispatch();
assert_eq!(response.status(), Status::Ok);
assert_eq!(response.content_type(), Some(ContentType::HTML));
// TODO check translation
assert!(response.body_string().unwrap().contains("Hagrid"));
}
#[test]
fn basics() {
let (_tmpdir, config) = configuration().unwrap();
@ -782,7 +798,7 @@ pub mod tests {
check_verify_link(&client, &token, "foo@invalid.example.com", "de, en");
let mail_content = pop_mail(&filemail_into).unwrap().unwrap();
assert!(mail_content.contains("dies ist eine automatische Nachricht"))
assert!(mail_content.contains("dies ist eine automatisierte Nachricht"))
}
#[test]

View File

@ -0,0 +1,84 @@
<div class="about">
<center><h2>About | <a href="/about/news">News</a> | <a href="/about/usage">Usage</a> | <a href="/about/faq">FAQ</a> | <a href="/about/stats">Stats</a> | <a href="/about/privacy">Privacy</a></h2></center>
<p>
The <tt>keys.openpgp.org</tt> server is a public service for the
distribution and discovery of OpenPGP-compatible keys, commonly
referred to as a "keyserver".
</p>
<p>
<strong>For instructions, see our <a href="/about/usage">usage guide</a>.</strong>
</p>
<h3>How it works</h3>
<p>
An OpenPGP key contains two types of information:
</p>
<ul>
<li><strong>Identity information</strong> describes the parts of
a key that identify its owner, also known as "User IDs".
A User ID typically includes a name and an e-mail address.
</li>
<li><strong>Non-identity information</strong> is all the technical
information about the key itself. This includes the large numbers
used for verifying signatures and encrypting messages.
It also includes metadata like date of creation, some expiration
dates, and revocation status.
</li>
</ul>
<p>
Traditionally, these pieces of information have always been distributed
together. On <span class="brand">keys.openpgp.org</span>, they are
treated differently. While anyone can upload all parts of any OpenPGP key
to <span class="brand">keys.openpgp.org</span>, our keyserver
will only retain and publish certain parts under certain
conditions:
</p>
<p>
Any <strong>non-identity information</strong> will be stored and freely
redistributed, if it passes a cryptographic integrity check.
Anyone can download these parts at any time as they contain only
technical data that can't be used to directly identify a person.
Good OpenPGP software can use <span class="brand">keys.openpgp.org</span>
to keep this information up to date for any key that it knows about.
This helps OpenPGP users maintain secure and reliable communication.
</p>
<p>
The <strong>identity information</strong> in an OpenPGP key
is only distributed with consent.
It contains personal data, and is not strictly necessary for
a key to be used for encryption or signature verification. Once the
owner gives consent by verifying their e-mail address, the key can
be found by everyone via search by address.
</p>
<h3 id="community">Community and platform</h3>
<p>
This service is run as a community effort.
You can talk to us in
#hagrid on Freenode IRC,
also reachable as #hagrid:stratum0.org on Matrix.
Of course you can also reach us via e-mail,
at <tt>support at keys dot openpgp dot org</tt>.
The folks who are running this come
from various projects in the OpenPGP ecosystem,
including Sequoia-PGP, OpenKeychain, and Enigmail.
</p>
<p>
Technically, <tt>keys.openpgp.org</tt> runs on the
<a href="https://gitlab.com/hagrid-keyserver/hagrid" target="_blank">Hagrid</a>
keyserver software, which is based on
<a href="https://sequoia-pgp.org">Sequoia-PGP</a>. We are hosted on the
<a href="https://eclips.is" target="_blank">eclips.is</a> platform,
a hosting provider focused on Internet Freedom projects, run by
<a href="https://greenhost.net/" target="_blank">Greenhost</a>.
</p>
</div>

View File

@ -0,0 +1,222 @@
<div class="about">
<center><h2><a href="/about">About</a> | <a href="/about/news">News</a> | <a href="/about/usage">Usage</a> | FAQ | <a href="/about/stats">Stats</a> | <a href="/about/privacy">Privacy</a></h2></center>
<h3 id="sks-pool"><a href="#sks-pool">Is this server part of the "SKS" pool?</a></h3>
<p>
No. The federation model of the SKS pool has various problems in terms
of reliability, abuse-resistance, privacy, and usability. We might do
something similar to it, but <span class="brand">keys.openpgp.org</span>
will never be part of the SKS pool itself.
</p>
<h3 id="federation"><a href="#federation">Is keys.openpgp.org federated? Can I help by running an instance?</a></h3>
<p>
For the moment, no.
We do plan to decentralize <span class="brand">keys.openpgp.org</span>
at some point.
With multiple servers
run by independent operators,
we can hopefully improve the reliability
of this service even further.
</p>
<p>
Several folks offered to help out
by "running a Hagrid server instance".
We very much appreciate the offer,
but we will probably never have an "open" federation model like SKS,
where everyone can run an instance and become part of a "pool".
This is for two reasons:
</p>
<ol>
<li>
Federation with open participation requires all data to be public.
This significantly impacts the privacy of our users, because it
allows anyone to scrape a list of all e-mail addresses.
</li>
<li>
Servers run as a hobby by casual administrators do not meet our
standards for reliability and performance.
</li>
</ol>
<h3 id="non-email-uids"><a href="#non-email-uids">Why is there no support
for identities that aren't e-mail addresses?</a></h3>
<p>
We require explicit consent to distribute identity information.
Identities that aren't e-mail addresses, such as pictures or website
URLs, offer no simple way for us to acquire this consent.
</p>
<p>
Note: Some OpenPGP software creates keys with incorrectly formatted
e-mail addresses. These addresses might not be recognized correctly on
<span class="brand">keys.openpgp.org</span>.
</p>
<h3 id="verify-multiple"><a href="#verify-multiple">Can I verify more than
one key for some e-mail address?</a></h3>
<p>
An e-mail address can only be associated with a single key.
When an address is verified for a new key,
it will no longer appear in any key
for which it was previously verified.
<a href="/about">Non-identity information</a> will still be distributed
for all keys.
</p>
<p>
This means a search by e-mail address
will only return a single key,
not multiple candidates.
This eliminates an impossible choice for the user
("Which key is the right one?"),
and makes key discovery by e-mail much more convenient.
</p>
<h3 id="email-protection"><a href="#email-protection">What do you do to
protect outgoing verification e-mails?</a></h3>
<p>
We use a modern standard called
<a href="https://www.hardenize.com/blog/mta-sts" target="_blank">MTA-STS</a>,
combined with
<a href="https://starttls-everywhere.org/" target="_blank">STARTTLS Everywhere</a>
by the EFF,
to make sure verification e-mails are sent out securely.
This protects against eavesdropping and interception during delivery.
</p>
<p>
The MTA-STS mechanism depends on correctly configured e-mail servers.
You can <a href="https://www.hardenize.com/">run this test</a>
to see if your e-mail provider supports it.
If the "MTA-STS" entry on the left isn't a green checkmark,
please ask your provider to update their configuration.
</p>
<h3 id="third-party-signatures"><a href="#third-party-signatures">
Do you distribute "third party signatures"?</a></h3>
<p>
Short answer: No.
</p>
<p>
A "third party signature" is a signature on a key
that was made by some other key.
Most commonly,
those are the signatures produced when "signing someone's key",
which are the basis for
the "<a href="https://en.wikipedia.org/wiki/Web_of_trust" target="_blank">Web of Trust</a>".
For a number of reasons,
those signatures are not currently distributed
via <span class="brand">keys.openpgp.org</span>.
</p>
<p>
The killer reason is <strong>spam</strong>.
Third party signatures allow attaching arbitrary data to anyone's key,
and nothing stops a malicious user from
attaching so many megabytes of bloat to a key
that it becomes practically unusable.
Even worse,
they could attach offensive or illegal content.
</p>
<p>
There are ideas to resolve this issue.
For example, signatures could be distributed with the signer,
rather than the signee.
Alternatively, we could require
cross-signing by the signee before distribution
to support a
<a href="https://wiki.debian.org/caff" target="_blank">caff-style</a>
workflow.
If there is enough interest,
we are open to working with other OpenPGP projects
on a solution.
</p>
<h3 id="no-sign-verified"><a href="#no-sign-verified">Why not sign keys
after verification?</a></h3>
<p>
The <span class="brand">keys.openpgp.org</span> service is meant for key
distribution and discovery, not as a de-facto CA. Client implementations
that want to offer verified communication should rely on their own trust
model.
</p>
<h3 id="revoked-uids"><a href="#revoked-uids">Why are revoked identities not
distributed as such?</a></h3>
<p>
When an OpenPGP key marks one of its identities as revoked, this
identity should no longer be considered valid for the key. And this
information should ideally be distributed to all OpenPGP clients that
already know about the newly revoked identity.
</p>
<p>
Unfortunately, there is currently no good way to distribute revocations,
that doesn't also reveal the revoked identity itself. We don't want to
distribute revoked identities, so we can't distribute the identity at
all.
</p>
<p>
There are proposed solutions to this issue, that allow the distribution
of revocations without also revealing the identity itself. But so far
there is no final specification, or support in any OpenPGP software. We
hope that a solution will be established in the near future, and will
add support on <span class="brand">keys.openpgp.org</span> as soon as
we can.
</p>
<h3 id="tor"><a href="#tor">Do you support Tor?</a></h3>
<p>
Of course!
If you have Tor installed,
you can reach <span class="brand">keys.openpgp.org</span> anonymously
as an
<a href="https://en.wikipedia.org/wiki/Tor_(anonymity_network)#Onion_services" target="_blank">onion service</a>:
<br />
<a href="http://zkaan2xfbuxia2wpf7ofnkbz6r5zdbbvxbunvp5g2iebopbfc4iqmbad.onion">zkaan2xfbuxia2wpf7ofnkbz6r5zdbbvxbunvp5g2iebopbfc4iqmbad.onion</a>
</p>
<h3 id="encrypt-verification-emails"><a href="#encrypt-verification-emails">
Why not encrypt verification e-mails?</a></h3>
Various reasons:
<ol>
<li>It is more complicated, both for our users and for us.</li>
<li>It doesn't prevent attacks - an attacker gains nothing from
uploading a key they don't have access to.</li>
<li>Deletion would still have to be possible even when a key is
lost.</li>
<li>It would require a different (and more complicated) mechanism to
upload keys that can only sign.</li>
</ol>
<h3 id="older-gnupg"><a href="#older-gnupg">
I have trouble updating some keys with GnuPG. Is there a bug?
</a></h3>
<p>
This is a problem with current versions of GnuPG. If you attempt to
update a key from <span class="brand">keys.openpgp.org</span> that
contains no <a href="/about">identity information</a>, GnuPG will refuse
to process the key:
</p>
<blockquote>
$ gpg --receive-keys A2604867523C7ED8<br />
gpg: key A2604867523C7ED8: no user ID
</blockquote>
<p>
We are working with the GnuPG team to resolve this problem.
</p>
</div>

View File

@ -0,0 +1,307 @@
<div class="about">
<center><h2><a href="/about">About</a> | News | <a href="/about/usage">Usage</a> | <a href="/about/faq">FAQ</a> | <a href="/about/stats">Stats</a> | <a href="/about/privacy">Privacy</a></h2></center>
<h2 id="2019-09-12-three-months-later">
<div style="float: right; font-size: small; line-height: 2em;">2019-09-12 📅</div>
<a style="color: black;" href="/about/news#2019-09-12-three-months-later">Three months after launch ✨</a>
</h2>
<p>
It has been three months now
<a href="/about/news#2019-06-12-launch">since we launched</a>
<span class="brand">keys.openpgp.org</span>.
We are happy to report:
It has been a resounding success!
🥳
<h4>Adoption in clients</h4>
<p>
The
<span class="brand">keys.openpgp.org</span>
keyserver has been received very well by users,
and clients are adopting it rapidly.
It is now used by default in
<a href="https://gpgtools.org/" target="_blank">GPGTools</a>,
<a href="https://enigmail.net/" target="_blank">Enigmail</a>,
<a href="https://www.openkeychain.org/" target="_blank">OpenKeychain</a>,
<a href="https://github.com/firstlookmedia/gpgsync" target="_blank">GPGSync</a>,
Debian,
NixOS,
and others.
Many tutorials have also been updated,
pointing users our way.
<p>
At the time of writing,
more than 70.000 e-mail addresses
have been verified.
<center style="margin-top: 2em; margin-bottom: 2em;">
<img src="/assets/img/stats-addresses-2019-09-12.png" style="padding: 1px; border: 1px solid gray;" /><br />
<span style="font-size: smaller;">If that isn't a promising curve, I don't know what is :)</span>
</center>
<p>
A special shout-out here goes to GPGTools for macOS.
They implemented the update process so smoothly,
the number of verified addresses completely exploded
when they released their update.
<h4>All's good in operations</h4>
<p>
There is not a lot to report operationally,
and no news is good news in this case!
Since launch,
there was nearly zero downtime,
only a single bug came up
that briefly caused issues during upload,
and support volume has been comfortably low.
<p>
Our traffic is currently
at about ten requests per second
(more during the day, less on the weekend),
and we delivered roughly 100.000 mails
in the last month.
No sweat.
<p>
We made several small operational improvements
including deployment of
<a href="http://dnsviz.net/d/keys.openpgp.org/dnssec/" target="_blank">DNSSEC</a>,
implementing some
<a href="/about/api#rate-limiting" target="_blank">rate-limiting</a>,
nailing down our
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP">content security policy</a>
headers,
and enabling
<a href="https://blog.torproject.org/whats-new-tor-0298" target="_blank">single-hop</a>
mode on our Tor Onion Service.
You can find a more complete list
<a href="https://gitlab.com/hagrid-keyserver/hagrid/merge_requests?scope=all&utf8=%E2%9C%93&state=merged" target="_blank">here</a>.
<h4>Secure mail delivery with MTA-STS</h4>
<p>
One improvement that deserves special mention is
<a href="https://www.hardenize.com/blog/mta-sts">MTA-STS</a>,
which improves the security of outgoing e-mails.
<p>
While HTTPS is deployed fairly universally these days,
that sadly isn't the case for E-Mail.
Many servers don't do encryption at all,
or use a self-signed certificate
instead of a proper one (e.g. from Let's Encrypt).
But delivery failures upset customers more
than reduced security,
and many mails are still delivered without encryption.
<p>
With MTA-STS, domain operators can indicate
(via HTTPS)
that their mail server <em>does</em> support encryption.
When a secure connection can't be established
to such a server,
message delivery will be postponed
or eventually bounce,
instead of proceeding insecurely.
<p>
This is extremely useful for service like
<span class="brand">keys.openpgp.org</span>.
If encryption isn't reliable,
attackers can intercept verification mails relatively easily.
But for providers who have MTA-STS deployed,
we can be sure that
every message is delivered securely,
and to the right server.
<p>
You can <a href="https://aykevl.nl/apps/mta-sts/" target="_blank">run a check</a>
to find out whether your e-mail provider
supports MTA-STS.
If they don't,
please drop them a message and tell them
to step up their security game!
<h4>Work in progress</h4>
<p>
We are working on two features:
<p>
The first is <strong>localization</strong>.
Most people do not speak English,
but so far that is the only language we support.
To make this service more accessible,
we are working with the OTF's
<a href="https://www.opentech.fund/labs/localization-lab/" target="_blank">Localization Lab</a>
to make the website and outgoing e-mails
available in several more languages.
<p>
The second is to bring back
<strong>third-party signatures</strong>.
As <a href="/about/faq#third-party-signatures">mentioned in our FAQ</a>,
we currently don't support these due to spam and potential for abuse.
The idea is to require
<a href="https://gitlab.com/openpgp-wg/rfc4880bis/merge_requests/20/diffs" target="_blank">cross-signatures</a>,
which allow each key to choose for itself
which signatures from other people it wants to distribute.
Despite this extra step,
this is fairly compatible with existing software.
It also nicely stays out of the way of users
who don't care about signatures.
<p>
Although work is in progress for both of those features,
neither have a planned time of release yet.
<p>
Regarding the "<tt>no user ID</tt>" issue with GnuPG
(mentioned in our
<a href="/about/news#2019-06-12-launch-challenges">last news post</a>
and our
<a href="/about/faq#older-gnupg" target="_blank">FAQ</a>),
a patch that fixes this problem is now carried by Debian,
as well as GPGTools for macOS.
GnuPG upstream has not merged the patch so far.
<p>
That's it!
Thanks for your interest!
<span style="font-size: x-large;">👋</span>
<hr style="margin-top: 2em; margin-bottom: 2em;" />
<h2 id="2019-06-12-launch">
<div style="float: right; font-size: small; line-height: 2em;">2019-06-12 📅</div>
<a href="/about/news#2019-06-12-launch" style="color: black;">Launching a new keyserver! 🚀</a>
</h2>
<p>
From a community effort by
<a href="https://enigmail.net" target="_blank">Enigmail</a>,
<a href="https://openkeychain.org" target="_blank">OpenKeychain</a>,
and <a href="https://sequoia-pgp.org">Sequoia PGP</a>,
we are pleased to announce
the launch of the new public OpenPGP keyserver
<span class="brand">keys.openpgp.org</span>!
Hurray! 🎉
<h4>Give me the short story!</h4>
<ul>
<li>Fast and reliable. No wait times, no downtimes, no inconsistencies.</li>
<li>Precise. Searches return only a single key, which allows for easy key discovery.</li>
<li>Validating. Identities are only published with consent,
while non-identity information is freely distributed.</li>
<li>Deletable. Users can delete personal information with a simple e-mail confirmation.</li>
<li>Built on Rust, powered by <a href="https://sequoia-pgp.org" target="_blank">Sequoia PGP</a> - free and open source, running AGPLv3.</li>
</ul>
Get started right now by <a href="/upload">uploading your key</a>!
<h4>Why a new keyserver?</h4>
<p>
We created <span class="brand">keys.openpgp.org</span>
to provide an alternative to the SKS Keyserver pool,
which is the default in many applications today.
This distributed network of keyservers has been struggling with
<a target="_blank" href="https://medium.com/@mdrahony/are-sks-keyservers-safe-do-we-need-them-7056b495101c">abuse</a>,
<a target="_blank" href="https://en.wikipedia.org/wiki/Key_server_(cryptographic)#Problems_with_keyservers">performance</a>,
as well as <a href="http://www.openwall.com/lists/oss-security/2017/12/10/1">privacy issues</a>,
and more recently also
<a target="_blank" href="http://nongnu.13855.n7.nabble.com/SKS-apocalypse-mitigation-td228252.html">GDPR</a>
compliance questions.
Kristian Fiskerstrand has done a stellar job maintaining the pool for
<a target="_blank" href="https://blog.sumptuouscapital.com/2016/12/10-year-anniversary-for-sks-keyservers-net/">more than ten years</a>,
but at this point development activity seems to have
<a target="_blank" href="https://bitbucket.org/skskeyserver/sks-keyserver/pull-requests/60/clean-build-with-405">mostly ceased</a>.
<p>
We thought it time to consider a fresh approach to solve these problems.
<h4>Identity and non-identity information</h4>
<p>
The <span class="brand">keys.openpgp.org</span> keyserver splits up
identity and non-identity information in keys.
You can find more details on our <a href="/about" target="_blank">about page</a>:
The gist is that non-identity information (keys, revocations, and so on)
is freely distributed,
while identity information
is only distributed with consent
that can also be revoked at any time.
<p>
If a new key is verified for some e-mail address,
it will replace the previous one.
This way,
every e-mail address is only associated with a single key at most.
It can also be removed from the listing
at any time by the owner of the address.
This is very useful for key discovery:
if a search by e-mail address returns a key,
it means this is the single key
that is currently valid for the searched e-mail address.
<h4>Support in Enigmail and OpenKeychain</h4>
<p>
The <span class="brand">keys.openpgp.org</span> keysever
will receive first-party support in upcoming releases of
<a href="https://enigmail.net" target="_blank">Enigmail</a> for Thunderbird,
as well as
<a href="https://play.google.com/store/apps/details?id=org.sufficientlysecure.keychain&hl=en">OpenKeychain</a> on Android.
This means users of those implementations will
benefit from the faster response times,
and improved key discovery by e-mail address.
We hope that this will also give us some momentum
to build this project into a bigger community effort.
<h4 id="2019-06-12-launch-challenges">Current challenges</h4>
<p>
Privacy-preserving techniques in keyservers are still new,
and sadly there are still a few compatibility issues
caused by splitting out identity information.
<p>
In particular, when GnuPG (as of this writing, version 2.2.16) encounters
an OpenPGP key without identities,
it throws an error "no user ID"
and does not process new non-identity information
(like revocation certificates)
even if it is cryptographically valid.
We are actively engaged in
providing fixes for these issues.
<h4>The future</h4>
<p>
Privacy-preserving techniques in keyservers are still new,
and we have more ideas for reducing the metadata.
But for now, our plan is only to
keep <span class="brand">keys.openpgp.org</span> reliable and fast 🐇,
fix any upcoming bugs 🐞,
and <a href="/about#community">listen to feedback</a> from the community. 👂
<p>
For more info, head on over to
our <a target="_blank" href="/about">about page</a>
and <a target="_blank" href="/about/faq">FAQ</a> pages.
You can get started right away
by <a href="/upload" target="_blank">uploading your your key</a>!
Beyond that there is more cool stuff to discover,
like our <a target="_blank" href="/about/api">API</a>,
and an <a target="_blank" href="/about/faq#tor">Onion Service</a>!
<p>
Cheers!
<span style="font-size: x-large;">🍻</span>
</div>

View File

@ -0,0 +1,66 @@
<div class="about">
<center><h2><a href="/about">About</a> | <a href="/about/news">News</a> | <a href="/about/usage">Usage</a> | <a href="/about/faq">FAQ</a> | <a href="/about/stats">Stats</a> | Privacy</h2></center>
<p style="text-align: left;">
The public keyserver running on keys.openpgp.org processes, stores and
distributes OpenPGP key data. The specific way in which data is processed
differs by type as follows:
<ul>
<li><b>E-Mail Addresses</b>
<p>E-Mail addresses contained in <abbr title="Packet Tag 13">User
IDs</abbr> are personally identifiable information (PII).
Special care is taken to make sure they are used only with
consent:
<ul>
<li>
Publishing requires <a target="_blank"
href="https://en.wikipedia.org/wiki/Opt-in_email#Confirmed_opt-in_(COI)_/_Double_opt-in_(DOI)">double
opt-in</a> validation, to prove ownership of the
e-mail address in question.
</li>
<li>Addresses are searchable by exact E-Mail address,
but not by associated name.</li>
<li>Enumeration of addresses is not possible.</li>
<li>Deletion of addresses is possible via simple proof
of ownership in an automated fashion, similar to
publication. To unlist an address where this isn't
possible, write to support at keys dot openpgp dot
org.
</li>
</ul>
</p>
<p>This data is never handed collectively ("as a dump") to third
parties.
</p>
</li>
<li><b>Public Key Data</b>
<p>The cryptographic content of OpenPGP keys is not considered personally
identifiable information. This includes specifically
<abbr title="Packet Tags 6 and 14">public key material</abbr>,
<abbr title="Packet Tag 2, Signature types 0x10-0x13, 0x18, 0x19, 0x1F">self-signatures</abbr>, and
<abbr title="Packet Tag 2, Signature types 0x20, 0x28, 0x30">revocation signatures</abbr>.
</p>
<p>This data is not usually collectively available ("as
a dump"), but may be handed upon request to third
parties for purposes of development or research.
</p>
</li>
<li><b>Other User ID data</b>
<p>An OpenPGP key may contain personal data other than E-Mail
addresses, such as <abbr title="Packet Tag 13">User IDs</abbr>
that do not contain E-Mail addresses, or <abbr
title="Packet Tag 17">image attributes</abbr>. This data is stripped
during upload and never stored, processed, or distributed in
any way.
</p>
<p>OpenPGP packet types that were not specifically mentioned above are
stripped during upload and never stored, processed or
distributed in any way.
</p>
</li>
</ul>
<p style="text-align: left">Data is never relayed to third parties outside of
what is available from the <a href="/about/api">public API interfaces</a>,
and what is described in this policy.
</p>
</div>

View File

@ -0,0 +1,31 @@
<div class="about">
<center><h2><a href="/about">About</a> | <a href="/about/news">News</a> | <a href="/about/usage">Usage</a> | <a href="/about/faq">FAQ</a> | Stats | <a href="/about/privacy">Privacy</a></h2></center>
<h3>Verified e-mail addresses</h3>
<p>
A simple statistic of the total number of e-mail addresses that are currently verified. 📈
</p>
<p>
<center><img src="/about/stats/week.png" /></center>
</p>
<p>
<center><img src="/about/stats/month.png" /></center>
</p>
<h3>Load Average</h3>
<p>
The "load average" of a server is a statistic of how busy it is. Simply put:
<ul>
<li>0.0 means the <span class="brand">keys.openpgp.org</span> host is completely idle</li>
<li>1.0 is fairly busy</li>
<li>4.0 and above means it's on fire 🔥</li>
</ul>
</p>
<p>
<center><img src="/about/stats/load_week.png" /></center>
</p>
</div>

View File

@ -0,0 +1 @@
{{#> layout }}

View File

@ -0,0 +1 @@
{{/layout}}

View File

@ -0,0 +1,157 @@
<div class="about usage">
<center><h2><a href="/about">About</a> | <a href="/about/news">News</a> | Usage | <a href="/about/faq">FAQ</a> | <a href="/about/stats">Stats</a> | <a href="/about/privacy">Privacy</a></h2></center>
<p>
On this page, we collect information on how to use
<span class="brand">keys.openpgp.org</span> with different OpenPGP
software products.<br />
We are still in the process of adding more. If you are missing some, please
write to us and we'll try to add it.
</p>
<h2>
<div><img src="/assets/img/enigmail.svg"></div>
Enigmail
</h2>
<p>
<a href="https://enigmail.net" target="_blank">Enigmail</a> for Thunderbird
uses <span class="brand">keys.openpgp.org</span> by default since
version 2.0.12.
</p>
<p>Full support is available since Enigmail 2.1
(for <a href="https://www.thunderbird.net/en-US/thunderbird/68.0beta/releasenotes/" target="_blank">Thunderbird 68</a> or newer):
<ul>
<li>Keys will be kept up to date automatically.</li>
<li>During key creation, you can optionally upload and verify your key.</li>
<li>Keys can be discovered by e-mail address.</li>
</ul>
</p>
<h2>
<div><img src="/assets/img/gpgtools.png"></div>
GPG Suite
</h2>
<p>
<a href="https://gpgtools.org/">GPG Suite</a> for macOS
uses <span class="brand">keys.openpgp.org</span> by default
since August 2019.
</p>
<h2>
<div><img src="/assets/img/openkeychain.svg"></div>
OpenKeychain
</h2>
<p>
<a href="https://www.openkeychain.org/">OpenKeychain</a> for Android
uses <span class="brand">keys.openpgp.org</span> by default
since July 2019.
<ul>
<li>Keys will be kept up to date automatically.</li>
<li>Keys can be discovered by e-mail address.</li>
</ul>
</p>
<p>
Note that there is no built-in support for upload and e-mail verification so far.
</p>
<h2>
<div><img src="/assets/img/gnupg.svg" /></div>
GnuPG
</h2>
<p>
To configure <a href="https://gnupg.org">GnuPG</a>
to use <span class="brand">keys.openpgp.org</span> as keyserver,
add this line to your <tt>gpg.conf</tt> file:
<blockquote>
keyserver hkps://keys.openpgp.org
</blockquote>
</p>
<h4 id="gnupg-retrieve"><a href="#gnupg-retrieve">Retrieving keys</a></h4>
<ul>
<li>
To locate the key of a user, by email address:
<blockquote>gpg --auto-key-locate keyserver --locate-keys user@example.net</blockquote>
</li>
<li>To refresh all your keys (e.g. new revocation certificates and subkeys):
<blockquote>gpg --refresh-keys</blockquote>
</li>
</ul>
<h4 id="gnupg-upload"><a href="#gnupg-upload">Uploading your key</a></h4>
<p>
Keys can be uploaded with GnuPG's <tt>--send-keys</tt> command, but
identity information can't be verified that way to make the key
searchable by e-mail address (<a href="/about">what's that?</a>).
</p>
<ul>
<li>
You can try this shortcut for uploading your key, which outputs
a direct link to the verification page:
<blockquote>
gpg --export your_address@example.net | curl -T - {{ base_uri }}
</blockquote>
</li>
<li>
Alternatively, you can export them to a file and enter that into the
<a href="/upload" target="_blank">upload</a> page:
<blockquote>
gpg --export your_address@example.net &gt; my_key.pub
</blockquote>
</li>
</ul>
<h4 id="gnupg-troubleshooting"><a href="#gnupg-troubleshooting">Troubleshooting</a></h4>
<ul>
<li>
Some old <tt>~/gnupg/dirmngr.conf</tt> files contain a line like this:
<blockquote>
hkp-cacert ~/.gnupg/sks-keyservers.netCA.pem
</blockquote>
<p>
This configuration is no longer necessary,
but prevents regular certificates from working.
It is recommended to simply remove this line from the configuration.
</p>
</li>
<li>
While refreshing keys, you may see errors like the following:
<blockquote>gpg: key A2604867523C7ED8: no user ID</blockquote>
This is a <a href="https://dev.gnupg.org/T4393" target="_blank">known problem in GnuPG</a>.
We are working with the GnuPG team to resolve this issue.
</li>
</ul>
<h4 id="gnupg-tor"><a href="#gnupg-tor">Usage via Tor</a></h4>
<p>
For users who want to be extra-careful,
<span class="brand">keys.openpgp.org</span> can be reached anonymously as an
<a href="https://en.wikipedia.org/wiki/Tor_(anonymity_network)#Onion_services" target="_blank">onion service</a>.
If you have
<a href="https://www.torproject.org/" target="_blank">Tor</a>
installed, use the following configuration:
<blockquote>
keyserver hkp://zkaan2xfbuxia2wpf7ofnkbz6r5zdbbvxbunvp5g2iebopbfc4iqmbad.onion
</blockquote>
</p>
<h2 style="margin-left: 3%;">API</h2>
<p>
We offer an API for integrated support in OpenPGP applications. Check
out our <a href="/about/api">API documentation</a>.
</p>
<h2 style="margin-left: 3%;">Others</h2>
<p>
Missing a guide for your favorite implementation? This site is
a work-in-progress, and we are looking to improve. Drop us a line at
<span class="email">support at keys dot openpgp dot org</span> if you
want to help out!
</p>
</div>