def alumneRecoverPasswd(request, username, oneTimePasswd): client_address = getClientAdress(request) infoForm = [ ( 'Usuari', username, ), ] if request.method == 'POST': form = recuperacioDePasswdForm(request.POST) errors = [] if form.is_valid(): passwd = form.cleaned_data['p1'] data_neixement = form.cleaned_data['data_neixement'] alumneOK = True try: alumneUser = AlumneUser.objects.get(username=username) dataOK = data_neixement == alumneUser.getAlumne( ).data_neixement a_temps = datetime.now() - timedelta(minutes=30) codiOK = OneTimePasswd.objects.filter( usuari=alumneUser.getUser(), clau=oneTimePasswd, moment_expedicio__gte=a_temps, reintents__lt=3) except AlumneUser.DoesNotExist: alumneOK = False if not alumneOK: errors.append( u'Dades incorrectes. Demaneu un altre codi de recuperació. Si el problema persisteix parleu amb el tutor.' ) elif codiOK and not dataOK: errors.append(u'La data proporcionada no és correcta.') codiOK[0].reintents += 1 codiOK[0].save() elif dataOK and not codiOK: errors.append( u"L'enllaç que esteu utilitzant està caducat o no és correcta. Demaneu un altre codi de recuperació." ) elif not dataOK and not codiOK: errors.append( u"Dades incorrectes. Demaneu un altre codi de recuperació." ) #todoBloquejar oneTimePasswd elif alumneUser.alumne.esBaixa(): errors.append( u'Cal parlar amb el tutor per recuperar accés a aquest compte.' ) elif codiOK and dataOK and not alumneUser.alumne.esBaixa(): alumneUser.set_password(passwd) alumneUser.is_active = True alumneUser.save() if alumneUser.alumne.motiu_bloqueig: alumneUser.alumne.motiu_bloqueig = u"" alumneUser.alumne.save() user = authenticate(username=alumneUser.username, password=passwd) login(request, user) if not errors: codiOK.update(reintents=3) #apunto el login: LoginUsuari.objects.create(usuari=user, exitos=True, ip=client_address) url_next = '/' return HttpResponseRedirect(url_next) else: try: #apunto el login: LoginUsuari.objects.create(usuari=alumneUser, exitos=False, ip=client_address) except: pass form._errors.setdefault(NON_FIELD_ERRORS, []).extend(errors) else: form = recuperacioDePasswdForm() return render(request, 'form.html', { 'form': form, 'infoForm': infoForm, 'head': u'Recuperació de Contrasenya' })
def alumneRecoverPasswd( request , username, oneTimePasswd ): client_address = getClientAdress( request ) infoForm = [ ('Usuari',username,),] if request.method == 'POST': form = recuperacioDePasswdForm( request.POST ) errors = [] if form.is_valid( ): passwd = form.cleaned_data['p1'] data_neixement = form.cleaned_data['data_neixement'] alumneOK = True try: alumneUser = AlumneUser.objects.get( username = username) dataOK = data_neixement == alumneUser.getAlumne().data_neixement a_temps = datetime.now() - timedelta( minutes = 30 ) codiOK = OneTimePasswd.objects.filter( usuari = alumneUser.getUser(), clau = oneTimePasswd, moment_expedicio__gte = a_temps, reintents__lt = 3 ) except AlumneUser.DoesNotExist: alumneOK = False if not alumneOK: errors.append( u'Dades incorrectes. Demaneu un altre codi de recuperació. Si el problema persisteix parleu amb el tutor.') elif codiOK and not dataOK: errors.append( u'La data proporcionada no és correcta.') codiOK[0].reintents += 1 codiOK[0].save() elif dataOK and not codiOK: errors.append( u"L'enllaç que esteu utilitzant està caducat o no és correcta. Demaneu un altre codi de recuperació.") elif not dataOK and not codiOK: errors.append( u"Dades incorrectes. Demaneu un altre codi de recuperació.") #todoBloquejar oneTimePasswd elif alumneUser.alumne.esBaixa(): errors.append( u'Cal parlar amb el tutor per recuperar accés a aquest compte.') elif codiOK and dataOK and not alumneUser.alumne.esBaixa(): alumneUser.set_password( passwd ) alumneUser.is_active = True alumneUser.save() if alumneUser.alumne.motiu_bloqueig: alumneUser.alumne.motiu_bloqueig = u"" alumneUser.alumne.save() user = authenticate(username=alumneUser.username, password=passwd) login( request, user ) if not errors: codiOK.update( reintents = 3 ) #apunto el login: LoginUsuari.objects.create( usuari = user, exitos = True, ip = client_address) url_next = '/' return HttpResponseRedirect( url_next ) else: try: #apunto el login: LoginUsuari.objects.create( usuari = alumneUser, exitos = False, ip = client_address) except: pass form._errors.setdefault(NON_FIELD_ERRORS, []).extend( errors ) else: form = recuperacioDePasswdForm( ) return render( request, 'form.html', {'form': form, 'infoForm':infoForm, 'head': u'Recuperació de Contrasenya' } )
def loginUser(request): head = u'Login' client_address = getClientAdress(request) try: acces_restringit_a_grups = settings.ACCES_RESTRINGIT_A_GRUPS except AttributeError: acces_restringit_a_grups = None url_next = '/' if request.method == 'POST': form = loginUsuariForm(request.POST) if form.is_valid(): username = form.cleaned_data['usuari'] paraulaDePas = form.cleaned_data['paraulaDePas'] user = authenticate(username=username, password=paraulaDePas) if user is not None: #Usuari i passwd estan bé if acces_restringit_a_grups and not user.groups.filter( name__in=acces_restringit_a_grups).exists(): LoginUsuari.objects.create( usuari=user, exitos=False, ip=client_address) #TODO: truncar IP form._errors.setdefault( NON_FIELD_ERRORS, []).append(u'''El sistema està en mode restringit.''') else: if user.is_active: login(request, user) LoginUsuari.objects.create( usuari=user, exitos=True, ip=client_address) #TODO: truncar IP return HttpResponseRedirect(url_next) else: LoginUsuari.objects.create( usuari=user, exitos=False, ip=client_address) #TODO: truncar IP form._errors.setdefault(NON_FIELD_ERRORS, []).append( u'''Aquest compte està desactivat. Punxa a l'enllaç de recuperar contrasenya.''' ) else: #Error d'usuari i passwd try: user = User.objects.get(username=username) #apunto el fallo: LoginUsuari.objects.create(usuari=user, exitos=False, ip=client_address) if user.is_active: #comprova 3 intents fallits des del darrer intent bó. #fa_5_minuts = datetime.now() - timedelta(minutes = 5) logins_anteriors = LoginUsuari.objects.filter( usuari=user #,moment__gte = fa_5_minuts ).order_by('-moment')[:3] tresFallos = logins_anteriors.count() == 3 and all( not x.exitos for x in logins_anteriors) if tresFallos and user.is_active: user.is_active = False user.save() #no aviso per no donar pistes de que això sigui un usuari real. try: #si és un alumne ho haig d'apuntar al seu model: alumne = AlumneUser.objects.get(pk=user.pk) alumne.motiu_bloqueig = u'Error reiterat entrant la contrasenya.' alumne.save() except: pass except: pass form._errors.setdefault( NON_FIELD_ERRORS, []).append(u'Usuari o paraula de pas incorrecte') else: form = loginUsuariForm() return render( request, 'loginForm.html', { 'form': form, 'head': head, 'acces_restringit_a_grups': acces_restringit_a_grups, })
def loginUser( request ): head=u'Login' client_address = getClientAdress( request ) try: acces_restringit_a_grups = settings.ACCES_RESTRINGIT_A_GRUPS except AttributeError: acces_restringit_a_grups = None url_next = '/' if request.method == 'POST': form = loginUsuariForm(request.POST) if form.is_valid(): username = form.cleaned_data['usuari'] paraulaDePas=form.cleaned_data['paraulaDePas'] user = authenticate(username=username, password=paraulaDePas) if user is not None: #Usuari i passwd estan bé if acces_restringit_a_grups and not user.groups.filter( name__in = acces_restringit_a_grups ).exists(): LoginUsuari.objects.create( usuari = user, exitos = False, ip = client_address) #TODO: truncar IP form._errors.setdefault(NON_FIELD_ERRORS, []).append( u'''El sistema està en mode restringit.''' ) else: if user.is_active: login(request, user) LoginUsuari.objects.create( usuari = user, exitos = True, ip = client_address) #TODO: truncar IP return HttpResponseRedirect( url_next ) else: LoginUsuari.objects.create( usuari = user, exitos = False, ip = client_address) #TODO: truncar IP form._errors.setdefault(NON_FIELD_ERRORS, []).append( u'''Aquest compte està desactivat. Punxa a l'enllaç de recuperar contrasenya.''' ) else: #Error d'usuari i passwd try: user = User.objects.get( username = username ) #apunto el fallo: LoginUsuari.objects.create( usuari = user, exitos = False, ip = client_address) if user.is_active: #comprova 3 intents fallits des del darrer intent bó. #fa_5_minuts = datetime.now() - timedelta(minutes = 5) logins_anteriors = LoginUsuari.objects.filter( usuari = user #,moment__gte = fa_5_minuts ).order_by( '-moment' )[:3] tresFallos = logins_anteriors.count() == 3 and all( not x.exitos for x in logins_anteriors ) if tresFallos and user.is_active: user.is_active = False user.save() #no aviso per no donar pistes de que això sigui un usuari real. try: #si és un alumne ho haig d'apuntar al seu model: alumne = AlumneUser.objects.get(pk = user.pk ) alumne.motiu_bloqueig = u'Error reiterat entrant la contrasenya.' alumne.save() except: pass except: pass form._errors.setdefault(NON_FIELD_ERRORS, []).append( u'Usuari o paraula de pas incorrecte' ) else: form = loginUsuariForm() return render( request, 'loginForm.html', {'form': form, 'head': head , 'acces_restringit_a_grups': acces_restringit_a_grups, } )