From: Art Cancro Date: Wed, 31 Dec 2014 15:26:45 +0000 (-0500) Subject: Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel X-Git-Tag: v9.01~57^2~1 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=73bcf6081a14008eb1020126273f133a324bb910;hp=d12e2c1685d3754601d4015c486f6aeb2b22795e Merge branch 'master' of ssh://git.citadel.org/appl/gitroot/citadel Conflicts: citadel/modules/xmpp/serv_xmpp.c citadel/modules/xmpp/xmpp_presence.c citadel/modules/xmpp/xmpp_query_namespace.c --- diff --git a/citadel/include/citadel_dirs.h b/citadel/include/citadel_dirs.h index 3a0b6d86e..407c1dee0 100644 --- a/citadel/include/citadel_dirs.h +++ b/citadel/include/citadel_dirs.h @@ -26,6 +26,7 @@ extern char ctdl_run_dir[PATH_MAX]; 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]; @@ -68,4 +69,6 @@ extern size_t assoc_file_name(char *buf, 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 */ diff --git a/citadel/modules/imap/imap_misc.c b/citadel/modules/imap/imap_misc.c index 5b501e4e7..f4d501c9d 100644 --- a/citadel/modules/imap/imap_misc.c +++ b/citadel/modules/imap/imap_misc.c @@ -306,7 +306,7 @@ void imap_append(int num_parms, ConstStr *Params) { return; } - strcpy(new_message_flags, ""); + *new_message_flags = '\0'; if (num_parms >= 5) { for (i=3; iUsers[listrecp] == NULL) + if (sc->Users[digestrecp] == NULL) return; if (sc->num_msgs_spooled < 1) { @@ -219,11 +219,9 @@ void network_deliver_digest(SpoolControl *sc) 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? @@ -231,7 +229,7 @@ void network_deliver_digest(SpoolControl *sc) 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); diff --git a/citadel/modules/network/serv_netspool.c b/citadel/modules/network/serv_netspool.c index 714bb0471..15f309972 100644 --- a/citadel/modules/network/serv_netspool.c +++ b/citadel/modules/network/serv_netspool.c @@ -332,6 +332,7 @@ void CalcListID(SpoolControl *sc) FreeStrBuf(&RoomName); } +static time_t last_digest_delivery = 0; /* * Batch up and send all outbound traffic from the current room @@ -354,8 +355,12 @@ void network_spoolout_room(SpoolControl *sc) /* 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); @@ -363,11 +368,10 @@ void network_spoolout_room(SpoolControl *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; @@ -387,17 +391,37 @@ void network_spoolout_room(SpoolControl *sc) 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 */ diff --git a/citadel/modules/xmpp/serv_xmpp.c b/citadel/modules/xmpp/serv_xmpp.c index ea4adc48b..126385129 100644 --- a/citadel/modules/xmpp/serv_xmpp.c +++ b/citadel/modules/xmpp/serv_xmpp.c @@ -79,7 +79,11 @@ static void xmpp_entity_declaration(void *userData, const XML_Char *entityName, 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 @@ -211,13 +215,21 @@ void xmpp_stream_start(void *data, const char *supplied_el, const char **attr) /* * TLS encryption (but only if it isn't already active) +<<<<<<< HEAD */ +======= + * / +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 #ifdef HAVE_OPENSSL if (!CC->redirect_ssl) { cprintf(""); } #endif +<<<<<<< HEAD +======= + */ +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 if (!CC->logged_in) { /* If we're not logged in yet, offer SASL as our feature set */ xmpp_output_auth_mechs(); @@ -229,13 +241,22 @@ void xmpp_stream_start(void *data, const char *supplied_el, const char **attr) /* Offer binding and sessions as part of our feature set */ cprintf(""); cprintf(""); +<<<<<<< HEAD cprintf(""); +======= +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 + cprintf(""); + +<<<<<<< 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; @@ -247,12 +268,21 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) { 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); @@ -261,6 +291,46 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **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")) { @@ -308,6 +378,32 @@ void xmpp_xml_start(void *data, const char *supplied_el, const char **attr) { +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; @@ -352,6 +448,34 @@ void xmpp_xml_end(void *data, const char *supplied_el) { 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) */ @@ -383,7 +507,11 @@ void xmpp_xml_end(void *data, const char *supplied_el) { * Unknown query ... return the XML equivalent of a blank stare */ else { +<<<<<<< HEAD syslog(LOG_DEBUG, +======= + XMPP_syslog(LOG_DEBUG, +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 "Unknown query <%s> - returning \n", el ); @@ -515,6 +643,7 @@ void xmpp_xml_end(void *data, const char *supplied_el) { else if (!strcasecmp(el, "ping")) { XMPP->ping_requested = 1; +<<<<<<< HEAD } else if (!strcasecmp(el, "stream")) { @@ -530,6 +659,19 @@ void xmpp_xml_end(void *data, const char *supplied_el) { 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("\n"); + CC->kill_me = KILLME_CLIENT_LOGGED_OUT; + } + + else { + XMPP_syslog(LOG_DEBUG, "Ignoring unknown tag <%s>\n", el); +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 } XMPP->chardata_len = 0; diff --git a/citadel/modules/xmpp/xmpp_presence.c b/citadel/modules/xmpp/xmpp_presence.c index ebdfd152a..4c2d50ade 100644 --- a/citadel/modules/xmpp/xmpp_presence.c +++ b/citadel/modules/xmpp/xmpp_presence.c @@ -67,7 +67,10 @@ void xmpp_indicate_presence(char *presence_jid) { char xmlbuf[256]; +<<<<<<< HEAD syslog(LOG_DEBUG, "XMPP: indicating presence of <%s> to <%s>", presence_jid, XMPP->client_jid); +======= +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("", xmlesc(xmlbuf, XMPP->client_jid, sizeof xmlbuf)); } diff --git a/citadel/modules/xmpp/xmpp_query_namespace.c b/citadel/modules/xmpp/xmpp_query_namespace.c index 39b3979ac..fb3374e9e 100644 --- a/citadel/modules/xmpp/xmpp_query_namespace.c +++ b/citadel/modules/xmpp/xmpp_query_namespace.c @@ -98,6 +98,10 @@ void xmpp_iq_roster_query(void) * 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; @@ -117,7 +121,11 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x 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. @@ -127,10 +135,17 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x } else { cprintf(">>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("id=\"%s\">", xmlesc(xmlbuf, iq_id, sizeof xmlbuf)); /* @@ -165,7 +180,14 @@ void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_x */ else { +<<<<<<< HEAD syslog(LOG_DEBUG, "Unknown query namespace '%s' - returning \n", query_xmlns); +======= + XMPP_syslog(LOG_DEBUG, + "Unknown query namespace '%s' - returning \n", + query_xmlns + ); +>>>>>>> 1c0b8162b0a90f2e97028a531005c11b09441498 cprintf("" "" "" diff --git a/citadel/utillib/citadel_dirs.c b/citadel/utillib/citadel_dirs.c index 17115df40..3b0afc1b6 100644 --- a/citadel/utillib/citadel_dirs.c +++ b/citadel/utillib/citadel_dirs.c @@ -44,6 +44,7 @@ char ctdl_run_dir[PATH_MAX]=""; 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]=""; @@ -194,11 +195,13 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, 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 */ @@ -330,6 +333,7 @@ void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, 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); @@ -364,6 +368,36 @@ size_t assoc_file_name(char *buf, size_t n, 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) { @@ -384,24 +418,34 @@ int create_run_directories(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; }