whobbs.c sendcommand.c mime_parser.c base64.c qpdecode.c getutline.c \
auth.c chkpwd.c client_icq.c html.c vcard.c serv_upgrade.c \
serv_smtp.c serv_pop3.c internet_addressing.c parsedate.c genstamp.c \
- domain.c clientsocket.c serv_inetcfg.c serv_rwho.c ignet.c
+ domain.c clientsocket.c serv_inetcfg.c serv_rwho.c
DEP_FILES=$(SOURCES:.c=.d)
msgbase.ro config.ro sysdep.ro locate_host.ro housekeeping.ro \
database.ro control.ro logging.ro policy.ro dynloader.ro tools.ro \
mime_parser.ro html.ro internet_addressing.ro \
- parsedate.ro genstamp.ro clientsocket.ro ignet.ro \
+ parsedate.ro genstamp.ro clientsocket.ro \
$(AUTH) $(LIBOBJS:.o=.ro)
citserver: $(SERV_OBJS)
+++ /dev/null
-/*
- * $Id$
- *
- */
-
-#include "sysdep.h"
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <signal.h>
-#include <pwd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <string.h>
-#include <limits.h>
-#include "citadel.h"
-#include "server.h"
-#include <time.h>
-#include "sysdep_decls.h"
-#include "citserver.h"
-#include "support.h"
-#include "config.h"
-#include "tools.h"
-#include "msgbase.h"
-#include "internet_addressing.h"
-#include "ignet.h"
-#include "user_ops.h"
-#include "room_ops.h"
-#include "parsedate.h"
-
-
-
-/*
- * Returns nonzero if the specified nodename is on the Citadel network
- */
-
-int is_ignet(char *node) {
- char filename[256];
-
- /* First, check to see if the specified node is a neighbor */
- sprintf(filename, "./network/systems/%s", node);
- if (!access(filename, F_OK)) return(1);
-
- /* If not, see if it's a non-neighbor node */
- /* FIXME add this */
-
- /* Nope */
- return 0;
-
-}
-
-
-int ignet_spool_to(char *node, long msgnum) {
-
- return 1; /* FIXME */
-
-}
-
-
-
-
-
char buf[256];
int passes = 0;
char sourcealias[1024];
+ int msgtype = 0;
safestrncpy(sourcealias, source, sizeof(sourcealias) );
* a few times, in case we accidentally hit an alias loop
*/
strcpy(sourcealias, user);
- alias(user);
+ msgtype = alias(user);
+ lprintf(9, "msgtype for <%s> is %d\n", msgtype, user);
if ( (strcasecmp(user, sourcealias)) && (++passes < 3) )
goto REALIAS;
strcpy(destuser, user);
strcpy(desthost, node);
- return(rfc822_address_invalid); /* unknown error */
+ if (msgtype == MES_BINARY) return(rfc822_address_on_citadel_network);
+ return(rfc822_address_nonlocal);
}
while (bbb[strlen(bbb) - 1] == '_')
bbb[strlen(bbb) - 1] = 0;
sprintf(name, &aaa[4], bbb);
+ lprintf(9, "returning MES_INTERNET\n");
return (MES_INTERNET);
}
if (!strncmp(aaa, "bin", 3)) {
while (bbb[0] == ' ')
strcpy(bbb, &bbb[1]);
sprintf(name, "%s @%s", aaa, bbb);
+ lprintf(9, "returning MES_BINARY\n");
return (MES_BINARY);
}
return (MES_ERROR);
}
+ lprintf(9, "returning MES_LOCAL\n");
return (MES_LOCAL);
}
#include "msgbase.h"
#include "tools.h"
#include "internet_addressing.h"
-#include "ignet.h"
#include "genstamp.h"
#include "domain.h"
#include "clientsocket.h"
cvt = convert_internet_address(user, node, recp);
sprintf(recp, "%s@%s", user, node);
+ lprintf(9, "cvt=%d, citaddr=<%s@%s>\n", cvt, user, node);
switch(cvt) {
case rfc822_address_locally_validated:
cprintf("550 %s: no such user\r\n", recp);
return;
- case rfc822_address_invalid:
+ case rfc822_address_on_citadel_network:
+ cprintf("250 %s is on the local network\r\n", recp);
+ ++SMTP->number_of_recipients;
+ CtdlReallocUserData(SYM_SMTP_RECP,
+ strlen(SMTP_RECP) + 1024 );
+ strcat(SMTP_RECP, "ignet|");
+ strcat(SMTP_RECP, user);
+ strcat(SMTP_RECP, "|");
+ strcat(SMTP_RECP, node);
+ strcat(SMTP_RECP, "|0|\n");
+ return;
+
+ case rfc822_address_nonlocal:
if (is_spam) {
cprintf("551 Away with thee, spammer!\r\n");
}
+/*
+ * Send a message out through the local network
+ * (This is kind of ugly. IGnet should be done using clean server-to-server
+ * code instead of the old style spool.)
+ */
+void smtp_deliver_ignet(struct CtdlMessage *msg, char *user, char *room) {
+ struct ser_ret smr;
+ char *hold_R, *hold_D;
+ FILE *fp;
+
+ hold_R = msg->cm_fields['R'];
+ hold_D = msg->cm_fields['D'];
+ msg->cm_fields['R'] = user;
+ msg->cm_fields['D'] = room;
+
+ serialize_message(&smr, msg);
+
+ msg->cm_fields['R'] = hold_R;
+ msg->cm_fields['D'] = hold_D;
+
+ if (smr.len != 0) {
+ fp = fopen(tmpnam("./network/spoolin/"), "wb");
+ if (fp != NULL) {
+ fwrite(smr.ser, smr.len, 1, fp);
+ fclose(fp);
+ }
+ phree(smr.ser);
+ }
+
+}
+
/*
++successful_saves;
}
+ /* Delivery over the local Citadel network (IGnet) */
+ if (!strcasecmp(dtype, "ignet")) {
+ smtp_deliver_ignet(msg, user, room);
+ }
+
/* Remote delivery */
if (!strcasecmp(dtype, "remote")) {
extract(user, buf, 1);
/* Parse out the host portion of the recipient address */
process_rfc822_addr(addr, user, node, name);
- if (is_ignet(node)) {
- if (ignet_spool_to(node, msgnum) == 0) {
- strcpy(dsn, "Delivery via Citadel network successful");
- *status = 2;
- }
- else {
- strcpy(dsn, "Delivery via Citadel network failed");
- *status = 5;
- }
- return;
- }
-
lprintf(9, "Attempting SMTP delivery to <%s> @ <%s> (%s)\n",
user, node, name);