return; // already got it
}
- msg = CtdlFetchMessage(msgnum, 1);
+ msg = CtdlFetchMessage(msgnum, 1, 1);
if (msg == NULL) {
return;
}
void smtp_get_user(long offset)
{
char buf[SIZ];
- char username[SIZ];
citsmtp *sSMTP = SMTP;
- CtdlDecodeBase64(username, ChrPtr(sSMTP->Cmd) + offset, SIZ);
+ StrBufDecodeBase64(sSMTP->Cmd);
+
/* syslog(LOG_DEBUG, "Trying <%s>\n", username); */
- if (CtdlLoginExistingUser(NULL, username) == login_ok) {
- CtdlEncodeBase64(buf, "Password:", 9, 0);
+ if (CtdlLoginExistingUser(NULL, ChrPtr(sSMTP->Cmd)) == login_ok) {
+ size_t len = CtdlEncodeBase64(buf, "Password:", 9, 0);
+
+ if (buf[len - 1] == '\n') {
+ buf[len - 1] = '\0';
+ }
cprintf("334 %s\r\n", buf);
sSMTP->command_state = smtp_password;
}
{
citsmtp *sSMTP = SMTP;
char password[SIZ];
- long len;
- memset(password, 0, sizeof(password));
- len = CtdlDecodeBase64(password, ChrPtr(sSMTP->Cmd), SIZ);
+ memset(password, 0, sizeof(password));
+ StrBufDecodeBase64(sSMTP->Cmd);
/* syslog(LOG_DEBUG, "Trying <%s>\n", password); */
- if (CtdlTryPassword(password, len) == pass_ok) {
+ if (CtdlTryPassword(SKEY(sSMTP->Cmd)) == pass_ok) {
smtp_auth_greeting(offset, Flags);
}
else {
int result;
long decoded_len;
- long len;
+ long len = 0;
+ long plen = 0;
memset(pass, 0, sizeof(pass));
decoded_len = StrBufDecodeBase64(sSMTP->Cmd);
if (decoded_len > 0)
{
- len = safestrncpy(pass, decoded_authstring, sizeof pass);
+ plen = safestrncpy(pass, decoded_authstring, sizeof pass);
- if (len < 0)
- len = sizeof(pass) - 1;
+ if (plen < 0)
+ plen = sizeof(pass) - 1;
}
}
}
if (result == login_ok) {
- if (CtdlTryPassword(pass, len) == pass_ok) {
+ if (CtdlTryPassword(pass, plen) == pass_ok) {
smtp_webcit_preferences_hack();
smtp_auth_greeting(offset, Flags);
return;
smtp_get_user(6);
}
else {
- CtdlEncodeBase64(username_prompt, "Username:", 9, 0);
+ size_t len = CtdlEncodeBase64(username_prompt, "Username:", 9, 0);
+ if (username_prompt[len - 1] == '\n') {
+ username_prompt[len - 1] = '\0';
+ }
cprintf("334 %s\r\n", username_prompt);
sSMTP->command_state = smtp_user;
}
*/
void smtp_command_loop(void)
{
+ static const ConstStr AuthPlainStr = {HKEY("AUTH PLAIN")};
struct CitContext *CCC = CC;
citsmtp *sSMTP = SMTP;
const char *pch, *pchs;
syslog(LOG_DEBUG, "SMTP server: %s\n", ChrPtr(sSMTP->Cmd));
if (sSMTP->command_state == smtp_user) {
- smtp_get_user(0);
+ if (!strncmp(ChrPtr(sSMTP->Cmd), AuthPlainStr.Key, AuthPlainStr.len))
+ smtp_try_plain(0, 0);
+ else
+ smtp_get_user(0);
return;
}