diff --git a/src/services/autofill.service.ts b/src/services/autofill.service.ts index 32f820bd06..b9642ebdef 100644 --- a/src/services/autofill.service.ts +++ b/src/services/autofill.service.ts @@ -21,116 +21,7 @@ import AutofillScript from '../models/autofillScript'; import { BrowserApi } from '../browser/browserApi'; -const CardAttributes: string[] = ['autoCompleteType', 'data-stripe', 'htmlName', 'htmlID', 'label-tag', - 'placeholder', 'label-left', 'label-top', 'data-recurly']; - -const CardAttributesExtended: string[] = [...CardAttributes, 'label-right']; - -const IdentityAttributes: string[] = ['autoCompleteType', 'data-stripe', 'htmlName', 'htmlID', 'label-tag', - 'placeholder', 'label-left', 'label-top', 'data-recurly']; - -const UsernameFieldNames: string[] = [ - // English - 'username', 'user name', 'email', 'email address', 'e-mail', 'e-mail address', 'userid', 'user id', - 'customer id', 'login id', - // German - 'benutzername', 'benutzer name', 'email adresse', 'e-mail adresse', 'benutzerid', 'benutzer id']; - -const FirstnameFieldNames: string[] = [ - // English - 'f-name', 'first-name', 'given-name', 'first-n', - // German - 'vorname', -]; - -const LastnameFieldNames: string[] = [ - // English - 'l-name', 'last-name', 's-name', 'surname', 'family-name', 'family-n', 'last-n', - // German - 'nachname', 'familienname', -]; - -const ExcludedAutofillTypes: string[] = ['radio', 'checkbox', 'hidden', 'file', 'button', 'image', 'reset', 'search']; - -// Each index represents a language. These three arrays should all be the same length. -// 0: English, 1: Danish, 2: German/Dutch, 3: French/Spanish/Italian, 4: Russian, 5: Portuguese -const MonthAbbr = ['mm', 'mm', 'mm', 'mm', 'mm', 'mm']; -const YearAbbrShort = ['yy', 'åå', 'jj', 'aa', 'гг', 'rr']; -const YearAbbrLong = ['yyyy', 'åååå', 'jjjj', 'aa', 'гггг', 'rrrr']; - -const OperationDelays = new Map([ - ['buzzsprout.com', 100], -]); - -/* tslint:disable */ -const IsoCountries: { [id: string]: string; } = { - afghanistan: "AF", "aland islands": "AX", albania: "AL", algeria: "DZ", "american samoa": "AS", andorra: "AD", - angola: "AO", anguilla: "AI", antarctica: "AQ", "antigua and barbuda": "AG", argentina: "AR", armenia: "AM", - aruba: "AW", australia: "AU", austria: "AT", azerbaijan: "AZ", bahamas: "BS", bahrain: "BH", bangladesh: "BD", - barbados: "BB", belarus: "BY", belgium: "BE", belize: "BZ", benin: "BJ", bermuda: "BM", bhutan: "BT", - bolivia: "BO", "bosnia and herzegovina": "BA", botswana: "BW", "bouvet island": "BV", brazil: "BR", - "british indian ocean territory": "IO", "brunei darussalam": "BN", bulgaria: "BG", "burkina faso": "BF", - burundi: "BI", cambodia: "KH", cameroon: "CM", canada: "CA", "cape verde": "CV", "cayman islands": "KY", - "central african republic": "CF", chad: "TD", chile: "CL", china: "CN", "christmas island": "CX", - "cocos (keeling) islands": "CC", colombia: "CO", comoros: "KM", congo: "CG", "congo, democratic republic": "CD", - "cook islands": "CK", "costa rica": "CR", "cote d'ivoire": "CI", croatia: "HR", cuba: "CU", cyprus: "CY", - "czech republic": "CZ", denmark: "DK", djibouti: "DJ", dominica: "DM", "dominican republic": "DO", ecuador: "EC", - egypt: "EG", "el salvador": "SV", "equatorial guinea": "GQ", eritrea: "ER", estonia: "EE", ethiopia: "ET", - "falkland islands": "FK", "faroe islands": "FO", fiji: "FJ", finland: "FI", france: "FR", "french guiana": "GF", - "french polynesia": "PF", "french southern territories": "TF", gabon: "GA", gambia: "GM", georgia: "GE", - germany: "DE", ghana: "GH", gibraltar: "GI", greece: "GR", greenland: "GL", grenada: "GD", guadeloupe: "GP", - guam: "GU", guatemala: "GT", guernsey: "GG", guinea: "GN", "guinea-bissau": "GW", guyana: "GY", haiti: "HT", - "heard island & mcdonald islands": "HM", "holy see (vatican city state)": "VA", honduras: "HN", "hong kong": "HK", - hungary: "HU", iceland: "IS", india: "IN", indonesia: "ID", "iran, islamic republic of": "IR", iraq: "IQ", - ireland: "IE", "isle of man": "IM", israel: "IL", italy: "IT", jamaica: "JM", japan: "JP", jersey: "JE", - jordan: "JO", kazakhstan: "KZ", kenya: "KE", kiribati: "KI", "republic of korea": "KR", "south korea": "KR", - "democratic people's republic of korea": "KP", "north korea": "KP", kuwait: "KW", kyrgyzstan: "KG", - "lao people's democratic republic": "LA", latvia: "LV", lebanon: "LB", lesotho: "LS", liberia: "LR", - "libyan arab jamahiriya": "LY", liechtenstein: "LI", lithuania: "LT", luxembourg: "LU", macao: "MO", - macedonia: "MK", madagascar: "MG", malawi: "MW", malaysia: "MY", maldives: "MV", mali: "ML", malta: "MT", - "marshall islands": "MH", martinique: "MQ", mauritania: "MR", mauritius: "MU", mayotte: "YT", mexico: "MX", - "micronesia, federated states of": "FM", moldova: "MD", monaco: "MC", mongolia: "MN", montenegro: "ME", - montserrat: "MS", morocco: "MA", mozambique: "MZ", myanmar: "MM", namibia: "NA", nauru: "NR", nepal: "NP", - netherlands: "NL", "netherlands antilles": "AN", "new caledonia": "NC", "new zealand": "NZ", nicaragua: "NI", - niger: "NE", nigeria: "NG", niue: "NU", "norfolk island": "NF", "northern mariana islands": "MP", norway: "NO", - oman: "OM", pakistan: "PK", palau: "PW", "palestinian territory, occupied": "PS", panama: "PA", - "papua new guinea": "PG", paraguay: "PY", peru: "PE", philippines: "PH", pitcairn: "PN", poland: "PL", - portugal: "PT", "puerto rico": "PR", qatar: "QA", reunion: "RE", romania: "RO", "russian federation": "RU", - rwanda: "RW", "saint barthelemy": "BL", "saint helena": "SH", "saint kitts and nevis": "KN", "saint lucia": "LC", - "saint martin": "MF", "saint pierre and miquelon": "PM", "saint vincent and grenadines": "VC", samoa: "WS", - "san marino": "SM", "sao tome and principe": "ST", "saudi arabia": "SA", senegal: "SN", serbia: "RS", - seychelles: "SC", "sierra leone": "SL", singapore: "SG", slovakia: "SK", slovenia: "SI", "solomon islands": "SB", - somalia: "SO", "south africa": "ZA", "south georgia and sandwich isl.": "GS", spain: "ES", "sri lanka": "LK", - sudan: "SD", suriname: "SR", "svalbard and jan mayen": "SJ", swaziland: "SZ", sweden: "SE", switzerland: "CH", - "syrian arab republic": "SY", taiwan: "TW", tajikistan: "TJ", tanzania: "TZ", thailand: "TH", "timor-leste": "TL", - togo: "TG", tokelau: "TK", tonga: "TO", "trinidad and tobago": "TT", tunisia: "TN", turkey: "TR", - turkmenistan: "TM", "turks and caicos islands": "TC", tuvalu: "TV", uganda: "UG", ukraine: "UA", - "united arab emirates": "AE", "united kingdom": "GB", "united states": "US", - "united states outlying islands": "UM", uruguay: "UY", uzbekistan: "UZ", vanuatu: "VU", venezuela: "VE", - vietnam: "VN", "virgin islands, british": "VG", "virgin islands, u.s.": "VI", "wallis and futuna": "WF", - "western sahara": "EH", yemen: "YE", zambia: "ZM", zimbabwe: "ZW", -}; - -const IsoStates: { [id: string]: string; } = { - alabama: 'AL', alaska: 'AK', 'american samoa': 'AS', arizona: 'AZ', arkansas: 'AR', california: 'CA', - colorado: 'CO', connecticut: 'CT', delaware: 'DE', 'district of columbia': 'DC', - 'federated states of micronesia': 'FM', florida: 'FL', georgia: 'GA', guam: 'GU', hawaii: 'HI', idaho: 'ID', - illinois: 'IL', indiana: 'IN', iowa: 'IA', kansas: 'KS', kentucky: 'KY', louisiana: 'LA', maine: 'ME', - 'marshall islands': 'MH', maryland: 'MD', massachusetts: 'MA', michigan: 'MI', minnesota: 'MN', mississippi: 'MS', - missouri: 'MO', montana: 'MT', nebraska: 'NE', nevada: 'NV', 'new hampshire': 'NH', 'new jersey': 'NJ', - 'new mexico': 'NM', 'new york': 'NY', 'north carolina': 'NC', 'north dakota': 'ND', - 'northern mariana islands': 'MP', ohio: 'OH', oklahoma: 'OK', oregon: 'OR', palau: 'PW', pennsylvania: 'PA', - 'puerto rico': 'PR', 'rhode island': 'RI', 'south carolina': 'SC', 'south dakota': 'SD', tennessee: 'TN', - texas: 'TX', utah: 'UT', vermont: 'VT', 'virgin islands': 'VI', virginia: 'VA', washington: 'WA', - 'west virginia': 'WV', wisconsin: 'WI', wyoming: 'WY', -}; - -var IsoProvinces: { [id: string]: string; } = { - alberta: 'AB', 'british columbia': 'BC', manitoba: 'MB', 'new brunswick': 'NB', 'newfoundland and labrador': 'NL', - 'nova scotia': 'NS', ontario: 'ON', 'prince edward island': 'PE', quebec: 'QC', saskatchewan: 'SK', -}; -// /* tslint:enable */ - +import { AutoFillConstants, CreditCardAutoFillConstants, IdentityAutoFillConstants } from './autofillConstants'; export default class AutofillService implements AutofillServiceInterface { constructor(private cipherService: CipherService, private userService: UserService, @@ -437,7 +328,7 @@ export default class AutofillService implements AutofillServiceInterface { // No password fields on this page. Let's try to just fuzzy fill the username. pageDetails.fields.forEach((f: any) => { if (f.viewable && (f.type === 'text' || f.type === 'email' || f.type === 'tel') && - this.fieldIsFuzzyMatch(f, UsernameFieldNames)) { + this.fieldIsFuzzyMatch(f, AutoFillConstants.UsernameFieldNames)) { usernames.push(f); } }); @@ -478,12 +369,12 @@ export default class AutofillService implements AutofillServiceInterface { return; } - if (this.isExcludedType(f.type, ExcludedAutofillTypes)) { + if (this.isExcludedType(f.type, AutoFillConstants.ExcludedAutofillTypes)) { return; } - for (let i = 0; i < CardAttributes.length; i++) { - const attr = CardAttributes[i]; + for (let i = 0; i < CreditCardAutoFillConstants.CardAttributes.length; i++) { + const attr = CreditCardAutoFillConstants.CardAttributes[i]; if (!f.hasOwnProperty(attr) || !f[attr] || !f.viewable) { continue; } @@ -491,56 +382,34 @@ export default class AutofillService implements AutofillServiceInterface { // ref https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill // ref https://developers.google.com/web/fundamentals/design-and-ux/input/forms/ if (!fillFields.cardholderName && this.isFieldMatch(f[attr], - ['cc-name', 'card-name', 'cardholder-name', 'cardholder', 'name', 'nom'], - ['cc-name', 'card-name', 'cardholder-name', 'cardholder', 'tbName'])) { + CreditCardAutoFillConstants.CardHolderFieldNames, + CreditCardAutoFillConstants.CardHolderFieldNameValues)) { fillFields.cardholderName = f; break; } else if (!fillFields.number && this.isFieldMatch(f[attr], - ['cc-number', 'cc-num', 'card-number', 'card-num', 'number', 'cc', 'cc-no', 'card-no', - 'credit-card', 'numero-carte', 'carte', 'carte-credit', 'num-carte', 'cb-num'], - ['cc-number', 'cc-num', 'card-number', 'card-num', 'cc-no', 'card-no', 'numero-carte', - 'num-carte', 'cb-num'])) { + CreditCardAutoFillConstants.CardNumberFieldNames, + CreditCardAutoFillConstants.CardNumberFieldNameValues)) { fillFields.number = f; break; } else if (!fillFields.exp && this.isFieldMatch(f[attr], - ['cc-exp', 'card-exp', 'cc-expiration', 'card-expiration', 'cc-ex', 'card-ex', - 'card-expire', 'card-expiry', 'validite', 'expiration', 'expiry', 'mm-yy', - 'mm-yyyy', 'yy-mm', 'yyyy-mm', 'expiration-date', 'payment-card-expiration', - 'payment-cc-date'], - ['mm-yy', 'mm-yyyy', 'yy-mm', 'yyyy-mm', 'expiration-date', - 'payment-card-expiration'])) { + CreditCardAutoFillConstants.CardExpiryFieldNames, + CreditCardAutoFillConstants.CardExpiryFieldNameValues)) { fillFields.exp = f; break; } else if (!fillFields.expMonth && this.isFieldMatch(f[attr], - ['exp-month', 'cc-exp-month', 'cc-month', 'card-month', 'cc-mo', 'card-mo', 'exp-mo', - 'card-exp-mo', 'cc-exp-mo', 'card-expiration-month', 'expiration-month', - 'cc-mm', 'cc-m', 'card-mm', 'card-m', 'card-exp-mm', 'cc-exp-mm', 'exp-mm', 'exp-m', - 'expire-month', 'expire-mo', 'expiry-month', 'expiry-mo', 'card-expire-month', - 'card-expire-mo', 'card-expiry-month', 'card-expiry-mo', 'mois-validite', - 'mois-expiration', 'm-validite', 'm-expiration', 'expiry-date-field-month', - 'expiration-date-month', 'expiration-date-mm', 'exp-mon', 'validity-mo', - 'exp-date-mo', 'cb-date-mois', 'date-m'])) { + CreditCardAutoFillConstants.ExpiryMonthFieldNames)) { fillFields.expMonth = f; break; } else if (!fillFields.expYear && this.isFieldMatch(f[attr], - ['exp-year', 'cc-exp-year', 'cc-year', 'card-year', 'cc-yr', 'card-yr', 'exp-yr', - 'card-exp-yr', 'cc-exp-yr', 'card-expiration-year', 'expiration-year', - 'cc-yy', 'cc-y', 'card-yy', 'card-y', 'card-exp-yy', 'cc-exp-yy', 'exp-yy', 'exp-y', - 'cc-yyyy', 'card-yyyy', 'card-exp-yyyy', 'cc-exp-yyyy', 'expire-year', 'expire-yr', - 'expiry-year', 'expiry-yr', 'card-expire-year', 'card-expire-yr', 'card-expiry-year', - 'card-expiry-yr', 'an-validite', 'an-expiration', 'annee-validite', - 'annee-expiration', 'expiry-date-field-year', 'expiration-date-year', 'cb-date-ann', - 'expiration-date-yy', 'expiration-date-yyyy', 'validity-year', 'exp-date-year', 'date-y'])) { + CreditCardAutoFillConstants.ExpiryYearFieldNames)) { fillFields.expYear = f; break; } else if (!fillFields.code && this.isFieldMatch(f[attr], - ['cvv', 'cvc', 'cvv2', 'cc-csc', 'cc-cvv', 'card-csc', 'card-cvv', 'cvd', 'cid', 'cvc2', - 'cnv', 'cvn2', 'cc-code', 'card-code', 'code-securite', 'security-code', 'crypto', - 'card-verif', 'verification-code', 'csc', 'ccv'])) { + CreditCardAutoFillConstants.CVVFieldNames)) { fillFields.code = f; break; } else if (!fillFields.brand && this.isFieldMatch(f[attr], - ['cc-type', 'card-type', 'card-brand', 'cc-brand', 'cb-type'])) { + CreditCardAutoFillConstants.CardBrandFieldNames)) { fillFields.brand = f; break; } @@ -634,36 +503,36 @@ export default class AutofillService implements AutofillServiceInterface { } let exp: string = null; - for (let i = 0; i < MonthAbbr.length; i++) { - if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '/' + YearAbbrShort[i]) && + for (let i = 0; i < CreditCardAutoFillConstants.MonthAbbr.length; i++) { + if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + '/' + CreditCardAutoFillConstants.YearAbbrShort[i]) && partYear != null) { exp = fullMonth + '/' + partYear; - } else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '/' + YearAbbrLong[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + '/' + CreditCardAutoFillConstants.YearAbbrLong[i])) { exp = fullMonth + '/' + fullYear; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + '/' + MonthAbbr[i]) && + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrShort[i] + '/' + CreditCardAutoFillConstants.MonthAbbr[i]) && partYear != null) { exp = partYear + '/' + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + '/' + MonthAbbr[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrLong[i] + '/' + CreditCardAutoFillConstants.MonthAbbr[i])) { exp = fullYear + '/' + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '-' + YearAbbrShort[i]) && + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + '-' + CreditCardAutoFillConstants.YearAbbrShort[i]) && partYear != null) { exp = fullMonth + '-' + partYear; - } else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + '-' + YearAbbrLong[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + '-' + CreditCardAutoFillConstants.YearAbbrLong[i])) { exp = fullMonth + '-' + fullYear; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + '-' + MonthAbbr[i]) && + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrShort[i] + '-' + CreditCardAutoFillConstants.MonthAbbr[i]) && partYear != null) { exp = partYear + '-' + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + '-' + MonthAbbr[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrLong[i] + '-' + CreditCardAutoFillConstants.MonthAbbr[i])) { exp = fullYear + '-' + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrShort[i] + MonthAbbr[i]) && + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrShort[i] + CreditCardAutoFillConstants.MonthAbbr[i]) && partYear != null) { exp = partYear + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, YearAbbrLong[i] + MonthAbbr[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i])) { exp = fullYear + fullMonth; - } else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + YearAbbrShort[i]) && + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrShort[i]) && partYear != null) { exp = fullMonth + partYear; - } else if (this.fieldAttrsContain(fillFields.exp, MonthAbbr[i] + YearAbbrLong[i])) { + } else if (this.fieldAttrsContain(fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrLong[i])) { exp = fullMonth + fullYear; } @@ -688,7 +557,7 @@ export default class AutofillService implements AutofillServiceInterface { } let doesContain = false; - CardAttributesExtended.forEach(attr => { + CreditCardAutoFillConstants.CardAttributesExtended.forEach(attr => { if (doesContain || !field.hasOwnProperty(attr) || !field[attr]) { return; } @@ -714,12 +583,12 @@ export default class AutofillService implements AutofillServiceInterface { return; } - if (this.isExcludedType(f.type, ExcludedAutofillTypes)) { + if (this.isExcludedType(f.type, AutoFillConstants.ExcludedAutofillTypes)) { return; } - for (let i = 0; i < IdentityAttributes.length; i++) { - const attr = IdentityAttributes[i]; + for (let i = 0; i < IdentityAutoFillConstants.IdentityAttributes.length; i++) { + const attr = IdentityAutoFillConstants.IdentityAttributes[i]; if (!f.hasOwnProperty(attr) || !f[attr] || !f.viewable) { continue; } @@ -727,75 +596,71 @@ export default class AutofillService implements AutofillServiceInterface { // ref https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill // ref https://developers.google.com/web/fundamentals/design-and-ux/input/forms/ if (!fillFields.name && this.isFieldMatch(f[attr], - ['name', 'full-name', 'your-name'], ['full-name', 'your-name'])) { + IdentityAutoFillConstants.FullNameFieldNames, IdentityAutoFillConstants.FullNameFieldNameValues)) { fillFields.name = f; break; } else if (!fillFields.firstName && this.isFieldMatch(f[attr], - FirstnameFieldNames)) { + IdentityAutoFillConstants.FirstnameFieldNames)) { fillFields.firstName = f; break; } else if (!fillFields.middleName && this.isFieldMatch(f[attr], - ['m-name', 'middle-name', 'additional-name', 'middle-initial', 'middle-n', 'middle-i'])) { + IdentityAutoFillConstants.MiddlenameFieldNames)) { fillFields.middleName = f; break; } else if (!fillFields.lastName && this.isFieldMatch(f[attr], - LastnameFieldNames)) { + IdentityAutoFillConstants.LastnameFieldNames)) { fillFields.lastName = f; break; } else if (!fillFields.title && this.isFieldMatch(f[attr], - ['honorific-prefix', 'prefix', 'title'])) { + IdentityAutoFillConstants.TitleFieldNames)) { fillFields.title = f; break; } else if (!fillFields.email && this.isFieldMatch(f[attr], - ['e-mail', 'email-address'])) { + IdentityAutoFillConstants.EmailFieldNames)) { fillFields.email = f; break; } else if (!fillFields.address && this.isFieldMatch(f[attr], - ['address', 'street-address', 'addr', 'street', 'mailing-addr', 'billing-addr', - 'mail-addr', 'bill-addr'], ['mailing-addr', 'billing-addr', 'mail-addr', 'bill-addr'])) { + IdentityAutoFillConstants.AddressFieldNames, IdentityAutoFillConstants.AddressFieldNameValues)) { fillFields.address = f; break; } else if (!fillFields.address1 && this.isFieldMatch(f[attr], - ['address-1', 'address-line-1', 'addr-1', 'street-1'])) { + IdentityAutoFillConstants.Address1FieldNames)) { fillFields.address1 = f; break; } else if (!fillFields.address2 && this.isFieldMatch(f[attr], - ['address-2', 'address-line-2', 'addr-2', 'street-2'])) { + IdentityAutoFillConstants.Address2FieldNames)) { fillFields.address2 = f; break; } else if (!fillFields.address3 && this.isFieldMatch(f[attr], - ['address-3', 'address-line-3', 'addr-3', 'street-3'])) { + IdentityAutoFillConstants.Address3FieldNames)) { fillFields.address3 = f; break; } else if (!fillFields.postalCode && this.isFieldMatch(f[attr], - ['postal', 'zip', 'zip2', 'zip-code', 'postal-code', 'post-code', 'address-zip', - 'address-postal', 'address-code', 'address-postal-code', 'address-zip-code'])) { + IdentityAutoFillConstants.PostalCodeFieldNames)) { fillFields.postalCode = f; break; } else if (!fillFields.city && this.isFieldMatch(f[attr], - ['city', 'town', 'address-level-2', 'address-city', 'address-town'])) { + IdentityAutoFillConstants.CityFieldNames)) { fillFields.city = f; break; } else if (!fillFields.state && this.isFieldMatch(f[attr], - ['state', 'province', 'provence', 'address-level-1', 'address-state', - 'address-province'])) { + IdentityAutoFillConstants.StateFieldNames)) { fillFields.state = f; break; } else if (!fillFields.country && this.isFieldMatch(f[attr], - ['country', 'country-code', 'country-name', 'address-country', 'address-country-name', - 'address-country-code'])) { + IdentityAutoFillConstants.CountryFieldNames)) { fillFields.country = f; break; } else if (!fillFields.phone && this.isFieldMatch(f[attr], - ['phone', 'mobile', 'mobile-phone', 'tel', 'telephone', 'phone-number'])) { + IdentityAutoFillConstants.PhoneFieldNames)) { fillFields.phone = f; break; } else if (!fillFields.username && this.isFieldMatch(f[attr], - ['user-name', 'user-id', 'screen-name'])) { + IdentityAutoFillConstants.UserNameFieldNames)) { fillFields.username = f; break; } else if (!fillFields.company && this.isFieldMatch(f[attr], - ['company', 'company-name', 'organization', 'organization-name'])) { + IdentityAutoFillConstants.CompanyFieldNames)) { fillFields.company = f; break; } @@ -820,7 +685,7 @@ export default class AutofillService implements AutofillServiceInterface { let filledState = false; if (fillFields.state && identity.state && identity.state.length > 2) { const stateLower = identity.state.toLowerCase(); - const isoState = IsoStates[stateLower] || IsoProvinces[stateLower]; + const isoState = IdentityAutoFillConstants.IsoStates[stateLower] || IdentityAutoFillConstants.IsoProvinces[stateLower]; if (isoState) { filledState = true; this.makeScriptActionWithValue(fillScript, isoState, fillFields.state, filledFields); @@ -834,7 +699,7 @@ export default class AutofillService implements AutofillServiceInterface { let filledCountry = false; if (fillFields.country && identity.country && identity.country.length > 2) { const countryLower = identity.country.toLowerCase(); - const isoCountry = IsoCountries[countryLower]; + const isoCountry = IdentityAutoFillConstants.IsoCountries[countryLower]; if (isoCountry) { filledCountry = true; this.makeScriptActionWithValue(fillScript, isoCountry, fillFields.country, filledFields); @@ -967,8 +832,7 @@ export default class AutofillService implements AutofillServiceInterface { return false; } - const ignoreList = ['onetimepassword', 'captcha', 'findanything', 'forgot']; - if (ignoreList.some(i => cleanedValue.indexOf(i) > -1)) { + if (AutoFillConstants.PasswordFieldIgnoreList.some(i => cleanedValue.indexOf(i) > -1)) { return false; } @@ -1016,7 +880,7 @@ export default class AutofillService implements AutofillServiceInterface { (f.type === 'text' || f.type === 'email' || f.type === 'tel')) { usernameField = f; - if (this.findMatchingFieldIndex(f, UsernameFieldNames) > -1) { + if (this.findMatchingFieldIndex(f, AutoFillConstants.UsernameFieldNames) > -1) { // We found an exact match. No need to keep looking. break; } diff --git a/src/services/autofillConstants.ts b/src/services/autofillConstants.ts new file mode 100644 index 0000000000..94b54a7150 --- /dev/null +++ b/src/services/autofillConstants.ts @@ -0,0 +1,739 @@ +export class AutoFillConstants { + static readonly UsernameFieldNames: string[] = [ + // English + "username", + "user name", + "email", + "email address", + "e-mail", + "e-mail address", + "userid", + "user id", + "customer id", + "login id", + // German + "benutzername", + "benutzer name", + "email adresse", + "e-mail adresse", + "benutzerid", + "benutzer id", + ]; + + static readonly PasswordFieldIgnoreList: string[] = [ + "onetimepassword", + "captcha", + "findanything", + "forgot", + ]; + + static readonly ExcludedAutofillTypes: string[] = [ + "radio", + "checkbox", + "hidden", + "file", + "button", + "image", + "reset", + "search", + ]; +} + +export class CreditCardAutoFillConstants { + static readonly CardAttributes: string[] = [ + "autoCompleteType", + "data-stripe", + "htmlName", + "htmlID", + "label-tag", + "placeholder", + "label-left", + "label-top", + "data-recurly", + ]; + + static readonly CardAttributesExtended: string[] = [ + ...CreditCardAutoFillConstants.CardAttributes, + "label-right", + ]; + + static readonly CardHolderFieldNames: string[] = [ + "cc-name", + "card-name", + "cardholder-name", + "cardholder", + "name", + "nom", + ]; + + static readonly CardHolderFieldNameValues: string[] = [ + "cc-name", + "card-name", + "cardholder-name", + "cardholder", + "tbName", + ]; + + static readonly CardNumberFieldNames: string[] = [ + "cc-number", + "cc-num", + "card-number", + "card-num", + "number", + "cc", + "cc-no", + "card-no", + "credit-card", + "numero-carte", + "carte", + "carte-credit", + "num-carte", + "cb-num", + ]; + + static readonly CardNumberFieldNameValues: string[] = [ + "cc-number", + "cc-num", + "card-number", + "card-num", + "cc-no", + "card-no", + "numero-carte", + "num-carte", + "cb-num", + ]; + + static readonly CardExpiryFieldNames: string[] = [ + "cc-exp", + "card-exp", + "cc-expiration", + "card-expiration", + "cc-ex", + "card-ex", + "card-expire", + "card-expiry", + "validite", + "expiration", + "expiry", + "mm-yy", + "mm-yyyy", + "yy-mm", + "yyyy-mm", + "expiration-date", + "payment-card-expiration", + "payment-cc-date", + ]; + + static readonly CardExpiryFieldNameValues: string[] = [ + "mm-yy", + "mm-yyyy", + "yy-mm", + "yyyy-mm", + "expiration-date", + "payment-card-expiration", + ]; + + static readonly ExpiryMonthFieldNames: string[] = [ + "exp-month", + "cc-exp-month", + "cc-month", + "card-month", + "cc-mo", + "card-mo", + "exp-mo", + "card-exp-mo", + "cc-exp-mo", + "card-expiration-month", + "expiration-month", + "cc-mm", + "cc-m", + "card-mm", + "card-m", + "card-exp-mm", + "cc-exp-mm", + "exp-mm", + "exp-m", + "expire-month", + "expire-mo", + "expiry-month", + "expiry-mo", + "card-expire-month", + "card-expire-mo", + "card-expiry-month", + "card-expiry-mo", + "mois-validite", + "mois-expiration", + "m-validite", + "m-expiration", + "expiry-date-field-month", + "expiration-date-month", + "expiration-date-mm", + "exp-mon", + "validity-mo", + "exp-date-mo", + "cb-date-mois", + "date-m", + ]; + + static readonly ExpiryYearFieldNames: string[] = [ + "exp-year", + "cc-exp-year", + "cc-year", + "card-year", + "cc-yr", + "card-yr", + "exp-yr", + "card-exp-yr", + "cc-exp-yr", + "card-expiration-year", + "expiration-year", + "cc-yy", + "cc-y", + "card-yy", + "card-y", + "card-exp-yy", + "cc-exp-yy", + "exp-yy", + "exp-y", + "cc-yyyy", + "card-yyyy", + "card-exp-yyyy", + "cc-exp-yyyy", + "expire-year", + "expire-yr", + "expiry-year", + "expiry-yr", + "card-expire-year", + "card-expire-yr", + "card-expiry-year", + "card-expiry-yr", + "an-validite", + "an-expiration", + "annee-validite", + "annee-expiration", + "expiry-date-field-year", + "expiration-date-year", + "cb-date-ann", + "expiration-date-yy", + "expiration-date-yyyy", + "validity-year", + "exp-date-year", + "date-y", + ]; + + static readonly CVVFieldNames: string[] = [ + "cvv", + "cvc", + "cvv2", + "cc-csc", + "cc-cvv", + "card-csc", + "card-cvv", + "cvd", + "cid", + "cvc2", + "cnv", + "cvn2", + "cc-code", + "card-code", + "code-securite", + "security-code", + "crypto", + "card-verif", + "verification-code", + "csc", + "ccv", + ]; + + static readonly CardBrandFieldNames: string[] = [ + "cc-type", + "card-type", + "card-brand", + "cc-brand", + "cb-type", + ]; + + // Each index represents a language. These three arrays should all be the same length. + // 0: English, 1: Danish, 2: German/Dutch, 3: French/Spanish/Italian, 4: Russian, 5: Portuguese + static readonly MonthAbbr = ["mm", "mm", "mm", "mm", "mm", "mm"]; + static readonly YearAbbrShort = ["yy", "åå", "jj", "aa", "гг", "rr"]; + static readonly YearAbbrLong = ["yyyy", "åååå", "jjjj", "aa", "гггг", "rrrr"]; +} + +export class IdentityAutoFillConstants { + static readonly IdentityAttributes: string[] = [ + "autoCompleteType", + "data-stripe", + "htmlName", + "htmlID", + "label-tag", + "placeholder", + "label-left", + "label-top", + "data-recurly", + ]; + + static readonly FullNameFieldNames: string[] = ["name", "full-name", "your-name"]; + + static readonly FullNameFieldNameValues: string[] = ["full-name", "your-name"]; + + static readonly TitleFieldNames: string[] = ["honorific-prefix", "prefix", "title"]; + + static readonly FirstnameFieldNames: string[] = [ + // English + "f-name", + "first-name", + "given-name", + "first-n", + // German + "vorname", + ]; + + static readonly MiddlenameFieldNames: string[] = [ + "m-name", + "middle-name", + "additional-name", + "middle-initial", + "middle-n", + "middle-i", + ]; + + static readonly LastnameFieldNames: string[] = [ + // English + "l-name", + "last-name", + "s-name", + "surname", + "family-name", + "family-n", + "last-n", + // German + "nachname", + "familienname", + ]; + + static readonly EmailFieldNames: string[] = ["e-mail", "email-address"]; + + static readonly AddressFieldNames: string[] = [ + "address", + "street-address", + "addr", + "street", + "mailing-addr", + "billing-addr", + "mail-addr", + "bill-addr", + ]; + + static readonly AddressFieldNameValues: string[] = [ + "mailing-addr", + "billing-addr", + "mail-addr", + "bill-addr", + ]; + + static readonly Address1FieldNames: string[] = [ + "address-1", + "address-line-1", + "addr-1", + "street-1", + ]; + + static readonly Address2FieldNames: string[] = [ + "address-2", + "address-line-2", + "addr-2", + "street-2", + ]; + + static readonly Address3FieldNames: string[] = [ + "address-3", + "address-line-3", + "addr-3", + "street-3", + ]; + + static readonly PostalCodeFieldNames: string[] = [ + "postal", + "zip", + "zip2", + "zip-code", + "postal-code", + "post-code", + "address-zip", + "address-postal", + "address-code", + "address-postal-code", + "address-zip-code", + ]; + + static readonly CityFieldNames: string[] = [ + "city", + "town", + "address-level-2", + "address-city", + "address-town", + ]; + + static readonly StateFieldNames: string[] = [ + "state", + "province", + "provence", + "address-level-1", + "address-state", + "address-province", + ]; + + static readonly CountryFieldNames: string[] = [ + "country", + "country-code", + "country-name", + "address-country", + "address-country-name", + "address-country-code", + ]; + + static readonly PhoneFieldNames: string[] = [ + "phone", + "mobile", + "mobile-phone", + "tel", + "telephone", + "phone-number", + ]; + + static readonly UserNameFieldNames: string[] = ["user-name", "user-id", "screen-name"]; + + static readonly CompanyFieldNames: string[] = [ + "company", + "company-name", + "organization", + "organization-name", + ]; + + static readonly IsoCountries: { [id: string]: string } = { + afghanistan: "AF", + "aland islands": "AX", + albania: "AL", + algeria: "DZ", + "american samoa": "AS", + andorra: "AD", + angola: "AO", + anguilla: "AI", + antarctica: "AQ", + "antigua and barbuda": "AG", + argentina: "AR", + armenia: "AM", + aruba: "AW", + australia: "AU", + austria: "AT", + azerbaijan: "AZ", + bahamas: "BS", + bahrain: "BH", + bangladesh: "BD", + barbados: "BB", + belarus: "BY", + belgium: "BE", + belize: "BZ", + benin: "BJ", + bermuda: "BM", + bhutan: "BT", + bolivia: "BO", + "bosnia and herzegovina": "BA", + botswana: "BW", + "bouvet island": "BV", + brazil: "BR", + "british indian ocean territory": "IO", + "brunei darussalam": "BN", + bulgaria: "BG", + "burkina faso": "BF", + burundi: "BI", + cambodia: "KH", + cameroon: "CM", + canada: "CA", + "cape verde": "CV", + "cayman islands": "KY", + "central african republic": "CF", + chad: "TD", + chile: "CL", + china: "CN", + "christmas island": "CX", + "cocos (keeling) islands": "CC", + colombia: "CO", + comoros: "KM", + congo: "CG", + "congo, democratic republic": "CD", + "cook islands": "CK", + "costa rica": "CR", + "cote d'ivoire": "CI", + croatia: "HR", + cuba: "CU", + cyprus: "CY", + "czech republic": "CZ", + denmark: "DK", + djibouti: "DJ", + dominica: "DM", + "dominican republic": "DO", + ecuador: "EC", + egypt: "EG", + "el salvador": "SV", + "equatorial guinea": "GQ", + eritrea: "ER", + estonia: "EE", + ethiopia: "ET", + "falkland islands": "FK", + "faroe islands": "FO", + fiji: "FJ", + finland: "FI", + france: "FR", + "french guiana": "GF", + "french polynesia": "PF", + "french southern territories": "TF", + gabon: "GA", + gambia: "GM", + georgia: "GE", + germany: "DE", + ghana: "GH", + gibraltar: "GI", + greece: "GR", + greenland: "GL", + grenada: "GD", + guadeloupe: "GP", + guam: "GU", + guatemala: "GT", + guernsey: "GG", + guinea: "GN", + "guinea-bissau": "GW", + guyana: "GY", + haiti: "HT", + "heard island & mcdonald islands": "HM", + "holy see (vatican city state)": "VA", + honduras: "HN", + "hong kong": "HK", + hungary: "HU", + iceland: "IS", + india: "IN", + indonesia: "ID", + "iran, islamic republic of": "IR", + iraq: "IQ", + ireland: "IE", + "isle of man": "IM", + israel: "IL", + italy: "IT", + jamaica: "JM", + japan: "JP", + jersey: "JE", + jordan: "JO", + kazakhstan: "KZ", + kenya: "KE", + kiribati: "KI", + "republic of korea": "KR", + "south korea": "KR", + "democratic people's republic of korea": "KP", + "north korea": "KP", + kuwait: "KW", + kyrgyzstan: "KG", + "lao people's democratic republic": "LA", + latvia: "LV", + lebanon: "LB", + lesotho: "LS", + liberia: "LR", + "libyan arab jamahiriya": "LY", + liechtenstein: "LI", + lithuania: "LT", + luxembourg: "LU", + macao: "MO", + macedonia: "MK", + madagascar: "MG", + malawi: "MW", + malaysia: "MY", + maldives: "MV", + mali: "ML", + malta: "MT", + "marshall islands": "MH", + martinique: "MQ", + mauritania: "MR", + mauritius: "MU", + mayotte: "YT", + mexico: "MX", + "micronesia, federated states of": "FM", + moldova: "MD", + monaco: "MC", + mongolia: "MN", + montenegro: "ME", + montserrat: "MS", + morocco: "MA", + mozambique: "MZ", + myanmar: "MM", + namibia: "NA", + nauru: "NR", + nepal: "NP", + netherlands: "NL", + "netherlands antilles": "AN", + "new caledonia": "NC", + "new zealand": "NZ", + nicaragua: "NI", + niger: "NE", + nigeria: "NG", + niue: "NU", + "norfolk island": "NF", + "northern mariana islands": "MP", + norway: "NO", + oman: "OM", + pakistan: "PK", + palau: "PW", + "palestinian territory, occupied": "PS", + panama: "PA", + "papua new guinea": "PG", + paraguay: "PY", + peru: "PE", + philippines: "PH", + pitcairn: "PN", + poland: "PL", + portugal: "PT", + "puerto rico": "PR", + qatar: "QA", + reunion: "RE", + romania: "RO", + "russian federation": "RU", + rwanda: "RW", + "saint barthelemy": "BL", + "saint helena": "SH", + "saint kitts and nevis": "KN", + "saint lucia": "LC", + "saint martin": "MF", + "saint pierre and miquelon": "PM", + "saint vincent and grenadines": "VC", + samoa: "WS", + "san marino": "SM", + "sao tome and principe": "ST", + "saudi arabia": "SA", + senegal: "SN", + serbia: "RS", + seychelles: "SC", + "sierra leone": "SL", + singapore: "SG", + slovakia: "SK", + slovenia: "SI", + "solomon islands": "SB", + somalia: "SO", + "south africa": "ZA", + "south georgia and sandwich isl.": "GS", + spain: "ES", + "sri lanka": "LK", + sudan: "SD", + suriname: "SR", + "svalbard and jan mayen": "SJ", + swaziland: "SZ", + sweden: "SE", + switzerland: "CH", + "syrian arab republic": "SY", + taiwan: "TW", + tajikistan: "TJ", + tanzania: "TZ", + thailand: "TH", + "timor-leste": "TL", + togo: "TG", + tokelau: "TK", + tonga: "TO", + "trinidad and tobago": "TT", + tunisia: "TN", + turkey: "TR", + turkmenistan: "TM", + "turks and caicos islands": "TC", + tuvalu: "TV", + uganda: "UG", + ukraine: "UA", + "united arab emirates": "AE", + "united kingdom": "GB", + "united states": "US", + "united states outlying islands": "UM", + uruguay: "UY", + uzbekistan: "UZ", + vanuatu: "VU", + venezuela: "VE", + vietnam: "VN", + "virgin islands, british": "VG", + "virgin islands, u.s.": "VI", + "wallis and futuna": "WF", + "western sahara": "EH", + yemen: "YE", + zambia: "ZM", + zimbabwe: "ZW", + }; + + static readonly IsoStates: { [id: string]: string } = { + alabama: "AL", + alaska: "AK", + "american samoa": "AS", + arizona: "AZ", + arkansas: "AR", + california: "CA", + colorado: "CO", + connecticut: "CT", + delaware: "DE", + "district of columbia": "DC", + "federated states of micronesia": "FM", + florida: "FL", + georgia: "GA", + guam: "GU", + hawaii: "HI", + idaho: "ID", + illinois: "IL", + indiana: "IN", + iowa: "IA", + kansas: "KS", + kentucky: "KY", + louisiana: "LA", + maine: "ME", + "marshall islands": "MH", + maryland: "MD", + massachusetts: "MA", + michigan: "MI", + minnesota: "MN", + mississippi: "MS", + missouri: "MO", + montana: "MT", + nebraska: "NE", + nevada: "NV", + "new hampshire": "NH", + "new jersey": "NJ", + "new mexico": "NM", + "new york": "NY", + "north carolina": "NC", + "north dakota": "ND", + "northern mariana islands": "MP", + ohio: "OH", + oklahoma: "OK", + oregon: "OR", + palau: "PW", + pennsylvania: "PA", + "puerto rico": "PR", + "rhode island": "RI", + "south carolina": "SC", + "south dakota": "SD", + tennessee: "TN", + texas: "TX", + utah: "UT", + vermont: "VT", + "virgin islands": "VI", + virginia: "VA", + washington: "WA", + "west virginia": "WV", + wisconsin: "WI", + wyoming: "WY", + }; + + static readonly IsoProvinces: { [id: string]: string } = { + alberta: "AB", + "british columbia": "BC", + manitoba: "MB", + "new brunswick": "NB", + "newfoundland and labrador": "NL", + "nova scotia": "NS", + ontario: "ON", + "prince edward island": "PE", + quebec: "QC", + saskatchewan: "SK", + }; +}