X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fmod-hostserv.c;h=5e30ed9f929e6ae1b08205da09a3ee41b4c33641;hb=6581a4797de9bf410a06c70b3d586fd842365c99;hp=29ef3e3f442c479b591b02376bc7ab60667c9036;hpb=ac567991f64b672b38bbcba48294bf6f6bff6228;p=srvx.git diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index 29ef3e3..5e30ed9 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -29,6 +29,8 @@ * "manager_can_del_toplevel" "0"; //managers of a toplevel group may delete the whole group * "manager_can_rename_secondlevel" "0"; //managers of a secondlevel group may rename the whole group * "manager_can_del_secondlevel" "0"; //managers of a secondlevel group may delete the whole group + * "manager_toplevel_can_oset" "0"; //managers of a toplevel group can set other user's fakehosts + * "manager_secondlevel_can_oset" "0"; //managers of a secondlevel group can set other user's fakehosts * }; * }; * @@ -772,13 +774,13 @@ static MODCMD_FUNC(cmd_view) { reply("HSMSG_MANAGED_TOPLEVEL", tlfh->fakehost, slfhs, assignments); } } - for(manager = huser->managements; manager; manager = manager->next) { + for(manager = huser->managements; manager; manager = manager->unext) { if(manager->type == 2) { struct hs_secondlevel *slfh = manager->object; struct hs_toplevel *tlfh = slfh->toplevel; //check if the user is already a manager of the tlfh struct hs_manager *cmanager; - for(cmanager = tlfh->managers; cmanager; cmanager = cmanager->next) { + for(cmanager = tlfh->managers; cmanager; cmanager = cmanager->unext) { if(cmanager->user == huser) break; } if(cmanager) continue; @@ -969,8 +971,20 @@ static MODCMD_FUNC(cmd_addmanager) { } if(fhinfo.slfh) hs_add_manager_secondlevel(fhinfo.slfh, huser); - else + else { hs_add_manager_toplevel(fhinfo.tlfh, huser); + //remove from all slfh's + struct hs_manager *next_manager; + struct hs_secondlevel *slfh; + for(manager = huser->managements; manager; manager = next_manager) { + next_manager = manager->next; + if(manager->type == 2) { + slfh = manager->object; + if(slfh->toplevel == fhinfo.tlfh) + hs_del_manager(manager, 1); + } + } + } reply("HSMSG_MANAGER_ADDED", hi->handle, fhinfo.slfh_name, fhinfo.tlfh_name); return 1; } @@ -1153,7 +1167,7 @@ static MODCMD_FUNC(cmd_unassign) { static MODCMD_FUNC(cmd_oset) { struct handle_info *hi; char *fakehost; - struct hs_assignment *assgn; + struct hs_assignment *assignment; if(!strchr(argv[1], '.')) { if (!(hi = modcmd_get_handle_info(user, argv[1]))) return 0; @@ -1167,27 +1181,35 @@ static MODCMD_FUNC(cmd_oset) { reply("NSMSG_MUST_AUTH"); return 0; } - if(!strcmp(argv[1], "*")) { - if(!check_management_access(user->handle_info)) { - reply("HSMSG_ACCESS_DENIED"); - return 0; - } + struct hs_user *hs_user = hs_get_user(hi, 1); + for(assignment = hs_user->assignments; assignment; assignment = assignment->unext) { + if(assignment->active) + break; + } + if(assignment && !check_management_access(user->handle_info, (hostserv_conf.manager_toplevel_can_oset ? assignment->secondlevel->toplevel : NULL), (hostserv_conf.manager_secondlevel_can_oset ? assignment->secondlevel : NULL))) { + reply("HSMSG_ACCESS_DENIED"); + return 0; + } + if(!strcmp(fakehost, "*")) { + if(!assignment) + return 0; //simply ignore (there is no assignment in use) hs_activate_assignment(hs_user, NULL); return 1; } else { - struct hs_fakehost_info fhinfo = parse_fakehost_info(fakehost, 1); + struct hs_fakehost_info fhinfo = parse_fakehost_info(fakehost, 1); if(fhinfo.parse_state == HS_FHPARSE_INVALID) { reply("HSMSG_TOPLEVEL_INVALID", fakehost); return 0; } else if(fhinfo.parse_state == HS_FHPARSE_UNKNOWN || !fhinfo.slfh) { - reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); - return 0; + reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); + return 0; } - struct hs_user *hs_user = hs_get_user(hi, 1); if(!check_management_access(user->handle_info, (hostserv_conf.manager_toplevel_can_oset ? fhinfo.tlfh : NULL), (hostserv_conf.manager_secondlevel_can_oset ? fhinfo.slfh : NULL))) { reply("HSMSG_ACCESS_DENIED"); return 0; } + struct hs_toplevel *tlfh; + struct hs_secondlevel *slfh; for(assignment = hs_user->assignments; assignment; assignment = assignment->unext) { slfh = assignment->secondlevel; tlfh = slfh->toplevel; @@ -1199,7 +1221,7 @@ static MODCMD_FUNC(cmd_oset) { } reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); return 0; - } + } } static void hostserv_conf_read(void) { @@ -1222,29 +1244,29 @@ static void hostserv_conf_read(void) { hostserv_conf.modes = (str ? str : NULL); str = database_get_data(conf_node, "toplevel_access", RECDB_QSTRING); - unsigned int toplevel_access = atoi(str); + unsigned int toplevel_access = (str ? atoi(str) : 0); hostserv_conf.toplevel_access = (toplevel_access ? toplevel_access : 600); str = database_get_data(conf_node, "fallback_other_assignment", RECDB_QSTRING); - hostserv_conf.fallback_other_assignment = (atoi(str) ? 1 : 0); + hostserv_conf.fallback_other_assignment = (str && atoi(str) ? 1 : 0); str = database_get_data(conf_node, "manager_can_del_toplevel", RECDB_QSTRING); - hostserv_conf.manager_can_del_toplevel = (atoi(str) ? 1 : 0); + hostserv_conf.manager_can_del_toplevel = (str && atoi(str) ? 1 : 0); str = database_get_data(conf_node, "manager_can_del_secondlevel", RECDB_QSTRING); - hostserv_conf.manager_can_del_secondlevel = (atoi(str) ? 1 : 0); + hostserv_conf.manager_can_del_secondlevel = (str && atoi(str) ? 1 : 0); str = database_get_data(conf_node, "manager_can_rename_toplevel", RECDB_QSTRING); - hostserv_conf.manager_can_rename_toplevel = (atoi(str) ? 1 : 0); + hostserv_conf.manager_can_rename_toplevel = (str && atoi(str) ? 1 : 0); str = database_get_data(conf_node, "manager_can_rename_secondlevel", RECDB_QSTRING); - hostserv_conf.manager_can_rename_secondlevel = (atoi(str) ? 1 : 0); - - str = database_get_data(conf_node, "manager_toplevel_can_oset", RECDB_QSTRING); - hostserv_conf.manager_toplevel_can_oset = (atoi(str) ? 1 : 0); - + hostserv_conf.manager_can_rename_secondlevel = (str && atoi(str) ? 1 : 0); + + str = database_get_data(conf_node, "manager_toplevel_can_oset", RECDB_QSTRING); + hostserv_conf.manager_toplevel_can_oset = (str && atoi(str) ? 1 : 0); + str = database_get_data(conf_node, "manager_secondlevel_can_oset", RECDB_QSTRING); - hostserv_conf.manager_secondlevel_can_oset = (atoi(str) ? 1 : 0); + hostserv_conf.manager_secondlevel_can_oset = (str && atoi(str) ? 1 : 0); } static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra));