Добавление объектов в LDAP через CGI - PullRequest
1 голос
/ 27 марта 2010

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

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, поэтому не удивлюсь, если в этом фрагменте будут какие-то явные ошибки.

Заранее спасибо!

1 Ответ

3 голосов
/ 27 марта 2010

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

  1. Квадратные скобки заменяют результат скрипта внутри него, а не его вывод.
  2. Команды puts отправляют строки в стандартный вывод (или файл) и не сохраняют их для последующей обработки.
  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 es. Унция профилактики стоит целого веса лечения.

...