mattg wrote:SorenR wrote:I modified my code (5.4.2) so I now have a "Sub OnHELO(oClient)" that kicks in when the object "oClient.HELO" is populated... It's an ugly hack but it works
Would it be possible for you fork github and show this change, and then make a pull request to main.
That'd make life for this script
Not a GIT expert and I don't have the tools to compile the latest version - however changes are small... Look for "OnHELO" as part of string
NOTE: Martin changed the syntax on some of the code (moving underscores from first to last in string and such, however the changes should be obvious!
Z:\hmailserver-5.4.2\hmailserver\source\Server\Common\Scripting\ScriptServer.h
Code: Select all
public:
enum Event
{
EventOnClientConnect = 1001,
EventOnAcceptMessage = 1002,
EventOnMessageDeliver = 1003,
EventOnBackupCompleted = 1004,
EventOnBackupFailed = 1005,
EventOnDeliveryStart = 1006,
EventOnError = 1007,
EventOnDeliveryFailed = 1008,
EventCustom = 1010,
EventOnExternalAccountDownload = 1011,
EventOnSMTPData = 1012,
EventOnHELO = 1013,
};
Code: Select all
bool m_bHasOnClientConnect;
bool m_bHasOnAcceptMessage;
bool m_bHasOnDeliverMessage;
bool m_bHasOnBackupCompleted;
bool m_bHasOnBackupFailed;
bool m_bHasOnDeliveryStart;
bool m_bHasOnError;
bool m_bHasOnDeliveryFailed;
bool m_bHasOnExternalAccountDownload;
bool m_bHasOnSMTPData;
bool m_bHasOnHELO;
Z:\hmailserver-5.4.2\hmailserver\source\Server\Common\Scripting\ScriptServer.cpp
Code: Select all
namespace HM
{
ScriptServer::ScriptServer(void) :
m_bHasOnClientConnect(false),
m_bHasOnAcceptMessage(false),
m_bHasOnDeliverMessage(false),
m_bHasOnBackupCompleted(false),
m_bHasOnBackupFailed(false),
m_bHasOnDeliveryStart(false),
m_bHasOnError(false),
m_bHasOnDeliveryFailed(false),
m_bHasOnExternalAccountDownload(false),
m_bHasOnSMTPData(false),
m_bHasOnHELO(false)
Code: Select all
// Determine which functions are available.
m_bHasOnClientConnect = _DoesFunctionExist("OnClientConnect");
m_bHasOnAcceptMessage = _DoesFunctionExist("OnAcceptMessage");
m_bHasOnDeliverMessage = _DoesFunctionExist("OnDeliverMessage");
m_bHasOnBackupCompleted = _DoesFunctionExist("OnBackupCompleted");
m_bHasOnBackupFailed = _DoesFunctionExist("OnBackupFailed");
m_bHasOnDeliveryStart = _DoesFunctionExist("OnDeliveryStart");
m_bHasOnError = _DoesFunctionExist("OnError");
m_bHasOnDeliveryFailed = _DoesFunctionExist("OnDeliveryFailed");
m_bHasOnExternalAccountDownload = _DoesFunctionExist("OnExternalAccountDownload");
m_bHasOnSMTPData = _DoesFunctionExist("OnSMTPData");
m_bHasOnHELO = _DoesFunctionExist("OnHELO");
Code: Select all
case EventOnSMTPData:
m_sEventName = _T("OnSMTPData");
if (!m_bHasOnSMTPData)
return;
break;
case EventOnHELO:
m_sEventName = _T("OnHELO");
if (!m_bHasOnHELO)
return;
break;
Z:\hmailserver-5.4.2\hmailserver\source\Server\Common\Scripting\ScriptServer.cpp
Code: Select all
void
SMTPConnection::_ProtocolEHLO(const String &sRequest)
{
if (!_ReadDomainAddressFromHelo(sRequest))
{
// The client did not supply a parameter to
// the helo command which is syntaxically
// incorrect. Reject.
_SendErrorResponse(501, "EHLO Invalid domain address.");
return;
}
//
// Event OnHELO
//
if (Configuration::Instance()->GetUseScriptServer())
{
shared_ptr<ScriptObjectContainer> pContainer = shared_ptr<ScriptObjectContainer>(new ScriptObjectContainer);
shared_ptr<Result> pResult = shared_ptr<Result>(new Result);
shared_ptr<ClientInfo> pClientInfo = shared_ptr<ClientInfo>(new ClientInfo);
pClientInfo->SetIPAddress(GetIPAddressString());
pClientInfo->SetPort(GetLocalPort());
pClientInfo->SetHELO(m_sHeloHost);
pContainer->AddObject("HMAILSERVER_CLIENT", pClientInfo, ScriptObject::OTClient);
pContainer->AddObject("Result", pResult, ScriptObject::OTResult);
String sEventCaller = "OnHELO(HMAILSERVER_CLIENT)";
ScriptServer::Instance()->FireEvent(ScriptServer::EventOnHELO, sEventCaller, pContainer);
}
_SendEHLOKeywords();
if (m_CurrentState == AUTHENTICATION)
m_CurrentState = HEADER;
}
void
SMTPConnection::_ProtocolHELO(const String &sRequest)
{
if (!_ReadDomainAddressFromHelo(sRequest))
{
// The client did not supply a parameter to
// the helo command which is syntaxically
// incorrect. Reject.
_SendErrorResponse(501, "HELO Invalid domain address.");
return;
}
//
// Event OnHELO
//
if (Configuration::Instance()->GetUseScriptServer())
{
shared_ptr<ScriptObjectContainer> pContainer = shared_ptr<ScriptObjectContainer>(new ScriptObjectContainer);
shared_ptr<Result> pResult = shared_ptr<Result>(new Result);
shared_ptr<ClientInfo> pClientInfo = shared_ptr<ClientInfo>(new ClientInfo);
pClientInfo->SetIPAddress(GetIPAddressString());
pClientInfo->SetPort(GetLocalPort());
pClientInfo->SetHELO(m_sHeloHost);
pContainer->AddObject("HMAILSERVER_CLIENT", pClientInfo, ScriptObject::OTClient);
pContainer->AddObject("Result", pResult, ScriptObject::OTResult);
String sEventCaller = "OnHELO(HMAILSERVER_CLIENT)";
ScriptServer::Instance()->FireEvent(ScriptServer::EventOnHELO, sEventCaller, pContainer);
}
_SendData("250 Hello.");
if (m_CurrentState == AUTHENTICATION)
m_CurrentState = HEADER;
}
That's it...
PS.. To whomever is willing to take ownership... It would be nice to be able to return "554 Rejected" using "ReturnValue = 1" and I did try add the code... It crashed... Badly... Every time...
SørenR.
Woke is Marxism advancing through Maoist cultural revolution.