aadd0f7
# Fixes installation of those addons which don't have ID on IceCat ("Cannot find id for addon" error).
aadd0f7
--- a/toolkit/mozapps/extensions/internal/XPIInstall.jsm
aadd0f7
+++ b/toolkit/mozapps/extensions/internal/XPIInstall.jsm
664509a
@@ -627,8 +627,30 @@
664509a
         throw new Error(`Extension is signed with an invalid id (${addon.id})`);
aadd0f7
       }
aadd0f7
     }
664509a
-    if (!addon.id && aLocation.isTemporary) {
664509a
-      addon.id = generateTemporaryInstallID(aPackage.file);
aadd0f7
+    if (!addon.id) {
aadd0f7
+      if (aInstallLocation.name == KEY_APP_TEMPORARY) {
aadd0f7
+        addon.id = generateTemporaryInstallID(aZipReader.file);
aadd0f7
+      } else {
aadd0f7
+        try {
aadd0f7
+          let sigInput = aZipReader.getInputStream("META-INF/cose.sig");
aadd0f7
+          let sigBinary = Cc['@mozilla.org/binaryinputstream;1']
aadd0f7
+            .createInstance(Ci.nsIBinaryInputStream);
aadd0f7
+          sigBinary.setInputStream(sigInput);
aadd0f7
+          var sig = ''
aadd0f7
+          var sigCount;
aadd0f7
+          while ((sigCount = sigBinary.available()) > 0) {
aadd0f7
+            sig += sigBinary.readBytes(sigCount);
aadd0f7
+          }
aadd0f7
+          let sigMatch = sig.match(/\{\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\}/g)
aadd0f7
+          if (sigMatch && sigMatch.length == 1) {
aadd0f7
+            addon.id = sigMatch[0]
aadd0f7
+          } else {
aadd0f7
+            logger.warn("Failed to find addon id");
aadd0f7
+          }
aadd0f7
+        } catch (e) {
aadd0f7
+          logger.warn("Failed to process META-INF/cose.sig");
aadd0f7
+        }
aadd0f7
+      }
aadd0f7
     }
aadd0f7
   }
664509a