1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/validation.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_regexes.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/state_names.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::StringPiece16; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The separator characters for SSNs. 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char16 kSSNSeparators[] = {' ', '-', 0}; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardExpirationDate(const base::string16& year, 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& month, 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& now) { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 year_cleaned, month_cleaned; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(year, TRIM_ALL, &year_cleaned); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrimWhitespace(month, TRIM_ALL, &month_cleaned); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (year_cleaned.length() != 4) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cc_year; 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToInt(year_cleaned, &cc_year)) 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cc_month; 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToInt(month_cleaned, &cc_month)) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsValidCreditCardExpirationDate(cc_year, cc_month, now); 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsValidCreditCardExpirationDate(int year, 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int month, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Time& now) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Exploded now_exploded; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now.LocalExplode(&now_exploded); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (year < now_exploded.year) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (year == now_exploded.year && month < now_exploded.month) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardNumber(const base::string16& text) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 number = CreditCard::StripSeparators(text); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Credit card numbers are at most 19 digits in length [1]. 12 digits seems to 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // be a fairly safe lower-bound [2]. Specific card issuers have more rigidly 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // defined sizes. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [1] http://www.merriampark.com/anatomycc.htm 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [2] http://en.wikipedia.org/wiki/Bank_card_number 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string type = CreditCard::GetCreditCardType(text); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kAmericanExpressCard && number.size() != 15) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kDinersCard && number.size() != 14) 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kDiscoverCard && number.size() != 16) 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kJCBCard && number.size() != 16) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kMasterCard && number.size() != 16) 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (type == kUnionPay && (number.size() < 16 || number.size() > 19)) 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kVisaCard && number.size() != 13 && number.size() != 16) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kGenericCard && (number.size() < 12 || number.size() > 19)) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Unlike all the other supported types, UnionPay cards lack Luhn checksum 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // validation. 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (type == kUnionPay) 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use the Luhn formula [3] to validate the number. 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [3] http://en.wikipedia.org/wiki/Luhn_algorithm 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sum = 0; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool odd = false; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::string16::reverse_iterator iter = number.rbegin(); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != number.rend(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAsciiDigit(*iter)) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int digit = *iter - '0'; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (odd) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) digit *= 2; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sum += digit / 10 + digit % 10; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sum += digit; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) odd = !odd; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (sum % 10) == 0; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardSecurityCode(const base::string16& text) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text.size() < 3U || text.size() > 4U) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::string16::const_iterator iter = text.begin(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != text.end(); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAsciiDigit(*iter)) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardSecurityCode(const base::string16& code, 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& number) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreditCard card; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) card.SetRawInfo(CREDIT_CARD_NUMBER, number); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t required_length = 3; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (card.type() == kAmericanExpressCard) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) required_length = 4; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return code.length() == required_length; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidEmailAddress(const base::string16& text) { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // E-Mail pattern as defined by the WhatWG. (4.10.7.1.5 E-Mail state) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16 kEmailPattern = ASCIIToUTF16( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@" 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$"); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MatchesPattern(text, kEmailPattern); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidState(const base::string16& text) { 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !state_names::GetAbbreviationForName(text).empty() || 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !state_names::GetNameForAbbreviation(text).empty(); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidZip(const base::string16& text) { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16 kZipPattern = ASCIIToUTF16("^\\d{5}(-\\d{4})?$"); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return MatchesPattern(text, kZipPattern); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsSSN(const base::string16& text) { 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 number_string; 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::RemoveChars(text, kSSNSeparators, &number_string); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A SSN is of the form AAA-GG-SSSS (A = area number, G = group number, S = 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // serial number). The validation we do here is simply checking if the area, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // group, and serial numbers are valid. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Historically, the area number was assigned per state, with the group number 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ascending in an alternating even/odd sequence. With that scheme it was 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible to check for validity by referencing a table that had the highest 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // group number assigned for a given area number. (This was something that 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Chromium never did though, because the "high group" values were constantly 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // changing.) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // However, starting on 25 June 2011 the SSA began issuing SSNs randomly from 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // all areas and groups. Group numbers and serial numbers of zero remain 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invalid, and areas 000, 666, and 900-999 remain invalid. 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // References for current practices: 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/randomization.html 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/randomizationfaqs.html 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // References for historic practices: 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/history/ssn/geocard.html 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/stateweb.htm 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/ssnvhighgroup.htm 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (number_string.length() != 9 || !IsStringASCII(number_string)) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int area; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!base::StringToInt(StringPiece16(number_string.begin(), 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) number_string.begin() + 3), 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &area)) { 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (area < 1 || 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) area == 666 || 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) area >= 900) { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int group; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!base::StringToInt(StringPiece16(number_string.begin() + 3, 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) number_string.begin() + 5), 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &group) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) || group == 0) { 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int serial; 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!base::StringToInt(StringPiece16(number_string.begin() + 5, 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) number_string.begin() + 9), 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &serial) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) || serial == 0) { 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 221