diff --git a/Makefile b/Makefile index ed7516b..8ddf336 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,9 @@ endif clean: ifeq ($(OS), Linux) + @export echo $DBUS_SESSION_BUS_ADDRESS && \ + systemctl --user stop defender + $(info Defender has been stopped...) @if [ -e .pyenv ]; then \ rm -rf .pyenv; \ echo "Virtual Env has been removed!"; \ diff --git a/core/base.py b/core/base.py index 77cb9cf..2392ebe 100644 --- a/core/base.py +++ b/core/base.py @@ -45,7 +45,10 @@ class Base: self.install: bool = False # Initialisation de la variable d'installation self.engine, self.cursor = self.db_init() # Initialisation de la connexion a la base de données - self.__create_db() # Initialisation de la base de données + # self.__create_db() # Initialisation de la base de données + + def init(self) -> None: + self.__create_db() def __set_current_defender_version(self) -> None: """This will put the current version of Defender @@ -481,7 +484,7 @@ class Base: engine = create_engine(f'sqlite:///{full_path_db}.db', echo=False) cursor = engine.connect() - self.logs.info("-- database connexion has been initiated") + self.logs.info("-- Database connexion has been initiated") return engine, cursor def __create_db(self) -> None: @@ -535,6 +538,7 @@ class Base: vhost TEXT, password TEXT, fingerprint TEXT, + language TEXT, level INTEGER ) ''' diff --git a/core/classes/modules/rehash.py b/core/classes/modules/rehash.py index 2f8b457..aa842f8 100644 --- a/core/classes/modules/rehash.py +++ b/core/classes/modules/rehash.py @@ -15,6 +15,7 @@ REHASH_MODULES = [ 'core.base', 'core.classes.modules.commands', 'core.classes.interfaces.iprotocol', + 'core.classes.interfaces.imodule', 'core.classes.protocols.command_handler', 'core.classes.protocols.factory', 'core.classes.protocols.unreal6', diff --git a/core/classes/protocols/unreal6.py b/core/classes/protocols/unreal6.py index c80552e..606062b 100644 --- a/core/classes/protocols/unreal6.py +++ b/core/classes/protocols/unreal6.py @@ -34,7 +34,7 @@ class Unrealircd6(IProtocol): tuple[int, Optional[str]]: The position and the command. """ for index, token in enumerate(cmd): - if token.upper() in self.known_protocol: + if token.upper() in self.known_protocol and index < 3: return index, token.upper() if log: @@ -216,9 +216,9 @@ class Unrealircd6(IProtocol): self.send2socket(f":{server_id} PROTOCTL SID={server_id}") self.send2socket(f":{server_id} PROTOCTL BOOTED={unixtime}") self.send2socket(f":{server_id} SERVER {server_link} 1 :{service_info}") - self.send2socket("EOS") self.send2socket(f":{server_id} {service_nickname} :Reserved for services") self.send2socket(f":{server_id} UID {service_nickname} 1 {unixtime} {service_username} {service_hostname} {service_id} * {service_smodes} * * fwAAAQ== :{service_realname}") + self.send2socket("EOS") self.send_sjoin(service_channel_log) self.send2socket(f":{server_id} TKL + Q * {service_nickname} {service_hostname} 0 {unixtime} :Reserved for services") self.send2socket(f":{service_id} MODE {service_channel_log} {service_cmodes}") @@ -1064,7 +1064,7 @@ class Unrealircd6(IProtocol): self._Logs.error(f'Index Error {__name__}: {ie}') except ValueError as ve: self._Irc.first_score = 0 - self._Logs.error(f'Value Error {__name__}: {ve}') + self._Logs.error(f'Value Error {__name__}: {ve}', exc_info=True) except Exception as err: self._Logs.error(f"{__name__} - General Error: {err}") diff --git a/core/irc.py b/core/irc.py index 7efe779..a2edc41 100644 --- a/core/irc.py +++ b/core/irc.py @@ -6,6 +6,7 @@ import time from ssl import SSLSocket from datetime import datetime, timedelta from typing import TYPE_CHECKING, Any, Optional, Union +from xml.etree.ElementInclude import DEFAULT_MAX_INCLUSION_DEPTH from core.classes.modules import rehash from core.classes.interfaces.iprotocol import IProtocol from core.utils import tr @@ -178,14 +179,21 @@ class Irc: # 4072 max what the socket can grab buffer_size = self.IrcSocket.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) data_in_bytes = self.IrcSocket.recv(buffer_size) - data = data_in_bytes.splitlines(True) - count_bytes = len(data_in_bytes) - - while count_bytes > 4070: - # If the received message is > 4070 then loop and add the value to the variable + eol = True + if data_in_bytes[-2:] != b"\r\n": + eol = False + + while not eol: new_data = self.IrcSocket.recv(buffer_size) data_in_bytes += new_data - count_bytes = len(new_data) + if data_in_bytes[-2:] == eol: + eol = False + + # while count_bytes > 4070: + # # If the received message is > 4070 then loop and add the value to the variable + # new_data = self.IrcSocket.recv(buffer_size) + # data_in_bytes += new_data + # count_bytes = len(new_data) data = data_in_bytes.splitlines(True) @@ -441,7 +449,7 @@ class Irc: # Check if the user already exist if not self.Admin.db_is_admin_exist(nickname): - mes_donnees = {'datetime': self.Utils.get_sdatetime(), 'user': nickname, 'password': spassword, 'hostname': hostname, 'vhost': vhost, 'level': level, 'language': 'EN'} + mes_donnees = {'datetime': self.Utils.get_sdatetime(), 'user': nickname, 'password': spassword, 'hostname': hostname, 'vhost': vhost, 'level': level, 'language': self.Config.LANG} self.Base.db_execute_query(f'''INSERT INTO {self.Config.TABLE_ADMIN} (createdOn, user, password, hostname, vhost, level, language) VALUES (:datetime, :user, :password, :hostname, :vhost, :level, :language) @@ -840,17 +848,37 @@ class Irc: case 'cert': # Syntax !cert try: + if len(cmd) < 2: + self.Protocol.send_notice(dnickname, fromuser, f"Right command : /msg {dnickname} cert add") + self.Protocol.send_notice(dnickname, fromuser, f"Right command : /msg {dnickname} cert del") + return None + admin_obj = self.Admin.get_admin(fromuser) - if admin_obj: - if admin_obj.fingerprint is not None: - query = f'UPDATE {self.Config.TABLE_ADMIN} SET fingerprint = :fingerprint WHERE user = :user' - r = self.Base.db_execute_query(query, {'fingerprint': admin_obj.fingerprint, 'user': admin_obj.account}) - if r.rowcount > 0: - self.Protocol.send_notice(dnickname, fromuser, f'[ {GREEN}CERT{NOGC} ] Your new fingerprint has been attached to your account. {admin_obj.fingerprint}') - else: - self.Protocol.send_notice(dnickname, fromuser, f'[ {RED}CERT{NOGC} ] Impossible to add your fingerprint.{admin_obj.fingerprint}') - else: - self.Protocol.send_notice(dnickname, fromuser, f'[ {RED}CERT{NOGC} ] There is no fingerprint to add.') + param = cmd[1] # add or del + match param: + case 'add': + if admin_obj: + if admin_obj.fingerprint is not None: + query = f'UPDATE {self.Config.TABLE_ADMIN} SET fingerprint = :fingerprint WHERE user = :user' + r = self.Base.db_execute_query(query, {'fingerprint': admin_obj.fingerprint, 'user': admin_obj.account}) + if r.rowcount > 0: + self.Protocol.send_notice(dnickname, fromuser, f'[ {GREEN}CERT{NOGC} ] Your new fingerprint has been attached to your account. {admin_obj.fingerprint}') + else: + self.Protocol.send_notice(dnickname, fromuser, f'[ {RED}CERT{NOGC} ] Impossible to add your fingerprint.{admin_obj.fingerprint}') + else: + self.Protocol.send_notice(dnickname, fromuser, f'[ {RED}CERT{NOGC} ] There is no fingerprint to add.') + case 'del': + if admin_obj: + query = f"UPDATE {self.Config.TABLE_ADMIN} SET fingerprint = :fingerprint WHERE user =:user" + r = self.Base.db_execute_query(query, {'fingerprint': None, 'user': admin_obj.account}) + if r.rowcount > 0: + self.Protocol.send_notice(dnickname, fromuser, f'[ {GREEN}CERT{NOGC} ] Your fingerprint has been removed from your account. {admin_obj.fingerprint}') + else: + self.Protocol.send_notice(dnickname, fromuser, f'[ {RED}CERT{NOGC} ] Impossible to remove your fingerprint.{admin_obj.fingerprint}') + case _: + self.Protocol.send_notice(dnickname, fromuser, f"Right command : /msg {dnickname} cert add") + self.Protocol.send_notice(dnickname, fromuser, f"Right command : /msg {dnickname} cert del") + return None except Exception as e: self.Logs.error(e) diff --git a/core/language/fr/core-fr.yaml b/core/language/fr/core-fr.yaml index 2f491d0..b49ef8a 100644 --- a/core/language/fr/core-fr.yaml +++ b/core/language/fr/core-fr.yaml @@ -3,7 +3,7 @@ traduction: - orig: "Access denied!" trad: "Accès refusé." - orig: "Wrong password!" - tard: "Mot de passe incorrect!" + trad: "Mot de passe incorrect!" - orig: "%s - %sLoaded%s by %s on %s" trad: "%s - %sChargé%s par %s le %s" - orig: "%s - %sNot Loaded%s" diff --git a/core/loader.py b/core/loader.py index 1608d87..8cdbfd8 100644 --- a/core/loader.py +++ b/core/loader.py @@ -69,4 +69,6 @@ class Loader: self.PFactory: factory.ProtocolFactorty = factory.ProtocolFactorty(self.Irc) + self.Base.init() + self.Logs.debug(self.Utils.tr("Loader %s success", __name__)) diff --git a/mods/clone/mod_clone.py b/mods/clone/mod_clone.py index 15ee7e0..e016718 100644 --- a/mods/clone/mod_clone.py +++ b/mods/clone/mod_clone.py @@ -7,7 +7,6 @@ import mods.clone.schemas as schemas from mods.clone.clone_manager import CloneManager if TYPE_CHECKING: - from core.irc import Irc from faker import Faker class Clone(IModule):