예제 #1
0
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'
    })
예제 #2
0
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' 
                     }
                )
예제 #3
0
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,
        })
예제 #4
0
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,
                    }
                    )