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.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"
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
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).
*/
* 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;
{
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;
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)) {
if (strlen(from_host) > 0) {
if (CC->is_local_socket) do_lookup = 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) {
}
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);
}
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);
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))
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, "");
}
else {
strcpy(con->cs_host, "");
void set_wtmpsupp_to_current_room(void);
void cmd_info (void);
void cmd_time (void);
void set_wtmpsupp_to_current_room(void);
void cmd_info (void);
void cmd_time (void);
-int is_public_client (char *where);
void cmd_iden (char *argbuf);
void cmd_mesg (char *mname);
void cmd_emsg (char *mname);
void cmd_iden (char *argbuf);
void cmd_mesg (char *mname);
void cmd_emsg (char *mname);
#include "tools.h"
#include "domain.h"
#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;
{
struct hostent *ch;
const char *i;
char *j;
int a1, a2, a3, a4;
+ char address_string[SIZ];
lprintf(9, "locate_host() called\n");
lprintf(9, "locate_host() called\n");
begin_critical_section(S_NETDB);
#endif
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 */
}
goto end; /* because we might need to end the critical
section */
}
-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);
int rbl_check(char *message_to_spammer);
int rbl_check(char *message_to_spammer);
datestring(nowstamp, sizeof nowstamp, time(NULL), DATESTRING_RFC822);
body = mallok(4096);
datestring(nowstamp, sizeof nowstamp, time(NULL), DATESTRING_RFC822);
body = mallok(4096);
- /* FIXME
- it should be Received: from %s (real.name.dom [w.x.y.z])
- */
if (body != NULL) snprintf(body, 4096,
if (body != NULL) snprintf(body, 4096,
- "Received: from %s (%s)\n"
+ "Received: from %s (%s [%s])\n"
" by %s; %s\n",
SMTP->helo_node,
CC->cs_host,
" by %s; %s\n",
SMTP->helo_node,
CC->cs_host,
config.c_fqdn,
nowstamp);
config.c_fqdn,
nowstamp);
int cs_clientver; /* client version number */
char cs_clientname[32]; /* name of client software */
char cs_host[64]; /* host logged in from */
int cs_clientver; /* client version number */
char cs_clientname[32]; /* name of client software */
char cs_host[64]; /* host logged in from */
+ char cs_addr[64]; /* address logged in from */
/* The Internet type of thing */
char cs_inet_email[SIZ];/* Return address of outbound Internet mail */
/* The Internet type of thing */
char cs_inet_email[SIZ];/* Return address of outbound Internet mail */