2010-03-27 22 views
1

J'ai un formulaire Web qui recueille des informations et les soumet à un CGI qui tente d'insérer les données dans LDAP. Le problème est que j'essaie d'utiliser une variable avec :: ldap :: add et ça ne marche pas. Voici le code:Ajout d'objets à LDAP via CGI

if {[string length env(QUERY_STRING)] != 0} { 
    set handle [::ldap::connect localhost] 
    set dn "cn=admin,dc=mycompany,dc=com" 
    set pw "myPassword" 

    ::ldap::bind $handle $dn $pw 

    set dn "cn=[ncgi::value givenName] [ncgi::value sn],ou=people,dc=mycompany,dc=com" 

    set formValues [ 
      puts "cn  {{[ncgi::value givenName] [ncgi::value sn]}}" 
      puts "displayName  [ncgi::value givenName] [ncgi::value sn]" 
      foreach {key value} [ncgi::nvlist] { 
        if {[string length $value] != 0} { 
          puts "$key  $value" 
        } 
      } 
      puts "objectClass  top" 
      puts "objectClass  person" 
      puts "objectClass  organizationalPerson" 
      puts "objectClass  inetOrgPerson" 
    ] 

    ::ldap::add $handle $dn { 
      $formValues 
    } 

    ldap::unbind $handle 

}

Cependant, si je remplace $ formValues ​​avec les entrées réelles que je veux insérer dans LDAP, ils sont ajoutés très bien. Je suis nouveau à TCL, donc je ne serais pas surpris s'il y avait des erreurs flagrantes dans cet extrait.

Merci d'avance!

Répondre

3

Les grosses erreurs:

  1. Les crochets remplacent le résultat du script à l'intérieur et non sa sortie.
  2. Les commandes puts envoient des chaînes à stdout (ou un fichier) et ne les sauvegardent pas pour traitement ultérieur.
  3. Les accolades annulent totalement toutes les substitutions à l'intérieur.

Les corrections doivent utiliser la liste des commandes pour construire la description à utiliser avec ldap::add. Par exemple:

set formValues {} 
lappend formValues cn   "[ncgi::value givenName] [ncgi::value sn]" 
### Might need this instead; it depends on how you want to do the construction 
# lappend formValues cn  [list [ncgi::value givenName] [ncgi::value sn]] 
lappend formValues displayName "[ncgi::value givenName] [ncgi::value sn]" 
foreach {key value} [ncgi::nvlist] { 
    ### Could also use {$value ne ""} here 
    if {[string length $value] != 0} { 
     lappend formValues $key $value 
    } 
} 
lappend formValues objectClass top 
lappend formValues objectClass person 
lappend formValues objectClass organizationalPerson 
lappend formValues objectClass inetOrgPerson 

::ldap::add $handle $dn $formValues 

De plus, si ces clés viennent d'un formulaire, vous devez ajouter de validation pour empêcher les utilisateurs malveillants d'ajouter extras inattendus comme objectClass supplémentaires es. Une once de prévention vaut une cure de 100 livres.

+0

Merci beaucoup! Je prévois de valider les intrants; Je n'ai pas inclus ce code dans cet exemple parce que je pensais que cela enlèverait le problème que j'essayais de résoudre. Merci encore!! – musashiXXX

+0

J'ai fait les changements et j'ai encore des problèmes, mais je comprends maintenant ce que je faisais de mal. Après avoir corrigé le code, j'ai inséré la ligne suivante juste pour voir si la commande a été construite correctement: puts $ formValues ​​ Il crache les informations appropriées, et je l'ai vérifié complètement pour s'assurer qu'il est dans le bon format, mais pour une raison quelconque, l'entrée n'est pas insérée. J'apprécie ton aide! – musashiXXX

+0

Impossible de dire à partir de la description maintenant. Essayez d'arrêter par #tcl sur freenode. Il y a plein de gens compétents qui peuvent aider, et certaines choses sont plus faciles à déboguer avec une interaction plus directe ... –