-/* 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.
#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" },
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;
struct hs_toplevel *toplevel;
char *fakehost;
struct hs_manager *managers;
- struct hs_assignment *assignment;
+ struct hs_assignment *assignments;
struct hs_secondlevel *next;
};
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
} 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
/* 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;
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;
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);
}
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];
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");
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);
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);
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);
}
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) {
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;
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