/*
* This file contains functions which handle the mapping of Internet addresses
* to users on the Citadel system.
+ *
+ * Copyright (c) 1987-2015 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*/
+
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
#include <errno.h>
#include <sys/types.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-
+#include <time.h>
#include <sys/wait.h>
#include <string.h>
#include <limits.h>
}
else if (!strcasecmp(encoding, "Q")) { /**< quoted-printable */
size_t len;
- long pos;
+ unsigned long pos;
len = strlen(istr);
pos = 0;
if (fqdn == NULL) return(hostalias_nomatch);
if (IsEmptyStr(fqdn)) return(hostalias_nomatch);
if (!strcasecmp(fqdn, "localhost")) return(hostalias_localhost);
- if (!strcasecmp(fqdn, config.c_fqdn)) return(hostalias_localhost);
- if (!strcasecmp(fqdn, config.c_nodename)) return(hostalias_localhost);
+ if (!strcasecmp(fqdn, CtdlGetConfigStr("c_fqdn"))) return(hostalias_localhost);
+ if (!strcasecmp(fqdn, CtdlGetConfigStr("c_nodename"))) return(hostalias_localhost);
if (inetcfg == NULL) return(hostalias_nomatch);
config_lines = num_tokens(inetcfg, '\n');
*/
void remove_any_whitespace_to_the_left_or_right_of_at_symbol(char *name)
{
- int i;
+ unsigned int i;
for (i = 0; i < strlen(name); ++i) {
if (name[i] == '@') {
strcpy(name, &name[1]);
aaa[strlen(aaa) - 1] = 0;
strcpy(bbb, "");
- for (a = 0; a < strlen(aaa); ++a) {
+ for (a = 0; aaa[a] != '\0'; ++a) {
if (aaa[a] == ',') {
strcpy(bbb, &aaa[a + 1]);
aaa[a] = 0;
+ break;
}
}
if (!strcasecmp(name, aaa))
}
/* Change "user @ xxx" to "user" if xxx is an alias for this host */
- for (a=0; a<strlen(name); ++a) {
+ for (a=0; name[a] != '\0'; ++a) {
if (name[a] == '@') {
if (CtdlHostAlias(&name[a+1]) == hostalias_localhost) {
name[a] = 0;
MSG_syslog(LOG_INFO, "Changed to <%s>\n", name);
+ break;
}
}
}
case MES_LOCAL:
if (!strcasecmp(this_recp, "sysop")) {
++ret->num_room;
- strcpy(this_recp, config.c_aideroom);
+ strcpy(this_recp, CtdlGetConfigStr("c_aideroom"));
if (!IsEmptyStr(ret->recp_room)) {
strcat(ret->recp_room, "|");
}
sField < pFieldEnd;
pField++, sField++)
{
- if ((*sField=='\r') || (*sField=='\n')) {
- sField++;
- if (*sField == '\n')
- sField++;
- *pField = *sField;
+ if ((*sField=='\r') || (*sField=='\n'))
+ {
+ int Offset = 1;
+ while (((*(sField + Offset) == '\r') ||
+ (*(sField + Offset) == '\n') ||
+ (isspace(*(sField + Offset)))) &&
+ (sField + Offset < pFieldEnd))
+ Offset ++;
+ sField += Offset;
+ *pField = *sField;
}
else {
if (*sField=='\"') quote = 1 - quote;
int a;
strcpy(user, "");
- strcpy(node, config.c_fqdn);
+ strcpy(node, CtdlGetConfigStr("c_fqdn"));
strcpy(name, "");
if (rfc822 == NULL) return;
strcpy(name, &name[1]);
/* and anything to the right of a @ or % */
- for (a = 0; a < strlen(name); ++a) {
- if (name[a] == '@')
+ for (a = 0; name[a] != '\0'; ++a) {
+ if (name[a] == '@') {
name[a] = 0;
- if (name[a] == '%')
+ break;
+ }
+ if (name[a] == '%') {
name[a] = 0;
+ break;
+ }
}
/* but if there are parentheses, that changes the rules... */
strcpy(&name[0], &name[1]);
}
strcpy(&name[0], &name[1]);
- for (a = 0; a < strlen(name); ++a)
- if (name[a] == 34)
+ for (a = 0; name[a] != '\0'; ++a)
+ if (name[a] == 34) {
name[a] = 0;
+ break;
+ }
}
/* extract user id */
strcpy(user, rfc822);
strcpy(user, &user[1]);
/* and anything to the right of a @ or % */
- for (a = 0; a < strlen(user); ++a) {
- if (user[a] == '@')
+ for (a = 0; user[a] != '\0'; ++a) {
+ if (user[a] == '@') {
user[a] = 0;
- if (user[a] == '%')
+ break;
+ }
+ if (user[a] == '%') {
user[a] = 0;
+ break;
+ }
}
&& (haschar(node, '%')==0)
&& (haschar(node, '!')==0)
) {
- strcpy(node, config.c_nodename);
+ strcpy(node, CtdlGetConfigStr("c_nodename"));
}
else {
strcpy(node, &node[1]);
/* now get rid of the user portion of a node!user string */
- for (a = 0; a < strlen(node); ++a)
- if (node[a] == '!')
+ for (a = 0; node[a] != '\0'; ++a)
+ if (node[a] == '!') {
node[a] = 0;
+ break;
+ }
}
/* strip leading and trailing spaces in all strings */
* message text.
*/
int convert_field(struct CtdlMessage *msg, const char *beg, const char *end) {
+ struct CitContext *CCC = CC;
char *key, *value, *valueend;
long len;
const char *pos;
else if (!strcasecmp(key, "From")) {
process_rfc822_addr(value, user, node, name);
- syslog(LOG_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
+ MSG_syslog(LOG_DEBUG, "Converted to <%s@%s> (%s)\n", user, node, name);
snprintf(addr, sizeof(addr), "%s@%s", user, node);
- if (CM_IsEmpty(msg, eAuthor))
+ if (CM_IsEmpty(msg, eAuthor) && !IsEmptyStr(name))
CM_SetField(msg, eAuthor, name, strlen(name));
- if (CM_IsEmpty(msg, erFc822Addr))
+ if (CM_IsEmpty(msg, erFc822Addr) && !IsEmptyStr(addr))
CM_SetField(msg, erFc822Addr, addr, strlen(addr));
processed = 1;
}
void directory_key(char *key, char *addr) {
int i;
int keylen = 0;
+ struct CitContext *CCC = CC;
for (i=0; !IsEmptyStr(&addr[i]); ++i) {
if (!isspace(addr[i])) {
}
key[keylen++] = 0;
- syslog(LOG_DEBUG, "Directory key is <%s>\n", key);
+ MSG_syslog(LOG_DEBUG, "Directory key is <%s>\n", key);
}
*/
int CtdlDirectoryAddUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
+ struct CitContext *CCC = CC;
if (IsDirectory(internet_addr, 0) == 0)
return 0;
- syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
+ MSG_syslog(LOG_DEBUG, "Create directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
cdb_store(CDB_DIRECTORY, key, strlen(key), citadel_addr, strlen(citadel_addr)+1 );
return 1;
*/
int CtdlDirectoryDelUser(char *internet_addr, char *citadel_addr) {
char key[SIZ];
-
- syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
+ struct CitContext *CCC = CC;
+
+ MSG_syslog(LOG_DEBUG, "Delete directory entry: %s --> %s\n", internet_addr, citadel_addr);
directory_key(key, internet_addr);
return cdb_delete(CDB_DIRECTORY, key, strlen(key) ) == 0;
}