105 lines
2.8 KiB
JavaScript
105 lines
2.8 KiB
JavaScript
/* 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
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/*
|
|
* Implements an interface of the storage of Form Autofill.
|
|
*/
|
|
|
|
// We expose a singleton from this module. Some tests may import the
|
|
// constructor via the system global.
|
|
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)
|
|
);
|