diff options
-rw-r--r-- | Changes | 4 | ||||
-rw-r--r-- | include/extern.h | 4 | ||||
-rw-r--r-- | src/protocol/charybdis.c | 24 | ||||
-rw-r--r-- | src/protocol/ratbox.c | 22 | ||||
-rw-r--r-- | src/protocol/shadowircd.c | 26 | ||||
-rw-r--r-- | src/servers.c | 57 | ||||
-rw-r--r-- | version.log | 6 |
7 files changed, 94 insertions, 49 deletions
@@ -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 |