add b32z encode and bt decode for exit auth

This commit is contained in:
Jeff Becker 2020-08-24 10:03:16 -04:00
parent d06864f392
commit eb4f558b56
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
2 changed files with 71 additions and 8 deletions

View File

@ -1,10 +1,74 @@
import pylokimq
import base64
import subprocess
import shlex
import argparse
import io
import time
def decode_str(data):
s = ''
l = ''
while True:
ch = data.read(1)
if ch == b':':
return data.read(int(l))
else:
l += chr(ch)
def decode_list(data):
l = []
ch = data.read(1)
assert ch == b'l'
while True:
ch = data.peek(1)
if ch == b'e':
data.read(1)
return l
l += decode_value(data)
def decode_dict(data):
d = dict()
ch = data.read(1)
assert ch == b'd'
while True:
ch = data.peek(1)
if ch == b'e':
data.read(1)
return d
k = decode_str(data)
v = decode_value(data)
d[k] = v
def decode_int(data):
ch = data.read(1)
i = ''
assert ch == b'i'
while True:
ch = data.read(1)
if ch == b'e':
return int(i)
i += chr(ch)
def decode_value(data):
ch = data.peek(1)
if ch in b'0123456789':
return decode_string(data)
if ch == b'i':
return decode_int(data)
if ch == b'd':
return decode_dict(data)
if ch == b'l':
return decode_list(data)
raise Exception("invalid char: {}".format(ch))
def decode_address(data):
return '{}.loki'.format(pylokimq.base32z_encode(decode_dict(data)[b's'][b's']))
def handle_auth(args, cmd):
cmd += decode_address(io.BytesIO(args[0]))
cmd += base64.b64encode(args[1]).decode('ascii')
result = subprocess.run(args=cmd, check=False)
if result.returncode == 0:
return "OK"

View File

@ -1,17 +1,16 @@
#include "common.hpp"
#include "lokimq/bt_serialize.h"
#include "lokimq/base32z.h"
namespace lokimq
{
void
BEncode_Init(py::module & mod)
{
auto submod = mod.def_submodule("bencode");
submod.def("decode", [](py::bytes data) {
char * ptr;
Py_ssize_t len;
PyBytes_AsStringAndSize(data.ptr(), &ptr, &len);
return bt_get(std::string_view(ptr, len));
});
mod.def("base32z_encode", [](py::bytes data) {
char * ptr = nullptr;
py::ssize_t sz = 0;
PyBytes_AsStringAndSize(data.ptr(), &ptr, &sz);
return lokimq::to_base32z(ptr, ptr+sz);
});
}
}