public static MatchAccuracyMethod GetMatchAccuracyMethod(this PwEntry entry, URLSummary urlsum, DatabaseConfig dbConf) { var conf = entry.GetKPRPCConfig(MatchAccuracyMethod.Domain); MatchAccuracyMethod overridenMethod; if (urlsum.Domain != null && urlsum.Domain.RegistrableDomain != null && dbConf.MatchedURLAccuracyOverrides.TryGetValue(urlsum.Domain.RegistrableDomain, out overridenMethod)) { return(overridenMethod); } else { return(conf.GetMatchAccuracyMethod()); } }
// Must match host name; if allowHostnameOnlyMatch is false, exact URL must be matched private int bestMatchAccuracyForAnyURL(PwEntry pwe, EntryConfig conf, string url, URLSummary urlSummary) { bool requireExactURLMatch = conf.BlockHostnameOnlyMatch; bool requireAtLeastHostnameAndPortURLMatch = conf.BlockDomainOnlyMatch; int bestMatchSoFar = MatchAccuracy.None; List<string> URLs = new List<string>(3); URLs.Add(pwe.Strings.ReadSafe("URL")); if (conf.AltURLs != null) URLs.AddRange(conf.AltURLs); foreach (string entryURL in URLs) { if (entryURL == url) return MatchAccuracy.Best; // If we require very accurate matches, we can skip the more complex assessment below if (requireExactURLMatch) continue; int entryUrlQSStartIndex = entryURL.IndexOf('?'); int urlQSStartIndex = url.IndexOf('?'); string entryUrlExcludingQS = entryURL.Substring(0, entryUrlQSStartIndex > 0 ? entryUrlQSStartIndex : entryURL.Length); string urlExcludingQS = url.Substring(0, urlQSStartIndex > 0 ? urlQSStartIndex : url.Length); if (entryUrlExcludingQS == urlExcludingQS) return MatchAccuracy.Close; // If we've already found a reasonable match, we can skip the rest of the assessment for subsequent URLs // apart from the check for matches against a hostname excluding query string if (bestMatchSoFar >= MatchAccuracy.HostnameAndPort) continue; URLSummary entryUrlSummary = URLSummary.FromURL(entryURL); if (entryUrlSummary.HostnameAndPort == urlSummary.HostnameAndPort) bestMatchSoFar = MatchAccuracy.HostnameAndPort; // If we need at least a matching hostname and port (equivelent to // KeeFox <1.5) or we are missing the information needed to match // more loose components of the URL we have to skip these last tests if (requireAtLeastHostnameAndPortURLMatch || entryUrlSummary.Domain == null || urlSummary.Domain == null) continue; if (bestMatchSoFar < MatchAccuracy.Hostname && entryUrlSummary.Domain.Hostname == urlSummary.Domain.Hostname) bestMatchSoFar = MatchAccuracy.Hostname; if (bestMatchSoFar < MatchAccuracy.Domain && entryUrlSummary.Domain.RegistrableDomain == urlSummary.Domain.RegistrableDomain) bestMatchSoFar = MatchAccuracy.Domain; } return bestMatchSoFar; }