reguser *founder;
flag_t flags;
short type=0;
- unsigned int i;
+ unsigned int i, count;
void *args[3];
if (!rup)
chanservstdmessage(notify, QM_ALREADYREGISTERED, cip->name->content);
return CMD_ERROR;
}
-
+
+ count = 0;
+
+ for (rcup=founder->knownon;rcup;rcup=rcup->nextbyuser)
+ count++;
+
+ if (count > MAXCHANNELS) {
+ chanservstdmessage(sender, QM_TOOMANYCHANNELS, cip->name->content);
+ if (notify)
+ chanservstdmessage(sender, QM_TOOMANYCHANNELS, cip->name->content);
+ return CMD_ERROR;
+ }
+
/* Initialise the channel */
rcp=getregchan();
int csc_doadduser(void *source, int cargc, char **cargv) {
nick *sender=source;
chanindex *cip;
- regchanuser *rcup, *rcuplist;
+ regchanuser *rcup, *trcup, *rcuplist;
regchan *rcp;
reguser *rup;
flag_t addflags;
char *flagbuf;
- unsigned int count=0;
+ unsigned int chanlevcount=0, channelcount=0;
int added=0;
int i, foundflags=0;
void *args[3];
flagbuf=printflags(addflags, rcuflags);
/* ugh */
- for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+ for (chanlevcount=i=0;i<REGCHANUSERHASHSIZE;i++)
for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
- count++;
+ chanlevcount++;
/* If we found flags don't try to add them as a user as well.. */
for (i=1+foundflags;i<cargc;i++) {
continue;
}
- if(count++ >= MAXCHANLEVS) {
+ if(chanlevcount++ >= MAXCHANLEVS) {
chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
chanservstdmessage(sender, QM_DONE);
return CMD_OK;
}
+ channelcount=0;
+ for (trcup=rup->knownon;trcup;trcup=trcup->nextbyuser)
+ channelcount++;
+
+ if(channelcount >= MAXCHANNELS) {
+ chanservstdmessage(sender, QM_TOOMANYCHANNELS);
+ return CMD_ERROR;
+ }
+
rcup=getregchanuser();
rcup->chan=rcp;
rcup->user=rup;
nick *sender=source;
chanindex *cip;
regchan *rcp;
- regchanuser *rcup, *rcuplist;
+ regchanuser *rcup, *trcup, *rcuplist;
regchanuser **rusers;
reguser *rup=getreguserfromnick(sender), *target;
char time1[TIMELEN],time2[TIMELEN];
if (!rcuplist) {
/* new user, we could store a count instead... that's probably better... */
- unsigned int count;
+ unsigned int chanlevcount, channelcount;
- for (count=i=0;i<REGCHANUSERHASHSIZE;i++)
+ for (chanlevcount=i=0;i<REGCHANUSERHASHSIZE;i++)
for (rcuplist=rcp->regusers[i];rcuplist;rcuplist=rcuplist->nextbychan)
- count++;
+ chanlevcount++;
- if(count >= MAXCHANLEVS) {
+ if(chanlevcount >= MAXCHANLEVS) {
chanservstdmessage(sender, QM_TOOMANYCHANLEVS);
return CMD_ERROR;
}
-
+
+ channelcount=0;
+ for (trcup=target->knownon;trcup;trcup=trcup->nextbyuser)
+ channelcount++;
+
+ if(channelcount >= MAXCHANNELS) {
+ chanservstdmessage(sender, QM_TOOMANYCHANNELS);
+ return CMD_ERROR;
+ }
+
rcuplist=getregchanuser();
rcuplist->user=target;
rcuplist->chan=rcp;
#define MAXCHANLEVS 500
#define MAXBANS 50
+/* Maximum number of channels a user may be known on when adding new channels */
+#define MAXCHANNELS 2
+
/* Sources of entropy and standard length defines */
#define ENTROPYSOURCE "/dev/urandom"
#define ENTROPYLEN 8
msg(QM_NOCHANBANAUTOREMOVE, "Bans on $0 will not be automatically removed.", "s"),
msg(QM_INVALIDCHANNAME, "$0 is not a valid channel name.", "s"),
msg(QM_ALREADYREGISTERED, "$0 is already registered.", "s"),
+ msg(QM_TOOMANYCHANNELS, "User is known on too many channels.", ""),
msg(QM_CURUSERFLAGS, "User flags for $0: $1", "ss"),
msg(QM_WELCOMEMESSAGEIS, "Welcome message for $0: $1", "ss"),
msg(QM_GLOBALINFO, "Default info line: $0", "s"),