Gérer les préférences du projet
Nous allons maintenant mémoriser les paramètres de notre application. Il est en effet fastidieux de répéter la saisie à chaque nouvelle utilisation de l'application. Nous utiliserons un fichier texte pour sauvegarder notre configuration. Il sera placé dans un dossier en fonction du type de plateforme.
Le programme sera inspiré d'un article de Klaus Major de la revue REV UP n°99
Le programme sera inspiré d'un article de Klaus Major de la revue REV UP n°99
Fonctions de la pile
Nous allons avoir besoin de quelques fonctions pour rechercher le dossier des préférences par exemple, retrouver le fichier de configuration, etc. Nous placerons ces routines directement dans la pile. Utilisez le menu Object / Stack Script, la fenêtre de code affichera la "Handler List" vide.
Pour ajouter une fonction, saisissez le texte ci-dessous et validez.
## Cette fonctionne retourne le dossier préférences pour l'application ## en fonction de la plateforme ## OS X -> /Users/User name/Library/Preferences ## Windows XP -> C:/Documents and Settings/User Name/Application Data ## Windows 9x -> C:/windows/system ## Linux -> Dossier HOME/users function ReturnPrefsFolder switch the platform case "MacOS" ## MacOS X put specialFolderPath("preferences") into spfp break case "Win32" ## Everything >= Win2000 if the systemversion contains "NT" then put specialFolderPath(26) into spfp else ## Win95, 96, 97, 98 :-) put specialfolderpath("system") into spfp end if break default ## Linux put $HOME into spfp break end switch ## Création d'un sous dossier du nom de l'application ## si celui-ci n'existe pas if there is not a folder (spfp & "/LiveCode_Clapi") then create folder (spfp & "/LiveCode_Clapi" ) end if ## On retourne le chemin incluant le slash return (spfp & "/LiveCode_Clapi/") end ReturnPrefsFolder
Cette fonction déterminera le dossier où sera situé le fichier de configuration en fonction de la plateforme utilisée.
La fonction suivante permet de récupérer les informations contenues dans le fichier de configuration, s'il existe.
## Cette fonction retourne les préférences ## ou rien si les préférences n'ont pas encore été sauvées function ReturnPrefs put ReturnPrefsFolder() into tPath if there is a file (tPath & "preferences.txt") then return url("file:" & tPath & "preferences.txt") else ## pas encore de préférences return empty end if end ReturnPrefs
La dernière fonction écrira les informations saisies dans les zones de texte vers le fichier de configuration. Attention, actuellement le mot de passe est sauvegardé en clair.
## Cette fonction retourne les préférences ## ou rien si les préférences n'ont pas encore été sauvées function ReturnPrefs put ReturnPrefsFolder() into tPath if there is a file (tPath & "preferences.txt") then return url("file:" & tPath & "preferences.txt") else ## pas encore de préférences return empty end if end ReturnPrefs
Script sauvegarde préférence et lecture des préférences
Le code pour lire les préférences sera placé dans le bouton permettant l'accès à la configuration du programme (BtnConf). Le code pour la sauvegarde des préférences sera placé dans le bouton permettant le retour à la carte principale (BtnMain).
Voici le code de sauvegarde des paramètres :
Voici le code de sauvegarde des paramètres :
on mouseUp put "field" & TAB & "FldServeur" & TAB & fld "FldServeur" & CR into tPrefs put "field" & TAB & "FldUserServeur" & TAB & fld "FldUserServeur" & CR after tPrefs put "field" & TAB & "FldUserClapi" & TAB & fld "FldUserClapi" & CR after tPrefs put "field" & TAB & "FldPasswordClapi" & TAB & fld "FldPasswordClapi" & CR after tPrefs put "field" & TAB & "FldCmdSSH" & TAB & fld "FldCmdSSH" & CR after tPrefs put "field" & TAB & "FldPathClapi" & TAB & fld "FldPathClapi" & CR after tPrefs ## Stockage des valeurs put EcritPrefs(tPrefs) into tResult ## vérification if tResult <> empty then answer "Problème lors de la sauvegarde des préférences" & CR & tResult end if go to card "Main" end mouseUp
Et le code permettant la lecture des paramètres du bouton btnConf :
on mouseUp ## récupère les informations du fichiers des préférences put ReturnPrefs() into tPrefs ## on vérifie la présence d'informations if not tPrefs = empty then ## figeage de l'affichage lock screen ##on défini la tabulation pour séparer les items set itemdel to TAB ##Pour chaque ligne on récupére les informations ##item 1 type de contrôle ##item 2 nom du contrôle ##item 3 propriété (contents) du contrôle repeat for each line i in tPrefs put item 1 of i into tType put item 2 of i into tName put item 3 of i into tValue ##contrôle Text Field switch tType case "field" put tValue into fld tName of card "Configuration" break end switch ##il est possible de rajouter d'autre contrôle end repeat ##on libère l'affichage unlock screen end if ## on affiche la carte configuration go to card "Configuration" end mouseUp
Et voilà, votre programme mémorise automatique les valeurs saisies dans la fenêtre de configuration. Il restera à encoder le mot de passe pour assurer un maximum de sécurité. Avant de compiler votre application, n'oubliez pas de mettre les valeurs des zones de texte à blanc, car LiveCode a la particularité de sauvegarder dans les contrôles la dernière valeur saisie.
Encodage du mot de passe
Pour encoder et décoder le mot de passe, nous aurons besoin de deux fonctions. Ces fonctions sont inspiré de cet article. Installez celles-ci dans la pile (stock). Je vous conseille de mettre votre chaine personnalisée à la place de "A§èdti4s#op"
Fonction Cryptage
function ReturnCrypte pData local tMd5, tRandSeed, tMax, tOffsetsA local tStackName, tSaveVis, tFile local pPassword put "A§èdti4s#op" into pPassword -- if pPassword is empty then -- Simply mark the data as not password-protected -- and compress it without further modification: put "00"&compress(pData) into pData else -- Get MD5 digest: put md5digest(pPassword) into tKeyString put len(tKeyString) into tKeyStringLen -- put compress(pData) into pData -- -- Apply it with Xor to the data one byte at a time: put 0 into i put empty into tCryptoText repeat for each char k in pData add 1 to i if i > tKeyStringLen then put 1 into i put char i of tKeyString into tKeyChar put numtochar( chartonum(k) bitxor chartonum(tKeyChar))\ after tCryptoText end repeat -- -- Mark the data as password-protected: put "01" & tCryptoText into pData end if -- Convert to common low ASCII: return base64encode(pData) end ReturnCrypte
Fonction Décryptage
function ReturnDecrypte pData local tEncryptionMethod local tMd5, tRandSeed, tMax, tOffsetsA local pPassword put "A§èdti4s#op" into pPassword -- -- Convert from base64 back to binary: put base64decode(pData) into pData -- Check and remove password-protection flag: put char 1 to 2 of pData into tEncryptionMethod delete char 1 to 2 of pData -- switch tEncryptionMethod case "00" --no encryption break -- case "01" -- mdx -- Get MD5 digest: put md5digest(pPassword) into tKeyString put len(tKeyString) into tKeyStringLen -- -- Apply it with Xor to the data one byte at a time: put 0 into i put empty into tClearText repeat for each char k in pData add 1 to i if i > tKeyStringLen then put 1 into i put char i of tKeyString into tKeyChar put numtochar( chartonum(k) bitxor chartonum(tKeyChar))\ after tClearText end repeat put tClearText into pData break -- end switch -- -- Attempt to decompress data, throwing an error if not valid: try get decompress(pData) catch errNo throw "Mauvaise Clé" exit to top finally return it end try end ReturnDecrypte
Modification de la gestion des préférences
Modifions les scripts des boutons BtnMain et BtnConf. Commencez par le script BtnMain qui cryptera le mot de passe. Remplacez la ligne appropriée.
put "field" & TAB & "FldPasswordClapi" & TAB & ReturnCrypte(fld "FldPasswordClapi") & CR after tPrefs
Continuez par le script BtnConf qui décryptera le mot de passe. On ajoutera la condition pour le contrôle Field FldPasswordClapi.
switch tType case "field" if tName = "FldPasswordClapi" then put ReturnDecrypte(tValue) into fld tName of card "Configuration" else put tValue into fld tName of card "Configuration" end if break end switch
Vous pouvez vérifier le résultat en liste le fichier de préférences comme ci-dessous :
field FldServeur 172.16.209.174 field FldUserServeur vmdebian field FldUserClapi admin field FldPasswordClapi MDGsa4Hrx2NGwd1XP18CaIjenKqI6xIlhPTVVBQX field FldCmdSSH /usr/bin/ssh field FldPathClapi /usr/local/centreon/www/modules/centreon-clapi/core/centreon