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é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
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é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
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 try
end 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.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
comments powered by Disqus
 Vous êtes ici: