mirror of
https://github.com/matrix-construct/construct
synced 2024-12-26 15:33:54 +01:00
Upgrade user struct.
This commit is contained in:
parent
9a22cfd393
commit
90093b82e6
23 changed files with 106 additions and 200 deletions
|
@ -24,6 +24,6 @@ h_can_create_channel_authenticated(hook_data_client_approval *data)
|
|||
{
|
||||
struct Client *source_p = data->client;
|
||||
|
||||
if (*source_p->user->suser == '\0' && !IsOper(source_p))
|
||||
if (source_p->user->suser.empty() && !IsOper(source_p))
|
||||
data->approved = ERR_NEEDREGGEDNICK;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ static int eb_account(const char *data, struct Client *client_p,
|
|||
(void)chptr;
|
||||
/* $a alone matches any logged in user */
|
||||
if (data == NULL)
|
||||
return EmptyString(client_p->user->suser) ? NOMATCH : MATCH;
|
||||
return client_p->user->suser.empty()? NOMATCH : MATCH;
|
||||
/* $a:MASK matches users logged in under matching account */
|
||||
return match(data, client_p->user->suser) ? MATCH : NOMATCH;
|
||||
}
|
||||
|
|
|
@ -125,7 +125,7 @@ h_hdl_stats_request(hook_data_int *hdata)
|
|||
{
|
||||
target_p = (Client *)helper_ptr->data;
|
||||
|
||||
if(target_p->user->away)
|
||||
if (target_p->user->away.size())
|
||||
continue;
|
||||
|
||||
count++;
|
||||
|
@ -186,7 +186,7 @@ h_hdl_whois(hook_data_client *hdata)
|
|||
struct Client *source_p = hdata->client;
|
||||
struct Client *target_p = hdata->target;
|
||||
|
||||
if ((target_p->umodes & UMODE_HELPOPS) && EmptyString(target_p->user->away))
|
||||
if ((target_p->umodes & UMODE_HELPOPS) && target_p->user->away.empty())
|
||||
{
|
||||
sendto_one_numeric(source_p, RPL_WHOISHELPOP, form_str(RPL_WHOISHELPOP), target_p->name);
|
||||
}
|
||||
|
|
|
@ -380,7 +380,7 @@ hurt_check_event(void *arg)
|
|||
|
||||
RB_DLINK_FOREACH_SAFE (ptr, next_ptr, hurt_state.hurt_clients.head) {
|
||||
client_p = (Client *)ptr->data;
|
||||
if (!EmptyString(client_p->user->suser))
|
||||
if (client_p->user->suser.size())
|
||||
{
|
||||
rb_dlinkDestroy(ptr, &hurt_state.hurt_clients);
|
||||
sendto_one_notice(client_p, ":HURT restriction removed for this session");
|
||||
|
@ -431,7 +431,7 @@ client_exit_hook(hook_data_client_exit *data)
|
|||
static void
|
||||
new_local_user_hook(struct Client *source_p)
|
||||
{
|
||||
if (IsAnyDead(source_p) || !EmptyString(source_p->user->suser) ||
|
||||
if (IsAnyDead(source_p) || source_p->user->suser.size() ||
|
||||
IsExemptKline(source_p))
|
||||
return;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ hack_channel_access(void *vdata)
|
|||
if (!MyClient(data->client))
|
||||
return;
|
||||
|
||||
if (EmptyString(data->client->user->suser))
|
||||
if (data->client->user->suser.empty())
|
||||
data->approved = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,7 +53,6 @@ struct Whowas;
|
|||
struct DNSReply;
|
||||
struct Listener;
|
||||
struct Client;
|
||||
struct User;
|
||||
struct Server;
|
||||
struct LocalUser;
|
||||
struct PreClient;
|
||||
|
@ -63,22 +62,19 @@ struct ws_ctl;
|
|||
|
||||
typedef int SSL_OPEN_CB(struct Client *, int status);
|
||||
|
||||
/*
|
||||
* Client structures
|
||||
*/
|
||||
struct User
|
||||
struct user
|
||||
{
|
||||
std::map<chan::chan *, chan::membership *> channel;
|
||||
std::set<chan::chan *> invited;
|
||||
char *away; /* pointer to away message */
|
||||
int refcnt; /* Number of times this block is referenced */
|
||||
std::string away;
|
||||
std::string suser;
|
||||
|
||||
char suser[NICKLEN+1];
|
||||
user(const std::string &suser = {}): suser(suser) {}
|
||||
};
|
||||
|
||||
struct Server
|
||||
{
|
||||
struct User *user; /* who activated this connection */
|
||||
std::unique_ptr<struct user> user; // who activated this connection
|
||||
char by[NICKLEN];
|
||||
rb_dlink_list servers;
|
||||
rb_dlink_list users;
|
||||
|
@ -101,7 +97,7 @@ struct Client
|
|||
{
|
||||
rb_dlink_node node;
|
||||
rb_dlink_node lnode;
|
||||
struct User *user; /* ...defined, if this is a User */
|
||||
std::unique_ptr<struct user> user; // ...defined, if this is a user
|
||||
struct Server *serv; /* ...defined, if this is a server */
|
||||
struct Client *servptr; /* Points to server this Client is on */
|
||||
struct Client *from; /* == self, if Local Client, *NEVER* NULL! */
|
||||
|
@ -621,16 +617,11 @@ extern int show_ip(struct Client *source_p, struct Client *target_p);
|
|||
extern int show_ip_conf(struct ConfItem *aconf, struct Client *source_p);
|
||||
extern int show_ip_whowas(struct Whowas *whowas, struct Client *source_p);
|
||||
|
||||
extern void free_user(struct User *, struct Client *);
|
||||
extern struct User *make_user(struct Client *);
|
||||
extern struct Server *make_server(struct Client *);
|
||||
extern void close_connection(struct Client *);
|
||||
extern void init_uid(void);
|
||||
extern char *generate_uid(void);
|
||||
|
||||
void allocate_away(struct Client *);
|
||||
void free_away(struct Client *);
|
||||
|
||||
uint32_t connid_get(struct Client *client_p);
|
||||
void connid_put(uint32_t id);
|
||||
void client_release_connids(struct Client *client_p);
|
||||
|
|
|
@ -42,8 +42,7 @@ extern void send_umode_out(struct Client *, struct Client *, int);
|
|||
extern void show_lusers(struct Client *source_p);
|
||||
extern int register_local_user(struct Client *, struct Client *);
|
||||
|
||||
extern void introduce_client(struct Client *client_p, struct Client *source_p,
|
||||
struct User *user, const char *nick, int use_euid);
|
||||
void introduce_client(struct Client *client_p, struct Client *source_p, user &user, const char *nick, int use_euid);
|
||||
|
||||
extern void change_nick_user_host(struct Client *target_p, const char *nick, const char *user,
|
||||
const char *host, int newts, const char *format, ...);
|
||||
|
|
|
@ -292,17 +292,17 @@ chan::send_join(chan &chan,
|
|||
client.username,
|
||||
client.host,
|
||||
chan.name.c_str(),
|
||||
EmptyString(client.user->suser)? "*" : client.user->suser,
|
||||
client.user->suser.empty()? "*" : client.user->suser.c_str(),
|
||||
client.info);
|
||||
|
||||
// Send away message to away-notify enabled clients.
|
||||
if (client.user->away)
|
||||
if (!client.user->away.empty())
|
||||
sendto_channel_local_with_capability_butone(&client, ALL_MEMBERS, CLICAP_AWAY_NOTIFY, NOCAPS, &chan,
|
||||
":%s!%s@%s AWAY :%s",
|
||||
client.name,
|
||||
client.username,
|
||||
client.host,
|
||||
client.user->away);
|
||||
client.user->away.c_str());
|
||||
}
|
||||
|
||||
chan::membership &
|
||||
|
@ -817,7 +817,7 @@ chan::can_join(client *source_p, chan *chptr, const char *key, const char **forw
|
|||
|
||||
if(chptr->mode.limit && size(chptr->members) >= ulong(chptr->mode.limit))
|
||||
i = ERR_CHANNELISFULL;
|
||||
if(chptr->mode.mode & mode::REGONLY && EmptyString(source_p->user->suser))
|
||||
if(chptr->mode.mode & mode::REGONLY && source_p->user->suser.empty())
|
||||
i = ERR_NEEDREGGEDNICK;
|
||||
/* join throttling stuff --nenolod */
|
||||
else if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
|
||||
|
|
110
ircd/client.cc
110
ircd/client.cc
|
@ -41,11 +41,8 @@ static int qs_server(struct Client *, struct Client *, struct Client *, const ch
|
|||
|
||||
static EVH check_pings;
|
||||
|
||||
static rb_bh *client_heap = NULL;
|
||||
static rb_bh *lclient_heap = NULL;
|
||||
static rb_bh *pclient_heap = NULL;
|
||||
static rb_bh *user_heap = NULL;
|
||||
static rb_bh *away_heap = NULL;
|
||||
static char current_uid[IDLEN];
|
||||
static uint32_t current_connid = 0;
|
||||
|
||||
|
@ -86,11 +83,8 @@ init_client(void)
|
|||
* start off the check ping event .. -- adrian
|
||||
* Every 30 seconds is plenty -- db
|
||||
*/
|
||||
client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE, "client_heap");
|
||||
lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap");
|
||||
pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap");
|
||||
user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap");
|
||||
away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap");
|
||||
|
||||
rb_event_addish("check_pings", check_pings, NULL, 30);
|
||||
rb_event_addish("free_exited_clients", &free_exited_clients, NULL, 4);
|
||||
|
@ -193,7 +187,7 @@ struct Client *
|
|||
make_client(struct Client *from)
|
||||
{
|
||||
struct LocalUser *localClient;
|
||||
struct Client *client_p(reinterpret_cast<Client *>(rb_bh_alloc(client_heap)));
|
||||
struct Client *client_p = new Client;
|
||||
|
||||
if(from == NULL)
|
||||
{
|
||||
|
@ -305,7 +299,7 @@ free_client(struct Client *client_p)
|
|||
free_local_client(client_p);
|
||||
free_pre_client(client_p);
|
||||
rb_free(client_p->certfp);
|
||||
rb_bh_free(client_heap, client_p);
|
||||
delete client_p;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -776,14 +770,14 @@ update_client_exit_stats(struct Client *client_p)
|
|||
static void
|
||||
release_client_state(struct Client *client_p)
|
||||
{
|
||||
if(client_p->user != NULL)
|
||||
if (client_p->user)
|
||||
client_p->user.reset();
|
||||
|
||||
if (client_p->serv)
|
||||
{
|
||||
free_user(client_p->user, client_p); /* try this here */
|
||||
}
|
||||
if(client_p->serv)
|
||||
{
|
||||
if(client_p->serv->user != NULL)
|
||||
free_user(client_p->serv->user, client_p);
|
||||
if (client_p->serv->user)
|
||||
client_p->serv->user.reset();
|
||||
|
||||
if(client_p->serv->fullcaps)
|
||||
rb_free(client_p->serv->fullcaps);
|
||||
rb_free(client_p->serv);
|
||||
|
@ -1653,9 +1647,8 @@ count_local_client_memory(size_t * count, size_t * local_client_memory_used)
|
|||
void
|
||||
count_remote_client_memory(size_t * count, size_t * remote_client_memory_used)
|
||||
{
|
||||
size_t lcount, rcount;
|
||||
size_t lcount(0), rcount(0);
|
||||
rb_bh_usage(lclient_heap, &lcount, NULL, NULL, NULL);
|
||||
rb_bh_usage(client_heap, &rcount, NULL, NULL, NULL);
|
||||
*count = rcount - lcount;
|
||||
*remote_client_memory_used = *count * (sizeof(void *) + sizeof(struct Client));
|
||||
}
|
||||
|
@ -1774,29 +1767,6 @@ show_ip_whowas(struct Whowas *whowas, struct Client *source_p)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* make_user
|
||||
*
|
||||
* inputs - pointer to client struct
|
||||
* output - pointer to struct User
|
||||
* side effects - add's an User information block to a client
|
||||
* if it was not previously allocated.
|
||||
*/
|
||||
struct User *
|
||||
make_user(struct Client *client_p)
|
||||
{
|
||||
struct User *user;
|
||||
|
||||
user = client_p->user;
|
||||
if(!user)
|
||||
{
|
||||
user = (struct User *) rb_bh_alloc(user_heap);
|
||||
user->refcnt = 1;
|
||||
client_p->user = user;
|
||||
}
|
||||
return user;
|
||||
}
|
||||
|
||||
/*
|
||||
* make_server
|
||||
*
|
||||
|
@ -1818,66 +1788,6 @@ make_server(struct Client *client_p)
|
|||
return client_p->serv;
|
||||
}
|
||||
|
||||
/*
|
||||
* free_user
|
||||
*
|
||||
* inputs - pointer to user struct
|
||||
* - pointer to client struct
|
||||
* output - none
|
||||
* side effects - Decrease user reference count by one and release block,
|
||||
* if count reaches 0
|
||||
*/
|
||||
void
|
||||
free_user(struct User *user, struct Client *client_p)
|
||||
{
|
||||
free_away(client_p);
|
||||
|
||||
if(--user->refcnt <= 0)
|
||||
{
|
||||
if(user->away)
|
||||
rb_free((char *) user->away);
|
||||
/*
|
||||
* sanity check
|
||||
*/
|
||||
if(user->refcnt < 0 || !user->invited.empty() || !user->channel.empty())
|
||||
{
|
||||
sendto_realops_snomask(SNO_GENERAL, L_ALL,
|
||||
"* %p user (%s!%s@%s) %p %lu %lu %d *",
|
||||
client_p,
|
||||
client_p ? client_p->
|
||||
name : "<noname>",
|
||||
client_p->username,
|
||||
client_p->host,
|
||||
user,
|
||||
user->invited.size(),
|
||||
user->channel.size(),
|
||||
user->refcnt);
|
||||
s_assert(!user->refcnt);
|
||||
s_assert(user->invited.empty());
|
||||
s_assert(user->channel.empty());
|
||||
}
|
||||
|
||||
rb_bh_free(user_heap, user);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
allocate_away(struct Client *client_p)
|
||||
{
|
||||
if(client_p->user->away == NULL)
|
||||
client_p->user->away = reinterpret_cast<char *>(rb_bh_alloc(away_heap));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
free_away(struct Client *client_p)
|
||||
{
|
||||
if(client_p->user != NULL && client_p->user->away != NULL) {
|
||||
rb_bh_free(away_heap, client_p->user->away);
|
||||
client_p->user->away = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
init_uid(void)
|
||||
{
|
||||
|
|
|
@ -599,7 +599,7 @@ burst_TS6(struct Client *client_p)
|
|||
IsIPSpoof(target_p) ? "0" : target_p->sockhost,
|
||||
target_p->id,
|
||||
IsDynSpoof(target_p) ? target_p->orighost : "*",
|
||||
EmptyString(target_p->user->suser) ? "*" : target_p->user->suser,
|
||||
target_p->user->suser.empty() ? "*" : target_p->user->suser.c_str(),
|
||||
target_p->info);
|
||||
else
|
||||
sendto_one(client_p, ":%s UID %s %d %ld %s %s %s %s %s :%s",
|
||||
|
@ -619,15 +619,17 @@ burst_TS6(struct Client *client_p)
|
|||
if(IsDynSpoof(target_p))
|
||||
sendto_one(client_p, ":%s ENCAP * REALHOST %s",
|
||||
use_id(target_p), target_p->orighost);
|
||||
if(!EmptyString(target_p->user->suser))
|
||||
|
||||
if (!target_p->user->suser.empty())
|
||||
sendto_one(client_p, ":%s ENCAP * LOGIN %s",
|
||||
use_id(target_p), target_p->user->suser);
|
||||
use_id(target_p),
|
||||
target_p->user->suser.c_str());
|
||||
}
|
||||
|
||||
if(ConfigFileEntry.burst_away && !EmptyString(target_p->user->away))
|
||||
if(ConfigFileEntry.burst_away && !target_p->user->away.empty())
|
||||
sendto_one(client_p, ":%s AWAY :%s",
|
||||
use_id(target_p),
|
||||
target_p->user->away);
|
||||
target_p->user->away.c_str());
|
||||
|
||||
hclientinfo.target = target_p;
|
||||
call_hook(h_burst_client, &hclientinfo);
|
||||
|
|
|
@ -320,7 +320,7 @@ int
|
|||
register_local_user(struct Client *client_p, struct Client *source_p)
|
||||
{
|
||||
struct ConfItem *aconf, *xconf;
|
||||
struct User *user = source_p->user;
|
||||
const auto user(source_p->user.get());
|
||||
char tmpstr2[BUFSIZE];
|
||||
char ipaddr[HOSTIPLEN];
|
||||
char myusername[USERLEN+1];
|
||||
|
@ -452,7 +452,7 @@ register_local_user(struct Client *client_p, struct Client *source_p)
|
|||
}
|
||||
}
|
||||
|
||||
if(IsNeedSasl(aconf) && !*user->suser)
|
||||
if(IsNeedSasl(aconf) && user->suser.empty())
|
||||
{
|
||||
ServerStats.is_ref++;
|
||||
sendto_one_notice(source_p, ":*** Notice -- You need to identify via SASL to use this server");
|
||||
|
@ -637,7 +637,7 @@ register_local_user(struct Client *client_p, struct Client *source_p)
|
|||
|
||||
free_pre_client(source_p);
|
||||
|
||||
introduce_client(client_p, source_p, user, source_p->name, 1);
|
||||
introduce_client(client_p, source_p, *user, source_p->name, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -651,7 +651,7 @@ register_local_user(struct Client *client_p, struct Client *source_p)
|
|||
* from a remote connect.
|
||||
*/
|
||||
void
|
||||
introduce_client(struct Client *client_p, struct Client *source_p, struct User *user, const char *nick, int use_euid)
|
||||
introduce_client(struct Client *client_p, struct Client *source_p, user &user, const char *nick, int use_euid)
|
||||
{
|
||||
char ubuf[BUFSIZE];
|
||||
struct Client *identifyservice_p;
|
||||
|
@ -682,7 +682,7 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User *
|
|||
IsIPSpoof(source_p) ? "0" : source_p->sockhost,
|
||||
source_p->id,
|
||||
IsDynSpoof(source_p) ? source_p->orighost : "*",
|
||||
EmptyString(source_p->user->suser) ? "*" : source_p->user->suser,
|
||||
source_p->user->suser.empty()? "*" : source_p->user->suser.c_str(),
|
||||
source_p->info);
|
||||
|
||||
sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS,
|
||||
|
@ -705,10 +705,10 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User *
|
|||
use_id(source_p), source_p->orighost);
|
||||
}
|
||||
|
||||
if (!EmptyString(source_p->user->suser))
|
||||
if (!source_p->user->suser.empty())
|
||||
{
|
||||
sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS, ":%s ENCAP * LOGIN %s",
|
||||
use_id(source_p), source_p->user->suser);
|
||||
use_id(source_p), source_p->user->suser.c_str());
|
||||
}
|
||||
|
||||
if(MyConnect(source_p) && source_p->localClient->passwd)
|
||||
|
@ -1523,7 +1523,7 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use
|
|||
":%s!%s@%s JOIN %s", nick, user, host, chan.name.c_str());
|
||||
sendto_channel_local_with_capability_butone(target_p, chan::ALL_MEMBERS, CLICAP_EXTENDED_JOIN, CLICAP_CHGHOST, &chan,
|
||||
":%s!%s@%s JOIN %s %s :%s", nick, user, host, chan.name.c_str(),
|
||||
EmptyString(target_p->user->suser) ? "*" : target_p->user->suser,
|
||||
target_p->user->suser.empty()? "*" : target_p->user->suser.c_str(),
|
||||
target_p->info);
|
||||
|
||||
if(*mode)
|
||||
|
@ -1534,10 +1534,10 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use
|
|||
}
|
||||
|
||||
/* Resend away message to away-notify enabled clients. */
|
||||
if (target_p->user->away)
|
||||
if (!target_p->user->away.empty())
|
||||
sendto_common_channels_local_butone(target_p, CLICAP_AWAY_NOTIFY, CLICAP_CHGHOST, ":%s!%s@%s AWAY :%s",
|
||||
nick, user, host,
|
||||
target_p->user->away);
|
||||
target_p->user->away.c_str());
|
||||
|
||||
sendto_common_channels_local_butone(target_p, CLICAP_CHGHOST, NOCAPS,
|
||||
":%s!%s@%s CHGHOST %s %s",
|
||||
|
|
|
@ -42,8 +42,8 @@ cap_account_tag_process(hook_data *data)
|
|||
{
|
||||
struct MsgBuf *msgbuf = (MsgBuf *)data->arg1;
|
||||
|
||||
if (data->client != NULL && IsPerson(data->client) && *data->client->user->suser)
|
||||
msgbuf_append_tag(msgbuf, "account", data->client->user->suser, CLICAP_ACCOUNT_TAG);
|
||||
if (data->client != NULL && IsPerson(data->client) && !data->client->user->suser.empty())
|
||||
msgbuf_append_tag(msgbuf, "account", data->client->user->suser.c_str(), CLICAP_ACCOUNT_TAG);
|
||||
}
|
||||
|
||||
DECLARE_MODULE_AV2(cap_account_tag, NULL, NULL, NULL, NULL, cap_account_tag_hfnlist, cap_account_tag_cap_list, NULL, cap_account_tag_desc);
|
||||
|
|
|
@ -787,9 +787,9 @@ msg_client(enum message_type msgtype,
|
|||
return;
|
||||
}
|
||||
|
||||
if(MyConnect(source_p) && (msgtype != MESSAGE_TYPE_NOTICE) && target_p->user && target_p->user->away)
|
||||
if(MyConnect(source_p) && (msgtype != MESSAGE_TYPE_NOTICE) && target_p->user && target_p->user->away.size())
|
||||
sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY),
|
||||
target_p->name, target_p->user->away);
|
||||
target_p->name, target_p->user->away.c_str());
|
||||
|
||||
if(MyClient(target_p))
|
||||
{
|
||||
|
@ -818,7 +818,7 @@ msg_client(enum message_type msgtype,
|
|||
|
||||
/* XXX Controversial? allow opers always to send through a +g */
|
||||
if(!IsServer(source_p) && (IsSetCallerId(target_p) ||
|
||||
(IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])))
|
||||
(IsSetRegOnlyMsg(target_p) && source_p->user->suser.empty())))
|
||||
{
|
||||
/* Here is the anti-flood bot/spambot code -db */
|
||||
if(accept_message(source_p, target_p) || IsOper(source_p))
|
||||
|
@ -829,7 +829,7 @@ msg_client(enum message_type msgtype,
|
|||
source_p->username,
|
||||
source_p->host, cmdname[msgtype], target_p->name, text);
|
||||
}
|
||||
else if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0])
|
||||
else if (IsSetRegOnlyMsg(target_p) && source_p->user->suser.empty())
|
||||
{
|
||||
if (msgtype != MESSAGE_TYPE_NOTICE)
|
||||
sendto_one_numeric(source_p, ERR_NONONREG,
|
||||
|
|
|
@ -990,13 +990,12 @@ register_client(struct Client *client_p, struct Client *server,
|
|||
const char *nick, time_t newts, int parc, const char *parv[])
|
||||
{
|
||||
struct Client *source_p;
|
||||
struct User *user;
|
||||
struct nd_entry *nd;
|
||||
const char *m;
|
||||
int flag;
|
||||
|
||||
source_p = make_client(client_p);
|
||||
user = make_user(source_p);
|
||||
source_p->user.reset(new user);
|
||||
rb_dlinkAddTail(source_p, &source_p->node, &global_client_list);
|
||||
|
||||
source_p->hopcount = atoi(parv[2]);
|
||||
|
@ -1020,7 +1019,7 @@ register_client(struct Client *client_p, struct Client *server,
|
|||
SetDynSpoof(source_p);
|
||||
}
|
||||
if (strcmp(parv[10], "*"))
|
||||
rb_strlcpy(source_p->user->suser, parv[10], sizeof(source_p->user->suser));
|
||||
source_p->user->suser = parv[10];
|
||||
}
|
||||
else if(parc == 10)
|
||||
{
|
||||
|
@ -1094,7 +1093,7 @@ register_client(struct Client *client_p, struct Client *server,
|
|||
|
||||
call_hook(h_new_remote_user, source_p);
|
||||
|
||||
introduce_client(client_p, source_p, user, nick, parc == 12);
|
||||
introduce_client(client_p, source_p, *source_p->user, nick, parc == 12);
|
||||
}
|
||||
|
||||
/* Check if we can do SAVE. target_p can be a client to save or a
|
||||
|
|
|
@ -68,12 +68,11 @@ m_away(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
|
|||
if(parc < 2 || EmptyString(parv[1]))
|
||||
{
|
||||
/* Marking as not away */
|
||||
if(source_p->user->away != NULL)
|
||||
if(source_p->user->away.size())
|
||||
{
|
||||
/* we now send this only if they were away before --is */
|
||||
sendto_server(client_p, NULL, CAP_TS6, NOCAPS,
|
||||
":%s AWAY", use_id(source_p));
|
||||
free_away(source_p);
|
||||
|
||||
sendto_common_channels_local_butone(source_p, CLICAP_AWAY_NOTIFY, NOCAPS, ":%s!%s@%s AWAY",
|
||||
source_p->name, source_p->username, source_p->host);
|
||||
|
@ -101,20 +100,25 @@ m_away(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p
|
|||
ConfigFileEntry.away_interval;
|
||||
}
|
||||
|
||||
if(source_p->user->away == NULL)
|
||||
allocate_away(source_p);
|
||||
if(strncmp(source_p->user->away, parv[1], AWAYLEN - 1))
|
||||
std::string p1(parv[1]);
|
||||
if (p1.size() >= AWAYLEN)
|
||||
p1.resize(AWAYLEN-1);
|
||||
|
||||
if (source_p->user->away != p1)
|
||||
{
|
||||
rb_strlcpy(source_p->user->away, parv[1], AWAYLEN);
|
||||
source_p->user->away = std::move(p1);
|
||||
sendto_server(client_p, NULL, CAP_TS6, NOCAPS,
|
||||
":%s AWAY :%s", use_id(source_p), source_p->user->away);
|
||||
":%s AWAY :%s",
|
||||
use_id(source_p),
|
||||
source_p->user->away.c_str());
|
||||
|
||||
sendto_common_channels_local_butone(source_p,
|
||||
CLICAP_AWAY_NOTIFY, NOCAPS,
|
||||
":%s!%s@%s AWAY :%s",
|
||||
source_p->name,
|
||||
source_p->username,
|
||||
source_p->host,
|
||||
source_p->user->away);
|
||||
source_p->user->away.c_str());
|
||||
}
|
||||
|
||||
if(MyConnect(source_p))
|
||||
|
|
|
@ -142,7 +142,7 @@ m_invite(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
* for +l/+j just check if the mode is set, this varies over time
|
||||
*/
|
||||
if(chptr->mode.mode & chan::mode::INVITEONLY ||
|
||||
(chptr->mode.mode & chan::mode::REGONLY && EmptyString(target_p->user->suser)) ||
|
||||
(chptr->mode.mode & chan::mode::REGONLY && target_p->user->suser.empty()) ||
|
||||
chptr->mode.limit || chptr->mode.join_num)
|
||||
store_invite = 1;
|
||||
|
||||
|
@ -159,9 +159,9 @@ m_invite(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
sendto_one(source_p, form_str(RPL_INVITING),
|
||||
me.name, source_p->name,
|
||||
target_p->name, parv[2]);
|
||||
if(target_p->user->away)
|
||||
if(target_p->user->away.size())
|
||||
sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY),
|
||||
target_p->name, target_p->user->away);
|
||||
target_p->name, target_p->user->away.c_str());
|
||||
}
|
||||
/* invite timestamp */
|
||||
else if(parc > 3 && !EmptyString(parv[3]))
|
||||
|
|
|
@ -115,13 +115,13 @@ me_su(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p,
|
|||
return;
|
||||
|
||||
if(EmptyString(parv[2]))
|
||||
target_p->user->suser[0] = '\0';
|
||||
target_p->user->suser.clear();
|
||||
else
|
||||
rb_strlcpy(target_p->user->suser, parv[2], sizeof(target_p->user->suser));
|
||||
target_p->user->suser = parv[2];
|
||||
|
||||
sendto_common_channels_local_butone(target_p, CLICAP_ACCOUNT_NOTIFY, NOCAPS, ":%s!%s@%s ACCOUNT %s",
|
||||
target_p->name, target_p->username, target_p->host,
|
||||
EmptyString(target_p->user->suser) ? "*" : target_p->user->suser);
|
||||
target_p->user->suser.empty()? "*" : target_p->user->suser.c_str());
|
||||
|
||||
chan::invalidate_bancache_user(target_p);
|
||||
}
|
||||
|
@ -133,7 +133,7 @@ me_login(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source
|
|||
if(!IsPerson(source_p))
|
||||
return;
|
||||
|
||||
rb_strlcpy(source_p->user->suser, parv[1], sizeof(source_p->user->suser));
|
||||
source_p->user->suser = parv[1];
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -293,22 +293,25 @@ h_svc_server_introduced(hook_data_client *hdata)
|
|||
static void
|
||||
h_svc_whois(hook_data_client *data)
|
||||
{
|
||||
char *p = data->target->user->suser;
|
||||
if(!EmptyString(p))
|
||||
{
|
||||
/* Try to strip off any leading digits as this may be used to
|
||||
* store both an ID number and an account name in one field.
|
||||
* If only digits are present, leave as is.
|
||||
*/
|
||||
while(rfc1459::is_digit(*p))
|
||||
p++;
|
||||
if(*p == '\0')
|
||||
p = data->target->user->suser;
|
||||
const auto &suser(data->target->user->suser);
|
||||
if (suser.empty())
|
||||
return;
|
||||
|
||||
sendto_one_numeric(data->client, RPL_WHOISLOGGEDIN,
|
||||
form_str(RPL_WHOISLOGGEDIN),
|
||||
data->target->name, p);
|
||||
}
|
||||
/* Try to strip off any leading digits as this may be used to
|
||||
* store both an ID number and an account name in one field.
|
||||
* If only digits are present, leave as is.
|
||||
*/
|
||||
const char *p(suser.c_str());
|
||||
while(rfc1459::is_digit(*p))
|
||||
p++;
|
||||
|
||||
if(*p == '\0')
|
||||
p = suser.c_str();
|
||||
|
||||
sendto_one_numeric(data->client, RPL_WHOISLOGGEDIN,
|
||||
form_str(RPL_WHOISLOGGEDIN),
|
||||
data->target->name,
|
||||
p);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -144,7 +144,7 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
if(*parv[5] == '*')
|
||||
{
|
||||
if(target_p->user)
|
||||
rb_strlcpy(login, target_p->user->suser, NICKLEN + 1);
|
||||
rb_strlcpy(login, target_p->user->suser.c_str(), NICKLEN + 1);
|
||||
else
|
||||
login[0] = '\0';
|
||||
}
|
||||
|
@ -199,8 +199,6 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
|
||||
if(IsUnknown(target_p))
|
||||
{
|
||||
struct User *user_p = make_user(target_p);
|
||||
|
||||
if(valid & NICK_VALID)
|
||||
rb_strlcpy(target_p->preClient->spoofnick, nick, sizeof(target_p->preClient->spoofnick));
|
||||
|
||||
|
@ -210,7 +208,7 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou
|
|||
if(valid & HOST_VALID)
|
||||
rb_strlcpy(target_p->preClient->spoofhost, host, sizeof(target_p->preClient->spoofhost));
|
||||
|
||||
rb_strlcpy(user_p->suser, login, NICKLEN + 1);
|
||||
target_p->user = std::make_unique<struct user>(login);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -391,7 +389,7 @@ send_signon(struct Client *client_p, struct Client *target_p,
|
|||
use_id(target_p), nick, user, host,
|
||||
(long) target_p->tsinfo, *login ? login : "0");
|
||||
|
||||
rb_strlcpy(target_p->user->suser, login, sizeof(target_p->user->suser));
|
||||
target_p->user->suser = login;
|
||||
|
||||
change_nick_user_host(target_p, nick, user, host, newts, "Signing %s (%s)", *login ? "in" : "out", nick);
|
||||
}
|
||||
|
|
|
@ -836,7 +836,7 @@ stats_operedup (struct Client *source_p)
|
|||
if(IsOperInvis(target_p) && !IsOper(source_p))
|
||||
continue;
|
||||
|
||||
if(target_p->user->away)
|
||||
if(target_p->user->away.size())
|
||||
continue;
|
||||
|
||||
count++;
|
||||
|
@ -1337,10 +1337,10 @@ stats_memory (struct Client *source_p)
|
|||
users_counted++;
|
||||
users_invited_count += target_p->user->invited.size();
|
||||
user_channels += target_p->user->channel.size();
|
||||
if(target_p->user->away)
|
||||
if(target_p->user->away.size())
|
||||
{
|
||||
aways_counted++;
|
||||
away_memory += (strlen(target_p->user->away) + 1);
|
||||
away_memory += target_p->user->away.size() + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1377,7 +1377,7 @@ stats_memory (struct Client *source_p)
|
|||
sendto_one_numeric(source_p, RPL_STATSDEBUG,
|
||||
"z :Users %u(%lu) Invites %u(%lu)",
|
||||
users_counted,
|
||||
(unsigned long) users_counted * sizeof(struct User),
|
||||
(unsigned long) users_counted * sizeof(struct user),
|
||||
users_invited_count,
|
||||
(unsigned long) users_invited_count * sizeof(rb_dlink_node));
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ do_local_user(struct Client *client_p, struct Client *source_p,
|
|||
s_assert(NULL != source_p);
|
||||
s_assert(source_p->username != username);
|
||||
|
||||
make_user(source_p);
|
||||
source_p->user.reset(new user);
|
||||
|
||||
source_p->flags |= FLAGS_SENTUSER;
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ m_userhost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sour
|
|||
rl = sprintf(response, "%s%s=%c%s@%s ",
|
||||
target_p->name,
|
||||
IsOper(target_p) ? "*" : "",
|
||||
(target_p->user->away) ? '-' : '+',
|
||||
(target_p->user->away.size())? '-' : '+',
|
||||
target_p->username,
|
||||
target_p->sockhost);
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ m_userhost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sour
|
|||
rl = sprintf(response, "%s%s=%c%s@%s ",
|
||||
target_p->name,
|
||||
IsOper(target_p) ? "*" : "",
|
||||
(target_p->user->away) ? '-' : '+',
|
||||
(target_p->user->away.size())? '-' : '+',
|
||||
target_p->username, target_p->host);
|
||||
}
|
||||
|
||||
|
|
|
@ -464,7 +464,7 @@ do_who(struct Client *source_p, struct Client *target_p, chan::chan *chan, chan:
|
|||
const char *q;
|
||||
|
||||
sprintf(status, "%c%s%s",
|
||||
target_p->user->away ? 'G' : 'H', IsOper(target_p) ? "*" : "", msptr ? find_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : "");
|
||||
target_p->user->away.size()? 'G' : 'H', IsOper(target_p) ? "*" : "", msptr ? find_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : "");
|
||||
|
||||
if (fmt->fields == 0)
|
||||
sendto_one(source_p, form_str(RPL_WHOREPLY), me.name,
|
||||
|
@ -507,13 +507,13 @@ do_who(struct Client *source_p, struct Client *target_p, chan::chan *chan, chan:
|
|||
if (fmt->fields & FIELD_ACCOUNT)
|
||||
{
|
||||
/* display as in whois */
|
||||
q = target_p->user->suser;
|
||||
q = target_p->user->suser.c_str();
|
||||
if (!EmptyString(q))
|
||||
{
|
||||
while(rfc1459::is_digit(*q))
|
||||
q++;
|
||||
if(*q == '\0')
|
||||
q = target_p->user->suser;
|
||||
q = target_p->user->suser.c_str();
|
||||
}
|
||||
else
|
||||
q = "0";
|
||||
|
|
|
@ -288,9 +288,9 @@ single_whois(struct Client *source_p, struct Client *target_p, int operspy)
|
|||
target_p->name, target_p->servptr->name,
|
||||
target_p->servptr->info);
|
||||
|
||||
if(target_p->user->away)
|
||||
if(target_p->user->away.size())
|
||||
sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY),
|
||||
target_p->name, target_p->user->away);
|
||||
target_p->name, target_p->user->away.c_str());
|
||||
|
||||
if(IsOper(target_p) && (!ConfigFileEntry.hide_opers_in_whois || IsOper(source_p)))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue