[srvx-commits] CVS: services/src opserv.c,1.238,1.239
Brought to you by:
entrope
|
From: Entrope <en...@us...> - 2002-07-03 02:52:14
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv1800/src
Modified Files:
opserv.c
Log Message:
make list of bad-word-exempt channels global instead of per bad-word
Index: opserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/opserv.c,v
retrieving revision 1.238
retrieving revision 1.239
diff -C2 -r1.238 -r1.239
*** opserv.c 2 Jul 2002 01:25:02 -0000 1.238
--- opserv.c 3 Jul 2002 02:52:10 -0000 1.239
***************
*** 87,90 ****
--- 87,91 ----
#define KEY_PERSISTENT "persistent"
#define KEY_BAD_WORDS "bad"
+ #define KEY_EXEMPT_CHANNELS "exempt"
#define KEY_SECRET_WORDS "secret"
#define KEY_TRUSTED_HOSTS "trusted"
***************
*** 164,171 ****
#define OSMSG_COMMAND_ENABLED "Command $b%s$b is now enabled."
#define OSMSG_BAD_MODIFIER "Unknown bad-word modifier $b%s$b."
#define OSMSG_ADDED_BAD "Added $b%s$b to the bad-word list."
- #define OSMSG_ADDED_BAD_EXCEPTIONS "Added %d exception(s) to the bad word $b%s$b."
#define OSMSG_REMOVED_BAD "Removed $b%s$b from the bad-word list."
! #define OSMSG_NOT_BAD_WORD "$b%s$b isn't a bad word."
#define OSMSG_ALREADY_TRUSTED "Host $b%s$b is already trusted (use $bdeltrust$b and then $baddtrust$b to adjust)."
#define OSMSG_ADDED_TRUSTED "Added trusted hosts to the trusted-hosts list."
--- 165,178 ----
#define OSMSG_COMMAND_ENABLED "Command $b%s$b is now enabled."
#define OSMSG_BAD_MODIFIER "Unknown bad-word modifier $b%s$b."
+ #define OSMSG_BAD_REDUNDANT "$b%s$b is already covered by a bad word ($b%s$b)."
+ #define OSMSG_BAD_GROWING "Replacing bad word $b%s$b with shorter bad word $b%s$b."
+ #define OSMSG_BAD_NUKING " .. and removing redundant bad word $b%s$b."
#define OSMSG_ADDED_BAD "Added $b%s$b to the bad-word list."
#define OSMSG_REMOVED_BAD "Removed $b%s$b from the bad-word list."
! #define OSMSG_NOT_BAD_WORD "$b%s$b is not a bad word."
! #define OSMSG_ADDED_EXEMPTION "Added $b%s$b to the bad-word exemption list."
! #define OSMSG_ADDED_EXEMPTIONS "Added %d exception(s) to the bad word list."
! #define OSMSG_REMOVED_EXEMPTION "Removed $b%s$b from the exemption list."
! #define OSMSG_NOT_EXEMPT "$b%s$b is not on the exempt list."
#define OSMSG_ALREADY_TRUSTED "Host $b%s$b is already trusted (use $bdeltrust$b and then $baddtrust$b to adjust)."
#define OSMSG_ADDED_TRUSTED "Added trusted hosts to the trusted-hosts list."
***************
*** 174,180 ****
#define OSMSG_NOT_A_HOSTMASK "The hostmask must be in user@host form."
#define OSMSG_DISABLED_LIST "Disabled commands: %s"
! #define OSMSG_BADWORD_LIST "Bad word list:"
! #define OSMSG_BADWORD_EXCEPT "Bad word: %s (except %s)"
! #define OSMSG_BADWORD "Bad word: %s"
#define OSMSG_PROHIBITED_EMAIL "%s: %s"
#define OSMSG_GLINE_COUNT "There are %d glines active on the network."
--- 181,186 ----
#define OSMSG_NOT_A_HOSTMASK "The hostmask must be in user@host form."
#define OSMSG_DISABLED_LIST "Disabled commands: %s"
! #define OSMSG_BADWORD_LIST "Bad words: %s"
! #define OSMSG_EXEMPTED_LIST "Exempted channels: %s"
#define OSMSG_PROHIBITED_EMAIL "%s: %s"
#define OSMSG_GLINE_COUNT "There are %d glines active on the network."
***************
*** 328,332 ****
static dict_t opserv_func_dict; /* data is struct opserv_cmd* */
static dict_t opserv_reserved_nick_dict; /* data is struct userNode* */
! static dict_t opserv_bad_words; /* data is struct bad_word* */
static dict_t opserv_trusted_hosts; /* data is struct trusted_host* */
static dict_t opserv_hostinfo_dict; /* data is struct opserv_hostinfo* */
--- 334,339 ----
static dict_t opserv_func_dict; /* data is struct opserv_cmd* */
static dict_t opserv_reserved_nick_dict; /* data is struct userNode* */
! static struct string_list *opserv_bad_words;
! static dict_t opserv_exempt_channels; /* data is not used */
static dict_t opserv_trusted_hosts; /* data is struct trusted_host* */
static dict_t opserv_hostinfo_dict; /* data is struct opserv_hostinfo* */
***************
*** 435,451 ****
}
- struct bad_word {
- dict_t exceptions;
- char word[1];
- };
-
- static void
- opserv_free_bad_word(void *data)
- {
- struct bad_word *bad = data;
- dict_delete(bad->exceptions);
- free(bad);
- }
-
const char *OSMSG_VERSION_ID = "$Id$";
--- 442,445 ----
***************
*** 485,494 ****
if(!argc) return;
! if (IsChannelName(argv[argv_shift]) && (argv[argv_shift][0] != '+')) {
if (argc == 1) return;
channel = GetChannel(argv[++argv_shift]);
} else {
/* first arg isn't a channel name, so it's a command */
! if ((argc > 1) && IsChannelName(argv[argv_shift+1]) && (argv[argv_shift+1][0] != '+')) {
channel = GetChannel(argv[argv_shift+1]);
tmp = argv[argv_shift+1];
--- 479,488 ----
if(!argc) return;
! if (argv[argv_shift][0] == '#') {
if (argc == 1) return;
channel = GetChannel(argv[++argv_shift]);
} else {
/* first arg isn't a channel name, so it's a command */
! if ((argc > 1) && (argv[argv_shift+1][0] == '#')) {
channel = GetChannel(argv[argv_shift+1]);
tmp = argv[argv_shift+1];
***************
*** 1585,1614 ****
cmd_stats_bad(struct userNode *user)
{
! dict_iterator_t it, it2;
! struct bad_word *bad;
! unsigned int start, here_len;
char buffer[400];
! buffer[sizeof(buffer)-1] = 0;
! opserv_notice(user, OSMSG_BADWORD_LIST);
! for (it=dict_first(opserv_bad_words); it; it=iter_next(it)) {
! bad = iter_data(it);
! if (dict_size(bad->exceptions) > 0) {
! start = sizeof(buffer) - 1;
! for (it2=dict_first(bad->exceptions); it2; it2=iter_next(it2)) {
! here_len = strlen(iter_key(it2));
! if (start < here_len + 1) {
! opserv_notice(user, OSMSG_BADWORD_EXCEPT, bad->word, buffer+start+1);
! start = sizeof(buffer) - 1;
! }
! start -= here_len;
! memcpy(buffer+start, iter_key(it2), here_len);
! buffer[--start] = ',';
! }
! opserv_notice(user, OSMSG_BADWORD_EXCEPT, bad->word, buffer+start+1);
! } else {
! opserv_notice(user, OSMSG_BADWORD, bad->word);
}
}
}
--- 1579,1615 ----
cmd_stats_bad(struct userNode *user)
{
! dict_iterator_t it;
! unsigned int ii, end, here_len;
char buffer[400];
! /* Show the bad word list.. */
! for (ii=end=0; ii<opserv_bad_words->used; ii++) {
! here_len = strlen(opserv_bad_words->list[ii]);
! if ((end + here_len + 2) > sizeof(buffer)) {
! buffer[end] = 0;
! opserv_notice(user, OSMSG_BADWORD_LIST, buffer);
! end = 0;
}
+ memcpy(buffer+end, opserv_bad_words->list[ii], here_len);
+ end += here_len;
+ buffer[end++] = ' ';
+ }
+ buffer[end] = 0;
+ opserv_notice(user, OSMSG_BADWORD_LIST, buffer);
+
+ /* Show the exemption list.. */
+ for (it=dict_first(opserv_exempt_channels), end=0; it; it=iter_next(it)) {
+ here_len = strlen(iter_key(it));
+ if ((end + here_len + 2) > sizeof(buffer)) {
+ buffer[end] = 0;
+ opserv_notice(user, OSMSG_EXEMPTED_LIST, buffer);
+ end = 0;
+ }
+ memcpy(buffer+end, iter_key(it), here_len);
+ end += here_len;
+ buffer[end++] = ' ';
}
+ buffer[end] = 0;
+ opserv_notice(user, OSMSG_EXEMPTED_LIST, buffer);
}
***************
*** 2243,2253 ****
opserv_bad_channel(const char *name)
{
! struct bad_word *bad;
! dict_iterator_t it;
! for (it=dict_first(opserv_bad_words); it; it=iter_next(it)) {
! bad = iter_data(it);
! if (!strcasestr(name, bad->word)) continue;
! if (!dict_find(bad->exceptions, name, NULL)) return 1;
}
--- 2244,2254 ----
opserv_bad_channel(const char *name)
{
! unsigned int found;
!
! dict_find(opserv_exempt_channels, name, &found);
! if (found) return 0;
! for (found=0; found<opserv_bad_words->used; +++found) {
! if (strcasestr(name, opserv_bad_words->list[found])) return 1;
}
***************
*** 2340,2374 ****
}
! static struct bad_word *
! opserv_make_bad_word(const char *word)
! {
! struct bad_word *bad;
! bad = calloc(1, sizeof(*bad)+strlen(word));
! bad->exceptions = dict_new();
! dict_set_free_keys(bad->exceptions, free);
! strcpy(bad->word, word);
! dict_insert(opserv_bad_words, bad->word, bad);
! return bad;
}
static OPSERV_FUNC(cmd_addbad)
{
- struct bad_word *bad;
- char *exception;
unsigned int arg, count;
dict_iterator_t it;
OPSERV_MIN_PARMS(2, false);
/* Create the bad word if it doesn't exist. */
! if (!(bad = dict_find(opserv_bad_words, argv[1], NULL))) {
! bad = opserv_make_bad_word(argv[1]);
! opserv_notice(user, OSMSG_ADDED_BAD, bad->word);
! }
/* Look for exception modifiers. */
for (arg=2; arg<argc; arg++) {
if (!strcasecmp(argv[arg], "except")) {
if (++arg > argc) {
opserv_notice(user, MSG_MISSING_PARAMS, "except");
--- 2341,2388 ----
}
! static int
! opserv_add_bad_word(struct userNode *user, const unsigned char *new_bad) {
! unsigned int bad_idx;
! for (bad_idx = 0; bad_idx < opserv_bad_words->used; ++bad_idx) {
! char *orig_bad = opserv_bad_words->list[bad_idx];
! if (strcasestr(new_bad, orig_bad)) {
! if (user) opserv_notice(user, OSMSG_BAD_REDUNDANT, new_bad, orig_bad);
! return 0;
! } else if (strcasestr(orig_bad, new_bad)) {
! if (user) opserv_notice(user, OSMSG_BAD_GROWING, orig_bad, new_bad);
! free(orig_bad);
! opserv_bad_words->list[bad_idx] = strdup(new_bad);
! for (bad_idx++; bad_idx < opserv_bad_words->used; bad_idx++) {
! orig_bad = opserv_bad_words->list[bad_idx];
! if (!strcasestr(orig_bad, new_bad)) continue;
! if (user) opserv_notice(user, OSMSG_BAD_NUKING, orig_bad);
! string_list_delete(opserv_bad_words, bad_idx);
! bad_idx--;
! free(orig_bad);
! }
! return 1;
! }
! }
! string_list_append(opserv_bad_words, strdup(new_bad));
! if (user) opserv_notice(user, OSMSG_ADDED_BAD, new_bad);
! return 1;
}
static OPSERV_FUNC(cmd_addbad)
{
unsigned int arg, count;
dict_iterator_t it;
+ int bad_found, exempt_found;
OPSERV_MIN_PARMS(2, false);
/* Create the bad word if it doesn't exist. */
! bad_found = !opserv_add_bad_word(user, argv[1]);
/* Look for exception modifiers. */
for (arg=2; arg<argc; arg++) {
if (!strcasecmp(argv[arg], "except")) {
+ opserv_notice(user, MSG_DEPRECATED_COMMAND, "addbad ... except", "addexempt");
if (++arg > argc) {
opserv_notice(user, MSG_MISSING_PARAMS, "except");
***************
*** 2376,2387 ****
}
for (count = 0; (arg < argc) && IsChannelName(argv[arg]); arg++) {
! if (!dict_find(bad->exceptions, argv[arg], NULL)) {
! exception = strdup(argv[arg]);
! dict_insert(bad->exceptions, exception, exception);
count++;
}
}
! opserv_notice(user, OSMSG_ADDED_BAD_EXCEPTIONS, count, bad->word);
} else {
opserv_notice(user, OSMSG_BAD_MODIFIER, argv[arg]);
}
--- 2390,2402 ----
}
for (count = 0; (arg < argc) && IsChannelName(argv[arg]); arg++) {
! dict_find(opserv_exempt_channels, argv[arg], &exempt_found);
! if (!exempt_found) {
! dict_insert(opserv_exempt_channels, strdup(argv[arg]), NULL);
count++;
}
}
! opserv_notice(user, OSMSG_ADDED_EXEMPTIONS, count);
} else {
+ opserv_notice(user, MSG_DEPRECATED_COMMAND, "addbad (with modifiers)", "addbad");
opserv_notice(user, OSMSG_BAD_MODIFIER, argv[arg]);
}
***************
*** 2389,2403 ****
/* Scan for existing channels that match the new bad word. */
! for (it = dict_first(channels); it; it = iter_next(it)) {
! struct chanNode *channel = iter_data(it);
! if (!opserv_bad_channel(channel->name)) continue;
! if (channel->name[0] == '#') {
! opserv_shutdown_channel(channel, OSMSG_ILLEGAL_REASON);
! } else {
! unsigned int nn;
! for (nn=0; nn<channel->members.used; nn++) {
! struct userNode *user = channel->members.list[nn]->user;
! DelUser(user, opserv, 1, OSMSG_ILLEGAL_KILL_REASON);
}
}
--- 2404,2420 ----
/* Scan for existing channels that match the new bad word. */
! if (!bad_found) {
! for (it = dict_first(channels); it; it = iter_next(it)) {
! struct chanNode *channel = iter_data(it);
! if (!opserv_bad_channel(channel->name)) continue;
! if (channel->name[0] == '#') {
! opserv_shutdown_channel(channel, OSMSG_ILLEGAL_REASON);
! } else {
! unsigned int nn;
! for (nn=0; nn<channel->members.used; nn++) {
! struct userNode *user = channel->members.list[nn]->user;
! DelUser(user, opserv, 1, OSMSG_ILLEGAL_KILL_REASON);
! }
}
}
***************
*** 2409,2419 ****
static OPSERV_FUNC(cmd_delbad)
{
OPSERV_MIN_PARMS(2, false);
! if (dict_remove(opserv_bad_words, argv[1])) {
! opserv_notice(user, OSMSG_REMOVED_BAD, argv[1]);
} else {
! opserv_notice(user, OSMSG_NOT_BAD_WORD, argv[1]);
}
return 1;
}
--- 2426,2482 ----
static OPSERV_FUNC(cmd_delbad)
{
+ unsigned int nn;
+
OPSERV_MIN_PARMS(2, false);
! for (nn=0; nn<opserv_bad_words->used; nn++) {
! if (!strcasecmp(opserv_bad_words->list[nn], argv[1])) {
! string_list_delete(opserv_bad_words, nn);
! opserv_notice(user, OSMSG_REMOVED_BAD, argv[1]);
! return 1;
! }
! }
! opserv_notice(user, OSMSG_NOT_BAD_WORD, argv[1]);
! return 0;
! }
!
! static OPSERV_FUNC(cmd_addexempt)
! {
! const char *chanName;
!
! OPSERV_MIN_PARMS(1, false);
! if (channel) {
! chanName = channel->name;
! } else if (argv[-1]) {
! chanName = argv[-1];
} else {
! opserv_notice(user, MSG_MISSING_PARAMS, argv[0]);
! OPSERV_SYNTAX();
! return 0;
}
+ dict_insert(opserv_exempt_channels, strdup(chanName), NULL);
+ opserv_notice(user, OSMSG_ADDED_EXEMPTION, chanName);
+ return 1;
+ }
+
+ static OPSERV_FUNC(cmd_delexempt)
+ {
+ const char *chanName;
+
+ OPSERV_MIN_PARMS(1, false);
+ if (channel) {
+ chanName = channel->name;
+ } else if (argv[-1]) {
+ chanName = argv[-1];
+ } else {
+ opserv_notice(user, MSG_MISSING_PARAMS, argv[0]);
+ OPSERV_SYNTAX();
+ return 0;
+ }
+ if (!dict_remove(opserv_exempt_channels, chanName)) {
+ opserv_notice(user, OSMSG_NOT_EXEMPT, chanName);
+ return 0;
+ }
+ opserv_notice(user, OSMSG_REMOVED_EXEMPTION, chanName);
return 1;
}
***************
*** 3085,3091 ****
dict_set_free_data(opserv_user_alerts, opserv_free_user_alert);
/* set up opserv_bad_words */
! dict_delete(opserv_bad_words);
! opserv_bad_words = dict_new();
! dict_set_free_data(opserv_bad_words, opserv_free_bad_word);
/* read database */
conf_db = parse_database(OPSERV_DB_NAME);
--- 3148,3157 ----
dict_set_free_data(opserv_user_alerts, opserv_free_user_alert);
/* set up opserv_bad_words */
! free_string_list(opserv_bad_words);
! opserv_bad_words = alloc_string_list(4);
! /* and opserv_exempt_channels */
! dict_delete(opserv_exempt_channels);
! opserv_exempt_channels = dict_new();
! dict_set_free_keys(opserv_exempt_channels, free);
/* read database */
conf_db = parse_database(OPSERV_DB_NAME);
***************
*** 3100,3118 ****
switch (rd->type) {
case RECDB_STRING_LIST:
! for (nn=0; nn<rd->d.slist->used; nn++) {
! opserv_make_bad_word(rd->d.slist->list[nn]);
}
break;
case RECDB_OBJECT:
for (it=dict_first(rd->d.object); it; it=iter_next(it)) {
! struct bad_word *bad;
! char *word;
!
rd = iter_data(it);
if (rd->type == RECDB_STRING_LIST) {
- bad = opserv_make_bad_word(iter_key(it));
for (nn=0; nn<rd->d.slist->used; nn++) {
! word = strdup(rd->d.slist->list[nn]);
! dict_insert(bad->exceptions, word, word);
}
}
--- 3166,3181 ----
switch (rd->type) {
case RECDB_STRING_LIST:
! /* Add words one by one just in case there are overlaps from an old DB. */
! for (nn=0; nn<rd->d.slist->used; ++nn) {
! opserv_add_bad_word(NULL, rd->d.slist->list[nn]);
}
break;
case RECDB_OBJECT:
for (it=dict_first(rd->d.object); it; it=iter_next(it)) {
! opserv_add_bad_word(NULL, iter_key(it));
rd = iter_data(it);
if (rd->type == RECDB_STRING_LIST) {
for (nn=0; nn<rd->d.slist->used; nn++) {
! dict_insert(opserv_exempt_channels, strdup(rd->d.slist->list[nn]), NULL);
}
}
***************
*** 3267,3273 ****
{
FILE *f;
! dict_t db = alloc_database(), subdb;
! dict_iterator_t it, it2;
/* write out the commands */
subdb = alloc_object();
--- 3330,3338 ----
{
FILE *f;
! dict_t db, subdb;
! struct string_list *slist;
! dict_iterator_t it;
+ db = alloc_database();
/* write out the commands */
subdb = alloc_object();
***************
*** 3279,3293 ****
dict_insert(db, KEY_RESERVES, alloc_record_data_object(subdb));
/* bad word set */
! subdb = alloc_object();
! for (it=dict_first(opserv_bad_words); it; it=iter_next(it)) {
! struct bad_word *bad = iter_data(it);
! struct string_list *slist = alloc_string_list(dict_size(bad->exceptions));
!
! for (it2=dict_first(bad->exceptions); it2; it2=iter_next(it2)) {
! string_list_append(slist, strdup(iter_key(it2)));
! }
! dict_insert(subdb, iter_key(it), alloc_record_data_string_list(slist));
}
! dict_insert(db, KEY_BAD_WORDS, alloc_record_data_object(subdb));
/* trusted hosts takes a little more work */
subdb = alloc_object();
--- 3344,3355 ----
dict_insert(db, KEY_RESERVES, alloc_record_data_object(subdb));
/* bad word set */
! slist = string_list_copy(opserv_bad_words);
! dict_insert(db, KEY_BAD_WORDS, alloc_record_data_string_list(slist));
! /* insert exempt channel names */
! slist = alloc_string_list(dict_size(opserv_exempt_channels));
! for (it=dict_first(opserv_exempt_channels); it; it=iter_next(it)) {
! string_list_append(slist, strdup(iter_key(it)));
}
! dict_insert(db, KEY_EXEMPT_CHANNELS, alloc_record_data_string_list(slist));
/* trusted hosts takes a little more work */
subdb = alloc_object();
***************
*** 4557,4561 ****
dict_delete(opserv_func_dict);
dict_delete(opserv_reserved_nick_dict);
! dict_delete(opserv_bad_words);
dict_delete(opserv_trusted_hosts);
unreg_del_user_func(opserv_user_cleanup);
--- 4619,4624 ----
dict_delete(opserv_func_dict);
dict_delete(opserv_reserved_nick_dict);
! free_string_list(opserv_bad_words);
! dict_delete(opserv_exempt_channels);
dict_delete(opserv_trusted_hosts);
unreg_del_user_func(opserv_user_cleanup);
***************
*** 4588,4596 ****
dict_set_free_data(opserv_func_dict, opserv_unref_cmd);
opserv_define_func("ACCESS", cmd_access, 0);
- opserv_define_func("ADDNOTE", cmd_addnote, 800);
opserv_define_func("ADDALERT", cmd_addalert, 800);
opserv_define_func("ADDALERT NOTICE", NULL, 0);
opserv_define_func("ADDALERT GLINE", NULL, 900);
opserv_define_func("ADDBAD", cmd_addbad, 800);
opserv_define_func("ADDTRUST", cmd_addtrust, 800);
opserv_define_func("ALIAS", cmd_alias, 800);
--- 4651,4660 ----
dict_set_free_data(opserv_func_dict, opserv_unref_cmd);
opserv_define_func("ACCESS", cmd_access, 0);
opserv_define_func("ADDALERT", cmd_addalert, 800);
opserv_define_func("ADDALERT NOTICE", NULL, 0);
opserv_define_func("ADDALERT GLINE", NULL, 900);
opserv_define_func("ADDBAD", cmd_addbad, 800);
+ opserv_define_func("ADDEXEMPT", cmd_addexempt, 800);
+ opserv_define_func("ADDNOTE", cmd_addnote, 800);
opserv_define_func("ADDTRUST", cmd_addtrust, 800);
opserv_define_func("ALIAS", cmd_alias, 800);
***************
*** 4608,4611 ****
--- 4672,4676 ----
opserv_define_func("DELALERT", cmd_delalert, 800);
opserv_define_func("DELBAD", cmd_delbad, 800);
+ opserv_define_func("DELEXEMPT", cmd_delexempt, 800);
opserv_define_func("DELNOTE", cmd_delnote, 800);
opserv_define_func("DELTRUST", cmd_deltrust, 800);
|