Пример #1
0
bool FilterRule::isMatchThirdParty(const Url &mainURL, const Url &other)
{
    if(!this->m_filterThirdParty)
        return true;
    if(mainURL.GetString().empty())
        return true;

	return boost::iends_with(other.GetHost(),mainURL.GetHost()) == this->m_matchFirstParty;
}
Пример #2
0
std::string RuleMap::getcssRules(const Url & url)
{
	std::string res;
	StringVector dotsplits;
	boost::split(dotsplits,url.GetHost(),boost::is_any_of("."));
	if(dotsplits.size()<=1) //domain error? no dot? at least g.cn
		return res;
	int ignore=2;
	std::string l2domain=dotsplits[dotsplits.size()-2];
	if(l2domain =="com" ||
		l2domain=="net" ||
		l2domain=="org" ||
		l2domain=="edu")
		ignore=3;
	for(int i=dotsplits.size()-ignore;i>=0;i--) 
	{
		std::string domain=dotsplits[i];
		for(int j=i+1;j<dotsplits.size();j++) 
		{
			domain=domain+"."+dotsplits[j];
		}
		HideRuleMap::iterator it=this->m_HideRules.find(domain);

		if(it!=m_HideRules.end()) 
		{
			res=res.empty()?it->second:res+","+it->second;
		}
	}
	return res;
}
Пример #3
0
int RuleMap::shouldFilterByDomain(const Url & mainURL,const Url & url,FilterType t,bool & isFind)
{
	int iRet = 0;
	StringVector dotsplits;
	this->m_DomainFilterRules.prepareStartFind();
	this->m_DomainWhiteRules.prepareStartFind();
	boost::split(dotsplits,url.GetHost(),boost::is_any_of("."));
	if (dotsplits.size() <= 1) //domain error? no dot? at least g.cn
		return false;
	for (int i = dotsplits.size() - 2; i >= 0; i--) {
		std::string domain = dotsplits[i];
		for (int j = i + 1; j < dotsplits.size(); j++) {
			domain = domain + "." + dotsplits[j];
		}
		iRet=m_DomainWhiteRules.doFilter(mainURL, domain, url, t);
		if (iRet != 0)
		{
			isFind = true;
			return 0;
		}
		iRet=m_DomainFilterRules.doFilter(mainURL, domain, url, t);
		if (iRet != 0)
		{
			isFind = true;
			return iRet;
		}
	}
	return iRet;
}
Пример #4
0
int FilterManager::checkConfigHost(const Url & url,bool &bFind,std::string &strMatchHost,int cfgFlag)
{
	readLock rdLock(rw_cfgmutex);
	std::string res;
	StringVector dotsplits;
	boost::split(dotsplits,url.GetHost(),boost::is_any_of("."));
	if(dotsplits.size()<=1) //domain error? no dot? at least g.cn
		return false;
	int ignore=2;
	std::string l2domain=dotsplits[dotsplits.size()-2];
	if(l2domain =="com" ||
		l2domain=="net" ||
		l2domain=="org" ||
		l2domain=="edu")
		ignore=3;
	for(int i=dotsplits.size()-ignore;i>=0;i--) 
	{
		std::string domain=dotsplits[i];
		for(int j=i+1;j<dotsplits.size();j++) {
			domain=domain+"."+dotsplits[j];
		}
		if (cfgFlag & CFG_CHECK_WHITE)
		{
			ConfigRuleMap::iterator it_White=this->m_ConfigWhiteRules.find(domain);
			if(it_White!=m_ConfigWhiteRules.end()) 
			{
				bFind = true;
				return 0;
			}

		}	

		if (cfgFlag & CFG_CHECK_VIDEO)
		{
			ConfigRuleMap::iterator it_video=map_VideoState.find(domain);
			if(it_video!=map_VideoState.end()) 
			{
				strMatchHost = domain;
				bFind = true;
				return it_video->second;
			}
		}
	}
	return 0;
}
Пример #5
0
// true:添加到白名单
// false:从白名单中删除
bool FilterManager::updateConfigWhiteHost(const Url & url,bool bEnable)
{
	writeLock wrlock(rw_cfgmutex);
	std::string host = url.GetHost();
	//ConfigRuleMap::iterator hit=this->m_ConfigWhileRules.find(host);
	if (bEnable)
	{
		ConfigRuleMap::iterator hit=this->m_ConfigWhiteRules.find(host);
		if(hit == m_ConfigWhiteRules.end())
		{
			m_ConfigWhiteRules.insert(ConfigRuleMap::value_type(host, 0));
		}
	}
	else
	{
		m_ConfigWhiteRules.erase(host);
	}
	return true;
}
Пример #6
0
// 0:弹框
// 1:过滤
// 2:不过滤
bool FilterManager::updateConfigVideoHost(const Url & url,int istate)
{
	writeLock wrlock(rw_cfgmutex);
	std::string host = url.GetHost();
	if (host.empty())
	{
		return false;
	}
	ConfigRuleMap::iterator hit=map_VideoState.find(host);
	if(hit!=map_VideoState.end())
	{
		hit->second=istate;
	}
	else {
		map_VideoState.insert(ConfigRuleMap::value_type(host, istate));
	}

	return true;
}
Пример #7
0
void RuleMap::getreplaceRules(const Url & url,std::vector<std::string> & v_replace)
{
	StringVector dotsplits;
	this->m_DomainReplaceRules.prepareStartFind();

	boost::split(dotsplits,url.GetHost(),boost::is_any_of("."));
	if (dotsplits.size() >= 1) //domain error? no dot? at least g.cn
	{
		for (int i = dotsplits.size() - 2; i >= 0; i--) 
		{
			std::string domain = dotsplits[i];
			for (int j = i + 1; j < dotsplits.size(); j++) 
			{
				domain = domain + "." + dotsplits[j];
			}
			m_DomainReplaceRules.getReplace(domain,url,v_replace);
		}
	}
}
Пример #8
0
bool FilterRule::isMatchDomains(const Url &url)
{
    //String h=url.host().lower();
	std::string h = url.GetHost();
    if(m_domains.empty() && m_inverseDomains.empty()) //not specify which domains;
        return true;
    for(StringVector::iterator it=this->m_domains.begin();it!=m_domains.end();++it) {
        if(boost::iends_with(h,*it))
            return true;
    }
    if(m_inverseDomains.empty()) //no inverse domains,so this filter rule should not apply
        return false;
    for(StringVector::iterator it=this->m_inverseDomains.begin();
    it!=m_inverseDomains.end();++it) {
        if(boost::iends_with(h,*it))
            return false;
    }
    return true;
}
Пример #9
0
bool RuleMap::shouldRedirect(const Url & mainURL,const Url & url, std::string& strRedirect)
{
	StringVector dotsplits;
	this->m_DomainRedirectRules.prepareStartFind();

	boost::split(dotsplits,url.GetHost(),boost::is_any_of("."));
	if (dotsplits.size() >= 1) //domain error? no dot? at least g.cn
	{
		for (int i = dotsplits.size() - 2; i >= 0; i--) 
		{
			std::string domain = dotsplits[i];
			for (int j = i + 1; j < dotsplits.size(); j++) 
			{
				domain = domain + "." + dotsplits[j];
			}
			if ( m_DomainRedirectRules.shouldRedirect(domain,url,strRedirect))
			{
				return true;
			}
		}
	}
	return false;
}