Italian IF THEN ELSE....

enne

New Member
Ciao a tutti!
Programmo da poco e da un mesetto circa sto utilizzando b4a per creare un'app.
Ho realizzato varie sub all'interno della main e in ognuna di esse, ho impostato un evento o comunque "un'azione".
L'app deve leggere una password e fin qui tutto ok, però vorrei aggiungere un'opzione in cui dopo tre tentativi di password sbagliata, i tentativi di inserimento si bloccano per 5 minuti.
Come dovrei impostare l'if?
Scusate la domanda banale, ma programmo da poco più di 3 mesi ed è un mesetto che utilizzo b4a. Grazie mille
 

Sagenut

Expert
Licensed User
Longtime User
Benvenuto!
Ora non sono al PC quindi non posso mandarti codice.
Un metodo potrebbe essere questo:
- creare una variabile globale di tipo INT per tenere conto dei tentativi errati
- preparare un Timer da 5 minuti da attivare in caso di eccesso di errori e che resetterà i tentativi trascorsi i 5 minuti
Nella Sub dove inserire le password servirà qualcosa tipo
B4X:
If Tentativi = 3 then
   'Quí decidi come avvisare l'utente che deve attendere 5 minuti e poi esci dalla Sub con Return
End If
Mi rendo conto che ora può non chiarirti le idee.
Se non interviene nessun altro prima ti mando qualcosa appena ho possibilità.
 

emexes

Expert
Licensed User
B4X:
Sub Globals()
    Dim NumBadPasswords As Int = 0
    Dim PasswordTimeout As Long = 0
End Sub

Sub TryPassword(P As String) As Boolean    'restituisce True se la password è stata accettata, False in caso contrario

    If DateTime.Now > PasswordTimeout Then 
        If P = "TopSecret42" Then
            NumBadPasswords = 0
            Return True
        Else
            NumBadPasswords = NumBadPasswords + 1
            If NumBadPasswords => 3 Then
                PasswordTimeout = DateTime.Now + 5 * 60 * 1000    '5 minuti
            End If
            Return False
        End If
    Else
        Log("Troppe password sbagliate - attendere qualche minuto prima di riprovare")
        Return False
    End If

    Return False    'non dovrebbe mai arrivare qui, ma... per sicurezza
  
End Sub
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
L'unico neo dell'esempio di @emexes è che è sufficiente spostare in avanti di 5 minuti l'ora del dispositivo per riprovare subito, mentre l'utilizzo di un timer dovrebbe mitigare questa cosa (credo). ;)
Ma direi che come esempio iniziale è ottimo, dato che credo che non siamo ancora ad applicazioni a rischio. :)
 

emexes

Expert
Licensed User
L'unico neo dell'esempio di @emexes è che è sufficiente spostare in avanti di 5 minuti l'ora del dispositivo per riprovare subito, mentre l'utilizzo di un timer dovrebbe mitigare questa cosa (credo). ;)

Buona osservazione. "?" Tuttavia, si noti che dopo 3 password errate, il timeout viene attivato per ogni successiva password errata, e quindi si dovrebbe cambiare il tempo del dispositivo in avanti tra ogni singolo tentativo di password, il che sarebbe come correre nell'acqua.

Si potrebbe aggiungere qualcosa che dica che dopo 10 password sbagliate, si restituisce False a prescindere, cioè si ignorano ulteriori tentativi di password.

La prossima "scappatoia" è che il riavvio del programma riavvia l'intero processo di rallentamento.
 

Sagenut

Expert
Licensed User
Longtime User
Ma infatti il tuo esempio è più che valido, soprattutto per prendere confidenza con la programmazione per uno che è agli inizi.
Ci sarà sempre un modo migliore di fare ogni cosa.
E c'è sempre tempo per migliorare.
 
Top