Mercurial > hg > nginx-vendor-0-7
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) { |