Menu
Coddy logo textTech

Récapitulatif - Coffre-fort sécurisé

Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 48 sur 70.

challenge icon

Défi

Facile

Construisons une classe Vault qui utilise la confidentialité basée sur les fermetures (closures) pour créer un système de stockage véritablement sécurisé ! Le coffre-fort contiendra un contenu secret qui ne pourra être consulté qu'en fournissant le mot de passe correct.

Vous organiserez votre code sur deux fichiers :

  • Vault.lua : Créez une classe où le contenu et le mot de passe sont stockés dans des variables locales à l'intérieur du constructeur — complètement cachés de tout accès extérieur. Le constructeur :new(contents, password) doit stocker ces valeurs dans des variables locales, puis définir une méthode directement sur l'instance de l'objet :
    • :open(attemptedPassword) — vérifie si le mot de passe tenté correspond au mot de passe stocké. Si c'est correct, retourne le contenu secret. Si c'est incorrect, retourne "Access Denied".
  • main.lua : Importez votre module Vault et lisez trois entrées : le contenu secret à stocker, le mot de passe à définir et une tentative de mot de passe. Créez un coffre-fort avec le contenu et le mot de passe, puis essayez de l'ouvrir avec la tentative de mot de passe et affichez le résultat. Démontrez également que le contenu est véritablement privé en essayant d'accéder directement à vault.contents et en affichant ce que vous obtenez.

Vous recevrez trois entrées :

  1. Le contenu secret à stocker dans le coffre-fort
  2. Le mot de passe pour protéger le coffre-fort
  3. Une tentative de mot de passe pour essayer d'ouvrir le coffre-fort

Votre sortie doit comporter deux lignes :

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

Par exemple, si les entrées sont Gold Coins, secret123, et secret123, la sortie doit être :

Result: Gold Coins
Direct access: nil

Si les entrées sont Diamond, mypass, et wrongpass, la sortie doit être :

Result: Access Denied
Direct access: nil

L'idée clé ici est que contents et password n'existent qu'en tant que variables locales à l'intérieur du constructeur. La méthode :open() peut y accéder via une fermeture, mais rien d'autre ne le peut — pas même vault.contents, vault._contents, ou vault.password. C'est cela la véritable encapsulation !

Essayez vous-même

-- Requiert le module Vault
local Vault = require('Vault')

-- Lit les entrées
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: Créer un coffre-fort avec le contenu et le mot de passe

-- TODO: Essayer d'ouvrir le coffre-fort avec le mot de passe tenté

-- TODO: Afficher le résultat au format : "Result: {resultFromOpen}"

-- TODO: Essayer d'accéder directement à vault.contents et afficher ce que vous obtenez
-- Afficher au format : "Direct access: {whatYouGetFromVaultContents}"

Toutes les leçons de Object Oriented Programming