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