X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fs_user.c;h=1f0e0d92ddd990ff543c0445af741d7d72464555;hb=c3e49ba3f999d28a480f8f66cc633d9ea968099f;hp=a859ef8868878f53365108637d1af974e61429a6;hpb=ca71e5857413db52b5e052229593af2962d8c59b;p=ircu2.10.12-pk.git diff --git a/ircd/s_user.c b/ircd/s_user.c index a859ef8..1f0e0d9 100644 --- a/ircd/s_user.c +++ b/ircd/s_user.c @@ -355,6 +355,16 @@ int register_user(struct Client *cptr, struct Client *sptr) Count_unknownbecomesclient(sptr, UserStats); + /* + * Set user's initial modes + */ + tmpstr = (char*)client_get_default_umode(sptr); + if (tmpstr) { + char *umodev[] = { NULL, NULL, NULL, NULL }; + umodev[2] = tmpstr; + set_user_mode(cptr, sptr, 3, umodev, ALLOWMODES_ANY); + } + SetUser(sptr); cli_handler(sptr) = CLIENT_HANDLER; SetLocalNumNick(sptr); @@ -385,16 +395,6 @@ int register_user(struct Client *cptr, struct Client *sptr) cli_info(sptr), NumNick(cptr) /* two %s's */); IPcheck_connect_succeeded(sptr); - /* - * Set user's initial modes - */ - tmpstr = (char*)client_get_default_umode(sptr); - if (tmpstr) { - char *umodev[] = { NULL, NULL, NULL, NULL }; - umodev[2] = tmpstr; - set_user_mode(cptr, sptr, 1, umodev, ALLOWMODES_ANY); - } - } else { struct Client *acptr = user->server; @@ -439,6 +439,10 @@ int register_user(struct Client *cptr, struct Client *sptr) */ if (HasHiddenHost(sptr)) hide_hostmask(sptr, FLAG_HIDDENHOST); + if (IsInvisible(sptr)) + ++UserStats.inv_clients; + if (IsOper(sptr)) + ++UserStats.opers; tmpstr = umode_str(sptr); /* Send full IP address to IPv6-grokking servers. */ @@ -473,6 +477,7 @@ int register_user(struct Client *cptr, struct Client *sptr) FlagSet(&flags, FLAG_ACCOUNT); else FlagClr(&flags, FLAG_ACCOUNT); + client_set_privs(sptr, NULL); send_umode(cptr, sptr, &flags, ALL_UMODES); if ((cli_snomask(sptr) != SNO_DEFAULT) && HasFlag(sptr, FLAG_SERVNOTICE)) send_reply(sptr, RPL_SNOMASK, cli_snomask(sptr), cli_snomask(sptr)); @@ -529,7 +534,6 @@ int set_nick_name(struct Client* cptr, struct Client* sptr, cli_hopcount(new_client) = atoi(parv[2]); cli_lastnick(new_client) = atoi(parv[3]); - client_set_privs(new_client, NULL); /* set privs on user */ /* * Set new nick name. */ @@ -698,10 +702,6 @@ int check_target_limit(struct Client *sptr, void *target, const char *name, assert(cli_local(sptr)); targets = cli_targets(sptr); - /* If user is invited to channel, give him/her a free target */ - if (IsChannelName(name) && IsInvited(sptr, target)) - return 0; - /* * Same target as last time? */ @@ -719,6 +719,10 @@ int check_target_limit(struct Client *sptr, void *target, const char *name, */ if (!created) { if (CurrentTime < cli_nexttarget(sptr)) { + /* If user is invited to channel, give him/her a free target */ + if (IsChannelName(name) && IsInvited(sptr, target)) + return 0; + if (cli_nexttarget(sptr) - CurrentTime < TARGET_DELAY + 8) { /* * No server flooding @@ -796,12 +800,14 @@ int whisper(struct Client* source, const char* nick, const char* channel, if (is_silenced(source, dest)) return 0; - if (cli_user(dest)->away) - send_reply(source, RPL_AWAY, cli_name(dest), cli_user(dest)->away); if (is_notice) sendcmdto_one(source, CMD_NOTICE, dest, "%C :%s", dest, text); else + { + if (cli_user(dest)->away) + send_reply(source, RPL_AWAY, cli_name(dest), cli_user(dest)->away); sendcmdto_one(source, CMD_PRIVATE, dest, "%C :%s", dest, text); + } return 0; } @@ -1072,7 +1078,7 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, do_host_hiding = 1; break; case 'r': - if (what == MODE_ADD) { + if (*(p + 1) && (what == MODE_ADD)) { account = *(++p); SetAccount(sptr); } @@ -1122,7 +1128,10 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, { if ((FlagHas(&setflags, FLAG_OPER) || FlagHas(&setflags, FLAG_LOCOP)) && !IsAnOper(sptr)) + { det_confs_butmask(sptr, CONF_CLIENT & ~CONF_OPERATOR); + client_set_privs(sptr, NULL); + } if (SendServNotice(sptr)) { @@ -1138,28 +1147,6 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, * Compare new flags with old flags and send string which * will cause servers to update correctly. */ - if (!FlagHas(&setflags, FLAG_OPER) && IsOper(sptr)) - { - /* user now oper */ - ++UserStats.opers; - client_set_privs(sptr, NULL); /* may set propagate privilege */ - } - /* remember propagate privilege setting */ - if (HasPriv(sptr, PRIV_PROPAGATE)) - prop = 1; - if (FlagHas(&setflags, FLAG_OPER) && !IsOper(sptr)) - { - /* user no longer oper */ - assert(UserStats.opers > 0); - --UserStats.opers; - client_set_privs(sptr, NULL); /* will clear propagate privilege */ - } - if (FlagHas(&setflags, FLAG_INVISIBLE) && !IsInvisible(sptr)) { - assert(UserStats.inv_clients > 0); - --UserStats.inv_clients; - } - if (!FlagHas(&setflags, FLAG_INVISIBLE) && IsInvisible(sptr)) - ++UserStats.inv_clients; if (!FlagHas(&setflags, FLAG_ACCOUNT) && IsAccount(sptr)) { int len = ACCOUNTLEN; char *ts; @@ -1174,11 +1161,35 @@ int set_user_mode(struct Client *cptr, struct Client *sptr, int parc, } if (!FlagHas(&setflags, FLAG_HIDDENHOST) && do_host_hiding && allow_modes != ALLOWMODES_DEFAULT) hide_hostmask(sptr, FLAG_HIDDENHOST); - if (IsRegistered(sptr)) + + if (IsRegistered(sptr)) { + if (!FlagHas(&setflags, FLAG_OPER) && IsOper(sptr)) { + /* user now oper */ + ++UserStats.opers; + client_set_privs(sptr, NULL); /* may set propagate privilege */ + } + /* remember propagate privilege setting */ + if (HasPriv(sptr, PRIV_PROPAGATE)) { + prop = 1; + } + if (FlagHas(&setflags, FLAG_OPER) && !IsOper(sptr)) { + /* user no longer oper */ + assert(UserStats.opers > 0); + --UserStats.opers; + client_set_privs(sptr, NULL); /* will clear propagate privilege */ + } + if (FlagHas(&setflags, FLAG_INVISIBLE) && !IsInvisible(sptr)) { + assert(UserStats.inv_clients > 0); + --UserStats.inv_clients; + } + if (!FlagHas(&setflags, FLAG_INVISIBLE) && IsInvisible(sptr)) { + ++UserStats.inv_clients; + } + assert(UserStats.opers <= UserStats.clients + UserStats.unknowns); + assert(UserStats.inv_clients <= UserStats.clients + UserStats.unknowns); send_umode_out(cptr, sptr, &setflags, prop); + } - assert(UserStats.opers <= UserStats.clients + UserStats.unknowns); - assert(UserStats.inv_clients <= UserStats.clients + UserStats.unknowns); return 0; }