fixed hostserv functions & continued basic functions
authorNurPech <NurPech@nextirc.net>
Tue, 1 Jan 2013 18:12:56 +0000 (19:12 +0100)
committerNurPech <NurPech@nextirc.net>
Tue, 1 Jan 2013 18:12:56 +0000 (19:12 +0100)
src/mod-hostserv.c

index 6dd35d020070c448ec15a6329465f3e9f551f279..a66c91dd29e38f1e0739ba2d6ea43b41c36a4467 100644 (file)
@@ -1,4 +1,4 @@
-/* mod-watchdog.c - Watchdog module for srvx
+/* mod-hostserv.c - HostServ module for srvx
  * Copyright 2003-2004 Martijn Smit and srvx Development Team
  *
  * This file is part of srvx.
@@ -44,8 +44,6 @@
 #define KEY_FAKEHOST "fakehost"
 #define KEY_ASSIGNMENTS "assignments"
 
-
-
 static const struct message_entry msgtab[] = {
     { "HSMSG_ASSIGNED_FAKEHOSTS", "Assigned Fakehosts for User $b%s$b:" },
     { "HSMSG_ASSIGNED_FAKEHOST", "  $b%s.%s$b" },
@@ -80,9 +78,13 @@ static struct {
 
 const char *hostserv_module_deps[] = { NULL };
 struct userNode *hostserv;
+struct helpfile *hostserv_helpfile;
 static struct module *hostserv_module;
 static struct service *hostserv_service;
-static struct log_type *MS_LOG;
+static dict_t hostserv_func_dict;
+static int shutting_down;
+static FILE *reqlog_f;
+static struct log_type *HS_LOG;
 static struct hs_toplevel *toplevels = NULL;
 static struct hs_user *hostserv_users = NULL;
 
@@ -98,7 +100,7 @@ struct hs_secondlevel {
     struct hs_toplevel *toplevel;
     char *fakehost;
     struct hs_manager *managers;
-    struct hs_assignment *assignment;
+    struct hs_assignment *assignments;
     struct hs_secondlevel *next;
 };
 
@@ -258,7 +260,7 @@ static void hs_del_manager(struct hs_manager *manager, int remove_from_object) {
         if(manager->type == 1) {
             struct hs_toplevel *tlfh = manager->object;
             for(cmanager = tlfh->managers; cmanager; cmanager = cmanager->next) {
-                if(cmanager = manager) {
+                if(cmanager == manager) {
                     if(prev_manager)
                         prev_manager->next = manager->next;
                     else
@@ -270,7 +272,7 @@ static void hs_del_manager(struct hs_manager *manager, int remove_from_object) {
         } else if(manager->type == 2) {
             struct hs_secondlevel *slfh = manager->object;
             for(cmanager = slfh->managers; cmanager; cmanager = cmanager->next) {
-                if(cmanager = manager) {
+                if(cmanager == manager) {
                     if(prev_manager)
                         prev_manager->next = manager->next;
                     else
@@ -397,8 +399,9 @@ static void hs_del_user(struct hs_user *user) {
 
 /* END OF MANAGEMENT FUNCTIONS */
 
-static int check_management_access(struct handle_info *hi, struct hs_toplevel *tlfh, struct hs_toplevel *slfh) {
-    if(!hi) 
+static int check_management_access(struct handle_info *hi, struct hs_toplevel *tlfh, struct hs_secondlevel *slfh) {
+    tlfh = NULL;
+       if(!hi) 
         return 0;
     if(hi->opserv_level >= hostserv_conf.toplevel_access) 
         return 1;
@@ -407,13 +410,13 @@ static int check_management_access(struct handle_info *hi, struct hs_toplevel *t
         return 0;
     struct hs_manager *manager;
     if(slfh) {
-        for(manager = huser->managements; manager; manager = manager->next) {
+        for(manager = user->managements; manager; manager = manager->next) {
             if(manager->type == 2 && manager->object == slfh) 
                 return 1;
         }
     }
-    for(manager = huser->managements; manager; manager = manager->next) {
-        if(manager->type == 1 && manager->object == tlfh) 
+    for(manager = user->managements; manager; manager = manager->next) {
+        if(manager->type == 1 && manager->object == slfh) 
             return 1;
     }
     return 0;
@@ -433,7 +436,7 @@ static void cmd_view_toplevel_information(UNUSED_ARG(struct userNode *user), UNU
             managers++;
         struct hs_assignment *assignment;
         int assignments = 0;
-        for(assignment = slfh->assignment; assignment; assignment = assignment->next)
+        for(assignment = slfh->assignments; assignment; assignment = assignment->next)
             assignments++;
         reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers);
     }
@@ -458,12 +461,12 @@ static void cmd_view_toplevel_information(UNUSED_ARG(struct userNode *user), UNU
 static void cmd_view_secondlevel_information(UNUSED_ARG(struct userNode *user), UNUSED_ARG(struct svccmd *cmd), struct hs_secondlevel *slfh) {
     reply("HSMSG_FAKEHOST_ASSIGNMENTS", slfh->fakehost, slfh->toplevel->fakehost);
     struct hs_assignment *assignment;
-    for(assignment = slfh->assignment; assignment; assignment = assignment->next) {
+    for(assignment = slfh->assignments; assignment; assignment = assignment->next) {
         reply((assignment->active ? "HSMSG_FAKEHOST_ASSIGNMENT_ACTIVE" : "HSMSG_FAKEHOST_ASSIGNMENT"), assignment->user->hi->handle, assignment->user->hi->handle, slfh->fakehost, slfh->toplevel->fakehost);
     }
     reply("HSMSG_MANAGERS_FAKEHOST", slfh->fakehost, slfh->toplevel->fakehost);
     struct hs_manager *cmanager;
-    if(!tlfh->managers)
+    if(!slfh->managers)
         reply("HSMSG_ASSIGNED_NONE");
     else {
         char managerBuf[351];
@@ -484,7 +487,7 @@ static MODCMD_FUNC(cmd_view) {
     struct handle_info *hi;
     if(argc >= 2 && !strchr(argv[1], '.')) {
         if (!(hi = modcmd_get_handle_info(user, argv[1])))
-            return 0
+            return 0;
     } else if(argc >= 2) {
         if (!(hi = user->handle_info)) {
             reply("NSMSG_MUST_AUTH");
@@ -553,7 +556,7 @@ static MODCMD_FUNC(cmd_view) {
             int slfhs = 0, assignments = 0;
             for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
                 slfhs++;
-                for(assignment = slfh->assignment; assignment; assignment = assignment->next)
+                for(assignment = slfh->assignments; assignment; assignment = assignment->next)
                     assignments++;
             }
             reply("HSMSG_MANAGED_TOPLEVEL", tlfh->fakehost, slfhs, assignments);
@@ -570,7 +573,7 @@ static MODCMD_FUNC(cmd_view) {
                 int slfhs = 0, assignments = 0;
                 for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
                     slfhs++;
-                    for(assignment = slfh->assignment; assignment; assignment = assignment->next)
+                    for(assignment = slfh->assignments; assignment; assignment = assignment->next)
                         assignments++;
                 }
                 reply("HSMSG_MANAGED_TOPLEVEL", tlfh->fakehost, slfhs, assignments);
@@ -588,7 +591,7 @@ static MODCMD_FUNC(cmd_view) {
                 if(cmanager) continue;
                 struct hs_assignment *assignment;
                 int assignments = 0;
-                for(assignment = slfh->assignment; assignment; assignment = assignment->next)
+                for(assignment = slfh->assignments; assignment; assignment = assignment->next)
                     assignments++;
                 reply("HSMSG_MANAGED_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments);
             }
@@ -602,67 +605,69 @@ static MODCMD_FUNC(cmd_view) {
 static MODCMD_FUNC(cmd_addmanager) {
     struct handle_info *hi;
     char *fakehost;
-    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(argc >= 2) {
+           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];
+           }
+           char *slfh_name = fakehost;
+           char *tlfh_name = strchr(fakehost, '.');
+           *tlfh_name = '\0';
+           tlfh_name++;
+           if(strchr(tlfh_name, '.')) {
+               reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
+               return 0;
+           }
+           struct hs_toplevel *tlfh;
+           struct hs_secondlevel *slfh = NULL;
+           for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
+               if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
+           }
+           if(!tlfh) {
+               reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
+               return 0;
+           }
+           if(!irccasecmp(slfh_name, "*")) {
+               if(!check_management_access(user->handle_info, tlfh, NULL)) {
+                   reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
+                   return 0;
+               }
+           } else {
+               for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
+                   if(!irccasecmp(slfh->fakehost, slfh_name)) break;
+               }
+               if(!slfh || !check_management_access(user->handle_info, tlfh, slfh)) {
+                   reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
+                   return 0;
+               }
+           }
+           struct hs_user *huser = hs_get_user(hi, 1);
+           struct hs_manager *manager;
+           if(slfh) {
+               for(manager = huser->managements; manager; manager = manager->next) {
+                   if(manager->type == 2 && manager->object == slfh) {
+                       reply("HSMSG_MANAGER_ALREADY", hi->handle, slfh_name, tlfh_name);
+                       return 0;
+                   }
+               }
+           }
+           for(manager = huser->managements; manager; manager = manager->next) {
+               if(manager->type == 1 && manager->object == tlfh) {
+                   reply("HSMSG_MANAGER_ALREADY", hi->handle, "*", tlfh_name);
+                   return 0;
+               }
+           }
+           if(slfh)
+               hs_add_manager_secondlevel(slfh, huser);
+           else
+               hs_add_manager_toplevel(tlfh, huser);
+           reply("HSMSG_MANAGER_ADDED", hi->handle, slfh_name, tlfh_name);
     }
-    char *slfh_name = fakehost;
-    char *tlfh_name = strchr(fakehost, '.');
-    *tlfh_name = '\0';
-    tlfh_name++;
-    if(strchr(tlfh_name, '.')) {
-        reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
-        return 0;
-    }
-    struct hs_toplevel *tlfh;
-    struct hs_secondlevel *slfh = NULL;
-    for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
-        if(!irccasecmp(tlfh->fakehost, tlfh_name)) break;
-    }
-    if(!tlfh) {
-        reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
-        return 0;
-    }
-    if(!irccasecmp(slfh_name, "*")) {
-        if(!check_management_access(user->handle_info, tlfh, NULL)) {
-            reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
-            return 0;
-        }
-    } else {
-        for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
-            if(!irccasecmp(slfh->fakehost, slfh_name)) break;
-        }
-        if(!slfh || !check_management_access(user->handle_info, tlfh, slfh)) {
-            reply("HSMSG_UNKNOWN_FAKEHOST", slfh_name, tlfh_name);
-            return 0;
-        }
-    }
-    struct hs_user *huser = hs_get_user(hi, 1);
-    struct hs_manager *manager;
-    if(slfh) {
-        for(manager = huser->managements; manager; manager = manager->next) {
-            if(manager->type == 2 && manager->object == slfh) {
-                reply("HSMSG_MANAGER_ALREADY", hi->handle, slfh_name, tlfh_name);
-                return 0;
-            }
-        }
-    }
-    for(manager = huser->managements; manager; manager = manager->next) {
-        if(manager->type == 1 && manager->object == tlfh) {
-            reply("HSMSG_MANAGER_ALREADY", hi->handle, "*", tlfh_name);
-            return 0;
-        }
-    }
-    if(slfh)
-        hs_add_manager_secondlevel(slfh, huser);
-    else
-        hs_add_manager_toplevel(tlfh, huser);
-    reply("HSMSG_MANAGER_ADDED", hi->handle, slfh_name, tlfh_name);
 }
 
 static MODCMD_FUNC(cmd_delmanager) {
@@ -670,11 +675,11 @@ static MODCMD_FUNC(cmd_delmanager) {
     char *fakehost;
     if(!strchr(argv[1], '.')) {
         if (!(hi = modcmd_get_handle_info(user, argv[1])))
-            return 0
+            return 0;
         fakehost = argv[2];
     } else {
         if (!(hi = modcmd_get_handle_info(user, argv[2])))
-            return 0
+            return 0;
         fakehost = argv[1];
     }
     char *slfh_name = fakehost;
@@ -737,12 +742,67 @@ static MODCMD_FUNC(cmd_delmanager) {
     reply("HSMSG_MANAGER_DELETED", hi->handle, slfh_name, tlfh_name);
 }
 
+static int hostserv_saxdb_read(struct dict *conf_db) {
+       return 1;
+}
 
+static int hostserv_saxdb_write(struct saxdb_context *ctx) {
+       
+       return 0;
+}
 
+static void hostserv_conf_read(void)
+{
+    dict_t conf_node;
+    const char *str;
 
+    str = "modules/hostserv";
+    if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) {
+        log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str);
+        return;
+    }
 
+    str = database_get_data(conf_node, "nick", RECDB_QSTRING);
+    if(hostserv_conf.nick && strcmp(hostserv_conf.nick, str)) {
+        //nick changed
+    }
+    hostserv_conf.nick = str;
+    
+    str = database_get_data(conf_node, "modes", RECDB_QSTRING);
+    hostserv_conf.modes = (str ? str : NULL);
+    
+    /*str = database_get_data(conf_node, "description", RECDB_QSTRING);
+    hostserv_conf.description = (str ? str : NULL);*/
+}
 
+static void hostserv_db_cleanup(void) {
+    shutting_down=1;
+    close_helpfile(hostserv_helpfile);
+    dict_delete(hostserv_func_dict);
 
-/* to be continued - some day in the future - maybe? */
+    if (reqlog_f)
+        fclose(reqlog_f);
+}
 
+/* to be continued - some day in the future - maybe? */
+int hostserv_init() {
+       HS_LOG = log_register_type("HostServ", "file:hostserv.log");
+       hostserv_func_dict = dict_new();
+       /*dict_set_free_data(hosts, delete_memo_account);*/
+       /*reg_auth_func(hostserv_check_messages);
+       reg_handle_rename_func(hostserv_rename_account);
+       reg_unreg_func(hostserv_unreg_account);*/
+       conf_register_reload(hostserv_conf_read);
+       reg_exit_func(hostserv_db_cleanup);
+       saxdb_register("HostServ", hostserv_saxdb_read, hostserv_saxdb_write);
+       hostserv_module = module_register("HostServ", HS_LOG, "mod-hostserv.help", NULL);
+       modcmd_register(hostserv_module, "view", cmd_view, 3, MODCMD_REQUIRE_AUTHED, NULL);
+       modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 1, MODCMD_REQUIRE_AUTHED, NULL);
+       modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 2, MODCMD_REQUIRE_AUTHED, NULL);
+       message_register_table(msgtab);
+       return 1;
+}
 
+int hostserv_finalize(void) {
+    return 1;
+}
\ No newline at end of file