From ecc8286a2fb69d2ae9fad387af3c8b6ca0c08dde Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 15 Jul 2013 21:09:32 +0200 Subject: [PATCH] added possibility to assign devnull classes to second level fakehosts --- src/mod-hostserv.c | 97 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index ce8a374..0b05e0e 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -40,7 +40,7 @@ */ #include "chanserv.h" -#include "opserv.h" +#include "opserv.h" /* devnull management! */ #include "nickserv.h" #include "conf.h" #include "modcmd.h" @@ -52,6 +52,7 @@ #define KEY_MANAGERS "Manager" #define KEY_ASSIGNMENTS "Assignments" #define KEY_ACTIVE "active" +#define KEY_DEVNULL "devnull" #define HS_FAKEHOST_SPECIAL_CHARS "_-:;" /* alphanum already included */ @@ -79,6 +80,7 @@ static const struct message_entry msgtab[] = { { "HSMSG_UNKNOWN_FAKEHOST", "Fakehost $b%s.%s$b is unknown or you have no access to manage it." }, { "HSMSG_TOPLEVEL_FAKEHOSTS", "Fakehosts in group $b*.%s$b:" }, { "HSMSG_TOPLEVEL_FAKEHOST", " $b%s.%s$b assignments: %d managers: %d" }, + { "HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", " $b%s.%s$b assignments: %d managers: %d DevNull: %s" }, { "HSMSG_TOPLEVEL_INVALID", "The name of the group you entered is invalid ($b%s$b)" }, { "HSMSG_MANAGERS_TOPLEVEL", "Managers of group $b*.%s$b:" }, { "HSMSG_MANAGERS_FAKEHOST", "Managers of group $b%s.%s$b:" }, @@ -101,6 +103,8 @@ static const struct message_entry msgtab[] = { { "HSMSG_FAKEHOST_ASSIGN_SUCCESS", "Group $b%s.%s$b was assigned successfully." }, { "HSMSG_FAKEHOST_ASSIGNED", "Group $b%s.%s$b is already assigned to the user." }, { "HSMSG_FAKEHOST_UNASSIGN_SUCCESS", "Group $b%s.%s$b was unassigned successfully." }, + { "HSMSG_FAKEHOST_TLDEVNULL", "You can't assign a DevNull class to a toplevel fakehost." }, + { "HSMSG_DEVNULL_CLASS", "$b%s.%s$b DevNull Class: %s" }, { NULL, NULL } }; @@ -139,6 +143,7 @@ struct hs_secondlevel { struct hs_toplevel *toplevel; char *fakehost; struct hs_manager *managers; + int devnull_id; struct hs_assignment *assignments; struct hs_secondlevel *next; }; @@ -646,7 +651,11 @@ static void cmd_view_toplevel_information(UNUSED_ARG(struct userNode *user), UNU int assignments = 0; for(assignment = slfh->assignments; assignment; assignment = assignment->next) assignments++; - reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers); + struct devnull_class *th; + if(slfh->devnull_id && (th = devnull_find_id(slfh->devnull_id))) + reply("HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", slfh->fakehost, tlfh->fakehost, assignments, managers, th->name); + else + reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers); } reply("HSMSG_MANAGERS_TOPLEVEL", tlfh->fakehost); struct hs_manager *cmanager; @@ -1224,6 +1233,78 @@ static MODCMD_FUNC(cmd_oset) { } } +static MODCMD_FUNC(cmd_setdevnull) { + struct handle_info *hi; + if (!(hi = user->handle_info)) { + reply("NSMSG_MUST_AUTH"); + return 0; + } + struct hs_fakehost_info fhinfo = parse_fakehost_info(argv[1], 1); + if(fhinfo.parse_state == HS_FHPARSE_INVALID) { + reply("HSMSG_TOPLEVEL_INVALID", argv[1]); + return 0; + } + if(!fhinfo.have_secondlevel) { + reply("HSMSG_FAKEHOST_TLDEVNULL"); + return 0; + } else { + if(!fhinfo.tlfh) { + reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); + return 0; + } + if(!check_management_access(hi, NULL, NULL)) { + reply("HSMSG_ACCESS_DENIED"); + return 0; + } + char *fakehost_name; + if(!strcmp(argv[2], "*")) { + fhinfo.slfh->devnull_id = 0; + fakehost_name = "-"; + } else { + struct devnull_class *th = devnull_find_name(argv[2]); + if(!th) { + reply("OSMSG_DEVNULL_NOTFOUND", argv[2]); + return 0; + } + fhinfo.slfh->devnull_id = th->id; + fakehost_name = th->name; + } + reply("HSMSG_DEVNULL_CLASS", fhinfo.slfh_name, fhinfo.tlfh_name, fakehost_name); + } + return 1; +} + + +struct devnull_class hostserv_get_user_priv(struct handle_info *hi) { + struct devnull_class th; + memset(&th, 0, sizeof(th)); + + struct hs_user *huser = hs_get_user(hi, 0); + if(huser) { + struct hs_assignment *assignment; + struct hs_secondlevel *slfh; + struct devnull_class *devc; + for(assignment = huser->assignments; assignment; assignment = assignment->unext) { + slfh = assignment->secondlevel; + if(slfh->devnull_id) { + devc = devnull_find_id(slfh->devnull_id); + if(!devc) { + slfh->devnull_id = 0; + continue; + } + if(DEVNULL_HAS_PRIV(devc, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < devc->maxchan)) + th.maxchan = devc->maxchan; + if(DEVNULL_HAS_PRIV(devc, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < devc->maxsendq)) + th.maxsendq = devc->maxsendq; + th.modes |= devc->maxsendq; + if(!th.name) + th.name = devc->name; + } + } + } + return th; +} + static void hostserv_conf_read(void) { dict_t conf_node; const char *str; @@ -1311,6 +1392,7 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ struct hs_manager *managerSL; struct hs_user *user; struct dict *object; + char *str; if (rd->type == RECDB_OBJECT) { dict_t db = GET_RECORD_OBJECT(rd); @@ -1318,6 +1400,10 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ slfh = hs_add_secondlevel(tlfh, name); + str = database_get_data(db, KEY_DEVNULL, RECDB_QSTRING); + if(str) + slfh->devnull_id = atoi(str); + if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) { for (it = dict_first(object); it; it = iter_next(it)) { user = hs_get_user(get_handle_info(iter_key(it)), 1); @@ -1392,6 +1478,9 @@ hostserv_saxdb_write(struct saxdb_context *ctx) for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) { saxdb_start_record(ctx, slfh->fakehost, 1); + if(slfh->devnull_id) + saxdb_write_int(ctx, KEY_DEVNULL, slfh->devnull_id); + saxdb_start_record(ctx, KEY_MANAGERS, 1); for(manager = slfh->managers; manager; manager = manager->next) { saxdb_start_record(ctx, manager->user->hi->handle, 0); @@ -1453,7 +1542,11 @@ int hostserv_init() { modcmd_register(hostserv_module, "delhost", cmd_delhost, 2, MODCMD_REQUIRE_AUTHED, NULL); modcmd_register(hostserv_module, "renamehost", cmd_renamehost, 3, MODCMD_REQUIRE_AUTHED, NULL); modcmd_register(hostserv_module, "oset", cmd_oset, 3, MODCMD_REQUIRE_AUTHED, NULL); + modcmd_register(hostserv_module, "setdevnull", cmd_setdevnull, 3, MODCMD_REQUIRE_AUTHED, NULL); message_register_table(msgtab); + + /* "register" own devnull privilege handler */ + devnull_check_priv_func = hostserv_get_user_priv; return 1; } -- 2.20.1