Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
/*
* Implements an interface of the storage of Form Autofill.
*/
// We expose a singleton from this module. Some tests may import the
// constructor via a backstage pass.
import {
AddressesBase,
CreditCardsBase,
FormAutofillStorageBase,
} from "resource://autofill/FormAutofillStorageBase.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
CreditCard: "resource://gre/modules/CreditCard.sys.mjs",
JSONFile: "resource://gre/modules/JSONFile.sys.mjs",
OSKeyStore: "resource://gre/modules/OSKeyStore.sys.mjs",
});
const PROFILE_JSON_FILE_NAME = "autofill-profiles.json";
class Addresses extends AddressesBase {}
class CreditCards extends CreditCardsBase {
constructor(store) {
super(store);
}
async _encryptNumber(creditCard) {
if (!("cc-number-encrypted" in creditCard)) {
if ("cc-number" in creditCard) {
let ccNumber = creditCard["cc-number"];
if (lazy.CreditCard.isValidNumber(ccNumber)) {
creditCard["cc-number"] =
lazy.CreditCard.getLongMaskedNumber(ccNumber);
} else {
// Credit card numbers can be entered on versions of Firefox that don't validate
// the number and then synced to this version of Firefox. Therefore, mask the
// full number if the number is invalid on this version.
creditCard["cc-number"] = "*".repeat(ccNumber.length);
}
creditCard["cc-number-encrypted"] =
await lazy.OSKeyStore.encrypt(ccNumber);
} else {
creditCard["cc-number-encrypted"] = "";
}
}
}
}
export class FormAutofillStorage extends FormAutofillStorageBase {
constructor(path) {
super(path);
}
getAddresses() {
if (!this._addresses) {
this._store.ensureDataReady();
this._addresses = new Addresses(this._store);
}
return this._addresses;
}
getCreditCards() {
if (!this._creditCards) {
this._store.ensureDataReady();
this._creditCards = new CreditCards(this._store);
}
return this._creditCards;
}
/**
* Loads the profile data from file to memory.
*
* @returns {JSONFile}
* The JSONFile store.
*/
_initializeStore() {
return new lazy.JSONFile({
path: this._path,
dataPostProcessor: this._dataPostProcessor.bind(this),
});
}
_dataPostProcessor(data) {
data.version = this.version;
if (!data.addresses) {
data.addresses = [];
}
if (!data.creditCards) {
data.creditCards = [];
}
return data;
}
}
// The singleton exposed by this module.
export const formAutofillStorage = new FormAutofillStorage(
PathUtils.join(PathUtils.profileDir, PROFILE_JSON_FILE_NAME)
);