Mercurial > hg > nginx
comparison src/imap/ngx_imap_handler.c @ 810:e3aa8f305d21
bugfixes
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 25 Oct 2006 13:07:11 +0000 |
parents | da9c1521319d |
children | 760ed037a5a4 |
comparison
equal
deleted
inserted
replaced
809:da9c1521319d | 810:e3aa8f305d21 |
---|---|
809 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); | 809 cscf = ngx_imap_get_module_srv_conf(s, ngx_imap_core_module); |
810 | 810 |
811 if (s->args.nelts == 0) { | 811 if (s->args.nelts == 0) { |
812 size = cscf->pop3_auth_capability.len; | 812 size = cscf->pop3_auth_capability.len; |
813 text = cscf->pop3_auth_capability.data; | 813 text = cscf->pop3_auth_capability.data; |
814 s->state = 0; | |
814 break; | 815 break; |
815 } | 816 } |
816 | 817 |
817 if (s->args.nelts != 1) { | 818 if (s->args.nelts != 1) { |
818 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | 819 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
819 break; | 820 break; |
820 } | 821 } |
821 | 822 |
822 arg = s->args.elts; | 823 arg = s->args.elts; |
823 | |
824 s->args.nelts = 0; | |
825 s->buffer->pos = s->buffer->start; | |
826 s->buffer->last = s->buffer->start; | |
827 s->arg_start = s->buffer->start; | |
828 | 824 |
829 if (arg[0].len == 5) { | 825 if (arg[0].len == 5) { |
830 | 826 |
831 if (ngx_strncasecmp(arg[0].data, "LOGIN", 5) == 0) { | 827 if (ngx_strncasecmp(arg[0].data, "LOGIN", 5) == 0) { |
832 s->imap_state = ngx_pop3_auth_login_username; | 828 s->imap_state = ngx_pop3_auth_login_username; |
969 | 965 |
970 case ngx_pop3_auth_login_username: | 966 case ngx_pop3_auth_login_username: |
971 arg = s->args.elts; | 967 arg = s->args.elts; |
972 s->imap_state = ngx_pop3_auth_login_password; | 968 s->imap_state = ngx_pop3_auth_login_password; |
973 | 969 |
974 s->args.nelts = 0; | |
975 s->buffer->pos = s->buffer->start; | |
976 s->buffer->last = s->buffer->start; | |
977 s->arg_start = s->buffer->start; | |
978 | |
979 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | 970 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
980 "pop3 auth login username: \"%V\"", &arg[0]); | 971 "pop3 auth login username: \"%V\"", &arg[0]); |
981 | 972 |
982 s->login.data = ngx_palloc(c->pool, | 973 s->login.data = ngx_palloc(c->pool, |
983 ngx_base64_decoded_length(arg[0].len)); | 974 ngx_base64_decoded_length(arg[0].len)); |
988 | 979 |
989 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { | 980 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { |
990 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 981 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
991 "client sent invalid base64 encoding " | 982 "client sent invalid base64 encoding " |
992 "in AUTH LOGIN command"); | 983 "in AUTH LOGIN command"); |
993 ngx_imap_session_internal_server_error(s); | 984 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
994 return; | 985 break; |
995 } | 986 } |
996 | 987 |
997 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | 988 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
998 "pop3 auth login username: \"%V\"", &s->login); | 989 "pop3 auth login username: \"%V\"", &s->login); |
999 | 990 |
1019 | 1010 |
1020 if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) { | 1011 if (ngx_decode_base64(&s->passwd, &arg[0]) != NGX_OK) { |
1021 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1012 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1022 "client sent invalid base64 encoding " | 1013 "client sent invalid base64 encoding " |
1023 "in AUTH LOGIN command"); | 1014 "in AUTH LOGIN command"); |
1024 ngx_imap_session_internal_server_error(s); | 1015 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
1025 return; | 1016 break; |
1026 } | 1017 } |
1027 | 1018 |
1028 #if (NGX_DEBUG_IMAP_PASSWD) | 1019 #if (NGX_DEBUG_IMAP_PASSWD) |
1029 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, | 1020 ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0, |
1030 "pop3 auth login password: \"%V\"", &s->passwd); | 1021 "pop3 auth login password: \"%V\"", &s->passwd); |
1059 | 1050 |
1060 if (ngx_decode_base64(&plain, &arg[0]) != NGX_OK) { | 1051 if (ngx_decode_base64(&plain, &arg[0]) != NGX_OK) { |
1061 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1052 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1062 "client sent invalid base64 encoding " | 1053 "client sent invalid base64 encoding " |
1063 "in AUTH PLAIN command"); | 1054 "in AUTH PLAIN command"); |
1064 ngx_imap_session_internal_server_error(s); | 1055 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
1065 return; | 1056 break; |
1066 } | 1057 } |
1067 | 1058 |
1068 p = plain.data; | 1059 p = plain.data; |
1069 last = p + plain.len; | 1060 last = p + plain.len; |
1070 | 1061 |
1071 while (p < last && *p++) { /* void */ } | 1062 while (p < last && *p++) { /* void */ } |
1072 | 1063 |
1064 if (p == last) { | |
1065 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1066 "client sent invalid login/password " | |
1067 "in AUTH PLAIN command"); | |
1068 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
1069 break; | |
1070 } | |
1071 | |
1073 s->login.data = p; | 1072 s->login.data = p; |
1074 | 1073 |
1075 while (p < last && *p) { p++; } | 1074 while (p < last && *p) { p++; } |
1076 | 1075 |
1076 if (p == last) { | |
1077 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1078 "client sent invalid login/password " | |
1079 "in AUTH PLAIN command"); | |
1080 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
1081 break; | |
1082 } | |
1083 | |
1077 s->login.len = p++ - s->login.data; | 1084 s->login.len = p++ - s->login.data; |
1085 | |
1086 s->passwd.len = last - p; | |
1078 s->passwd.data = p; | 1087 s->passwd.data = p; |
1079 | |
1080 while (p < last && *p) { p++; } | |
1081 | |
1082 s->passwd.len = p - s->passwd.data; | |
1083 | 1088 |
1084 #if (NGX_DEBUG_IMAP_PASSWD) | 1089 #if (NGX_DEBUG_IMAP_PASSWD) |
1085 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, | 1090 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, |
1086 "pop3 auth plain: \"%V\" \"%V\"", | 1091 "pop3 auth plain: \"%V\" \"%V\"", |
1087 &s->login, &s->passwd); | 1092 &s->login, &s->passwd); |
1113 } | 1118 } |
1114 | 1119 |
1115 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { | 1120 if (ngx_decode_base64(&s->login, &arg[0]) != NGX_OK) { |
1116 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1121 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1117 "client sent invalid base64 encoding " | 1122 "client sent invalid base64 encoding " |
1118 "in AUTH LOGIN command"); | 1123 "in AUTH CRAM-MD5 command"); |
1119 ngx_imap_session_internal_server_error(s); | 1124 rc = NGX_IMAP_PARSE_INVALID_COMMAND; |
1120 return; | 1125 break; |
1121 } | 1126 } |
1122 | 1127 |
1123 p = s->login.data; | 1128 p = s->login.data; |
1124 last = p + s->login.len; | 1129 last = p + s->login.len; |
1125 | 1130 |
1130 s->passwd.data = p; | 1135 s->passwd.data = p; |
1131 break; | 1136 break; |
1132 } | 1137 } |
1133 } | 1138 } |
1134 | 1139 |
1140 if (s->passwd.len != 32) { | |
1141 ngx_log_error(NGX_LOG_INFO, c->log, 0, | |
1142 "client sent invalid CRAM-MD5 hash " | |
1143 "in AUTH CRAM-MD5 command"); | |
1144 rc = NGX_IMAP_PARSE_INVALID_COMMAND; | |
1145 break; | |
1146 } | |
1147 | |
1135 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, | 1148 ngx_log_debug2(NGX_LOG_DEBUG_IMAP, c->log, 0, |
1136 "pop3 auth cram-md5: \"%V\" \"%V\"", | 1149 "pop3 auth cram-md5: \"%V\" \"%V\"", |
1137 &s->login, &s->passwd); | 1150 &s->login, &s->passwd); |
1138 | 1151 |
1139 s->auth_method = NGX_IMAP_AUTH_CRAM_MD5; | 1152 s->auth_method = NGX_IMAP_AUTH_CRAM_MD5; |
1151 return; | 1164 return; |
1152 } | 1165 } |
1153 } | 1166 } |
1154 | 1167 |
1155 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { | 1168 if (rc == NGX_IMAP_PARSE_INVALID_COMMAND) { |
1169 s->imap_state = ngx_pop3_start; | |
1170 s->state = 0; | |
1156 text = pop3_invalid_command; | 1171 text = pop3_invalid_command; |
1157 size = sizeof(pop3_invalid_command) - 1; | 1172 size = sizeof(pop3_invalid_command) - 1; |
1158 } | 1173 } |
1159 | 1174 |
1160 s->args.nelts = 0; | 1175 s->args.nelts = 0; |
1161 s->buffer->pos = s->buffer->start; | 1176 s->buffer->pos = s->buffer->start; |
1162 s->buffer->last = s->buffer->start; | 1177 s->buffer->last = s->buffer->start; |
1178 | |
1179 if (s->state) { | |
1180 s->arg_start = s->buffer->start; | |
1181 } | |
1163 | 1182 |
1164 s->out.data = text; | 1183 s->out.data = text; |
1165 s->out.len = size; | 1184 s->out.len = size; |
1166 | 1185 |
1167 ngx_imap_send(c->write); | 1186 ngx_imap_send(c->write); |