Merge branch 'HostServ' of ssh://git.pk910.de:16110/srvx into HostServ
[srvx.git] / src / mod-hostserv.c
index db4feb53f3dd01b545aacbcf80f240a78633f73e..234d6100a028cb08bcd1f418fc541cb1b7394a75 100644 (file)
@@ -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;
 }