static gint smtp_auth_recv(SMTPSession *session, const gchar *msg) { gchar buf[MSGBUFSIZE]; switch (session->auth_type) { case SMTPAUTH_LOGIN: session->state = SMTP_AUTH_LOGIN_USER; if (!strncmp(msg, "334 ", 4)) { base64_encode(buf, session->user, strlen(session->user)); session_send_msg(SESSION(session), SESSION_MSG_NORMAL, buf); log_print("ESMTP> [USERID]\n"); } else { /* Server rejects AUTH */ session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*"); log_print("ESMTP> *\n"); } break; case SMTPAUTH_CRAM_MD5: session->state = SMTP_AUTH_CRAM_MD5; if (!strncmp(msg, "334 ", 4)) { gchar *response; gchar *response64; gchar *challenge; gint challengelen; guchar hexdigest[33]; challenge = g_malloc(strlen(msg + 4) + 1); challengelen = base64_decode(challenge, msg + 4, -1); challenge[challengelen] = '\0'; log_print("ESMTP< [Decoded: %s]\n", challenge); g_snprintf(buf, sizeof(buf), "%s", session->pass); md5_hex_hmac(hexdigest, challenge, challengelen, buf, strlen(session->pass)); g_free(challenge); response = g_strdup_printf ("%s %s", session->user, hexdigest); log_print("ESMTP> [Encoded: %s]\n", response); response64 = g_malloc((strlen(response) + 3) * 2 + 1); base64_encode(response64, response, strlen(response)); g_free(response); session_send_msg(SESSION(session), SESSION_MSG_NORMAL, response64); log_print("ESMTP> %s\n", response64); g_free(response64); } else { /* Server rejects AUTH */ session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*"); log_print("ESMTP> *\n"); } break; case SMTPAUTH_DIGEST_MD5: default: /* stop smtp_auth when no correct authtype */ session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*"); log_print("ESMTP> *\n"); break; } return SM_OK; }
void caldav_md5_hex_hmac(char *hexdigest, const unsigned char* text, int text_len, const unsigned char* key, int key_len) { md5_hex_hmac(hexdigest, text, text_len, key, key_len); }
static gint sieve_auth_recv(SieveSession *session, const gchar *msg) { gchar buf[MESSAGEBUFSIZE], *tmp; switch (session->auth_type) { case SIEVEAUTH_LOGIN: session->state = SIEVE_AUTH_LOGIN_USER; if (strstr(msg, "VXNlcm5hbWU6")) { tmp = g_base64_encode(session->user, strlen(session->user)); g_snprintf(buf, sizeof(buf), "\"%s\"", tmp); if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, buf) < 0) { g_free(tmp); return SE_ERROR; } g_free(tmp); log_print(LOG_PROTOCOL, "Sieve> [USERID]\n"); } else { /* Server rejects AUTH */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "\"*\"") < 0) return SE_ERROR; log_print(LOG_PROTOCOL, "Sieve> *\n"); } break; case SIEVEAUTH_CRAM_MD5: session->state = SIEVE_AUTH_CRAM_MD5; if (msg[0] == '"') { gchar *response; gchar *response64; gchar *challenge, *tmp; gsize challengelen; guchar hexdigest[33]; tmp = g_base64_decode(msg + 1, &challengelen); challenge = g_strndup(tmp, challengelen); g_free(tmp); log_print(LOG_PROTOCOL, "Sieve< [Decoded: %s]\n", challenge); g_snprintf(buf, sizeof(buf), "%s", session->pass); md5_hex_hmac(hexdigest, challenge, challengelen, buf, strlen(session->pass)); g_free(challenge); response = g_strdup_printf ("%s %s", session->user, hexdigest); log_print(LOG_PROTOCOL, "Sieve> [Encoded: %s]\n", response); response64 = g_base64_encode(response, strlen(response)); g_free(response); response = g_strdup_printf("\"%s\"", response64); g_free(response64); if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, response) < 0) { g_free(response); return SE_ERROR; } log_print(LOG_PROTOCOL, "Sieve> %s\n", response); g_free(response); } else { /* Server rejects AUTH */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "\"*\"") < 0) return SE_ERROR; log_print(LOG_PROTOCOL, "Sieve> *\n"); } break; default: /* stop sieve_auth when no correct authtype */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*") < 0) return SE_ERROR; log_print(LOG_PROTOCOL, "Sieve> *\n"); break; } return SE_OK; }
static gint smtp_auth_recv(SMTPSession *session, const gchar *msg) { gchar buf[MESSAGEBUFSIZE], *tmp; switch (session->auth_type) { case SMTPAUTH_LOGIN: session->state = SMTP_AUTH_LOGIN_USER; if (!strncmp(msg, "334 ", 4)) { tmp = g_base64_encode(session->user, strlen(session->user)); if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, tmp) < 0) { g_free(tmp); return SM_ERROR; } g_free(tmp); log_print(LOG_PROTOCOL, "ESMTP> [USERID]\n"); } else { /* Server rejects AUTH */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*") < 0) return SM_ERROR; log_print(LOG_PROTOCOL, "ESMTP> *\n"); } break; case SMTPAUTH_CRAM_MD5: session->state = SMTP_AUTH_CRAM_MD5; if (!strncmp(msg, "334 ", 4)) { gchar *response; gchar *response64; gchar *challenge; gsize challengelen; guchar hexdigest[33]; challenge = g_base64_decode_zero(msg + 4, &challengelen); log_print(LOG_PROTOCOL, "ESMTP< [Decoded: %s]\n", challenge); g_snprintf(buf, sizeof(buf), "%s", session->pass); md5_hex_hmac(hexdigest, challenge, challengelen, buf, strlen(session->pass)); g_free(challenge); response = g_strdup_printf ("%s %s", session->user, hexdigest); log_print(LOG_PROTOCOL, "ESMTP> [Encoded: %s]\n", response); response64 = g_base64_encode(response, strlen(response)); g_free(response); if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, response64) < 0) { g_free(response64); return SM_ERROR; } log_print(LOG_PROTOCOL, "ESMTP> %s\n", response64); g_free(response64); } else { /* Server rejects AUTH */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*") < 0) return SM_ERROR; log_print(LOG_PROTOCOL, "ESMTP> *\n"); } break; case SMTPAUTH_DIGEST_MD5: default: /* stop smtp_auth when no correct authtype */ if (session_send_msg(SESSION(session), SESSION_MSG_NORMAL, "*") < 0) return SM_ERROR; log_print(LOG_PROTOCOL, "ESMTP> *\n"); break; } return SM_OK; }