Merge branch 'HostServ' of ssh://git.pk910.de:16110/srvx into HostServ
authorNurPech <nurpech@nurpech.de>
Mon, 7 Jan 2013 20:44:11 +0000 (21:44 +0100)
committerNurPech <nurpech@nurpech.de>
Mon, 7 Jan 2013 20:44:11 +0000 (21:44 +0100)
1  2 
src/mod-hostserv.c

diff --combined src/mod-hostserv.c
index 29ef3e3f442c479b591b02376bc7ab60667c9036,db4feb53f3dd01b545aacbcf80f240a78633f73e..234d6100a028cb08bcd1f418fc541cb1b7394a75
@@@ -112,8 -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 };
@@@ -969,8 -967,20 +969,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;
  }
@@@ -1150,58 -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;
      
      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));
@@@ -1430,7 -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;
  }