$Log$
+ Revision 607.16 2003/07/10 05:51:46 ajc
+ * Added cs_addr field to struct CitContext -- holds a dotted quad string
+ of the user's source IP (if applicable). It's big enough to hold other
+ types of address strings in the future (such as IPv6).
+ * locate_host() populates cs_addr when on a network connection.
+ * serv_smtp.c now saves the IP address in the proper place in
+ the Received: header.
+ * is_public_client() no longer accepts a hostname. It just looks at
+ CC->cs_host instead.
+
Revision 607.15 2003/06/29 19:54:39 ajc
* Renamed "struct user" to "struct ctdluser"
* Renamed "struct room" to "struct ctdlroom"
Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
* Initial CVS import
-
}
/*
- * Check a hostname against the public_clients file. This determines
+ * Check originating host against the public_clients file. This determines
* whether the client is allowed to change the hostname for this session
* (for example, to show the location of the user rather than the location
* of the client).
*/
-int is_public_client(char *where)
+int is_public_client(void)
{
char buf[SIZ];
FILE *fp;
- lprintf(9, "Checking whether %s is a local client\n", where);
- if (hostnames_match(where, "localhost")) return(1);
- if (hostnames_match(where, config.c_fqdn)) return(1);
+ lprintf(9, "Checking whether %s is a local client\n", CC->cs_host);
+ if (hostnames_match(CC->cs_host, "localhost")) return(1);
+ if (hostnames_match(CC->cs_host, config.c_fqdn)) return(1);
- lprintf(9, "Checking whether %s is a public client\n", where);
+ lprintf(9, "Checking whether %s is a public client\n", CC->cs_host);
fp = fopen("public_clients", "r");
if (fp == NULL) return(0);
while (fgets(buf, sizeof buf, fp)!=NULL) {
while (isspace((buf[strlen(buf)-1])))
buf[strlen(buf)-1] = 0;
- if (hostnames_match(where, buf)) {
+ if (hostnames_match(CC->cs_host, buf)) {
fclose(fp);
return(1);
}
if (strlen(from_host) > 0) {
if (CC->is_local_socket) do_lookup = 1;
- else if (is_public_client(CC->cs_host)) do_lookup = 1;
+ else if (is_public_client()) do_lookup = 1;
}
if (do_lookup) {
lprintf(9, "Looking up hostname '%s'\n", from_host);
if ((addr.s_addr = inet_addr(from_host)) != -1) {
- locate_host(CC->cs_host, sizeof CC->cs_host, &addr);
+ locate_host(CC->cs_host, sizeof CC->cs_host,
+ NULL, 0,
+ &addr);
}
else {
safestrncpy(CC->cs_host, from_host, sizeof CC->cs_host);
generate_nonce(con);
snprintf(con->temp, sizeof con->temp, tmpnam(NULL));
safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
+ safestrncpy(con->cs_addr, "", sizeof con->cs_addr);
con->cs_host[sizeof con->cs_host - 1] = 0;
len = sizeof sin;
if (!CC->is_local_socket) {
if (!getpeername(con->client_socket,
(struct sockaddr *) &sin, &len))
- locate_host(con->cs_host, sizeof con->cs_host, &sin.sin_addr);
+ locate_host(con->cs_host, sizeof con->cs_host,
+ con->cs_addr, sizeof con->cs_addr,
+ &sin.sin_addr);
}
else {
strcpy(con->cs_host, "");
#include "tools.h"
#include "domain.h"
-void locate_host(char *tbuf, size_t n, const struct in_addr *addr)
+void locate_host(char *tbuf, size_t n,
+ char *abuf, size_t na,
+ const struct in_addr *addr)
{
struct hostent *ch;
const char *i;
char *j;
int a1, a2, a3, a4;
+ char address_string[SIZ];
lprintf(9, "locate_host() called\n");
begin_critical_section(S_NETDB);
#endif
- if ((ch = gethostbyaddr((const char *) addr, sizeof(*addr), AF_INET)) ==
- NULL) {
- bad_dns:
- i = (const char *) addr;
- a1 = ((*i++) & 0xff);
- a2 = ((*i++) & 0xff);
- a3 = ((*i++) & 0xff);
- a4 = ((*i++) & 0xff);
- snprintf(tbuf, n, "%d.%d.%d.%d", a1, a2, a3, a4);
+ i = (const char *) addr;
+ a1 = ((*i++) & 0xff);
+ a2 = ((*i++) & 0xff);
+ a3 = ((*i++) & 0xff);
+ a4 = ((*i++) & 0xff);
+ sprintf(address_string, "%d.%d.%d.%d", a1, a2, a3, a4);
+
+ if (abuf != NULL) {
+ safestrncpy(abuf, address_string, na);
+ }
+
+ if ((ch = gethostbyaddr((const char *) addr,
+ sizeof(*addr), AF_INET)) == NULL) {
+bad_dns:
+ safestrncpy(tbuf, address_string, n);
goto end; /* because we might need to end the critical
section */
}