shared_ptr<SecurityRange> PersistentSecurityRange::ReadMatchingIP(const IPAddress &ipaddress) { shared_ptr<SecurityRange> empty; IPAddressSQLHelper helper; String sSQL; if (ipaddress.GetType() == IPAddress::IPV4) { shared_ptr<SecurityRange> pSR = shared_ptr<SecurityRange>(new SecurityRange()); sSQL.Format(_T("select * from hm_securityranges where %s >= rangelowerip1 and %s <= rangeupperip1 and rangelowerip2 IS NULL and rangeupperip2 IS NULL order by rangepriorityid desc"), String(helper.GetAddress1String(ipaddress)), String(helper.GetAddress1String(ipaddress))); if (!ReadObject(pSR, SQLCommand(sSQL))) return empty; return pSR; } else { // Read all IPv6 items. shared_ptr<SecurityRange> bestMatch; SQLCommand command(_T("select * from hm_securityranges where rangelowerip2 is not null order by rangepriorityid desc")); shared_ptr<DALRecordset> recordset = Application::Instance()->GetDBManager()->OpenRecordset(command); if (!recordset) return empty; while (!recordset->IsEOF()) { shared_ptr<SecurityRange> securityRange = shared_ptr<SecurityRange>(new SecurityRange()); if (ReadObject(securityRange, recordset) == false) return empty; if (ipaddress.WithinRange(securityRange->GetLowerIP(), securityRange->GetUpperIP())) { // This IP range matches the client. Does it have higher prio than the currently // matching? if (!bestMatch || securityRange->GetPriority() > bestMatch->GetPriority()) bestMatch = securityRange; } recordset->MoveNext(); } return bestMatch; } }
bool WhiteListCache::IsWhitelisted(const String &fromAddress, const IPAddress &address) { // Create a lock for shared operations boost::upgrade_lock< boost::shared_mutex > lock(_whitelistAccessMutex); if (_needRefresh) { // We need exclusive access to be able to upade the cache boost::upgrade_to_unique_lock< boost::shared_mutex > uniqueLock(lock); Refresh(); } vector<shared_ptr<WhiteListAddress> >::iterator iter = _whitelistItems.begin(); vector<shared_ptr<WhiteListAddress> >::iterator iterEnd = _whitelistItems.end(); for (; iter != iterEnd; iter++) { shared_ptr<WhiteListAddress> pWhiteAddress = (*iter); IPAddress iLowerIP = pWhiteAddress->GetLowerIPAddress(); IPAddress iUpperIP = pWhiteAddress->GetUpperIPAddress(); if (address.WithinRange(iLowerIP, iUpperIP)) { String sWhiteEmailAddr = pWhiteAddress->GetEmailAddress(); if (sWhiteEmailAddr.IsEmpty() || sWhiteEmailAddr == _T("*")) { // White listed return true; } // Check if the senders email address matches if (StringParser::WildcardMatchNoCase(sWhiteEmailAddr, fromAddress)) { // White listed return true; } } } return false; }