Better handle case when there are multiple forms on the page (#58)

This commit is contained in:
Maxim Baz
2019-04-02 12:47:17 +02:00
committed by GitHub
parent 31c38651c1
commit 52def9a096

View File

@@ -268,43 +268,47 @@
* @return The login form * @return The login form
*/ */
function form() { function form() {
var elems = queryAllVisible(document, INPUT_FIELDS, undefined); const elems = queryAllVisible(document, INPUT_FIELDS, undefined);
var forms = []; const forms = [];
for (var i = 0; i < elems.length; i++) { for (let elem of elems) {
var form = elems[i].form; const form = elem.form;
if (form && forms.indexOf(form) < 0) { if (form && forms.indexOf(form) < 0) {
forms.push(form); forms.push(form);
} }
} }
if (forms.length == 0) {
return undefined;
}
if (forms.length == 1) {
return forms[0];
}
// If there are multiple forms, try to detect which one is a login form // Try to filter only forms that have some identifying marker
var formProps = []; const markedForms = [];
for (var i = 0; i < forms.length; i++) { for (let form of forms) {
var form = forms[i]; const props = [form.id, form.name, form.className, form.action];
var props = [form.id, form.name, form.className]; for (let marker of FORM_MARKERS) {
formProps.push(props); for (let prop of props) {
for (var j = 0; j < FORM_MARKERS.length; j++) {
var marker = FORM_MARKERS[j];
for (var k = 0; k < props.length; k++) {
var prop = props[k];
if (prop.toLowerCase().indexOf(marker) > -1) { if (prop.toLowerCase().indexOf(marker) > -1) {
return form; markedForms.push(form);
} }
} }
} }
} }
console.error( // Try to filter only forms that have a password field
"Unable to detect which of the multiple available forms is the login form. Please submit an issue for browserpass on github, and provide the following list in the details: " + const formsWithPassword = [];
JSON.stringify(formProps) for (let form of markedForms) {
); if (find(PASSWORD_FIELDS, form)) {
return forms[0]; formsWithPassword.push(form);
}
}
// Give up and return the first available form, if any
if (formsWithPassword.length > 0) {
return formsWithPassword[0];
}
if (markedForms.length > 0) {
return markedForms[0];
}
if (forms.length > 0) {
return forms[0];
}
return undefined;
} }
/** /**