| OLD | NEW |
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginFilter.h" | 3 #include "PluginFilter.h" |
| 4 | 4 |
| 5 #if (defined PRODUCT_ADBLOCKPLUS) | 5 #if (defined PRODUCT_ADBLOCKPLUS) |
| 6 #include "PluginSettings.h" | 6 #include "PluginSettings.h" |
| 7 #include "PluginClient.h" | 7 #include "PluginClient.h" |
| 8 #include "PluginClientFactory.h" | 8 #include "PluginClientFactory.h" |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 m_contentType = filter.m_contentType; | 217 m_contentType = filter.m_contentType; |
| 218 m_filterType = filter.m_filterType; | 218 m_filterType = filter.m_filterType; |
| 219 | 219 |
| 220 m_isFirstParty = filter.m_isFirstParty; | 220 m_isFirstParty = filter.m_isFirstParty; |
| 221 m_isThirdParty = filter.m_isThirdParty; | 221 m_isThirdParty = filter.m_isThirdParty; |
| 222 | 222 |
| 223 m_isMatchCase = filter.m_isMatchCase; | 223 m_isMatchCase = filter.m_isMatchCase; |
| 224 m_isFromStart = filter.m_isFromStart; | 224 m_isFromStart = filter.m_isFromStart; |
| 225 m_isFromEnd = filter.m_isFromEnd; | 225 m_isFromEnd = filter.m_isFromEnd; |
| 226 | 226 |
| 227 m_stringElements = filter.m_stringElements; | |
| 228 | |
| 229 m_filterText = filter.m_filterText; | 227 m_filterText = filter.m_filterText; |
| 230 | 228 |
| 231 m_hitCount = filter.m_hitCount; | 229 m_hitCount = filter.m_hitCount; |
| 232 } | 230 } |
| 233 | 231 |
| 234 | 232 |
| 235 CFilter::CFilter() : m_isMatchCase(false), m_isFirstParty(false), m_isThirdParty
(false), m_contentType(CFilter::contentTypeAny), | 233 CFilter::CFilter() : m_isMatchCase(false), m_isFirstParty(false), m_isThirdParty
(false), m_contentType(CFilter::contentTypeAny), |
| 236 m_isFromStart(false), m_isFromEnd(false), m_hitCount(0) | 234 m_isFromStart(false), m_isFromEnd(false), m_hitCount(0) |
| 237 { | 235 { |
| 238 } | 236 } |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 { | 709 { |
| 712 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") | 710 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") |
| 713 | 711 |
| 714 #ifdef ENABLE_DEBUG_RESULT | 712 #ifdef ENABLE_DEBUG_RESULT |
| 715 CPluginDebug::DebugResultBlocking(type, src, domain); | 713 CPluginDebug::DebugResultBlocking(type, src, domain); |
| 716 #endif | 714 #endif |
| 717 } | 715 } |
| 718 return true; | 716 return true; |
| 719 } | 717 } |
| 720 return false; | 718 return false; |
| 721 } | 719 } |
| 722 | |
| 723 int CPluginFilter::FindMatch(const CString& src, CString filterPart, int srcStar
tPos) const | |
| 724 { | |
| 725 int filterCurrentPos = filterPart.Find('^'); | |
| 726 if (filterCurrentPos >= 0) | |
| 727 { | |
| 728 int srcLength = src.GetLength(); | |
| 729 int srcFilterPos = -1; | |
| 730 int srcCurrentPos = srcStartPos; | |
| 731 int srcLastTestPos = -1; | |
| 732 | |
| 733 // Special char(s) as first char? | |
| 734 int nFirst = 0; | |
| 735 while (filterCurrentPos == 0) | |
| 736 { | |
| 737 filterPart = filterPart.Right(filterPart.GetLength() - 1); | |
| 738 ++nFirst; | |
| 739 filterCurrentPos = filterPart.Find('^'); | |
| 740 } | |
| 741 | |
| 742 // Find first part without special chars | |
| 743 CString test = filterCurrentPos >= 0 ? filterPart.Left(filterCurrentPos) : f
ilterPart; | |
| 744 int testLength = test.GetLength(); | |
| 745 | |
| 746 while (filterCurrentPos >= 0 || testLength > 0) | |
| 747 { | |
| 748 int srcFindPos = testLength > 0 ? src.Find(test, srcCurrentPos) : srcCurre
ntPos; | |
| 749 if (srcFindPos < 0) | |
| 750 { | |
| 751 // Always fail - no need to iterate | |
| 752 return -1; | |
| 753 } | |
| 754 | |
| 755 if (testLength > 0) | |
| 756 { | |
| 757 srcLastTestPos = srcFindPos; | |
| 758 } | |
| 759 | |
| 760 // Already found earlier part; this part must follow | |
| 761 if (srcFilterPos >= 0) | |
| 762 { | |
| 763 // Found position must be position we are at in source | |
| 764 if (srcFindPos != srcCurrentPos) | |
| 765 { | |
| 766 // Try to next iteration maybe we will find it later | |
| 767 return srcLastTestPos >= 0 ? FindMatch(src, filterPart, srcLastTestPos
+ 1) : -1; | |
| 768 } | |
| 769 } | |
| 770 else | |
| 771 { | |
| 772 srcCurrentPos = srcFindPos; | |
| 773 srcFilterPos = srcFindPos; | |
| 774 | |
| 775 // If starting with special char, check for that | |
| 776 for (int n = 1; n <= nFirst; n++) | |
| 777 { | |
| 778 if (--srcFilterPos < 0 || srcFilterPos < srcStartPos || !IsSpecialChar
(src.GetAt(srcFilterPos))) | |
| 779 { | |
| 780 // Try to next iteration maybe we will find it later | |
| 781 return srcLastTestPos >= 0 ? FindMatch(src, filterPart, srcLastTestP
os + 1) : -1; | |
| 782 } | |
| 783 } | |
| 784 nFirst = 0; | |
| 785 } | |
| 786 | |
| 787 srcCurrentPos += testLength; | |
| 788 | |
| 789 // Next char must be special char | |
| 790 if (filterCurrentPos >= 0 && !IsSpecialChar(src.GetAt(srcCurrentPos++))) | |
| 791 { | |
| 792 // Try to next iteration maybe we will find it later | |
| 793 return srcLastTestPos >= 0 ? FindMatch(src, filterPart, srcLastTestPos +
1) : -1; | |
| 794 } | |
| 795 | |
| 796 // Upate test strin and position for next loop | |
| 797 if (filterCurrentPos >= 0) | |
| 798 { | |
| 799 int filterNewPos = filterPart.Find('^', filterCurrentPos + 1); | |
| 800 test = filterNewPos >= 0 ? filterPart.Mid(filterCurrentPos + 1, filterNe
wPos - filterCurrentPos - 1) : filterPart.Right(filterPart.GetLength() - filterC
urrentPos - 1); | |
| 801 | |
| 802 filterCurrentPos = filterNewPos; | |
| 803 } | |
| 804 else | |
| 805 { | |
| 806 test.Empty(); | |
| 807 } | |
| 808 testLength = test.GetLength(); | |
| 809 } | |
| 810 | |
| 811 // If only special chars, check for that | |
| 812 if (nFirst > 0) | |
| 813 { | |
| 814 int nFound = 0; | |
| 815 | |
| 816 srcFilterPos = srcCurrentPos; | |
| 817 | |
| 818 while (nFound != nFirst && srcLength >= srcFilterPos + nFound) | |
| 819 { | |
| 820 if (IsSpecialChar(src.GetAt(srcFilterPos + nFound))) | |
| 821 { | |
| 822 nFound++; | |
| 823 } | |
| 824 else | |
| 825 { | |
| 826 if (nFound > 0) | |
| 827 { | |
| 828 nFound--; | |
| 829 } | |
| 830 | |
| 831 srcFilterPos++; | |
| 832 } | |
| 833 } | |
| 834 | |
| 835 if (nFound != nFirst) | |
| 836 { | |
| 837 // Always fail - no need to iterate | |
| 838 return -1; | |
| 839 } | |
| 840 } | |
| 841 | |
| 842 return srcFilterPos; | |
| 843 } | |
| 844 else | |
| 845 { | |
| 846 return src.Find(filterPart, srcStartPos); | |
| 847 } | |
| 848 } | |
| 849 | |
| 850 bool CPluginFilter::IsSpecialChar(TCHAR testChar) const | |
| 851 { | |
| 852 if (isalnum(testChar) || testChar == '.' || testChar == '-' || testChar == '%'
) | |
| 853 { | |
| 854 return false; | |
| 855 } | |
| 856 | |
| 857 return true; | |
| 858 } | |
| 859 | |
| 860 bool CPluginFilter::IsSubdomain(const CString& subdomain, const CString& domain)
const | |
| 861 { | |
| 862 int pos = subdomain.Find(domain); | |
| 863 | |
| 864 if (pos > 0 && domain.GetLength() + pos == subdomain.GetLength()) | |
| 865 { | |
| 866 if (subdomain.GetAt(pos - 1) == '.') | |
| 867 { | |
| 868 return true; | |
| 869 } | |
| 870 } | |
| 871 | |
| 872 return false; | |
| 873 } | |
| OLD | NEW |