]> code.citadel.org Git - citadel.git/commitdiff
* Added a new hook type for handling incoming network messages
authorArt Cancro <ajc@citadel.org>
Wed, 23 Jan 2002 03:39:33 +0000 (03:39 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 23 Jan 2002 03:39:33 +0000 (03:39 +0000)
* Wrote a skeleton module for net filtering

citadel/ChangeLog
citadel/Makefile.in
citadel/dynloader.c
citadel/dynloader.h
citadel/serv_network.c
citadel/server.h

index a31a5952bb7b328452b02d6811a7d832ffefb56e..2118d434132fe0749427eca16e8a69a930b507b8 100644 (file)
@@ -1,4 +1,8 @@
  $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
@@ -3216,4 +3220,3 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import 
-
index f6bf6be2e5708c82718bbff9a829e94b1eff9f1d..accb014dc35d92c8bcb3c217887b7e14defbdc20 100644 (file)
@@ -32,6 +32,7 @@ SERV_MODULES=modules/libchat.la modules/libvcard.la \
        modules/libpop3.la \
        modules/libimap.la \
        modules/libnetwork.la \
+       modules/libnetfilter.la \
        modules/libpas2.la \
        modules/libinetcfg.la \
        modules/librwho.la \
@@ -94,7 +95,7 @@ SOURCES=aidepost.c citadel.c citmail.c citserver.c client_chat.c \
        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
 
@@ -187,6 +188,9 @@ modules/libvandelay.la: serv_vandelay.lo $(LIBTOOL) libcitserver.la
 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
 
index 15c8ef7de4a2361c3cffd7c6738ce07fff425bdc..4d41571ca463d7d8d77106d75bf0680987b692eb 100644 (file)
@@ -46,6 +46,7 @@ struct SessionFunctionHook *SessionHookTable = NULL;
 struct UserFunctionHook *UserHookTable = NULL;
 struct XmsgFunctionHook *XmsgHookTable = NULL;
 struct MessageFunctionHook *MessageHookTable = NULL;
+struct NetprocFunctionHook *NetprocHookTable = NULL;
 struct ServiceFunctionHook *ServiceHookTable = NULL;
 
 struct ProtoFunctionHook {
@@ -363,6 +364,40 @@ void CtdlUnregisterMessageHook(int (*handler)(struct CtdlMessage *),
 }
 
 
+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)
 {
 
@@ -543,6 +578,24 @@ int PerformMessageHooks(struct CtdlMessage *msg, int EventType)
 
 
 
+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;
index dc32a01708fbe14bf2a1c90fcfe09e8de177d821..bf9efa75817a7a238bf15bc6cc9381f87606d757 100644 (file)
@@ -13,7 +13,6 @@ void CtdlRegisterLogHook(void (*fcn_ptr)(char *), int loglevel);
 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);
@@ -26,10 +25,19 @@ void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *), int order);
 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);
index 02f3ad23246dcfcb98a1ea623d8dc7d68e93596d..40ad10dba18d713cda79d8ef97b80bae0ecea37b 100644 (file)
@@ -968,8 +968,10 @@ void network_process_buffer(char *buffer, long size) {
        }
 
        /* 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);
 }
index 86fcf4e386d86e409e1236fc6eb8e91c97259957..4909239860b2e45d418866d3dae1ec225fdc90c1 100644 (file)
@@ -335,6 +335,19 @@ extern DLEXP struct MessageFunctionHook *MessageHookTable;
 #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