NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL,
- "from",
- NULL, NULL, NULL,
- "exti",
- "rfca",
- NULL,
- "hnod",
- "msgn",
- "jrnl",
- "rep2",
- "list",
- "text",
- "node",
- "room",
- "path",
- NULL,
- "rcpt",
- "spec",
- "time",
- "subj",
- NULL,
- "wefw",
- NULL,
- "cccc",
- NULL
+ "from", /* A */
+ NULL, /* B */
+ NULL, /* C */
+ NULL, /* D */
+ "exti", /* E */
+ "rfca", /* F */
+ NULL, /* G */
+ "hnod", /* H */
+ "msgn", /* I */
+ "jrnl", /* J */
+ "rep2", /* K */
+ "list", /* L */
+ "text", /* M */
+ "node", /* N */
+ "room", /* O */
+ "path", /* P */
+ NULL, /* Q */
+ "rcpt", /* R */
+ "spec", /* S */
+ "time", /* T */
+ "subj", /* U */
+ "nvto", /* V */
+ "wefw", /* W */
+ NULL, /* X */
+ "cccc", /* Y */
+ NULL /* Z */
};
+void CtdlMsgSetCM_Fields(struct CtdlMessage *Msg, const char which, const char *buf, long length)
+{
+ if (Msg->cm_fields[which] != NULL)
+ free (Msg->cm_fields[which]);
+ Msg->cm_fields[which] = malloc(length + 1);
+ memcpy(Msg->cm_fields[which], buf, length);
+ Msg->cm_fields[which][length] = '\0';
+}
+
/*
* This function is self explanatory.
* (What can I say, I'm in a weird mood today...)
return;
}
- rv = fwrite(content, length, 1, CC->download_fp);
+ rv = fwrite(content, length, 1, CCC->download_fp);
if (rv <= 0) {
MSG_syslog(LOG_EMERG, "mime_download(): Couldn't write: %s\n",
strerror(errno));
MSG_syslog(LOG_DEBUG, "CtdlFetchMessage(%ld, %d)\n", msgnum, with_body);
dmsgtext = cdb_fetch(CDB_MSGMAIN, &msgnum, sizeof(long));
if (dmsgtext == NULL) {
+ MSG_syslog(LOG_ERR, "CtdlFetchMessage(%ld, %d) Failed!\n", msgnum, with_body);
return NULL;
}
mptr = dmsgtext->ptr;
free(msg);
}
+int DupCMField(int i, struct CtdlMessage *OrgMsg, struct CtdlMessage *NewMsg)
+{
+ long len;
+ len = strlen(OrgMsg->cm_fields[i]);
+ NewMsg->cm_fields[i] = malloc(len + 1);
+ if (NewMsg->cm_fields[i] == NULL)
+ return 0;
+ memcpy(NewMsg->cm_fields[i], OrgMsg->cm_fields[i], len);
+ NewMsg->cm_fields[i][len] = '\0';
+ return 1;
+}
+
+struct CtdlMessage * CtdlDuplicateMessage(struct CtdlMessage *OrgMsg)
+{
+ int i;
+ struct CtdlMessage *NewMsg;
+
+ if (is_valid_message(OrgMsg) == 0)
+ return NULL;
+ NewMsg = (struct CtdlMessage *)malloc(sizeof(struct CtdlMessage));
+ if (NewMsg == NULL)
+ return NULL;
+
+ memcpy(NewMsg, OrgMsg, sizeof(struct CtdlMessage));
+
+ memset(&NewMsg->cm_fields, 0, sizeof(char*) * 256);
+
+ for (i = 0; i < 256; ++i)
+ {
+ if (OrgMsg->cm_fields[i] != NULL)
+ {
+ if (!DupCMField(i, OrgMsg, NewMsg))
+ {
+ CtdlFreeMessage(NewMsg);
+ return NULL;
+ }
+ }
+ }
+
+ return NewMsg;
+}
+
+
/*
* Pre callback function for multipart/alternative
*/
void quickie_message(const char *from,
const char *fromaddr,
- char *to,
+ const char *to,
char *room,
const char *text,
int format_type,
void flood_protect_quickie_message(const char *from,
const char *fromaddr,
- char *to,
+ const char *to,
char *room,
const char *text,
int format_type,
const char *subject,
int nCriterions,
const char **CritStr,
- long *CritStrLen)
+ long *CritStrLen,
+ long ccid,
+ long ioid,
+ time_t NOW)
{
int i;
- struct UseTable ut;
u_char rawdigest[MD5_DIGEST_LEN];
struct MD5Context md5context;
StrBuf *guid;
- struct cdbdata *cdbut;
char timestamp[64];
long tslen;
- time_t ts = time(NULL);
- time_t tsday = ts / (8*60*60); /* just care for a day... */
+ time_t tsday = NOW / (8*60*60); /* just care for a day... */
tslen = snprintf(timestamp, sizeof(timestamp), "%ld", tsday);
MD5Init(&md5context);
StrBufAppendBufPlain(guid, HKEY("_fldpt"), 0);
if (StrLength(guid) > 40)
StrBufCutAt(guid, 40, NULL);
- /* Find out if we've already sent a similar message */
- memcpy(ut.ut_msgid, SKEY(guid));
- ut.ut_timestamp = ts;
-
- cdbut = cdb_fetch(CDB_USETABLE, SKEY(guid));
- if (cdbut != NULL) {
+ if (CheckIfAlreadySeen("FPAideMessage",
+ guid,
+ NOW,
+ tsday,
+ eUpdate,
+ ccid,
+ ioid)!= 0)
+ {
+ FreeStrBuf(&guid);
/* yes, we did. flood protection kicks in. */
syslog(LOG_DEBUG,
"not sending message again\n");
- cdb_free(cdbut);
+ return;
}
-
- /* rewrite the record anyway, to update the timestamp */
- cdb_store(CDB_USETABLE,
- SKEY(guid),
- &ut, sizeof(struct UseTable) );
-
FreeStrBuf(&guid);
-
- if (cdbut != NULL) return;
/* no, this message isn't sent recently; go ahead. */
quickie_message(from,
fromaddr,
return(msg);
}
-extern int netconfig_check_roomaccess(
- char *errmsgbuf,
- size_t n,
- const char* RemoteIdentifier); /* TODO: find a smarter way */
-
/*
* Check to see whether we have permission to post a message in the current
* room. Returns a *CITADEL ERROR CODE* and puts a message in errmsgbuf, or
}
if ((PostPublic!=POST_LMTP) &&(CC->room.QRflags2 & QR2_SMTP_PUBLIC) == 0) {
- return netconfig_check_roomaccess(errmsgbuf, n, RemoteIdentifier);
+ return CtdlNetconfigCheckRoomaccess(errmsgbuf, n, RemoteIdentifier);
}
return (0);