mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-07-08 17:13:12 +02:00
- CHGHOST: Switch from part-join-mode to quit-join-mode like charybdis and ircu. (#3038)
This commit is contained in:
+2
-2
@@ -571,8 +571,8 @@ extern u_int16_t getrandom16();
|
||||
extern u_int32_t getrandom32();
|
||||
extern MODVAR char trouble_info[1024];
|
||||
#define EVENT_DRUGS BASE_VERSION
|
||||
extern void rejoin_doparts(aClient *sptr, char did_parts[]);
|
||||
extern void rejoin_dojoinandmode(aClient *sptr, char did_parts[]);
|
||||
extern void rejoin_doquits(aClient *sptr);
|
||||
extern void rejoin_dojoinandmode(aClient *sptr);
|
||||
extern void ident_failed(aClient *cptr);
|
||||
|
||||
extern MODVAR char extchmstr[4][64];
|
||||
|
||||
+6
-32
@@ -1497,44 +1497,24 @@ void send_user_joins(aClient *cptr, aClient *user)
|
||||
}
|
||||
|
||||
/*
|
||||
* rejoin_doparts:
|
||||
* sends a PART to all channels (to local users only)
|
||||
* rejoin_doquits:
|
||||
* sends a QUIT to all common channels (to local users only)
|
||||
*/
|
||||
void rejoin_doparts(aClient *sptr, char did_parts[])
|
||||
void rejoin_doquits(aClient *sptr)
|
||||
{
|
||||
Membership *tmp;
|
||||
aChannel *chptr;
|
||||
char *comment = "Rejoining because of user@host change";
|
||||
char *comment = "Changing host";
|
||||
int i = 0;
|
||||
|
||||
for (tmp = sptr->user->channel; tmp; tmp = tmp->next)
|
||||
{
|
||||
chptr = tmp->chptr;
|
||||
if (!chptr)
|
||||
continue; /* Possible? */
|
||||
|
||||
/* If the user is banned, don't do it */
|
||||
if (is_banned(sptr, chptr, BANCHK_JOIN))
|
||||
{
|
||||
did_parts[i++] = 0;
|
||||
continue;
|
||||
}
|
||||
did_parts[i++] = 1;
|
||||
|
||||
if ((chptr->mode.mode & MODE_AUDITORIUM) &&
|
||||
!(tmp->flags & (CHFL_CHANOWNER|CHFL_CHANPROT|CHFL_CHANOP)))
|
||||
{
|
||||
sendto_chanops_butone(sptr, chptr, ":%s!%s@%s PART %s :%s", sptr->name, sptr->user->username, GetHost(sptr), chptr->chname, comment);
|
||||
} else
|
||||
sendto_channel_butserv_butone(chptr, sptr, sptr, ":%s PART %s :%s", sptr->name, chptr->chname, comment);
|
||||
}
|
||||
sendto_common_channels(sptr, ":%s!%s@%s QUIT :%s", comment);
|
||||
}
|
||||
|
||||
/*
|
||||
* rejoin_dojoinandmode:
|
||||
* sends a JOIN and a MODE (if needed) to restore qaohv modes (to local users only)
|
||||
*/
|
||||
void rejoin_dojoinandmode(aClient *sptr, char did_parts[])
|
||||
void rejoin_dojoinandmode(aClient *sptr)
|
||||
{
|
||||
Membership *tmp;
|
||||
aChannel *chptr;
|
||||
@@ -1548,10 +1528,6 @@ void rejoin_dojoinandmode(aClient *sptr, char did_parts[])
|
||||
if (!chptr)
|
||||
continue; /* Is it possible? */
|
||||
|
||||
/* If the user is banned, don't do it */
|
||||
if (!did_parts[j++])
|
||||
continue;
|
||||
|
||||
if ((chptr->mode.mode & MODE_AUDITORIUM) &&
|
||||
!(flags & (CHFL_CHANOWNER|CHFL_CHANPROT|CHFL_CHANOP)))
|
||||
{
|
||||
@@ -1584,8 +1560,6 @@ void rejoin_dojoinandmode(aClient *sptr, char did_parts[])
|
||||
if (i < n - 1)
|
||||
strcat(parabuf, " ");
|
||||
}
|
||||
sendto_channel_butserv_butone(chptr, &me, sptr, ":%s MODE %s +%s %s",
|
||||
me.name, chptr->chname, flagbuf, parabuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,19 +137,16 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
|
||||
if ((acptr = find_person(parv[1], NULL)))
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, acptr->user->joined);
|
||||
if (MyClient(sptr) && (IsLocOp(sptr) && !MyClient(acptr)))
|
||||
{
|
||||
sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
|
||||
parv[0]);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (!strcmp(GetHost(acptr), parv[2]))
|
||||
{
|
||||
sendnotice(sptr, "*** /ChgHost Error: requested host is same as current host.");
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
switch (UHOST_ALLOWED)
|
||||
@@ -159,7 +156,6 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
{
|
||||
sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGHOST",
|
||||
"This command is disabled on this server");
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -169,12 +165,11 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (IsPerson(acptr) && MyClient(sptr) && acptr->user->joined)
|
||||
{
|
||||
sendnotice(sptr, "*** /ChgHost can not be used while %s is on a channel", acptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case UHALLOW_REJOIN:
|
||||
rejoin_doparts(acptr, did_parts);
|
||||
rejoin_doquits(acptr);
|
||||
/* join sent later when the host has been changed */
|
||||
break;
|
||||
}
|
||||
@@ -203,8 +198,7 @@ DLLFUNC int m_chghost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
}
|
||||
acptr->user->virthost = strdup(parv[2]);
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(acptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(acptr);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -150,12 +150,10 @@ int legalident = 1;
|
||||
|
||||
if ((acptr = find_person(parv[1], NULL)))
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, acptr->user->joined);
|
||||
if (MyClient(sptr) && (IsLocOp(sptr) && !MyClient(acptr)))
|
||||
{
|
||||
sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name,
|
||||
parv[0]);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -166,7 +164,6 @@ int legalident = 1;
|
||||
{
|
||||
sendto_one(sptr, err_str(ERR_DISABLED), me.name, sptr->name, "CHGIDENT",
|
||||
"This command is disabled on this server");
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -176,12 +173,11 @@ int legalident = 1;
|
||||
if (IsPerson(acptr) && MyClient(sptr) && acptr->user->joined)
|
||||
{
|
||||
sendnotice(sptr, "*** /ChgIdent can not be used while %s is on a channel", acptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case UHALLOW_REJOIN:
|
||||
rejoin_doparts(acptr, did_parts);
|
||||
rejoin_doquits(acptr);
|
||||
/* join sent later when the ident has been changed */
|
||||
break;
|
||||
}
|
||||
@@ -205,8 +201,7 @@ int legalident = 1;
|
||||
TOK_CHGIDENT, "%s %s", acptr->name, parv[2]);
|
||||
ircsprintf(acptr->user->username, "%s", parv[2]);
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(acptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(acptr);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -2271,15 +2271,13 @@ DLLFUNC CMD_FUNC(_m_umode)
|
||||
MSG_SETHOST, TOK_SETHOST, "%s", sptr->user->virthost);
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
/* LOL, this is ugly ;) */
|
||||
sptr->umodes &= ~UMODE_HIDE;
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
sptr->umodes |= UMODE_HIDE;
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
if (MyClient(sptr))
|
||||
sptr->since += 7; /* Add fake lag */
|
||||
DYN_FREE(did_parts);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2287,15 +2285,13 @@ DLLFUNC CMD_FUNC(_m_umode)
|
||||
{
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
/* LOL, this is ugly ;) */
|
||||
sptr->umodes |= UMODE_HIDE;
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
sptr->umodes &= ~UMODE_HIDE;
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
if (MyClient(sptr))
|
||||
sptr->since += 7; /* Add fake lag */
|
||||
DYN_FREE(did_parts);
|
||||
}
|
||||
if (sptr->user->virthost)
|
||||
{
|
||||
|
||||
@@ -187,14 +187,12 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
}
|
||||
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
switch (UHOST_ALLOWED)
|
||||
{
|
||||
case UHALLOW_NEVER:
|
||||
if (MyClient(sptr))
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /SetHost is disabled", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -204,12 +202,11 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (MyClient(sptr) && sptr->user->joined)
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /SetHost can not be used while you are on a channel", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case UHALLOW_REJOIN:
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
/* join sent later when the host has been changed */
|
||||
break;
|
||||
}
|
||||
@@ -229,8 +226,7 @@ DLLFUNC int m_sethost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
"%s", parv[1]);
|
||||
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
}
|
||||
|
||||
if (MyConnect(sptr))
|
||||
|
||||
@@ -188,7 +188,6 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
}
|
||||
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
switch (UHOST_ALLOWED)
|
||||
{
|
||||
case UHALLOW_ALWAYS:
|
||||
@@ -197,7 +196,6 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (MyClient(sptr))
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent is disabled", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -205,12 +203,11 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (MyClient(sptr) && sptr->user->joined)
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /SetIdent can not be used while you are on a channel", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case UHALLOW_REJOIN:
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -221,8 +218,7 @@ DLLFUNC int m_setident(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
MSG_SETIDENT, TOK_SETIDENT, "%s", parv[1]);
|
||||
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
}
|
||||
|
||||
if (MyConnect(sptr))
|
||||
|
||||
@@ -132,7 +132,6 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (i > 0)
|
||||
{
|
||||
char olduser[USERLEN+1];
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
|
||||
switch (UHOST_ALLOWED)
|
||||
{
|
||||
@@ -140,7 +139,6 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (MyClient(sptr))
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /vhost is disabled", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -150,12 +148,11 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
if (MyClient(sptr) && sptr->user->joined)
|
||||
{
|
||||
sendto_one(sptr, ":%s NOTICE %s :*** /vhost can not be used while you are on a channel", me.name, sptr->name);
|
||||
DYN_FREE(did_parts);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case UHALLOW_REJOIN:
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
/* join sent later when the host has been changed */
|
||||
break;
|
||||
}
|
||||
@@ -200,8 +197,7 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[])
|
||||
sptr->user->realhost, vhost->virtuser ? vhost->virtuser : "",
|
||||
vhost->virtuser ? "@" : "", vhost->virthost);
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
return 0;
|
||||
}
|
||||
if (i == -1)
|
||||
|
||||
+3
-8
@@ -68,15 +68,11 @@ static char buf[BUFSIZE];
|
||||
|
||||
void iNAH_host(aClient *sptr, char *host)
|
||||
{
|
||||
DYN_LOCAL(char, did_parts, sptr->user->joined);
|
||||
if (!sptr->user)
|
||||
{
|
||||
DYN_FREE(did_parts);
|
||||
return;
|
||||
}
|
||||
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_doparts(sptr, did_parts);
|
||||
rejoin_doquits(sptr);
|
||||
if (sptr->user->virthost)
|
||||
{
|
||||
MyFree(sptr->user->virthost);
|
||||
@@ -87,10 +83,9 @@ void iNAH_host(aClient *sptr, char *host)
|
||||
sendto_serv_butone_token(&me, sptr->name, MSG_SETHOST,
|
||||
TOK_SETHOST, "%s", sptr->user->virthost);
|
||||
sptr->umodes |= UMODE_SETHOST;
|
||||
|
||||
|
||||
if (UHOST_ALLOWED == UHALLOW_REJOIN)
|
||||
rejoin_dojoinandmode(sptr, did_parts);
|
||||
DYN_FREE(did_parts);
|
||||
rejoin_dojoinandmode(sptr);
|
||||
}
|
||||
|
||||
long set_usermode(char *umode)
|
||||
|
||||
Reference in New Issue
Block a user