From 0fec0b2f3bcd219307d6b98dfc4e4be4a1e64959 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Mon, 21 Jun 2021 17:25:38 +0000 Subject: [PATCH] new IPPort class --- mmgen/obj.py | 29 ++++++++++++++++++++++++++++- test/objtest_py_d/ot_btc_mainnet.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/mmgen/obj.py b/mmgen/obj.py index 6baf6a12..430b42fc 100755 --- a/mmgen/obj.py +++ b/mmgen/obj.py @@ -20,7 +20,7 @@ obj.py: MMGen native classes """ -import sys,os,unicodedata +import sys,os,re,unicodedata from decimal import * from string import hexdigits,ascii_letters,digits @@ -913,6 +913,33 @@ class SeedSplitSpecifier(str,Hilite,InitErrors,MMGenObject): class SeedSplitIDString(MMGenPWIDString): desc = 'seed split ID string' +class IPPort(str,Hilite,InitErrors,MMGenObject): + color = 'yellow' + width = 0 + trunc_ok = False + min_len = 9 # 0.0.0.0:0 + max_len = 21 # 255.255.255.255:65535 + def __new__(cls,s): + if type(s) == cls: + return s + try: + m = re.fullmatch('{q}\.{q}\.{q}\.{q}:(\d{{1,10}})'.format(q=r'([0-9]{1,3})'),s) + assert m is not None, f'{s!r}: invalid IP:HOST specifier' + for e in m.groups(): + if len(e) != 1 and e[0] == '0': + die(2,f'{e}: leading zeroes not permitted in dotted decimal element or port number') + res = [int(e) for e in m.groups()] + for e in res[:4]: + assert e <= 255, f'{e}: dotted decimal element > 255' + assert res[4] <= 65535, f'{res[4]}: port number > 65535' + me = str.__new__(cls,s) + me.ip = '{}.{}.{}.{}'.format(*res) + me.ip_num = sum( res[i] * ( 2 ** (-(i-3)*8) ) for i in range(4) ) + me.port = res[4] + return me + except Exception as e: + return cls.init_fail(e,s) + from collections import namedtuple ati = namedtuple('addrtype_info', ['name','pubkey_type','compressed','gen_method','addr_fmt','wif_label','extra_attrs','desc']) diff --git a/test/objtest_py_d/ot_btc_mainnet.py b/test/objtest_py_d/ot_btc_mainnet.py index b2502436..b6909af6 100755 --- a/test/objtest_py_d/ot_btc_mainnet.py +++ b/test/objtest_py_d/ot_btc_mainnet.py @@ -330,4 +330,32 @@ tests = { ('1:2','2:2','alice:2:2','αβ:2:2','1:'+ssm,ssm+':'+ssm) ) }, + 'IPPort': { + 'arg1': 's', + 'bad': ( + '.0.0.0:0', + '127.0.0.1', + '127.0.0.1:', + '20', + ':20', + '127.0.0.256:0', + '127.0.0.1:65536', + '127.0.0.01:60000', + '0.0.0.0:00', + ), + 'good': ( + ( + '0.0.0.0:0', + '0.0.0.1:0', + '0.0.1.0:0', + '0.0.1.1:0', + '0.1.0.0:0', + '1.0.0.0:0', + '10.0.0.1:0', + '127.0.0.1:65535', + '255.0.0.0:400', + '255.255.255.255:65535', + ) + ) + }, }