$Log$
+ Revision 590.81 2002/01/23 03:39:32 ajc
+ * Added a new hook type for handling incoming network messages
+ * Wrote a skeleton module for net filtering
+
Revision 590.80 2002/01/22 10:46:25 error
* read_message() and fmout() now accept a FILE to which to send their
output; this fixes quoting in the fullscreen client
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
-
modules/libpop3.la \
modules/libimap.la \
modules/libnetwork.la \
+ modules/libnetfilter.la \
modules/libpas2.la \
modules/libinetcfg.la \
modules/librwho.la \
auth.c chkpwd.c html.c vcard.c serv_upgrade.c serv_vandelay.c \
serv_smtp.c serv_pop3.c internet_addressing.c parsedate.c genstamp.c \
$(DOMAIN) clientsocket.c serv_inetcfg.c serv_rwho.c serv_bio.c \
- serv_moderate.c client_passwords.c imap_misc.c \
+ serv_moderate.c client_passwords.c imap_misc.c serv_netfilter.c \
serv_imap.c imap_tools.c imap_fetch.c imap_search.c imap_store.c \
serv_network.c serv_pas2.c serv_ical.c md5.c server_main.c
modules/libnetwork.la: serv_network.lo $(LIBTOOL) libcitserver.la
$(LTSHARE) -o libnetwork.la ../serv_network.lo ../libcitserver.la
+modules/libnetfilter.la: serv_netfilter.lo $(LIBTOOL) libcitserver.la
+ $(LTSHARE) -o libnetfilter.la ../serv_netfilter.lo ../libcitserver.la
+
modules/libupgrade.la: serv_upgrade.lo $(LIBTOOL) libcitserver.la
$(LTSHARE) -o libupgrade.la ../serv_upgrade.lo ../libcitserver.la
struct UserFunctionHook *UserHookTable = NULL;
struct XmsgFunctionHook *XmsgHookTable = NULL;
struct MessageFunctionHook *MessageHookTable = NULL;
+struct NetprocFunctionHook *NetprocHookTable = NULL;
struct ServiceFunctionHook *ServiceHookTable = NULL;
struct ProtoFunctionHook {
}
+void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *) )
+{
+ struct NetprocFunctionHook *newfcn;
+
+ newfcn = (struct NetprocFunctionHook *)
+ mallok(sizeof(struct NetprocFunctionHook));
+ newfcn->next = NetprocHookTable;
+ newfcn->h_function_pointer = handler;
+ NetprocHookTable = newfcn;
+
+ lprintf(5, "Registered a new netproc function\n");
+}
+
+
+void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *) )
+{
+ struct NetprocFunctionHook *cur, *p;
+
+ for (cur = NetprocHookTable; cur != NULL; cur = cur->next) {
+ /* This will also remove duplicates if any */
+ while (cur != NULL &&
+ handler == cur->h_function_pointer ) {
+ lprintf(5, "Unregistered netproc function\n");
+ p = cur->next;
+ if (cur == NetprocHookTable) {
+ NetprocHookTable = p;
+ }
+ phree(cur);
+ cur = p;
+ }
+ }
+}
+
+
void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *), int order)
{
+int PerformNetprocHooks(struct CtdlMessage *msg)
+{
+ struct NetprocFunctionHook *fcn;
+ int total_retval = 0;
+
+ for (fcn = NetprocHookTable; fcn != NULL; fcn = fcn->next) {
+ total_retval = total_retval +
+ (*fcn->h_function_pointer) (msg);
+ }
+
+ /* Return the sum of the return codes from the hook functions.
+ * A nonzero return code will cause the message to *not* be imported.
+ */
+ return total_retval;
+}
+
+
+
int PerformXmsgHooks(char *sender, char *recp, char *msg)
{
struct XmsgFunctionHook *fcn;
void CtdlUnregisterLogHook(void (*fcn_ptr)(char *), int loglevel);
void PerformLogHooks(int loglevel, char *logmsg);
-
void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType);
void CtdlUnregisterSessionHook(void (*fcn_ptr)(void), int EventType);
void PerformSessionHooks(int EventType);
void CtdlUnregisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
int PerformXmsgHooks(char *, char *, char *);
-void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *), int EventType);
-void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *), int EventType);
+
+void CtdlRegisterMessageHook(int (*handler)(struct CtdlMessage *),
+ int EventType);
+void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
+ int EventType);
int PerformMessageHooks(struct CtdlMessage *, int EventType);
+
+void CtdlRegisterNetprocHook(int (*handler)(struct CtdlMessage *) );
+void CtdlUnregisterNetprocHook(int (*handler)(struct CtdlMessage *) );
+int PerformNetprocHooks(struct CtdlMessage *);
+
+
void CtdlRegisterCleanupHook(void (*fcn_ptr)(void));
void CtdlUnregisterCleanupHook(void (*fcn_ptr)(void));
void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
}
/* save the message into a room */
- msg->cm_flags = CM_SKIP_HOOKS;
- CtdlSubmitMsg(msg, recp, target_room);
+ if (PerformNetprocHooks(msg) == 0) {
+ msg->cm_flags = CM_SKIP_HOOKS;
+ CtdlSubmitMsg(msg, recp, target_room);
+ }
CtdlFreeMessage(msg);
phree(recp);
}
#define EVT_AFTERSAVE 202
+
+/*
+ * NetprocFunctionHook extensions are used for hooks which implement handlers
+ * for incoming network messages.
+ */
+struct NetprocFunctionHook {
+ struct NetprocFunctionHook *next;
+ int (*h_function_pointer) (struct CtdlMessage *msg);
+};
+extern DLEXP struct NetprocFunctionHook *NetprocHookTable;
+
+
+
/*
* ExpressMessageFunctionHook extensions are used for hooks which implement
* the sending of an express message through various channels. Any function