aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar jesopo2019-11-30 19:32:38 +0000
committerGravatar jesopo2019-11-30 19:32:38 +0000
commitd6886369097c2942ffcc032f2a0eff2e6c4ff14c (patch)
treeb60bdaf1ec7708cac2ed3d0d4b1d654ae334d045 /src
parenthook in to private messages for checking hostmask perms (diff)
signature
rework permissions module to precompile hostmasks
Diffstat (limited to 'src')
-rw-r--r--src/IRCServer.py4
-rw-r--r--src/utils/irc.py23
2 files changed, 16 insertions, 11 deletions
diff --git a/src/IRCServer.py b/src/IRCServer.py
index 053a8bfa..1e069e5f 100644
--- a/src/IRCServer.py
+++ b/src/IRCServer.py
@@ -221,10 +221,6 @@ class Server(IRCObject.Object):
def irc_equals(self, s1: str, s2: str) -> bool:
return utils.irc.equals(self.case_mapping, s1, s2)
- def hostmask_match(self, hostmask: str, pattern: str) -> bool:
- return utils.irc.hostmask_match(self.irc_lower(hostmask),
- self.irc_lower(pattern))
-
def _post_read(self, lines: typing.List[str]):
for line in lines:
self.bot.log.debug("%s (raw recv) | %s", [str(self), line])
diff --git a/src/utils/irc.py b/src/utils/irc.py
index 64c0fd1c..153d6405 100644
--- a/src/utils/irc.py
+++ b/src/utils/irc.py
@@ -1,4 +1,4 @@
-import json, string, re, typing, uuid
+import dataclasses, json, string, re, typing, uuid
from . import consts
ASCII_UPPER = string.ascii_uppercase
@@ -262,19 +262,28 @@ class BatchType(object):
t = list(set([type])&self._names)
return t[0] if t else None
-def hostmask_match_many(hostmasks: typing.List[str], pattern: str
- ) -> typing.Optional[str]:
+@dataclasses.dataclass
+class HostmaskPattern(object):
+ original: str
+ pattern: typing.Pattern
+
+ def match(self, hostmask: str):
+ return bool(self.pattern.fullmatch(hostmask))
+def hostmask_parse(hostmask: str):
part1_out = []
- for part1 in pattern.split("?"):
+ for part1 in hostmask.split("?"):
part2_out = []
for part2 in part1.split("*"):
part2_out.append(re.escape(part2))
part1_out.append(".*".join(part2_out))
- pattern_re = re.compile(".".join(part1_out))
+ return HostmaskPattern(hostmask, re.compile(".".join(part1_out)))
+
+def hostmask_match_many(hostmasks: typing.List[str], pattern: HostmaskPattern,
+ ) -> typing.Optional[str]:
for hostmask in hostmasks:
- if pattern_re.match(hostmask):
+ if pattern.match(hostmask):
return hostmask
return None
-def hostmask_match(hostmask: str, pattern: str) -> bool:
+def hostmask_match(hostmask: str, pattern: HostmaskPattern) -> bool:
return not hostmask_match_many([hostmask], pattern) == None