From 80e5041182782ee9dea5e9aea063c846e168df01 Mon Sep 17 00:00:00 2001 From: Anthony Wang Date: Wed, 18 Jan 2023 01:19:53 +0000 Subject: [PATCH] Add static files --- .well-known/webfinger | 10 ++++++++++ README.md | 34 +++++++++++++++++++++++++++++++++- main.py | 10 ++++++++++ users/test.jsonld | 22 ++++++++++++++++++++++ users/test.png | Bin 0 -> 24427 bytes 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 .well-known/webfinger create mode 100644 main.py create mode 100644 users/test.jsonld create mode 100644 users/test.png diff --git a/.well-known/webfinger b/.well-known/webfinger new file mode 100644 index 0000000..64e34b2 --- /dev/null +++ b/.well-known/webfinger @@ -0,0 +1,10 @@ +{ + "subject": "acct:test@0.exozy.me", + "links": [ + { + "rel": "self", + "type": "application/activity+json", + "href": "https://0.exozy.me/users/test.jsonld" + } + ] +} diff --git a/README.md b/README.md index 69626c3..06c228d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,35 @@ # fuwuqi -A useless C2S ActivityPub server \ No newline at end of file +Fuwuqi (fúwùqì or 服务器 means "server" in Chinese) is a useless C2S ActivityPub server for "extremely hardcore" ActivityPub enthusiasts. Craft your own exquisite WebFinger response! Customize your actor object exactly like you want! Hack and extend the 100-line Python server code! + +If that sounds like a world of pain, close this webpage now... OK, got that out of the way. Time for some fun! + +## Configuration + +First, clone this repo on your server. + +Now, generate an RSA keypair on your client device: +```bash +openssl genrsa -out private.pem 2048 +openssl rsa -in private.pem -outform PEM -pubout -out public.pem +``` + +Rename `users/test.jsonld` to your username and pop it open in your favorite text editor. You should change `0.exozy.me` to match your server's domain name, `test` to your username, and the `publicKeyPem` field to the public key you just generated. + +Onward! Now open `.well-known/webfinger` in your editor, and modify it similarly. + +That wasn't so bad, was it? (sobbing sounds) + +## Usage + +Alright, time for the real deal. Start up `python main.py` on your server. If you want to customize the port or whatever, just change the source code. + +Now on your client device, open up your favorite C2S ActivityPub client... oh wait... there aren't any! Welp, you'll just have to settle for reading the [AP spec](https://www.w3.org/TR/activitypub/) and `curl`ing some homemade JSON. That's rough, buddy. + +Like and subscribe and enjoy your new "extremely hardcore" ActivityPub server!!! 🎉😎🚀🙃🥳 + +## Resources + +- https://www.w3.org/TR/activitypub/ +- https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/ +- https://blog.joinmastodon.org/2018/07/how-to-make-friends-and-verify-requests/ diff --git a/main.py b/main.py new file mode 100644 index 0000000..5ef7f9b --- /dev/null +++ b/main.py @@ -0,0 +1,10 @@ +from http.server import SimpleHTTPRequestHandler, HTTPServer + +class fuwuqi(SimpleHTTPRequestHandler): + def do_POST(self): + self.send_response(200) + self.send_header('Content-type', 'text/html') + self.end_headers() + self.wfile.write('hi!'.encode('utf-8')) + +HTTPServer(('localhost', 4200), fuwuqi).serve_forever() diff --git a/users/test.jsonld b/users/test.jsonld new file mode 100644 index 0000000..3ad47cb --- /dev/null +++ b/users/test.jsonld @@ -0,0 +1,22 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1" + ], + "id": "https://0.exozy.me/users/test.jsonld", + "type": "Person", + "preferredUsername": "test", + "name": "Billiam Wender", + "inbox": "https://0.exozy.me/users/test.inbox", + "outbox": "https://0.exozy.me/users/test.outbox", + "icon": { + "type": "Image", + "mediaType": "image/png", + "url": "https://0.exozy.me/users/test.png" + }, + "publicKey": { + "id": "https://0.exozy.me/users/test.jsonld#main-key", + "owner": "https://0.exozy.me/users/test.jsonld", + "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnPn6SRQ1JTwqFMFJq7Bg\nxMW/4V/HYSjHPbtKL/3jwXOTmOLUz4wr4Ib1IwiKpsguz0uyX1Ljbe3qQzqaCZu5\nhdoGo+uJsanz6yAoLYwETfIFIjqQr3FoIGQxYJDELkhSO8htbOKKoRiVKsjD5x4Q\ncEkZkLAaef8WVh08sEqE3fC4uLmOlSavycbMLmah9UdhljFcaVSQ7qox9HFvKF2e\ni4BmN2WdMGZ8JN20nc0OxoZpBpMArRqF0krjIkhA5/9CvIZEULPQChYL6AcmLS0j\n/yTxE82eFMBBvyeg8ICMRzcbCoN+hVnv3cb/7+BwNdoQjZqt0RG/hhbpc8RKt+YO\n9QIDAQAB\n-----END PUBLIC KEY-----\n" + } +} diff --git a/users/test.png b/users/test.png new file mode 100644 index 0000000000000000000000000000000000000000..44eee1cac0f7715c9e055c85bb3b37d6ca18349a GIT binary patch literal 24427 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