Added geoip module.
Modified nterfacer_country to use geoip module.
Added country broadcast to noperserv.
--- /dev/null
+
+.PHONY: all
+all: geoip.so
+
+geoip.so: geoip.o libGeoIP/GeoIP.o
+ ld -shared -Bdynamic -o $@ $^
--- /dev/null
+/*
+ Geoip module
+ Copyright (C) 2004-2006 Chris Porter.
+*/
+
+#include "../nick/nick.h"
+#include "../core/error.h"
+#include "../core/config.h"
+#include "../core/hooks.h"
+#include "../control/control.h"
+
+#include "geoip.h"
+
+int geoip_totals[COUNTRY_MAX + 1];
+int geoip_nickext = -1;
+GeoIP *gi = NULL;
+
+void geoip_setupuser(nick *np);
+
+void geoip_new_nick(int hook, void *args);
+void geoip_quit(int hook, void *args);
+void geoip_whois_handler(int hooknum, void *arg);
+
+void _init(void) {
+ int i;
+ nick *np;
+ sstring *filename;
+
+ filename = getcopyconfigitem("geoip", "db", "GeoIP.dat", 256);
+ gi = GeoIP_new(GEOIP_MEMORY_CACHE, filename->content);
+ freesstring(filename);
+
+ if(!gi)
+ return;
+
+ geoip_nickext = registernickext("geoip");
+ if(geoip_nickext == -1)
+ return; /* PPA: registerchanext produces an error, however the module should stop loading */
+
+ memset(geoip_totals, 0, sizeof(geoip_totals));
+
+ for(i=0;i<NICKHASHSIZE;i++)
+ for(np=nicktable[i];np;np=np->next)
+ geoip_setupuser(np);
+
+ registerhook(HOOK_NICK_LOSTNICK, &geoip_quit);
+ registerhook(HOOK_NICK_NEWNICK, &geoip_new_nick);
+ registerhook(HOOK_CONTROL_WHOISREQUEST, &geoip_whois_handler);
+}
+
+void _fini(void) {
+ if(gi)
+ GeoIP_delete(gi);
+
+ if(geoip_nickext == -1)
+ return;
+
+ releasenickext(geoip_nickext);
+
+ deregisterhook(HOOK_NICK_NEWNICK, &geoip_new_nick);
+ deregisterhook(HOOK_NICK_LOSTNICK, &geoip_quit);
+ deregisterhook(HOOK_CONTROL_WHOISREQUEST, &geoip_whois_handler);
+}
+
+void geoip_setupuser(nick *np) {
+ int country = GeoIP_id_by_ipnum(gi, np->ipaddress);
+ if((country < COUNTRY_MIN) || (country > COUNTRY_MAX))
+ return;
+
+ geoip_totals[country]++;
+ np->exts[geoip_nickext] = (void *)(long)country;
+}
+
+void geoip_new_nick(int hook, void *args) {
+ geoip_setupuser((nick *)args);
+}
+
+void geoip_quit(int hook, void *args) {
+ int item;
+ nick *np = (nick *)args;
+
+ item = (int)((long)np->exts[geoip_nickext]);
+
+ if((item < COUNTRY_MIN) || (item > COUNTRY_MAX))
+ return;
+
+ geoip_totals[item]--;
+}
+
+void geoip_whois_handler(int hooknum, void *arg) {
+ int item;
+ char message[512], *longcountry, *shortcountry, *shortcountry3;
+ nick *np = (nick *)arg;
+
+ if(!np)
+ return;
+
+ item = (int)((long)np->exts[geoip_nickext]);
+ if((item < COUNTRY_MIN) || (item > COUNTRY_MAX))
+ return;
+
+ if(GeoIP_country_info_by_id(item, &shortcountry, &shortcountry3, &longcountry)) {
+ snprintf(message, sizeof(message), "Country : %s (%s)", shortcountry, longcountry);
+ triggerhook(HOOK_CONTROL_WHOISREPLY, message);
+ }
+}
+
--- /dev/null
+#include "libGeoIP/GeoIP.h"
+
+#define COUNTRY_MIN 0
+#define COUNTRY_MAX 246
+
+extern int geoip_totals[COUNTRY_MAX + 1];
+
.PHONY: all
-all: noperserv.so noperserv_commands.so
+all: noperserv.so noperserv_commands.so noperserv_fakeuser.so
noperserv.so: noperserv.o noperserv_db.o noperserv_hooks.o noperserv_policy.o
ld -shared -Bdynamic ${LIBPGSQL} -o $@ $^
noperserv_commands.so: noperserv_commands.o
ld -shared -Bdynamic ${LIBPGSQL} -o $@ $^
+
+noperserv_fakeuser.so: noperserv_fakeuser.o
+ ld -shared -Bdynamic ${LIBPGSQL} -o $@ $^
{ 'O', NL_OPERING }, /* when someone opers */
{ 'n', NL_NOTICES }, /* turn off to receive notices instead of privmsgs */
{ 'A', NL_ALL_COMMANDS }, /* all commands sent */
+ { 'I', NL_MISC }, /* misc stuff */
{ '\0', 0 }
};
noperserv_setup_hooks();
registercontrolhelpcmd("hello", NO_OPERED | NO_AUTHED, 1, &noperserv_hello, "Syntax: HELLO ?nickname|#authname?\nCreates an account on the service for the specified nick, or if one isn't supplied, your nickname.");
- registercontrolhelpcmd("userflags", NO_ACCOUNT, 2, &noperserv_userflags, "Syntax: USERFLAGS <nickname|#authname> ?modifications?\nViews and modifies user permissions.\nIf no nickname or authname is supplied, you are substituted for it.\nIf no flags are supplied, flags are just displayed instead of modified.");
+ registercontrolhelpcmd("userflags", NO_ACCOUNT, 2, &noperserv_userflags,
+ "Syntax: USERFLAGS <nickname|#authname> ?modifications?\n"
+ " Views and modifies user permissions.\n"
+ " If no nickname or authname is supplied, you are substituted for it.\n"
+ " If no flags are supplied, flags are just displayed instead of modified."
+ " Flags:\n"
+ " +o: Operator\n"
+ " +s: Staff member\n"
+ " +S: Security team member\n"
+ " +d: NOperserv developer\n"
+ " +t: Trust queue worker\n"
+ " Additional flags may show up in SHOWCOMMANDS but are not userflags as such:\n"
+ " +r: Authed user\n"
+ " +d: Registered NOperserv user\n"
+ " +L: Legacy command\n"
+ );
registercontrolhelpcmd("noticeflags", NO_ACCOUNT, 1, &noperserv_noticeflags,
"Syntax: NOTICEFLAGS ?(nickname|#authname)|flags?\n"
" This command can view and modify your own notice flags, and view that of other users.\n"
" +h: Shows when glines are played automatically (hits)\n"
" +c: Clone information\n"
" +C: CLEARCHAN command\n"
- " +f: FAKEUSER command\n"
+ " +f: FAKEUSER commands\n"
" +b: BROADCAST commands\n"
" +o: Operation commands, such as insmod, rmmod, die, etc\n"
" +O: /OPER\n"
+ " +I: Misc commands (resync)\n"
" +n: Sends notices instead of privmsgs\n"
- " +A: Every single command sent to the service\n"
+ " +A: Every single command sent to the service (spammy)\n"
);
registercontrolhelpcmd("deluser", NO_OPERED | NO_ACCOUNT, 2, &noperserv_deluser, "Syntax: DELUSER <nickname|#authname>\nDeletes the specified user.");
#include <stdlib.h>\r
#include <stdarg.h>\r
#include <string.h>\r
+#include <strings.h>\r
#include <time.h>\r
\r
#include "../control/control.h"\r
#include "../lib/irc_string.h"\r
#include "../lib/strlfunc.h"\r
#include "../localuser/localuserchannel.h"\r
+#include "../geoip/geoip.h"\r
\r
int controlkill(void *sender, int cargc, char **cargv);\r
int controlopchan(void *sender, int cargc, char **cargv);\r
int controlobroadcast(void *sender, int cargc, char **cargv);\r
int controlmbroadcast(void *sender, int cargc, char **cargv);\r
int controlsbroadcast(void *sender, int cargc, char **cargv);\r
+int controlcbroadcast(void *sender, int cargc, char **cargv);\r
\r
void _init() {\r
registercontrolhelpcmd("kill", NO_OPER, 2, &controlkill, "Usage: kill <nick> ?reason?\nKill specified user with given reason (or 'Killed').");\r
\r
registercontrolhelpcmd("broadcast", NO_OPER, 1, &controlbroadcast, "Usage: broadcast <text>\nSends a message to all users.");\r
registercontrolhelpcmd("obroadcast", NO_OPER, 1, &controlobroadcast, "Usage: obroadcast <text>\nSends a message to all IRC operators.");\r
- registercontrolhelpcmd("mbroadcast", NO_OPER, 2, &controlmbroadcast, "Usage: mbroadcast <mask> <text>\nSends a message to all users matching the mask.");\r
+ registercontrolhelpcmd("mbroadcast", NO_OPER, 2, &controlmbroadcast, "Usage: mbroadcast <mask> <text>\nSends a message to all users matching the mask");\r
registercontrolhelpcmd("sbroadcast", NO_OPER, 2, &controlsbroadcast, "Usage: sbroadcast <mask> <text>\nSends a message to all users on specific server(s).");\r
+ registercontrolhelpcmd("cbroadcast", NO_OPER, 2, &controlcbroadcast, "Usage: sbroadcast <2 letter country> <text>\nSends a message to all users in the specified country (GeoIP must be loaded) .");\r
}\r
\r
void _fini() {\r
return CMD_ERROR;\r
}\r
\r
+ controlwall(NO_OPER, NL_KICKS, "%s/%s RESYNC'ed %s", np->nick, np->authname, cp->index->name->content);\r
+\r
irc_send("%s CM %s o", mynumeric->content, cp->index->name->content);\r
\r
localsetmodeinit(&changes, cp, mynick);\r
if(cargc<2)\r
return CMD_USAGE;\r
\r
- controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a sbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);\r
+ controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an sbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);\r
\r
irc_send("%s O $%s :(sBroadcast) %s", longtonumeric(mynick->numeric,5), cargv[0], cargv[1]);\r
\r
\r
return CMD_OK;\r
}\r
+\r
+const char GeoIP_country_code[247][3] = { "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN","AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","FX","GA","GB","GD","GE","GF","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TM","TN","TO","TP","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","YU","ZA","ZM","ZR","ZW","A1","A2","O1"};\r
+\r
+int controlcbroadcast(void *sender, int cargc, char **cargv) {\r
+ nick *np = (nick *)sender, *nip;\r
+ int i, ext, target;\r
+\r
+ if(cargc < 2)\r
+ return CMD_USAGE;\r
+\r
+ ext = findnickext("geoip");\r
+ if(ext == -1)\r
+ controlreply(np, "Geoip module not loaded.");\r
+\r
+ target = COUNTRY_MIN - 1;\r
+ for(i=COUNTRY_MIN;i<COUNTRY_MAX;i++) {\r
+ if(!strcasecmp(cargv[0], GeoIP_country_code[i])) {\r
+ target = i;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(target == -1) {\r
+ controlreply(np, "Invalid country.");\r
+ return CMD_ERROR;\r
+ }\r
+\r
+ controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a cbroadcast %s: %s", np->nick, np->authname, cargv[0], cargv[1]);\r
+\r
+ for(i=0;i<NICKHASHSIZE;i++)\r
+ for(nip=nicktable[i];nip;nip=nip->next)\r
+ if(nip && ((int)((long)nip->exts[ext]) == target))\r
+ controlnotice(nip, "(cBroadcast) %s", cargv[1]);\r
+\r
+ controlreply(np, "Message cbroadcasted.");\r
+\r
+ return CMD_OK;\r
+}\r
nterfacer_chanstats.so: nterfacer_chanstats.o
ld -shared -Bdynamic -o $@ $^
-nterfacer_country.so: libGeoIP/GeoIP.o nterfacer_country.o
+nterfacer_country.so: nterfacer_country.o
ld -shared -Bdynamic -o $@ $^
nterfacer_spamscan2.so: nterfacer_spamscan2.o
#include "../nick/nick.h"
#include "../core/error.h"
-#include "../core/config.h"
-#include "../core/hooks.h"
+#include "../geoip/geoip.h"
#include "library.h"
#include "nterfacer_control.h"
-#include "libGeoIP/GeoIP.h"
+int country_nickext = -1;
struct handler *hl = NULL, *hl2 = NULL;
-#define COUNTRY_MIN 0
-#define COUNTRY_MAX 246
-
-unsigned int totals[COUNTRY_MAX + 1];
-int country_nickext = -1;
-GeoIP *gi = NULL;
-
-void country_setupuser(nick *np);
int handle_countrytotals(struct rline *li, int argc, char **argv);
int handle_countrywhois(struct rline *li, int argc, char **argv);
-void country_new_nick(int hook, void *args);
-void country_quit(int hook, void *args);
-
void _init(void) {
- int i;
- nick *np;
- sstring *filename;
-
if(!n_node) {
Error("nterfacer_country", ERR_ERROR, "Unable to register country as nterfacer_control isn't loaded!");
return;
}
- filename = getcopyconfigitem("nterfacer", "geoipdb", "GeoIP.dat", 256);
- gi = GeoIP_new(GEOIP_MEMORY_CACHE, filename->content);
- freesstring(filename);
-
- if(!gi)
- return;
-
- country_nickext = registernickext("nterfacer_country");
+ country_nickext = findnickext("geoip");
if(country_nickext == -1)
return; /* PPA: registerchanext produces an error, however the module should stop loading */
hl = register_handler(n_node, "countrytotals", 0, handle_countrytotals);
hl2 = register_handler(n_node, "countrywhois", 1, handle_countrywhois);
- memset(totals, 0, sizeof(totals));
-
- for(i=0;i<NICKHASHSIZE;i++) {
- for(np=nicktable[i];np;np=np->next) {
- country_setupuser(np);
- }
- }
-
- registerhook(HOOK_NICK_LOSTNICK, &country_quit);
- registerhook(HOOK_NICK_NEWNICK, &country_new_nick);
}
void _fini(void) {
- if(gi)
- GeoIP_delete(gi);
-
if(country_nickext == -1)
return;
- releasenickext(country_nickext);
-
- deregisterhook(HOOK_NICK_NEWNICK, &country_new_nick);
- deregisterhook(HOOK_NICK_LOSTNICK, &country_quit);
-
if(hl2)
deregister_handler(hl2);
if(hl)
int handle_countrytotals(struct rline *li, int argc, char **argv) {
int i;
for(i=COUNTRY_MIN;i<=COUNTRY_MAX;i++)
- if(ri_append(li, "%d", totals[i]) == BF_OVER)
+ if(ri_append(li, "%d", geoip_totals[i]) == BF_OVER)
return ri_error(li, BF_OVER, "Buffer overflow.");
return ri_final(li);
}
-void country_setupuser(nick *np) {
- int country = GeoIP_id_by_ipnum(gi, np->ipaddress);
- if((country < COUNTRY_MIN) || (country > COUNTRY_MAX))
- return;
-
- totals[country]++;
- np->exts[country_nickext] = (void *)&totals[country];
-}
-
-void country_new_nick(int hook, void *args) {
- country_setupuser((nick *)args);
-}
-
-void country_quit(int hook, void *args) {
- nick *np = (nick *)args;
-
- unsigned int *item;
- if((item = (unsigned int *)np->exts[country_nickext]))
- (*item)--;
-}
-
int handle_countrywhois(struct rline *li, int argc, char **argv) {
int result;
char *longcountry, *shortcountry, *shortcountry3;
if(!np)
return ri_error(li, ERR_TARGET_NOT_FOUND, "User not online");
- result = GeoIP_id_by_ipnum(gi, np->ipaddress);
+ result = (int)((long)np->exts[country_nickext]);
if((result < COUNTRY_MIN) || (result > COUNTRY_MAX))
result = -1;