def do_incoming_auth(event, message):
    global is_authed, connected_protoctl
    if (message.command == "PROTOCTL"):
        connected_protoctl = message
    elif (message.command == "PASS"):
        if (message.parameters[0] != config.get("Network/Password")):
            log.critical("Password mismatch!  Expected '%s', got '%s'",
                         config.get("Network/Password"), message.parameters[0])
            Network.sendMsg(
                IRCMessage(':', config.get("Server/Name"), "ERROR",
                           "Closing link: password mismatch"))
            #Network.disconnect() #this is done in the main file
            ffservices.shutdown(1)
    elif (message.command == "SERVER"):
        if (is_authed): return
        is_authed = True
        Server.addServer(
            Server.createServerFromMessage(message, connected_protoctl))
        Event.trigger("Network/LinkEstablished")
        Network.isAuthed = True
        #anything that watches for this event should do things like send user info (NICK),
        #channel membership, channel info, modes, etc at this point
        Network.sendMsg(
            IRCMessage(None, None, "netinfo", 0, int(time.time()),
                       ffservices.unrealProtocol, "*", 0, 0, 0,
                       config.get("Network/Name")))
        #TODO: keep track of my max known global users?
        Network.sendMsg(IRCMessage(None, None, "eos"))
        event.stop()
Exemplo n.º 2
0
def handle_modechg(event, message):
	target_is_channel=False
	source=message.source
	target=modelist=None
	params=[]
	if(event.eventName.split("/")[-1]=="UMODE2"):
		target=source
		modelist=message.parameters[0]
	else:
		target=message.parameters[0]
		modelist=message.parameters[1]
		if(target[0] in ("#", "&", "+")):
			target_is_channel=True
			params=message.parameters[2:]
	
	if(target_is_channel):
		if(not Server.findByName(source) is None and params[-1].isdigit()):
			timestamp=long(params[-1])
		else:
			timestamp=time.time()
		
		channel=Channel.findByName(target)
		if(channel is None): return
		if(channel.timestamp==timestamp):
			channel.setModes(modelist, params, True)
		elif(channel.timestamp>timestamp):
			channel.clearModes()
			channel.setModes(modelist, params)
	else:
		client=Client.findByNick(target)
		if(client is None): return
		client.changeModes(modelist)
		log.debug("%s changed modes of %s to %s", source, client.nick, client.usermodes)
Exemplo n.º 3
0
def run(plugin_list: bool, plugins: str):
    """
        Version 3.0 work in progress
    """

    config = Config()

    if plugin_list:
        pluginManager = PluginManager()
        pluginManager.print_plugins_list()
        exit(0)

    if plugins is not None:
        plugins = PluginManager(plugins)
        print("Loaded : {0} plugins".format(plugins.plugin_loaded()))

        # todo load data dataDriver file.json or mongo

        # check if app running in docker environment and run server or client code
        if config.docker_mode:
            if os.environ.get("IS_SERVER"):
                # run server mode
                server = Server()
            else:
                # run client mode
                client = Client()
        exit(0)

    print("No arg detected :/")
    print("Please run 'python3 Toudoum.py run --help'")
Exemplo n.º 4
0
def handle_modechg(event, message):
    target_is_channel = False
    source = message.source
    target = modelist = None
    params = []
    if (event.eventName.split("/")[-1] == "UMODE2"):
        target = source
        modelist = message.parameters[0]
    else:
        target = message.parameters[0]
        modelist = message.parameters[1]
        if (target[0] in ("#", "&", "+")):
            target_is_channel = True
            params = message.parameters[2:]

    if (target_is_channel):
        if (not Server.findByName(source) is None and params[-1].isdigit()):
            timestamp = long(params[-1])
        else:
            timestamp = time.time()

        channel = Channel.findByName(target)
        if (channel is None): return
        if (channel.timestamp == timestamp):
            channel.setModes(modelist, params, True)
        elif (channel.timestamp > timestamp):
            channel.clearModes()
            channel.setModes(modelist, params)
    else:
        client = Client.findByNick(target)
        if (client is None): return
        client.changeModes(modelist)
        log.debug("%s changed modes of %s to %s", source, client.nick,
                  client.usermodes)
Exemplo n.º 5
0
def handle_squit(event, message):
	servername=message.parameters[0]
	if(message.command=="ERROR" or servername==config.get("Server/Name")):
		log.info("Shutting down: %s", message.parameters[-1])
		ffservices.shutdown(0)
		return
	
	server=Server.findByName(servername)
	if(server is None): return
	if(server.hopcount==1):
		log.info("Removing pseudoserver %s: requested by %s: %s", server.name, message.source, message.parameters[-1])
		Server.removeServer(server)
	else:
		log.info("Server exiting: %s: SQUIT from %s: %s", server.name, message.source, message.parameters[-1])
		#luckily as long as we don't specify NOQUIT in our protoctl, unreal will notify
		#us of each user that is going away BEFORE sending us the SQUIT message, meaning
		#that the existing code for removing users is used rather than having to figure
		#out which users are exiting here.
		Server.removeServer(server)
def do_incoming_auth(event, message):
	global is_authed, connected_protoctl
	if(message.command=="PROTOCTL"):
		connected_protoctl=message
	elif(message.command=="PASS"):
		if(message.parameters[0]!=config.get("Network/Password")):
			log.critical("Password mismatch!  Expected '%s', got '%s'", config.get("Network/Password"), message.parameters[0])
			Network.sendMsg(IRCMessage(':', config.get("Server/Name"), "ERROR", "Closing link: password mismatch"))
			#Network.disconnect() #this is done in the main file
			ffservices.shutdown(1)
	elif(message.command=="SERVER"):
		if(is_authed): return
		is_authed=True
		Server.addServer(Server.createServerFromMessage(message, connected_protoctl))
		Event.trigger("Network/LinkEstablished")
		Network.isAuthed=True
		#anything that watches for this event should do things like send user info (NICK),
		#channel membership, channel info, modes, etc at this point
		Network.sendMsg(IRCMessage(None, None, "netinfo", 0, int(time.time()), ffservices.unrealProtocol, "*", 0, 0, 0, config.get("Network/Name")))
		#TODO: keep track of my max known global users?
		Network.sendMsg(IRCMessage(None, None, "eos"))
		event.stop()
Exemplo n.º 7
0
def handle_new_server(event, message):
	if(ffservices.protoctl["NS"]):
		source=Server.findByNumeric(message.source)
		server=Server(message.parameters[0], message.parameters[1], message.parameters[-1], message.parameters[2])
	else:
		source=Server.findByName(message.source)
		server=Server(message.parameters[0], message.parameters[1], message.parameters[-1])
	
	Server.addServer(server)
	log.info("Server connecting at %s: %s (numeric %d, %d hops): %s", source.name if source is not None else "[None]", server.name, server.numeric, server.hopcount, server.description)
Exemplo n.º 8
0
def handle_leave(event, message):
	source=Client.findByNick(message.source)
	if(source is None): source=Server.findByName(message.source)
	if(source is None): return
	targetchan=Channel.findByName(message.parameters[0])
	if(targetchan is None): return
	if(message.command=="PART"):
		targetuser=source
		reason=message.parameters[-1] if len(message.parameters)>1 else "[none]"
	elif(message.command=="KICK"):
		targetuser=Client.findByNick(message.parameters[1])
		if(targetuser is None): return
		reason=message.parameters[-1]
	log.debug("%s has left %s: %s: %s",
		targetuser.nick,
		targetchan.name,
		"kicked by "+(source.nick if source.__class__.__name__=="Client" else source.name) if message.command=="KICK" else "PART",
		reason
		)
	targetchan.removeClient(targetuser)
Exemplo n.º 9
0
def handle_leave(event, message):
    source = Client.findByNick(message.source)
    if (source is None): source = Server.findByName(message.source)
    if (source is None): return
    targetchan = Channel.findByName(message.parameters[0])
    if (targetchan is None): return
    if (message.command == "PART"):
        targetuser = source
        reason = message.parameters[-1] if len(
            message.parameters) > 1 else "[none]"
    elif (message.command == "KICK"):
        targetuser = Client.findByNick(message.parameters[1])
        if (targetuser is None): return
        reason = message.parameters[-1]
    log.debug(
        "%s has left %s: %s: %s", targetuser.nick, targetchan.name,
        "kicked by " +
        (source.nick if source.__class__.__name__ == "Client" else source.name)
        if message.command == "KICK" else "PART", reason)
    targetchan.removeClient(targetuser)
Exemplo n.º 10
0
def handle_sdesc(event, message):
	server=Server.findByName(message.parameters[0])
	server.description=message.parameters[-1]
Exemplo n.º 11
0
def do_net_disconnect(event):
    global is_authed
    is_authed = False
    Server.removeAllServers()
Exemplo n.º 12
0
def do_net_disconnect(event):
	global is_authed
	is_authed=False
	Server.removeAllServers()