4
0
mirror of https://github.com/jesopo/ircrobots synced 2024-06-20 23:07:07 +00:00
ircrobots/ircrobots/params.py

90 lines
2.0 KiB
Python
Raw Normal View History

2022-01-30 18:05:31 +00:00
from re import compile as re_compile
from typing import List, Optional
2020-09-25 18:03:02 +00:00
from dataclasses import dataclass, field
from .security import TLS, TLS_NOVERIFY, TLS_VERIFYCHAIN
2022-01-30 18:05:31 +00:00
class SASLParams(object):
mechanism: str
2022-01-30 18:05:31 +00:00
@dataclass
class _SASLUserPass(SASLParams):
2022-01-30 18:05:31 +00:00
username: str
password: str
class SASLUserPass(_SASLUserPass):
mechanism = "USERPASS"
2022-01-30 18:05:31 +00:00
class SASLSCRAM(_SASLUserPass):
mechanism = "SCRAM"
2022-01-30 18:05:31 +00:00
class SASLExternal(SASLParams):
mechanism = "EXTERNAL"
2022-01-30 18:05:31 +00:00
@dataclass
class STSPolicy(object):
2022-01-30 18:05:31 +00:00
created: int
port: int
duration: int
2022-01-30 18:05:31 +00:00
preload: bool
2020-04-25 18:30:36 +00:00
@dataclass
class ResumePolicy(object):
address: str
2022-01-30 18:05:31 +00:00
token: str
2020-04-25 18:30:36 +00:00
RE_IPV6HOST = re_compile("\[([a-fA-F0-9:]+)\]")
2022-01-30 18:05:31 +00:00
_TLS_TYPES = {"+": TLS_VERIFYCHAIN, "~": TLS_NOVERIFY}
@dataclass
class ConnectionParams(object):
nickname: str
2022-01-30 18:05:31 +00:00
host: str
port: int
tls: Optional[TLS] = TLS_VERIFYCHAIN
username: Optional[str] = None
realname: Optional[str] = None
bindhost: Optional[str] = None
2022-01-30 18:05:31 +00:00
password: Optional[str] = None
sasl: Optional[SASLParams] = None
2022-01-30 18:05:31 +00:00
sts: Optional[STSPolicy] = None
2020-04-25 18:30:36 +00:00
resume: Optional[ResumePolicy] = None
2022-01-30 18:05:31 +00:00
reconnect: int = 10 # seconds
alt_nicknames: List[str] = field(default_factory=list)
2020-09-25 18:03:02 +00:00
2022-01-30 18:05:31 +00:00
autojoin: List[str] = field(default_factory=list)
@staticmethod
2022-01-30 18:05:31 +00:00
def from_hoststring(nickname: str, hoststring: str) -> "ConnectionParams":
ipv6host = RE_IPV6HOST.search(hoststring)
if ipv6host is not None and ipv6host.start() == 0:
host = ipv6host.group(1)
2022-01-30 18:05:31 +00:00
port_s = hoststring[ipv6host.end() + 1 :]
else:
host, _, port_s = hoststring.strip().partition(":")
tls_type: Optional[TLS] = None
if not port_s:
port_s = "6667"
2021-12-09 23:49:40 +00:00
else:
tls_type = _TLS_TYPES.get(port_s[0], None)
if tls_type is not None:
port_s = port_s[1:] or "6697"
return ConnectionParams(nickname, host, int(port_s), tls_type)