fixed NULL pointer crash when returning to default fakehost
[srvx.git] / src / mod-hostserv.c
index fbba68cb27893f073f10ab5f17c20b3a4cebfe61..291fac2dc60d61f3d73f66c9a5e13f344b13e0e4 100644 (file)
  *     "hostserv" {
  *         "nick" "HostServ";
  *         "modes" "+iok";
-           "toplevel_access" "600";
+ *         "toplevel_access" "600";
+ *         "fallback_other_assignment" "1"; //fall back to another assignment when active assignment gets removed
+ *         "manager_can_del_toplevel" "0"; //managers of a toplevel group may delete the whole group
+ *         "manager_can_del_secondlevel" "0"; //managers of a secondlevel group may delete the whole group
  *     };
  *  };
  *
@@ -81,6 +84,7 @@ static const struct message_entry msgtab[] = {
     { "HSMSG_MANAGER_NOT", "$b%s$b is not a manager of %s.%s" },
     { "HSMSG_MANAGER_DELETED", "$b%s$b is no longer a manager of %s.%s" },
     { "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." },
     
     { NULL, NULL }
@@ -338,7 +342,7 @@ static void hs_activate_assignment(struct hs_user *user, struct hs_assignment *a
     assert((!assignment || (assignment->user == user)));
     
     if(user->assignments) {
-        for(assgn = assignment->user->assignments; assgn; assgn = assgn->unext)
+        for(assgn = user->assignments; assgn; assgn = assgn->unext)
             assgn->active = 0;
     }
     
@@ -706,7 +710,7 @@ static MODCMD_FUNC(cmd_addhost) {
     if(!irccasecmp(slfh_name, "*")) {
         if(!check_management_access(hi, NULL, NULL)) {
             reply("HSMSG_ACCESS_DENIED");
-            return NULL;
+            return 0;
         }
         for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
             if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
@@ -950,7 +954,6 @@ static MODCMD_FUNC(cmd_set) {
     struct handle_info *hi;
     struct hs_user *hs_user;
     struct hs_assignment *assignment;
-    struct hs_assignment *assgn;
     struct hs_toplevel *tlfh;
     struct hs_secondlevel *slfh;
     char *fakehost;
@@ -1034,6 +1037,10 @@ static MODCMD_FUNC(cmd_assign) {
                         reply("HSMSG_ACCESS_DENIED");
                         return 0;
                     }
+                    if(hs_get_assignment(slfh, hs_user)) {
+                        reply("HSMSG_FAKEHOST_ASSIGNED", slfh_name, tlfh_name);
+                        return 0;
+                    }
                     hs_add_assignment(slfh, hs_user);
                     reply("HSMSG_FAKEHOST_ASSIGN_SUCCESS", slfh_name, tlfh_name);
                     return 1;