extern char ctdl_spool_dir[PATH_MAX];
extern char ctdl_netout_dir[PATH_MAX];
extern char ctdl_netin_dir[PATH_MAX];
+extern char ctdl_netdigest_dir[PATH_MAX];
extern char ctdl_nettmp_dir[PATH_MAX];
extern char ctdl_netcfg_dir[PATH_MAX];
extern char ctdl_bbsbase_dir[PATH_MAX];
struct ctdlroom *qrbuf,
const char *prefix);
+extern FILE *create_digest_file(struct ctdlroom *room);
+extern void remove_digest_file(struct ctdlroom *room);
#endif /* __CITADEL_DIRS_H */
return;
}
- strcpy(new_message_flags, "");
+ *new_message_flags = '\0';
if (num_parms >= 5) {
for (i=3; i<num_parms; ++i) {
strcat(new_message_flags, Params[i].Key);
/* We don't need this buffer anymore */
CM_Free(msg);
- if (new_message_flags != NULL) {
+ if (IsEmptyStr(new_message_flags)) {
imap_do_append_flags(new_msgnum, new_message_flags);
}
}
StrBuf *RoomInfo;
StrBuf *ListID;
FILE *digestfp;
+ int newDigest;
int num_msgs_spooled;
long lastsent;
recptypes *valid;
char bounce_to[256];
- if (sc->Users[listrecp] == NULL)
+ if (sc->Users[digestrecp] == NULL)
return;
if (sc->num_msgs_spooled < 1) {
fread(pbuf, (size_t)msglen, 1, sc->digestfp);
pbuf[msglen] = '\0';
CM_SetAsField(msg, eMesageText, &pbuf, msglen);
- fclose(sc->digestfp);
- sc->digestfp = NULL;
/* Now generate the delivery instructions */
- if (sc->Users[listrecp] == NULL)
+ if (sc->Users[digestrecp] == NULL)
return;
/* Where do we want bounces and other noise to be heard?
snprintf(bounce_to, sizeof bounce_to, "room_aide@%s", config.c_fqdn);
/* Now submit the message */
- valid = validate_recipients(ChrPtr(sc->Users[listrecp]), NULL, 0);
+ valid = validate_recipients(ChrPtr(sc->Users[digestrecp]), NULL, 0);
if (valid != NULL) {
valid->bounce_to = strdup(bounce_to);
valid->envelope_from = strdup(bounce_to);
FreeStrBuf(&RoomName);
}
+static time_t last_digest_delivery = 0;
/*
* Batch up and send all outbound traffic from the current room
/* If there are digest recipients, we have to build a digest */
if (sc->Users[digestrecp] != NULL) {
- sc->digestfp = tmpfile();
- fprintf(sc->digestfp, "Content-type: text/plain\n\n");
+
+ sc->digestfp = create_digest_file(&sc->room);
+ sc->newDigest = ftell(sc->digestfp) > 0;
+ if (sc->newDigest) {
+ fprintf(sc->digestfp, "Content-type: text/plain\n\n");
+ }
}
CalcListID(sc);
/* remember where we started... */
lastsent = sc->lastsent;
- /* Do something useful */
+ /* Fetch the messages we ought to send & prepare them. */
CtdlForEachMessage(MSGS_GT, sc->lastsent, NULL, NULL, NULL,
network_spool_msg, sc);
- /* If we wrote a digest, deliver it and then close it */
if (StrLength(sc->Users[roommailalias]) > 0)
{
long len;
buf[i] = tolower(buf[i]);
if (isspace(buf[i])) buf[i] = '_';
}
+
+
+ /* If we wrote a digest, deliver it and then close it */
if (sc->digestfp != NULL) {
- fprintf(sc->digestfp,
- " -----------------------------------"
- "------------------------------------"
- "-------\n"
- "You are subscribed to the '%s' "
- "list.\n"
- "To post to the list: %s\n",
- CCC->room.QRname, buf
- );
- network_deliver_digest(sc); /* deliver and close */
+ time_t now = time(NULL);
+ time_t secs_today = now % (24 * 60 * 60);
+ long delta = 0;
+
+ if (last_digest_delivery != 0) {
+ delta = now - last_digest_delivery;
+ delta = (24 * 60 * 60) - delta;
+ }
+
+ if ((secs_today < 300) &&
+ (delta < 300) )
+ {
+ last_digest_delivery = now;
+ fprintf(sc->digestfp,
+ " -----------------------------------"
+ "------------------------------------"
+ "-------\n"
+ "You are subscribed to the '%s' "
+ "list.\n"
+ "To post to the list: %s\n",
+ CCC->room.QRname, buf
+ );
+ network_deliver_digest(sc); /* deliver */
+ }
+ fclose(sc->digestfp);
+ sc->digestfp = NULL;
+ remove_digest_file(&sc->room);
}
/* Now rewrite the config file */
const XML_Char *systemId, const XML_Char *publicId,
const XML_Char *notationName
) {
+<<<<<<< HEAD
syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser.");
+=======
+ XMPPM_syslog(LOG_WARNING, "Illegal entity declaration encountered; stopping parser.");
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
XML_StopParser(XMPP->xp, XML_FALSE);
}
#endif
/*
* TLS encryption (but only if it isn't already active)
+<<<<<<< HEAD
*/
+=======
+ * /
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
#ifdef HAVE_OPENSSL
if (!CC->redirect_ssl) {
cprintf("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>");
}
#endif
+<<<<<<< HEAD
+=======
+ */
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
if (!CC->logged_in) {
/* If we're not logged in yet, offer SASL as our feature set */
xmpp_output_auth_mechs();
/* Offer binding and sessions as part of our feature set */
cprintf("<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"/>");
cprintf("<session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/>");
+<<<<<<< HEAD
cprintf("</stream:features>");
+=======
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
+ cprintf("</stream:features>");
+
+<<<<<<< HEAD
+
+=======
CC->is_async = 1; /* XMPP sessions are inherently async-capable */
}
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) {
char el[256];
char *sep = NULL;
strcpy(el, ++sep);
}
+<<<<<<< HEAD
#ifdef XMPP_DEBUG
syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el);
for (i=0; attr[i] != NULL; i+=2) {
syslog(LOG_DEBUG, " Attribute '%s' = '%s'\n", attr[i], attr[i+1]);
}
#endif /* XMPP_DEBUG */
+=======
+ /*
+ XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT START: <%s>\n", el);
+ for (i=0; attr[i] != NULL; i+=2) {
+ XMPP_syslog(LOG_DEBUG, " Attribute '%s' = '%s'\n", attr[i], attr[i+1]);
+ }
+ uncomment for more verbosity */
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
if (!strcasecmp(el, "stream")) {
xmpp_stream_start(data, supplied_el, attr);
else if (!strcasecmp(el, "query")) {
XMPP->iq_query_xmlns[0] = 0;
safestrncpy(XMPP->iq_query_xmlns, supplied_el, sizeof XMPP->iq_query_xmlns);
+<<<<<<< HEAD
+ }
+
+ else if (!strcasecmp(el, "bind")) {
+ XMPP->bind_requested = 1;
+ }
+
+ else if (!strcasecmp(el, "iq")) {
+ for (i=0; attr[i] != NULL; i+=2) {
+ if (!strcasecmp(attr[i], "type")) {
+ safestrncpy(XMPP->iq_type, attr[i+1], sizeof XMPP->iq_type);
+ }
+ else if (!strcasecmp(attr[i], "id")) {
+ safestrncpy(XMPP->iq_id, attr[i+1], sizeof XMPP->iq_id);
+ }
+ else if (!strcasecmp(attr[i], "from")) {
+ safestrncpy(XMPP->iq_from, attr[i+1], sizeof XMPP->iq_from);
+ }
+ else if (!strcasecmp(attr[i], "to")) {
+ safestrncpy(XMPP->iq_to, attr[i+1], sizeof XMPP->iq_to);
+ }
+ }
+ }
+
+ else if (!strcasecmp(el, "auth")) {
+ XMPP->sasl_auth_mech[0] = 0;
+ for (i=0; attr[i] != NULL; i+=2) {
+ if (!strcasecmp(attr[i], "mechanism")) {
+ safestrncpy(XMPP->sasl_auth_mech, attr[i+1], sizeof XMPP->sasl_auth_mech);
+ }
+ }
+ }
+
+ else if (!strcasecmp(el, "message")) {
+ for (i=0; attr[i] != NULL; i+=2) {
+ if (!strcasecmp(attr[i], "to")) {
+ safestrncpy(XMPP->message_to, attr[i+1], sizeof XMPP->message_to);
+ }
+ }
+=======
}
else if (!strcasecmp(el, "bind")) {
+void xmpp_xml_end(void *data, const char *supplied_el) {
+ char el[256];
+ char *sep = NULL;
+ char xmlbuf[256];
+
+ /* Axe the namespace, we don't care about it */
+ safestrncpy(el, supplied_el, sizeof el);
+ while (sep = strchr(el, ':'), sep) {
+ strcpy(el, ++sep);
+ }
+
+ /*
+ XMPP_syslog(LOG_DEBUG, "XMPP ELEMENT END : <%s>\n", el);
+ if (XMPP->chardata_len > 0) {
+ XMPP_syslog(LOG_DEBUG, " chardata: %s\n", XMPP->chardata);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
+ }
+
+<<<<<<< HEAD
+ else if (!strcasecmp(el, "html")) {
+ ++XMPP->html_tag_level;
+ }
+}
+
+
+
void xmpp_xml_end(void *data, const char *supplied_el) {
char el[256];
char *sep = NULL;
else if (!strcasecmp(el, "iq")) {
+=======
+ if (!strcasecmp(el, "resource")) {
+ if (XMPP->chardata_len > 0) {
+ safestrncpy(XMPP->iq_client_resource, XMPP->chardata,
+ sizeof XMPP->iq_client_resource);
+ striplt(XMPP->iq_client_resource);
+ }
+ }
+
+ else if (!strcasecmp(el, "username")) { /* NON SASL ONLY */
+ if (XMPP->chardata_len > 0) {
+ safestrncpy(XMPP->iq_client_username, XMPP->chardata,
+ sizeof XMPP->iq_client_username);
+ striplt(XMPP->iq_client_username);
+ }
+ }
+
+ else if (!strcasecmp(el, "password")) { /* NON SASL ONLY */
+ if (XMPP->chardata_len > 0) {
+ safestrncpy(XMPP->iq_client_password, XMPP->chardata,
+ sizeof XMPP->iq_client_password);
+ striplt(XMPP->iq_client_password);
+ }
+ }
+
+ else if (!strcasecmp(el, "iq")) {
+
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
/*
* iq type="get" (handle queries)
*/
* Unknown query ... return the XML equivalent of a blank stare
*/
else {
+<<<<<<< HEAD
syslog(LOG_DEBUG,
+=======
+ XMPP_syslog(LOG_DEBUG,
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
"Unknown query <%s> - returning <service-unavailable/>\n",
el
);
else if (!strcasecmp(el, "ping")) {
XMPP->ping_requested = 1;
+<<<<<<< HEAD
}
else if (!strcasecmp(el, "stream")) {
else {
syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el);
+=======
+ }
+
+ else if (!strcasecmp(el, "stream")) {
+ XMPPM_syslog(LOG_DEBUG, "XMPP client shut down their stream\n");
+ xmpp_massacre_roster();
+ cprintf("</stream>\n");
+ CC->kill_me = KILLME_CLIENT_LOGGED_OUT;
+ }
+
+ else {
+ XMPP_syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
}
XMPP->chardata_len = 0;
{
char xmlbuf[256];
+<<<<<<< HEAD
syslog(LOG_DEBUG, "XMPP: indicating presence of <%s> to <%s>", presence_jid, XMPP->client_jid);
+=======
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
cprintf("<presence from=\"%s\" ", xmlesc(xmlbuf, presence_jid, sizeof xmlbuf));
cprintf("to=\"%s\"></presence>", xmlesc(xmlbuf, XMPP->client_jid, sizeof xmlbuf));
}
* Client is doing a namespace query. These are all handled differently.
* A "rumplestiltskin lookup" is the most efficient way to handle this. Please do not refactor this code.
*/
+<<<<<<< HEAD
+=======
+
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns)
{
int supported_namespace = 0;
supported_namespace = 1;
}
+<<<<<<< HEAD
syslog(LOG_DEBUG, "xmpp_query_namespace(id=%s, from=%s, to=%s, xmlns=%s)\n", iq_id, iq_from, iq_to, query_xmlns);
+=======
+ XMPP_syslog(LOG_DEBUG, "xmpp_query_namespace(%s, %s, %s, %s)\n", iq_id, iq_from, iq_to, query_xmlns);
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
/*
* Beginning of query result.
}
else {
cprintf("<iq type=\"error\" ");
+<<<<<<< HEAD
+ }
+ if (!IsEmptyStr(iq_from)) {
+ cprintf("to=\"%s\" ", xmlesc(xmlbuf, iq_from, sizeof xmlbuf));
+ }
+=======
}
if (!IsEmptyStr(iq_from)) {
cprintf("to=\"%s\" ", xmlesc(xmlbuf, iq_from, sizeof xmlbuf));
}
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
cprintf("id=\"%s\">", xmlesc(xmlbuf, iq_id, sizeof xmlbuf));
/*
*/
else {
+<<<<<<< HEAD
syslog(LOG_DEBUG, "Unknown query namespace '%s' - returning <service-unavailable/>\n", query_xmlns);
+=======
+ XMPP_syslog(LOG_DEBUG,
+ "Unknown query namespace '%s' - returning <service-unavailable/>\n",
+ query_xmlns
+ );
+>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498
cprintf("<error code=\"503\" type=\"cancel\">"
"<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
"</error>"
char ctdl_spool_dir[PATH_MAX]="network";
char ctdl_netout_dir[PATH_MAX]="network/spoolout";
char ctdl_netin_dir[PATH_MAX]="network/spoolin";
+char ctdl_netdigest_dir[PATH_MAX]="network/digest";
char ctdl_nettmp_dir[PATH_MAX]="network/spooltmp";
char ctdl_netcfg_dir[PATH_MAX]="netconfigs";
char ctdl_utilbin_dir[PATH_MAX]="";
COMPUTE_DIRECTORY(ctdl_spool_dir);
COMPUTE_DIRECTORY(ctdl_netout_dir);
COMPUTE_DIRECTORY(ctdl_netin_dir);
+ COMPUTE_DIRECTORY(ctdl_netdigest_dir);
COMPUTE_DIRECTORY(ctdl_nettmp_dir);
StripSlashes(ctdl_spool_dir, 1);
StripSlashes(ctdl_netout_dir, 1);
StripSlashes(ctdl_netin_dir, 1);
+ StripSlashes(ctdl_netdigest_dir, 1);
StripSlashes(ctdl_nettmp_dir, 1);
/* ok, now we know the dirs, calc some commonly used files */
DBG_PRINT(ctdl_spool_dir);
DBG_PRINT(ctdl_netout_dir);
DBG_PRINT(ctdl_netin_dir);
+ DBG_PRINT(ctdl_netdigest_dir);
DBG_PRINT(ctdl_nettmp_dir);
DBG_PRINT(ctdl_netcfg_dir);
DBG_PRINT(ctdl_bbsbase_dir);
return snprintf(buf, n, "%s%ld", prefix, qrbuf->QRnumber);
}
+void remove_digest_file(struct ctdlroom *room)
+{
+ char buf[PATH_MAX];
+
+ snprintf(buf, PATH_MAX, "%s/%ld.eml",
+ ctdl_netdigest_dir,
+ room->QRnumber);
+ StripSlashes(buf, 0);
+ fprintf(stderr, "----> %s \n", buf);
+ unlink(buf);
+}
+
+FILE *create_digest_file(struct ctdlroom *room)
+{
+ char buf[PATH_MAX];
+ FILE *fp;
+
+ snprintf(buf, PATH_MAX, "%s/%ld.eml",
+ ctdl_netdigest_dir,
+ room->QRnumber);
+ StripSlashes(buf, 0);
+ fprintf(stderr, "----> %s \n", buf);
+
+ fp = fopen(buf, "w+");
+ if (fp == NULL) {
+
+ }
+ return fp;
+}
+
int create_dir(char *which, long ACCESS, long UID, long GID)
{
rv = create_dir(ctdl_info_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_bio_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_bio_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ if (rv != -1)
+ rv = create_dir(ctdl_usrpic_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ if (rv != -1)
+ rv = create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ if (rv != -1)
+ rv = create_dir(ctdl_hlp_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ if (rv != -1)
+ rv = create_dir(ctdl_image_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ if (rv != -1)
+ rv = create_dir(ctdl_bb_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_usrpic_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_file_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_message_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_netcfg_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_hlp_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_spool_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_image_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_netout_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_bb_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_netin_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_file_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_netdigest_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_netcfg_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_nettmp_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_key_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
+ rv = create_dir(ctdl_key_dir , S_IRUSR|S_IWUSR|S_IXUSR, UID, -1);
if (rv != -1)
- rv = create_dir(ctdl_run_dir , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
+ rv = create_dir(ctdl_run_dir , S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, UID, GID);
return rv;
}