This repository has been archived on 2025-02-12. You can view files and clone it, but cannot push or open issues or pull requests.
NeoStats/dl/operme/operme.c
2002-10-14 01:10:15 +00:00

406 lines
11 KiB
C

/* NeoStats - IRC Statistical Services Copryight (c) 1999-2002 NeoStats Group.
*
** Module: OperMe!
** Description: A network wide OPERing service
** Version: 0.01
** Authors: Shmad
** Sidenote: Some code shamelessly borrowed from HostServ :P~
*/
#include <stdio.h>
#include <fnmatch.h>
#include "dl.h"
#include "stats.h"
#include "om_help.c"
const char omversion_date[] = __DATE__;
const char omversion_time[] = __TIME__;
char *s_OperMe;
typedef struct om_map_ OM_Map;
struct om_map_ {
OM_Map *next, *prev;
char nnick[30];
char host[MAXHOST];
char pass[30];
char flags[40];
};
OM_Map *nnickmap;
char nnick[255];
extern const char *om_help[];
static int om_operme(User *u, char *cmd);
static void om_add(User *u, char *cmd, char *m, char *h, char *f);
static void om_list(User *u);
static void om_del(User *u, char *cmd, char *m, char *h, char *f);
void omlog(char *, ...);
void omdat(char *, ...);
void omomamend(char *, ...);
void Loadopers();
char **LoadArry;
char **DelArry;
char **ListArry;
int LoadArryCount = 0;
int DelArryCount = 0;
int ListArryCount = 0;
Module_Info my_info[] = { {
"OperMe",
"A Network-wide OPERing Service",
"0.01"
} };
int new_m_version(char *av, char *tmp) {
snumeric_cmd(351, av, "Module OperMe! Loaded, Version: %s %s %s",my_info[0].module_version,omversion_date,omversion_time);
return 0;
}
/* Routine For OPERing up */
static int om_operme(User *u, char *cmd) {
char *tmp = NULL;
OM_Map *map;
Loadopers();
if (findbot(u->nick)) return 1;
/* Check HostName Against Data Contained in operme.data */
/* THIS PROC TO CHANGE */
for (map = nnickmap; map; map = map->next) {
if (!strcasecmp(map->nnick, u->nick)) {
if (!strcasecmp(map->pass, cmd)) {
tmp = map->host;
if (fnmatch(strlower(tmp), strlower(u->hostname), 0) == 0) {
/* ssvsmode_cmd(u->nick, map->flags); */
privmsg(u->nick, s_OperMe, "Logged in.");
return 1;
}
}
}
}
return 1;
}
Functions my_fn_list[] = {
{ "VERSION", new_m_version, 1 },
{ NULL, NULL, 0}
};
int __Bot_Message(char *origin, char **av, int ac)
{
User *u;
u = finduser(origin);
if (!strcasecmp(av[1], "HELP")) {
if (ac <= 2 && (!(UserLevel(u) > 40))) {
privmsg(u->nick, s_OperMe, "Permission Denied.");
return 1;
} else if (ac <= 2 && (UserLevel(u) <= 40)) {
privmsg_list(u->nick, s_OperMe, om_help);
return 1;
} else if (!strcasecmp(av[2], "ADD") && (UserLevel(u) >= 40)) {
privmsg_list(u->nick, s_OperMe, om_help_add);
return 1;
} else if (!strcasecmp(av[2], "DEL") && (UserLevel(u) >= 60)) {
privmsg_list(u->nick, s_OperMe, om_help_del);
return 1;
} else if (!strcasecmp(av[2], "LIST") && (UserLevel(u) >= 40)) {
privmsg_list(u->nick, s_OperMe, om_help_list);
return 1;
} else if (!strcasecmp(av[2], "ABOUT") && (UserLevel(u) >= 40)) {
privmsg_list(u->nick, s_OperMe, om_help_about);
return 1;
} else if (!strcasecmp(av[2], "LOGIN")) {
privmsg_list(u->nick, s_OperMe, om_help_login);
return 1;
} else
privmsg(u->nick, s_OperMe, "Unknown Help Topic: \2%s\2", av[2]);
}
if (!strcasecmp(av[1], "ABOUT")) {
privmsg_list(u->nick, s_OperMe, om_help_about);
} else if (!strcasecmp(av[1], "ADD") && (UserLevel(u) >= 40)) {
if (ac < 5) {
privmsg(u->nick, s_OperMe, "Syntax: /msg %s ADD <NICK> <HOST NAME> <VIRTUAL HOST NAME>", s_OperMe);
privmsg(u->nick, s_OperMe, "For addtional help: /msg %s HELP", s_OperMe);
return -1;
}
om_add(u, av[2], av[3], av[4], av[5]);
} else if (!strcasecmp(av[1], "DEL") && (UserLevel(u) >= 60)) {
if (ac < 5) {
privmsg(u->nick, s_OperMe, "Syntax: /msg %s DEL <NICK> <HOST NAME> <VIRTUAL HOST NAME>", s_OperMe);
privmsg(u->nick, s_OperMe, "For addtional help: /msg %s HELP", s_OperMe);
return -1;
}
om_del(u, av[2], av[3], av[4], av[5]);
} else if (!strcasecmp(av[1], "LIST") && (UserLevel(u) >= 40)) {
om_list(u);
} else if (!strcasecmp(av[1], "LOGIN")) {
om_operme(u, av[2]);
} else {
privmsg(u->nick, s_OperMe, "Unknown Command: \2%s\2, perhaps you need some HELP?", av[1]);
}
return 1;
}
int Online(Server *data) {
if (init_bot(s_OperMe,"OperMe",me.name,"Network-wide OPERing Service", "+oikSwgleq-x", my_info[0].module_name) == -1 ) {
/* Nick was in use */
s_OperMe = strcat(s_OperMe, "_");
init_bot(s_OperMe,"OperMe",me.name,"Network-wide OPERing Service", "+oikSwgleq-x", my_info[0].module_name);
}
return 1;
};
EventFnList my_event_list[] = {
{ "ONLINE", Online},
{ NULL, NULL}
};
Module_Info *__module_get_info() {
return my_info;
};
Functions *__module_get_functions() {
return my_fn_list;
};
EventFnList *__module_get_events() {
return my_event_list;
};
void _init() {
s_OperMe = "OperMe";
globops(me.name, "OperMe! Module Loaded",me.name);
Loadopers();
}
void _fini() {
globops(me.name, "OperMe! Module Unloaded",me.name);
};
/* Routine for logging items with the 'omlog' */
void omlog(char *fmt, ...)
{
va_list ap;
FILE *omfile = fopen("logs/OperMe.log", "a");
char buf[512], fmtime[80];
time_t tmp = time(NULL);
va_start(ap, fmt);
vsnprintf(buf, 512, fmt, ap);
strftime(fmtime, 80, "%H:%M[%m/%d/%Y]", localtime(&tmp));
if (!omfile) {
log("Unable to open logs/OperMe.log for writing.");
return;
}
fprintf(omfile, "(%s) %s\n", fmtime, buf);
va_end(ap);
fclose(omfile);
}
/* Routine for registrations with the 'operme.db' file */
void omdat(char *fmt, ...)
{
va_list ap;
FILE *omfile = fopen("data/operme.db", "a");
char buf[512], fmtime[80];
time_t tmp = time(NULL);
va_start(ap, fmt);
vsnprintf(buf, 512, fmt, ap);
strftime(fmtime, 80, "%H:%M[%m/%d/%Y]", localtime(&tmp));
if (!omfile) {
log("Unable to open data/operme.db for writing.");
return;
}
fprintf(omfile, "%s\n", buf);
va_end(ap);
fclose(omfile);
}
/* Routine for creating the 'operme.new' file */
void omamend(char *fmt, ...)
{
va_list ap;
FILE *omamend = fopen("data/operme.new", "a");
char buf[512], fmtime[80];
time_t tmp = time(NULL);
va_start(ap, fmt);
vsnprintf(buf, 512, fmt, ap);
strftime(fmtime, 80, "%H:%M[%m/%d/%Y]", localtime(&tmp));
if (!omamend) {
log("Unable to open data/operme.new for writing.");
return;
}
fprintf(omamend, "%s\n", buf);
va_end(ap);
fclose(omamend);
}
/* Routine for ADD */
static void om_add(User *u, char *cmd, char *m, char *h, char *f) {
strcpy(segv_location, "om_add");
omdat(":%s %s %s %s", cmd, m, h, f);
privmsg(u->nick, s_OperMe, "%s has sucessfuly been registered under hostname: %s password: %s and flags: %s",cmd, m, h, f);
}
/* Routine for 'OperMe' to print out its data */
static void om_list(User *u)
{
FILE *fp;
char buf[512];
strcpy(segv_location, "om_list");
if (!(UserLevel(u) >= 40)) {
omlog("Access Denied (LIST) to %s", u->nick);
privmsg(u->nick, s_OperMe, "Access Denied.");
return;
}
fp = fopen("data/operme.db", "r");
if (!fp) {
privmsg(u->nick, s_OperMe, "Unable to open data/operme.db");
return;
}
while (fgets(buf, sizeof(buf), fp)) {
buf[strlen(buf)] = '\0';
ListArryCount = split_buf(buf, &ListArry, 0);
if (UserLevel(u) > 180) {
privmsg(u->nick, s_OperMe, "%s %s PASSWORD_NOT_DISPLAYED %s", ListArry[0], ListArry[1], ListArry[3]);
} else {
privmsg(u->nick, s_OperMe, "%s %s %s %s", ListArry[0], ListArry[1], ListArry[2], ListArry[3]);
}
}
fclose(fp);
}
/* Routine For Loading The OperMe! O-Lines into Array */
void Loadopers()
{
FILE *fp = fopen("data/operme.db", "r");
OM_Map *map;
char buf[BUFSIZE];
if (fp) {
while (fgets(buf, BUFSIZE, fp)) {
strip(buf);
map = smalloc(sizeof(OM_Map));
LoadArryCount = split_buf(buf, &LoadArry, 0);
strcpy(map->nnick, LoadArry[0]);
strcpy(map->host, LoadArry[1]);
strcpy(map->pass, LoadArry[2]);
strcpy(map->flags, LoadArry[3]);
if (!nnickmap) {
nnickmap = map;
nnickmap->next = NULL;
} else {
map->next = nnickmap;
nnickmap = map;
}
}
fclose(fp);
} else {
chanalert(s_Services, "data/operme.db Database Not Found! Either Add a User or Disable This Function");
}
}
/* Routine for OperMe! to delete the given information */
static void om_del(User *u, char *cmd, char *m, char *h, char *f)
{
FILE *fp = fopen("data/operme.db", "r");
FILE *omtmp;
char buf[BUFSIZE];
char dat[512];
int del_verify = 0;
char *compare = NULL;
strcpy(segv_location, "om_del");
if (!(UserLevel(u) >= 60)) {
omlog("Access Denied To %s To Delete User: %s", u->nick, cmd);
privmsg(u->nick, s_OperMe, "Access Denied To %s To Delete User: %s", u->nick, cmd);
return;
}
omtmp = fopen("data/OperMe.tmp","w");
fprintf(omtmp, ":%s %s %s %s", cmd, m, h, f);
fclose(omtmp);
omtmp = fopen("data/OperMe.tmp", "r");
while (fgets(dat, sizeof(dat), omtmp)) {
buf[strlen(dat)] = '\0';
compare = dat;
}
fclose(omtmp);
remove("data/OperMe.tmp");
if (!fp) {
privmsg(u->nick, s_OperMe, "Unable to open data/operme.db");
return;
}
if (fp) {
while (fgets(buf, BUFSIZE, fp)) {
strip(buf);
if (fnmatch(buf, compare, 0) != 0) {
omamend("%s", buf);
}
if (fnmatch(buf, compare, 0) == 0) {
privmsg(u->nick, s_OperMe, "%s (%s) Was Removed From The OperMe! Database", cmd, h);
del_verify=1;
}
}
fclose(fp);
remove("data/operme.db");
rename("data/operme.new", "data/operme.db");
}
if (!del_verify) {
privmsg(u->nick, s_OperMe, "Sorry, The User '%s' With A Host Of '%s' was unable to be removed from the OperMe! database.", cmd, h);
return;
}
}