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) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace autofill { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardExpirationDate(const base::string16& year, 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& month, 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& now) { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 year_cleaned, month_cleaned; 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(year, base::TRIM_ALL, &year_cleaned); 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TrimWhitespace(month, base::TRIM_ALL, &month_cleaned); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (year_cleaned.length() != 4) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cc_year; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToInt(year_cleaned, &cc_year)) 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int cc_month; 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!base::StringToInt(month_cleaned, &cc_month)) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsValidCreditCardExpirationDate(cc_year, cc_month, now); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool IsValidCreditCardExpirationDate(int year, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int month, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Time& now) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Exploded now_exploded; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now.LocalExplode(&now_exploded); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (year < now_exploded.year) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (year == now_exploded.year && month < now_exploded.month) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardNumber(const base::string16& text) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 number = CreditCard::StripSeparators(text); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Credit card numbers are at most 19 digits in length [1]. 12 digits seems to 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // be a fairly safe lower-bound [2]. Specific card issuers have more rigidly 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // defined sizes. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [1] http://www.merriampark.com/anatomycc.htm 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [2] http://en.wikipedia.org/wiki/Bank_card_number 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string type = CreditCard::GetCreditCardType(text); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kAmericanExpressCard && number.size() != 15) 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kDinersCard && number.size() != 14) 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kDiscoverCard && number.size() != 16) 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kJCBCard && number.size() != 16) 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kMasterCard && number.size() != 16) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (type == kUnionPay && (number.size() < 16 || number.size() > 19)) 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kVisaCard && number.size() != 13 && number.size() != 16) 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == kGenericCard && (number.size() < 12 || number.size() > 19)) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Unlike all the other supported types, UnionPay cards lack Luhn checksum 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // validation. 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (type == kUnionPay) 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use the Luhn formula [3] to validate the number. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // [3] http://en.wikipedia.org/wiki/Luhn_algorithm 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sum = 0; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool odd = false; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::string16::reverse_iterator iter = number.rbegin(); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != number.rend(); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAsciiDigit(*iter)) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int digit = *iter - '0'; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (odd) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) digit *= 2; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sum += digit / 10 + digit % 10; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sum += digit; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) odd = !odd; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (sum % 10) == 0; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardSecurityCode(const base::string16& text) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (text.size() < 3U || text.size() > 4U) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::string16::const_iterator iter = text.begin(); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != text.end(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAsciiDigit(*iter)) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidCreditCardSecurityCode(const base::string16& code, 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& number) { 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string type = CreditCard::GetCreditCardType(number); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t required_length = 3; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type == kAmericanExpressCard) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) required_length = 4; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return code.length() == required_length; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidEmailAddress(const base::string16& text) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // E-Mail pattern as defined by the WhatWG. (4.10.7.1.5 E-Mail state) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 kEmailPattern = base::ASCIIToUTF16( 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@" 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$"); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MatchesPattern(text, kEmailPattern); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidState(const base::string16& text) { 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return !state_names::GetAbbreviationForName(text).empty() || 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !state_names::GetNameForAbbreviation(text).empty(); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsValidZip(const base::string16& text) { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16 kZipPattern = base::ASCIIToUTF16("^\\d{5}(-\\d{4})?$"); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return MatchesPattern(text, kZipPattern); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsSSN(const base::string16& text) { 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 number_string; 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::RemoveChars(text, base::ASCIIToUTF16("- "), &number_string); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A SSN is of the form AAA-GG-SSSS (A = area number, G = group number, S = 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // serial number). The validation we do here is simply checking if the area, 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // group, and serial numbers are valid. 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Historically, the area number was assigned per state, with the group number 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ascending in an alternating even/odd sequence. With that scheme it was 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible to check for validity by referencing a table that had the highest 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // group number assigned for a given area number. (This was something that 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Chromium never did though, because the "high group" values were constantly 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // changing.) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // However, starting on 25 June 2011 the SSA began issuing SSNs randomly from 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // all areas and groups. Group numbers and serial numbers of zero remain 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // invalid, and areas 000, 666, and 900-999 remain invalid. 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // References for current practices: 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/randomization.html 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/randomizationfaqs.html 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // References for historic practices: 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/history/ssn/geocard.html 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/stateweb.htm 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // http://www.socialsecurity.gov/employer/ssnvhighgroup.htm 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (number_string.length() != 9 || !base::IsStringASCII(number_string)) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int area; 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!base::StringToInt(base::StringPiece16(number_string.begin(), 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_string.begin() + 3), 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &area)) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (area < 1 || 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) area == 666 || 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) area >= 900) { 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int group; 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!base::StringToInt(base::StringPiece16(number_string.begin() + 3, 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_string.begin() + 5), 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &group) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) || group == 0) { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int serial; 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!base::StringToInt(base::StringPiece16(number_string.begin() + 5, 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_string.begin() + 9), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &serial) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) || serial == 0) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace autofill 212