| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginWbPassThrough.h" | 3 #include "PluginWbPassThrough.h" |
| 4 #include "PluginClient.h" | 4 #include "PluginClient.h" |
| 5 #include "PluginClientFactory.h" | 5 #include "PluginClientFactory.h" |
| 6 #ifdef SUPPORT_FILTER | 6 #ifdef SUPPORT_FILTER |
| 7 #include "PluginFilter.h" | 7 #include "PluginFilter.h" |
| 8 #endif | 8 #endif |
| 9 #include "PluginSettings.h" | 9 #include "PluginSettings.h" |
| 10 #include "PluginClass.h" | 10 #include "PluginClass.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 return CFilter::contentTypeScript; | 43 return CFilter::contentTypeScript; |
| 44 } | 44 } |
| 45 if (mimeType.Find(L"application/x-shockwave-flash") >= 0) | 45 if (mimeType.Find(L"application/x-shockwave-flash") >= 0) |
| 46 { | 46 { |
| 47 return CFilter::contentTypeObject; | 47 return CFilter::contentTypeObject; |
| 48 } | 48 } |
| 49 if (mimeType.Find(L"text/html") >= 0) | 49 if (mimeType.Find(L"text/html") >= 0) |
| 50 { | 50 { |
| 51 return CFilter::contentTypeSubdocument; | 51 return CFilter::contentTypeSubdocument; |
| 52 } | 52 } |
| 53 // It is important to have this check last, since it is rather generic, and mi ght overlay text/html, for example | |
| 54 if (mimeType.Find(L"xml") >= 0) | |
| 55 { | |
| 56 return CFilter::contentTypeXmlHttpRequest; | |
| 57 } | |
| 58 | |
| 53 return CFilter::contentTypeAny; | 59 return CFilter::contentTypeAny; |
| 54 } | 60 } |
| 55 | 61 |
| 56 int WBPassthruSink::GetContentTypeFromURL(const CString& src) | 62 int WBPassthruSink::GetContentTypeFromURL(const CString& src) |
| 57 { | 63 { |
| 58 CString srcExt = src; | 64 CString srcExt = src; |
| 59 | 65 |
| 60 int pos = 0; | 66 int pos = 0; |
| 61 if ((pos = src.Find('?')) > 0) | 67 if ((pos = src.Find('?')) > 0) |
| 62 { | 68 { |
| 63 srcExt = src.Left(pos); | 69 srcExt = src.Left(pos); |
| 64 } | 70 } |
| 65 | 71 |
| 66 int lastDotIndex = srcExt.ReverseFind('.'); | 72 int lastDotIndex = srcExt.ReverseFind('.'); |
| 67 if (lastDotIndex < 0) | 73 if (lastDotIndex < 0) |
| 68 return CFilter::contentTypeAny; | 74 return CFilter::contentTypeAny; |
| 69 CString ext = srcExt.Mid(lastDotIndex); | 75 CString ext = srcExt.Mid(lastDotIndex); |
| 70 if (ext == L".jpg" || ext == L".gif" || ext == L".png" || ext == L".jpeg") | 76 if (ext == L".jpg" || ext == L".gif" || ext == L".png" || ext == L".jpeg") |
| 71 { | 77 { |
| 72 return CFilter::contentTypeImage; | 78 return CFilter::contentTypeImage; |
| 73 } | 79 } |
| 74 else if (ext == L".css") | 80 else if (ext == L".css") |
| 75 { | 81 { |
| 76 return CFilter::contentTypeStyleSheet; | 82 return CFilter::contentTypeStyleSheet; |
| 77 } | 83 } |
| 78 else if (ext.Right(3) == L".js") | 84 else if (ext.Right(3) == L".js") |
| 79 { | 85 { |
| 80 return CFilter::contentTypeScript; | 86 return CFilter::contentTypeScript; |
| 87 } | |
| 88 else if (ext == L".xml") | |
| 89 { | |
| 90 return CFilter::contentTypeXmlHttpRequest; | |
| 81 } | 91 } |
| 82 else if (ext == L".swf") | 92 else if (ext == L".swf") |
| 83 { | 93 { |
| 84 return CFilter::contentTypeObject; | 94 return CFilter::contentTypeObject; |
| 85 } | 95 } |
| 86 else if (ext == L".jsp" || ext == L".php" || ext == L".html") | 96 else if (ext == L".jsp" || ext == L".php" || ext == L".html") |
| 87 { | 97 { |
| 88 return CFilter::contentTypeSubdocument; | 98 return CFilter::contentTypeSubdocument; |
| 89 } | 99 } |
| 90 return CFilter::contentTypeAny; | 100 return CFilter::contentTypeAny; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 174 } | 184 } |
| 175 else | 185 else |
| 176 #endif // SUPPORT_FRAME_CACHING | 186 #endif // SUPPORT_FRAME_CACHING |
| 177 { | 187 { |
| 178 m_contentType = GetContentType(mimeType, m_boundDomain, src); | 188 m_contentType = GetContentType(mimeType, m_boundDomain, src); |
| 179 } | 189 } |
| 180 } | 190 } |
| 181 | 191 |
| 182 } | 192 } |
| 183 | 193 |
| 184 if (nullptr == tab) | 194 if (nullptr == tab) |
|
Oleksandr
2014/10/01 09:15:39
I personally don't like yoda conditions, and I thi
| |
| 185 { | 195 { |
| 186 m_contentType = GetContentType(mimeType, m_boundDomain, src); | 196 m_contentType = GetContentType(mimeType, m_boundDomain, src); |
| 187 } | 197 } |
| 188 | 198 |
| 189 if (nullptr != client | 199 if (nullptr != client |
| 190 && CFilter::EContentType::contentTypeAny != m_contentType | 200 && CFilter::EContentType::contentTypeAny != m_contentType |
|
Oleksandr
2014/09/11 08:58:54
This line is not clear to me. We can in theory blo
sergei
2014/09/11 09:53:25
If the type is `contentTypeAny` then the decision
| |
| 191 && client->ShouldBlock(src, m_contentType, m_boundDomain, true)) | 201 && client->ShouldBlock(src, m_contentType, m_boundDomain, true)) |
|
Oleksandr
2014/10/01 09:15:39
Comment about yoda conditions applies here as well
| |
| 192 { | 202 { |
| 193 isBlocked = true; | 203 isBlocked = true; |
| 194 DEBUG_BLOCKER("Blocker::Blocking Http-request:" + src); | |
|
Oleksandr
2014/09/11 08:58:54
DEBUG_BLOCKER is broken here. Either use CPluginDe
sergei
2014/09/11 09:53:25
`client->ShouldBlock` already puts into the log. `
| |
| 195 } | |
| 196 if (!isBlocked) | |
| 197 { | |
| 198 DEBUG_BLOCKER("Blocker::Ignoring Http-request:" + src) | |
|
Oleksandr
2014/09/11 08:58:54
CPluginDebug::DebugResultIgnoring here accordingly
sergei
2014/09/11 09:53:25
The same as above, deleted.
| |
| 199 } | 204 } |
| 200 | 205 |
| 201 // For IE6 and earlier there is iframe back button issue, so avoid it. | 206 // For IE6 and earlier there is iframe back button issue, so avoid it. |
| 202 if (isBlocked && client->GetIEVersion() > 6) | 207 if (isBlocked && client->GetIEVersion() > 6) |
| 203 { | 208 { |
| 204 handled = true; | 209 handled = true; |
| 205 if (CFilter::EContentType::contentTypeImage == m_contentType) | 210 if (CFilter::EContentType::contentTypeImage == m_contentType) |
| 206 { | 211 { |
| 207 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); | 212 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); |
| 208 // IE shows a cross that img is not loaded | 213 // IE shows a cross that img is not loaded |
| 209 return INET_E_REDIRECT_FAILED; | 214 return INET_E_REDIRECT_FAILED; |
| 210 } | 215 } |
| 211 if (CFilter::EContentType::contentTypeSubdocument == m_contentType) | 216 if (CFilter::EContentType::contentTypeSubdocument == m_contentType) |
| 212 { | 217 { |
| 213 PassthroughAPP::CustomSinkStartPolicy<WBPassthru, WBPassthruSink>::GetProt ocol(this)->m_shouldSupplyCustomContent = true; | 218 PassthroughAPP::CustomSinkStartPolicy<WBPassthru, WBPassthruSink>::GetProt ocol(this)->m_shouldSupplyCustomContent = true; |
| 214 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); | 219 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); |
| 215 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/html"); | 220 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/html"); |
| 216 m_spInternetProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, static _cast<ULONG>(g_myPageBlocked.size())); | 221 m_spInternetProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, static _cast<ULONG>(g_myPageBlocked.size())); |
| 217 return S_OK; | 222 return S_OK; |
| 218 } | 223 } |
| 219 if (CFilter::EContentType::contentTypeScript == m_contentType) | 224 if (CFilter::EContentType::contentTypeScript == m_contentType) |
| 220 { | 225 { |
| 221 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); | 226 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); |
| 222 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/javascript"); | 227 m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"t ext/javascript"); |
| 223 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); | 228 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); |
| 224 return INET_E_REDIRECT_FAILED; | 229 return INET_E_REDIRECT_FAILED; |
| 225 } | 230 } |
| 226 if (CFilter::EContentType::contentTypeXmlHttpRequest == m_contentType) | 231 if (CFilter::EContentType::contentTypeXmlHttpRequest == m_contentType) |
|
Oleksandr
2014/10/01 09:15:39
Looks like we don't need a special case for conten
| |
| 232 { | |
| 233 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); | |
| 234 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); | |
| 235 return INET_E_REDIRECT_FAILED; | |
| 236 } | |
| 237 if (CFilter::EContentType::contentTypeAny != m_contentType) | |
| 227 { | 238 { |
| 228 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); | 239 BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved, pTa rgetProtocol); |
| 229 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); | 240 m_spInternetProtocolSink->ReportResult(INET_E_REDIRECTING, 301, L"data:"); |
|
Oleksandr
2014/10/01 09:15:39
I don't think redirecting all requests to 'data:'
| |
| 230 return INET_E_REDIRECT_FAILED; | 241 return INET_E_REDIRECT_FAILED; |
| 231 } | 242 } |
| 232 } | 243 } |
| 233 #endif // SUPPORT_FILTER | 244 #endif // SUPPORT_FILTER |
| 234 | 245 |
| 235 return isBlocked ? S_FALSE : BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInf o, grfPI, dwReserved, pTargetProtocol); | 246 return isBlocked ? S_FALSE : BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInf o, grfPI, dwReserved, pTargetProtocol); |
| 236 } | 247 } |
| 237 | 248 |
| 238 HRESULT WBPassthruSink::OnRead(void* pv, ULONG cb, ULONG* pcbRead) | 249 HRESULT WBPassthruSink::OnRead(void* pv, ULONG cb, ULONG* pcbRead) |
| 239 { | 250 { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 303 STDMETHODIMP WBPassthruSink::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeade rs, DWORD dwReserved, LPWSTR* pszAdditionalHeaders) | 314 STDMETHODIMP WBPassthruSink::BeginningTransaction(LPCWSTR szURL, LPCWSTR szHeade rs, DWORD dwReserved, LPWSTR* pszAdditionalHeaders) |
| 304 { | 315 { |
| 305 if (pszAdditionalHeaders) | 316 if (pszAdditionalHeaders) |
| 306 { | 317 { |
| 307 *pszAdditionalHeaders = nullptr; | 318 *pszAdditionalHeaders = nullptr; |
| 308 } | 319 } |
| 309 | 320 |
| 310 CPluginClient* client = nullptr; | 321 CPluginClient* client = nullptr; |
| 311 if (CFilter::EContentType::contentTypeAny == m_contentType && (client = CPlugi nClient::GetInstance())) | 322 if (CFilter::EContentType::contentTypeAny == m_contentType && (client = CPlugi nClient::GetInstance())) |
| 312 { | 323 { |
| 313 auto acceptHeader = [&]() -> std::string | 324 auto acceptHeader = [&]() -> std::string |
|
Oleksandr
2014/09/11 08:58:54
I'd just like to say this looks too cool :D
sergei
2014/09/11 09:53:25
Thanks!
| |
| 314 { | 325 { |
| 315 ATL::CComPtr<IWinInetHttpInfo> winInetHttpInfo; | 326 ATL::CComPtr<IWinInetHttpInfo> winInetHttpInfo; |
| 316 HRESULT hr = m_spTargetProtocol->QueryInterface(&winInetHttpInfo); | 327 HRESULT hr = m_spTargetProtocol->QueryInterface(&winInetHttpInfo); |
| 317 if(FAILED(hr)) | 328 if(FAILED(hr)) |
| 318 { | 329 { |
| 319 return ""; | 330 return ""; |
| 320 } | 331 } |
| 321 DWORD size = 0; | 332 DWORD size = 0; |
| 322 DWORD flags = 0; | 333 DWORD flags = 0; |
| 323 hr = winInetHttpInfo->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF | HTTP_QUERY_F LAG_REQUEST_HEADERS, | 334 hr = winInetHttpInfo->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF | HTTP_QUERY_F LAG_REQUEST_HEADERS, |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 341 } | 352 } |
| 342 acceptHeaderBeginsAt += sizeof(acceptHeader); | 353 acceptHeaderBeginsAt += sizeof(acceptHeader); |
| 343 auto acceptHeaderEndsAt = buf.find("\n", acceptHeaderBeginsAt); | 354 auto acceptHeaderEndsAt = buf.find("\n", acceptHeaderBeginsAt); |
| 344 if (std::string::npos == acceptHeaderEndsAt) | 355 if (std::string::npos == acceptHeaderEndsAt) |
| 345 { | 356 { |
| 346 return ""; | 357 return ""; |
| 347 } | 358 } |
| 348 return buf.substr(acceptHeaderBeginsAt, acceptHeaderEndsAt - acceptHeaderB eginsAt); | 359 return buf.substr(acceptHeaderBeginsAt, acceptHeaderEndsAt - acceptHeaderB eginsAt); |
| 349 }(); | 360 }(); |
| 350 m_contentType = GetContentTypeFromMimeType(ATL::CString(acceptHeader.c_str() )); | 361 m_contentType = GetContentTypeFromMimeType(ATL::CString(acceptHeader.c_str() )); |
| 351 bool isBlocked = client->ShouldBlock(szURL, m_contentType, | 362 bool isBlocked = client->ShouldBlock(szURL, m_contentType, m_boundDomain, /* debug flag but must be set*/true); |
| 352 //client->GetHostFromUrl(m_boundDomain.operator LPCWSTR()).c_str(), /*debu g flag but must be set*/true); | |
|
Oleksandr
2014/09/11 08:58:54
Leftover code here?
sergei
2014/09/11 09:53:25
Thanks, removed.
| |
| 353 m_boundDomain, /*debug flag but must be set*/true); | |
| 354 if (isBlocked) | 363 if (isBlocked) |
| 355 { | 364 { |
|
Oleksandr
2014/09/11 08:58:54
Log blocking here as well
sergei
2014/09/11 09:53:25
`client->ShouldBlock` puts into log
| |
| 356 return E_ABORT; | 365 return E_ABORT; |
| 357 } | 366 } |
| 358 } | 367 } |
| 359 CComPtr<IHttpNegotiate> spHttpNegotiate; | 368 CComPtr<IHttpNegotiate> spHttpNegotiate; |
| 360 QueryServiceFromClient(&spHttpNegotiate); | 369 QueryServiceFromClient(&spHttpNegotiate); |
| 361 return spHttpNegotiate ? spHttpNegotiate->BeginningTransaction(szURL, szHeader s,dwReserved, pszAdditionalHeaders) : S_OK; | 370 return spHttpNegotiate ? spHttpNegotiate->BeginningTransaction(szURL, szHeader s,dwReserved, pszAdditionalHeaders) : S_OK; |
| 362 } | 371 } |
| 363 | 372 |
| 364 STDMETHODIMP WBPassthruSink::OnResponse(DWORD dwResponseCode, LPCWSTR szResponse Headers, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders) | 373 STDMETHODIMP WBPassthruSink::OnResponse(DWORD dwResponseCode, LPCWSTR szResponse Headers, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders) |
| 365 { | 374 { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 412 } | 421 } |
| 413 | 422 |
| 414 STDMETHODIMP WBPassthru::UnlockRequest() | 423 STDMETHODIMP WBPassthru::UnlockRequest() |
| 415 { | 424 { |
| 416 if (m_shouldSupplyCustomContent) | 425 if (m_shouldSupplyCustomContent) |
| 417 { | 426 { |
| 418 return S_OK; | 427 return S_OK; |
| 419 } | 428 } |
| 420 return PassthroughAPP::CInternetProtocol<WBStartPolicy>::UnlockRequest(); | 429 return PassthroughAPP::CInternetProtocol<WBStartPolicy>::UnlockRequest(); |
| 421 } | 430 } |
| LEFT | RIGHT |