X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fimap%2Fserv_imap.c;h=278cc73323392b3883c08ff8ee58b75d1b8fa163;hb=b26e3e79fcb15dc1b46f4c7710a6bafdc6472950;hp=a7b80d989b3c7b9e94e254adff87c002a273673a;hpb=bcbaf2800c778043c12f9fd2d719ca9271ac6cb4;p=citadel.git diff --git a/citadel/modules/imap/serv_imap.c b/citadel/modules/imap/serv_imap.c index a7b80d989..278cc7332 100644 --- a/citadel/modules/imap/serv_imap.c +++ b/citadel/modules/imap/serv_imap.c @@ -293,7 +293,7 @@ void imap_add_single_msgid(long msgnum, void *userdata) if (Imap->num_msgs > Imap->num_alloc) { Imap->num_alloc += REALLOC_INCREMENT; Imap->msgids = realloc(Imap->msgids, (Imap->num_alloc * sizeof(long)) ); - Imap->flags = realloc(Imap->flags, (Imap->num_alloc * sizeof(long)) ); + Imap->flags = realloc(Imap->flags, (Imap->num_alloc * sizeof(unsigned int)) ); } Imap->msgids[Imap->num_msgs - 1] = msgnum; Imap->flags[Imap->num_msgs - 1] = 0; @@ -320,16 +320,17 @@ void imap_load_msgids(void) /* Load the message list */ cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { - Imap->msgids = malloc(cdbfr->len); - memcpy(Imap->msgids, cdbfr->ptr, cdbfr->len); + Imap->msgids = (long*)cdbfr->ptr; Imap->num_msgs = cdbfr->len / sizeof(long); Imap->num_alloc = cdbfr->len / sizeof(long); + cdbfr->ptr = NULL; + cdbfr->len = 0; cdb_free(cdbfr); } if (Imap->num_msgs) { - Imap->flags = malloc(Imap->num_alloc * sizeof(long)); - memset(Imap->flags, 0, (Imap->num_alloc * sizeof(long)) ); + Imap->flags = malloc(Imap->num_alloc * sizeof(unsigned int)); + memset(Imap->flags, 0, (Imap->num_alloc * sizeof(unsigned int)) ); } imap_set_seen_flags(0); @@ -371,14 +372,10 @@ void imap_rescan_msgids(void) */ cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long)); if (cdbfr != NULL) { - msglist = malloc(cdbfr->len + 1); - if (msglist == NULL) { - IMAPM_syslog(LOG_CRIT, "malloc() failed"); - CC->kill_me = KILLME_MALLOC_FAILED; - return; - } - memcpy(msglist, cdbfr->ptr, (size_t)cdbfr->len); + msglist = (long*)cdbfr->ptr; + cdbfr->ptr = NULL; num_msgs = cdbfr->len / sizeof(long); + cdbfr->len = 0; cdb_free(cdbfr); } else { num_msgs = 0; @@ -417,9 +414,8 @@ void imap_rescan_msgids(void) (Imap->num_msgs - i))); memmove(&Imap->flags[i], &Imap->flags[i + 1], - (sizeof(long) * + (sizeof(unsigned int) * (Imap->num_msgs - i))); - --i; } @@ -681,7 +677,11 @@ void imap_authenticate(int num_parms, ConstStr *Params) } if (!strcasecmp(Params[2].Key, "LOGIN")) { - CtdlEncodeBase64(UsrBuf, "Username:", 9, 0); + size_t len = CtdlEncodeBase64(UsrBuf, "Username:", 9, 0); + if (UsrBuf[len - 1] == '\n') { + UsrBuf[len - 1] = '\0'; + } + IAPrintf("+ %s\r\n", UsrBuf); IMAP->authstate = imap_as_expecting_username; strcpy(IMAP->authseq, Params[0].Key); @@ -689,7 +689,10 @@ void imap_authenticate(int num_parms, ConstStr *Params) } if (!strcasecmp(Params[2].Key, "PLAIN")) { - // CtdlEncodeBase64(UsrBuf, "Username:", 9, 0); + // size_t len = CtdlEncodeBase64(UsrBuf, "Username:", 9, 0); + // if (UsrBuf[len - 1] == '\n') { + // UsrBuf[len - 1] = '\0'; + // } // IAPuts("+ %s\r\n", UsrBuf); IAPuts("+ \r\n"); IMAP->authstate = imap_as_expecting_plainauth; @@ -708,22 +711,42 @@ void imap_auth_plain(void) { citimap *Imap = IMAP; const char *decoded_authstring; - char ident[256]; - char user[256]; - char pass[256]; + char ident[256] = ""; + char user[256] = ""; + char pass[256] = ""; int result; - long len; + long decoded_len; + long len = 0; + long plen = 0; memset(pass, 0, sizeof(pass)); - StrBufDecodeBase64(Imap->Cmd.CmdBuf); + decoded_len = StrBufDecodeBase64(Imap->Cmd.CmdBuf); + + if (decoded_len > 0) + { + decoded_authstring = ChrPtr(Imap->Cmd.CmdBuf); + + len = safestrncpy(ident, decoded_authstring, sizeof ident); - decoded_authstring = ChrPtr(Imap->Cmd.CmdBuf); - safestrncpy(ident, decoded_authstring, sizeof ident); - safestrncpy(user, &decoded_authstring[strlen(ident) + 1], sizeof user); - len = safestrncpy(pass, &decoded_authstring[strlen(ident) + strlen(user) + 2], sizeof pass); - if (len < 0) - len = sizeof(pass) - 1; + decoded_len -= len - 1; + decoded_authstring += len + 1; + if (decoded_len > 0) + { + len = safestrncpy(user, decoded_authstring, sizeof user); + + decoded_authstring += len + 1; + decoded_len -= len - 1; + } + + if (decoded_len > 0) + { + plen = safestrncpy(pass, decoded_authstring, sizeof pass); + + if (plen < 0) + plen = sizeof(pass) - 1; + } + } Imap->authstate = imap_as_normal; if (!IsEmptyStr(ident)) { @@ -734,7 +757,7 @@ void imap_auth_plain(void) } if (result == login_ok) { - if (CtdlTryPassword(pass, len) == pass_ok) { + if (CtdlTryPassword(pass, plen) == pass_ok) { IAPrintf("%s OK authentication succeeded\r\n", Imap->authseq); return; } @@ -752,7 +775,11 @@ void imap_auth_login_user(long state) case imap_as_expecting_username: StrBufDecodeBase64(Imap->Cmd.CmdBuf); CtdlLoginExistingUser(NULL, ChrPtr(Imap->Cmd.CmdBuf)); - CtdlEncodeBase64(PWBuf, "Password:", 9, 0); + size_t len = CtdlEncodeBase64(PWBuf, "Password:", 9, 0); + if (PWBuf[len - 1] == '\n') { + PWBuf[len - 1] = '\0'; + } + IAPrintf("+ %s\r\n", PWBuf); Imap->authstate = imap_as_expecting_password; @@ -874,7 +901,7 @@ void imap_select(int num_parms, ConstStr *Params) * the number of messages and number of new messages. */ memcpy(&CC->room, &QRscratch, sizeof(struct ctdlroom)); - CtdlUserGoto(NULL, 0, 0, &msgs, &new); + CtdlUserGoto(NULL, 0, 0, &msgs, &new, NULL, NULL); Imap->selected = 1; if (!strcasecmp(Params[1].Key, "EXAMINE")) { @@ -985,6 +1012,7 @@ void imap_close(int num_parms, ConstStr *Params) */ void imap_namespace(int num_parms, ConstStr *Params) { + long len; int i; struct floor *fl; int floors = 0; @@ -1005,8 +1033,8 @@ void imap_namespace(int num_parms, ConstStr *Params) if (fl->f_flags & F_INUSE) { /* if (floors > 0) IAPuts(" "); samjam says this confuses javamail */ IAPuts("("); - snprintf(Namespace, sizeof(Namespace), "%s/", fl->f_name); - plain_imap_strout(Namespace); + len = snprintf(Namespace, sizeof(Namespace), "%s/", fl->f_name); + IPutStr(Namespace, len); IAPuts(" \"/\")"); ++floors; } @@ -1158,6 +1186,7 @@ int imap_grabroom(char *returned_roomname, const char *foldername, int zapped_ok */ void imap_status(int num_parms, ConstStr *Params) { + long len; int ret; char roomname[ROOMNAMELEN]; char imaproomname[SIZ]; @@ -1178,7 +1207,7 @@ void imap_status(int num_parms, ConstStr *Params) if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - CtdlUserGoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new, NULL, NULL); /* * Tell the client what it wants to know. In fact, tell it *more* than @@ -1186,9 +1215,9 @@ void imap_status(int num_parms, ConstStr *Params) * names and simply spew all possible data items. It's far easier to * code and probably saves us some processing time too. */ - imap_mailboxname(imaproomname, sizeof imaproomname, &CC->room); + len = imap_mailboxname(imaproomname, sizeof imaproomname, &CC->room); IAPuts("* STATUS "); - plain_imap_strout(imaproomname); + IPutStr(imaproomname, len); IAPrintf(" (MESSAGES %d ", msgs); IAPrintf("RECENT %d ", new); /* Initially, new==recent */ IAPrintf("UIDNEXT %ld ", CitControl.MMhighest + 1); @@ -1199,7 +1228,7 @@ void imap_status(int num_parms, ConstStr *Params) * our happy day without violent explosions. */ if (IMAP->selected) { - CtdlUserGoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new, NULL, NULL); } /* @@ -1237,14 +1266,14 @@ void imap_subscribe(int num_parms, ConstStr *Params) if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - CtdlUserGoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new, NULL, NULL); /* * If another folder is selected, go back to that room so we can resume * our happy day without violent explosions. */ if (IMAP->selected) { - CtdlUserGoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new, NULL, NULL); } IReply("OK SUBSCRIBE completed"); @@ -1274,7 +1303,7 @@ void imap_unsubscribe(int num_parms, ConstStr *Params) if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - CtdlUserGoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new, NULL, NULL); /* * Now make the API call to zap the room @@ -1290,7 +1319,7 @@ void imap_unsubscribe(int num_parms, ConstStr *Params) * our happy day without violent explosions. */ if (IMAP->selected) { - CtdlUserGoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new, NULL, NULL); } } @@ -1320,7 +1349,7 @@ void imap_delete(int num_parms, ConstStr *Params) if (IMAP->selected) { strcpy(savedroom, CC->room.QRname); } - CtdlUserGoto(roomname, 0, 0, &msgs, &new); + CtdlUserGoto(roomname, 0, 0, &msgs, &new, NULL, NULL); /* * Now delete the room. @@ -1337,7 +1366,7 @@ void imap_delete(int num_parms, ConstStr *Params) * our happy day without violent explosions. */ if (IMAP->selected) { - CtdlUserGoto(savedroom, 0, 0, &msgs, &new); + CtdlUserGoto(savedroom, 0, 0, &msgs, &new, NULL, NULL); } }