]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Added misc flag to noperserv.
authorChris Porter <redacted>
Sat, 11 Feb 2006 01:32:00 +0000 (01:32 +0000)
committerChris Porter <redacted>
Sat, 11 Feb 2006 01:32:00 +0000 (01:32 +0000)
Added geoip module.
Modified nterfacer_country to use geoip module.
Added country broadcast to noperserv.

geoip/Makefile [new file with mode: 0644]
geoip/geoip.c [new file with mode: 0644]
geoip/geoip.h [new file with mode: 0644]
geoip/libGeoIP/GeoIP.c [moved from nterface/libGeoIP/GeoIP.c with 100% similarity]
geoip/libGeoIP/GeoIP.h [moved from nterface/libGeoIP/GeoIP.h with 100% similarity]
noperserv/Makefile
noperserv/noperserv.c
noperserv/noperserv_commands.c
nterface/Makefile
nterface/nterfacer_country.c

diff --git a/geoip/Makefile b/geoip/Makefile
new file mode 100644 (file)
index 0000000..68f7794
--- /dev/null
@@ -0,0 +1,6 @@
+
+.PHONY: all
+all: geoip.so
+
+geoip.so: geoip.o libGeoIP/GeoIP.o
+       ld -shared -Bdynamic -o $@ $^
diff --git a/geoip/geoip.c b/geoip/geoip.c
new file mode 100644 (file)
index 0000000..47f3024
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+  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);
+  }
+}
+
diff --git a/geoip/geoip.h b/geoip/geoip.h
new file mode 100644 (file)
index 0000000..0d5f9fc
--- /dev/null
@@ -0,0 +1,7 @@
+#include "libGeoIP/GeoIP.h"
+
+#define COUNTRY_MIN 0
+#define COUNTRY_MAX 246
+
+extern int geoip_totals[COUNTRY_MAX + 1];
+
index 7d4b879fbe8c4cf5d54a389ab23444007505273c..7edabd1fe6b17b4aaf8611c40f7c5dbe5bfea7a6 100644 (file)
@@ -1,9 +1,12 @@
 
 .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 $@ $^
index 43b160060323d712648f97bbd113bf2f133771ed..bd793c06cf5e1cab0e62b86cc60563c5bfbc4df5 100644 (file)
@@ -60,6 +60,7 @@ const flag no_noticeflags[] = {
     { '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 }
   };
 
@@ -81,7 +82,22 @@ void _init() {
   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"
@@ -94,12 +110,13 @@ void _init() {
     "  +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.");
index b3bba801fdb781ef1a168068e562dd72f8c5bb7b..0f2fa25a937d867482dde38cb04cfd756024aef1 100644 (file)
@@ -2,6 +2,7 @@
 #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
@@ -9,6 +10,7 @@
 #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
@@ -20,6 +22,7 @@ int controlbroadcast(void *sender, int cargc, char **cargv);
 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
@@ -33,8 +36,9 @@ void _init() {
 \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
@@ -113,6 +117,8 @@ int controlresync(void *sender, int cargc, char **cargv) {
     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
@@ -254,7 +260,7 @@ int controlsbroadcast(void *sender, int cargc, char **cargv) {
   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
@@ -281,3 +287,41 @@ int controlobroadcast(void *sender, int cargc, char **cargv) {
 \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
index 6fea4e421a86a266a868a2d5613bc9f9f6ffebbe..459e474951b2a28eff521cba57a2f6a762ab99e4 100644 (file)
@@ -14,7 +14,7 @@ nterfacer_relay.so: nterfacer_relay.o
 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
index f91893abdebc57288b7eee43e33e4c62c841ae7f..5fe7dd1b6cf37c3bcff12e1e254547c8d1bf4513 100644 (file)
@@ -5,77 +5,36 @@
 
 #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)
@@ -85,33 +44,12 @@ void _fini(void) {
 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;
@@ -120,7 +58,7 @@ int handle_countrywhois(struct rline *li, int argc, char **argv) {
   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;