diff --git a/include/client.h b/include/client.h index 89c4cf8a..f00cfad4 100644 --- a/include/client.h +++ b/include/client.h @@ -316,6 +316,8 @@ struct PreClient struct AuthClient auth; struct rb_sockaddr_storage lip; /* address of our side of the connection */ + + char id[IDLEN]; /* UID/SID, unique on the network (unverified) */ }; struct ListClient diff --git a/modules/core/m_server.c b/modules/core/m_server.c index 1a05ac0b..850a67d8 100644 --- a/modules/core/m_server.c +++ b/modules/core/m_server.c @@ -296,22 +296,25 @@ mr_server(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sourc return; } - if(has_id(client_p) && (target_p = find_id(client_p->id)) != NULL) - { - sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, - "Attempt to re-introduce SID %s from %s%s (already in use by %s)", - client_p->id, - EmptyString(client_p->name) ? name : "", - client_p->name, target_p->name); - ilog(L_SERVER, "Attempt to re-introduce SID %s from %s%s (already in use by %s)", - client_p->id, - EmptyString(client_p->name) ? name : "", - log_client_name(client_p, SHOW_IP), - target_p->name); + if (client_p->preClient && !EmptyString(client_p->preClient->id)) { + if ((target_p = find_id(client_p->preClient->id)) != NULL) { + sendto_realops_snomask(SNO_GENERAL, is_remote_connect(client_p) ? L_NETWIDE : L_ALL, + "Attempt to re-introduce SID %s from %s%s (already in use by %s)", + client_p->preClient->id, + EmptyString(client_p->name) ? name : "", + client_p->name, target_p->name); + ilog(L_SERVER, "Attempt to re-introduce SID %s from %s%s (already in use by %s)", + client_p->preClient->id, + EmptyString(client_p->name) ? name : "", + log_client_name(client_p, SHOW_IP), + target_p->name); - sendto_one(client_p, "ERROR :SID already exists."); - exit_client(client_p, client_p, client_p, "SID Exists"); - return; + sendto_one(client_p, "ERROR :SID already exists."); + exit_client(client_p, client_p, client_p, "SID Exists"); + return; + } else { + rb_strlcpy(client_p->id, client_p->preClient->id, sizeof(client_p->id)); + } } /* diff --git a/modules/m_pass.c b/modules/m_pass.c index 36398055..d0009de8 100644 --- a/modules/m_pass.c +++ b/modules/m_pass.c @@ -83,7 +83,7 @@ mr_pass(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_ client_p->localClient->auth_user = rb_strndup(auth_user, PASSWDLEN); /* These are for servers only */ - if(parc > 2 && client_p->user == NULL) + if(parc > 2 && client_p->user == NULL && client_p->preClient != NULL) { /* * It looks to me as if orabidoo wanted to have more @@ -101,10 +101,10 @@ mr_pass(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_ /* only mark as TS6 if the SID is valid.. */ if(IsDigit(parv[4][0]) && IsIdChar(parv[4][1]) && IsIdChar(parv[4][2]) && parv[4][3] == '\0' && - EmptyString(client_p->id)) + EmptyString(client_p->preClient->id)) { client_p->localClient->caps |= CAP_TS6; - rb_strlcpy(client_p->id, parv[4], sizeof(client_p->id)); + rb_strlcpy(client_p->preClient->id, parv[4], sizeof(client_p->preClient->id)); } } }