@ -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 )  {