summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes4
-rw-r--r--include/extern.h4
-rw-r--r--src/protocol/charybdis.c24
-rw-r--r--src/protocol/ratbox.c22
-rw-r--r--src/protocol/shadowircd.c26
-rw-r--r--src/servers.c57
-rw-r--r--version.log6
7 files changed, 94 insertions, 49 deletions
diff --git a/Changes b/Changes
index 1b322f673..843c61980 100644
--- a/Changes
+++ b/Changes
@@ -28,6 +28,10 @@ Anope Version S V N
08/28 F We now check required commands existance on inspircd11 protocol. [#773]
08/28 F SuperAdmin now always overrules channel founder. [#770]
08/29 F InspIRCD11 protocol now uses SVSJOIN/PART instead of SAJOIN/PART. [#772]
+08/29 F TS6 UID generation for all supported TS6 IRCDs. [#731]
+
+Provided by nenolod <nenolod@nenolod.net> - 2007
+08/29 F TS6 UID generation for Charybdis. [#731]
Anope Version 1.7.19
--------------------
diff --git a/include/extern.h b/include/extern.h
index 7e678441c..934c69d45 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -1037,6 +1037,10 @@ E int anope_check_sync(const char *name);
E void finish_sync(Server *serv, int sync_links);
+E void ts6_uid_init(void);
+E void ts6_uid_increment(unsigned int slot);
+E char *ts6_uid_retrieve(void);
+
/**** sessions.c ****/
E Exception *exceptions;
diff --git a/src/protocol/charybdis.c b/src/protocol/charybdis.c
index 69786154f..4efc7d7b3 100644
--- a/src/protocol/charybdis.c
+++ b/src/protocol/charybdis.c
@@ -14,8 +14,6 @@
#include "pseudo.h"
#include "charybdis.h"
-int ts6nickcount = 0;
-
IRCDVar myIrcd[] = {
{"Charybdis 1.0+", /* ircd name */
"+oiS", /* nickserv mode */
@@ -144,6 +142,8 @@ IRCDCAPAB myIrcdcap[] = {
0, 0, 0}
};
+/*******************************************************************/
+
void charybdis_set_umode(User * user, int ac, char **av)
{
int add = 1; /* 1 if adding modes, 0 if deleting */
@@ -1051,16 +1051,13 @@ void charybdis_cmd_connect(int servernum)
void charybdis_cmd_bot_nick(char *nick, char *user, char *host, char *real,
char *modes)
{
- char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
- (ts6nickcount + 'A'));
+ char *uidbuf = ts6_uid_retrieve();
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
- (long int) time(NULL), modes, user, host, nicknumbuf,
+ (long int) time(NULL), modes, user, host, uidbuf,
real);
- new_uid(nick, nicknumbuf);
- ts6nickcount++;
+ new_uid(nick, uidbuf);
} else {
send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
(long int) time(NULL), modes, user, host, ServerName,
@@ -1429,22 +1426,19 @@ void charybdis_cmd_tmode(char *source, char *dest, const char *fmt, ...)
void charybdis_cmd_nick(char *nick, char *name, char *mode)
{
- char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
- (ts6nickcount + 'A'));
+ char *uidbuf = ts6_uid_retrieve();
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
- nicknumbuf, name);
- new_uid(nick, nicknumbuf);
- ts6nickcount++;
+ uidbuf, name);
+ new_uid(nick, uidbuf);
} else {
send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
ServerName, name);
}
- send_cmd(UseTS6 ? nicknumbuf : nick, "RESV * %s :%s", nick, "Reserved for services");
+ charybdis_cmd_sqline(nick, "Reserved for services");
}
void charybdis_cmd_kick(char *source, char *chan, char *user, char *buf)
diff --git a/src/protocol/ratbox.c b/src/protocol/ratbox.c
index cf7b48443..103f95632 100644
--- a/src/protocol/ratbox.c
+++ b/src/protocol/ratbox.c
@@ -15,8 +15,6 @@
#include "pseudo.h"
#include "ratbox.h"
-int ts6nickcount = 0;
-
IRCDVar myIrcd[] = {
{"Ratbox 2.0+", /* ircd name */
"+oi", /* nickserv mode */
@@ -989,16 +987,13 @@ void ratbox_cmd_connect(int servernum)
void ratbox_cmd_bot_nick(char *nick, char *user, char *host, char *real,
char *modes)
{
- char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
- (ts6nickcount + 'A'));
+ char *uidbuf = ts6_uid_retrieve();
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
- (long int) time(NULL), modes, user, host, nicknumbuf,
+ (long int) time(NULL), modes, user, host, uidbuf,
real);
- new_uid(nick, nicknumbuf);
- ts6nickcount++;
+ new_uid(nick, uidbuf);
} else {
send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
(long int) time(NULL), modes, user, host, ServerName,
@@ -1360,22 +1355,19 @@ void ratbox_cmd_tmode(char *source, char *dest, const char *fmt, ...)
void ratbox_cmd_nick(char *nick, char *name, char *mode)
{
- char nicknumbuf[10];
EnforceQlinedNick(nick, NULL);
if (UseTS6) {
- snprintf(nicknumbuf, 10, "%sAAAAA%c", Numeric,
- (ts6nickcount + 'A'));
+ char *uidbuf = ts6_uid_retrieve();
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
- nicknumbuf, name);
- new_uid(nick, nicknumbuf);
- ts6nickcount++;
+ uidbuf, name);
+ new_uid(nick, uidbuf);
} else {
send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
ServerName, name);
}
- send_cmd(UseTS6 ? nicknumbuf : nick, "RESV * %s :%s", nick, "Reserved for services");
+ ratbox_cmd_sqline(nick, "Reserved for services");
}
void ratbox_cmd_kick(char *source, char *chan, char *user, char *buf)
diff --git a/src/protocol/shadowircd.c b/src/protocol/shadowircd.c
index b57579210..ded8ea738 100644
--- a/src/protocol/shadowircd.c
+++ b/src/protocol/shadowircd.c
@@ -16,9 +16,6 @@
#include "pseudo.h"
#include "shadowircd.h"
-/* 6 slot array, 35 possible combinations per slot, exponential. */
-int ts6nickcount[6] = { 0, 0, 0, 0, 0, 0 };
-
IRCDVar myIrcd[] = {
{"ShadowIRCd 4.0+", /* ircd name */
"+oiqSK", /* nickserv mode */
@@ -992,19 +989,13 @@ void shadowircd_cmd_connect(int servernum)
void shadowircd_cmd_bot_nick(char *nick, char *user, char *host,
char *real, char *modes)
{
- char nicknumbuf[10];
+ char *uidbuf = ts6_uid_retrieve();
+
EnforceQlinedNick(nick, NULL);
- snprintf(nicknumbuf, 10, "%sAAAA%c%c", Numeric,
- (ts6nickcount[1] + 'A'), (ts6nickcount[0] + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
- (long int) time(NULL), modes, user, host, nicknumbuf, host,
+ (long int) time(NULL), modes, user, host, uidbuf, host,
real);
- new_uid(nick, nicknumbuf);
- ts6nickcount[0]++;
- if (ts6nickcount[0] > 35) { /* AAAAA9 */
- ts6nickcount[1]++;
- ts6nickcount[0] = 0; /* AAAABA */
- }
+ new_uid(nick, uidbuf);
shadowircd_cmd_sqline(nick, "Reserved for services");
}
@@ -1360,14 +1351,13 @@ void shadowircd_cmd_tmode(char *source, char *dest, char *buf)
void shadowircd_cmd_nick(char *nick, char *name, char *mode)
{
- char nicknumbuf[10];
+ char *uidbuf = ts6_uid_retrieve();
+
EnforceQlinedNick(nick, NULL);
- snprintf(nicknumbuf, 10, "%sAAAAA%c", TS6SID, (ts6nickcount[0] + 'A'));
send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0.0.0.0 %s %s :%s", nick,
(long int) time(NULL), mode, ServiceUser, ServiceHost,
- nicknumbuf, ServiceHost, name);
- new_uid(nick, nicknumbuf);
- ts6nickcount[0]++;
+ uidbuf, ServiceHost, name);
+ new_uid(nick, uidbuf);
shadowircd_cmd_sqline(nick, "Reserved for services");
}
diff --git a/src/servers.c b/src/servers.c
index 31d7425dd..4aaebc302 100644
--- a/src/servers.c
+++ b/src/servers.c
@@ -558,4 +558,61 @@ void finish_sync(Server * serv, int sync_links)
alog("Server %s is done syncing", serv->name);
}
+/*******************************************************************/
+
+/* TS6 UID generator common code.
+ *
+ * Derived from atheme-services, uid.c (hg 2954:116d46894b4c).
+ * -nenolod
+ */
+static int ts6_uid_initted = 0;
+static char ts6_new_uid[10]; /* allow for \0 */
+static unsigned int ts6_uid_index = 9; /* last slot in uid buf */
+
+void ts6_uid_init(void)
+{
+ unsigned int i;
+ char buf[BUFSIZE];
+
+ /* check just in case... you can never be too safe. */
+ if (TS6SID != NULL) {
+ snprintf(ts6_new_uid, 10, "%sAAAAAA", TS6SID);
+ ts6_uid_initted = 1;
+ } else {
+ alog("warning: no TS6SID specified, disabling TS6 support.");
+ UseTS6 = 0;
+
+ return;
+ }
+}
+
+void ts6_uid_increment(unsigned int slot)
+{
+ if (slot != strlen(TS6SID)) {
+ if (ts6_new_uid[slot] == 'Z')
+ ts6_new_uid[slot] = '0';
+ else if (ts6_new_uid[slot] == '9') {
+ ts6_new_uid[slot] = 'A';
+ ts6_uid_increment(slot - 1);
+ } else
+ ts6_new_uid[slot]++;
+ } else {
+ if (ts6_new_uid[slot] == 'Z')
+ for (slot = 3; slot < 9; slot++)
+ ts6_new_uid[slot] = 'A';
+ else
+ ts6_new_uid[slot]++;
+ }
+}
+
+char *ts6_uid_retrieve(void)
+{
+ if (ts6_uid_initted != 1)
+ ts6_uid_init();
+
+ ts6_uid_increment(ts6_uid_index - 1);
+
+ return ts6_new_uid;
+}
+
/* EOF */
diff --git a/version.log b/version.log
index da28b60c3..42e015abf 100644
--- a/version.log
+++ b/version.log
@@ -9,10 +9,14 @@ VERSION_MAJOR="1"
VERSION_MINOR="7"
VERSION_PATCH="19"
VERSION_EXTRA="-svn"
-VERSION_BUILD="1285"
+VERSION_BUILD="1286"
# $Log$
#
+# BUILD : 1.7.19 (1286)
+# BUGS : 731
+# NOTES : Fixed TS6 UID generation
+#
# BUILD : 1.7.19 (1285)
# BUGS : 684, 772
# NOTES : [1] Added InspIRCd11 vIdent support [2] InspIRCD11 protocol now uses SVSJOIN/PART instead of