3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-24 11:42:51 +01:00

nefarious: basic command handlers for NICK and SERVER

Still a bit incomplete atm. User IPs and accounts are not tracked yet.
This commit is contained in:
James Lu 2016-04-14 16:10:44 -07:00
parent db911149db
commit 3299a871f2

View File

@ -177,6 +177,8 @@ class P10Protocol(Protocol):
# If the token isn't in the list, return it raw. # If the token isn't in the list, return it raw.
return tokens.get(token, token) return tokens.get(token, token)
### COMMANDS
def spawnClient(self, nick, ident='null', host='null', realhost=None, modes=set(), def spawnClient(self, nick, ident='null', host='null', realhost=None, modes=set(),
server=None, ip='0.0.0.0', realname=None, ts=None, opertype='IRC Operator', server=None, ip='0.0.0.0', realname=None, ts=None, opertype='IRC Operator',
manipulatable=False): manipulatable=False):
@ -227,6 +229,8 @@ class P10Protocol(Protocol):
def ping(*args): def ping(*args):
pass pass
### HANDLERS
def connect(self): def connect(self):
"""Initializes a connection to a server.""" """Initializes a connection to a server."""
ts = self.irc.start_ts ts = self.irc.start_ts
@ -279,26 +283,29 @@ class P10Protocol(Protocol):
# a numeric. a P10 implementation must only send lines with a numeric source prefix. # a numeric. a P10 implementation must only send lines with a numeric source prefix.
sender = sender[1:] sender = sender[1:]
command_token = args[1].upper()
# If the sender isn't in numeric format, try to convert it automatically. # If the sender isn't in numeric format, try to convert it automatically.
sender_sid = self._getSid(sender) sender_sid = self._getSid(sender)
sender_uid = self._getUid(sender) sender_uid = self._getUid(sender)
if sender_sid in self.irc.servers: if sender_sid in self.irc.servers:
# Sender is a server (converting from name to SID gave a valid result). # Sender is a server (converting from name to SID gave a valid result).
sender = sender_server sender = sender_sid
elif sender_uid in self.irc.users: elif sender_uid in self.irc.users:
# Sender is a user (converting from name to UID gave a valid result). # Sender is a user (converting from name to UID gave a valid result).
sender = self._getUid(sender) sender = sender_uid
else: else:
# No sender prefix; treat as coming from uplink IRCd. # No sender prefix; treat as coming from uplink IRCd.
sender = self.irc.uplink sender = self.irc.uplink
args.insert(0, sender)
command_token = args[1].upper()
args = args[2:] args = args[2:]
log.debug('(%s) Found message sender as %s', self.irc.name, sender)
try: try:
# Convert the token given into a regular command, if present. # Convert the token given into a regular command, if present.
command = self._getCommand(command_token) command = self._getCommand(command_token)
log.debug('(%s) Translating token %s to command %s', self.irc.name, command_token, command)
func = getattr(self, 'handle_'+command.lower()) func = getattr(self, 'handle_'+command.lower())
@ -306,8 +313,62 @@ class P10Protocol(Protocol):
return return
else: # Send a hook with the hook arguments given by the handler function. else: # Send a hook with the hook arguments given by the handler function.
parsed_args = func(numeric, command, args) parsed_args = func(sender, command, args)
if parsed_args is not None: if parsed_args is not None:
return [numeric, command, parsed_args] return [sender, command, parsed_args]
def handle_server(self, source, command, args):
"""Handles incoming server introductions."""
# <- SERVER nefarious.midnight.vpn 1 1460673022 1460673239 J10 ABP]] +h6 :Nefarious2 test server
servername = args[0].lower()
sid = args[5][:2]
sdesc = args[-1]
self.irc.servers[sid] = IrcServer(source, servername, desc=sdesc)
if self.irc.uplink is None:
# If we haven't already found our uplink, this is probably it.
self.irc.uplink = sid
return {'name': servername, 'sid': sid, 'text': sdesc}
def handle_nick(self, source, command, args):
"""Handles the NICK command, used for user introductions and nick changes."""
if len(args) > 2:
# <- AB N GL 1 1460673049 ~gl nefarious.midnight.vpn +iw B]AAAB ABAAA :realname
nick = args[0]
ts, ident, host = args[2:5]
# TODO: fill this in
realhost = None
ip = '0.0.0.0'
uid = args[-2]
realname = args[-1]
log.debug('(%s) handle_nick got args: nick=%s ts=%s uid=%s ident=%s '
'host=%s realname=%s realhost=%s ip=%s', self.irc.name, nick, ts, uid,
ident, host, realname, realhost, ip)
self.irc.users[uid] = IrcUser(nick, ts, uid, ident, host, realname, realhost, ip)
self.irc.servers[source].users.add(uid)
# https://github.com/evilnet/nefarious2/blob/master/doc/p10.txt#L708
# Mode list is optional, and can be detected if the 6th argument starts with a +.
# This list can last until the 3rd LAST argument in the line, should there be mode
# parameters attached.
if args[5].startswith('+'):
modes = args[5:-3]
parsedmodes = utils.parseModes(self.irc, uid, modes)
utils.applyModes(self.irc, uid, parsedmodes)
# Call the OPERED UP hook if +o is being added to the mode list.
if ('+o', None) in parsedmodes:
self.irc.callHooks([uid, 'CLIENT_OPERED', {'text': 'IRC Operator'}])
# Set the accountname if present
#if accountname != "*":
# self.irc.callHooks([uid, 'CLIENT_SERVICES_LOGIN', {'text': accountname}])
Class = P10Protocol Class = P10Protocol