Skip to content

Commit

Permalink
refactor: refactoriza manejo de logout y elimina duplicados de save_l…
Browse files Browse the repository at this point in the history
…ogout

- Se movió la lógica de manejo de errores de logout a un método estático `_handle_logout_errors`
- Se eliminó una llamada duplicada a `save_logout` en varios puntos del código
- Se añadió un bloque `finally` en el método `logout` para garantizar que la información del cierre de sesión se guarde en la base de datos independientemente de las excepciones que puedan ocurrir.
  • Loading branch information
plinkr committed Sep 24, 2024
1 parent ec930eb commit 6bc6807
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 35 deletions.
3 changes: 1 addition & 2 deletions nautapy/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from nautapy.__about__ import __cli__ as prog_name, __version__ as version
from nautapy.exceptions import NautaException
from nautapy.nauta_api import NautaClient, NautaProtocol
from nautapy.sqlite_utils import _get_default_user, save_login, save_logout, add_user, set_default_user, set_password, \
from nautapy.sqlite_utils import _get_default_user, save_login, add_user, set_default_user, set_password, \
remove_user, list_users, _find_credentials, list_connections, list_connections_current_month, \
list_connections_last_month

Expand Down Expand Up @@ -131,7 +131,6 @@ def down(args):
client.load_last_session()
client.user = client.session.__dict__.get("username")
client.logout()
save_logout(client.user)
print("Sesión cerrada con éxito")
else:
print("No hay ninguna sesión activa")
Expand Down
88 changes: 55 additions & 33 deletions nautapy/nauta_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,17 +201,35 @@ def logout(cls, session, username):
+ "wlanuserip={}"
).format(session.csrfhw, username, session.attribute_uuid, session.wlanuserip)
response = session.requests_session.post(logout_url)
if not response.ok:
raise NautaLogoutException(
"Fallo al cerrar la sesión: {} - {}".format(
cls._handle_logout_errors(response, username)

@staticmethod
def _handle_logout_errors(response, username):
"""
Si hay errores en el logout, los trato aquí
Args:
response (requests.Response): La respuesta de la petición de cierre de sesión.
username: El usuario al que se está cerrando sesión.
"""
error_message = None

try:
if not response.ok:
error_message = "Fallo al cerrar la sesión: {} - {}".format(
response.status_code, response.reason
)
)

if "SUCCESS" not in response.text.upper():
raise NautaLogoutException(
"Fallo al cerrar la sesión: {}".format(response.text[:100])
)
if "SUCCESS" not in response.text.upper():
error_message = "Fallo al cerrar la sesión: {}".format(response.text[:100])

if error_message:
raise NautaLogoutException(error_message)

finally:
# Guardo en la BD el usuario y la hora de cierre de sesión
# Cierra la entrada en la BD aunque hayan errores
save_logout(username)

@classmethod
def get_user_time(cls, session, username):
Expand Down Expand Up @@ -342,30 +360,36 @@ def remaining_time(self):
self.session = None

def logout(self):
for _ in range(0, MAX_DISCONNECT_ATTEMPTS):
try:
# Voy a chequear si tengo openvpn ejecutando antes del logout
if NautaProtocol.check_if_process_running("openvpn"):
print("Está ejecutando openvpn, voy a cerrarlo")
subprocess.run(("sudo", "kill_openvpn.sh"))
NautaProtocol.logout(
session=self.session,
username=self.user
try:
for _ in range(0, MAX_DISCONNECT_ATTEMPTS):
try:
# Voy a chequear si tengo openvpn ejecutando antes del logout
if NautaProtocol.check_if_process_running("openvpn"):
print("Está ejecutando openvpn, voy a cerrarlo")
subprocess.run(("sudo", "kill_openvpn.sh"))

NautaProtocol.logout(
session=self.session,
username=self.user
)
self.session.dispose()
self.session = None

return # Si el logout es exitoso, se sale del método
except RequestException as e:
print("Error al intentar cerrar la sesión:", e)
print("Esperando 10 segundos antes de volver a intentar...")
time.sleep(10)
else:
raise NautaLogoutException(
"Hay problemas en la red y no se puede cerrar la sesión.\n"
"Es posible que ya esté desconectado. Intente con '{} down' "
"dentro de unos minutos".format(prog_name)
)
self.session.dispose()
self.session = None

return
except RequestException as e:
print("Error al intentar cerrar la sesión:", e)
print("Esperando 10 segundos antes de volver a intentar...")
time.sleep(10)
else:
raise NautaLogoutException(
"Hay problemas en la red y no se puede cerrar la sessión.\n"
"Es posible que ya esté desconectado. Intente con '{} down' "
"dentro de unos minutos".format(prog_name)
)
finally:
# Guardo en la BD el usuario y la hora de cierre de sesión
# Cierra la entrada en la BD sin importar si hubo excepciones o no
save_logout(self.user)

def load_last_session(self):
self.session = SessionObject.load()
Expand All @@ -376,5 +400,3 @@ def __enter__(self):
def __exit__(self, exc_type, exc_val, exc_tb):
if SessionObject.is_logged_in():
self.logout()
# Guardo en la BD el usuario y la hora de cierre de sesión
save_logout(self.user)

0 comments on commit 6bc6807

Please sign in to comment.