New upstream version 6.0.24.30
This commit is contained in:
parent
b8e40a44c9
commit
e8c2a57f79
|
@ -0,0 +1,65 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioUserFile
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
ShowAllFiles="false"
|
||||||
|
>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="SKIGACER"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="SKIGACER"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
</VisualStudioUserFile>
|
|
@ -1127,6 +1127,8 @@
|
||||||
// Start adding json api (25)
|
// Start adding json api (25)
|
||||||
// Fix reading nested directories when loading Standard Templates and other template bugs (25)
|
// Fix reading nested directories when loading Standard Templates and other template bugs (25)
|
||||||
// Add TO and AT to "Message has nowhere to go" message (28)
|
// Add TO and AT to "Message has nowhere to go" message (28)
|
||||||
|
// Add My Sent and My Received filter options to Webmail (30)
|
||||||
|
// Add Send P to multiple BBS's when routing on HR (30)
|
||||||
|
|
||||||
#include "bpqmail.h"
|
#include "bpqmail.h"
|
||||||
#include "winstdint.h"
|
#include "winstdint.h"
|
||||||
|
|
2
Bpq32.c
2
Bpq32.c
|
@ -1208,7 +1208,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||||
// Disable CTS check in WriteComBlock (26)
|
// Disable CTS check in WriteComBlock (26)
|
||||||
// Improvments to reporting to M0LTE Map (26)
|
// Improvments to reporting to M0LTE Map (26)
|
||||||
// IPGateway fix from github user isavitsky (27)
|
// IPGateway fix from github user isavitsky (27)
|
||||||
// Fix possible crash in SCSPactor PTCPORT code (29)
|
// Fix possible crash in SCSPactor PTCPORT code (29)
|
||||||
|
|
||||||
#define CKernel
|
#define CKernel
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
Name="Release|Win32"
|
Name="Release|Win32"
|
||||||
>
|
>
|
||||||
<DebugSettings
|
<DebugSettings
|
||||||
Command=""
|
Command="C:\Devprogs\BPQ32\bpq32.exe"
|
||||||
WorkingDirectory=""
|
WorkingDirectory=""
|
||||||
CommandArguments=""
|
CommandArguments=""
|
||||||
Attach="false"
|
Attach="false"
|
||||||
|
|
357
MailRouting.c
357
MailRouting.c
|
@ -1398,6 +1398,7 @@ NOHA:
|
||||||
int bestmatch = 0;
|
int bestmatch = 0;
|
||||||
int depth;
|
int depth;
|
||||||
int Matched = 0;
|
int Matched = 0;
|
||||||
|
int MultiPDepth = 0;
|
||||||
|
|
||||||
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
||||||
{
|
{
|
||||||
|
@ -1467,7 +1468,49 @@ NOHA:
|
||||||
}
|
}
|
||||||
|
|
||||||
// We should choose the BBS with most matching elements (ie match on #23.GBR better that GBR)
|
// We should choose the BBS with most matching elements (ie match on #23.GBR better that GBR)
|
||||||
// If SendPtoMultiple is set I think we send to any with same mtch level
|
// If SendPtoMultiple is set I think we send to any with same match level
|
||||||
|
|
||||||
|
// So if SendPtoMultiple is set I think I need to find the best depth then send to all with the same depth
|
||||||
|
|
||||||
|
|
||||||
|
if (SendPtoMultiple && Msg->type == 'P')
|
||||||
|
{
|
||||||
|
Logprintf(LOG_BBS, conn, '?', "SendPtoMultiple is set. Checking for best match level");
|
||||||
|
|
||||||
|
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
||||||
|
{
|
||||||
|
ForwardingInfo = bbs->ForwardingInfo;
|
||||||
|
|
||||||
|
depth = CheckBBSHElements(Msg, bbs, ForwardingInfo, ATBBS, &HElements[0]);
|
||||||
|
|
||||||
|
if (depth)
|
||||||
|
{
|
||||||
|
if (depth > MultiPDepth)
|
||||||
|
{
|
||||||
|
MultiPDepth = depth;
|
||||||
|
bestbbs = bbs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MultiPDepth)
|
||||||
|
{
|
||||||
|
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
||||||
|
{
|
||||||
|
ForwardingInfo = bbs->ForwardingInfo;
|
||||||
|
|
||||||
|
depth = CheckBBSHElements(Msg, bbs, ForwardingInfo, ATBBS, &HElements[0]);
|
||||||
|
|
||||||
|
if (depth == MultiPDepth)
|
||||||
|
{
|
||||||
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Matches BBS %s Depth %d", bbs->Call, depth);
|
||||||
|
CheckAndSend(Msg, conn, bbs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
||||||
{
|
{
|
||||||
|
@ -1481,7 +1524,7 @@ NOHA:
|
||||||
if (depth)
|
if (depth)
|
||||||
{
|
{
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Matches BBS %s Depth %d", bbs->Call, depth);
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Matches BBS %s Depth %d", bbs->Call, depth);
|
||||||
|
|
||||||
if (depth > bestmatch)
|
if (depth > bestmatch)
|
||||||
{
|
{
|
||||||
bestmatch = depth;
|
bestmatch = depth;
|
||||||
|
@ -1494,14 +1537,14 @@ NOHA:
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Best Match is %s", bestbbs->Call);
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR Best Match is %s", bestbbs->Call);
|
||||||
|
|
||||||
CheckAndSend(Msg, conn, bestbbs);
|
CheckAndSend(Msg, conn, bestbbs);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for wildcarded AT address
|
// Check for wildcarded AT address
|
||||||
|
|
||||||
// if (ATBBS[0] == 0)
|
// if (ATBBS[0] == 0)
|
||||||
// return FALSE; // no AT
|
// return FALSE; // no AT
|
||||||
|
|
||||||
CheckWildCardedAT:
|
CheckWildCardedAT:
|
||||||
|
|
||||||
|
@ -1521,7 +1564,7 @@ CheckWildCardedAT:
|
||||||
if (depth > -1)
|
if (depth > -1)
|
||||||
{
|
{
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace Wildcarded AT Matches %s Length %d", bbs->Call, depth);
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace Wildcarded AT Matches %s Length %d", bbs->Call, depth);
|
||||||
|
|
||||||
if (depth > bestmatch)
|
if (depth > bestmatch)
|
||||||
{
|
{
|
||||||
bestmatch = depth;
|
bestmatch = depth;
|
||||||
|
@ -1543,182 +1586,182 @@ CheckWildCardedAT:
|
||||||
|
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
|
||||||
return FALSE; // No match
|
return FALSE; // No match
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flood Bulls go to all matching BBSs in the flood area, so the order of checking doesn't matter
|
// Flood Bulls go to all matching BBSs in the flood area, so the order of checking doesn't matter
|
||||||
|
|
||||||
// For now I will only route on AT (for non-hierarchical addresses) and HA
|
// For now I will only route on AT (for non-hierarchical addresses) and HA
|
||||||
|
|
||||||
// Ver 1.0.4.2 - Try including TO
|
// Ver 1.0.4.2 - Try including TO
|
||||||
|
|
||||||
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
for (bbs = BBSChain; bbs; bbs = bbs->BBSNext)
|
||||||
{
|
{
|
||||||
ForwardingInfo = bbs->ForwardingInfo;
|
ForwardingInfo = bbs->ForwardingInfo;
|
||||||
|
|
||||||
if (ForwardingInfo->PersonalOnly)
|
if (ForwardingInfo->PersonalOnly)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (CheckBBSToList(Msg, bbs, ForwardingInfo))
|
if (CheckBBSToList(Msg, bbs, ForwardingInfo))
|
||||||
{
|
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace TO %s Matches BBS %s", Msg->to, bbs->Call);
|
|
||||||
|
|
||||||
if (ForwardToMe || _stricmp(bbs->Call, BBSName) != 0) // Dont forward to ourself - already here! (unless ForwardToMe set)
|
|
||||||
{
|
{
|
||||||
set_fwd_bit(Msg->fbbs, bbs->BBSNumber);
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace TO %s Matches BBS %s", Msg->to, bbs->Call);
|
||||||
ForwardingInfo->MsgCount++;
|
|
||||||
|
if (ForwardToMe || _stricmp(bbs->Call, BBSName) != 0) // Dont forward to ourself - already here! (unless ForwardToMe set)
|
||||||
|
{
|
||||||
|
set_fwd_bit(Msg->fbbs, bbs->BBSNumber);
|
||||||
|
ForwardingInfo->MsgCount++;
|
||||||
|
}
|
||||||
|
Count++;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
Count++;
|
|
||||||
continue;
|
if ((strcmp(ATBBS, bbs->Call) == 0) || // @BBS = BBS
|
||||||
|
CheckBBSAtList(Msg, ForwardingInfo, ATBBS))
|
||||||
|
{
|
||||||
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace AT %s Matches BBS %s", Msg->to, bbs->Call);
|
||||||
|
CheckAndSend(Msg, conn, bbs);
|
||||||
|
|
||||||
|
Count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (CheckBBSHElementsFlood(Msg, bbs, ForwardingInfo, Msg->via, &HElements[0]))
|
||||||
|
{
|
||||||
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR %s %s %s %s %s Matches BBS %s",
|
||||||
|
HElements[0], HElements[1], HElements[2],
|
||||||
|
HElements[3], HElements[4], bbs->Call);
|
||||||
|
|
||||||
|
CheckAndSend(Msg, conn, bbs);
|
||||||
|
|
||||||
|
Count++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((strcmp(ATBBS, bbs->Call) == 0) || // @BBS = BBS
|
if (Count == 0)
|
||||||
CheckBBSAtList(Msg, ForwardingInfo, ATBBS))
|
goto CheckWildCardedAT;
|
||||||
{
|
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace AT %s Matches BBS %s", Msg->to, bbs->Call);
|
|
||||||
CheckAndSend(Msg, conn, bbs);
|
|
||||||
|
|
||||||
Count++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (CheckBBSHElementsFlood(Msg, bbs, ForwardingInfo, Msg->via, &HElements[0]))
|
|
||||||
{
|
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace HR %s %s %s %s %s Matches BBS %s",
|
|
||||||
HElements[0], HElements[1], HElements[2],
|
|
||||||
HElements[3], HElements[4], bbs->Call);
|
|
||||||
|
|
||||||
CheckAndSend(Msg, conn, bbs);
|
|
||||||
|
|
||||||
Count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Count == 0)
|
|
||||||
goto CheckWildCardedAT;
|
|
||||||
|
|
||||||
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
|
Logprintf(LOG_BBS, conn, '?', "Routing Trace - No Match");
|
||||||
|
|
||||||
return Count;
|
return Count;
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CheckBBSToList(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo)
|
|
||||||
{
|
|
||||||
char ** Calls;
|
|
||||||
|
|
||||||
// Check TO distributions
|
|
||||||
|
|
||||||
if (ForwardingInfo->TOCalls)
|
|
||||||
{
|
|
||||||
Calls = ForwardingInfo->TOCalls;
|
|
||||||
|
|
||||||
while(Calls[0])
|
|
||||||
{
|
|
||||||
if (strcmp(Calls[0], Msg->to) == 0)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
Calls++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL CheckBBSAtList(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS)
|
BOOL CheckBBSToList(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo)
|
||||||
{
|
|
||||||
char ** Calls;
|
|
||||||
|
|
||||||
// Check AT distributions
|
|
||||||
|
|
||||||
// if (strcmp(ATBBS, bbs->Call) == 0) // @BBS = BBS
|
|
||||||
// return TRUE;
|
|
||||||
|
|
||||||
if (ForwardingInfo->ATCalls)
|
|
||||||
{
|
{
|
||||||
Calls = ForwardingInfo->ATCalls;
|
char ** Calls;
|
||||||
|
|
||||||
while(Calls[0])
|
// Check TO distributions
|
||||||
|
|
||||||
|
if (ForwardingInfo->TOCalls)
|
||||||
{
|
{
|
||||||
if (strcmp(Calls[0], ATBBS) == 0)
|
Calls = ForwardingInfo->TOCalls;
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
Calls++;
|
while(Calls[0])
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
|
|
||||||
{
|
|
||||||
// Used for Personal Messages, and Bulls not yot at their target area
|
|
||||||
|
|
||||||
char *** HRoutes;
|
|
||||||
int i = 0, j, k = 0;
|
|
||||||
int bestmatch = 0;
|
|
||||||
|
|
||||||
if (ForwardingInfo->HADDRSP)
|
|
||||||
{
|
|
||||||
// Match on Routes
|
|
||||||
|
|
||||||
HRoutes = ForwardingInfo->HADDRSP;
|
|
||||||
k=0;
|
|
||||||
|
|
||||||
while(HRoutes[k])
|
|
||||||
{
|
|
||||||
i = j = 0;
|
|
||||||
|
|
||||||
while (HRoutes[k][i] && HElements[j]) // Until one set runs out
|
|
||||||
{
|
{
|
||||||
if (strcmp(HRoutes[k][i], HElements[j]) != 0)
|
if (strcmp(Calls[0], Msg->to) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
Calls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CheckBBSAtList(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS)
|
||||||
|
{
|
||||||
|
char ** Calls;
|
||||||
|
|
||||||
|
// Check AT distributions
|
||||||
|
|
||||||
|
// if (strcmp(ATBBS, bbs->Call) == 0) // @BBS = BBS
|
||||||
|
// return TRUE;
|
||||||
|
|
||||||
|
if (ForwardingInfo->ATCalls)
|
||||||
|
{
|
||||||
|
Calls = ForwardingInfo->ATCalls;
|
||||||
|
|
||||||
|
while(Calls[0])
|
||||||
|
{
|
||||||
|
if (strcmp(Calls[0], ATBBS) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
Calls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
|
||||||
|
{
|
||||||
|
// Used for Personal Messages, and Bulls not yot at their target area
|
||||||
|
|
||||||
|
char *** HRoutes;
|
||||||
|
int i = 0, j, k = 0;
|
||||||
|
int bestmatch = 0;
|
||||||
|
|
||||||
|
if (ForwardingInfo->HADDRSP)
|
||||||
|
{
|
||||||
|
// Match on Routes
|
||||||
|
|
||||||
|
HRoutes = ForwardingInfo->HADDRSP;
|
||||||
|
k=0;
|
||||||
|
|
||||||
|
while(HRoutes[k])
|
||||||
|
{
|
||||||
|
i = j = 0;
|
||||||
|
|
||||||
|
while (HRoutes[k][i] && HElements[j]) // Until one set runs out
|
||||||
|
{
|
||||||
|
if (strcmp(HRoutes[k][i], HElements[j]) != 0)
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only send if all BBS elements match
|
||||||
|
|
||||||
|
if (HRoutes[k][i] == 0)
|
||||||
|
{
|
||||||
|
if (i > bestmatch)
|
||||||
|
bestmatch = i;
|
||||||
|
}
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bestmatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
|
||||||
|
{
|
||||||
|
char *** HRoutes;
|
||||||
|
char ** BBSHA;
|
||||||
|
|
||||||
|
int i = 0, j, k = 0;
|
||||||
|
int bestmatch = 0;
|
||||||
|
|
||||||
|
if (ForwardingInfo->HADDRS)
|
||||||
|
{
|
||||||
|
// Match on Routes
|
||||||
|
|
||||||
|
// Message must be in right area (all elements of message match BBS Location HA)
|
||||||
|
|
||||||
|
BBSHA = ForwardingInfo->BBSHAElements;
|
||||||
|
|
||||||
|
if (BBSHA == NULL)
|
||||||
|
return 0; // Not safe to flood
|
||||||
|
|
||||||
|
i = j = 0;
|
||||||
|
|
||||||
|
while (BBSHA[i] && HElements[j]) // Until one set runs out
|
||||||
|
{
|
||||||
|
if (strcmp(BBSHA[i], HElements[j]) != 0)
|
||||||
break;
|
break;
|
||||||
i++;
|
i++;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only send if all BBS elements match
|
if (HElements[j] != 0)
|
||||||
|
|
||||||
if (HRoutes[k][i] == 0)
|
|
||||||
{
|
|
||||||
if (i > bestmatch)
|
|
||||||
bestmatch = i;
|
|
||||||
}
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return bestmatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements)
|
|
||||||
{
|
|
||||||
char *** HRoutes;
|
|
||||||
char ** BBSHA;
|
|
||||||
|
|
||||||
int i = 0, j, k = 0;
|
|
||||||
int bestmatch = 0;
|
|
||||||
|
|
||||||
if (ForwardingInfo->HADDRS)
|
|
||||||
{
|
|
||||||
// Match on Routes
|
|
||||||
|
|
||||||
// Message must be in right area (all elements of message match BBS Location HA)
|
|
||||||
|
|
||||||
BBSHA = ForwardingInfo->BBSHAElements;
|
|
||||||
|
|
||||||
if (BBSHA == NULL)
|
|
||||||
return 0; // Not safe to flood
|
|
||||||
|
|
||||||
i = j = 0;
|
|
||||||
|
|
||||||
while (BBSHA[i] && HElements[j]) // Until one set runs out
|
|
||||||
{
|
|
||||||
if (strcmp(BBSHA[i], HElements[j]) != 0)
|
|
||||||
break;
|
|
||||||
i++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HElements[j] != 0)
|
|
||||||
return 0; // Message is not for BBS's area
|
return 0; // Message is not for BBS's area
|
||||||
|
|
||||||
HRoutes = ForwardingInfo->HADDRS;
|
HRoutes = ForwardingInfo->HADDRS;
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KVers 6,0,24,29
|
#define KVers 6,0,24,30
|
||||||
#define KVerstring "6.0.24.29\0"
|
#define KVerstring "6.0.24.30\0"
|
||||||
|
|
||||||
#ifdef CKernel
|
#ifdef CKernel
|
||||||
|
|
||||||
|
|
113
WebMail.c
113
WebMail.c
|
@ -928,6 +928,22 @@ int SendWebMailHeaderEx(char * Reply, char * Key, struct HTTPConnectionInfo * Se
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyTX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->from) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyRX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->to)!= 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (Count++ < Session->WebMailSkip)
|
if (Count++ < Session->WebMailSkip)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -959,7 +975,7 @@ int SendWebMailHeaderEx(char * Reply, char * Key, struct HTTPConnectionInfo * Se
|
||||||
if (WebMailTemplate == NULL)
|
if (WebMailTemplate == NULL)
|
||||||
WebMailTemplate = GetTemplateFromFile(6, "WebMailPage.txt");
|
WebMailTemplate = GetTemplateFromFile(6, "WebMailPage.txt");
|
||||||
|
|
||||||
return sprintf(Reply, WebMailTemplate, BBSName, User->Call, Key, Key, Key, Key, Key, Key, Key, Key, Messages);
|
return sprintf(Reply, WebMailTemplate, BBSName, User->Call, Key, Key, Key, Key, Key, Key, Key, Key, Key, Key, Messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ViewWebMailMessage(struct HTTPConnectionInfo * Session, char * Reply, int Number, BOOL DisplayHTML)
|
int ViewWebMailMessage(struct HTTPConnectionInfo * Session, char * Reply, int Number, BOOL DisplayHTML)
|
||||||
|
@ -1617,6 +1633,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
|
|
||||||
Session->WebMailLastUsed = time(NULL);
|
Session->WebMailLastUsed = time(NULL);
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
|
||||||
if (WebMailTemplate)
|
if (WebMailTemplate)
|
||||||
|
@ -1759,6 +1777,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
|
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1769,6 +1789,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
Session->WebMailTypes[0] = 0;
|
Session->WebMailTypes[0] = 0;
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1779,6 +1801,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
strcpy(Session->WebMailTypes, "B");
|
strcpy(Session->WebMailTypes, "B");
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1789,6 +1813,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
strcpy(Session->WebMailTypes, "P");
|
strcpy(Session->WebMailTypes, "P");
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1799,6 +1825,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
strcpy(Session->WebMailTypes, "T");
|
strcpy(Session->WebMailTypes, "T");
|
||||||
Session->WebMailMine = FALSE;
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1809,6 +1837,32 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
Session->WebMailSkip = 0;
|
Session->WebMailSkip = 0;
|
||||||
Session->WebMailTypes[0] = 0;
|
Session->WebMailTypes[0] = 0;
|
||||||
Session->WebMailMine = TRUE;
|
Session->WebMailMine = TRUE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stricmp(NodeURL, "/WebMail/WMtoMe") == 0)
|
||||||
|
{
|
||||||
|
Session->WebMailSkip = 0;
|
||||||
|
Session->WebMailTypes[0] = 0;
|
||||||
|
Session->WebMailMine = FALSE;
|
||||||
|
Session->WebMailMyTX = FALSE;
|
||||||
|
Session->WebMailMyRX = TRUE;
|
||||||
|
|
||||||
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_stricmp(NodeURL, "/WebMail/WMfromMe") == 0)
|
||||||
|
{
|
||||||
|
Session->WebMailSkip = 0;
|
||||||
|
Session->WebMailTypes[0] = 0;
|
||||||
|
Session->WebMailMine = TRUE;
|
||||||
|
Session->WebMailMyTX = TRUE;
|
||||||
|
Session->WebMailMyRX = FALSE;
|
||||||
|
|
||||||
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
*RLen = SendWebMailHeader(Reply, Session->Key, Session);
|
||||||
return;
|
return;
|
||||||
|
@ -1897,6 +1951,8 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
"<td><a href=/WebMail/WMT?%s>NTS</a></td>\r\n"
|
"<td><a href=/WebMail/WMT?%s>NTS</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMALL?%s>All Types</a></td>\r\n"
|
"<td><a href=/WebMail/WMALL?%s>All Types</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMMine?%s>Mine</a></td>\r\n"
|
"<td><a href=/WebMail/WMMine?%s>Mine</a></td>\r\n"
|
||||||
|
"<td><a href=/WebMail/WMfromMe?%s>My Sent</a></td>\r\n"
|
||||||
|
"<td><a href=/WebMail/WMtoMe?%s>My Rxed</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMAuto?%s>Auto Refresh</a></td>\r\n"
|
"<td><a href=/WebMail/WMAuto?%s>Auto Refresh</a></td>\r\n"
|
||||||
"<td><a href=\"#\" onclick=\"newmsg('%s'); return false;\">Send Message</a></td>\r\n"
|
"<td><a href=\"#\" onclick=\"newmsg('%s'); return false;\">Send Message</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMLogout?%s>Logout</a></td>\r\n"
|
"<td><a href=/WebMail/WMLogout?%s>Logout</a></td>\r\n"
|
||||||
|
@ -1906,7 +1962,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
"<div align=left id=main style=overflow:scroll;>Waiting for data...</div>\r\n"
|
"<div align=left id=main style=overflow:scroll;>Waiting for data...</div>\r\n"
|
||||||
"</body></html>\r\n";
|
"</body></html>\r\n";
|
||||||
|
|
||||||
sprintf(Page, WebSockPage, Key, Key ,BBSName, Session->User->Call, Key, Key, Key, Key, Key, Key, Key, Key);
|
sprintf(Page, WebSockPage, Key, Key ,BBSName, Session->User->Call, Key, Key, Key, Key, Key, Key, Key, Key, Key, Key);
|
||||||
|
|
||||||
*RLen = sprintf(Reply, "%s", Page);
|
*RLen = sprintf(Reply, "%s", Page);
|
||||||
return;
|
return;
|
||||||
|
@ -2099,9 +2155,24 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyTX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->from) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyRX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->to) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*RLen = ViewWebMailMessage(Session, Reply, m, TRUE);
|
*RLen = ViewWebMailMessage(Session, Reply, m, TRUE);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2123,10 +2194,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
for (m = Session->WebMail->CurrentMessageIndex + 1; m <= LatestMsg; m++)
|
for (m = Session->WebMail->CurrentMessageIndex + 1; m <= LatestMsg; m++)
|
||||||
{
|
{
|
||||||
Msg = GetMsgFromNumber(m);
|
Msg = GetMsgFromNumber(m);
|
||||||
|
|
||||||
if (Msg == 0 || Msg->type == 0 || Msg->status == 0)
|
if (Msg == 0 || Msg->type == 0 || Msg->status == 0)
|
||||||
continue; // Protect against corrupt messages
|
continue; // Protect against corrupt messages
|
||||||
|
|
||||||
if (Msg && CheckUserMsg(Msg, User->Call, User->flags & F_SYSOP))
|
if (Msg && CheckUserMsg(Msg, User->Call, User->flags & F_SYSOP))
|
||||||
{
|
{
|
||||||
// Display if it is the right type and in the page range we want
|
// Display if it is the right type and in the page range we want
|
||||||
|
@ -2144,9 +2215,24 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyTX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->from) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyRX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->to) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*RLen = ViewWebMailMessage(Session, Reply, m, TRUE);
|
*RLen = ViewWebMailMessage(Session, Reply, m, TRUE);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6181,6 +6267,21 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyTX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->from) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Session->WebMailMyRX)
|
||||||
|
{
|
||||||
|
// Only list if to or from me
|
||||||
|
|
||||||
|
if (strcmp(User->Call, Msg->to) != 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (Count++ < Session->WebMailSkip)
|
if (Count++ < Session->WebMailSkip)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ struct HTTPConnectionInfo // Used for Web Server for thread-specific stuff
|
||||||
int WebMailSkip; // Number to skip at start of list (for paging)
|
int WebMailSkip; // Number to skip at start of list (for paging)
|
||||||
char WebMailTypes[4]; // Types To List
|
char WebMailTypes[4]; // Types To List
|
||||||
BOOL WebMailMine; // List all meessage to or from me
|
BOOL WebMailMine; // List all meessage to or from me
|
||||||
|
BOOL WebMailMyTX; // List all meessage from me
|
||||||
|
BOOL WebMailMyRX; // List all meessage to me
|
||||||
time_t WebMailLastUsed;
|
time_t WebMailLastUsed;
|
||||||
struct TNCINFO * TNC; // Session -> TNC link
|
struct TNCINFO * TNC; // Session -> TNC link
|
||||||
};
|
};
|
||||||
|
|
|
@ -395,6 +395,8 @@ char * WebMailPagetxt()
|
||||||
"<td><a href=/WebMail/WMT?%s>NTS</a></td>\r\n"
|
"<td><a href=/WebMail/WMT?%s>NTS</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMALL?%s>All Types</a></td>\r\n"
|
"<td><a href=/WebMail/WMALL?%s>All Types</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMMine?%s>Mine</a></td>\r\n"
|
"<td><a href=/WebMail/WMMine?%s>Mine</a></td>\r\n"
|
||||||
|
"<td><a href=/WebMail/WMfromMe?%s>My Sent</a></td>\r\n"
|
||||||
|
"<td><a href=/WebMail/WMtoMe?%s>My Rxed</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMAuto?%s>Auto Refresh</a></td>\r\n"
|
"<td><a href=/WebMail/WMAuto?%s>Auto Refresh</a></td>\r\n"
|
||||||
"<td><a href=\"#\" onclick=\"newmsg('%s'); return false;\">Send Message</a></td>\r\n"
|
"<td><a href=\"#\" onclick=\"newmsg('%s'); return false;\">Send Message</a></td>\r\n"
|
||||||
"<td><a href=/WebMail/WMLogout?%s>Logout</a></td>\r\n"
|
"<td><a href=/WebMail/WMLogout?%s>Logout</a></td>\r\n"
|
||||||
|
|
Loading…
Reference in New Issue