X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/45be325cd2a8fcedc7fe71adbe70208d0d16aec2..6ce8910d97424320108dc438325c044f0060ab27:/modules/m_dline.c diff --git a/modules/m_dline.c b/modules/m_dline.c index 13b0701..e54bacf 100644 --- a/modules/m_dline.c +++ b/modules/m_dline.c @@ -63,7 +63,7 @@ DECLARE_MODULE_AV1(dline, NULL, NULL, dline_clist, NULL, NULL, "$Revision: 3225 static int valid_comment(char *comment); static int flush_write(struct Client *, FILE *, char *, char *); static int remove_temp_dline(struct ConfItem *); -static int apply_dline(struct Client *, const char *, int, char *); +static int apply_dline(struct Client *, const char *, int, char *); static int apply_undline(struct Client *, const char *); /* mo_dline() @@ -100,6 +100,13 @@ mo_dline(struct Client *client_p, struct Client *source_p, if(parc >= loc+2 && !irccmp(parv[loc], "ON")) { + if(!IsOperRemoteBan(source_p)) + { + sendto_one(source_p, form_str(ERR_NOPRIVS), + me.name, source_p->name, "remoteban"); + return 0; + } + target_server = parv[loc+1]; loc += 2; } @@ -145,6 +152,13 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha if(parc >= 4 && !irccmp(parv[2], "ON")) { + if(!IsOperRemoteBan(source_p)) + { + sendto_one(source_p, form_str(ERR_NOPRIVS), + me.name, source_p->name, "remoteban"); + return 0; + } + target_server = parv[3]; sendto_match_servs(source_p, target_server, CAP_ENCAP, NOCAPS, @@ -160,44 +174,40 @@ mo_undline(struct Client *client_p, struct Client *source_p, int parc, const cha return 0; } -static int -me_dline(struct Client *client_p, struct Client *source_p, int parc, const char **parv) -{ - int tdline_time = atoi(parv[1]); - /* Since this is coming over a server link, assume that the originating - * server did the relevant permission/sanity checks... - */ - - if(!IsPerson(source_p)) - return 0; - - if(!find_shared_conf(source_p->username, source_p->host, - source_p->servptr->name, tdline_time > 0 ? SHARED_TDLINE : SHARED_PDLINE)) - { - sendto_realops_snomask(SNO_DEBUG, L_NETWIDE, "undline failed %s %s %s", - source_p->name, parv[1], parv[2]); - return 0; - } - - apply_dline(source_p, parv[2], tdline_time, LOCAL_COPY(parv[3])); - - check_dlines(); - return 0; -} - -static int -me_undline(struct Client *client_p, struct Client *source_p, int parc, const char **parv) -{ - if(!IsPerson(source_p)) - return 0; - - if(!find_shared_conf(source_p->username, source_p->host, - source_p->servptr->name, SHARED_UNDLINE)) - return 0; - - apply_undline(source_p, parv[1]); - - return 0; +static int +me_dline(struct Client *client_p, struct Client *source_p, int parc, const char **parv) +{ + int tdline_time = atoi(parv[1]); + /* Since this is coming over a server link, assume that the originating + * server did the relevant permission/sanity checks... + */ + + if(!IsPerson(source_p)) + return 0; + + if(!find_shared_conf(source_p->username, source_p->host, + source_p->servptr->name, tdline_time > 0 ? SHARED_TDLINE : SHARED_PDLINE)) + return 0; + + apply_dline(source_p, parv[2], tdline_time, LOCAL_COPY(parv[3])); + + check_dlines(); + return 0; +} + +static int +me_undline(struct Client *client_p, struct Client *source_p, int parc, const char **parv) +{ + if(!IsPerson(source_p)) + return 0; + + if(!find_shared_conf(source_p->username, source_p->host, + source_p->servptr->name, SHARED_UNDLINE)) + return 0; + + apply_undline(source_p, parv[1]); + + return 0; } static int @@ -253,16 +263,6 @@ apply_dline(struct Client *source_p, const char *dlhost, int tdline_time, char * return 0; } - /* Look for an oper reason */ - if((oper_reason = strchr(reason, '|')) != NULL) - { - *oper_reason = '\0'; - oper_reason++; - - if(!EmptyString(oper_reason)) - aconf->spasswd = rb_strdup(oper_reason); - } - if(ConfigFileEntry.non_redundant_klines) { if((aconf = find_dline((struct sockaddr *)&daddr, t)) != NULL) @@ -292,6 +292,16 @@ apply_dline(struct Client *source_p, const char *dlhost, int tdline_time, char * aconf->status = CONF_DLINE; aconf->host = rb_strdup(dlhost); + /* Look for an oper reason */ + if((oper_reason = strchr(reason, '|')) != NULL) + { + *oper_reason = '\0'; + oper_reason++; + + if(!EmptyString(oper_reason)) + aconf->spasswd = rb_strdup(oper_reason); + } + if(tdline_time > 0) { rb_snprintf(dlbuffer, sizeof(dlbuffer), @@ -303,7 +313,7 @@ apply_dline(struct Client *source_p, const char *dlhost, int tdline_time, char * if(EmptyString(oper_reason)) { - sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s added temporary %d min. D-Line for [%s] [%s]", get_oper_name(source_p), tdline_time / 60, aconf->host, reason); @@ -313,7 +323,7 @@ apply_dline(struct Client *source_p, const char *dlhost, int tdline_time, char * } else { - sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, + sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s added temporary %d min. D-Line for [%s] [%s|%s]", get_oper_name(source_p), tdline_time / 60, aconf->host, reason, oper_reason); @@ -329,7 +339,7 @@ apply_dline(struct Client *source_p, const char *dlhost, int tdline_time, char * { rb_snprintf(dlbuffer, sizeof(dlbuffer), "%s (%s)", reason, current_date); aconf->passwd = rb_strdup(dlbuffer); - add_conf_by_address(aconf->host, CONF_DLINE, NULL, aconf); + add_conf_by_address(aconf->host, CONF_DLINE, NULL, NULL, aconf); write_confitem(DLINE_TYPE, source_p, NULL, aconf->host, reason, oper_reason, current_date, 0); } @@ -416,7 +426,7 @@ apply_undline(struct Client *source_p, const char *cidr) continue; } - if(irccmp(found_cidr, cidr) == 0) + if(irccmp(found_cidr, aconf->host) == 0) { pairme++; } @@ -441,8 +451,8 @@ apply_undline(struct Client *source_p, const char *cidr) } else if(!pairme) { - sendto_one(source_p, ":%s NOTICE %s :No D-Line for %s", - me.name, source_p->name, cidr); + sendto_one_notice(source_p, ":Cannot find D-Line for %s in file", + aconf->host); if(temppath != NULL) (void) unlink(temppath); @@ -455,13 +465,12 @@ apply_undline(struct Client *source_p, const char *cidr) sendto_one_notice(source_p, ":Couldn't rename temp file, aborted"); return 0; } - rehash_bans(0); - - sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed", me.name, source_p->name, cidr); - sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, - "%s has removed the D-Line for: [%s]", get_oper_name(source_p), cidr); - ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), cidr); + sendto_one(source_p, ":%s NOTICE %s :D-Line for [%s] is removed", me.name, source_p->name, aconf->host); + sendto_realops_snomask(SNO_GENERAL, L_ALL, + "%s has removed the D-Line for: [%s]", get_oper_name(source_p), aconf->host); + ilog(L_KLINE, "UD %s %s", get_oper_name(source_p), aconf->host); + delete_one_address_conf(aconf->host, aconf); return 0; }