Vous êtes ici:

Menu

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

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.
Stacks Image 3054
Fenêtre de code
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.
Stacks Image 3048
Code de la fonction ReturnPrefsFolder
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éesfunction 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 ifend ReturnPrefs
Stacks Image 3045
Code de la fonction 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éesfunction 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 ifend ReturnPrefs
Stacks Image 3042
Fonction EcritPrefs

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 :
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
Stacks Image 3155
Sauvegarde des paramètres
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
Stacks Image 3162
Lecture des paramètres
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
Stacks Image 3447
function 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 tryend ReturnDecrypte
Stacks Image 3450
function 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
Stacks Image 3461
function mouseUp de BtnMain
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
Stacks Image 3464
function mouseUp de BtnConf
Vous pouvez vérifier le résultat en liste le fichier de préférences comme ci-dessous :
field	FldServeur	172.16.209.174field	FldUserServeur	vmdebianfield	FldUserClapi	adminfield	FldPasswordClapi	MDGsa4Hrx2NGwd1XP18CaIjenKqI6xIlhPTVVBQXfield	FldCmdSSH	/usr/bin/sshfield	FldPathClapi	/usr/local/centreon/www/modules/centreon-clapi/core/centreon
 Vous êtes ici:

Nous utilisons des cookies pour nous permettre de mieux comprendre comment le site est utilisé. En continuant à utiliser ce site, vous acceptez cette politique.