3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-01 01:09:22 +01:00

Irc: introduce matchHost() wrapper around ircmatch

This makes the latter a core dependency. Refactor changehost and opercmds plugins to take advantage of this new core function.
This commit is contained in:
James Lu 2016-07-06 23:11:36 -07:00
parent 37e1c7d538
commit d3877b0194
2 changed files with 33 additions and 2 deletions

View File

@ -18,8 +18,8 @@ You can also find support via our IRC channels: `#PyLink @ irc.overdrivenetworks
* Python 3.4+ * Python 3.4+
* PyYAML (`pip install pyyaml`) * PyYAML (`pip install pyyaml`)
* [ircmatch](https://github.com/mammon-ircd/ircmatch) (`pip install ircmatch`)
* *For the servprotect plugin*: [expiringdict](https://github.com/mailgun/expiringdict) (note: unfortunately, installation is broken in pip due to [mailgun/expiringdict#13](https://github.com/mailgun/expiringdict/issues/13)) * *For the servprotect plugin*: [expiringdict](https://github.com/mailgun/expiringdict) (note: unfortunately, installation is broken in pip due to [mailgun/expiringdict#13](https://github.com/mailgun/expiringdict/issues/13))
* *For the changehost and opercmds plugins*: [ircmatch](https://github.com/mammon-ircd/ircmatch) (`pip install ircmatch`)
## Supported IRCds ## Supported IRCds

View File

@ -11,12 +11,13 @@ import threading
from random import randint from random import randint
import time import time
import socket import socket
import threading
import ssl import ssl
import hashlib import hashlib
from copy import deepcopy from copy import deepcopy
import inspect import inspect
import ircmatch
from . import world, utils, structures, __version__ from . import world, utils, structures, __version__
from .log import * from .log import *
@ -908,6 +909,36 @@ class Irc():
raise utils.NotAuthenticatedError("You are not authenticated!") raise utils.NotAuthenticatedError("You are not authenticated!")
return True return True
def matchHost(self, glob, target, ip=True, realhost=True):
"""
Checks whether the given host, or given UID's hostmask matches the given nick!user@host
glob.
If the target given is a UID, and the ip or realhost options are True, this will also match
against the target's IP address and real host, respectively.
"""
# Get the corresponding casemapping value used by ircmatch.
casemapping = getattr(ircmatch, self.proto.casemapping)
# Prepare a list of hosts to check against.
if target in self.users:
hosts = {self.getHostmask(target)}
if ip:
hosts.add(self.getHostmask(target, ip=True))
if realhost:
hosts.add(self.getHostmask(target, ip=True))
else: # We were given a host, use that.
hosts = [target]
# Iterate over the hosts to match using ircmatch.
for host in hosts:
if ircmatch.match(casemapping, glob, host):
return True
return False
class IrcUser(): class IrcUser():
"""PyLink IRC user class.""" """PyLink IRC user class."""
def __init__(self, nick, ts, uid, ident='null', host='null', def __init__(self, nick, ts, uid, ident='null', host='null',