]>
Commit | Line | Data |
---|---|---|
5902ea46 | 1 | Add account collision kills, controlled by feature ACCOUNT_COLLISION_KILLS |
2 | ||
3 | include/ircd_features.h | |
4 | ircd/ircd_features.c | |
5 | add new feature | |
6 | ||
7 | include/numeric.h | |
8 | ircd/s_err.c | |
9 | add new numerc 435 ERR_ACCOUNTCOLLISION (mirrored after 436 ERR_NICKCOLLISION) | |
10 | ||
11 | ircd/m_account.c | |
12 | add the account collision kills | |
13 | ||
7c66a74b | 14 | diff -r aa908af5cc1f include/ircd_features.h |
15 | --- a/include/ircd_features.h Wed Jan 28 19:53:55 2009 +0100 | |
16 | +++ b/include/ircd_features.h Wed Jan 28 20:14:05 2009 +0100 | |
d61bc4d5 | 17 | @@ -102,6 +102,7 @@ |
5902ea46 | 18 | FEAT_AUTH_TIMEOUT, |
19 | FEAT_ANNOUNCE_INVITES, | |
d61bc4d5 | 20 | FEAT_WELCOME, |
5902ea46 | 21 | + FEAT_ACCOUNT_COLLISION_KILLS, |
22 | ||
23 | /* features that affect all operators */ | |
24 | FEAT_EXTENDED_CHECKCMD, | |
7c66a74b | 25 | diff -r aa908af5cc1f include/numeric.h |
26 | --- a/include/numeric.h Wed Jan 28 19:53:55 2009 +0100 | |
27 | +++ b/include/numeric.h Wed Jan 28 20:14:05 2009 +0100 | |
28 | @@ -362,6 +362,7 @@ | |
5902ea46 | 29 | /* ERR_NORULES 434 unreal */ |
30 | /* ERR_SERVICECONFUSED 435 ? */ | |
31 | /* ERR_BANONCHAN 435 dalnet */ | |
32 | +#define ERR_ACCOUNTCOLLISION 435 /* QuakeNet extension */ | |
33 | #define ERR_NICKCOLLISION 436 | |
34 | #define ERR_BANNICKCHANGE 437 /* Undernet extension */ | |
35 | /* ERR_UNAVAILRESOURCE 437 IRCnet extension */ | |
7c66a74b | 36 | diff -r aa908af5cc1f ircd/ircd_features.c |
37 | --- a/ircd/ircd_features.c Wed Jan 28 19:53:55 2009 +0100 | |
38 | +++ b/ircd/ircd_features.c Wed Jan 28 20:14:05 2009 +0100 | |
d61bc4d5 | 39 | @@ -356,6 +356,7 @@ |
5902ea46 | 40 | F_I(AUTH_TIMEOUT, 0, 9, 0), |
41 | F_B(ANNOUNCE_INVITES, 0, 0, 0), | |
d61bc4d5 | 42 | F_B(WELCOME, 0, 1, 0), |
5902ea46 | 43 | + F_B(ACCOUNT_COLLISION_KILLS, 0, 0, 0), |
44 | ||
45 | /* features that affect all operators */ | |
46 | F_B(EXTENDED_CHECKCMD, 0, 0, 0), | |
7c66a74b | 47 | diff -r aa908af5cc1f ircd/m_account.c |
48 | --- a/ircd/m_account.c Wed Jan 28 19:53:55 2009 +0100 | |
49 | +++ b/ircd/m_account.c Wed Jan 28 20:14:05 2009 +0100 | |
5902ea46 | 50 | @@ -82,10 +82,12 @@ |
51 | ||
52 | #include "client.h" | |
53 | #include "ircd.h" | |
54 | +#include "ircd_features.h" | |
55 | #include "ircd_log.h" | |
56 | #include "ircd_reply.h" | |
57 | #include "ircd_string.h" | |
58 | #include "msg.h" | |
59 | +#include "numeric.h" | |
60 | #include "numnicks.h" | |
61 | #include "s_debug.h" | |
62 | #include "s_user.h" | |
7c66a74b | 63 | @@ -113,6 +115,7 @@ |
64 | time_t acc_create; | |
65 | unsigned long acc_id; | |
66 | unsigned long long acc_flags; | |
67 | + int diff_acc; | |
68 | ||
69 | if (parc < 5) | |
70 | return need_more_params(sptr, "ACCOUNT"); | |
71 | @@ -136,12 +139,55 @@ | |
72 | * all other elements match | |
73 | */ | |
5902ea46 | 74 | if (IsAccount(acptr)) { |
7c66a74b | 75 | - if (strcmp(cli_user(acptr)->account, parv[2]) || |
76 | + if ((diff_acc = strcmp(cli_user(acptr)->account, parv[2])) || | |
5902ea46 | 77 | (cli_user(acptr)->acc_create != acc_create) || |
78 | - (cli_user(acptr)->acc_id != acc_id)) | |
79 | - return protocol_violation(cptr, "ACCOUNT for already registered user %s " | |
80 | - "(%s -> %s)", cli_name(acptr), | |
81 | - cli_user(acptr)->account, parv[2]); | |
82 | + (cli_user(acptr)->acc_id != acc_id)) { | |
83 | + | |
84 | + /* license to KILL for account collisions */ | |
85 | + /* TODO: what if just the timestamp differs? | |
d2b4e55a | 86 | + * account and ID are the same |
87 | + * could we not resolve the conflict without KILL? | |
88 | + * ie. oldest timestamp overrules? | |
5902ea46 | 89 | + */ |
90 | + if (feature_bool(FEAT_ACCOUNT_COLLISION_KILLS)) { | |
91 | + /* inform ops */ | |
7c66a74b | 92 | + /* accounts differ */ |
93 | + if (diff_acc) | |
d2b4e55a | 94 | + sendto_opmask_butone(0, SNO_OLDSNO, |
95 | + "Account collision from %C on %C (%s <- %C %s (Different account))", | |
96 | + sptr, acptr, cli_user(acptr)->account, cptr, parv[2]); | |
7c66a74b | 97 | + |
98 | + /* account IDs differ */ | |
d2b4e55a | 99 | + else if (cli_user(acptr)->acc_id != acc_id) |
100 | + sendto_opmask_butone(0, SNO_OLDSNO, | |
101 | + "Account collision from %C on %C (%lu <- %C %lu (Different ID))", | |
102 | + sptr, acptr,cli_user(acptr)->acc_id, cptr, acc_id); | |
7c66a74b | 103 | + |
104 | + /* timestamps differ */ | |
d2b4e55a | 105 | + else |
106 | + sendto_opmask_butone(0, SNO_OLDSNO, | |
107 | + "Account collision from %C on %C (%Tu <- %C %Tu (Different timestamp))", | |
108 | + sptr, acptr, cli_user(acptr)->acc_create, cptr, acc_create); | |
109 | + | |
5902ea46 | 110 | + /* tell victim why we kill them */ |
d2b4e55a | 111 | + /* TODO: send the account we got here (parv[2]) or just a *? */ |
112 | + send_reply(acptr, ERR_ACCOUNTCOLLISION, "*"); | |
7c66a74b | 113 | + |
5902ea46 | 114 | + /* Inform the rest of the net... */ |
115 | + ServerStats->is_kill++; | |
116 | + sendcmdto_serv_butone(&me, CMD_KILL, 0, "%C :%s (account collision)", | |
117 | + acptr, cli_name(&me)); | |
7c66a74b | 118 | + |
5902ea46 | 119 | + /* don't go sending off a QUIT message... */ |
120 | + SetFlag(acptr, FLAG_KILLED); | |
7c66a74b | 121 | + |
5902ea46 | 122 | + /* remove them locally. */ |
123 | + return exit_client_msg(cptr, acptr, &me, "Killed (%s (account collision))", | |
124 | + feature_str(FEAT_HIS_SERVERNAME)); | |
125 | + } else | |
126 | + return protocol_violation(cptr, "ACCOUNT for already registered user %s " | |
127 | + "(%s -> %s)", cli_name(acptr), cli_user(acptr)->account, parv[2]); | |
128 | + } | |
129 | ||
130 | cli_user(acptr)->acc_flags = acc_flags; | |
131 | ||
7c66a74b | 132 | diff -r aa908af5cc1f ircd/s_err.c |
133 | --- a/ircd/s_err.c Wed Jan 28 19:53:55 2009 +0100 | |
134 | +++ b/ircd/s_err.c Wed Jan 28 20:14:05 2009 +0100 | |
5902ea46 | 135 | @@ -902,7 +902,7 @@ |
136 | /* 434 */ | |
137 | { 0 }, | |
138 | /* 435 */ | |
139 | - { 0 }, | |
140 | + { ERR_ACCOUNTCOLLISION, "%s :Account collision KILL", "435" }, | |
141 | /* 436 */ | |
142 | { ERR_NICKCOLLISION, "%s :Nickname collision KILL", "436" }, | |
143 | /* 437 */ |