int imap4d_authenticate (struct imap4d_session *session, struct imap4d_command *command, imap4d_tokbuf_t tok) { char *auth_type; struct imap4d_auth adata; enum imap4d_auth_result res; if (imap4d_tokbuf_argc (tok) != 3) return io_completion_response (command, RESP_BAD, "Invalid arguments"); auth_type = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1); if (tls_required) return io_completion_response (command, RESP_NO, "Command disabled: Use STARTTLS first"); adata.command = command; adata.auth_type = auth_type; adata.username = NULL; res = mu_list_foreach (imap_auth_list, _auth_try, &adata); switch (res) { case imap4d_auth_nosup: return io_completion_response (command, RESP_NO, "Authentication mechanism not supported"); case imap4d_auth_ok: return 0; case imap4d_auth_resp: if (adata.response == RESP_OK && adata.username) { if (imap4d_session_setup (adata.username)) return io_completion_response (command, RESP_NO, "User name or passwd rejected"); else return io_completion_response (command, RESP_OK, "%s authentication successful", auth_type); } /* fall through */ case imap4d_auth_fail: adata.response = RESP_NO; break; } return io_completion_response (command, adata.response, "%s authentication failed", auth_type); }
int imap4d_authenticate (struct imap4d_command *command, imap4d_tokbuf_t tok) { char *auth_type; struct auth_data adata; if (imap4d_tokbuf_argc (tok) != 3) return util_finish (command, RESP_BAD, "Invalid arguments"); auth_type = imap4d_tokbuf_getarg (tok, IMAP4_ARG_1); if (tls_required) return util_finish (command, RESP_NO, "Command disabled: Use STARTTLS first"); adata.command = command; adata.auth_type = auth_type; adata.arg = NULL; adata.username = NULL; if (mu_list_do (imap_auth_list, _auth_try, &adata) == 0) return util_finish (command, RESP_NO, "Authentication mechanism not supported"); if (adata.result == RESP_OK && adata.username) { if (imap4d_session_setup (adata.username)) return util_finish (command, RESP_NO, "User name or passwd rejected"); else return util_finish (command, RESP_OK, "%s authentication successful", auth_type); } return util_finish (command, adata.result, "%s authentication failed", auth_type); }