2015-01-28 09:14:05 -05:00
|
|
|
|
|
|
|
// LuaTCPLink.cpp
|
|
|
|
|
|
|
|
// Implements the cLuaTCPLink class representing a Lua wrapper for the cTCPLink class and the callbacks it needs
|
|
|
|
|
|
|
|
#include "Globals.h"
|
|
|
|
#include "LuaTCPLink.h"
|
2015-01-30 15:24:02 -05:00
|
|
|
#include "LuaServerHandle.h"
|
2017-08-30 10:00:06 -04:00
|
|
|
#include "../mbedTLS++/X509Cert.h"
|
|
|
|
#include "../mbedTLS++/CryptoKey.h"
|
2015-01-28 09:14:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
cLuaTCPLink::cLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks):
|
|
|
|
m_Callbacks(std::move(a_Callbacks))
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
2015-01-30 15:24:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
cLuaTCPLink::cLuaTCPLink(cLuaState::cTableRefPtr && a_Callbacks, cLuaServerHandleWPtr a_ServerHandle):
|
|
|
|
m_Callbacks(std::move(a_Callbacks)),
|
2015-01-30 15:24:02 -05:00
|
|
|
m_Server(std::move(a_ServerHandle))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cLuaTCPLink::~cLuaTCPLink()
|
|
|
|
{
|
|
|
|
// If the link is still open, close it:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link != nullptr)
|
2015-01-30 15:24:02 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
link->Close();
|
2015-01-30 15:24:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
Terminated();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool cLuaTCPLink::Send(const AString & a_Data)
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the link:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link == nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send the data:
|
2016-07-06 14:52:04 -04:00
|
|
|
return link->Send(a_Data);
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AString cLuaTCPLink::GetLocalIP(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the link:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link == nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the IP address:
|
2016-07-06 14:52:04 -04:00
|
|
|
return link->GetLocalIP();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UInt16 cLuaTCPLink::GetLocalPort(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the link:
|
2016-07-06 14:52:04 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link == nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the port:
|
2016-07-06 14:52:04 -04:00
|
|
|
return link->GetLocalPort();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AString cLuaTCPLink::GetRemoteIP(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the link:
|
2016-07-06 14:52:04 -04:00
|
|
|
cTCPLinkPtr link = m_Link;
|
|
|
|
if (link == nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the IP address:
|
2016-07-06 14:52:04 -04:00
|
|
|
return link->GetRemoteIP();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UInt16 cLuaTCPLink::GetRemotePort(void) const
|
|
|
|
{
|
|
|
|
// Safely grab a copy of the link:
|
2016-07-06 14:52:04 -04:00
|
|
|
cTCPLinkPtr link = m_Link;
|
|
|
|
if (link == nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the port:
|
2016-07-06 14:52:04 -04:00
|
|
|
return link->GetRemotePort();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::Shutdown(void)
|
|
|
|
{
|
2015-01-30 15:24:02 -05:00
|
|
|
// Safely grab a copy of the link and shut it down:
|
2016-07-06 14:52:04 -04:00
|
|
|
cTCPLinkPtr link = m_Link;
|
|
|
|
if (link != nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
link->Shutdown();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::Close(void)
|
|
|
|
{
|
2015-01-30 15:24:02 -05:00
|
|
|
// If the link is still open, close it:
|
2016-07-06 14:52:04 -04:00
|
|
|
cTCPLinkPtr link = m_Link;
|
|
|
|
if (link != nullptr)
|
2015-01-28 09:14:05 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
link->Close();
|
2015-01-30 15:24:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
Terminated();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-02-12 14:05:55 -05:00
|
|
|
AString cLuaTCPLink::StartTLSClient(
|
|
|
|
const AString & a_OwnCertData,
|
|
|
|
const AString & a_OwnPrivKeyData,
|
|
|
|
const AString & a_OwnPrivKeyPassword
|
|
|
|
)
|
|
|
|
{
|
2016-08-22 13:53:34 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link != nullptr)
|
2015-02-12 14:05:55 -05:00
|
|
|
{
|
2016-08-22 13:53:34 -04:00
|
|
|
cX509CertPtr ownCert;
|
|
|
|
if (!a_OwnCertData.empty())
|
2015-02-12 14:05:55 -05:00
|
|
|
{
|
2016-08-22 13:53:34 -04:00
|
|
|
ownCert = std::make_shared<cX509Cert>();
|
|
|
|
auto res = ownCert->Parse(a_OwnCertData.data(), a_OwnCertData.size());
|
|
|
|
if (res != 0)
|
|
|
|
{
|
|
|
|
return Printf("Cannot parse client certificate: -0x%x", res);
|
|
|
|
}
|
2015-02-12 14:05:55 -05:00
|
|
|
}
|
2016-08-22 13:53:34 -04:00
|
|
|
cCryptoKeyPtr ownPrivKey;
|
|
|
|
if (!a_OwnPrivKeyData.empty())
|
2015-02-12 14:05:55 -05:00
|
|
|
{
|
2016-08-22 13:53:34 -04:00
|
|
|
ownPrivKey = std::make_shared<cCryptoKey>();
|
|
|
|
auto res = ownPrivKey->ParsePrivate(a_OwnPrivKeyData.data(), a_OwnPrivKeyData.size(), a_OwnPrivKeyPassword);
|
|
|
|
if (res != 0)
|
|
|
|
{
|
|
|
|
return Printf("Cannot parse client private key: -0x%x", res);
|
|
|
|
}
|
2015-02-12 14:05:55 -05:00
|
|
|
}
|
2016-08-22 13:53:34 -04:00
|
|
|
return link->StartTLSClient(ownCert, ownPrivKey);
|
2015-02-12 14:05:55 -05:00
|
|
|
}
|
2015-02-13 17:18:22 -05:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AString cLuaTCPLink::StartTLSServer(
|
|
|
|
const AString & a_OwnCertData,
|
|
|
|
const AString & a_OwnPrivKeyData,
|
|
|
|
const AString & a_OwnPrivKeyPassword,
|
|
|
|
const AString & a_StartTLSData
|
|
|
|
)
|
|
|
|
{
|
2016-08-22 13:53:34 -04:00
|
|
|
auto link = m_Link;
|
|
|
|
if (link != nullptr)
|
2015-02-13 17:18:22 -05:00
|
|
|
{
|
|
|
|
// Create the peer cert:
|
|
|
|
auto OwnCert = std::make_shared<cX509Cert>();
|
|
|
|
int res = OwnCert->Parse(a_OwnCertData.data(), a_OwnCertData.size());
|
|
|
|
if (res != 0)
|
|
|
|
{
|
|
|
|
return Printf("Cannot parse server certificate: -0x%x", res);
|
|
|
|
}
|
|
|
|
auto OwnPrivKey = std::make_shared<cCryptoKey>();
|
|
|
|
res = OwnPrivKey->ParsePrivate(a_OwnPrivKeyData.data(), a_OwnPrivKeyData.size(), a_OwnPrivKeyPassword);
|
|
|
|
if (res != 0)
|
|
|
|
{
|
|
|
|
return Printf("Cannot parse server private key: -0x%x", res);
|
|
|
|
}
|
|
|
|
|
2016-08-22 13:53:34 -04:00
|
|
|
return link->StartTLSServer(OwnCert, OwnPrivKey, a_StartTLSData);
|
|
|
|
}
|
2015-02-12 14:05:55 -05:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
void cLuaTCPLink::Terminated(void)
|
|
|
|
{
|
|
|
|
// Disable the callbacks:
|
2016-07-06 14:52:04 -04:00
|
|
|
if (m_Callbacks->IsValid())
|
2015-01-30 15:24:02 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->Clear();
|
2015-01-30 15:24:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// If the managing server is still alive, let it know we're terminating:
|
|
|
|
auto Server = m_Server.lock();
|
|
|
|
if (Server != nullptr)
|
|
|
|
{
|
|
|
|
Server->RemoveLink(this);
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
// If the link is still open, close it:
|
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
auto link= m_Link;
|
|
|
|
if (link != nullptr)
|
2015-02-13 17:18:22 -05:00
|
|
|
{
|
2016-07-06 14:52:04 -04:00
|
|
|
link->Close();
|
2015-02-13 17:18:22 -05:00
|
|
|
m_Link.reset();
|
|
|
|
}
|
2015-01-30 15:24:02 -05:00
|
|
|
}
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
2015-01-30 15:24:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-02-12 14:05:55 -05:00
|
|
|
void cLuaTCPLink::ReceivedCleartextData(const char * a_Data, size_t a_NumBytes)
|
|
|
|
{
|
|
|
|
// Call the callback:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnReceivedData", this, AString(a_Data, a_NumBytes));
|
2015-02-12 14:05:55 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-28 09:14:05 -05:00
|
|
|
void cLuaTCPLink::OnConnected(cTCPLink & a_Link)
|
|
|
|
{
|
|
|
|
// Call the callback:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnConnected", this);
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::OnError(int a_ErrorCode, const AString & a_ErrorMsg)
|
|
|
|
{
|
|
|
|
// Call the callback:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnError", this, a_ErrorCode, a_ErrorMsg);
|
2015-01-30 15:24:02 -05:00
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
// Terminate all processing on the link:
|
2015-01-30 15:24:02 -05:00
|
|
|
Terminated();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::OnLinkCreated(cTCPLinkPtr a_Link)
|
|
|
|
{
|
|
|
|
// Store the cTCPLink for later use:
|
|
|
|
m_Link = a_Link;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::OnReceivedData(const char * a_Data, size_t a_Length)
|
|
|
|
{
|
|
|
|
// Call the callback:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnReceivedData", this, AString(a_Data, a_Length));
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cLuaTCPLink::OnRemoteClosed(void)
|
|
|
|
{
|
|
|
|
// Call the callback:
|
2016-07-06 14:52:04 -04:00
|
|
|
m_Callbacks->CallTableFn("OnRemoteClosed", this);
|
2015-01-30 15:24:02 -05:00
|
|
|
|
2016-07-06 14:52:04 -04:00
|
|
|
// Terminate all processing on the link:
|
2015-01-30 15:24:02 -05:00
|
|
|
Terminated();
|
2015-01-28 09:14:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-02-12 14:05:55 -05:00
|
|
|
|