diff --git a/CHANGELOG.md b/CHANGELOG.md index 6173154..6afa448 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.5.0] - 2021-03-09 +### Added +- IRC service provider +- Matrix service provider +### Fixed +- Gracefully handle fetching non-existing guides + ## [2.4.2] - 2021-03-02 ### Fixed - Twitter claim verification diff --git a/content/guides/irc.md b/content/guides/irc.md new file mode 100644 index 0000000..47cab15 --- /dev/null +++ b/content/guides/irc.md @@ -0,0 +1,67 @@ +# Adding an IRC proof + +Let's add a decentralized IRC proof to your OpenPGP keys. + +[[toc]] + +### Add a property to your IRC taxonomy + +After logging in into the IRC server with your registered nickname, send the +following message (make sure to replace FINGERPRINT): + +``` +/msg NickServ SET PROPERTY KEY openpgp4fpr:FINGERPRINT +``` + +To check whether successful, send (make sure to replace NICK): + +``` +/msg NickServ TAXONOMY NICK +``` + +To add more fingerprints, send: + +``` +/msg NickServ SET PROPERTY KEY2 openpgp4fpr:FINGERPRINT +``` + +### Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +``` +gpg --edit-key FINGERPRINT +``` + +Add a new notation: + +``` +notation +``` + +Enter the notation (make sure to replace IRC_SERVER and NICK): + +``` +proof@metacode.biz=irc://IRC_SERVER/NICK +``` + +So, for user `foo` on the freenode server, this would be: + +``` +proof@metacode.biz=irc://chat.freenode.net/foo +``` + +Save the key: + +``` +save +``` + +Upload the key to WKD or use the following command to upload the key to +[keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +``` +gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT +``` + +And you're done! Reload your profile page, it should now show an IRC account. diff --git a/content/guides/matrix.md b/content/guides/matrix.md new file mode 100644 index 0000000..27c01a4 --- /dev/null +++ b/content/guides/matrix.md @@ -0,0 +1,69 @@ +# Adding a Matrix proof + +Let's add a decentralized Matrix proof to your OpenPGP keys. + +[[toc]] + +### Sending a proof message + +After logging in into Matrix, join the +[#doipver:matrix.org](https://matrix.to/#/#doipver:matrix.org) room and send the +following message (make sure to replace FINGERPRINT) + +``` +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +Click on "View Source" for that message, you should now see the value for +`room_id` and `event_id`. + +The value for `room_id` should be `!dBfQZxCoGVmSTujfiv:matrix.org`. The value +for `event_id` is unique to your message. + +If your Matrix client does not support "View Source", choose "Share" or +"Permalink". The URL obtained should look like this: + +``` +https://matrix.to/#/ROOM_ID/EVENT_ID?via=... +``` + +### Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +``` +gpg --edit-key FINGERPRINT +``` + +Add a new notation: + +``` +notation +``` + +Enter the notation (make sure to replace USER_ID, ROOM_ID, EVENT_ID): + +``` +proof@metacode.biz=matrix:u/USER_ID?org.keyoxide.r=ROOM_ID&org.keyoxide.e=EVENT_ID +``` + +So, for user `@foo:matrix.org`, this would be: + +``` +proof@metacode.biz=matrix:u/@foo:matrix.org?org.keyoxide.r=!dBfQZxCoGVmSTujfiv:matrix.org&org.keyoxide.e=$3dVX1nv3lmwnKxc0mgto_Sf-REVr45Z6G7LWLWal10w +``` + +Save the key: + +``` +save +``` + +Upload the key to WKD or use the following command to upload the key to +[keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +``` +gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT +``` + +And you're done! Reload your profile page, it should now show a Matrix account. diff --git a/package.json b/package.json index 48a8531..13b0ea1 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "keyoxide-web", - "version": "2.4.2", + "version": "2.5.0", "description": "A modern, secure and privacy-friendly platform to establish your decentralized online identity", "main": "index.js", "dependencies": { "bent": "^7.3.12", - "doipjs": "^0.10.5", + "doipjs": "^0.11.2", "dotenv": "^8.2.0", "express": "^4.17.1", "express-validator": "^6.8.0", diff --git a/routes/main.js b/routes/main.js index b8f0955..dd5a578 100644 --- a/routes/main.js +++ b/routes/main.js @@ -81,18 +81,15 @@ router.get('/guides', (req, res) => { router.get('/guides/:guideId', (req, res) => { let env = {}; - let rawContent - try { - rawContent = fs.readFileSync(`./content/guides/${req.params.guideId}.md`, "utf8", (err, data) => { - if (err) throw err; - return data; - }); - } catch (error) { - res.render(`404`) - return - } - const content = md.render(rawContent, env); - res.render(`long-form-content`, { title: `${env.title}`, content: content }); + fs.readFile(`./content/guides/${req.params.guideId}.md`, "utf8", (err, data) => { + if (err) { + res.render(`404`); + return + } + + const content = md.render(data, env); + res.render(`long-form-content`, { title: `${env.title} - Keyoxide`, content: content }); + }); }); module.exports = router; diff --git a/static/scripts.js b/static/scripts.js index a8b373b..299ccb1 100644 --- a/static/scripts.js +++ b/static/scripts.js @@ -1431,7 +1431,7 @@ if (elUtilProfileURL) { function capitalizeLetteredServices(serviceName) { const servName = serviceName.toLowerCase(); - if (servName === 'dns' || servName === 'xmpp') { + if (servName === 'dns' || servName === 'xmpp' || servName === 'irc') { return servName.toUpperCase(); } return serviceName; diff --git a/views/guides.pug b/views/guides.pug index a29fce4..61d65c9 100644 --- a/views/guides.pug +++ b/views/guides.pug @@ -40,8 +40,12 @@ block content br a(href='/guides/hackernews') Hackernews br + a(href='/guides/irc') IRC + br a(href='/guides/lobsters') Lobste.rs br + a(href='/guides/matrix') Matrix + br a(href='/guides/mastodon') Mastodon br a(href='/guides/owncast') Owncast diff --git a/yarn.lock b/yarn.lock index 276dbe3..cfec009 100644 --- a/yarn.lock +++ b/yarn.lock @@ -780,6 +780,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -872,16 +877,17 @@ doctypes@^1.1.0: resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= -doipjs@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/doipjs/-/doipjs-0.10.5.tgz#df82dd70aff2903eddd7262e63f4e80ef4a9eb49" - integrity sha512-uFgt7rL5Olq2ByTDhjWNBlnWFsQAx6x5pJfDicnioJVNPFXcSdT2PFejfZGUTAfyI/1q3NWpSDn+vuPiR5udHg== +doipjs@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/doipjs/-/doipjs-0.11.2.tgz#150e5fbce97536ad2570b492ee25ab42b0e2a9f9" + integrity sha512-UZJegmUvMBJS5luh2a64JOVMGO80KdkGY7I9noxr5rmwuiSNzhSy5571DY1z2vacYOrZ1xpxUnlzB0bC9+NiNg== dependencies: bent "^7.3.12" browserify "^17.0.0" merge-options "^3.0.3" openpgp "^4.10.9" prettier "^2.1.2" + query-string "^6.14.1" valid-url "^1.0.9" domain-browser@^1.2.0: @@ -1093,6 +1099,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -2310,6 +2321,16 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +query-string@^6.14.1: + version "6.14.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -2569,6 +2590,11 @@ source-map@~0.5.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -2613,6 +2639,11 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + string-replace-middleware@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-replace-middleware/-/string-replace-middleware-1.0.2.tgz#aa6a2f55322515d17e32b2f76327b777fb5c89f2"