#include <imp.h>
#include "ngircd.h"
#include "channel.h"
-#include "resolve.h"
#include "conf.h"
#include "hash.h"
#include "irc-write.h"
client->type = Type;
if (ID)
Client_SetID(client, ID);
- if (User)
+ if (User) {
Client_SetUser(client, User, Idented);
+ Client_SetOrigUser(client, User);
+ }
if (Hostname)
Client_SetHostname(client, Hostname);
if (Info)
} /* Client_SetUser */
+/**
+ * Set "original" user name of a client.
+ * This function saves the "original" user name, the user name specified by
+ * the peer using the USER command, into the CLIENT structure. This user
+ * name may be used for authentication, for example.
+ * @param Client The client.
+ * @param User User name to set.
+ */
+GLOBAL void
+Client_SetOrigUser(CLIENT UNUSED *Client, const char UNUSED *User) {
+ assert(Client != NULL);
+ assert(User != NULL);
+
+#if defined(PAM) && defined(IDENTAUTH)
+ strlcpy(Client->orig_user, User, sizeof(Client->orig_user));
+#endif
+} /* Client_SetOrigUser */
+
+
GLOBAL void
Client_SetInfo( CLIENT *Client, const char *Info )
{
} /* Client_User */
+#ifdef PAM
+
+/**
+ * Get the "original" user name as supplied by the USER command.
+ * The user name as given by the client is used for authentication instead
+ * of the one detected using IDENT requests.
+ * @param Client The client.
+ * @return Original user name.
+ */
GLOBAL char *
-Client_Hostname( CLIENT *Client )
+Client_OrigUser(CLIENT *Client) {
+#ifndef IDENTAUTH
+ char *user = Client->user;
+
+ if (user[0] == '~')
+ user++;
+ return user;
+#else
+ return Client->orig_user;
+#endif
+} /* Client_OrigUser */
+
+#endif
+
+
+/**
+ * Return the hostname of a client.
+ * @param Client Pointer to client structure
+ * @return Pointer to client hostname
+ */
+GLOBAL char *
+Client_Hostname(CLIENT *Client)
{
- assert( Client != NULL );
+ assert (Client != NULL);
return Client->host;
} /* Client_Hostname */
+/**
+ * Get potentially cloaked hostname of a client.
+ * If the client has not enabled cloaking, the real hostname is used.
+ * @param Client Pointer to client structure
+ * @return Pointer to client hostname
+ */
+GLOBAL char *
+Client_HostnameCloaked(CLIENT *Client)
+{
+ assert(Client != NULL);
+ if (Client_HasMode(Client, 'x'))
+ return Client_ID(Client->introducer);
+ else
+ return Client_Hostname(Client);
+} /* Client_HostnameCloaked */
+
+
GLOBAL char *
Client_Password( CLIENT *Client )
{
/**
- * return Client-ID ("client!user@host"), this ID is needed for e.g.
- * prefixes. Returnes pointer to static buffer.
+ * Return ID of a client: "client!user@host"
+ * This client ID is used for IRC prefixes, for example.
+ * Please note that this function uses a global static buffer, so you can't
+ * nest invocations without overwriting erlier results!
+ * @param Client Pointer to client structure
+ * @return Pointer to global buffer containing the client ID
*/
GLOBAL char *
Client_Mask( CLIENT *Client )
{
- static char GetID_Buffer[GETID_LEN];
+ static char Mask_Buffer[GETID_LEN];
- assert( Client != NULL );
+ assert (Client != NULL);
- if( Client->type == CLIENT_SERVER ) return Client->id;
+ /* Servers: return name only, there is no "mask" */
+ if (Client->type == CLIENT_SERVER)
+ return Client->id;
- snprintf(GetID_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user, Client->host);
- return GetID_Buffer;
+ snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
+ Client->id, Client->user, Client->host);
+ return Mask_Buffer;
} /* Client_Mask */
+/**
+ * Return ID of a client with cloaked hostname: "client!user@server-name"
+ * This client ID is used for IRC prefixes, for example.
+ * Please note that this function uses a global static buffer, so you can't
+ * nest invocations without overwriting erlier results!
+ * If the client has not enabled cloaking, the real hostname is used.
+ * @param Client Pointer to client structure
+ * @return Pointer to global buffer containing the client ID
+ */
+GLOBAL char *
+Client_MaskCloaked(CLIENT *Client)
+{
+ static char Mask_Buffer[GETID_LEN];
+
+ assert (Client != NULL);
+
+ /* Is the client using cloaking at all? */
+ if (!Client_HasMode(Client, 'x'))
+ return Client_Mask(Client);
+
+ snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
+ Client->id, Client->user, Client_ID(Client->introducer));
+ return Mask_Buffer;
+} /* Client_MaskCloaked */
+
+
GLOBAL CLIENT *
Client_Introducer( CLIENT *Client )
{
sizeof( My_Whowas[slot].id ));
strlcpy( My_Whowas[slot].user, Client_User( Client ),
sizeof( My_Whowas[slot].user ));
- strlcpy( My_Whowas[slot].host, Client_Hostname( Client ),
+ strlcpy( My_Whowas[slot].host, Client_HostnameCloaked( Client ),
sizeof( My_Whowas[slot].host ));
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
sizeof( My_Whowas[slot].info ));
} /* Client_RegisterWhowas */
-GLOBAL char *
+GLOBAL const char *
Client_TypeText(CLIENT *Client)
{
assert(Client != NULL);
} /* Destroy_UserOrService */
+#ifdef DEBUG
+
+GLOBAL void
+Client_DebugDump(void)
+{
+ CLIENT *c;
+
+ Log(LOG_DEBUG, "Client status:");
+ c = My_Clients;
+ while (c) {
+ Log(LOG_DEBUG,
+ " - %s: type=%d, host=%s, user=%s, conn=%d, start=%ld, flags=%s",
+ Client_ID(c), Client_Type(c), Client_Hostname(c),
+ Client_User(c), Client_Conn(c), Client_StartTime(c),
+ Client_Flags(c));
+ c = (CLIENT *)c->next;
+ }
+} /* Client_DumpClients */
+
+#endif
+
+
/* -eof- */