summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2016-04-16 11:39:58 -0700
committeriximeow <me@iximeow.net>2016-04-16 11:39:58 -0700
commit2d7f23ca67b144f1fd8a45621f5833394eaf6d35 (patch)
treedc63d5f156ef527d2e75071bc2a48609366263c4
parent6790fa64617eb278e71a46677fef435551c388a3 (diff)
notesd initial commit ishHEADmaster
-rw-r--r--httpd.py41
-rw-r--r--newuser.py67
-rwxr-xr-xnotesd.run2
-rw-r--r--ok@ok.ok.asc51
-rw-r--r--ok@ok.ok.privkey105
-rw-r--r--user2.gpg30
-rw-r--r--user2.gpg.key57
-rw-r--r--user2_id_rsa27
-rw-r--r--user2_id_rsa.pub1
9 files changed, 381 insertions, 0 deletions
diff --git a/httpd.py b/httpd.py
new file mode 100644
index 0000000..f61b22b
--- /dev/null
+++ b/httpd.py
@@ -0,0 +1,41 @@
+#! /usr/bin/env python3
+
+from http.server import *
+import json
+import tempfile
+import base64
+
+class HandlerClass(BaseHTTPRequestHandler):
+ def __init__(self, request, client_address, server):
+ self.timeout = 20
+ BaseHTTPRequestHandler.__init__(self, request, client_address, server)
+
+ def do_POST(self):
+ to_read = int(self.headers['Content-Length'])
+ data = self.rfile.read(to_read)
+ if len(data) > 0:
+ dat_str = data.decode("ascii")
+ body = json.loads(dat_str)
+ ssh_key = body['ssh']
+ gpg_key = body['gpg']
+ print("your (base64) ssh_key: " + ssh_key)
+ print("your (base64) gpg_key: " + gpg_key)
+ ssh_keypath = as_tempfile(base64.b64decode(ssh_key))
+ gpg_keypath = as_tempfile(base64.b64decode(gpg_key))
+ recv_keys(ssh_keypath, gpg_keypath)
+
+ self.send_response(200)
+ self.end_headers()
+
+def as_tempfile(content):
+ tmpfile = tempfile.NamedTemporaryFile()
+ tmpfile.write(content)
+ return tmpfile
+
+def main():
+ print("Running on port whatever")
+ server_address = ('', 8002)
+ httpd = HTTPServer(server_address, HandlerClass)
+ httpd.serve_forever()
+
+main()
diff --git a/newuser.py b/newuser.py
new file mode 100644
index 0000000..4e0a0cd
--- /dev/null
+++ b/newuser.py
@@ -0,0 +1,67 @@
+#! /usr/bin/env python
+
+from subprocess import call
+import base64
+
+import gnupg # python-gnupg
+
+root_user_fs_path = './user_fses/'
+root_repo_path = './repos/'
+
+authorized_keys_base = '/var/authorized_keys/'
+
+gpg = gnupg.GPG(gnupghome='/does/not/exist')
+
+def recv_keys(gpg_key_path, ssh_key_path):
+ fingerprint = full_fingerprint(gpg_key_path)
+ username = tiny_gpg_fingerprint(fingerprint)
+ alloc_user(username)
+ add_key(username, ssh_key_path)
+ print("gpg key: %s, ssh key: %s" % (gpg_key_path, ssh_key_path))
+ print("username: %s, gpg fingerprint: %s" % (username, fingerprint))
+ return True
+
+def full_fingerprint(gpg_key_path):
+ keys = gpg.scan_keys(gpg_key_path)
+ if (len(keys) == 0):
+ raise "hell"
+ if (len(keys) != 1):
+ raise "the roof"
+ return keys[0]["fingerprint"]
+
+# the s/./=/g thing here is because
+# = is apparently not valid in a username!
+# but having the padding around is nice. so keep it.
+# so turn it into valid characters!
+def untiny_gpg_fingerprint(tiny):
+ return binascii.unhexlify(
+ base64.b64decode(tiny.replace('.', '='), '-_')
+ )
+
+def tiny_gpg_fingerprint(raw_fingerprint):
+ fingerprint_bytes = raw_fingerprint.decode('hex')
+ return base64.b64encode(fingerprint_bytes, '-_').replace('=', '.')
+
+def add_key(username, ssh_key_path):
+ with open(ssh_key_path, 'r') as key_file:
+ ssh_key = key_file.read()
+ with open(authorized_keys_base + username, 'a+') as user_authorized_keys:
+ user_authorized_keys.write(ssh_key)
+ return True
+
+def alloc_user(username):
+
+ if username == '':
+ raise Exception("Username must not be empty and must be alphanumeric (but it's derived from your full gpg key id, so how did you do that?")
+
+ fs_path = root_user_fs_path + username
+ repo_path = root_repo_path + username
+# [D]on't give a password (ssh login only)
+# Don't create a [H]ome directory
+# Set the login [s]hell to a non-shell to disallow logins
+ call(['adduser', '-D', '-H', '-s', '/bin/false', username])
+ call(['dd', 'if=/dev/zero', 'of=' + fs_path, 'bs=4096', 'count=32768'])
+ call(['mkfs.ext4', '-q', fs_path])
+ call(['mkdir', repo_path])
+ call(['mount', '-o', 'loop,rw', fs_path, repo_path + '/'])
+ call(['touch', repo_path + '/git-daemon-export-ok'])
diff --git a/notesd.run b/notesd.run
new file mode 100755
index 0000000..4df68d1
--- /dev/null
+++ b/notesd.run
@@ -0,0 +1,2 @@
+#! /bin/sh
+qemu-system-x86_64 -cpu host -enable-kvm -hda notesd-test.img
diff --git a/ok@ok.ok.asc b/ok@ok.ok.asc
new file mode 100644
index 0000000..9b9e220
--- /dev/null
+++ b/ok@ok.ok.asc
@@ -0,0 +1,51 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+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
+=gL+n
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/ok@ok.ok.privkey b/ok@ok.ok.privkey
new file mode 100644
index 0000000..45f5262
--- /dev/null
+++ b/ok@ok.ok.privkey
@@ -0,0 +1,105 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v1
+
+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
+=jCoW
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/user2.gpg b/user2.gpg
new file mode 100644
index 0000000..9710265
--- /dev/null
+++ b/user2.gpg
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+mQENBFbvqlQBCADgDkOVU0omwe7rwgfmDtOrQKsH7X6eFqMJglYg931cbBzHA0A2
+ZXKuSW/xA8aqUn2saaLilP2D90J9mU+rZvvlRubgyAVVQlCYqIDAz+sFW1lRtb+S
+uLBHAiwV30D6sXxwOxlLaBGgddlDBfdypQW6ayIcycgwsQhnrBeu8OTAqg4O7dSG
+HQUusbFnru6nVimRpwtmroSatBE9W+5lRA96imVI37KqaAffWlfebrN2Vcvd88nN
+eCWt3+/TTleUZi89TGGQHjcWbTov5/5EVrav5vu1R+nL2FK+dUG29eC0ygsGXGqz
+N4SmhYDqlMnhfgpCZSoZxFh3rwML+j+U/rE7ABEBAAG0GXVzZXIyIDx1c2VyMkB1
+c2VyMi51c2VyMj6JAT4EEwECACgFAlbvqlQCGwMFCQBPGgAGCwkIBwMCBhUIAgkK
+CwQWAgMBAh4BAheAAAoJECtFmM6ddWu3cKUH/imIxa7+3Rkd6DNHq33MY59MCWCy
+w+AgpSjA1cS/wr3syWqtRW374Yl/F9iA+cq77ZJMYtnoLrQjbNHWRDMw6u7DQpXh
+OLzb3KzL12b3tu0TosE9nZ4Yg+84EXkp+NLP15wPNAXWJffqy6N21uoQMSy04wXC
+NAVd1uEALLNErcZcj9mq9cZ2SxObw1clvdhJxntuYDl5vn32HX1IW6QaqKpY61AH
+OJQXiImiDHFn0LdyCIwkgfyN8wpa5zrHUoA16JvkK2lJmhIsmLhB0cGjz1nJGkO6
+CP5rwroQbZrjC+ksFoVXJQyY3jxNMna0QVEOSBILDwj8xZ+BvYWdAQHqByq5AQ0E
+Vu+qVAEIAOn9b1xtAACtFsgv+LH4K9kR23i6jEinLaS2UHSWRZmTepZAjI1cUXpr
+EPwqnpktGUmpCrRZsdMudENnPnl4nK3D3Tl8atOjf7mSZsFCd5M2OJxO2vQ3MkXC
+tszOHz/kgeipXVmr2sbp368uU7cJkVHCYwkzWbAtqT0qzSueFxOpnpQacLyK7IVt
+DyZGezf5Ykf9n6Z+U0U512AtSHIFKy4PFHezsT6IEQ+DU+8RvS6H+/00yVPh1Hye
+ZIu/STqXb/9mHYbAR2y7U+cNm60kPqY5DPKdk9RPla17mS7o5rOo4omcksBmrK6u
+WIlk/mFxT7z9wHnBtnyCEoHZk53y+0EAEQEAAYkBJQQYAQIADwUCVu+qVAIbDAUJ
+AE8aAAAKCRArRZjOnXVrt2mTB/9Y5sYEgnClykYr9LjWstmZ7eRXWMbr7mIpj3lh
+L16qNDgoDGIJlZgO+rc3EqyJkP63WQnVlPw2VjrkPEEWQ4uScnh3BNGcOdAva0DM
+PqmC5w+xgnEX/dkrUwUdDUQm1/bSFhH629KZoZOK58lHxd+a5/ewys0WN/i42+rj
++yW0wBfkLVTb5f6FickNpBv5kvPDghFFh2SYiLVF53F5f33MLkPzxRTbcuNvvQy7
+bc6fd9lv3tSy8xws8b0fqXL+i6yhcL4VmSJMmUb4wRxHIq+0/BKZP/phDN0lleQQ
+wEQpC1Phbz8RBsurc7daMn4QLfVLNtPuEnmYqYcKrdI9krlN
+=9k5w
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/user2.gpg.key b/user2.gpg.key
new file mode 100644
index 0000000..fc6c4be
--- /dev/null
+++ b/user2.gpg.key
@@ -0,0 +1,57 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v1
+
+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
+=Pt3j
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/user2_id_rsa b/user2_id_rsa
new file mode 100644
index 0000000..f2a2fc1
--- /dev/null
+++ b/user2_id_rsa
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAwL60hX/ImOYxsV5QbQ0G998gfog+tSKqwq7TyVvTOnKQwFh3
+VVDaVJmvKu3DQRdpbOVi9K4lqxAYiUgt9wb4eCOBYGIai2+DCNpIftLvK9UE3UNB
+A36xEQA9Ij+7Bbm5I1wqwMVm6qLMH2ZkDrVKxY+3cvGAe/ZrXdFaPXsH0y/sRsHZ
+4GFaYluSF8B5T1QRfZ8bqzSJrWByG/UAQJtvOC8Rmn8uRzPW000F3aPbtmINhQUV
+IY/WtUqPFCk0kmZf+JhkOkIRgm/tk+jGMDKuwDtg1UYqFDuYE1XyzrQZcLNIwNgz
+WsPB9E/Bhw9Y78WDIuy2Aeq/okM269esZgurdwIDAQABAoIBADVsZnLeQUaH/1wP
+LTGcu8K2eLY5o0/nhPcjKBaWugxoNtDpdGIUX/+0/UVj04vWJmWFixEQt+YbNwHO
+HNdsejAqfzCs4HinduVcQ13Lr3kxuQBvJLUIR6HTtB4rFfZ3TOaNJFh8HpOIfhVx
+9ufQviHWPN3CLH+vhIDjhySlVjzlf2hlAb3BYczom6mMYESrfbdPuJ0ScWbrvTXM
+vMDsR0NHu1/AiE/3nOql7fcShyuUrAw9IBPzXB/EQxyqWYJUZ+KXXrcTjpKtDfAH
+fBVzN0CLBMjfIPJlYpf9ft+/iJHw/2GrE3hi4Yx9Dj4M9+QlVFwyiJ2PR3fl0me7
+YG7H+0kCgYEA4tQWPcTyyjNaCIRmvhR8lgFZhA/KY6Jd1qjQkYorrR1foUstQqju
+j7uiO7bvvZqufL2pkf+TBiEYitwJX+VlofGHXABifyTnnkzlV5Kf+K5YFJ876/lo
+Kq4dyFxB6pUmzk+N2qqRC/RGFfZl+ISdfUCFRL7WKrd3/ElPFTsCbksCgYEA2Yh7
+A90KT8Y7jOY7Kok3bBzbF5pbW7t7L3YaQ3rhAdqPaz5eDbdirWsWA9Hifo81zfU2
+uZZRxDtKgwsiA0H+5KDjb9TvZzWORscynS4JXVuMYZ610FOk8tnk9mJKJ4Ipp0Na
+0boShfrfB0fz4yh3CRcV2KzoD7isyKgeErD8DAUCgYBtpZgaw9mZZLlg5J/FwqF2
+4bAj5n4vK42w9mnb8K6sQEa58V0vm/m2AT2rIAND5EH0irotmR25GMaEWVkuwfUf
+E2IbVxRF4dEU9JbofjhWPfDWByMwLp/sAb7j27UBcJgRouMvkMQMw0gd1b31JCX9
+JfNGB/n/LDEUA1v3J09FgQKBgDrPcSKMQdtrZnIjVF+dlUQ/UORCsOxN9XHRZixU
+LjzID/oYdGkU6TKlPuBtf+RjZ1J1NwRZpWV9+hkPi3SCBR1eed6kHM00Z3CvLfnc
+ll+M/pjtxY26719QlVwfGpkv0X8M8KK+wX9DYcSgKUmCiRwGB7v6kwqdDOl6uhan
+jpzZAoGBAN5WnzhILWsMrXpQmi3ToniWNgAVrt/nnmkKN9OEMMZ7mZi4YM0uSVVe
+LHEFt6qh7OEla+NRxVjLdzyr3o/pFFaaf/wO/Hn+Tu3XYSiLStJqDv1jYTK0aY67
+RqzMvQrvZQSLv4qo0gF22rJYyI7X6Z4S8UTq0FjUSIb6ErxAGftW
+-----END RSA PRIVATE KEY-----
diff --git a/user2_id_rsa.pub b/user2_id_rsa.pub
new file mode 100644
index 0000000..2a74c92
--- /dev/null
+++ b/user2_id_rsa.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAvrSFf8iY5jGxXlBtDQb33yB+iD61IqrCrtPJW9M6cpDAWHdVUNpUma8q7cNBF2ls5WL0riWrEBiJSC33Bvh4I4FgYhqLb4MI2kh+0u8r1QTdQ0EDfrERAD0iP7sFubkjXCrAxWbqoswfZmQOtUrFj7dy8YB79mtd0Vo9ewfTL+xGwdngYVpiW5IXwHlPVBF9nxurNImtYHIb9QBAm284LxGafy5HM9bTTQXdo9u2Yg2FBRUhj9a1So8UKTSSZl/4mGQ6QhGCb+2T6MYwMq7AO2DVRioUO5gTVfLOtBlws0jA2DNaw8H0T8GHD1jvxYMi7LYB6r+iQzbr16xmC6t3 iximeow@ivorytower