#include "nickserv.h"
#include "modcmd.h"
#include "modules.h"
+#include "proto.h"
#include "opserv.h"
#include "timeq.h"
#include "saxdb.h"
#define KEY_DEFCON_CHANMODES "DefConChanModes"
#define KEY_DEFCON_SESSION_LIMIT "DefConSessionLimit"
#define KEY_DEFCON_TIMEOUT "DefConTimeOut"
-#define KEY_DEFCON_GLOBAL_TARGET "DefConGlobalTarget"
#define KEY_DEFCON_GLOBAL "GlobalOnDefcon"
#define KEY_DEFCON_GLOBAL_MORE "GlobalOnDefconMore"
#define KEY_DEFCON_MESSAGE "DefconMessage"
{ "OSMSG_HOP_DONE", "Halfopped the requested lusers." },
{ "OSMSG_HOPALL_DONE", "Halfopped everyone on $b%s$b." },
{ "OSMSG_WHOIS_IDENT", "%s (%s@%s) from %d.%d.%d.%d" },
- { "OSMSG_WHOIS_NICK", "Nick : %s" },
- { "OSMSG_WHOIS_HOST", "Host : %s@%s" },
- { "OSMSG_WHOIS_FAKEHOST", "Fakehost : %s" },
- { "OSMSG_WHOIS_CRYPT_HOST", "Crypt Host : %s" },
- { "OSMSG_WHOIS_CRYPT_IP", "Crypt IP : %s" },
- { "OSMSG_WHOIS_IP", "Real IP : %s" },
- { "OSMSG_WHOIS_MODES", "Modes : +%s " },
- { "OSMSG_WHOIS_INFO", "Info : %s" },
- { "OSMSG_WHOIS_NUMERIC", "Numnick : %s" },
- { "OSMSG_WHOIS_SERVER", "Server : %s" },
- { "OSMSG_WHOIS_NICK_AGE", "Nick Age : %s" },
- { "OSMSG_WHOIS_ACCOUNT", "Account : %s" },
- { "OSMSG_WHOIS_CHANNELS", "Channels : %s" },
+ { "OSMSG_WHOIS_NICK", "Nick : %s" },
+ { "OSMSG_WHOIS_HOST", "Host : %s@%s" },
+ { "OSMSG_WHOIS_FAKEHOST", "Fakehost : %s" },
+ { "OSMSG_WHOIS_CRYPT_HOST", "Crypt Host : %s" },
+ { "OSMSG_WHOIS_CRYPT_IP", "Crypt IP : %s" },
+ { "OSMSG_WHOIS_IP", "Real IP : %s" },
+ { "OSMSG_WHOIS_COUNTRY", "Country : %s" },
+ { "OSMSG_WHOIS_COUNTRY_CODE","Country Code : %s" },
+ { "OSMSG_WHOIS_CITY", "City : %s" },
+ { "OSMSG_WHOIS_REGION", "Region/State : %s" },
+ { "OSMSG_WHOIS_POSTAL_CODE","Postal Code : %s" },
+ { "OSMSG_WHOIS_LATITUDE", "Latitude : %f" },
+ { "OSMSG_WHOIS_LONGITUDE", "Longitude : %f" },
+ { "OSMSG_WHOIS_MAP", "Map : %s" },
+ { "OSMSG_WHOIS_DMA_CODE", "DMA Code : %d" },
+ { "OSMSG_WHOIS_AREA_CODE", "Area Code : %d" },
+ { "OSMSG_WHOIS_MODES", "Modes : +%s " },
+ { "OSMSG_WHOIS_INFO", "Info : %s" },
+ { "OSMSG_WHOIS_NUMERIC", "Numnick : %s" },
+ { "OSMSG_WHOIS_SERVER", "Server : %s" },
+ { "OSMSG_WHOIS_NICK_AGE", "Nick Age : %s" },
+ { "OSMSG_WHOIS_ACCOUNT", "Account : %s" },
+ { "OSMSG_WHOIS_PRIVS", "IRCd Privs : %s" },
+ { "OSMSG_WHOIS_CHANNELS", "Channels : %s" },
{ "OSMSG_WHOIS_HIDECHANS", "Channel list omitted for your sanity." },
{ "OSMSG_UNBAN_DONE", "Ban(s) removed from channel %s." },
{ "OSMSG_CHANNEL_VOICED", "All users on %s voiced." },
{ "OSMSG_DEFCON_OPER_ONLY", "Allowing Services Communication With Opers Only" },
{ "OSMSG_DEFCON_SILENT_OPER_ONLY", "Allowing Services Communication With Opers Only AND Silently Ignoring Regular Users" },
{ "OSMSG_DEFCON_GLINE_NEW_CLIENTS", "Glining New Clients" },
+ { "OSMSG_DEFCON_SHUN_NEW_CLIENTS", "Shunning New Clients" },
{ "OSMSG_DEFCON_NO_NEW_MEMOS", "Disallowing New Memos" },
+ { "OSMSG_PRIV_UNKNOWN", "Unknown privilege flag %s, see /msg $O HELP PRIVFLAGS for a flag list" },
+ { "OSMSG_PRIV_SET", "Privilege flag %s has been %sset" },
+
{ NULL, NULL }
};
int GlobalOnDefconMore = 0;
int DefConGlineExpire;
int DefConModesSet = 0;
-int DefConGlobalTarget = 3;
unsigned int DefConSessionLimit;
char *DefConChanModes;
char *DefConGlineReason;
if (checkDefCon(DEFCON_GLINE_NEW_CLIENTS))
reply("OSMSG_DEFCON_GLINE_NEW_CLIENTS");
+ if (checkDefCon(DEFCON_SHUN_NEW_CLIENTS))
+ reply("OSMSG_DEFCON_SHUN_NEW_CLIENTS");
+
if (checkDefCon(DEFCON_NO_NEW_MEMOS))
reply("OSMSG_DEFCON_NO_NEW_MEMOS");
void DefConProcess(struct userNode *user)
{
char *newmodes;
- long targets;
-
- if (DefConGlobalTarget == 1)
- targets = MESSAGE_RECIPIENT_LUSERS;
- else if (DefConGlobalTarget == 2)
- targets = MESSAGE_RECIPIENT_CHANNELS;
- else
- targets = MESSAGE_RECIPIENT_ALL;
- if (GlobalOnDefcon) {
- char *globalmsg;
- globalmsg = alloca(44);
- sprintf(globalmsg, "Network DefCon level has changed to level %d", DefConLevel);
- global_message(targets, globalmsg);
- }
+ if (GlobalOnDefcon)
+ global_message_args(MESSAGE_RECIPIENT_LUSERS, "DEFCON_NETWORK_CHANGED", DefConLevel);
- if (GlobalOnDefconMore)
- global_message(targets, DefConMessage);
+ if (GlobalOnDefconMore && GlobalOnDefcon)
+ global_message(MESSAGE_RECIPIENT_LUSERS, DefConMessage);
if ((DefConLevel == 5) && !GlobalOnDefconMore && !GlobalOnDefcon)
- global_message(targets, DefConOffMessage);
+ global_message(MESSAGE_RECIPIENT_LUSERS, DefConOffMessage);
- char *opermsg;
- if (user) {
- opermsg = alloca(strlen(user->nick) + 35);
- sprintf(opermsg, "%s is changing the DefCon level to %d", user->nick, DefConLevel);
- } else {
- opermsg = alloca(49);
- sprintf(opermsg, "The DefCon has changed back to level %d (timeout)", DefConLevel);
- }
- global_message(MESSAGE_RECIPIENT_OPERS, opermsg);
+ if (user)
+ global_message_args(MESSAGE_RECIPIENT_OPERS, "DEFCON_OPER_LEVEL_CHANGE", user->nick, DefConLevel);
+ else
+ global_message_args(MESSAGE_RECIPIENT_OPERS, "DEFCON_TIMEOUT_LEVEL_CHANGE", DefConLevel);
if (checkDefCon(DEFCON_FORCE_CHAN_MODES)) {
if (DefConChanModes && !DefConModesSet) {
return 1;
}
+/* TODO
+static MODCMD_FUNC(cmd_privallow)
+{
+//privallow servername/username +/-flag (global is set in conf)
+}
+
+static MODCMD_FUNC(cmd_privdissallow)
+{
+//privdisallow servername/username +/-flag (global is set in conf)
+}
+
+static MODCMD_FUNC(cmd_privlist)
+{
+//privlist servername/user (global with none)
+}
+*/
+
+static MODCMD_FUNC(cmd_privset)
+{
+ struct userNode *target;
+ char *flag;
+ int add = PRIV_ADD;
+
+ flag = argv[2];
+ if (*flag == '-') {
+ add = PRIV_DEL;
+ flag++;
+ } else if (*flag == '+') {
+ add = PRIV_ADD;
+ flag++;
+ }
+
+ target = GetUserH(argv[1]);
+ if (!target) {
+ reply("MSG_NICK_UNKNOWN", argv[1]);
+ return 0;
+ }
+
+ if (check_priv(flag)) {
+ irc_privs(target, flag, add);
+ reply("OSMSG_PRIV_SET", argv[2], (add == 1) ? "" : "un");
+ } else {
+ reply("OSMSG_PRIV_UNKNOWN", argv[2]);
+ return 0;
+ }
+
+ return 1;
+}
+
/* A lot of these commands are very similar to what ChanServ can do,
* but OpServ can do them even on channels that aren't registered.
*/
dict_insert(opserv_chan_warn, strdup(argv[1]), reason);
reply("OSMSG_WARN_ADDED", argv[1], reason);
if (dict_find(channels, argv[1], NULL)) {
- message = alloca(strlen(reason) + strlen(argv[1]) + 55);
- sprintf(message, "Channel activity warning for channel %s: %s", argv[1], reason);
- global_message(MESSAGE_RECIPIENT_OPERS, message);
+ global_message_args(MESSAGE_RECIPIENT_OPERS, "OSMSG_CHANNEL_ACTIVITY_WARN" argv[1], reason);
}
return 1;
}
reply("OSMSG_WHOIS_CRYPT_HOST", target->crypthost);
reply("OSMSG_WHOIS_CRYPT_IP", target->cryptip);
reply("OSMSG_WHOIS_IP", irc_ntoa(&target->ip));
+
+ if (target->city) {
+ reply("OSMSG_WHOIS_COUNTRY", target->country_name);
+ reply("OSMSG_WHOIS_COUNTRY_CODE", target->country_code);
+ reply("OSMSG_WHOIS_CITY", target->city);
+ reply("OSMSG_WHOIS_REGION", target->region);
+
+ reply("OSMSG_WHOIS_POSTAL_CODE", target->postal_code);
+ reply("OSMSG_WHOIS_LATITUDE", target->latitude);
+ reply("OSMSG_WHOIS_LONGITUDE", target->longitude);
+ /* Only show a map url if we have a city, latitude and longitude.
+ * Theres not much point of latitude and longitude coordinates are
+ * returned but no city, the coordinates are useless.
+ */
+ if (target->latitude && target->longitude && target->city) {
+ char map_url[MAXLEN];
+ snprintf(map_url, sizeof(map_url), "http://www.mapquest.com/maps/map.adp?searchtype=address&formtype=address&latlongtype=decimal&latitude=%f&longitude=%f",
+ target->latitude, target->longitude);
+ reply("OSMSG_WHOIS_MAP", map_url);
+ }
+ reply("OSMSG_WHOIS_DMA_CODE", target->dma_code);
+ reply("OSMSG_WHOIS_AREA_CODE", target->area_code);
+ } else if (target->country_name) {
+ reply("OSMSG_WHOIS_COUNTRY", target->country_name);
+ }
+
if (target->modes) {
bpos = 0;
#define buffer_cat(str) (herelen = strlen(str), memcpy(buffer+bpos, str, herelen), bpos += herelen)
#endif
reply("OSMSG_WHOIS_SERVER", target->uplink->name);
reply("OSMSG_WHOIS_ACCOUNT", (target->handle_info ? target->handle_info->handle : "Not authenticated"));
+
+ reply("OSMSG_WHOIS_PRIVS", client_report_privs(target));
+
intervalString(buffer, now - target->timestamp, user->handle_info);
reply("OSMSG_WHOIS_NICK_AGE", buffer);
if (target->channels.used <= MAX_CHANNELS_WHOIS)
return 0;
}
+ if ( (checkDefCon(DEFCON_GLINE_NEW_CLIENTS) || checkDefCon(DEFCON_SHUN_NEW_CLIENTS)) && !IsOper(user)) {
+ char target[IRC_NTOP_MAX_SIZE + 3] = { '*', '@', '\0' };
+
+ strcpy(target + 2, user->hostname);
+ if (checkDefCon(DEFCON_GLINE_NEW_CLIENTS))
+ gline_add(opserv->nick, target, DefConGlineExpire, DefConGlineReason, now, 1, 0);
+ else if (checkDefCon(DEFCON_SHUN_NEW_CLIENTS))
+ shun_add(opserv->nick, target, DefConGlineExpire, DefConGlineReason, now, 1);
+
+ return 0;
+ }
+
/* Only warn or G-line if there's an untrusted max and their IP is sane. */
if (opserv_conf.untrusted_max
&& irc_in_addr_is_valid(user->ip)
}
/*
if ((warning = dict_find(opserv_chan_warn, newchan->name, NULL))) {
- char message[MAXLEN];
- snprintf(message, sizeof(message), "Channel activity warning for channel %s: %s", newchan->name, warning);
- global_message(MESSAGE_RECIPIENT_OPERS, message);
+ global_message_args(MESSAGE_RECIPIENT_OPERS, "OSMSG_CHANNEL_ACTIVITY_WARN", newchan->name, warning);
}
*/
wc->server = strdup(server);
wc->target = strdup(to->name);
+ /* Just to make sure there isn't one left hanging
+ * if 2 connections are attempted at once..
+ * */
+ routing_delete_connect_timer(server);
dict_insert(opserv_waiting_connections, strdup(server), wc);
timeq_add(now + ROUTING_CONNECT_TIMEOUT, routing_connect_timeout, wc);
str = database_get_data(conf_node, KEY_DEFCON_GLINE_DURATION, RECDB_QSTRING);
DefConGlineExpire = str ? ParseInterval(str) : 300;
- str = database_get_data(conf_node, KEY_DEFCON_GLOBAL_TARGET, RECDB_QSTRING);
- DefConGlobalTarget = str ? atoi(str) : 3;
-
str = database_get_data(conf_node, KEY_DEFCON_GLOBAL, RECDB_QSTRING);
GlobalOnDefcon = str ? atoi(str) : 0;
opserv_define_func("HOP", cmd_hop, 100, 2, 2);
opserv_define_func("HOPALL", cmd_hopall, 400, 2, 0);
opserv_define_func("MAP", cmd_stats_links, 0, 0, 0);
+ opserv_define_func("PRIVSET", cmd_privset, 900, 0, 3);
opserv_define_func("PART", cmd_part, 601, 0, 2);
opserv_define_func("QUERY", cmd_query, 0, 0, 0);
opserv_define_func("RAW", cmd_raw, 999, 0, 2);