Merge pull request #2255 from bitwarden/Refactor-Autofill-service

Tech-Debt: Refactor autofill service
This commit is contained in:
Daniel James Smith 2022-01-04 15:21:47 +01:00 committed by GitHub
commit ccd96d5d36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 792 additions and 189 deletions

View File

@ -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<string, number>([
['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;
}

View File

@ -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",
};
}