From eb4f558b569456570160a6ac7dc6c09774d78989 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 24 Aug 2020 10:03:16 -0400 Subject: [PATCH] add b32z encode and bt decode for exit auth --- examples/exit_auth.py | 64 +++++++++++++++++++++++++++++++++++++++++++ pylokimq/bencode.cpp | 15 +++++----- 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/examples/exit_auth.py b/examples/exit_auth.py index 7485701..905515c 100644 --- a/examples/exit_auth.py +++ b/examples/exit_auth.py @@ -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" diff --git a/pylokimq/bencode.cpp b/pylokimq/bencode.cpp index 90fbea4..d039508 100644 --- a/pylokimq/bencode.cpp +++ b/pylokimq/bencode.cpp @@ -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); + }); } }