@ -69,6 +69,10 @@ typedef struct {
ngx_flag_t satisfy_all ;
ngx_uint_t connections ;
ngx_msec_t connect_timeout ;
ngx_msec_t reconnect_timeout ;
ngx_msec_t bind_timeout ;
ngx_msec_t request_timeout ;
ngx_queue_t free_connections ;
ngx_queue_t waiting_requests ;
} ngx_http_auth_ldap_server_t ;
@ -307,6 +311,10 @@ ngx_http_auth_ldap_ldap_server_block(ngx_conf_t *cf, ngx_command_t *cmd, void *c
}
ngx_memzero ( server , sizeof ( * server ) ) ;
server - > connect_timeout = 10000 ;
server - > reconnect_timeout = 10000 ;
server - > bind_timeout = 5000 ;
server - > request_timeout = 10000 ;
server - > alias = name ;
save = * cf ;
@ -322,6 +330,15 @@ ngx_http_auth_ldap_ldap_server_block(ngx_conf_t *cf, ngx_command_t *cmd, void *c
return NGX_CONF_OK ;
}
# define CONF_MSEC_VALUE(cf,value,server,x) \
if ( ngx_strcmp ( value [ 0 ] . data , # x ) = = 0 ) { \
ngx_msec_t _i = ngx_parse_time ( & value [ 1 ] , 0 ) ; \
if ( _i = = ( ngx_msec_t ) NGX_ERROR | | _i = = 0 ) { \
ngx_conf_log_error ( NGX_LOG_EMERG , cf , 0 , " http_auth_ldap: ' " # x " ' value has to be a valid time unit greater than 0 " ) ; \
return NGX_CONF_ERROR ; \
} \
server - > x = _i ; \
}
/**
* Called for every variable inside ldap_server block
*/
@ -361,7 +378,12 @@ ngx_http_auth_ldap_ldap_server(ngx_conf_t *cf, ngx_command_t *dummy, void *conf)
return NGX_CONF_ERROR ;
}
server - > connections = i ;
} else if ( ngx_strcmp ( value [ 0 ] . data , " include " ) = = 0 ) {
}
else CONF_MSEC_VALUE ( cf , value , server , connect_timeout )
else CONF_MSEC_VALUE ( cf , value , server , reconnect_timeout )
else CONF_MSEC_VALUE ( cf , value , server , bind_timeout )
else CONF_MSEC_VALUE ( cf , value , server , request_timeout )
else if ( ngx_strcmp ( value [ 0 ] . data , " include " ) = = 0 ) {
return ngx_conf_include ( cf , dummy , conf ) ;
}
@ -994,8 +1016,8 @@ ngx_http_auth_ldap_close_connection(ngx_http_auth_ldap_connection_t *c)
c - > rctx = NULL ;
if ( c - > state ! = STATE_DISCONNECTED ) {
c - > state = STATE_DISCONNECTED ;
ngx_add_timer ( & c - > reconnect_event , 10000 ) ; /* TODO: Reconnect timeout */
ngx_log_debug0 ( NGX_LOG_DEBUG_HTTP , c - > log , 0 , " http_auth_ldap: Connection scheduled for reconnection in 10000 ms " ) ;
ngx_add_timer ( & c - > reconnect_event , c - > server - > reconnect_timeout ) ;
ngx_log_debug1 ( NGX_LOG_DEBUG_HTTP , c - > log , 0 , " http_auth_ldap: Connection scheduled for reconnection in %d ms " , c - > server - > reconnect_timeout ) ;
}
}
@ -1170,7 +1192,8 @@ ngx_http_auth_ldap_connection_established(ngx_http_auth_ldap_connection_t *c)
ngx_log_debug1 ( NGX_LOG_DEBUG_HTTP , c - > log , 0 , " http_auth_ldap: ldap_sasl_bind() -> msgid=%d " , c - > msgid ) ;
c - > state = STATE_INITIAL_BINDING ;
ngx_add_timer ( c - > conn . connection - > read , 5000 ) ; /* TODO: Bind timeout */
ngx_add_timer ( c - > conn . connection - > read , c - > server - > bind_timeout ) ;
ngx_log_debug1 ( NGX_LOG_DEBUG_HTTP , c - > log , 0 , " http_auth_ldap: bind_timeout=%d " , c - > server - > bind_timeout ) ;
}
# if (NGX_OPENSSL)
@ -1414,7 +1437,7 @@ ngx_http_auth_ldap_connect(ngx_http_auth_ldap_connection_t *c)
if ( rc = = NGX_ERROR | | rc = = NGX_BUSY | | rc = = NGX_DECLINED ) {
ngx_log_error ( NGX_LOG_ERR , c - > log , 0 , " http_auth_ldap: Unable to connect to LDAP server \" %V \" . " ,
& addr - > name ) ;
ngx_add_timer ( & c - > reconnect_event , 10000 ) ; /* TODO: Reconnect timeout */
ngx_add_timer ( & c - > reconnect_event , c - > server - > reconnect_timeout ) ;
return ;
}
@ -1425,7 +1448,9 @@ ngx_http_auth_ldap_connect(ngx_http_auth_ldap_connection_t *c)
# endif
conn - > write - > handler = ngx_http_auth_ldap_connect_handler ;
conn - > read - > handler = ngx_http_auth_ldap_read_handler ;
ngx_add_timer ( conn - > read , 10000 ) ; /* TODO: Connect timeout */
ngx_add_timer ( conn - > read , c - > server - > connect_timeout ) ;
ngx_log_debug1 ( NGX_LOG_DEBUG_HTTP , c - > log , 0 , " http_auth_ldap: connect_timeout=%d. " , c - > server - > connect_timeout ) ;
c - > state = STATE_CONNECTING ;
}
@ -1605,7 +1630,9 @@ ngx_http_auth_ldap_authenticate(ngx_http_request_t *r, ngx_http_auth_ldap_ctx_t
ctx - > server = ( ( ngx_http_auth_ldap_server_t * * ) conf - > servers - > elts ) [ ctx - > server_index ] ;
ctx - > outcome = OUTCOME_UNCERTAIN ;
ngx_add_timer ( r - > connection - > write , 10000 ) ; /* TODO: Per-server request timeout */
ngx_add_timer ( r - > connection - > write , ctx - > server - > request_timeout ) ;
ngx_log_debug1 ( NGX_LOG_DEBUG_HTTP , r - > connection - > log , 0 , " http_auth_ldap: request_timeout=%d " , ctx - > server - > request_timeout ) ;
/* Check cache if enabled */
if ( ngx_http_auth_ldap_cache . buckets ! = NULL ) {