LEFT | RIGHT |
| 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-2015 Eyeo GmbH |
| 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. |
| 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. |
| 13 * |
| 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ |
| 17 |
1 #include "PluginStdAfx.h" | 18 #include "PluginStdAfx.h" |
2 #include "PluginSettings.h" | 19 #include "PluginSettings.h" |
3 #include "PluginSystem.h" | 20 #include "PluginSystem.h" |
4 #include "PluginFilter.h" | 21 #include "PluginFilter.h" |
5 #include "PluginClientFactory.h" | 22 #include "PluginClientFactory.h" |
6 #include "PluginMutex.h" | 23 #include "PluginMutex.h" |
7 #include "PluginClass.h" | 24 #include "PluginClass.h" |
8 | 25 |
9 #include "AdblockPlusClient.h" | 26 #include "AdblockPlusClient.h" |
10 | 27 |
11 #include "../shared/Utils.h" | 28 #include "../shared/Utils.h" |
12 | 29 |
13 namespace | 30 namespace |
14 { | 31 { |
15 void SpawnAdblockPlusEngine() | 32 void SpawnAdblockPlusEngine() |
16 { | 33 { |
17 std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; | 34 std::wstring engineExecutablePath = GetDllDir() + L"AdblockPlusEngine.exe"; |
18 CString params = to_CString(L"AdblockPlusEngine.exe " + GetBrowserLanguage()
); | 35 CString params = ToCString(L"AdblockPlusEngine.exe " + GetBrowserLanguage())
; |
19 | 36 |
20 STARTUPINFO startupInfo = {}; | 37 STARTUPINFO startupInfo = {}; |
21 PROCESS_INFORMATION processInformation = {}; | 38 PROCESS_INFORMATION processInformation = {}; |
22 | 39 |
23 HANDLE token; | 40 HANDLE token; |
24 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT
| TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); | 41 OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT
| TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &token); |
25 | 42 |
26 TOKEN_APPCONTAINER_INFORMATION *acs = NULL; | 43 TOKEN_APPCONTAINER_INFORMATION *acs = NULL; |
27 DWORD length = 0; | 44 DWORD length = 0; |
28 | 45 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 message >> description.title; | 138 message >> description.title; |
122 message >> description.specialization; | 139 message >> description.specialization; |
123 message >> description.listed; | 140 message >> description.listed; |
124 result.push_back(description); | 141 result.push_back(description); |
125 } | 142 } |
126 return result; | 143 return result; |
127 } | 144 } |
128 } | 145 } |
129 | 146 |
130 CAdblockPlusClient* CAdblockPlusClient::s_instance = NULL; | 147 CAdblockPlusClient* CAdblockPlusClient::s_instance = NULL; |
131 | 148 CComAutoCriticalSection CAdblockPlusClient::s_criticalSectionLocal; |
132 CAdblockPlusClient::CAdblockPlusClient() : CPluginClientBase() | 149 |
| 150 CAdblockPlusClient::CAdblockPlusClient() |
133 { | 151 { |
134 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); | 152 m_filter = std::auto_ptr<CPluginFilter>(new CPluginFilter()); |
135 } | 153 } |
136 | 154 |
137 bool CAdblockPlusClient::CallEngine(Communication::OutputBuffer& message, Commun
ication::InputBuffer& inputBuffer) | 155 bool CAdblockPlusClient::CallEngine(Communication::OutputBuffer& message, Commun
ication::InputBuffer& inputBuffer) |
138 { | 156 { |
139 DEBUG_GENERAL("CallEngine start"); | 157 DEBUG_GENERAL("CallEngine start"); |
140 CriticalSection::Lock lock(enginePipeLock); | 158 CriticalSection::Lock lock(enginePipeLock); |
141 try | 159 try |
142 { | 160 { |
143 if (!enginePipe) | 161 if (!enginePipe) |
144 enginePipe.reset(OpenEnginePipe()); | 162 enginePipe.reset(OpenEnginePipe()); |
145 enginePipe->WriteMessage(message); | 163 enginePipe->WriteMessage(message); |
146 inputBuffer = enginePipe->ReadMessage(); | 164 inputBuffer = enginePipe->ReadMessage(); |
147 } | 165 } |
148 catch (const std::exception& e) | 166 catch (const std::exception& ex) |
149 { | 167 { |
150 DEBUG_GENERAL(e.what()); | 168 DEBUG_EXCEPTION(ex); |
151 return false; | 169 return false; |
152 } | 170 } |
153 DEBUG_GENERAL("CallEngine end"); | 171 DEBUG_GENERAL("CallEngine end"); |
154 return true; | 172 return true; |
155 } | 173 } |
156 | 174 |
157 bool CAdblockPlusClient::CallEngine(Communication::ProcType proc, Communication:
:InputBuffer& inputBuffer) | 175 bool CAdblockPlusClient::CallEngine(Communication::ProcType proc, Communication:
:InputBuffer& inputBuffer) |
158 { | 176 { |
159 Communication::OutputBuffer message; | 177 Communication::OutputBuffer message; |
160 message << proc; | 178 message << proc; |
(...skipping 19 matching lines...) Expand all Loading... |
180 s_instance = client; | 198 s_instance = client; |
181 } | 199 } |
182 | 200 |
183 instance = s_instance; | 201 instance = s_instance; |
184 } | 202 } |
185 s_criticalSectionLocal.Unlock(); | 203 s_criticalSectionLocal.Unlock(); |
186 | 204 |
187 return instance; | 205 return instance; |
188 } | 206 } |
189 | 207 |
190 bool CAdblockPlusClient::ShouldBlock(const std::wstring& src, int contentType, c
onst std::wstring& domain, bool addDebug) | 208 bool CAdblockPlusClient::ShouldBlock(const std::wstring& src, AdblockPlus::Filte
rEngine::ContentType contentType, const std::wstring& domain, bool addDebug) |
191 { | 209 { |
192 bool isBlocked = false; | 210 bool isBlocked = false; |
193 bool isCached = false; | 211 bool isCached = false; |
194 m_criticalSectionCache.Lock(); | 212 m_criticalSectionCache.Lock(); |
195 { | 213 { |
196 auto it = m_cacheBlockedSources.find(src); | 214 auto it = m_cacheBlockedSources.find(src); |
197 | 215 |
198 isCached = it != m_cacheBlockedSources.end(); | 216 isCached = it != m_cacheBlockedSources.end(); |
199 if (isCached) | 217 if (isCached) |
200 { | 218 { |
201 isBlocked = it->second; | 219 isBlocked = it->second; |
202 } | 220 } |
203 } | 221 } |
204 m_criticalSectionCache.Unlock(); | 222 m_criticalSectionCache.Unlock(); |
205 | 223 |
206 if (!isCached) | 224 if (!isCached) |
207 { | 225 { |
208 m_criticalSectionFilter.Lock(); | 226 m_criticalSectionFilter.Lock(); |
209 { | 227 { |
210 isBlocked = m_filter->ShouldBlock(src, contentType, domain, addDebug); | 228 isBlocked = m_filter->ShouldBlock(src, contentType, domain, addDebug); |
211 } | 229 } |
212 m_criticalSectionFilter.Unlock(); | 230 m_criticalSectionFilter.Unlock(); |
213 | 231 |
214 // Cache result, if content type is defined | 232 // Cache result, if content type is defined |
215 if (contentType != CFilter::contentTypeAny) | 233 if (contentType != AdblockPlus::FilterEngine::ContentType::CONTENT_TYPE_OTHE
R) |
216 { | 234 { |
217 m_criticalSectionCache.Lock(); | 235 m_criticalSectionCache.Lock(); |
218 { | 236 { |
219 m_cacheBlockedSources[src] = isBlocked; | 237 m_cacheBlockedSources[src] = isBlocked; |
220 } | 238 } |
221 m_criticalSectionCache.Unlock(); | 239 m_criticalSectionCache.Unlock(); |
222 } | 240 } |
223 } | 241 } |
224 return isBlocked; | 242 return isBlocked; |
225 } | 243 } |
226 | 244 |
227 bool CAdblockPlusClient::IsElementHidden(const std::wstring& tag, IHTMLElement*
pEl, const std::wstring& domain, const std::wstring& indent, CPluginFilter* filt
er) | 245 bool CAdblockPlusClient::IsElementHidden(const std::wstring& tag, IHTMLElement*
pEl, const std::wstring& domain, const std::wstring& indent, CPluginFilter* filt
er) |
228 { | 246 { |
229 bool isHidden; | 247 bool isHidden; |
230 m_criticalSectionFilter.Lock(); | 248 m_criticalSectionFilter.Lock(); |
231 { | 249 { |
232 isHidden = filter && filter->IsElementHidden(tag, pEl, domain, indent); | 250 isHidden = filter && filter->IsElementHidden(tag, pEl, domain, indent); |
233 } | 251 } |
234 m_criticalSectionFilter.Unlock(); | 252 m_criticalSectionFilter.Unlock(); |
235 return isHidden; | 253 return isHidden; |
236 } | 254 } |
237 | 255 |
238 bool CAdblockPlusClient::IsWhitelistedUrl(const std::wstring& url) | 256 bool CAdblockPlusClient::IsWhitelistedUrl(const std::wstring& url) |
239 { | 257 { |
240 DEBUG_GENERAL((L"IsWhitelistedUrl: " + url + L" start").c_str()); | 258 return !GetWhitelistingFilter(url).empty(); |
241 Communication::OutputBuffer request; | 259 } |
242 request << Communication::PROC_IS_WHITELISTED_URL << url; | 260 |
243 | 261 std::string CAdblockPlusClient::GetWhitelistingFilter(const std::wstring& url) |
244 Communication::InputBuffer response; | 262 { |
245 if (!CallEngine(request, response)) | 263 DEBUG_GENERAL((L"GetWhitelistingFilter: " + url + L" start").c_str()); |
246 return false; | 264 Communication::OutputBuffer request; |
247 | 265 request << Communication::PROC_GET_WHITELISTING_FITER << url; |
248 bool isWhitelisted; | 266 |
249 response >> isWhitelisted; | 267 Communication::InputBuffer response; |
250 | 268 if (!CallEngine(request, response)) |
251 DEBUG_GENERAL((L"IsWhitelistedUrl: " + url + L" end").c_str()); | 269 return ""; |
252 return isWhitelisted; | 270 |
| 271 std::string filterText; |
| 272 response >> filterText; |
| 273 |
| 274 DEBUG_GENERAL((L"GetWhitelistingFilter: " + url + L" end").c_str()); |
| 275 return filterText; |
253 } | 276 } |
254 | 277 |
255 bool CAdblockPlusClient::IsElemhideWhitelistedOnDomain(const std::wstring& url) | 278 bool CAdblockPlusClient::IsElemhideWhitelistedOnDomain(const std::wstring& url) |
256 { | 279 { |
257 Communication::OutputBuffer request; | 280 Communication::OutputBuffer request; |
258 request << Communication::PROC_IS_ELEMHIDE_WHITELISTED_ON_URL << url; | 281 request << Communication::PROC_IS_ELEMHIDE_WHITELISTED_ON_URL << url; |
259 | 282 |
260 Communication::InputBuffer response; | 283 Communication::InputBuffer response; |
261 if (!CallEngine(request, response)) | 284 if (!CallEngine(request, response)) |
262 return false; | 285 return false; |
263 | 286 |
264 bool isWhitelisted; | 287 bool isWhitelisted; |
265 response >> isWhitelisted; | 288 response >> isWhitelisted; |
266 return isWhitelisted; | 289 return isWhitelisted; |
267 } | 290 } |
268 | 291 |
269 bool CAdblockPlusClient::Matches(const std::wstring& url, const std::wstring& co
ntentType, const std::wstring& domain) | 292 bool CAdblockPlusClient::Matches(const std::wstring& url, AdblockPlus::FilterEng
ine::ContentType contentType, const std::wstring& domain) |
270 { | 293 { |
271 Communication::OutputBuffer request; | 294 Communication::OutputBuffer request; |
272 request << Communication::PROC_MATCHES << url << contentType << domain; | 295 request << Communication::PROC_MATCHES << url << contentType << domain; |
273 | 296 |
274 Communication::InputBuffer response; | 297 Communication::InputBuffer response; |
275 if (!CallEngine(request, response)) | 298 if (!CallEngine(request, response)) |
276 return false; | 299 return false; |
277 | 300 |
278 bool match; | 301 bool match; |
279 response >> match; | 302 response >> match; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 } | 397 } |
375 | 398 |
376 void CAdblockPlusClient::AddFilter(const std::wstring& text) | 399 void CAdblockPlusClient::AddFilter(const std::wstring& text) |
377 { | 400 { |
378 Communication::OutputBuffer request; | 401 Communication::OutputBuffer request; |
379 request << Communication::PROC_ADD_FILTER << text; | 402 request << Communication::PROC_ADD_FILTER << text; |
380 CallEngine(request); | 403 CallEngine(request); |
381 } | 404 } |
382 | 405 |
383 void CAdblockPlusClient::RemoveFilter(const std::wstring& text) | 406 void CAdblockPlusClient::RemoveFilter(const std::wstring& text) |
| 407 { |
| 408 RemoveFilter(ToUtf8String(text)); |
| 409 } |
| 410 |
| 411 void CAdblockPlusClient::RemoveFilter(const std::string& text) |
384 { | 412 { |
385 Communication::OutputBuffer request; | 413 Communication::OutputBuffer request; |
386 request << Communication::PROC_REMOVE_FILTER << text; | 414 request << Communication::PROC_REMOVE_FILTER << text; |
387 CallEngine(request); | 415 CallEngine(request); |
388 } | 416 } |
389 | 417 |
390 void CAdblockPlusClient::SetPref(const std::wstring& name, const std::wstring& v
alue) | 418 void CAdblockPlusClient::SetPref(const std::wstring& name, const std::wstring& v
alue) |
391 { | 419 { |
392 Communication::OutputBuffer request; | 420 Communication::OutputBuffer request; |
393 request << Communication::PROC_SET_PREF << name << value; | 421 request << Communication::PROC_SET_PREF << name << value; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 DEBUG_GENERAL("CompareVersions"); | 562 DEBUG_GENERAL("CompareVersions"); |
535 Communication::OutputBuffer request; | 563 Communication::OutputBuffer request; |
536 request << Communication::PROC_COMPARE_VERSIONS << v1 << v2; | 564 request << Communication::PROC_COMPARE_VERSIONS << v1 << v2; |
537 Communication::InputBuffer response; | 565 Communication::InputBuffer response; |
538 if (!CallEngine(request, response)) | 566 if (!CallEngine(request, response)) |
539 return 0; | 567 return 0; |
540 int result; | 568 int result; |
541 response >> result; | 569 response >> result; |
542 return result; | 570 return result; |
543 } | 571 } |
LEFT | RIGHT |