Skip to content

Commit

Permalink
Add user PIN authentication 🔒 (#104)
Browse files Browse the repository at this point in the history
* begin UI for pin setup

* add custom number pad UI

* fix hot reload and logging by upgrading expo SDK

* update styling of number pads

* update auth screen. add TODOs

* lint & fmtJson

* update initial pin screen

* clean up pin components

* setup pin, store pin hash, store locked state #11

* rename state confirm to isConfirm

* fix bypassing the pin mismatch attempts

* fix attempt and lock state while in background

* update

* check attempts stored after app restart

* avoid pin submit spam

* start pin handler on foreground after 5 mins

* ask for pin if app was > 5min in bg

* update auth

* add translations for auth screen

* fix TL

* add UI for PIN in settings

* implement delete & edit PIN logic, see #11

* clean up

* remove logs

* reset states if canceling pin edit/delete

* update icons

* update icons

* Update package-lock.json

* Update package-lock.json

* update after review

* update after review

* update baseStore and use store

* update after commit

* update after review

---------

Co-authored-by: BilligsterUser <[email protected]>
  • Loading branch information
KKA11010 and BilligsterUser authored Jul 9, 2023
1 parent ae786a6 commit 0d8becd
Show file tree
Hide file tree
Showing 33 changed files with 1,355 additions and 485 deletions.
Binary file removed assets/adaptive-icon.png
Binary file not shown.
File renamed without changes
Binary file added assets/app-icon-android-adaptive-background.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/app-icon-android-adaptive-foreground.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/app-icon-android-legacy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions assets/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,21 @@
"addContactErr": "Kontakt konnte nicht hinzugefügt werden. Möglicher Name oder LNURL Duplikat.",
"addedContact": "Neue Kontakt hinzugefügt"
},
"auth": {
"welcome": "Willkommen",
"welcomeBack": "Willkommen zurück!",
"pleaseEnter": "Bitte geben Sie Ihre PIN ein.",
"pleaseConfirm": "Bitte bestätigen Sie Ihre PIN.",
"pinSetup": "Sie können ein PIN erstellen um Ihre App zu schützen.",
"pinMismatch": "PIN inkorrekt!",
"createPin": "PIN erstellen",
"editPin":"PIN ändern",
"removePin":"PIN löschen",
"confirmAction": "Bitte bestätigen Sie die Aktion.",
"pleaseNewPin": "Bitte geben Sie eine neue PIN ein.",
"pleaseConfirmNewPin": "Bitte bestätigen Sie Ihre neue PIN."

},
"english": "Englisch",
"german": "Deutsch",
"french": "Französisch",
Expand Down
14 changes: 14 additions & 0 deletions assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,20 @@
"addContactErr": "Contact can not be added. Possible name or LNURL duplication.",
"addedContact": "New contact added"
},
"auth": {
"welcome": "Welcome",
"welcomeBack": "Welcome back!",
"pleaseEnter": "Please enter your PIN now.",
"pleaseConfirm": "Please confirm your PIN.",
"pinSetup": "You can setup a PIN to secure your app.",
"pinMismatch": "Incorrect PIN!",
"createPin": "Create PIN",
"editPin":"Edit PIN",
"removePin":"Delete PIN",
"confirmAction": "Please confirm the action.",
"pleaseNewPin": "Please enter a new PIN now.",
"pleaseConfirmNewPin": "Please confirm your new PIN."
},
"english": "English",
"german": "German",
"french": "French",
Expand Down
41 changes: 28 additions & 13 deletions assets/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"checkPayment": "Vérifier le paiement",
"paymentPending": "Paiement en attente",
"copyInvoice": "Copier la facture",
"copyToken": "Copier le token",
"copyToken": "Copier le jeton",
"copied": "Copié",
"share": "Partager",
"payWithLn": "Payer avec votre portefeuille LN",
Expand All @@ -34,7 +34,7 @@
"change": "Changer",
"amount": "Montant",
"keysetID": "ID de clés",
"createTokenErr": "Impossible de créer un Cashu token. Veuillez réessayer ultérieurement.",
"createTokenErr": "Impossible de créer un Cashu jeton. Veuillez réessayer ultérieurement.",
"balance": "Solde",
"noMint": "Aucune Mint trouvée",
"addMemo": "Ajouter une note avec un maximum de 21 caractères.",
Expand All @@ -43,7 +43,7 @@
"createInvoice": "Créer une facture",
"invoiceIncoming": "Facture en cours",
"selectAmount": "Sélectionner le montant",
"createToken": "Créer un token",
"createToken": "Créer un jeton",
"creating": "Création en cours",
"feeErr": "Impossible d'estimer les frais. \"{{input}}\" est-il un LNURL valide?",
"invoiceErr": "La facture n'a pas pu être payée. Veuillez réessayer ultérieurement.",
Expand Down Expand Up @@ -74,7 +74,7 @@
"claimSuccess": "{{amount}} Satoshi récupérés depuis {{mintUrl}}! Note: {{memo}}",
"notQrCode": "Ce n'est pas un code QR!",
"unknownType": "Données inconnues",
"scanTokenOrLn": "Scanner le Cashu token ou la facture Lightning",
"scanTokenOrLn": "Scanner le Cashu jeton ou la facture Lightning",
"scanAgain": "Appuyez pour scanner à nouveau",
"noCamAccess": "Accès à la caméra non autorisé",
"darkMode": "Mode sombre",
Expand All @@ -83,11 +83,11 @@
"historyDeleted": "Historique supprimé",
"delHistoryErr": "Impossible de supprimer l'historique.",
"noProofsToBackup": "Aucune preuve trouvée pour créer une sauvegarde.",
"backupErr": "Une erreur s'est produite lors de la création du token de sauvegarde.",
"createBackup": "Créer un token de sauvegarde",
"clipboardInvalid": "Le presse-papiers contient un Cashu token invalide!",
"backupErr": "Une erreur s'est produite lors de la création du jeton de sauvegarde.",
"createBackup": "Créer un jeton de sauvegarde",
"clipboardInvalid": "Le presse-papiers contient un Cashu jeton invalide!",
"dbErr": "Une erreur s'est produite lors de l'initialisation de la base de données!",
"foundCashuClipboard": "Un Cashu token a été trouvé dans votre presse-papiers",
"foundCashuClipboard": "Un Cashu jeton a été trouvé dans votre presse-papiers",
"fromMint": "de la Mint suivante",
"paymentSuccess": "Paiement réussi!",
"claimed": "récupéré",
Expand Down Expand Up @@ -169,7 +169,7 @@
"noInfo": "Aucune information disponible",
"swapSuccess": "{{amount}} Satoshi échangés avec succès de {{srcMint}} à {{targetMint}}",
"swapFail": "Impossible d'effectuer un échange inter-mint",
"swapRisk": "Échangez des token d'une mint contre des token d'une autre mint. Pendant un court instant, vous ferez confiance à deux mints en même temps. Des problèmes peuvent survenir. Utilisez à vos propres risques.",
"swapRisk": "Échangez des jeton d'une mint contre des jeton d'une autre mint. Pendant un court instant, vous ferez confiance à deux mints en même temps. Des problèmes peuvent survenir. Utilisez à vos propres risques.",
"swapNow": "Échanger maintenant",
"performingSwap": "Échange en cours",
"general": "Général",
Expand All @@ -184,9 +184,9 @@
"checkProofs": "Vérifier les preuves",
"delMint": "Supprimer la mint",
"delMintSure": "Êtes-vous sûr de vouloir supprimer cette mint?",
"delMintHint": "Supprimer une mint avec un solde peut entraîner un solde total inattendu. Vous conserverez les token associés à la mint, mais vous ne pourrez pas les échanger tant que vous n'aurez pas réajouté la mint.",
"delMintHint": "Supprimer une mint avec un solde peut entraîner un solde total inattendu. Vous conserverez les jeton associés à la mint, mais vous ne pourrez pas les échanger tant que vous n'aurez pas réajouté la mint.",
"checkProofsQ": "Êtes-vous sûr de vouloir vérifier toutes les preuves?",
"checkProofsTxt": "Cela vérifiera si vos token peuvent être dépensés et les supprimera sinon.",
"checkProofsTxt": "Cela vérifiera si vos jeton peuvent être dépensés et les supprimera sinon.",
"editMintName": "Modifier le nom de la mint",
"addCustomName": "Ajouter un nom personnalisé",
"funds": "Argent"
Expand All @@ -206,6 +206,21 @@
"addContactErr": "Le contact ne peut pas être ajouté. Duplication possible du nom ou du LNURL.",
"addedContact": "Nouveau contact ajouter"
},
"auth": {
"welcome": "Bienvenue",
"welcomeBack": "Bienvenue de retour!",
"pleaseEnter": "Veuillez entrer votre PIN",
"pleaseConfirm": "Veuillez confirmer votre PIN.",
"pinSetup": "Vous pouvez configurer un PIN pour sécuriser votre app.",
"pinMismatch": "PIN incorrect!",
"createPin": "Créer un PIN",
"editPin":"Modifier le PIN",
"removePin":"Supprimer le PIN",
"confirmAction": "Veuillez confirmer votre action.",
"pleaseNewPin": "Veuillez saisir un nouveau PIN.",
"pleaseConfirmNewPin": "Veuillez confirmer votre nouveau PIN."

},
"english": "Anglais",
"german": "Allemand",
"french": "Français",
Expand All @@ -218,8 +233,8 @@
"contact_one": "Contact",
"contact_other": "Contacts",
"getStarted": "Commencer",
"startHint": "Vous devriez ajouter une mint à laquelle vous faites confiance avant d'envoyer ou de recevoir des token.",
"startHint": "Vous devriez ajouter une mint à laquelle vous faites confiance avant d'envoyer ou de recevoir des jetons.",
"addMintNow": "Ajoutez une mint",
"willDoLater": "Je ferai plus tard",
"aboutToLeaveTo": "Vous êtes sur le point de quitter"
}
}
7 changes: 4 additions & 3 deletions config/app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ const config: ExpoConfig = {
version: `${version}${!IS_PROD ? `-${_appVariant}` : ''}`,
scheme: 'cashu',
orientation: 'portrait',
icon: './assets/icon_transparent.png',
icon: './assets/app-icon-all.png',
userInterfaceStyle: 'automatic',
splash: {
image: './assets/splash.png',
Expand All @@ -74,9 +74,10 @@ const config: ExpoConfig = {
}
},
android: {
icon: './assets/app-icon-android-legacy.png',
adaptiveIcon: {
foregroundImage: './assets/adaptive-icon.png',
backgroundColor: '#5DB075'
foregroundImage: './assets/app-icon-android-adaptive-foreground.png',
backgroundImage: './assets/app-icon-android-adaptive-background.png'
},
package: `com.agron.enuts${!IS_PROD ? `.${_appVariant}` : ''}`
},
Expand Down
Loading

0 comments on commit 0d8becd

Please sign in to comment.