from rest_framework.permissions import BasePermission from .models import ActiveTokenSession,Sistemas_por_cliente_A24,SuspensionModulo from django.utils import timezone class TokenCheckSession(BasePermission): message = 'NO' def has_permission(self,request, view): sistema = request.META.get('HTTP_SISTEMA','') mac = request.META.get('HTTP_MAC','') RFC = request.META.get('HTTP_RFC','') modulo = request.META.get('HTTP_MODULO','') permiso= request.META.get('HTTP_PERMISO','') active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) sistema_cliente = Sistemas_por_cliente_A24.objects.filter(id_sistema__nombre_sistema=sistema,cliente__RFC=RFC).first() if sistema_cliente is None: self.message +=f';El sistema:{sistema}, no se encuentra dado de alta para el RFC:{RFC}' return False modulo_ids = sistema_cliente.suspension_modulos_permisos_cliente_set.filter(suspensionmodulo__modulo__nombre=modulo).first() if modulo_ids is None: self.message +=f";El modulo:{modulo}, no se encuentra dado de alta para el RFC:{RFC} enviado" return False for modulo in modulo_ids.suspensionmodulo_set.filter(modulo__nombre=modulo): if modulo.suspendido: self.message +=f';El modulo:{modulo} se encuentra suspendido para el RFC:{RFC}' return False if modulo.modulo.suspensionpermiso_set.filter(permiso__nombre=permiso).first() is None : self.message+=f";El Permiso:{permiso} no se encuentra en el modulo" return False #Validacion para revisar los datos del device que envian con otro Token #en este caso revisa el nombre del sistemma. se pueden agregar mas filtros if active_session.token.devicea24_set.filter(sistema__nombre_sistema=sistema).first() is None: self.message+=";El Dispositivo no coicide con los datos enviados" return False inner_sistema = active_session.token.devicea24_set.first().sistema.nombre_sistema == sistema inner_mac = active_session.token.devicea24_set.first().MAC == mac #se cambia el tiempo en minutos para verificar si ya expiro #aumentar si se desea dar mas tiempo expiro = active_session.is_expired(50) if not (inner_sistema and inner_mac): self.message+=";no se agregó código de máquina y/o sistema correctamente" if expiro: self.message+=";la session expiro;logeese nuevamente" if active_session.token.devicea24_set.first() is None: self.message +=';Device not Found' return False if not (inner_sistema and inner_mac): self.message+=";no se agregó código de máquina y/o sistema correctamente" return False #actualizas y salvas si la session expiro active_session.last_time=timezone.now() active_session.has_expired =True if expiro else False active_session.save() return False if expiro else True class ActiveTokenSessionPerm(BasePermission): message = 'NO' def has_permission(self,request, view): authorization = request.META.get('HTTP_AUTHORIZATION','') sistema = request.META.get('HTTP_SISTEMA','') mac = request.META.get('HTTP_MAC','') #Solo se checa para el methodo GET para aplicaciones clarion para que no envie el body # if request.method=='GET': if not mac: self.message +=';No se proporciono MAC o codigo maquina en headers' return False if not sistema: self.message +=';No se proporciono sistema en headers' return False if 'Token' in authorization : active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) user=active_session.token.user #valida el usuario antes que todo para no crear sessiones innecesarias con superadmins if user.is_superuser or user.is_staff or user.groups.filter(name='admin').exists(): return True #verifica que este el DeviceA24 dado de alta if active_session.token.devicea24_set.first() is None: self.message +=';Device not Found' return False #print(active_session.token.devicea24_set.first().sistema.nombre_sistema) inner_mac = active_session.token.devicea24_set.first().MAC if mac != inner_mac: self.message +=f';El Codigo de maquina `{mac}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_mac}`' return False inner_sistema= active_session.token.devicea24_set.first().sistema.nombre_sistema if sistema != inner_sistema: self.message +=f';El Sistema `{sistema}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_sistema}`' return False if created: #si el registro es recien creado la session es valida return True #si la session esta expidara la renueva if active_session.has_expired:#is_expired(50): active_session.start_time = timezone.now() active_session.last_time=timezone.now() active_session.has_expired =False active_session.save() return True # if active_session.has_expired: # self.message += ';La Session ha expidado' # return False # else: # active_session.last_time=timezone.now() # active_session.save() # return True # si no encuentra el Header[Authorization] con Token no deja entrar #se espera que se envie el body con user y password else: active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) if active_session.has_expired:#is_expired(50): active_session.start_time = timezone.now() active_session.last_time=timezone.now() active_session.has_expired =False active_session.save() return True return False