auth_ldap
Maxim Dounin
mdounin at mdounin.ru
Tue Aug 19 10:55:24 MSD 2008
Hello!
On Tue, Aug 19, 2008 at 12:23:02AM +0200, Markus Teichmann wrote:
> as a new user to this list, I just want to contribute my little auth_ldap
> module. I hope you enjoy it. Here is an example conf file:
>
> http {
> # LDAP URI
> auth_ldap_uri "ldap://127.0.0.1";
>
> server {
> listen 80;
> server_name localhost;
>
> location / {
> # Realm
> auth_ldap "LDAP Request";
> # Search Base
> auth_ldap_dn "ou=People,dc=chaos,dc=jmt";
> # The Attribute searching for. Normaly this is uid or cn
> auth_ldap_attribute "uid";
> # Activate the authenticaten
> # require off; will disable the module.
> require ldap-user;
>
> root html;
> index index.html index.htm;
> }
> ...
>
> Also I have some questions during this coding. First of all is there a
> place for third party modules?
http://wiki.codemongers.com/NginxModules
> And much more important for me: how does the async calling mechanism in
> nginx work? I've played around with NGX_AGAIN, but I doesn't got the
> expected result. So all the ldap code ist sync now. Would be nice to
> change this.
You should be able to return NGX_AGAIN from your handler and then
post write event on request socket to continue work (or even call
r->write_event_handler(r) or ngx_http_core_run_phases(r) directly,
not sure which method is preffered). See ngx_http_core_module.c
for details of how phases are handled.
Some minor notes about code:
1. You shouldn't use ngx_log_error_core() directly, use ngx_log_error()
instead. With ngx_log_error_core() it's impossible to control log
level from config.
2. This:
...
/* compose filer */
ngx_memzero(buf, NGX_HTTP_AUTH_BUF_SIZE);
ngx_snprintf(buf, NGX_HTTP_AUTH_BUF_SIZE, "(%V=%V)",
&(conf->attribute), &(r->headers_in.user) );
...
is ugly and unsafe since result is used in libldap where null
terminated string expected. The ngx_snprintf does not terminate
strings with '\0' and doesn't preserve last character in buffer
for it. Use something like
p = ngx_snprintf(buf, NGX_HTTP_AUTH_BUF_SIZE - 1, ...)
*p = '\0';
instead. It's also a good idea to check somewhere if result
actually fits into buffer - since truncated filter will probably
make ldap unhappy. Alternatively you may consider just allocating
needed space from request pool - nginx pool allocator works really
fast and you don't need to free memory (it's automatically
freed upon request completion).
3. It doesn't compile here under FreeBSD 7.0 (gcc 4.2.1) with
OpenLDAP 2.4.11 (current stable version, just installed).
Warnings are treated as errors under nginx build, and your module
have many. Here is relevant part:
[cut here]
gcc -c -O -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter
-Wno-unused-function -Wunused-variable -Wunused-value -Werror -g
-I src/core -I src/event -I src/event/modules -I src/os/unix
-I /usr/local/include -I objs -I src/http -I src/http/modules
-I src/mail -o
objs/addon/ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.o
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c
cc1: warnings being treated as errors
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c: In
function 'ngx_http_auth_ldap_handler':
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:140:
warning: 'main' is usually a function
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:171:
warning: pointer targets in passing argument 2 of
'ldap_initialize' differ in signedness
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:193:
warning: pointer targets in passing argument 2 of
'ldap_search_ext_s' differ in signedness
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:193:
warning: pointer targets in passing argument 4 of
'ldap_search_ext_s' differ in signedness
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:207:
warning: implicit declaration of function 'ldap_simple_bind_s'
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:222:
warning: implicit declaration of function 'ldap_unbind'
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:142:
warning: unused variable 'p'
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c: In
function 'ngx_http_auth_ldap_merge_loc_conf':
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:281:
warning: unused variable 'result'
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c: In
function 'ngx_http_auth_ldap_uri':
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:344:
warning: pointer targets in passing argument 1 of
'ldap_is_ldap_url' differ in signedness
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c: In
function 'ngx_http_auth_ldap_init_module':
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:355:
warning: 'main' is usually a function
../ngx_http_auth_ldap_module-0.1/ngx_http_auth_ldap_module.c:361:
warning: pointer targets in passing argument 2 of
'ldap_initialize' differ in signedness
*** Error code 1
[cut here]
Maxim Dounin
More information about the nginx
mailing list