mirror of
https://codeberg.org/keyoxide/keyoxide-web.git
synced 2024-12-23 07:19:28 -07:00
Remove obsolete files
This commit is contained in:
parent
0c14377a3c
commit
c5014e5e73
15 changed files with 0 additions and 870 deletions
|
@ -1,439 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2021 Yarmo Mackenbach
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU Affero General Public License as published by the Free
|
|
||||||
Software Foundation, either version 3 of the License, or (at your option)
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License along
|
|
||||||
with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If your software can interact with users remotely through a computer network,
|
|
||||||
you should also make sure that it provides a way for users to get its source.
|
|
||||||
For example, if your program is a web application, its interface could display
|
|
||||||
a "Source" link that leads users to an archive of the code. There are many
|
|
||||||
ways you could offer source, and different solutions will be better for different
|
|
||||||
programs; see section 13 for the specific requirements.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary. For
|
|
||||||
more information on this, and how to apply and follow the GNU AGPL, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
color: #444;
|
|
||||||
font-family: sans-serif;
|
|
||||||
background-color: #9dd3f0;
|
|
||||||
background-image: url('/static/img/background.svg');
|
|
||||||
background-repeat: repeat;
|
|
||||||
background-size: 512px;
|
|
||||||
background-position: -16px -16px;
|
|
||||||
}
|
|
||||||
header {
|
|
||||||
height: 64px;
|
|
||||||
padding: 8px;
|
|
||||||
margin: 0 0 48px;
|
|
||||||
font-size: 1.1em;
|
|
||||||
background-color: #fff;
|
|
||||||
box-shadow: 0 8px 16px rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
header .container {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
header a.logo {
|
|
||||||
display: inline-block;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
header .logo img {
|
|
||||||
height: 100%;
|
|
||||||
margin: 0 1em 0 0;
|
|
||||||
}
|
|
||||||
nav a {
|
|
||||||
margin-left: 12px;
|
|
||||||
}
|
|
||||||
footer {
|
|
||||||
color: #777;
|
|
||||||
margin: 64px 0;
|
|
||||||
padding: 0 32px;
|
|
||||||
font-size: 0.9em;
|
|
||||||
overflow-wrap: break-word;
|
|
||||||
}
|
|
||||||
footer a {
|
|
||||||
color: #777;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
/*max-width: 720px;*/
|
|
||||||
max-width: 770px;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.content {
|
|
||||||
padding: 16px 32px 32px;
|
|
||||||
background-color: #fff;
|
|
||||||
border-radius: 8px;
|
|
||||||
box-shadow: 0 8px 16px rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
.spacer {
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
.flex-column-container {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
.flex-column {
|
|
||||||
flex: 1 0 250px;
|
|
||||||
}
|
|
||||||
.bigBtn {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
padding: 6px 12px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 1.1em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
text-decoration: none;
|
|
||||||
background: #3f9acc;
|
|
||||||
background: linear-gradient(0deg, #3892c2 0%, #6abae5 100%);
|
|
||||||
border: 0;
|
|
||||||
border-radius: 8px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.bigBtn:hover {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #72bde6;
|
|
||||||
background: linear-gradient(0deg, #4da4d2 0%, #82c5ea 100%);
|
|
||||||
}
|
|
||||||
.fancyBtn {
|
|
||||||
display: inline-block;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
padding: 8px 24px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: 1.1em;
|
|
||||||
text-transform: uppercase;
|
|
||||||
text-decoration: none;
|
|
||||||
font-weight: bold;
|
|
||||||
background: #8b76f2;
|
|
||||||
/* background: linear-gradient(90deg, #8b76f2 0%, #6abae5 100%); */
|
|
||||||
background: linear-gradient(90deg, #6957c4 0%, #43afea 100%);
|
|
||||||
border: 0;
|
|
||||||
border-radius: 64px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.fancyBtn:hover {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #a595f4;
|
|
||||||
/* background: linear-gradient(90deg, #a595f4 0%, #93d9ff 100%); */
|
|
||||||
/* background: linear-gradient(90deg, #6957c4 0%, #43afea 100%); */
|
|
||||||
background: linear-gradient(90deg, #8b76f2 0%, #6abae5 100%);
|
|
||||||
}
|
|
||||||
.full-width {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin: 0 0 24px 0;
|
|
||||||
color: #222;
|
|
||||||
/* background-color: #9dd3f0; */
|
|
||||||
background-color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
h1::after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 4px;
|
|
||||||
margin-top: 12px;
|
|
||||||
background: linear-gradient(90deg, #8b76f2 0%, #6abae5 100%);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
h2, h3 {
|
|
||||||
margin-top: 32px;
|
|
||||||
color: #222;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
padding-right: 32px;
|
|
||||||
}
|
|
||||||
h2::after {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
height: 2px;
|
|
||||||
/* background: linear-gradient(90deg, #8b76f2 0%, #3892c2 50%, #6abae5 100%); */
|
|
||||||
background: linear-gradient(90deg, #3892c2 0%, #6abae5 100%);
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
line-height: 1.4em;
|
|
||||||
font-size: 1.1em;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #3f9acc;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #6957c4;
|
|
||||||
}
|
|
||||||
a.bigBtn {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
a.header-anchor {
|
|
||||||
text-decoration: none;
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
a.header-anchor:hover {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
ul {
|
|
||||||
list-style: "- ";
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
code {
|
|
||||||
padding: 2px;
|
|
||||||
background-color: #eee;
|
|
||||||
border: solid 1px #ddd;
|
|
||||||
user-select: all;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
display: block;
|
|
||||||
padding: 8px;
|
|
||||||
word-break: break-word;
|
|
||||||
/* word-break: break-all; */
|
|
||||||
}
|
|
||||||
textarea {
|
|
||||||
width: 100%;
|
|
||||||
height: 128px;
|
|
||||||
resize: vertical;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
}
|
|
||||||
input[type="text"] {
|
|
||||||
margin: 0 12px 12px 0;
|
|
||||||
width: 45%;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
}
|
|
||||||
input[type="radio"] {
|
|
||||||
vertical-align: sub;
|
|
||||||
}
|
|
||||||
input[type="submit"] {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
input[type="submit"][disabled="true"] {
|
|
||||||
cursor: default;
|
|
||||||
pointer-events: none;
|
|
||||||
opacity: 0.3;
|
|
||||||
}
|
|
||||||
select {
|
|
||||||
margin: 0 0 16px 0;
|
|
||||||
}
|
|
||||||
.green, a.proofUrl.proofUrl--verified {
|
|
||||||
color: #499539;
|
|
||||||
}
|
|
||||||
.red {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
.label {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 0 8px;
|
|
||||||
}
|
|
||||||
.modes {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.modes.modes--visible {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container--profile {
|
|
||||||
margin-top: 64px;
|
|
||||||
}
|
|
||||||
.container--profile .content {
|
|
||||||
padding-top: 32px;
|
|
||||||
font-size: 1.2em;
|
|
||||||
}
|
|
||||||
.container--profile footer {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.guides {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
.guides__section {
|
|
||||||
flex: 1 0 250px;
|
|
||||||
}
|
|
||||||
.guides__section a {
|
|
||||||
line-height: 1.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#profileHeader {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 32px;
|
|
||||||
background-color: #c4e3f657;
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 15px;
|
|
||||||
}
|
|
||||||
#profileAvatar {
|
|
||||||
width: 100%;
|
|
||||||
max-width: 128px;
|
|
||||||
border-radius: 100%;
|
|
||||||
margin-right: 32px;
|
|
||||||
}
|
|
||||||
#profileName {
|
|
||||||
font-size: 1.6em;
|
|
||||||
font-weight: bold;
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%;
|
|
||||||
white-space: wrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
#profileData {
|
|
||||||
background-color: #dceef957;
|
|
||||||
padding: 15px;
|
|
||||||
border-radius: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profileDataItem {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
.profileDataItem--separator {
|
|
||||||
margin-top: 1em;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.profileDataItem__label {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 32px;
|
|
||||||
padding: 0 8px;
|
|
||||||
max-width: 20%;
|
|
||||||
font-size: 0.9em;
|
|
||||||
line-height: 1.6em;
|
|
||||||
color: #777;
|
|
||||||
text-align: right;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
text-transform: capitalize;
|
|
||||||
}
|
|
||||||
.profileDataItem__value {
|
|
||||||
display: inline-block;
|
|
||||||
flex: 1;
|
|
||||||
min-height: 32px;
|
|
||||||
max-width: 100%;
|
|
||||||
padding: 0 8px;
|
|
||||||
}
|
|
||||||
.profileDataItem__value a {
|
|
||||||
display: inline-block;
|
|
||||||
max-width: 100%;
|
|
||||||
margin-right: 8px;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profileDataItem__value small {
|
|
||||||
color: white;
|
|
||||||
background: #2178ff;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 2.8px 5px;
|
|
||||||
font-size: 0.65em;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.proofUrl {
|
|
||||||
color: #777;
|
|
||||||
}
|
|
||||||
a.proofQR {
|
|
||||||
line-height: 0;
|
|
||||||
background-color: #499539;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
a.proofQR:hover {
|
|
||||||
background-color: #6abb5a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#form-generate-signature-profile {
|
|
||||||
margin-bottom: 2em;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#qrcode {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
max-width: 100%;
|
|
||||||
width: auto !important;
|
|
||||||
height: auto !important;
|
|
||||||
margin: 32px auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
noscript {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 2rem;
|
|
||||||
padding: 8px;
|
|
||||||
background-color: #f0e68c;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
noscript p {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 680px) {
|
|
||||||
#profileHeader {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
#profileAvatar {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
#profileName {
|
|
||||||
font-size: 1.2em;
|
|
||||||
}
|
|
||||||
.profileDataItem {
|
|
||||||
flex-direction: column;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
.profileDataItem__label {
|
|
||||||
max-width: 100%;
|
|
||||||
min-height: 28px;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
.profileDataItem__value {
|
|
||||||
min-height: 28px;
|
|
||||||
}
|
|
||||||
.profileDataItem--noLabel .profileDataItem__label {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#profileData .profileDataItem__value a:first-child {
|
|
||||||
max-width: 85%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#profileData #profileProofs .profileDataItem__value a:first-child {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
input[type="text"] {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 404
|
|
||||||
p The requested page could not be found :(
|
|
|
@ -1,4 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content !{ content }
|
|
|
@ -1,17 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
noscript
|
|
||||||
p Keyoxide requires JavaScript to function.
|
|
||||||
|
|
||||||
h1 Encrypt
|
|
||||||
form#form-encrypt(method='post')
|
|
||||||
h3 Recipient
|
|
||||||
label(for='modeSelect') Mode:
|
|
||||||
include partials/key_selector
|
|
||||||
|
|
||||||
h3 Message
|
|
||||||
textarea#message(name='message')
|
|
||||||
p#result
|
|
||||||
input.bigBtn(type='submit' name='submit' value='ENCRYPT MESSAGE')
|
|
|
@ -1,67 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 Guides
|
|
||||||
.guides
|
|
||||||
.guides__section
|
|
||||||
h3 Using Keyoxide
|
|
||||||
a(href='/guides/verify') Verifying a signature
|
|
||||||
br
|
|
||||||
a(href='/guides/encrypt') Encrypting a message
|
|
||||||
br
|
|
||||||
a(href='/guides/proofs') Verifying identity proofs
|
|
||||||
br
|
|
||||||
a(href='/guides/contributing') Contributing to Keyoxide
|
|
||||||
br
|
|
||||||
a(href='/guides/self-hosting-keyoxide') Self-hosting Keyoxide
|
|
||||||
|
|
||||||
.guides__section
|
|
||||||
h3 OpenPGP and identity proofs
|
|
||||||
a(href='/guides/openpgp-proofs') How OpenPGP identity proofs work
|
|
||||||
br
|
|
||||||
a(href='/guides/web-key-directory') Uploading keys using web key directory
|
|
||||||
br
|
|
||||||
a(href='/guides/signature-profiles') Using signature profiles
|
|
||||||
|
|
||||||
.guides__section
|
|
||||||
h3 Adding proofs
|
|
||||||
a(href='/guides/devto') Dev.to
|
|
||||||
br
|
|
||||||
a(href='/guides/discourse') Discourse
|
|
||||||
br
|
|
||||||
a(href='/guides/dns') Domain / DNS
|
|
||||||
br
|
|
||||||
a(href='/guides/gitea') Gitea
|
|
||||||
br
|
|
||||||
a(href='/guides/github') GitHub
|
|
||||||
br
|
|
||||||
a(href='/guides/gitlab') GitLab
|
|
||||||
br
|
|
||||||
a(href='/guides/hackernews') Hackernews
|
|
||||||
br
|
|
||||||
a(href='/guides/lobsters') Lobste.rs
|
|
||||||
br
|
|
||||||
a(href='/guides/mastodon') Mastodon
|
|
||||||
br
|
|
||||||
a(href='/guides/owncast') Owncast
|
|
||||||
br
|
|
||||||
a(href='/guides/pleroma') Pleroma
|
|
||||||
br
|
|
||||||
a(href='/guides/reddit') Reddit
|
|
||||||
br
|
|
||||||
a(href='/guides/twitter') Twitter
|
|
||||||
br
|
|
||||||
a(href='/guides/xmpp') XMPP+OMEMO
|
|
||||||
|
|
||||||
.guides__section
|
|
||||||
h3 Other services
|
|
||||||
a(href='/guides/feature-comparison-keybase') Feature comparison with Keybase
|
|
||||||
br
|
|
||||||
a(href='/guides/migrating-from-keybase') Migrating from Keybase
|
|
||||||
|
|
||||||
.guides__section
|
|
||||||
h3 Managing proofs in GnuPG
|
|
||||||
a(href='/guides/managing-proofs-listing') Listing proofs
|
|
||||||
br
|
|
||||||
a(href='/guides/managing-proofs-deleting') Deleting proofs
|
|
|
@ -1,103 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 Keyoxide
|
|
||||||
p
|
|
||||||
a(href="/") Keyoxide
|
|
||||||
| is a modern, secure and privacy-friendly platform to establish your
|
|
||||||
strong decentralized online identity
|
|
||||||
| .
|
|
||||||
|
|
||||||
a(href="/getting-started").fancyBtn Get started here
|
|
||||||
|
|
||||||
h2 About
|
|
||||||
p
|
|
||||||
strong Keyoxide
|
|
||||||
| allows you to link accounts on various online services and platforms together, prove they belong to you and establish an online identity. This puts
|
|
||||||
strong you
|
|
||||||
| , the internet citizen, in charge when it comes to defining who you are on the internet instead of large corporations.
|
|
||||||
p
|
|
||||||
| As an example, here's the
|
|
||||||
a(href='/9f0048ac0b23301e1f77e994909f6bd6f80f485d') developer's Keyoxide profile
|
|
||||||
| .
|
|
||||||
p
|
|
||||||
strong Keyoxide
|
|
||||||
| is developed by
|
|
||||||
a(href='https://yarmo.eu') Yarmo Mackenbach
|
|
||||||
| . The AGPL-v3-licensed code is hosted on
|
|
||||||
a(href='https://codeberg.org/keyoxide/web') Codeberg
|
|
||||||
| . It uses
|
|
||||||
a(href='https://github.com/openpgpjs/openpgpjs') openpgp.js
|
|
||||||
| for all cryptographic operations.
|
|
||||||
|
|
||||||
h2 Features
|
|
||||||
|
|
||||||
h3 Decentralized online identity proofs
|
|
||||||
ul
|
|
||||||
li You decide which accounts are linked together
|
|
||||||
li You decide where this data is stored
|
|
||||||
li Keyoxide does not hold your identity data on its servers
|
|
||||||
li Keyoxide merely verifies the identity proofs and displays them
|
|
||||||
|
|
||||||
h3 Empowering the internet citizen
|
|
||||||
ul
|
|
||||||
li A verified identity proof proves ownership of an account and builds trust
|
|
||||||
li No bad actor can impersonate you as long as your accounts aren't compromised
|
|
||||||
li Your online identity data is safe from greedy internet corporations
|
|
||||||
|
|
||||||
h3 User-centric platform
|
|
||||||
ul
|
|
||||||
li Easily encrypt messages and verify signatures from the profile page
|
|
||||||
li
|
|
||||||
| Keyoxide generates QR codes that integrate with
|
|
||||||
a(href='https://www.openkeychain.org/') OpenKeychain
|
|
||||||
| and
|
|
||||||
a(href='https://conversations.im/') Conversations
|
|
||||||
li Keyoxide fetches the key wherever the user decides to store it
|
|
||||||
li Keyoxide is self-hostable, meaning you could put it on any server you trust
|
|
||||||
|
|
||||||
h3 Secure and privacy-friendly
|
|
||||||
ul
|
|
||||||
li Keyoxide doesn't want your personal data, track you or show you ads
|
|
||||||
li You never give data to Keyoxide, it simply uses the data you have made public
|
|
||||||
li
|
|
||||||
| Keyoxide relies on OpenPGP, a widely used public-key cryptography standard (
|
|
||||||
a(href='https://tools.ietf.org/html/rfc4880') RFC-4880
|
|
||||||
| )
|
|
||||||
li
|
|
||||||
| Cryptographic operations are performed in-browser by
|
|
||||||
a(href='https://openpgpjs.org/') OpenPGP.js
|
|
||||||
| , a library maintained by
|
|
||||||
a(href='https://protonmail.com/blog/openpgpjs-email-encryption/') ProtonMail
|
|
||||||
|
|
||||||
h3 Free Open Source Software
|
|
||||||
ul
|
|
||||||
li
|
|
||||||
| Keyoxide is licensed under the
|
|
||||||
a(href='https://codeberg.org/keyoxide/web/src/branch/main/LICENSE') AGPL-v3 license
|
|
||||||
li
|
|
||||||
| The source code is hosted on
|
|
||||||
a(href='https://codeberg.org/keyoxide/web') Codeberg.org
|
|
||||||
li
|
|
||||||
| Even the
|
|
||||||
a(href='https://drone.keyoxide.org/keyoxide/web/') CI/CD activity
|
|
||||||
| is publicly visible
|
|
||||||
|
|
||||||
.flex-column-container
|
|
||||||
.flex-column
|
|
||||||
h2 Cryptographic operations
|
|
||||||
p
|
|
||||||
a(href='/verify') Verify PGP signature
|
|
||||||
br
|
|
||||||
a(href='/encrypt') Encrypt PGP message
|
|
||||||
br
|
|
||||||
a(href='/proofs') Verify distributed identity proofs
|
|
||||||
.flex-column
|
|
||||||
h2 Utilities
|
|
||||||
p
|
|
||||||
a(href='/util/profile-url') Profile URL generator
|
|
||||||
br
|
|
||||||
a(href='/util/wkd') Web Key Directory URL generator
|
|
||||||
br
|
|
||||||
a(href='/util/qrfp') Fingerprint QR generator
|
|
|
@ -1,24 +0,0 @@
|
||||||
select#modeSelect.modeSelect(name='modeSelect')
|
|
||||||
option(value='auto' selected=(mode == "auto" ? true : false)) Autodetect
|
|
||||||
option(value='wkd' selected=(mode == "wkd" ? true : false)) Web Key Directory
|
|
||||||
option(value='hkp' selected=(mode == "hkp" ? true : false)) Keyserver
|
|
||||||
option(value='plaintext' selected=(mode == "plaintext" ? true : false)) Plaintext
|
|
||||||
option(value='keybase' selected=(mode == "keybase" ? true : false)) Keybase
|
|
||||||
|
|
||||||
.modesContainer
|
|
||||||
.modes.modes--auto(class=(mode == "auto" ? "modes--visible" : ""))
|
|
||||||
input#auto_input(type='text' name='auto_input' placeholder='Email / key id / fingerprint' value=(mode == "auto" ? input : ""))
|
|
||||||
|
|
||||||
.modes.modes--wkd(class=(mode == "wkd" ? "modes--visible" : ""))
|
|
||||||
input#wkd_input(type='text' name='wkd_input' placeholder='name@domain.org' value=(mode == "wkd" ? input : ""))
|
|
||||||
|
|
||||||
.modes.modes--hkp(class=(mode == "hkp" ? "modes--visible" : ""))
|
|
||||||
input#hkp_input(type='text' name='hkp_input' placeholder='Email / key id / fingerprint' value=(mode == "hkp" ? input : ""))
|
|
||||||
input#hkp_server(type='text' name='hkp_server' placeholder='https://keys.openpgp.org/ (default)')
|
|
||||||
|
|
||||||
.modes.modes--plaintext(class=(mode == "plaintext" ? "modes--visible" : ""))
|
|
||||||
textarea#plaintext_input(name='plaintext_input')
|
|
||||||
|
|
||||||
.modes.modes--keybase(class=(mode == "keybase" ? "modes--visible" : ""))
|
|
||||||
input#keybase_username(type='text' name='keybase_username' placeholder='username' value=(mode == "keybase" ? username : ""))
|
|
||||||
input#keybase_fingerprint(type='text' name='keybase_fingerprint' placeholder='fingerprint' value=(mode == "keybase" ? fingerprint : ""))
|
|
|
@ -1,41 +0,0 @@
|
||||||
doctype html
|
|
||||||
head
|
|
||||||
meta(charset='utf-8')
|
|
||||||
meta(name='viewport' content='width=device-width, initial-scale=1')
|
|
||||||
meta(name='robots' content='noindex')
|
|
||||||
link(rel='shortcut icon' href='/favicon.svg')
|
|
||||||
title Keyoxide
|
|
||||||
link(rel='stylesheet' href='/static/styles.css')
|
|
||||||
|
|
||||||
main.container.container--profile
|
|
||||||
.content
|
|
||||||
noscript
|
|
||||||
p Keyoxide requires JavaScript to function.
|
|
||||||
span#profileUid(style='display: none;') #{uid}
|
|
||||||
span#profileServer(style='display: none;') #{server}
|
|
||||||
span#profileMode(style='display: none;') #{mode}
|
|
||||||
if (mode == 'sig')
|
|
||||||
#profileSigInput
|
|
||||||
form#form-generate-signature-profile(method='post')
|
|
||||||
p Please enter the raw profile signature below and press "Generate profile".
|
|
||||||
textarea#plaintext_input(name='plaintext_input')
|
|
||||||
input(type='submit', name='submit', value='Generate profile').bigBtn
|
|
||||||
#profileHeader
|
|
||||||
img#profileAvatar(src='/static/img/avatar_placeholder.png' alt='avatar' style='display: none')
|
|
||||||
p#profileName
|
|
||||||
#profileData
|
|
||||||
if (mode == 'sig')
|
|
||||||
p Waiting for input…
|
|
||||||
else
|
|
||||||
p Loading keys & verifying proofs…
|
|
||||||
footer
|
|
||||||
p
|
|
||||||
| Generated by
|
|
||||||
a(href='/') Keyoxide
|
|
||||||
| (
|
|
||||||
a(href="https://codeberg.org/keyoxide/web/releases")= settings.keyoxide_version
|
|
||||||
| ).
|
|
||||||
|
|
||||||
script(type='application/javascript' src='/static/openpgp.min.js' charset='utf-8')
|
|
||||||
script(type='application/javascript' src='/static/doip.js' charset='utf-8')
|
|
||||||
script(type='application/javascript' src='/static/scripts.js' charset='utf-8')
|
|
|
@ -1,17 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
noscript
|
|
||||||
p Keyoxide requires JavaScript to function.
|
|
||||||
|
|
||||||
h1 Proofs
|
|
||||||
form#form-proofs(method='post')
|
|
||||||
h3 Public key
|
|
||||||
label(for='modeSelect') Mode:
|
|
||||||
include partials/key_selector
|
|
||||||
|
|
||||||
h3 Result
|
|
||||||
p#result
|
|
||||||
p#resultContent
|
|
||||||
input.bigBtn(type='submit' name='submit' value='VERIFY PROOFS')
|
|
|
@ -1,41 +0,0 @@
|
||||||
doctype html
|
|
||||||
head
|
|
||||||
meta(charset='utf-8')
|
|
||||||
meta(name='viewport' content='width=device-width, initial-scale=1')
|
|
||||||
meta(name='theme-color' content='#fff')
|
|
||||||
link(rel='shortcut icon' href='/favicon.svg')
|
|
||||||
title= (title ? title : "Keyoxide")
|
|
||||||
link(rel='stylesheet' href='/static/styles.css')
|
|
||||||
header
|
|
||||||
.container
|
|
||||||
a.logo(href='/')
|
|
||||||
img(src='/static/img/logo_96.png' alt='Keyoxide logo')
|
|
||||||
.spacer
|
|
||||||
nav
|
|
||||||
a(href='/') about
|
|
||||||
a(href='/getting-started') getting started
|
|
||||||
a(href='/guides') guides
|
|
||||||
a(href='/faq') faq
|
|
||||||
|
|
||||||
main.container
|
|
||||||
block content
|
|
||||||
|
|
||||||
footer
|
|
||||||
if settings.onion_url
|
|
||||||
p
|
|
||||||
| This website is available via Tor:
|
|
||||||
a(href=`${settings.onion_url}`) #{settings.onion_url}
|
|
||||||
p
|
|
||||||
| Keyoxide
|
|
||||||
a(href="https://codeberg.org/keyoxide/web/releases")= settings.keyoxide_version
|
|
||||||
p
|
|
||||||
a(href='https://codeberg.org/keyoxide') Source code
|
|
||||||
| -
|
|
||||||
a(href='https://drone.keyoxide.org/keyoxide/web/') CI/CD
|
|
||||||
| -
|
|
||||||
a(href='https://fosstodon.org/@keyoxide') Mastodon
|
|
||||||
p © 2021 Keyoxide contributors
|
|
||||||
|
|
||||||
script(type='application/javascript' src='/static/openpgp.min.js' charset='utf-8')
|
|
||||||
script(type='application/javascript' src='/static/qrcode.min.js' charset='utf-8')
|
|
||||||
script(type='application/javascript' src='/static/scripts.js' charset='utf-8')
|
|
|
@ -1,46 +0,0 @@
|
||||||
extends ../template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 Profile URL
|
|
||||||
form#form-util-profile-url(method='post')
|
|
||||||
p This tool generates an URL for your Keyoxide profile page.
|
|
||||||
h3 Public key
|
|
||||||
label(for='source') Source:
|
|
||||||
select#source.source(name='source')
|
|
||||||
option(value='wkd') Web Key Directory
|
|
||||||
option(value='hkp') keys.openpgp.org
|
|
||||||
option(value='keybase') Keybase
|
|
||||||
br
|
|
||||||
input#input(type='text' name='input' placeholder='Input' value='')
|
|
||||||
h3 Profile URL
|
|
||||||
code#output Waiting for input...
|
|
||||||
h3 Help
|
|
||||||
p
|
|
||||||
| When using the
|
|
||||||
strong Web Key Directory
|
|
||||||
| source, the
|
|
||||||
strong Input
|
|
||||||
| looks like
|
|
||||||
strong username@domain.org
|
|
||||||
| .
|
|
||||||
p
|
|
||||||
| When using the
|
|
||||||
strong keys.openpgp.org
|
|
||||||
| source, the
|
|
||||||
strong Input
|
|
||||||
| is either the
|
|
||||||
strong fingerprint
|
|
||||||
| of your public key, or the main identity's
|
|
||||||
strong email address
|
|
||||||
| .
|
|
||||||
p
|
|
||||||
| When using the
|
|
||||||
strong Keybase
|
|
||||||
| source, the
|
|
||||||
strong Input
|
|
||||||
| is the URL obtained by going to your Keybase profile page, clicking on the
|
|
||||||
strong key id
|
|
||||||
| of your keypair and copying the URL of the
|
|
||||||
strong this key
|
|
||||||
| link.
|
|
|
@ -1,9 +0,0 @@
|
||||||
extends ../template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 QR Code
|
|
||||||
form#form-util-qr(method='post')
|
|
||||||
code#input.full-width !{input}
|
|
||||||
canvas#qrcode
|
|
||||||
a#qrcode--altLink(href='#') Press this link to directly open the URI
|
|
|
@ -1,15 +0,0 @@
|
||||||
extends ../template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 QR Code
|
|
||||||
form#form-util-qrfp(method='post')
|
|
||||||
p
|
|
||||||
| This tool generates a QR code containing the fingerprint of your public key (
|
|
||||||
a(href='https://github.com/open-keychain/open-keychain/wiki/QR-Codes') format
|
|
||||||
| ). This QR code can be scanned by apps like
|
|
||||||
a(href='https://www.openkeychain.org/') OpenKeyChain
|
|
||||||
| .
|
|
||||||
h3 Fingerprint
|
|
||||||
input#input(type='text' name='input' placeholder='Fingerprint' value=input)
|
|
||||||
canvas#qrcode
|
|
|
@ -1,21 +0,0 @@
|
||||||
extends ../template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
h1 Web Key Directory generator
|
|
||||||
form#form-util-wkd(method='post')
|
|
||||||
p
|
|
||||||
| This tool computes the part of the WKD URL that corresponds to the username when
|
|
||||||
a(href='/guides/web-key-directory') uploading keys using web key directory
|
|
||||||
| .
|
|
||||||
p
|
|
||||||
| If you enter the entire WKD identifier (username@domain.org), this tool will also generate the complete URLs.
|
|
||||||
h3 Input
|
|
||||||
input#input(type='text' name='input' placeholder='WKD username or identifier' value=input)
|
|
||||||
h3 Output
|
|
||||||
h4 Local part
|
|
||||||
code#output.full-width Waiting for input...
|
|
||||||
h4 Direct URL
|
|
||||||
code#output_url_direct.full-width Waiting for input...
|
|
||||||
h4 Advanced URL
|
|
||||||
code#output_url_advanced.full-width Waiting for input...
|
|
|
@ -1,20 +0,0 @@
|
||||||
extends template.base.pug
|
|
||||||
|
|
||||||
block content
|
|
||||||
.content
|
|
||||||
noscript
|
|
||||||
p Keyoxide requires JavaScript to function.
|
|
||||||
|
|
||||||
h1 Verify
|
|
||||||
form#form-verify(method='post')
|
|
||||||
h3 Signer
|
|
||||||
label(for='modeSelect') Mode:
|
|
||||||
include partials/key_selector
|
|
||||||
|
|
||||||
h3 Signature
|
|
||||||
textarea#signature(name='signature')
|
|
||||||
|
|
||||||
h3 Result
|
|
||||||
p#result
|
|
||||||
p#resultContent
|
|
||||||
input.bigBtn(type='submit' name='submit' value='VERIFY SIGNATURE')
|
|
Loading…
Reference in a new issue