X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmsgbase.c;h=7eb321905315c9b2313e81cf0639729cb8891ebe;hb=e26a8dee20d1726b4995821f717f867f50fc5659;hp=ab0176de0a9804b25a06856633373e75d3575420;hpb=06719ea96fc6fc7cc6ff78311d85c8c98674332c;p=citadel.git diff --git a/citadel/msgbase.c b/citadel/msgbase.c index ab0176de0..7eb321905 100644 --- a/citadel/msgbase.c +++ b/citadel/msgbase.c @@ -644,18 +644,6 @@ int CtdlForEachMessage(int mode, long ref, char *search_string, cdbfr->ptr = NULL; /* clear this so that cdb_free() doesn't free it */ cdb_free(cdbfr); /* we own this memory now */ - /* - * We cache the most recent msglist in order to do security checks later - */ - if (CC->client_socket > 0) { - if (CC->cached_msglist != NULL) { - free(CC->cached_msglist); - } - - CC->cached_msglist = msglist; - CC->cached_num_msgs = num_msgs; - } - /* * Now begin the traversal. */ @@ -787,7 +775,21 @@ int CtdlForEachMessage(int mode, long ref, char *search_string, } } if (need_to_free_re) regfree(&re); - if (CC->client_socket <= 0) free(msglist); + + /* + * We cache the most recent msglist in order to do security checks later + */ + if (CC->client_socket > 0) { + if (CC->cached_msglist != NULL) { + free(CC->cached_msglist); + } + CC->cached_msglist = msglist; + CC->cached_num_msgs = num_msgs; + } + else { + free(msglist); + } + return num_processed; } @@ -1104,6 +1106,10 @@ void mime_download(char *name, char *filename, char *partnum, char *disp, return; rv = fwrite(content, length, 1, CC->download_fp); + if (rv == -1) { + syslog(LOG_EMERG, "mime_download(): Couldn't write: %s\n", + strerror(errno)); + } fflush(CC->download_fp); rewind(CC->download_fp); @@ -1640,7 +1646,9 @@ int CtdlOutputMsg(long msg_num, /* message number (local) to fetch */ r = check_cached_msglist(msg_num); } if (r != om_ok) { - syslog(LOG_DEBUG, "\033[31m SECURITY CHECK FAIL \033[0m\n"); + syslog(LOG_DEBUG, "Security check fail: message %ld is not in %s\n", + msg_num, CC->room.QRname + ); if (do_proto) { if (r == om_access_denied) { cprintf("%d message %ld was not found in this room\n", @@ -1951,6 +1959,7 @@ void OutputRFC822MsgHeaders( int i, j, k; char *mptr = NULL; char *mpptr = NULL; + char *hptr; for (i = 0; i < 256; ++i) { if (TheMessage->cm_fields[i]) { @@ -1976,7 +1985,11 @@ void OutputRFC822MsgHeaders( else if (i == 'V') { if ((flags & QP_EADDR) != 0) mptr = qp_encode_email_addrs(mptr); - cprintf("Envelope-To: %s%s", mptr, nl); + hptr = mptr; + while ((*hptr != '\0') && isspace(*hptr)) + hptr ++; + if (!IsEmptyStr(hptr)) + cprintf("Envelope-To: %s%s", hptr, nl); } else if (i == 'U') { cprintf("Subject: %s%s", mptr, nl); @@ -2029,7 +2042,11 @@ void OutputRFC822MsgHeaders( } } else if (i == 'K') { - cprintf("Reply-To: <%s>%s", mptr, nl); + hptr = mptr; + while ((*hptr != '\0') && isspace(*hptr)) + hptr ++; + if (!IsEmptyStr(hptr)) + cprintf("Reply-To: %s%s", mptr, nl); } if (mptr != mpptr) free (mptr); @@ -2055,7 +2072,6 @@ void Dump_RFC822HeadersBody( int outlen = 0; int nllen = strlen(nl); char *mptr; - int rc; mptr = TheMessage->cm_fields['M']; @@ -2115,7 +2131,7 @@ void Dump_RFC822HeadersBody( } } if (outlen > 0) { - rc = client_write(outbuf, outlen); + client_write(outbuf, outlen); outlen = 0; } } @@ -2794,7 +2810,11 @@ long send_message(struct CtdlMessage *msg) { /* Get a new message number */ newmsgid = get_new_message_number(); - snprintf(msgidbuf, sizeof msgidbuf, "%010ld@%s", newmsgid, config.c_fqdn); + snprintf(msgidbuf, sizeof msgidbuf, "%08lX-%08lX@%s", + (long unsigned int) time(NULL), + (long unsigned int) newmsgid, + config.c_fqdn + ); /* Generate an ID if we don't have one already */ if (msg->cm_fields['I']==NULL) { @@ -2917,7 +2937,6 @@ void serialize_message(struct ser_ret *ret, /* return values */ void dump_message(struct CtdlMessage *msg, /* unserialized msg */ long Siz) /* how many chars ? */ { - size_t wlen; int i; static char *forder = FORDER; char *buf; @@ -2932,8 +2951,6 @@ void dump_message(struct CtdlMessage *msg, /* unserialized msg */ buf = (char*) malloc (Siz + 1); - wlen = 3; - for (i=0; i<26; ++i) if (msg->cm_fields[(int)forder[i]] != NULL) { snprintf (buf, Siz, " msg[%c] = %s ...\n", (char) forder[i], msg->cm_fields[(int)forder[i]]); @@ -3291,6 +3308,10 @@ long CtdlSubmitMsg(struct CtdlMessage *msg, /* message to save */ network_fp = fopen(submit_filename, "wb+"); if (network_fp != NULL) { rv = fwrite(smr.ser, smr.len, 1, network_fp); + if (rv == -1) { + syslog(LOG_EMERG, "CtdlSubmitMsg(): Couldn't write network spool file: %s\n", + strerror(errno)); + } fclose(network_fp); } free(smr.ser); @@ -3931,30 +3952,36 @@ int CtdlDoIHavePermissionToPostInThisRoom( if ((CC->user.axlevel < AxProbU) && ((CC->room.QRflags & QR_MAILBOX) == 0)) { - snprintf(errmsgbuf, n, "Need to be validated to enter " - "(except in %s> to sysop)", MAILROOM); + snprintf(errmsgbuf, n, "Need to be validated to enter (except in %s> to sysop)", MAILROOM); return (ERROR + HIGHER_ACCESS_REQUIRED); } CtdlRoomAccess(&CC->room, &CC->user, &ra, NULL); - if ( (!(ra & UA_POSTALLOWED)) && (ra & UA_REPLYALLOWED) && (!is_reply) ) { + if (ra & UA_POSTALLOWED) { + strcpy(errmsgbuf, "OK to post or reply here"); + return(0); + } + + if ( (ra & UA_REPLYALLOWED) && (is_reply) ) { /* * To be thorough, we ought to check to see if the message they are * replying to is actually a valid one in this room, but unless this * actually becomes a problem we'll go with high performance instead. */ - snprintf(errmsgbuf, n, "You may only reply to existing messages here."); - return (ERROR + HIGHER_ACCESS_REQUIRED); + strcpy(errmsgbuf, "OK to reply here"); + return(0); } - else if (!(ra & UA_POSTALLOWED)) { - snprintf(errmsgbuf, n, "Higher access is required to post in this room."); + if ( (ra & UA_REPLYALLOWED) && (!is_reply) ) { + /* Clarify what happened with a better error message */ + snprintf(errmsgbuf, n, "You may only reply to existing messages here."); return (ERROR + HIGHER_ACCESS_REQUIRED); } - strcpy(errmsgbuf, "Ok"); - return(0); + snprintf(errmsgbuf, n, "Higher access is required to post in this room."); + return (ERROR + HIGHER_ACCESS_REQUIRED); + } @@ -4945,6 +4972,11 @@ void AdjRefCount(long msgnum, int incr) new_arcq.arcq_msgnum = msgnum; new_arcq.arcq_delta = incr; rv = fwrite(&new_arcq, sizeof(struct arcq), 1, arcfp); + if (rv == -1) { + syslog(LOG_EMERG, "Couldn't write Refcount Queue File %s: %s\n", + file_arcq, + strerror(errno)); + } fflush(arcfp); return;