-- the queue now will rewrite the envelope with correct values as to if a recipient is local or remote. this removes the need for smtp to listen on queues 6 and 7 both

-- change an old LoggerEvent call for the new Log function call
-- fixed a bug in CheckTrustedHost() where it wouldn't ever find an entry
This commit is contained in:
pfelt
2007-11-30 07:15:17 +00:00
parent bf77accbc2
commit 7e96de2317
5 changed files with 64 additions and 72 deletions
+1 -1
View File
@@ -175,7 +175,7 @@ ReadConfiguration (BOOL *recover)
XplConsolePrintf("bongoqueue: WARNING - Tuning parameters adjusted to %ld par./%ld seq.\r\n", Conf.maxConcurrentWorkers, Conf.maxSequentialWorkers);
XplBell();
LoggerEvent(Agent.agent.loggingHandle, LOGGER_SUBSYSTEM_CONFIGURATION, LOGGER_EVENT_QLIMITS_ADJUSTED, LOG_WARNING, 0, NULL, NULL, Conf.maxConcurrentWorkers, Conf.maxSequentialWorkers, NULL, 0);
Log(LOG_INFO, "Not enough memory; tuning parameters adjusted; concurrent limit: %d, sequential limit: %d", Conf.maxConcurrentWorkers, Conf.maxSequentialWorkers);
Conf.defaultConcurrentWorkers = Conf.maxConcurrentWorkers;
Conf.defaultSequentialWorkers = Conf.maxSequentialWorkers;
}
+10 -10
View File
@@ -116,16 +116,16 @@
#define NMAP_DOMAIN_LOCATION_COMMAND "DOMAIN LOCATION"
#define NMAP_DOMAIN_LOCATION_HELP "DOMAIN LOCATION - Determine if a domain is local or remote.\r\n"
#define MSG1000LOCAL "1000 LOCAL %s\r\n"
#define MSG1001RELAY "1001 RELAY %s\r\n"
#define MSG1002REMOTE "1002 REMOTE %s\r\n"
#define MSG4001NO_USER "4001 Invalid address %s\r\n"
#define MSG4000LOOP "4000 Aliasing loop\r\n"
#define MSG4000UNKNOWN_TYPE "4000 Unknown mapping type\r\n"
#define MSG1000LOCAL "1000 LOCAL %s"
#define MSG1001RELAY "1001 RELAY %s"
#define MSG1002REMOTE "1002 REMOTE %s"
#define MSG4001NO_USER "4001 Invalid address %s"
#define MSG4000LOOP "4000 Aliasing loop"
#define MSG4000UNKNOWN_TYPE "4000 Unknown mapping type"
/* --------------------------------------------------- */
#define MSG1000READY "Bongo NMAP server ready"
#define MSG1000BYE "Bongo NMAP signing off"
#define MSG1000READY "bongoqueue server ready"
#define MSG1000BYE "bongoqueue signing off"
#define MSG1000LOGINOK "1000 Login ok\r\n"
#define MSG1000FLAGSET "Flags set"
#define MSG1000FLAGINFO "Current Flags"
@@ -257,8 +257,8 @@
#define MSG4230PATHTOOLONG "4230 Path exceeds allowed length\r\n"
#define MSG4240NOPERMISSION "4240 Permission denied\r\n"
#define MSG4241AUTHDONE "4241 Already authenticated\r\n"
#define MSG4242AUTHREQUIRED "4242 NMAP <%s>\r\n"
#define MSG4242AUTHREQUIREDF "4242 NMAP <%x%s%x>\r\n"
#define MSG4242AUTHREQUIRED "4242 bongoqueue <%s>\r\n"
#define MSG4242AUTHREQUIREDF "4242 bongoqueue <%x%s%x>\r\n"
#define MSG4260NOQENTRY "4260 No queue entry open, try QCREA\r\n"
#define MSG4261NODOMAIN "4261 No queue entry with that domain\r\n"
#define MSG4262NOTFOUND "4262 Field/Content not found\r\n"
+29 -41
View File
@@ -893,40 +893,7 @@ StartOver:
}
case QUEUE_RECIP_LOCAL:
case QUEUE_RECIP_MBOX_LOCAL: {
if (ptr) {
*ptr = '\0';
}
ptr2 = strchr(cur + 1, ' ');
if (ptr2) {
*ptr2 = '\0';
}
/* TODO: here */
if (MsgAuthFindUser(cur+1) == 0) {
if (ptr2) {
fprintf(newFH, "%c%s %s\r\n", *cur, cur+1, cur+1);
} else {
fprintf(newFH, "%c%s %s %d\r\n", *cur, cur+1, cur+1, DSN_FAILURE);
}
} else {
Log(LOG_INFO, "Entry %ld queue %d, can't find %s", entryID, queue, cur + 1);
if (ptr2) {
*ptr2 = ' ';
}
if (ptr) {
*ptr = '\n';
}
fwrite(cur, sizeof(unsigned char), next - cur, newFH);
}
break;
}
case QUEUE_RECIP_MBOX_LOCAL:
case QUEUE_RECIP_REMOTE: {
if (ptr) {
*ptr = '\0';
@@ -936,15 +903,35 @@ StartOver:
if (ptr2) {
*ptr2 = '\0';
}
/* TODO: here */
if (ptr2) {
fprintf(newFH, QUEUES_RECIP_REMOTE"%s %s\n", cur + 1, ptr2 + 1);
} else {
fprintf(newFH, QUEUES_RECIP_REMOTE"%s %s %d\r\n", cur + 1, cur + 1, DSN_FAILURE);
/* alias this user */
unsigned char buffer[1024]; /* FIXME: is this too big? */
unsigned char *addrptr;
int cnt;
aliasing(cur+1, &cnt, buffer);
/* find the address in teh result buffer so that we can rewrite it properly */
addrptr = strrchr(buffer, ' ');
addrptr++;
switch(atoi(buffer)) {
case 1000:
/* this is a local user, change the envelope to reflect that */
fprintf(newFH, QUEUES_RECIP_LOCAL"%s %s\r\n", addrptr, cur+1);
break;
case 1002:
fprintf(newFH, QUEUES_RECIP_REMOTE"%s %s\r\n", addrptr, cur+1);
break;
default:
fprintf(newFH, "%c%s %s %d\r\n", *cur, addrptr, cur+1, DSN_FAILURE);
break;
}
if (ptr) {
*ptr = '\n';
}
if (ptr2) {
*ptr2 = ' ';
}
break;
}
case QUEUE_ADDRESS:
@@ -1630,6 +1617,7 @@ StartOver:
return(TRUE);
}
Log(LOG_DEBUG, "Handing off to agent queue %d", queue);
/* We got a connection to the guy, tell him what to do */
ConnWriteF(client->conn, "6020 %03d-%s %ld %ld %ld\r\n", queue, entry, (unsigned long)sb.st_size, dSize, lines);
ConnWriteFile(client->conn, fh);
+23 -20
View File
@@ -120,20 +120,20 @@ int hostedFindFunc(const void *str1, const void *str2) {
* 2: username == domain
* 3: username == auth subsystem
*/
BOOL aliasing(Connection *conn, char *addr, int *cnt) {
BOOL aliasing(char *addr, int *cnt, unsigned char *buffer) {
unsigned char *local = NULL;
unsigned char *domain = NULL;
int i=-1;
BOOL result=FALSE;
if (addr[0] == '\0') {
ConnWriteF(conn, MSG4001NO_USER, "");
sprintf(buffer, MSG4001NO_USER, "");
return TRUE;
}
/* very rudimentary way to prevent loops */
if (*cnt > 5) {
ConnWriteStr(conn, MSG4000LOOP);
strcpy(buffer, MSG4000LOOP);
return TRUE;
}
@@ -146,12 +146,12 @@ BOOL aliasing(Connection *conn, char *addr, int *cnt) {
/* if i get here, then i don't have a domain. assume this is the username. the only possible
* choices here are type 0 and type 3 */
if (MsgAuthFindUser(local) == 0) {
ConnWriteF(conn, MSG1000LOCAL, local);
sprintf(buffer, MSG1000LOCAL, local);
result = TRUE;
goto ExitAliasing;
} else {
/* the user was not found. it must be an invalid user */
ConnWriteF(conn, MSG4001NO_USER, local);
sprintf(buffer, MSG4001NO_USER, local);
result = TRUE;
goto ExitAliasing;
}
@@ -170,11 +170,11 @@ BOOL aliasing(Connection *conn, char *addr, int *cnt) {
if (a.aliases && a.aliases->len && ((i = BongoArrayFindSorted(a.aliases, local, (ArrayCompareFunc)aliasFindFunc)) > -1)) {
AliasStruct b;
b = BongoArrayIndex(a.aliases, AliasStruct, i);
result = aliasing(conn, b.to, cnt);
result = aliasing(b.to, cnt, buffer);
} else if (a.to && a.to[0] != '\0') {
/* there are no user aliasess is there a domain alias? */
snprintf(new_addr, 999, "%s@%s", local, a.to);
result = aliasing(conn, new_addr, cnt);
result = aliasing(new_addr, cnt, buffer);
}
/* we haven't already handled the address. it must be a local address */
@@ -183,30 +183,30 @@ BOOL aliasing(Connection *conn, char *addr, int *cnt) {
switch (a.mapping_type) {
case 0:
if (MsgAuthFindUser(local) == 0) {
ConnWriteF(conn, MSG1000LOCAL, local);
sprintf(buffer, MSG1000LOCAL, local);
result = TRUE;
}
break;
case 1:
if (MsgAuthFindUser(addr) == 0) {
ConnWriteF(conn, MSG1000LOCAL, addr);
sprintf(buffer, MSG1000LOCAL, addr);
result = TRUE;
}
break;
case 2:
if (MsgAuthFindUser(domain) == 0) {
ConnWriteF(conn, MSG1000LOCAL, domain);
sprintf(buffer, MSG1000LOCAL, domain);
result = TRUE;
}
break;
case 3:
/* unhandled for now */
ConnWriteStr(conn, MSG4000UNKNOWN_TYPE);
strcpy(buffer, MSG4000UNKNOWN_TYPE);
result = TRUE;
break;
default:
/* unhandled forever */
ConnWriteStr(conn, MSG4000UNKNOWN_TYPE);
strcpy(buffer, MSG4000UNKNOWN_TYPE);
result = TRUE;
break;
}
@@ -214,12 +214,12 @@ BOOL aliasing(Connection *conn, char *addr, int *cnt) {
/* if we still haven't resolved the address, it is an unknown user */
if (result == FALSE) {
ConnWriteF(conn, MSG4001NO_USER, addr);
sprintf(buffer, MSG4001NO_USER, addr);
result = TRUE;
}
} else {
/* the user must be remote */
ConnWriteF(conn, MSG1002REMOTE, addr);
sprintf(buffer, MSG1002REMOTE, addr);
result = TRUE;
goto ExitAliasing;
}
@@ -239,11 +239,14 @@ BOOL aliasing(Connection *conn, char *addr, int *cnt) {
int CommandAddressResolve(void *param) {
BOOL handled=FALSE;
int cnt=0;
unsigned char buffer[1024]; /* FIXME: is this too big? */
QueueClient *client = (QueueClient *)param;
handled = aliasing(client->conn, client->buffer + 16, &cnt);
handled = aliasing(client->buffer + 16, &cnt, &buffer);
if (!handled) {
ConnWriteF(client->conn, MSG4001NO_USER, client->buffer + 16);
ConnWriteF(client->conn, MSG4001NO_USER"\r\n", client->buffer + 16);
} else {
ConnWriteF(client->conn, "%s\r\n", buffer);
}
return 0;
}
@@ -257,10 +260,10 @@ int CommandDomainLocation(void *param) {
/* now search for it */
int idx = BongoArrayFindSorted(Conf.hostedDomains, domain, (ArrayCompareFunc)hostedFindFunc);
if (idx > -1) {
ConnWriteF(client->conn, MSG1000LOCAL, domain);
ConnWriteF(client->conn, MSG1000LOCAL"\r\n", domain);
} else {
/* TODO: add the relay domain stuff */
ConnWriteF(client->conn, MSG1002REMOTE, domain);
ConnWriteF(client->conn, MSG1002REMOTE"\r\n", domain);
}
return 0;
}
@@ -425,10 +428,10 @@ CheckTrustedHost(QueueClient *client)
if (Conf.trustedHosts) {
/* TODO: this can be optimized a little bit */
XplRWReadLockAcquire(&Conf.lock);
i = BongoArrayFindSorted(Conf.trustedHosts, inet_ntoa(client->conn->socketAddress.sin_addr), (ArrayCompareFunc)strcasecmp);
i = BongoArrayFindSorted(Conf.trustedHosts, inet_ntoa(client->conn->socketAddress.sin_addr), (ArrayCompareFunc)hostedFindFunc);
XplRWReadLockRelease(&Conf.lock);
}
return (i > 0);
return (i > -1);
}
int
+1
View File
@@ -99,6 +99,7 @@ extern QueueAgent Agent;
void QueueClientFree(void *clientp);
int HandleCommand(QueueClient *client);
BOOL aliasing(char *addr, int *cnt, unsigned char *buffer);
#define STACKSPACE_Q (1024*80)