Files
apostol-dm/src/app/Common.hpp
Преподобный Ален 7fd514a961 Code refactoring.
2022-09-18 23:01:27 +03:00

155 lines
5.4 KiB
C++

/*++
Module Name:
Common.hpp
Notices:
Dial Module common.
Author:
Copyright (c) Prepodobny Alen
mailto: alienufo@inbox.ru
mailto: ufocomp@gmail.com
--*/
#ifndef APOSTOL_DM_COMMON_HPP
#define APOSTOL_DM_COMMON_HPP
//----------------------------------------------------------------------------------------------------------------------
#define BPS_PGP_HASH "SHA512"
#define BM_PREFIX "BM-"
//----------------------------------------------------------------------------------------------------------------------
#ifdef __cplusplus
extern "C++" {
#endif // __cplusplus
namespace Apostol {
namespace Common {
//--------------------------------------------------------------------------------------------------------------
//-- CCustomModule ---------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
class CCustomModule: public CApostolModule {
protected:
CStringList m_Module;
CJSON m_OAuth2;
CString m_pgpModuleKey;
CString m_pgpPublicKey;
CString m_pgpPassphrase;
CProcessStatus m_Status;
int m_SyncPeriod;
void InitMethods() override;
template<class ClassName>
void UpdateServerList(TPairs<ClassName> &ClassList, const CString &Key) {
CStringPairs ServerList;
CStringList Keys;
int index;
ParsePGPKey(Key, ServerList, Keys);
if (ServerList.Count() != 0) {
CStringPairs::ConstEnumerator em(ServerList);
while (em.MoveNext()) {
const auto &caCurrent = em.Current();
#ifndef _DEBUG
if (caCurrent.Name() == BPS_BM_DEBUG_ADDRESS)
continue;
#endif
index = ClassList.IndexOfName(caCurrent.Name());
if (index == -1) {
index = ClassList.AddPair(caCurrent.Name(), ClassName(caCurrent.Name(), CLocation(caCurrent.Value())));
auto &Context = ClassList[index].Value();
Context.PGP().Add(CKeyContext(CString("PUBLIC"), Key));
Context.PGP().Add(CKeyContext(caCurrent.Name(), CString()));
} else {
auto &Context = ClassList[index].Value();
Context.URL() = caCurrent.Value();
Context.PGP().First().Key = Key;
}
auto &Context = ClassList[index].Value();
Context.BTCKeys() = Keys;
if (Context.Status() == Context::csInitialization) {
UpdateOAuth2(Context, m_OAuth2.Object());
}
}
}
}
//----------------------------------------------------------------------------------------------------------
void FetchProviders(CDateTime Now, CContext &Context);
static void CheckProviders(CDateTime Now, CContext &Context);
void CreateAccessToken(const CProvider &Provider, const CString &Application, CContext &Context);
void ParsePGPKey(const CString &Key, CStringPairs &ServerList, CStringList &BTCKeys);
void ModuleService(CContext &Context);
void ModuleStatus(CContext &Context);
void ModuleNew(CContext &Context);
void ModuleAuthorize(CContext &Context);
void DoGet(CHTTPServerConnection *AConnection) override;
virtual void DoPost(CHTTPServerConnection *AConnection);
virtual void DoAPI(CHTTPServerConnection *AConnection);
virtual void DoAccount(CHTTPServerConnection *AConnection, const CString &Method, const CString &URI) abstract;
virtual void DoDeal(CHTTPServerConnection *AConnection, const CString &Method, const CString &URI, const CString &Action) abstract;
virtual void DoSignature(CHTTPServerConnection *AConnection) abstract;
public:
explicit CCustomModule(CModuleProcess *AProcess, const CString &ModuleName, const CString &SectionName);
~CCustomModule() override = default;
void Initialization(CModuleProcess *AProcess) override;
bool Enabled() override;
virtual void Reload() abstract;
static CString ToString(unsigned long Value);
static void JsonStringToKey(const CString &String, CString &Key);
static void CheckKeyForNull(LPCTSTR Key, LPCTSTR Value);
static void CheckDeal(const CDeal &Deal);
static int CheckFee(const CString &Fee);
static bool CheckVerifyPGPSignature(int VerifyPGPSignature, CString &Message);
static int VerifyPGPSignature(const CString &ClearText, const CString &Key, CString &Message);
static bool FindURLInLine(const CString &Line, CStringList &List);
static void UpdateOAuth2(CContext &Context, const CJSONObject &OAuth2);
static void UpdateProviders(CProviders &Providers, const CJSONObject &Data);
};
}
}
using namespace Apostol::Common;
#ifdef __cplusplus
}
#endif // __cplusplus
#endif //APOSTOL_DM_COMMON_HPP