Index: Shared/PluginSettings.cpp |
=================================================================== |
--- a/Shared/PluginSettings.cpp |
+++ b/Shared/PluginSettings.cpp |
@@ -14,6 +14,8 @@ |
#endif |
#include "PluginMutex.h" |
#include "PluginHttpRequest.h" |
+#include <memory> |
+ |
// IE functions |
#pragma comment(lib, "iepmapi.lib") |
@@ -816,71 +818,6 @@ |
return isWritten; |
} |
-#ifdef SUPPORT_WHITELIST |
- |
-void CPluginSettings::AddDomainToHistory(const CString& domain) |
-{ |
- if (!CPluginClient::IsValidDomain(domain)) |
- { |
- return; |
- } |
- |
- // Delete domain |
- s_criticalSectionDomainHistory.Lock(); |
- { |
- for (TDomainHistory::iterator it = m_domainHistory.begin(); it != m_domainHistory.end(); ++it) |
- { |
- if (it->first == domain) |
- { |
- m_domainHistory.erase(it); |
- break; |
- } |
- } |
- |
- // Get whitelist reason |
- int reason = 0; |
- |
- s_criticalSectionLocal.Lock(); |
- { |
- TDomainList::iterator it = m_whitelist.find(domain); |
- if (it != m_whitelist.end()) |
- { |
- reason = it->second; |
- } |
- else |
- { |
- reason = 3; |
- } |
- } |
- s_criticalSectionLocal.Unlock(); |
- |
- // Delete domain, if history is too long |
- if (m_domainHistory.size() >= DOMAIN_HISTORY_MAX_COUNT) |
- { |
- m_domainHistory.erase(m_domainHistory.begin()); |
- } |
- |
- m_domainHistory.push_back(std::make_pair(domain, reason)); |
- } |
- s_criticalSectionDomainHistory.Unlock(); |
-} |
- |
- |
-TDomainHistory CPluginSettings::GetDomainHistory() const |
-{ |
- TDomainHistory domainHistory; |
- |
- s_criticalSectionDomainHistory.Lock(); |
- { |
- domainHistory = m_domainHistory; |
- } |
- s_criticalSectionDomainHistory.Unlock(); |
- |
- return domainHistory; |
-} |
- |
-#endif // SUPPORT_WHITELIST |
- |
bool CPluginSettings::IsPluginUpdateAvailable() const |
{ |
@@ -1568,8 +1505,7 @@ |
{ |
s_criticalSectionLocal.Lock(); |
{ |
- m_whitelist.clear(); |
- m_whitelistToGo.clear(); |
+ m_whitelistedDomains.clear(); |
} |
s_criticalSectionLocal.Unlock(); |
} |
@@ -1583,182 +1519,49 @@ |
if (isDebug) |
{ |
- DEBUG_GENERAL("*** Loading whitelist settings:" + m_settingsFileWhitelist->GetFilePath()); |
+ DEBUG_GENERAL("*** Loading whitelist settings"); |
} |
CPluginSettingsWhitelistLock lock; |
if (lock.IsLocked()) |
{ |
- isRead = m_settingsFileWhitelist->Read(); |
- if (isRead) |
+ ClearWhitelist(); |
+ |
+ s_criticalSectionLocal.Lock(); |
+ std::vector<AdblockPlus::FilterPtr> filters = CPluginClient::GetInstance()->GetFilterEngine()->GetListedFilters(); |
+ for (int i = 0; i < filters.size(); i ++) |
{ |
- if (m_settingsFileWhitelist->IsValidChecksum()) |
+ if (filters[i]->GetProperty("type", AdblockPlus::Filter::Type::TYPE_INVALID) == AdblockPlus::Filter::Type::TYPE_EXCEPTION) |
{ |
- ClearWhitelist(); |
- |
- s_criticalSectionLocal.Lock(); |
+ std::string text = filters[i]->GetProperty("text", ""); |
+ //@@||example.com^$document |
+ size_t endPos = text.rfind("^$document"); |
+ if (endPos != std::string::npos) |
{ |
- // Unpack white list |
- CPluginIniFileW::TSectionData whitelist = m_settingsFileWhitelist->GetSectionData("Whitelist"); |
- int domainCount = 0; |
- bool bContinue = true; |
- |
- do |
+ size_t startPos = text.find("@@||") + 4; |
+ if (startPos != std::string::npos) |
{ |
- CString domainCountStr; |
- domainCountStr.Format(L"%d", ++domainCount); |
- |
- CPluginIniFileW::TSectionData::iterator domainIt = whitelist.find(L"domain" + domainCountStr); |
- CPluginIniFileW::TSectionData::iterator reasonIt = whitelist.find(L"domain" + domainCountStr + L"r"); |
- |
- if (bContinue = (domainIt != whitelist.end() && reasonIt != whitelist.end())) |
- { |
- m_whitelist[domainIt->second] = _wtoi(reasonIt->second); |
- } |
- |
- } while (bContinue); |
- |
- // Unpack white list |
- whitelist = m_settingsFileWhitelist->GetSectionData("Whitelist togo"); |
- domainCount = 0; |
- bContinue = true; |
- |
- do |
- { |
- CString domainCountStr; |
- domainCountStr.Format(L"%d", ++domainCount); |
- |
- CPluginIniFileW::TSectionData::iterator domainIt = whitelist.find(L"domain" + domainCountStr); |
- CPluginIniFileW::TSectionData::iterator reasonIt = whitelist.find(L"domain" + domainCountStr + L"r"); |
- |
- if (bContinue = (domainIt != whitelist.end() && reasonIt != whitelist.end())) |
- { |
- m_whitelistToGo[domainIt->second] = _wtoi(reasonIt->second); |
- } |
- |
- } while (bContinue); |
+ m_whitelistedDomains.push_back(text.substr(startPos, endPos - startPos)); |
+ } |
} |
- s_criticalSectionLocal.Unlock(); |
- } |
- else |
- { |
- DEBUG_SETTINGS("SettingsWhitelist:Invalid checksum - Deleting file") |
- |
- DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERROR_SETTINGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_READ_CHECKSUM, "SettingsWhitelist::Read - Checksum") |
- isRead = false; |
- m_isDirtyWhitelist = true; |
} |
} |
- else if (m_settingsFileWhitelist->GetLastError() == ERROR_FILE_NOT_FOUND) |
- { |
- m_isDirtyWhitelist = true; |
- } |
- else |
- { |
- DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERROR_SETTINGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_READ, "SettingsWhitelist::Read") |
- } |
+ s_criticalSectionLocal.Unlock(); |
} |
else |
{ |
isRead = false; |
} |
- // Write file in case it is dirty |
- WriteWhitelist(isDebug); |
- |
return isRead; |
} |
-bool CPluginSettings::WriteWhitelist(bool isDebug) |
-{ |
- bool isWritten = true; |
- |
- if (!m_isDirtyWhitelist) |
- { |
- return isWritten; |
- } |
- |
- if (isDebug) |
- { |
- DEBUG_GENERAL("*** Writing changed whitelist settings") |
- } |
- |
- CPluginSettingsWhitelistLock lock; |
- if (lock.IsLocked()) |
- { |
- m_settingsFileWhitelist->Clear(); |
- |
- s_criticalSectionLocal.Lock(); |
- { |
- // White list |
- int whitelistCount = 0; |
- CPluginIniFileW::TSectionData whitelist; |
- |
- for (TDomainList::iterator it = m_whitelist.begin(); it != m_whitelist.end(); ++it) |
- { |
- CString whitelistCountStr; |
- whitelistCountStr.Format(L"%d", ++whitelistCount); |
- |
- CString reason; |
- reason.Format(L"%d", it->second); |
- |
- whitelist[L"domain" + whitelistCountStr] = it->first; |
- whitelist[L"domain" + whitelistCountStr + L"r"] = reason; |
- } |
- |
- m_settingsFileWhitelist->UpdateSection("Whitelist", whitelist); |
- |
- // White list (not yet committed) |
- whitelistCount = 0; |
- whitelist.clear(); |
- |
- for (TDomainList::iterator it = m_whitelistToGo.begin(); it != m_whitelistToGo.end(); ++it) |
- { |
- CString whitelistCountStr; |
- whitelistCountStr.Format(L"%d", ++whitelistCount); |
- |
- CString reason; |
- reason.Format(L"%d", it->second); |
- |
- whitelist[L"domain" + whitelistCountStr] = it->first; |
- whitelist[L"domain" + whitelistCountStr + L"r"] = reason; |
- } |
- |
- m_settingsFileWhitelist->UpdateSection("Whitelist togo", whitelist); |
- } |
- s_criticalSectionLocal.Unlock(); |
- |
- // Write file |
- isWritten = m_settingsFileWhitelist->Write(); |
- if (!isWritten) |
- { |
- DEBUG_ERROR_LOG(m_settingsFileWhitelist->GetLastError(), PLUGIN_ERROR_SETTINGS_WHITELIST, PLUGIN_ERROR_SETTINGS_FILE_WRITE, "SettingsWhitelist::Write") |
- } |
- |
- m_isDirty = false; |
- } |
- else |
- { |
- isWritten = false; |
- } |
- |
- if (isWritten) |
- { |
- DEBUG_WHITELIST("Whitelist::Icrement version") |
- |
- IncrementTabVersion(SETTING_TAB_WHITELIST_VERSION); |
- } |
- |
- return isWritten; |
-} |
- |
- |
-void CPluginSettings::AddWhiteListedDomain(const CString& domain, int reason, bool isToGo) |
+void CPluginSettings::AddWhiteListedDomain(const CString& domain) |
{ |
DEBUG_SETTINGS("SettingsWhitelist::AddWhiteListedDomain domain:" + domain) |
- bool isNewVersion = false; |
+ bool isNewVersion = false; |
bool isForcingUpdateOnStart = false; |
CPluginSettingsWhitelistLock lock; |
@@ -1766,71 +1569,20 @@ |
{ |
ReadWhitelist(false); |
+ std::string newDomain = CW2A(domain, CP_UTF8); |
+ |
+ //Domain already present? |
+ if (std::find(m_whitelistedDomains.begin(), m_whitelistedDomains.end(), newDomain) != m_whitelistedDomains.end()) |
+ { |
+ return; |
+ } |
s_criticalSectionLocal.Lock(); |
{ |
- bool isToGoMatcingReason = false; |
- bool isToGoMatcingDomain = false; |
- |
- TDomainList::iterator itToGo = m_whitelistToGo.find(domain); |
- TDomainList::iterator it = m_whitelist.find(domain); |
- if (isToGo) |
- { |
- if (itToGo != m_whitelistToGo.end()) |
- { |
- isToGoMatcingDomain = true; |
- isToGoMatcingReason = itToGo->second == reason; |
- |
- if (reason == 3) |
- { |
- m_whitelistToGo.erase(itToGo); |
- m_isDirtyWhitelist = true; |
- } |
- else if (!isToGoMatcingReason) |
- { |
- itToGo->second = reason; |
- m_isDirtyWhitelist = true; |
- } |
- } |
- else |
- { |
- m_whitelistToGo[domain] = reason; |
- m_isDirtyWhitelist = true; |
- |
- // Delete new togo item from saved white list |
- if (it != m_whitelist.end()) |
- { |
- m_whitelist.erase(it); |
- } |
- } |
- } |
- else |
- { |
- if (isToGoMatcingDomain) |
- { |
- m_whitelistToGo.erase(itToGo); |
- m_isDirtyWhitelist = true; |
- } |
- |
- if (it != m_whitelist.end()) |
- { |
- if (it->second != reason) |
- { |
- it->second = reason; |
- m_isDirtyWhitelist = true; |
- } |
- } |
- else |
- { |
- m_whitelist[domain] = reason; |
- m_isDirtyWhitelist = true; |
- } |
- } |
- |
- isForcingUpdateOnStart = m_whitelistToGo.size() > 0; |
+ AdblockPlus::FilterPtr whitelistFilter = CPluginClient::GetInstance()->GetFilterEngine()->GetFilter(std::string("@@||").append(CW2A(domain)).append("^$document")); |
+ whitelistFilter->AddToList(); |
} |
s_criticalSectionLocal.Unlock(); |
- WriteWhitelist(false); |
} |
if (isForcingUpdateOnStart) |
@@ -1846,12 +1598,7 @@ |
s_criticalSectionLocal.Lock(); |
{ |
- bIsWhiteListed = m_whitelist.find(domain) != m_whitelist.end(); |
- if (!bIsWhiteListed) |
- { |
- TDomainList::const_iterator it = m_whitelistToGo.find(domain); |
- bIsWhiteListed = it != m_whitelistToGo.end() && it->second != 3; |
- } |
+ bIsWhiteListed = std::find(m_whitelistedDomains.begin(), m_whitelistedDomains.end(), std::string(CW2A(domain, CP_UTF8))) != m_whitelistedDomains.end(); |
} |
s_criticalSectionLocal.Unlock(); |
@@ -1864,7 +1611,7 @@ |
s_criticalSectionLocal.Lock(); |
{ |
- count = (int)m_whitelist.size(); |
+ count = (int)m_whitelistedDomains.size(); |
} |
s_criticalSectionLocal.Unlock(); |
@@ -1872,95 +1619,10 @@ |
} |
-TDomainList CPluginSettings::GetWhiteListedDomainList(bool isToGo) const |
+std::vector<std::string> CPluginSettings::GetWhiteListedDomainList(bool isToGo) |
{ |
- TDomainList domainList; |
- |
- s_criticalSectionLocal.Lock(); |
- { |
- if (isToGo) |
- { |
- domainList = m_whitelistToGo; |
- } |
- else |
- { |
- domainList = m_whitelist; |
- } |
- } |
- s_criticalSectionLocal.Unlock(); |
- |
- return domainList; |
-} |
- |
- |
-void CPluginSettings::ReplaceWhiteListedDomains(const TDomainList& domains) |
-{ |
- CPluginSettingsWhitelistLock lock; |
- if (lock.IsLocked()) |
- { |
- ReadWhitelist(false); |
- |
- s_criticalSectionLocal.Lock(); |
- { |
- if (m_whitelist != domains) |
- { |
- m_whitelist = domains; |
- m_isDirtyWhitelist = true; |
- } |
- |
- // Delete entries in togo list |
- bool isDeleted = true; |
- |
- while (isDeleted) |
- { |
- isDeleted = false; |
- |
- for (TDomainList::iterator it = m_whitelistToGo.begin(); it != m_whitelistToGo.end(); ++it) |
- { |
- if (m_whitelist.find(it->first) != m_whitelist.end() || it->second == 3) |
- { |
- m_whitelistToGo.erase(it); |
- |
- // Force another round... |
- isDeleted = true; |
- break; |
- } |
- } |
- } |
- } |
- s_criticalSectionLocal.Unlock(); |
- |
- WriteWhitelist(false); |
- } |
-} |
- |
- |
-void CPluginSettings::RemoveWhiteListedDomainsToGo(const TDomainList& domains) |
-{ |
- CPluginSettingsWhitelistLock lock; |
- if (lock.IsLocked()) |
- { |
- ReadWhitelist(false); |
- |
- s_criticalSectionLocal.Lock(); |
- { |
- for (TDomainList::const_iterator it = domains.begin(); it != domains.end(); ++it) |
- { |
- for (TDomainList::iterator itToGo = m_whitelistToGo.begin(); itToGo != m_whitelistToGo.end(); ++ itToGo) |
- { |
- if (it->first == itToGo->first) |
- { |
- m_whitelistToGo.erase(itToGo); |
- m_isDirtyWhitelist = true; |
- break; |
- } |
- } |
- } |
- } |
- s_criticalSectionLocal.Unlock(); |
- |
- WriteWhitelist(false); |
- } |
+ bool r = ReadWhitelist(false); |
+ return m_whitelistedDomains; |
} |
@@ -2004,8 +1666,8 @@ |
void CPluginSettings::SetSubscription(std::string url) |
{ |
FilterEngine* filterEngine= CPluginClient::GetInstance()->GetFilterEngine(); |
- AdblockPlus::Subscription subscription = filterEngine->GetSubscription(url); |
- subscription.AddToList(); |
+ AdblockPlus::SubscriptionPtr subscription = filterEngine->GetSubscription(url); |
+ subscription->AddToList(); |
} |
CString CPluginSettings::GetSubscription() |