Bug 1194784: Sideloaded add-ons without full signing don't display an appropriate warning in the add-ons manager. r=dao

--HG--
extra : commitid : 10VQvgDJsbv
extra : rebase_source : 9a2ea211db29e335a37ddf824bd18776d62cbeca
This commit is contained in:
Dave Townsend 2015-09-03 12:39:29 -07:00
parent 1763463649
commit 0cf2a7c5c2
4 changed files with 235 additions and 42 deletions

View File

@ -199,6 +199,14 @@ function loadView(aViewId) {
}
}
function isCorrectlySigned(aAddon) {
if (aAddon.signedState <= AddonManager.SIGNEDSTATE_MISSING)
return false;
if (aAddon.foreignInstall && aAddon.signedState < AddonManager.SIGNEDSTATE_SIGNED)
return false;
return true;
}
function isDiscoverEnabled() {
if (Services.prefs.getPrefType(PREF_DISCOVERURL) == Services.prefs.PREF_INVALID)
return false;
@ -2704,13 +2712,13 @@ var gListView = {
filterDisabledUnsigned: function gListView_filterDisabledUnsigned(aFilter = true) {
let foundDisabledUnsigned = false;
for (let item of this._listBox.childNodes) {
let isDisabledUnsigned = item.mAddon.appDisabled &&
item.mAddon.signedState <= AddonManager.SIGNEDSTATE_MISSING;
if (isDisabledUnsigned)
foundDisabledUnsigned = true;
else
item.hidden = aFilter;
if (SIGNING_REQUIRED) {
for (let item of this._listBox.childNodes) {
if (!isCorrectlySigned(item.mAddon))
foundDisabledUnsigned = true;
else
item.hidden = aFilter;
}
}
document.getElementById("show-disabled-unsigned-extensions").hidden =
@ -3158,7 +3166,7 @@ var gDetailView = {
errorLink.value = gStrings.ext.GetStringFromName("details.notification.blocked.link");
errorLink.href = this._addon.blocklistURL;
errorLink.hidden = false;
} else if (this._addon.signedState <= AddonManager.SIGNEDSTATE_MISSING && SIGNING_REQUIRED) {
} else if (!isCorrectlySigned(this._addon) && SIGNING_REQUIRED) {
this.node.setAttribute("notification", "error");
document.getElementById("detail-error").textContent = gStrings.ext.formatStringFromName(
"details.notification.unsignedAndDisabled", [this._addon.name, gStrings.brandShortName], 2
@ -3175,7 +3183,7 @@ var gDetailView = {
[this._addon.name, gStrings.brandShortName, gStrings.appVersion], 3
);
document.getElementById("detail-warning-link").hidden = true;
} else if (this._addon.signedState <= AddonManager.SIGNEDSTATE_MISSING) {
} else if (!isCorrectlySigned(this._addon)) {
this.node.setAttribute("notification", "warning");
document.getElementById("detail-warning").textContent = gStrings.ext.formatStringFromName(
"details.notification.unsigned", [this._addon.name, gStrings.brandShortName], 2

View File

@ -1238,9 +1238,7 @@
this._errorLink.value = gStrings.ext.GetStringFromName("notification.blocked.link");
this._errorLink.href = this.mAddon.blocklistURL;
this._errorLink.hidden = false;
} else if (!isUpgrade &&
this.mAddon.signedState <= AddonManager.SIGNEDSTATE_MISSING &&
SIGNING_REQUIRED) {
} else if (!isUpgrade && !isCorrectlySigned(this.mAddon) && SIGNING_REQUIRED) {
this.setAttribute("notification", "error");
this._error.textContent = gStrings.ext.formatStringFromName(
"notification.unsignedAndDisabled", [this.mAddon.name, gStrings.brandShortName], 2
@ -1257,8 +1255,7 @@
);
this._warningLink.hidden = true;
this._warningBtn.hidden = true;
} else if (!isUpgrade &&
this.mAddon.signedState <= AddonManager.SIGNEDSTATE_MISSING) {
} else if (!isUpgrade && !isCorrectlySigned(this.mAddon)) {
this.setAttribute("notification", "warning");
this._warning.textContent = gStrings.ext.formatStringFromName(
"notification.unsigned", [this.mAddon.name, gStrings.brandShortName], 2

View File

@ -155,6 +155,19 @@ function test() {
isActive: false,
appDisabled: true,
isCompatible: false,
}, {
id: "addon11@tests.mozilla.org",
name: "Test add-on 11",
signedState: AddonManager.SIGNEDSTATE_PRELIMINARY,
foreignInstall: true,
isActive: false,
appDisabled: true,
isCompatible: false,
}, {
id: "addon12@tests.mozilla.org",
name: "Test add-on 12",
signedState: AddonManager.SIGNEDSTATE_SIGNED,
foreignInstall: true,
}, {
id: "hotfix@tests.mozilla.org",
name: "Test hotfix 1",
@ -818,6 +831,120 @@ add_test(function() {
});
});
// Opens and tests the details view for add-on 11
add_test(function() {
open_details("addon11@tests.mozilla.org", "extension", function() {
is(get("detail-name").textContent, "Test add-on 11", "Name should be correct");
is_element_hidden(get("detail-prefs-btn"), "Preferences button should be hidden");
is_element_hidden(get("detail-enable-btn"), "Enable button should be hidden");
is_element_hidden(get("detail-disable-btn"), "Disable button should be hidden");
is_element_visible(get("detail-uninstall-btn"), "Remove button should be visible");
is_element_visible(get("detail-warning"), "Warning message should be visible");
is(get("detail-warning").textContent, "Test add-on 11 is incompatible with " + gApp + " " + gVersion + ".", "Warning message should be correct");
is_element_hidden(get("detail-warning-link"), "Warning link should be hidden");
is_element_hidden(get("detail-error"), "Error message should be hidden");
is_element_hidden(get("detail-error-link"), "Error link should be hidden");
is_element_hidden(get("detail-pending"), "Pending message should be hidden");
run_next_test();
});
});
// Opens and tests the details view for add-on 11 with signing required
add_test(function() {
close_manager(gManagerWindow, function() {
Services.prefs.setBoolPref("xpinstall.signatures.required", true);
open_manager(null, function(aWindow) {
gManagerWindow = aWindow;
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
open_details("addon11@tests.mozilla.org", "extension", function() {
is(get("detail-name").textContent, "Test add-on 11", "Name should be correct");
is_element_hidden(get("detail-prefs-btn"), "Preferences button should be hidden");
is_element_hidden(get("detail-enable-btn"), "Enable button should be hidden");
is_element_hidden(get("detail-disable-btn"), "Disable button should be hidden");
is_element_visible(get("detail-uninstall-btn"), "Remove button should be visible");
is_element_hidden(get("detail-warning"), "Warning message should be hidden");
is_element_hidden(get("detail-warning-link"), "Warning link should be hidden");
is_element_visible(get("detail-error"), "Error message should be visible");
is(get("detail-error").textContent, "Test add-on 11 could not be verified for use in " + gApp + " and has been disabled.", "Error message should be correct");
is_element_visible(get("detail-error-link"), "Error link should be visible");
is(get("detail-error-link").value, "More Information", "Error link text should be correct");
is(get("detail-error-link").href, infoURL, "Error link should be correct");
close_manager(gManagerWindow, function() {
Services.prefs.setBoolPref("xpinstall.signatures.required", false);
open_manager(null, function(aWindow) {
gManagerWindow = aWindow;
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
run_next_test();
});
});
});
});
});
});
// Opens and tests the details view for add-on 12
add_test(function() {
open_details("addon12@tests.mozilla.org", "extension", function() {
is(get("detail-name").textContent, "Test add-on 12", "Name should be correct");
is_element_hidden(get("detail-prefs-btn"), "Preferences button should be hidden");
is_element_hidden(get("detail-enable-btn"), "Enable button should be hidden");
is_element_visible(get("detail-disable-btn"), "Disable button should be visible");
is_element_visible(get("detail-uninstall-btn"), "Remove button should be visible");
is_element_hidden(get("detail-warning"), "Warning message should be hidden");
is_element_hidden(get("detail-warning-link"), "Warning link should be hidden");
is_element_hidden(get("detail-error"), "Error message should be hidden");
is_element_hidden(get("detail-error-link"), "Error link should be hidden");
is_element_hidden(get("detail-pending"), "Pending message should be hidden");
run_next_test();
});
});
// Opens and tests the details view for add-on 12 with signing required
add_test(function() {
close_manager(gManagerWindow, function() {
Services.prefs.setBoolPref("xpinstall.signatures.required", true);
open_manager(null, function(aWindow) {
gManagerWindow = aWindow;
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
open_details("addon12@tests.mozilla.org", "extension", function() {
is(get("detail-name").textContent, "Test add-on 12", "Name should be correct");
is_element_hidden(get("detail-prefs-btn"), "Preferences button should be hidden");
is_element_hidden(get("detail-enable-btn"), "Enable button should be hidden");
is_element_visible(get("detail-disable-btn"), "Disable button should be visible");
is_element_visible(get("detail-uninstall-btn"), "Remove button should be visible");
is_element_hidden(get("detail-warning"), "Warning message should be hidden");
is_element_hidden(get("detail-warning-link"), "Warning link should be hidden");
is_element_hidden(get("detail-error"), "Error message should be hidden");
is_element_hidden(get("detail-error-link"), "Error link should be hidden");
close_manager(gManagerWindow, function() {
Services.prefs.setBoolPref("xpinstall.signatures.required", false);
open_manager(null, function(aWindow) {
gManagerWindow = aWindow;
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
run_next_test();
});
});
});
});
});
});
// Opens and tests the details view for hotfix 1
add_test(function() {
open_details("hotfix@tests.mozilla.org", "extension", function() {

View File

@ -19,6 +19,8 @@ var gPluginURL = Services.urlFormatter.formatURLPref("plugins.update.url");
var gDate = new Date(2010, 7, 16);
let infoURL = Services.urlFormatter.formatURLPref("app.support.baseURL") + "unsigned-addons";
const EXPECTED_ADDONS = 13;
var gLWTheme = {
id: "4",
version: "1",
@ -104,6 +106,18 @@ add_task(function*() {
isActive: false,
isCompatible: false,
appDisabled: true,
}, {
id: "addon12@tests.mozilla.org",
name: "Test add-on 12",
signedState: AddonManager.SIGNEDSTATE_PRELIMINARY,
isActive: false,
appDisabled: true,
foreignInstall: true,
}, {
id: "addon13@tests.mozilla.org",
name: "Test add-on 13",
signedState: AddonManager.SIGNEDSTATE_SIGNED,
foreignInstall: true,
}]);
gManagerWindow = yield open_manager(null);
@ -139,7 +153,7 @@ function get_class_node(parent, cls) {
add_task(function*() {
yield gCategoryUtilities.openType("extension");
let items = get_test_items();
is(Object.keys(items).length, 11, "Should be the right number of add-ons installed");
is(Object.keys(items).length, EXPECTED_ADDONS, "Should be the right number of add-ons installed");
info("Addon 1");
let addon = items["Test add-on"];
@ -442,35 +456,13 @@ add_task(function*() {
is_element_hidden(get_node(addon, "error-link"), "Error link should be hidden");
is_element_hidden(get_node(addon, "pending"), "Pending message should be hidden");
info("Filter for disabled unsigned extensions");
info("Filter for disabled unsigned extensions shouldn't appear because signing checks are off");
let filterButton = gManagerWindow.document.getElementById("show-disabled-unsigned-extensions");
let showAllButton = gManagerWindow.document.getElementById("show-all-extensions");
let signingInfoUI = gManagerWindow.document.getElementById("disabled-unsigned-addons-info");
is_element_visible(filterButton, "Button for showing disabled unsigned extensions should be visible");
is_element_hidden(filterButton, "Button for showing disabled unsigned extensions should be hidden");
is_element_hidden(showAllButton, "Button for showing all extensions should be hidden");
is_element_hidden(signingInfoUI, "Signing info UI should be hidden");
filterButton.click();
yield new Promise(resolve => wait_for_view_load(gManagerWindow, resolve));
is_element_hidden(filterButton, "Button for showing disabled unsigned extensions should be hidden");
is_element_visible(showAllButton, "Button for showing all extensions should be visible");
is_element_visible(signingInfoUI, "Signing info UI should be visible");
items = get_test_items();
is(Object.keys(items).length, 1, "Only one add-on should be shown");
is(Object.keys(items)[0], "Test add-on 11", "The disabled unsigned extension should be shown");
showAllButton.click();
yield new Promise(resolve => wait_for_view_load(gManagerWindow, resolve));
items = get_test_items();
is(Object.keys(items).length, 11, "All add-ons should be shown again");
is_element_visible(filterButton, "Button for showing disabled unsigned extensions should be visible again");
is_element_hidden(showAllButton, "Button for showing all extensions should be hidden again");
is_element_hidden(signingInfoUI, "Signing info UI should be hidden again");
});
// Check the add-ons are now in the right state
@ -492,7 +484,7 @@ add_task(function*() {
yield gCategoryUtilities.openType("extension");
let items = get_test_items();
is(Object.keys(items).length, 11, "Should be the right number of add-ons installed");
is(Object.keys(items).length, EXPECTED_ADDONS, "Should be the right number of add-ons installed");
info("Addon 1");
let addon = items["Test add-on"];
@ -697,7 +689,7 @@ add_task(function*() {
}]);
let items = get_test_items();
is(Object.keys(items).length, 11, "Should be the right number of add-ons installed");
is(Object.keys(items).length, EXPECTED_ADDONS, "Should be the right number of add-ons installed");
let addon = items["Test add-on replacement"];
addon.parentNode.ensureElementIsVisible(addon);
@ -745,6 +737,7 @@ add_task(function*() {
getService(Ci.nsIFocusManager);
let addon = items["Test add-on 6"];
addon.parentNode.ensureElementIsVisible(addon);
EventUtils.synthesizeMouseAtCenter(addon, { }, gManagerWindow);
is(fm.focusedElement, addon.parentNode, "Focus should have moved to the list");
@ -840,7 +833,7 @@ add_task(function*() {
yield gCategoryUtilities.openType("extension");
let items = get_test_items();
is(Object.keys(items).length, 11, "Should be the right number of add-ons installed");
is(Object.keys(items).length, EXPECTED_ADDONS, "Should be the right number of add-ons installed");
info("Addon 10");
let addon = items["Test add-on 10"];
@ -882,6 +875,74 @@ add_task(function*() {
is(get_node(addon, "error-link").value, "More Information", "Error link text should be correct");
is(get_node(addon, "error-link").href, infoURL, "Error link should be correct");
info("Addon 12");
addon = items["Test add-on 12"];
addon.parentNode.ensureElementIsVisible(addon);
({ name, version } = yield get_tooltip_info(addon))
is(get_node(addon, "name").value, "Test add-on 12", "Name should be correct");
is(name, "Test add-on 12", "Tooltip name should be correct");
is_element_hidden(get_node(addon, "preferences-btn"), "Preferences button should be hidden");
is_element_hidden(get_node(addon, "enable-btn"), "Enable button should be hidden");
is_element_hidden(get_node(addon, "disable-btn"), "Disable button should be hidden");
is_element_visible(get_node(addon, "remove-btn"), "Remove button should be visible");
is_element_hidden(get_node(addon, "warning"), "Warning message should be hidden");
is_element_hidden(get_node(addon, "warning-link"), "Warning link should be hidden");
is_element_visible(get_node(addon, "error"), "Error message should be visible");
is(get_node(addon, "error").textContent, "Test add-on 12 could not be verified for use in " + gApp + " and has been disabled.", "Error message should be correct");
is_element_visible(get_node(addon, "error-link"), "Error link should be visible");
is(get_node(addon, "error-link").value, "More Information", "Error link text should be correct");
is(get_node(addon, "error-link").href, infoURL, "Error link should be correct");
info("Addon 13");
addon = items["Test add-on 13"];
addon.parentNode.ensureElementIsVisible(addon);
({ name, version } = yield get_tooltip_info(addon));
is(get_node(addon, "name").value, "Test add-on 13", "Name should be correct");
is(name, "Test add-on 13", "Tooltip name should be correct");
is_element_hidden(get_node(addon, "preferences-btn"), "Preferences button should be hidden");
is_element_hidden(get_node(addon, "enable-btn"), "Enable button should be hidden");
is_element_visible(get_node(addon, "disable-btn"), "Disable button should be visible");
is_element_visible(get_node(addon, "remove-btn"), "Remove button should be visible");
is_element_hidden(get_node(addon, "warning"), "Warning message should be hidden");
is_element_hidden(get_node(addon, "warning-link"), "Warning link should be hidden");
is_element_hidden(get_node(addon, "error"), "Error message should be hidden");
info("Filter for disabled unsigned extensions");
let filterButton = gManagerWindow.document.getElementById("show-disabled-unsigned-extensions");
let showAllButton = gManagerWindow.document.getElementById("show-all-extensions");
let signingInfoUI = gManagerWindow.document.getElementById("disabled-unsigned-addons-info");
is_element_visible(filterButton, "Button for showing disabled unsigned extensions should be visible");
is_element_hidden(showAllButton, "Button for showing all extensions should be hidden");
is_element_hidden(signingInfoUI, "Signing info UI should be hidden");
filterButton.click();
yield new Promise(resolve => wait_for_view_load(gManagerWindow, resolve));
is_element_hidden(filterButton, "Button for showing disabled unsigned extensions should be hidden");
is_element_visible(showAllButton, "Button for showing all extensions should be visible");
is_element_visible(signingInfoUI, "Signing info UI should be visible");
items = get_test_items();
is(Object.keys(items).length, 3, "Two add-ons should be shown");
is(Object.keys(items)[0], "Test add-on 10", "The disabled unsigned extension should be shown");
is(Object.keys(items)[1], "Test add-on 11", "The disabled unsigned extension should be shown");
is(Object.keys(items)[2], "Test add-on 12", "The disabled foreign installed extension should be shown");
showAllButton.click();
yield new Promise(resolve => wait_for_view_load(gManagerWindow, resolve));
items = get_test_items();
is(Object.keys(items).length, EXPECTED_ADDONS, "All add-ons should be shown again");
is_element_visible(filterButton, "Button for showing disabled unsigned extensions should be visible again");
is_element_hidden(showAllButton, "Button for showing all extensions should be hidden again");
is_element_hidden(signingInfoUI, "Signing info UI should be hidden again");
Services.prefs.setBoolPref("xpinstall.signatures.required", false);
});