| //+------------------------------------------------------------------+
|
| //| ConfigManager.mqh |
|
| //| Copyright 2025, EscapeEA |
|
| //| https://www.escapeea.com |
|
| //+------------------------------------------------------------------+
|
| #property copyright "Copyright 2025, EscapeEA"
|
| #property link "https://www.escapeea.com"
|
| #property version "1.00"
|
| #property strict
|
|
|
| #include "SecureMemory.mqh"
|
| #include "InputValidation.mqh"
|
|
|
| //+------------------------------------------------------------------+
|
| //| Configuration manager for secure handling of EA settings |
|
| //+------------------------------------------------------------------+
|
| class CConfigManager {
|
| private:
|
| string m_configPath; // Path to configuration file
|
| bool m_isEncrypted; // Whether config is encrypted
|
|
|
| // Prevent copying
|
| CConfigManager(const CConfigManager&);
|
| void operator=(const CConfigManager&);
|
|
|
| // Simple XOR encryption/decryption (replace with stronger crypto in production)
|
| string SimpleXOR(const string data, const string key) {
|
| string result = "";
|
| int keyLen = StringLen(key);
|
| if(keyLen == 0) return data;
|
|
|
| for(int i = 0; i < StringLen(data); i++) {
|
| result += StringFormat("%c", data[i] ^ key[i % keyLen]);
|
| }
|
| return result;
|
| }
|
|
|
| // Get encryption key (in production, use a more secure key management solution)
|
| string GetEncryptionKey() {
|
| // In a real implementation, derive this from a secure source
|
| return "YourSecureKey123!"; // Replace with secure key management
|
| }
|
|
|
| public:
|
| CConfigManager() : m_isEncrypted(false) {}
|
|
|
| // Initialize configuration manager
|
| bool Initialize(const string configPath = "", bool useEncryption = true) {
|
| m_configPath = configPath;
|
| m_isEncrypted = useEncryption;
|
|
|
| // Validate config path if provided
|
| if(m_configPath != "" && !ExtInputValidator.IsValidFilePath(m_configPath)) {
|
| Print("Error: Invalid configuration file path");
|
| return false;
|
| }
|
|
|
| return true;
|
| }
|
|
|
| // Load configuration from file
|
| string LoadConfig() {
|
| if(m_configPath == "") {
|
| Print("Error: No configuration file path specified");
|
| return "";
|
| }
|
|
|
| // Use RAII for file handling
|
| CFileRAII file(m_configPath, FILE_READ|FILE_BIN);
|
| if(!file.IsValid()) {
|
| Print("Error: Failed to open config file: ", GetLastError());
|
| return "";
|
| }
|
|
|
| // Read file contents
|
| string content = "";
|
| while(!FileIsEnding(file)) {
|
| content += FileReadString(file);
|
| }
|
|
|
| // Decrypt if needed
|
| if(m_isEncrypted) {
|
| content = SimpleXOR(content, GetEncryptionKey());
|
| }
|
|
|
| return content;
|
| }
|
|
|
| // Save configuration to file
|
| bool SaveConfig(const string &configData) {
|
| if(m_configPath == "") {
|
| Print("Error: No configuration file path specified");
|
| return false;
|
| }
|
|
|
| // Encrypt if needed
|
| string dataToSave = m_isEncrypted ? SimpleXOR(configData, GetEncryptionKey()) : configData;
|
|
|
| // Use RAII for file handling
|
| CFileRAII file(m_configPath, FILE_WRITE|FILE_BIN);
|
| if(!file.IsValid()) {
|
| Print("Error: Failed to create config file: ", GetLastError());
|
| return false;
|
| }
|
|
|
| // Write data
|
| FileWriteString(file, dataToSave);
|
| FileFlush(file);
|
|
|
| return true;
|
| }
|
|
|
| // Get configuration as key-value pairs
|
| bool GetConfigMap(string &configMap[][2], const string &configData) {
|
| // Parse config data and populate the map
|
| // Implementation depends on your config format (JSON, INI, etc.)
|
| // This is a simplified example
|
| return false; // Not implemented in this example
|
| }
|
|
|
| // Clean up sensitive data
|
| void Clear() {
|
| // Securely clear any sensitive data
|
| SecureStringClear(m_configPath);
|
| m_isEncrypted = false;
|
| }
|
|
|
| ~CConfigManager() {
|
| Clear();
|
| }
|
| };
|
|
|
| // Global instance
|
| CConfigManager ExtConfig;
|