1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#import "config.h" 27#import "PublicSuffix.h" 28 29#import "WebCoreSystemInterface.h" 30#import "WebCoreNSURLExtras.h" 31#import <wtf/RetainPtr.h> 32 33#if ENABLE(PUBLIC_SUFFIX_LIST) 34 35@interface NSString (WebCoreNSURLExtras) 36- (BOOL)_web_looksLikeIPAddress; 37@end 38 39namespace WebCore { 40 41bool isPublicSuffix(const String& domain) 42{ 43 return wkIsPublicSuffix(decodeHostName(domain)); 44} 45 46String topPrivatelyControlledDomain(const String& domain) 47{ 48 if (domain.isNull() || domain.isEmpty()) 49 return String(); 50 51 NSString *host = decodeHostName(domain); 52 53 if ([host _web_looksLikeIPAddress]) 54 return domain; 55 56 // Match the longest possible suffix. 57 bool hasTopLevelDomain = false; 58 NSCharacterSet *dot = [[NSCharacterSet characterSetWithCharactersInString:@"."] retain]; 59 NSRange nextDot = NSMakeRange(0, [host length]); 60 for (NSRange previousDot = [host rangeOfCharacterFromSet:dot]; previousDot.location != NSNotFound; nextDot = previousDot, previousDot = [host rangeOfCharacterFromSet:dot options:0 range:NSMakeRange(previousDot.location + previousDot.length, [host length] - (previousDot.location + previousDot.length))]) { 61 NSString *substring = [host substringFromIndex:previousDot.location + previousDot.length]; 62 if (wkIsPublicSuffix(substring)) { 63 hasTopLevelDomain = true; 64 break; 65 } 66 } 67 68 [dot release]; 69 if (!hasTopLevelDomain) 70 return String(); 71 72 if (!nextDot.location) 73 return domain; 74 75 return encodeHostName([host substringFromIndex:nextDot.location + nextDot.length]); 76} 77 78} 79 80#endif 81