2010-03-27 2 views
1

У меня есть веб-форма, которая собирает информацию и отправляет ее в cgi, который пытается вставить данные в LDAP. Проблема в том, что я пытаюсь использовать переменную с :: ldap :: add, и она просто не работает. Вот код:Добавление объектов в LDAP через 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 

}

Однако, если я заменю $ formValues ​​с реальными записями, которые я хочу, чтобы вставить в LDAP, они добавляются только штрафом.

Я новичок в TCL, поэтому я не удивлюсь, если в этом фрагменте были некоторые вопиющие ошибки.

Заранее благодарен!

ответ

3

Большие ошибки:

  1. квадратные скобки заменить результат сценария внутри него, а не его выход.
  2. Команды puts отправляют строки в stdout (или файл) и не сохраняют их для последующей обработки.
  3. Кудрявые фигурные скобки полностью уничтожают все подстановки внутри них.

Исправления должны использовать команды списка, чтобы построить описание для использования с ldap::add. Например:

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 

Кроме того, если эти ключи приходят из формы, вы должны добавить еще проверку, чтобы остановить злоумышленников от добавления неожиданных дополнительных услуг, как дополнительные objectClass эс. Унция профилактики стоит сотни случаев лечения.

+0

спасибо! Я планирую проверить входные данные; Я не включил этот код в этот пример, потому что думал, что это уберет от проблемы, которую я пытался решить. Еще раз спасибо!! – musashiXXX

+0

Я внес изменения, и у меня все еще есть проблемы, но теперь я понимаю, что я делаю неправильно. После исправления кода я вставил следующую строку, чтобы увидеть, правильно ли построена команда: puts $ formValues ​​ Он выплевывает соответствующую информацию, и я проверил ее полностью, чтобы убедиться, что она правильная формате, но по какой-то причине запись не вставлена. Я ценю вашу помощь! – musashiXXX

+0

Не могу сказать из описания сейчас. Попробуйте остановить #tcl на freenode. Там есть много знающих людей, которые смогут помочь, а некоторые вещи просто легче отлаживать с более прямым взаимодействием ... –

Смежные вопросы