comparison src/imap/ngx_imap_auth_http_module.c @ 260:0effe91f6083 NGINX_0_5_0

nginx 0.5.0 *) Change: the parameters in the "%name" form in the "log_format" directive are not supported anymore. *) Change: the "proxy_upstream_max_fails", "proxy_upstream_fail_timeout", "fastcgi_upstream_max_fails", "fastcgi_upstream_fail_timeout", "memcached_upstream_max_fails", and "memcached_upstream_fail_timeout" directives are not supported anymore. *) Feature: the "server" directive in the "upstream" context supports the "max_fails", "fail_timeout", and "down" parameters. *) Feature: the "ip_hash" directive inside the "upstream" block. *) Feature: the WAIT status in the "Auth-Status" header line of the IMAP/POP3 proxy authentication server response. *) Bugfix: nginx could not be built on 64-bit platforms; bug appeared in 0.4.14.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Dec 2006 00:00:00 +0300
parents 6ae1357b7b7c
children 251bcd11a5b8
comparison
equal deleted inserted replaced
259:c68f18041059 260:0effe91f6083
10 #include <ngx_event_connect.h> 10 #include <ngx_event_connect.h>
11 #include <ngx_imap.h> 11 #include <ngx_imap.h>
12 12
13 13
14 typedef struct { 14 typedef struct {
15 ngx_peers_t *peers; 15 ngx_peer_addr_t *peer;
16 16
17 ngx_msec_t timeout; 17 ngx_msec_t timeout;
18 18
19 ngx_str_t host_header; 19 ngx_str_t host_header;
20 ngx_str_t uri; 20 ngx_str_t uri;
173 return; 173 return;
174 } 174 }
175 175
176 ngx_imap_set_ctx(s, ctx, ngx_imap_auth_http_module); 176 ngx_imap_set_ctx(s, ctx, ngx_imap_auth_http_module);
177 177
178 ctx->peer.peers = ahcf->peers; 178 ctx->peer.sockaddr = ahcf->peer->sockaddr;
179 ctx->peer.socklen = ahcf->peer->socklen;
180 ctx->peer.name = &ahcf->peer->name;
181 ctx->peer.get = ngx_event_get_peer;
179 ctx->peer.log = s->connection->log; 182 ctx->peer.log = s->connection->log;
180 ctx->peer.log_error = NGX_ERROR_ERR; 183 ctx->peer.log_error = NGX_ERROR_ERR;
181 184
182 rc = ngx_event_connect_peer(&ctx->peer); 185 rc = ngx_event_connect_peer(&ctx->peer);
183 186
227 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0, 230 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, wev->log, 0,
228 "imap auth http write handler"); 231 "imap auth http write handler");
229 232
230 if (wev->timedout) { 233 if (wev->timedout) {
231 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, 234 ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT,
232 "auth http server %V timed out", 235 "auth http server %V timed out", ctx->peer.name);
233 &ctx->peer.peers->peer[0].name);
234 ngx_close_connection(ctx->peer.connection); 236 ngx_close_connection(ctx->peer.connection);
235 ngx_destroy_pool(ctx->pool); 237 ngx_destroy_pool(ctx->pool);
236 ngx_imap_session_internal_server_error(s); 238 ngx_imap_session_internal_server_error(s);
237 return; 239 return;
238 } 240 }
291 293
292 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module); 294 ctx = ngx_imap_get_module_ctx(s, ngx_imap_auth_http_module);
293 295
294 if (rev->timedout) { 296 if (rev->timedout) {
295 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, 297 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,
296 "auth http server %V timed out", 298 "auth http server %V timed out", ctx->peer.name);
297 &ctx->peer.peers->peer[0].name);
298 ngx_close_connection(ctx->peer.connection); 299 ngx_close_connection(ctx->peer.connection);
299 ngx_destroy_pool(ctx->pool); 300 ngx_destroy_pool(ctx->pool);
300 ngx_imap_session_internal_server_error(s); 301 ngx_imap_session_internal_server_error(s);
301 return; 302 return;
302 } 303 }
411 goto done; 412 goto done;
412 } 413 }
413 414
414 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 415 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
415 "auth http server &V sent invalid response", 416 "auth http server &V sent invalid response",
416 &ctx->peer.peers->peer[0].name); 417 ctx->peer.name);
417 ngx_close_connection(ctx->peer.connection); 418 ngx_close_connection(ctx->peer.connection);
418 ngx_destroy_pool(ctx->pool); 419 ngx_destroy_pool(ctx->pool);
419 ngx_imap_session_internal_server_error(s); 420 ngx_imap_session_internal_server_error(s);
420 return; 421 return;
421 } 422 }
445 { 446 {
446 u_char *p; 447 u_char *p;
447 time_t timer; 448 time_t timer;
448 size_t len, size; 449 size_t len, size;
449 ngx_int_t rc, port, n; 450 ngx_int_t rc, port, n;
450 ngx_peers_t *peers; 451 ngx_peer_addr_t *peer;
451 struct sockaddr_in *sin; 452 struct sockaddr_in *sin;
452 453
453 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, s->connection->log, 0, 454 ngx_log_debug0(NGX_LOG_DEBUG_IMAP, s->connection->log, 0,
454 "imap auth http process headers"); 455 "imap auth http process headers");
455 456
483 484
484 if (len == 2 485 if (len == 2
485 && ctx->header_start[0] == 'O' 486 && ctx->header_start[0] == 'O'
486 && ctx->header_start[1] == 'K') 487 && ctx->header_start[1] == 'K')
487 { 488 {
489 continue;
490 }
491
492 if (len == 4
493 && ctx->header_start[0] == 'W'
494 && ctx->header_start[1] == 'A'
495 && ctx->header_start[2] == 'I'
496 && ctx->header_start[3] == 'T')
497 {
498 s->auth_wait = 1;
488 continue; 499 continue;
489 } 500 }
490 501
491 ctx->errmsg.len = len; 502 ctx->errmsg.len = len;
492 ctx->errmsg.data = ctx->header_start; 503 ctx->errmsg.data = ctx->header_start;
630 s->connection->read->handler = ngx_imap_auth_sleep_handler; 641 s->connection->read->handler = ngx_imap_auth_sleep_handler;
631 642
632 return; 643 return;
633 } 644 }
634 645
646 if (s->auth_wait) {
647 timer = ctx->sleep;
648
649 ngx_destroy_pool(ctx->pool);
650
651 if (timer == 0) {
652 ngx_imap_auth_http_init(s);
653 return;
654 }
655
656 ngx_add_timer(s->connection->read, timer * 1000);
657
658 s->connection->read->handler = ngx_imap_auth_sleep_handler;
659
660 return;
661 }
662
635 if (ctx->addr.len == 0 || ctx->port.len == 0) { 663 if (ctx->addr.len == 0 || ctx->port.len == 0) {
636 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 664 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
637 "auth http server %V did not send server or port", 665 "auth http server %V did not send server or port",
638 &ctx->peer.peers->peer[0].name); 666 ctx->peer.name);
639 ngx_destroy_pool(ctx->pool); 667 ngx_destroy_pool(ctx->pool);
640 ngx_imap_session_internal_server_error(s); 668 ngx_imap_session_internal_server_error(s);
641 return; 669 return;
642 } 670 }
643 671
644 if (s->passwd.data == NULL) { 672 if (s->passwd.data == NULL) {
645 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 673 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
646 "auth http server %V did not send password", 674 "auth http server %V did not send password",
647 &ctx->peer.peers->peer[0].name); 675 ctx->peer.name);
648 ngx_destroy_pool(ctx->pool); 676 ngx_destroy_pool(ctx->pool);
649 ngx_imap_session_internal_server_error(s); 677 ngx_imap_session_internal_server_error(s);
650 return; 678 return;
651 } 679 }
652 680
653 peers = ngx_pcalloc(s->connection->pool, sizeof(ngx_peers_t)); 681 peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_peer_addr_t));
654 if (peers == NULL) { 682 if (peer == NULL) {
655 ngx_destroy_pool(ctx->pool); 683 ngx_destroy_pool(ctx->pool);
656 ngx_imap_session_internal_server_error(s); 684 ngx_imap_session_internal_server_error(s);
657 return; 685 return;
658 } 686 }
659 687
669 port = ngx_atoi(ctx->port.data, ctx->port.len); 697 port = ngx_atoi(ctx->port.data, ctx->port.len);
670 if (port == NGX_ERROR || port < 1 || port > 65536) { 698 if (port == NGX_ERROR || port < 1 || port > 65536) {
671 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 699 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
672 "auth http server %V sent invalid server " 700 "auth http server %V sent invalid server "
673 "port:\"%V\"", 701 "port:\"%V\"",
674 &ctx->peer.peers->peer[0].name, &ctx->port); 702 ctx->peer.name, &ctx->port);
675 ngx_destroy_pool(ctx->pool); 703 ngx_destroy_pool(ctx->pool);
676 ngx_imap_session_internal_server_error(s); 704 ngx_imap_session_internal_server_error(s);
677 return; 705 return;
678 } 706 }
679 707
683 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data); 711 sin->sin_addr.s_addr = inet_addr((char *) ctx->addr.data);
684 if (sin->sin_addr.s_addr == INADDR_NONE) { 712 if (sin->sin_addr.s_addr == INADDR_NONE) {
685 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 713 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
686 "auth http server %V sent invalid server " 714 "auth http server %V sent invalid server "
687 "address:\"%V\"", 715 "address:\"%V\"",
688 &ctx->peer.peers->peer[0].name, &ctx->addr); 716 ctx->peer.name, &ctx->addr);
689 ngx_destroy_pool(ctx->pool); 717 ngx_destroy_pool(ctx->pool);
690 ngx_imap_session_internal_server_error(s); 718 ngx_imap_session_internal_server_error(s);
691 return; 719 return;
692 } 720 }
693 721
694 peers->number = 1; 722 peer->sockaddr = (struct sockaddr *) sin;
695 723 peer->socklen = sizeof(struct sockaddr_in);
696 peers->peer[0].sockaddr = (struct sockaddr *) sin;
697 peers->peer[0].socklen = sizeof(struct sockaddr_in);
698 724
699 len = ctx->addr.len + 1 + ctx->port.len; 725 len = ctx->addr.len + 1 + ctx->port.len;
700 726
701 peers->peer[0].name.len = len; 727 peer->name.len = len;
702 728
703 peers->peer[0].name.data = ngx_palloc(s->connection->pool, len); 729 peer->name.data = ngx_palloc(s->connection->pool, len);
704 if (peers->peer[0].name.data == NULL) { 730 if (peer->name.data == NULL) {
705 ngx_destroy_pool(ctx->pool); 731 ngx_destroy_pool(ctx->pool);
706 ngx_imap_session_internal_server_error(s); 732 ngx_imap_session_internal_server_error(s);
707 return; 733 return;
708 } 734 }
709 735
710 len = ctx->addr.len; 736 len = ctx->addr.len;
711 737
712 ngx_memcpy(peers->peer[0].name.data, ctx->addr.data, len); 738 ngx_memcpy(peer->name.data, ctx->addr.data, len);
713 739
714 peers->peer[0].name.data[len++] = ':'; 740 peer->name.data[len++] = ':';
715 741
716 ngx_memcpy(peers->peer[0].name.data + len, 742 ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len);
717 ctx->port.data, ctx->port.len);
718
719 peers->peer[0].uri_separator = "";
720 743
721 ngx_destroy_pool(ctx->pool); 744 ngx_destroy_pool(ctx->pool);
722 ngx_imap_proxy_init(s, peers); 745 ngx_imap_proxy_init(s, peer);
723 746
724 return; 747 return;
725 } 748 }
726 749
727 if (rc == NGX_AGAIN ) { 750 if (rc == NGX_AGAIN ) {
730 753
731 /* rc == NGX_ERROR */ 754 /* rc == NGX_ERROR */
732 755
733 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, 756 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
734 "auth http server %V sent invalid header in response", 757 "auth http server %V sent invalid header in response",
735 &ctx->peer.peers->peer[0].name); 758 ctx->peer.name);
736 ngx_close_connection(ctx->peer.connection); 759 ngx_close_connection(ctx->peer.connection);
737 ngx_destroy_pool(ctx->pool); 760 ngx_destroy_pool(ctx->pool);
738 ngx_imap_session_internal_server_error(s); 761 ngx_imap_session_internal_server_error(s);
739 762
740 return; 763 return;
755 s = c->data; 778 s = c->data;
756 779
757 if (rev->timedout) { 780 if (rev->timedout) {
758 781
759 rev->timedout = 0; 782 rev->timedout = 0;
783
784 if (s->auth_wait) {
785 s->auth_wait = 0;
786 ngx_imap_auth_http_init(s);
787 return;
788 }
760 789
761 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) { 790 if (s->protocol == NGX_IMAP_POP3_PROTOCOL) {
762 s->imap_state = ngx_pop3_start; 791 s->imap_state = ngx_pop3_start;
763 s->connection->read->handler = ngx_pop3_auth_state; 792 s->connection->read->handler = ngx_pop3_auth_state;
764 793
1207 u_char *p; 1236 u_char *p;
1208 size_t len; 1237 size_t len;
1209 ngx_uint_t i; 1238 ngx_uint_t i;
1210 ngx_table_elt_t *header; 1239 ngx_table_elt_t *header;
1211 1240
1212 if (conf->peers == NULL) { 1241 if (conf->peer == NULL) {
1213 conf->peers = prev->peers; 1242 conf->peer = prev->peer;
1214 conf->host_header = prev->host_header; 1243 conf->host_header = prev->host_header;
1215 conf->uri = prev->uri; 1244 conf->uri = prev->uri;
1216 } 1245 }
1217 1246
1218 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); 1247 ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);
1262 ngx_memzero(&u, sizeof(ngx_url_t)); 1291 ngx_memzero(&u, sizeof(ngx_url_t));
1263 1292
1264 u.url = value[1]; 1293 u.url = value[1];
1265 u.default_portn = 80; 1294 u.default_portn = 80;
1266 u.uri_part = 1; 1295 u.uri_part = 1;
1296 u.one_addr = 1;
1267 1297
1268 if (ngx_parse_url(cf, &u) != NGX_OK) { 1298 if (ngx_parse_url(cf, &u) != NGX_OK) {
1269 if (u.err) { 1299 if (u.err) {
1270 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 1300 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
1271 "%s in auth_http \"%V\"", u.err, &u.url); 1301 "%s in auth_http \"%V\"", u.err, &u.url);
1272 } 1302 }
1273 } 1303 }
1274 1304
1275 ahcf->peers = u.peers; 1305 ahcf->peer = u.addrs;
1276 ahcf->peers->number = 1;
1277 1306
1278 ahcf->host_header = u.host_header; 1307 ahcf->host_header = u.host_header;
1279 ahcf->uri = u.uri; 1308 ahcf->uri = u.uri;
1280 1309
1281 if (ahcf->uri.len == 0) { 1310 if (ahcf->uri.len == 0) {