X-Git-Url: http://git.pk910.de/?p=srvx.git;a=blobdiff_plain;f=src%2Fmod-hostserv.c;h=234d6100a028cb08bcd1f418fc541cb1b7394a75;hp=db4feb53f3dd01b545aacbcf80f240a78633f73e;hb=80d9ed728be4b02ac483f3339cbb184f6602d15b;hpb=bbe8f3f0bc1ae7c41fb2d1799f9e8fe46d0e5e04 diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index db4feb5..234d610 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -112,6 +112,8 @@ static struct { int manager_can_del_secondlevel : 1; int manager_can_rename_toplevel : 1; int manager_can_rename_secondlevel : 1; + int manager_toplevel_can_oset : 1; + int manager_secondlevel_can_oset : 1; } hostserv_conf; const char *hostserv_module_deps[] = { NULL }; @@ -1160,6 +1162,58 @@ static MODCMD_FUNC(cmd_unassign) { return 1; } +static MODCMD_FUNC(cmd_oset) { + struct handle_info *hi; + char *fakehost; + struct hs_assignment *assgn; + if(!strchr(argv[1], '.')) { + if (!(hi = modcmd_get_handle_info(user, argv[1]))) + return 0; + fakehost = argv[2]; + } else { + if (!(hi = modcmd_get_handle_info(user, argv[2]))) + return 0; + fakehost = argv[1]; + } + if (!user->handle_info) { + reply("NSMSG_MUST_AUTH"); + return 0; + } + if(!strcmp(argv[1], "*")) { + if(!check_management_access(user->handle_info)) { + reply("HSMSG_ACCESS_DENIED"); + return 0; + } + hs_activate_assignment(hs_user, NULL); + return 1; + } else { + 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; + } + 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; + } + for(assignment = hs_user->assignments; assignment; assignment = assignment->unext) { + slfh = assignment->secondlevel; + tlfh = slfh->toplevel; + if(tlfh == fhinfo.tlfh && slfh == fhinfo.slfh) { + hs_activate_assignment(hs_user, assignment); + reply("HSMSG_FAKEHOST_SET_SUCCESS", slfh->fakehost, tlfh->fakehost); + return 1; + } + } + reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name); + return 0; + } +} + static void hostserv_conf_read(void) { dict_t conf_node; const char *str; @@ -1197,9 +1251,12 @@ static void hostserv_conf_read(void) { 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, "description", RECDB_QSTRING); - hostserv_conf.description = (str ? str : NULL);*/ + + str = database_get_data(conf_node, "manager_toplevel_can_oset", RECDB_QSTRING); + hostserv_conf.manager_toplevel_can_oset = (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); } static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra)); @@ -1385,6 +1442,7 @@ int hostserv_init() { modcmd_register(hostserv_module, "addhost", cmd_addhost, 2, MODCMD_REQUIRE_AUTHED, NULL); 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); message_register_table(msgtab); return 1; }