Merge pull request #565 from bviktor/nickservtype

Make NickServ registration configurable per-network
This commit is contained in:
TingPing 2013-05-03 09:19:01 -07:00
commit 7243f5bc2c
6 changed files with 123 additions and 18 deletions

View File

@ -816,12 +816,6 @@ inbound_005 (server * serv, char *word[])
fe_set_channel (serv->server_session); fe_set_channel (serv->server_session);
} }
/* use /NICKSERV */
if (g_ascii_strcasecmp (word[w] + 8, "UniBG") == 0)
serv->nickservtype = 3;
else if (g_ascii_strcasecmp (word[w] + 8, "QuakeNet") == 0)
serv->nickservtype = 4;
} else if (strncmp (word[w], "CASEMAPPING=", 12) == 0) } else if (strncmp (word[w], "CASEMAPPING=", 12) == 0)
{ {
if (strcmp (word[w] + 12, "ascii") == 0) /* bahamut */ if (strcmp (word[w] + 12, "ascii") == 0) /* bahamut */

View File

@ -80,15 +80,22 @@ irc_nickserv (server *serv, char *cmd, char *arg1, char *arg2, char *arg3)
break; break;
case 4: case 4:
/* why couldn't QuakeNet implement one of the existing ones? */ /* why couldn't QuakeNet implement one of the existing ones? */
tcp_sendf (serv, "AUTH %s%s%s\r\n", cmd, arg1, arg2, arg3); tcp_sendf (serv, "AUTH %s %s\r\n", arg1, arg2);
} }
} }
static void static void
irc_ns_identify (server *serv, char *pass) irc_ns_identify (server *serv, char *pass)
{
if (serv->nickservtype == 4) /* QuakeNet needs to do everything in its own ways... */
{
irc_nickserv (serv, "", serv->nick, pass, "");
}
else
{ {
irc_nickserv (serv, "IDENTIFY", pass, "", ""); irc_nickserv (serv, "IDENTIFY", pass, "", "");
} }
}
static void static void
irc_ns_ghost (server *serv, char *usname, char *pass) irc_ns_ghost (server *serv, char *usname, char *pass)

View File

@ -1881,7 +1881,6 @@ server_set_defaults (server *serv)
serv->nick_modes = strdup ("ohv"); serv->nick_modes = strdup ("ohv");
serv->nickcount = 1; serv->nickcount = 1;
serv->nickservtype = 0;
serv->end_of_motd = FALSE; serv->end_of_motd = FALSE;
serv->is_away = FALSE; serv->is_away = FALSE;
serv->supports_watch = FALSE; serv->supports_watch = FALSE;

View File

@ -43,6 +43,7 @@ struct defaultserver
char *host; char *host;
char *channel; char *channel;
char *charset; char *charset;
int nsmode; /* default NickServ type */
}; };
static const struct defaultserver def[] = static const struct defaultserver def[] =
@ -166,7 +167,7 @@ static const struct defaultserver def[] =
{0, "irc.criten.net"}, {0, "irc.criten.net"},
{0, "irc.eu.criten.net"}, {0, "irc.eu.criten.net"},
{"DALnet", 0}, {"DALnet", 0, 0, 0, 2},
{0, "irc.dal.net"}, {0, "irc.dal.net"},
{0, "irc.eu.dal.net"}, {0, "irc.eu.dal.net"},
@ -433,7 +434,7 @@ static const struct defaultserver def[] =
{0, "nfsi.ptnet.org"}, {0, "nfsi.ptnet.org"},
{0, "fctunl.ptnet.org"}, {0, "fctunl.ptnet.org"},
{"QuakeNet", 0}, {"QuakeNet", 0, 0, 0, 5},
{0, "irc.quakenet.org"}, {0, "irc.quakenet.org"},
{0, "irc.se.quakenet.org"}, {0, "irc.se.quakenet.org"},
{0, "irc.dk.quakenet.org"}, {0, "irc.dk.quakenet.org"},
@ -467,7 +468,7 @@ static const struct defaultserver def[] =
{"Rizon", 0}, {"Rizon", 0},
{0, "irc.rizon.net"}, {0, "irc.rizon.net"},
{"RusNet", 0, 0, "KOI8-R (Cyrillic)"}, {"RusNet", 0, 0, "KOI8-R (Cyrillic)", 2},
{0, "irc.tomsk.net"}, {0, "irc.tomsk.net"},
{0, "irc.rinet.ru"}, {0, "irc.rinet.ru"},
{0, "irc.run.net"}, {0, "irc.run.net"},
@ -552,7 +553,7 @@ static const struct defaultserver def[] =
{0, "us.undernet.org"}, {0, "us.undernet.org"},
{0, "eu.undernet.org"}, {0, "eu.undernet.org"},
{"UniBG", 0}, {"UniBG", 0, 0, 0, 4},
{0, "irc.lirex.com"}, {0, "irc.lirex.com"},
{0, "irc.naturella.com"}, {0, "irc.naturella.com"},
{0, "irc.spnet.net"}, {0, "irc.spnet.net"},
@ -625,6 +626,15 @@ servlist_connect (session *sess, ircnet *net, gboolean join)
} }
} }
if (net->nstype >= 1) /* once again, make sure gtk_combo_box_get_active() is not bugging us, just in case */
{
serv->nickservtype = net->nstype - 1; /* ircnet->nstype starts at 1, server->nickservtype starts at 0! */
}
else
{
serv->nickservtype = 1; /* use /NickServ by default */
}
serv->password[0] = 0; serv->password[0] = 0;
serv->sasluser[0] = 0; serv->sasluser[0] = 0;
serv->saslpassword[0] = 0; serv->saslpassword[0] = 0;
@ -1027,6 +1037,10 @@ servlist_load_defaults (void)
free (net->encoding); free (net->encoding);
net->encoding = strdup (def[i].charset); net->encoding = strdup (def[i].charset);
} }
if (def[i].nsmode)
{
net->nstype = def[i].nsmode;
}
if (g_str_hash (def[i].network) == def_hash) if (g_str_hash (def[i].network) == def_hash)
{ {
prefs.hex_gui_slist_select = j; prefs.hex_gui_slist_select = j;
@ -1128,6 +1142,9 @@ servlist_load (void)
case 'B': case 'B':
net->nickserv = strdup (buf + 2); net->nickserv = strdup (buf + 2);
break; break;
case 'T':
net->nstype = atoi (buf + 2);
break;
} }
} }
if (buf[0] == 'N') if (buf[0] == 'N')
@ -1241,6 +1258,20 @@ servlist_save (void)
fprintf (fp, "J=%s\n", net->autojoin); fprintf (fp, "J=%s\n", net->autojoin);
if (net->nickserv) if (net->nickserv)
fprintf (fp, "B=%s\n", net->nickserv); fprintf (fp, "B=%s\n", net->nickserv);
if (net->nstype)
{
if (net->nstype == -1) /* gtk_combo_box_get_active() returns -1 for invalid indices */
{
net->nstype = 0; /* avoid further crashes for the current session */
buf = g_strdup_printf (_("Warning: invalid NickServ type. Falling back to default type for network %s."), net->name);
fe_message (buf, FE_MSG_WARN);
g_free (buf);
}
else /* the selection was fine, save it */
{
fprintf (fp, "T=%d\n", net->nstype);
}
}
if (net->encoding && g_ascii_strcasecmp (net->encoding, "System") && if (net->encoding && g_ascii_strcasecmp (net->encoding, "System") &&
g_ascii_strcasecmp (net->encoding, "System default")) g_ascii_strcasecmp (net->encoding, "System default"))
{ {

View File

@ -37,6 +37,7 @@ typedef struct ircnet
char *autojoin; char *autojoin;
char *command; char *command;
char *nickserv; char *nickserv;
int nstype;
char *comment; char *comment;
char *encoding; char *encoding;
GSList *servlist; GSList *servlist;

View File

@ -103,6 +103,24 @@ static const char *pages[]=
NULL NULL
}; };
static const char *nstypes[]=
{
/* This list is the same as in irc_nickserv(), except starting at 1, because
* the 1st row is not used. We can't use index 0 coz then "if (nstype)" would
* not be evaluated, it would give the same result as NULL (i.e. unset) nstype.
* For unset nstype we have a "Default" entry in place of this placeholder, so
* indices will be correct anyway.
*/
"PLACEHOLDER", /* nstype = 0 */
"/msg NickServ", /* nstype = 1, nickservtype = 0 */
"/NickServ", /* nstype = 2, nickservtype = 1 */
"/NS", /* ... */
"/msg NS",
"/auth",
NULL
/* This also means that we need to shift these values for irc_nickserv()! */
};
static void static void
servlist_select_and_show (GtkTreeView *treeview, GtkTreeIter *iter, servlist_select_and_show (GtkTreeView *treeview, GtkTreeIter *iter,
GtkListStore *store) GtkListStore *store)
@ -1310,6 +1328,21 @@ servlist_combo_cb (GtkEntry *entry, gpointer userdata)
} }
} }
static void
servlist_nscombo_cb (GtkEntry *entry, gpointer userdata)
{
if (!selected_net)
{
return;
}
if (!ignore_changed)
{
selected_net->nstype = gtk_combo_box_get_active (GTK_COMBO_BOX (entry));
}
}
static GtkWidget * static GtkWidget *
servlist_create_charsetcombo (void) servlist_create_charsetcombo (void)
{ {
@ -1330,6 +1363,28 @@ servlist_create_charsetcombo (void)
return cb; return cb;
} }
static GtkWidget *
servlist_create_nstypecombo (void)
{
GtkWidget *cb;
int i;
cb = gtk_combo_box_entry_new_text ();
gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "Default");
i = 1; /* start with the 2nd row, leave the placeholder 0th element alone */
while (nstypes[i])
{
gtk_combo_box_append_text (GTK_COMBO_BOX (cb), (char *)nstypes[i]);
i++;
}
g_signal_connect (G_OBJECT (GTK_BIN (cb)), "changed", G_CALLBACK (servlist_nscombo_cb), NULL);
return cb;
}
static void static void
no_servlist (GtkWidget * igad, gpointer serv) no_servlist (GtkWidget * igad, gpointer serv)
{ {
@ -1375,7 +1430,9 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
GtkWidget *label16; GtkWidget *label16;
GtkWidget *label21; GtkWidget *label21;
GtkWidget *label34; GtkWidget *label34;
GtkWidget *label_nstype;
GtkWidget *comboboxentry_charset; GtkWidget *comboboxentry_charset;
GtkWidget *comboboxentry_nstypes;
GtkWidget *hbox1; GtkWidget *hbox1;
GtkWidget *scrolledwindow2; GtkWidget *scrolledwindow2;
GtkWidget *treeview_servers; GtkWidget *treeview_servers;
@ -1483,26 +1540,42 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
_("Extra command to execute after connecting. If you need more than one, set this to LOAD -e <filename>, where <filename> is a text-file full of commands to execute.")); _("Extra command to execute after connecting. If you need more than one, set this to LOAD -e <filename>, where <filename> is a text-file full of commands to execute."));
edit_entry_nickserv = edit_entry_nickserv =
servlist_create_entry (table3, _("Nickserv password:"), 17, servlist_create_entry (table3, _("NickServ password:"), 17,
net->nickserv, 0, net->nickserv, 0,
_("If your nickname requires a password, enter it here. Not all IRC networks support this.")); _("If your nickname requires a password, enter it here. Not all IRC networks support this."));
gtk_entry_set_visibility (GTK_ENTRY (edit_entry_nickserv), FALSE); gtk_entry_set_visibility (GTK_ENTRY (edit_entry_nickserv), FALSE);
label_nstype = gtk_label_new (_("NickServ type:"));
gtk_widget_show (label_nstype);
gtk_table_attach (GTK_TABLE (table3), label_nstype, 1, 2, 18, 19,
(GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 0, 0);
gtk_misc_set_alignment (GTK_MISC (label_nstype), 0, 0.5);
comboboxentry_nstypes = servlist_create_nstypecombo ();
ignore_changed = TRUE;
gtk_entry_set_text (GTK_ENTRY (GTK_BIN (comboboxentry_nstypes)->child), net->nstype ? nstypes[net->nstype] : "Default");
ignore_changed = FALSE;
gtk_widget_show (comboboxentry_nstypes);
gtk_table_attach (GTK_TABLE (table3), comboboxentry_nstypes, 2, 3, 18, 19,
(GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (GTK_FILL), 0, 0);
edit_entry_pass = edit_entry_pass =
servlist_create_entry (table3, _("Server password:"), 18, servlist_create_entry (table3, _("Server password:"), 20,
net->pass, 0, net->pass, 0,
_("Password for the server, if in doubt, leave blank.")); _("Password for the server, if in doubt, leave blank."));
gtk_entry_set_visibility (GTK_ENTRY (edit_entry_pass), FALSE); gtk_entry_set_visibility (GTK_ENTRY (edit_entry_pass), FALSE);
edit_entry_saslpass = edit_entry_saslpass =
servlist_create_entry (table3, _("SASL password:"), 19, servlist_create_entry (table3, _("SASL password:"), 21,
net->saslpass, 0, net->saslpass, 0,
_("Password for SASL authentication, if in doubt, leave blank.")); _("Password for SASL authentication, if in doubt, leave blank."));
gtk_entry_set_visibility (GTK_ENTRY (edit_entry_saslpass), FALSE); gtk_entry_set_visibility (GTK_ENTRY (edit_entry_saslpass), FALSE);
label34 = gtk_label_new (_("Character set:")); label34 = gtk_label_new (_("Character set:"));
gtk_widget_show (label34); gtk_widget_show (label34);
gtk_table_attach (GTK_TABLE (table3), label34, 1, 2, 20, 21, gtk_table_attach (GTK_TABLE (table3), label34, 1, 2, 22, 23,
(GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (0), 0, 0); (GtkAttachOptions) (0), 0, 0);
gtk_misc_set_alignment (GTK_MISC (label34), 0, 0.5); gtk_misc_set_alignment (GTK_MISC (label34), 0, 0.5);
@ -1512,7 +1585,7 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
gtk_entry_set_text (GTK_ENTRY (GTK_BIN (comboboxentry_charset)->child), net->encoding ? net->encoding : "System default"); gtk_entry_set_text (GTK_ENTRY (GTK_BIN (comboboxentry_charset)->child), net->encoding ? net->encoding : "System default");
ignore_changed = FALSE; ignore_changed = FALSE;
gtk_widget_show (comboboxentry_charset); gtk_widget_show (comboboxentry_charset);
gtk_table_attach (GTK_TABLE (table3), comboboxentry_charset, 2, 3, 20, 21, gtk_table_attach (GTK_TABLE (table3), comboboxentry_charset, 2, 3, 22, 23,
(GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL),
(GtkAttachOptions) (GTK_FILL), 0, 0); (GtkAttachOptions) (GTK_FILL), 0, 0);