4f6f53bd0b8647b7bf19ae075dcfd314d2e25526
[citadel.git] / citadel / serv_netfilter.c
1 /*
2  * $Id$
3  * 
4  * A server-side module for Citadel designed to filter idiots off the network.
5  * 
6  * Copyright (c) 2002 / released under the GNU General Public License
7  */
8
9 #include "sysdep.h"
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <stdio.h>
13 #include <fcntl.h>
14 #include <signal.h>
15 #include <pwd.h>
16 #include <errno.h>
17 #include <sys/types.h>
18
19 #if TIME_WITH_SYS_TIME
20 # include <sys/time.h>
21 # include <time.h>
22 #else
23 # if HAVE_SYS_TIME_H
24 #  include <sys/time.h>
25 # else
26 #  include <time.h>
27 # endif
28 #endif
29
30 #include <sys/wait.h>
31 #include <string.h>
32 #include <limits.h>
33 #include "citadel.h"
34 #include "server.h"
35 #include "sysdep_decls.h"
36 #include "citserver.h"
37 #include "support.h"
38 #include "config.h"
39 #include "control.h"
40 #include "serv_extensions.h"
41 #include "room_ops.h"
42 #include "user_ops.h"
43 #include "policy.h"
44 #include "database.h"
45 #include "msgbase.h"
46 #include "serv_network.h"
47 #include "tools.h"
48
49 /*
50  * This handler detects whether an incoming network message is from some
51  * moron user who the site operator has elected to filter out.  If a match
52  * is found, the message is rejected.
53  */
54 int filter_the_idiots(struct CtdlMessage *msg, char *target_room) {
55         struct FilterList *fptr;
56         int zap_user = 0;
57         int zap_room = 0;
58         int zap_node = 0;
59
60         if ( (msg == NULL) || (filterlist == NULL) ) {
61                 return(0);
62         }
63
64         for (fptr = filterlist; fptr != NULL; fptr = fptr->next) {
65
66                 zap_user = 0;
67                 zap_room = 0;
68                 zap_node = 0;
69
70                 if (msg->cm_fields['A'] != NULL) {
71                         if ( (!strcasecmp(msg->cm_fields['A'], fptr->fl_user))
72                            || (fptr->fl_user[0] == 0) ) {
73                                 zap_user = 1;
74                         }
75                 }
76
77                 if (msg->cm_fields['C'] != NULL) {
78                         if ( (!strcasecmp(msg->cm_fields['C'], fptr->fl_room))
79                            || (fptr->fl_room[0] == 0) ) {
80                                 zap_room = 1;
81                         }
82                 }
83
84                 if (msg->cm_fields['O'] != NULL) {
85                         if ( (!strcasecmp(msg->cm_fields['O'], fptr->fl_room))
86                            || (fptr->fl_room[0] == 0) ) {
87                                 zap_room = 1;
88                         }
89                 }
90
91                 if (msg->cm_fields['N'] != NULL) {
92                         if ( (!strcasecmp(msg->cm_fields['N'], fptr->fl_node))
93                            || (fptr->fl_node[0] == 0) ) {
94                                 zap_node = 1;
95                         }
96                 }
97         
98                 if (zap_user + zap_room + zap_node == 3) return(1);
99
100         }
101
102         return(0);
103 }
104
105
106 char *serv_netfilter_init(void)
107 {
108         CtdlRegisterNetprocHook(filter_the_idiots);
109
110         /* return our Subversion id for the Log */
111         return "$Id$";
112 }