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);