From: NurPech Date: Tue, 1 Jan 2013 18:12:56 +0000 (+0100) Subject: fixed hostserv functions & continued basic functions X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=4fcfdd582658f789ea55cfb5c40a301175b9627a fixed hostserv functions & continued basic functions --- diff --git a/src/mod-hostserv.c b/src/mod-hostserv.c index 6dd35d0..a66c91d 100644 --- a/src/mod-hostserv.c +++ b/src/mod-hostserv.c @@ -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