Fix empty sync exclude regexp behavior
This commit is contained in:
parent
a399f8452b
commit
6021af10ed
2 changed files with 102 additions and 3 deletions
|
@ -128,13 +128,12 @@ const sync = {
|
||||||
await sync.checkForListenersMaybeAdd();
|
await sync.checkForListenersMaybeAdd();
|
||||||
|
|
||||||
async function updateSyncIdentities() {
|
async function updateSyncIdentities() {
|
||||||
const { syncExcludeRegExp } = await browser.storage.local.get("syncExcludeRegExp");
|
const excludeRegExp = await getExcludeRegExp();
|
||||||
const excludeRegExp = new RegExp(syncExcludeRegExp, "i");
|
|
||||||
const identities = await browser.contextualIdentities.query({});
|
const identities = await browser.contextualIdentities.query({});
|
||||||
|
|
||||||
for (const identity of identities) {
|
for (const identity of identities) {
|
||||||
// skip excluded identities
|
// skip excluded identities
|
||||||
if (identity.name.match(excludeRegExp)) {
|
if (excludeRegExpMatchesIdentity(excludeRegExp, identity)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,6 +333,7 @@ async function restore() {
|
||||||
*/
|
*/
|
||||||
async function reconcileIdentities(){
|
async function reconcileIdentities(){
|
||||||
if (SYNC_DEBUG) console.log("reconcileIdentities");
|
if (SYNC_DEBUG) console.log("reconcileIdentities");
|
||||||
|
const excludeRegExp = await getExcludeRegExp();
|
||||||
|
|
||||||
// first delete any from the deleted list
|
// first delete any from the deleted list
|
||||||
const deletedIdentityList =
|
const deletedIdentityList =
|
||||||
|
@ -343,6 +343,14 @@ async function reconcileIdentities(){
|
||||||
const deletedCookieStoreId =
|
const deletedCookieStoreId =
|
||||||
await identityState.lookupCookieStoreId(deletedUUID);
|
await identityState.lookupCookieStoreId(deletedUUID);
|
||||||
if (deletedCookieStoreId){
|
if (deletedCookieStoreId){
|
||||||
|
if (excludeRegExp) {
|
||||||
|
const deletedIdentity = await identityState.get(deletedCookieStoreId);
|
||||||
|
// skip excluded identities
|
||||||
|
if (excludeRegExpMatchesIdentity(excludeRegExp, deletedIdentity)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try{
|
try{
|
||||||
await browser.contextualIdentities.remove(deletedCookieStoreId);
|
await browser.contextualIdentities.remove(deletedCookieStoreId);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -357,6 +365,11 @@ async function reconcileIdentities(){
|
||||||
await sync.storageArea.getIdentities();
|
await sync.storageArea.getIdentities();
|
||||||
// find any local dupes created on sync storage and delete from sync storage
|
// find any local dupes created on sync storage and delete from sync storage
|
||||||
for (const localIdentity of localIdentities) {
|
for (const localIdentity of localIdentities) {
|
||||||
|
// skip excluded identities
|
||||||
|
if (excludeRegExpMatchesIdentity(excludeRegExp, localIdentity)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const syncIdentitiesOfName = syncIdentitiesRemoveDupes
|
const syncIdentitiesOfName = syncIdentitiesRemoveDupes
|
||||||
.filter(identity => identity.name === localIdentity.name);
|
.filter(identity => identity.name === localIdentity.name);
|
||||||
if (syncIdentitiesOfName.length > 1) {
|
if (syncIdentitiesOfName.length > 1) {
|
||||||
|
@ -370,6 +383,11 @@ async function reconcileIdentities(){
|
||||||
await sync.storageArea.getIdentities();
|
await sync.storageArea.getIdentities();
|
||||||
// now compare all containers for matching names.
|
// now compare all containers for matching names.
|
||||||
for (const syncIdentity of syncIdentities) {
|
for (const syncIdentity of syncIdentities) {
|
||||||
|
// skip excluded identities
|
||||||
|
if (excludeRegExpMatchesIdentity(excludeRegExp, syncIdentity)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (syncIdentity.macAddonUUID){
|
if (syncIdentity.macAddonUUID){
|
||||||
const localMatch = localIdentities.find(
|
const localMatch = localIdentities.find(
|
||||||
localIdentity => localIdentity.name === syncIdentity.name
|
localIdentity => localIdentity.name === syncIdentity.name
|
||||||
|
@ -585,3 +603,24 @@ async function setAssignmentWithUUID(assignedSite, urlKey) {
|
||||||
}
|
}
|
||||||
throw new Error (`No cookieStoreId found for: ${uuid}, ${urlKey}`);
|
throw new Error (`No cookieStoreId found for: ${uuid}, ${urlKey}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Retrieve the sync exclude regexp from local storage.
|
||||||
|
async function getExcludeRegExp() {
|
||||||
|
const { syncExcludeRegExp } = await browser.storage.local.get("syncExcludeRegExp");
|
||||||
|
if (syncExcludeRegExp) {
|
||||||
|
return new RegExp(syncExcludeRegExp, "i");
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Matching the provided exclude regexp against the provided identity and return
|
||||||
|
// true if they match.
|
||||||
|
function excludeRegExpMatchesIdentity(excludeRegExp, identity) {
|
||||||
|
if (excludeRegExp && identity.name.match(excludeRegExp)) {
|
||||||
|
if (SYNC_DEBUG) console.log(`Exclude regexp matches identity '${identity.name}'`);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -187,6 +187,50 @@ describe("Sync", function() {
|
||||||
this.syncHelper.lookupIdentityBy(identities, {name: "Mozilla"});
|
this.syncHelper.lookupIdentityBy(identities, {name: "Mozilla"});
|
||||||
(mozillaContainer.icon === "pet").should.be.true;
|
(mozillaContainer.icon === "pet").should.be.true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("excludeEmptyTest", async function() {
|
||||||
|
await this.syncHelper.stopSyncListeners();
|
||||||
|
await this.syncHelper.setState({}, LOCAL_DATA, TEST_CONTAINERS, []);
|
||||||
|
await this.syncHelper.unsetExcludeRegexp();
|
||||||
|
|
||||||
|
await this.webExt.background.window.sync.runSync();
|
||||||
|
|
||||||
|
// We excluded nothing, so all identities should be part of the sync storage.
|
||||||
|
const identities = await this.syncHelper.getIdentitiesFromSyncStorage();
|
||||||
|
TEST_CONTAINERS.length.should.equal(identities.length);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("excludeOutgoingTest", async function() {
|
||||||
|
await this.syncHelper.stopSyncListeners();
|
||||||
|
await this.syncHelper.setState({}, LOCAL_DATA, TEST_CONTAINERS, []);
|
||||||
|
|
||||||
|
// Our outgoing container is the last test container.
|
||||||
|
const outgoingContainerName = TEST_CONTAINERS.at(-1).name;
|
||||||
|
await this.syncHelper.setExcludeRegexp(`^${outgoingContainerName}$`);
|
||||||
|
|
||||||
|
await this.webExt.background.window.sync.runSync();
|
||||||
|
|
||||||
|
// We excluded an outgoing container, so its identity should not be part of the sync storage.
|
||||||
|
const identities = await this.syncHelper.getIdentitiesFromSyncStorage();
|
||||||
|
this.syncHelper.lookupIdentityBy(identities, {name: outgoingContainerName}).should.be.false;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("excludeIncomingTest", async function() {
|
||||||
|
await this.syncHelper.stopSyncListeners();
|
||||||
|
await this.syncHelper.setState(SYNC_DATA, LOCAL_DATA, TEST_CONTAINERS, []);
|
||||||
|
|
||||||
|
// Our incoming container is the first that's in the sync storage but not in the local storage
|
||||||
|
const incomingContainerName = Object.values(SYNC_DATA).find((sync_container) =>
|
||||||
|
!TEST_CONTAINERS.find((local_container) => sync_container.name === local_container.name)
|
||||||
|
).name;
|
||||||
|
await this.syncHelper.setExcludeRegexp(`^${incomingContainerName}$`);
|
||||||
|
|
||||||
|
await this.webExt.background.window.sync.runSync();
|
||||||
|
|
||||||
|
// We excluded an incoming container, so its identity should not be part of the local storage.
|
||||||
|
const identities = await this.webExt.browser.contextualIdentities.query({});
|
||||||
|
this.syncHelper.lookupIdentityBy(identities, {name: incomingContainerName}).should.be.false;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
class SyncTestHelper {
|
class SyncTestHelper {
|
||||||
|
@ -224,7 +268,15 @@ class SyncTestHelper {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async setExcludeRegexp(syncExcludeRegExp) {
|
||||||
|
await this.webExt.browser.storage.local.set({syncExcludeRegExp});
|
||||||
|
}
|
||||||
|
|
||||||
|
async unsetExcludeRegexp() {
|
||||||
|
await this.webExt.browser.storage.local.remove("syncExcludeRegExp");
|
||||||
|
}
|
||||||
|
|
||||||
async removeAllContainers() {
|
async removeAllContainers() {
|
||||||
const identities = await this.webExt.browser.contextualIdentities.query({});
|
const identities = await this.webExt.browser.contextualIdentities.query({});
|
||||||
for (const identity of identities) {
|
for (const identity of identities) {
|
||||||
|
@ -232,6 +284,14 @@ class SyncTestHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getIdentitiesFromSyncStorage() {
|
||||||
|
const storage = await this.webExt.browser.storage.sync.get();
|
||||||
|
const identities = Object.fromEntries(
|
||||||
|
Object.entries(storage).filter(([key]) => key.startsWith("identity@@"))
|
||||||
|
);
|
||||||
|
return Object.values(identities);
|
||||||
|
}
|
||||||
|
|
||||||
lookupIdentityBy(identities, options) {
|
lookupIdentityBy(identities, options) {
|
||||||
for (const identity of identities) {
|
for (const identity of identities) {
|
||||||
if (options && options.name) {
|
if (options && options.name) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue