Index: components/url_formatter/idn_spoof_checker.h |
diff --git a/components/url_formatter/idn_spoof_checker.h b/components/url_formatter/idn_spoof_checker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..41eafc637b1ce2847df644f26768fbbfa687b20a |
--- /dev/null |
+++ b/components/url_formatter/idn_spoof_checker.h |
@@ -0,0 +1,63 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_URL_FORMATTER_IDN_SPOOF_CHECKER_H_ |
+#define COMPONENTS_URL_FORMATTER_IDN_SPOOF_CHECKER_H_ |
+ |
+#include <memory> |
+#include <string> |
+ |
+#include "base/strings/string16.h" |
+#include "base/strings/string_piece.h" |
+#include "third_party/icu/source/common/unicode/uniset.h" |
+#include "third_party/icu/source/common/unicode/utypes.h" |
+#include "third_party/icu/source/common/unicode/uversion.h" |
+ |
+// 'icu' does not work. Use U_ICU_NAMESPACE. |
+namespace U_ICU_NAMESPACE { |
+ |
+class UnicodeString; |
+ |
+} // namespace U_ICU_NAMESPACE |
+ |
+struct USpoofChecker; |
+ |
+namespace url_formatter { |
+ |
+// A helper class for IDN Spoof checking, used to ensure that no IDN input is |
+// spoofable per Chromium's standard of spoofability. For a more thorough |
+// explanation of how spoof checking works in Chromium, see |
+// http://dev.chromium.org/developers/design-documents/idn-in-google-chrome . |
+ |
+class IDNSpoofChecker { |
+ public: |
+ IDNSpoofChecker(); |
+ ~IDNSpoofChecker(); |
+ |
+ // Returns true if |label| is safe to display as Unicode. In the event of |
+ // library failure, all IDN inputs will be treated as unsafe. |
+ // See the function body for details on the specific safety checks performed. |
+ bool SafeToDisplayAsUnicode(base::StringPiece16 label, bool is_tld_ascii); |
+ |
+ private: |
+ // Sets allowed characters in IDN labels and turns on USPOOF_CHAR_LIMIT. |
+ void SetAllowedUnicodeSet(UErrorCode* status); |
+ // Returns true if all the Cyrillic letters in |label| belong to a set of |
+ // Cyrillic letters that look like ASCII Latin letters. |
+ bool IsMadeOfLatinAlikeCyrillic(const icu::UnicodeString& label); |
+ |
+ USpoofChecker* checker_; |
+ icu::UnicodeSet deviation_characters_; |
+ icu::UnicodeSet non_ascii_latin_letters_; |
+ icu::UnicodeSet kana_letters_exceptions_; |
+ icu::UnicodeSet cyrillic_letters_; |
+ icu::UnicodeSet cyrillic_letters_latin_alike_; |
+ |
+ IDNSpoofChecker(const IDNSpoofChecker&) = delete; |
+ void operator=(const IDNSpoofChecker&) = delete; |
+}; |
+ |
+} // namespace url_formatter |
+ |
+#endif // COMPONENTS_URL_FORMATTER_IDN_SPOOF_CHECKER_H_ |