[srvx-commits] CVS: services/src nickserv.c,1.179,1.180 nickserv.h,1.33,1.34 opserv.c,1.244,1.245
Brought to you by:
entrope
|
From: Entrope <en...@us...> - 2002-07-11 18:15:53
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv29536/src
Modified Files:
nickserv.c nickserv.h opserv.c
Log Message:
move some access-checking code into separate functions
s/strcasestr/irccasestr/g in opserv.c
Index: nickserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/nickserv.c,v
retrieving revision 1.179
retrieving revision 1.180
diff -C2 -r1.179 -r1.180
*** nickserv.c 8 Jul 2002 15:45:32 -0000 1.179
--- nickserv.c 11 Jul 2002 18:15:49 -0000 1.180
***************
*** 485,508 ****
}
! static int
! is_valid_oper(struct userNode *user, unsigned int min_level, unsigned int quiet)
! {
if (!user->handle_info) {
! if (!quiet) nickserv_notice(user, MSG_AUTHENTICATE);
return 0;
}
if (!IsOper(user) && (!IsHelping(user) || min_level)) {
! if (!quiet) nickserv_notice(user, NSMSG_NO_ACCESS);
return 0;
}
if (HANDLE_FLAGGED(user->handle_info, OPER_SUSPENDED)) {
! if (!quiet) nickserv_notice(user, MSG_OPER_SUSPENDED);
return 0;
}
if (user->handle_info->opserv_level < min_level) {
! if (!quiet) nickserv_notice(user, NSMSG_NO_ACCESS);
return 0;
}
--- 485,507 ----
}
! int
! oper_has_access(struct userNode *user, struct userNode *bot, unsigned int min_level, unsigned int quiet) {
if (!user->handle_info) {
! if (!quiet) send_message(user, bot, MSG_AUTHENTICATE);
return 0;
}
if (!IsOper(user) && (!IsHelping(user) || min_level)) {
! if (!quiet) send_message(user, bot, NSMSG_NO_ACCESS);
return 0;
}
if (HANDLE_FLAGGED(user->handle_info, OPER_SUSPENDED)) {
! if (!quiet) send_message(user, bot, MSG_OPER_SUSPENDED);
return 0;
}
if (user->handle_info->opserv_level < min_level) {
! if (!quiet) send_message(user, bot, NSMSG_NO_ACCESS);
return 0;
}
***************
*** 511,514 ****
--- 510,515 ----
}
+ #define is_valid_oper(USER, MIN_LEVEL, QUIET) oper_has_access(USER, nickserv, MIN_LEVEL, QUIET)
+
static int
is_valid_handle(const char *handle)
***************
*** 1704,1733 ****
}
! static int
! nickserv_apply_flags(struct userNode *user, struct handle_info *hi, const unsigned char *flags)
! {
! unsigned int n, add = 1, pos, before, after;
! struct userNode *uNode;
! before = hi->flags & (HI_FLAG_SUPPORT_HELPER|HI_FLAG_NETWORK_HELPER);
! for (n=0; flags[n]; n++) {
! switch (flags[n]) {
case '+': add = 1; break;
case '-': add = 0; break;
default:
! if (!(pos = handle_inverse_flags[flags[n]])) {
! nickserv_notice(user, NSMSG_INVALID_FLAG, flags[n]);
return 0;
}
if (user->handle_info->opserv_level < flag_access_levels[pos-1]) {
/* cheesy avoidance of looking up the flag name.. */
! nickserv_notice(user, MSG_SETTING_PRIVILEGED, "That flag");
return 0;
}
! if (add) hi->flags |= 1 << (pos - 1);
! else hi->flags &= ~(1 << (pos - 1));
break;
}
}
after = hi->flags & (HI_FLAG_SUPPORT_HELPER|HI_FLAG_NETWORK_HELPER);
--- 1705,1747 ----
}
! int
! nickserv_modify_handle_flags(struct userNode *user, struct userNode *bot, const unsigned char *str, unsigned long *padded, unsigned long *premoved) {
! unsigned int nn, add = 1, pos;
! unsigned long added, removed, flag;
! for (added=removed=nn=0; str[nn]; nn++) {
! switch (str[nn]) {
case '+': add = 1; break;
case '-': add = 0; break;
default:
! if (!(pos = handle_inverse_flags[str[nn]])) {
! send_message(user, bot, NSMSG_INVALID_FLAG, str[nn]);
return 0;
}
if (user->handle_info->opserv_level < flag_access_levels[pos-1]) {
/* cheesy avoidance of looking up the flag name.. */
! send_message(user, bot, MSG_SETTING_PRIVILEGED, "That flag");
return 0;
}
! flag = 1 << (pos - 1);
! if (add) added |= flag, removed &= ~flag;
! else removed |= flag, added &= ~flag;
break;
}
}
+ *padded = added;
+ *premoved = removed;
+ return 1;
+ }
+
+ static int
+ nickserv_apply_flags(struct userNode *user, struct handle_info *hi, const unsigned char *flags)
+ {
+ unsigned long before, after, added, removed;
+ struct userNode *uNode;
+
+ before = hi->flags & (HI_FLAG_SUPPORT_HELPER|HI_FLAG_NETWORK_HELPER);
+ if (!nickserv_modify_handle_flags(user, nickserv, flags, &added, &removed)) return 0;
+ hi->flags = (hi->flags | added) & ~removed;
after = hi->flags & (HI_FLAG_SUPPORT_HELPER|HI_FLAG_NETWORK_HELPER);
***************
*** 2038,2043 ****
int
! oper_can_set_access(struct userNode *user) {
! return is_valid_oper(user, nickserv_conf.modoper_level, 0);
}
--- 2052,2057 ----
int
! oper_can_set_access(struct userNode *user, struct userNode *bot) {
! return oper_has_access(user, bot, nickserv_conf.modoper_level, 0);
}
***************
*** 2050,2054 ****
if (argc > 1) {
! if (oper_can_set_access(user)) {
unsigned int new_level = strtoul(argv[1], NULL, 0);
if (user->handle_info->opserv_level < new_level) {
--- 2064,2068 ----
if (argc > 1) {
! if (oper_can_set_access(user, nickserv)) {
unsigned int new_level = strtoul(argv[1], NULL, 0);
if (user->handle_info->opserv_level < new_level) {
***************
*** 2638,2642 ****
nickserv_discrim_create(struct userNode *user, unsigned int argc, unsigned char *argv[])
{
! unsigned int i, j;
struct nickserv_discrim *discrim;
--- 2652,2656 ----
nickserv_discrim_create(struct userNode *user, unsigned int argc, unsigned char *argv[])
{
! unsigned int i;
struct nickserv_discrim *discrim;
***************
*** 2657,2676 ****
discrim->limit = atoi(argv[++i]);
} else if (!irccasecmp(argv[i], "flags")) {
! int is_on = 1, pos;
! i++;
! for (j=0; argv[i][j]; j++) {
! switch (argv[i][j]) {
! case '+': is_on = 1; break;
! case '-': is_on = 0; break;
! default:
! pos = handle_inverse_flags[argv[i][j]];
! if (!pos) break;
! if (is_on) {
! discrim->flags_on |= 1 << (pos-1);
! } else {
! discrim->flags_off |= 1 << (pos-1);
! }
! }
! }
} else if (!irccasecmp(argv[i], "registered")) {
discrim->registered = now - ParseInterval(argv[++i]);
--- 2671,2675 ----
discrim->limit = atoi(argv[++i]);
} else if (!irccasecmp(argv[i], "flags")) {
! nickserv_modify_handle_flags(user, nickserv, argv[i], &discrim->flags_on, &discrim->flags_off);
} else if (!irccasecmp(argv[i], "registered")) {
discrim->registered = now - ParseInterval(argv[++i]);
Index: nickserv.h
===================================================================
RCS file: /cvsroot/srvx/services/src/nickserv.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -r1.33 -r1.34
*** nickserv.h 4 Jul 2002 02:47:30 -0000 1.33
--- nickserv.h 11 Jul 2002 18:15:50 -0000 1.34
***************
*** 109,116 ****
struct handle_info *get_handle_info(const char *handle);
struct handle_info *smart_get_handle_info(struct userNode *service, struct userNode *user, const unsigned char *name);
! int oper_can_set_access(struct userNode *user);
int oper_outranks(struct userNode *user, struct handle_info *hi);
struct nick_info *get_nick_info(const char *nick);
struct modeNode *find_handle_in_channel(struct chanNode *channel, struct handle_info *handle, struct userNode *except);
/* auth_funcs are called when a user gets a new handle_info. They are
--- 109,118 ----
struct handle_info *get_handle_info(const char *handle);
struct handle_info *smart_get_handle_info(struct userNode *service, struct userNode *user, const unsigned char *name);
! int oper_can_set_access(struct userNode *user, struct userNode *bot);
int oper_outranks(struct userNode *user, struct handle_info *hi);
struct nick_info *get_nick_info(const char *nick);
struct modeNode *find_handle_in_channel(struct chanNode *channel, struct handle_info *handle, struct userNode *except);
+ int nickserv_modify_handle_flags(struct userNode *user, struct userNode *bot, const unsigned char *str, unsigned long *add, unsigned long *remove);
+ int oper_has_access(struct userNode *user, struct userNode *bot, unsigned int min_level, unsigned int quiet);
/* auth_funcs are called when a user gets a new handle_info. They are
Index: opserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/opserv.c,v
retrieving revision 1.244
retrieving revision 1.245
diff -C2 -r1.244 -r1.245
*** opserv.c 8 Jul 2002 15:45:32 -0000 1.244
--- opserv.c 11 Jul 2002 18:15:50 -0000 1.245
***************
*** 470,478 ****
return;
}
- log(OS_LOG, LOG_INFO, "%s[%s]: %s\n", user->nick, user->handle_info->handle, text);
if (HANDLE_FLAGGED(user->handle_info, OPER_SUSPENDED)) {
opserv_notice(user, MSG_OPER_SUSPENDED);
return;
}
argv_shift = 1;
--- 470,478 ----
return;
}
if (HANDLE_FLAGGED(user->handle_info, OPER_SUSPENDED)) {
opserv_notice(user, MSG_OPER_SUSPENDED);
return;
}
+ log(OS_LOG, LOG_INFO, "%s[%s]: %s\n", user->nick, user->handle_info->handle, text);
argv_shift = 1;
***************
*** 501,512 ****
return;
}
- if (cmd->min_level > user->handle_info->opserv_level) {
- opserv_notice(user, OSMSG_LEVEL_TOO_LOW);
- return;
- }
if (cmd->disabled) {
opserv_notice(user, MSG_COMMAND_DISABLED, argv[argv_shift]);
return;
}
if (cmd->func) {
cmd->func(user, channel, argc, argv+argv_shift);
--- 501,509 ----
return;
}
if (cmd->disabled) {
opserv_notice(user, MSG_COMMAND_DISABLED, argv[argv_shift]);
return;
}
+ if (!oper_has_access(user, opserv, cmd->min_level, 0)) return;
if (cmd->func) {
cmd->func(user, channel, argc, argv+argv_shift);
***************
*** 556,560 ****
target = (argc > 1) ? (const char*)argv[1] : user->nick;
if (!(hi = smart_get_handle_info(opserv, user, target))) return 0;
! if ((argc > 2) && oper_can_set_access(user) && oper_outranks(user, hi)) {
new_level = strtoul(argv[2], NULL, 0);
if (user->handle_info->opserv_level < new_level) {
--- 553,557 ----
target = (argc > 1) ? (const char*)argv[1] : user->nick;
if (!(hi = smart_get_handle_info(opserv, user, target))) return 0;
! if ((argc > 2) && oper_can_set_access(user, opserv) && oper_outranks(user, hi)) {
new_level = strtoul(argv[2], NULL, 0);
if (user->handle_info->opserv_level < new_level) {
***************
*** 2254,2258 ****
for (found=0; found<opserv_bad_words->used; +++found) {
! if (strcasestr(name, opserv_bad_words->list[found])) return 1;
}
--- 2251,2255 ----
for (found=0; found<opserv_bad_words->used; +++found) {
! if (irccasestr(name, opserv_bad_words->list[found])) return 1;
}
***************
*** 2351,2358 ****
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);
--- 2348,2355 ----
for (bad_idx = 0; bad_idx < opserv_bad_words->used; ++bad_idx) {
char *orig_bad = opserv_bad_words->list[bad_idx];
! if (irccasestr(new_bad, orig_bad)) {
if (user) opserv_notice(user, OSMSG_BAD_REDUNDANT, new_bad, orig_bad);
return 0;
! } else if (irccasestr(orig_bad, new_bad)) {
if (user) opserv_notice(user, OSMSG_BAD_GROWING, orig_bad, new_bad);
free(orig_bad);
***************
*** 2360,2364 ****
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);
--- 2357,2361 ----
for (bad_idx++; bad_idx < opserv_bad_words->used; bad_idx++) {
orig_bad = opserv_bad_words->list[bad_idx];
! if (!irccasestr(orig_bad, new_bad)) continue;
if (user) opserv_notice(user, OSMSG_BAD_NUKING, orig_bad);
string_list_delete(opserv_bad_words, bad_idx);
|