Signature d'un addon Firefox

Published: 19-03-2018

Updated: 19-03-2018

By: Maxime de Roucy

tags: firefox

Historique

Pendant un temps Google permettais de naviguer au clavier dans les pages de recherches. Cette fonctionnalité a été supprimé. J’ai alors commencé a utiliser le plugin Firefox Google Search Result Shortcut. Ça fonctionné très bien jusqu’à ce que Google décide de mettre en avant les meilleur réponses stackoverflow.com directement sur sa page de résultat.

J’ai donc cherché un autre addon, plus à jour et maintenu, et je suis tombé sur google-search-navigator. Ce plugin supporté les réponses stackoverflow.com, mais seulement depuis quelques jours. Le module n’avais pas été mis à jours sur le site addons.mozilla.org.

J’ai donc dû compiler et signer (obligatoire avec les versions récentes de Firefox) ce module.

Environment

J’ai utilisé un nspawn archlinux pour compiler et signer le module.

compilation

D’après la documentation du module yarn et gulp sont nécessaire.

pacman -S yarn gulp

signature

Le module dispose d’un script de signature automatique utilisant web-ext.

pacman -S nodejs npm python
npm install --global web-ext

Il existe d’autre méthodes permettant de signer un addon… j’ai juste pris celle qui était déjà scripté dans les sources du module.

compilation

La compilation créé l’arborescence de fichier du module. Elle ne génère pas d’archive ; ici, quand je parle de compilation, je ne veux pas parler de web-ext buid ….

Comme indiqué dans la documentation :

root@test # git clone https://github.com/infokiller/google-search-navigator.git
root@test # cd google-search-navigator
root@test # yarn install
…
root@test # yarn build --production
…

signature

Pour pouvoir signer l’addon il nous faut un compte sur addons.mozilla.org. Une fois connecté, on peut se générer un JWT via la page : https://addons.mozilla.org/en-US/developers/addon/api/key/ Ce JWT est composé d’un “issuer” et d’un “secret”.

J’ai aussi dû légèrement modifier les sources du modules :

root@test # git diff
diff --git a/src/manifest.json b/src/manifest.json
index 6770d60..a6da581 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -5,7 +5,6 @@
     "description": "Adds keyboard shortcuts to Google Search (google.com).",
     "applications": {
         "gecko": {
-            "id": "{ffadac89-63bb-4b04-be90-8cb2aa323171}",
             "strict_min_version": "48.0"
         }
     },
diff --git a/tools/make-firefox.sh b/tools/make-firefox.sh
index 5789169..d5b2646 100755
--- a/tools/make-firefox.sh
+++ b/tools/make-firefox.sh
@@ -30,6 +30,7 @@ cp src/* "$OBJ"
 # build and pack the package
 # do not sign as it would result in signed add-on intended for self-distribution
 echo "Creating package..."
-web-ext build --source-dir "$OBJ" --artifacts-dir "$BIN" "$@"
+web-ext build --source-dir "$OBJ" --artifacts-dir "$BIN"
+web-ext sign --source-dir "$OBJ" --artifacts-dir "$BIN" "$@"

 echo "Build complete"

J’ai supprimé le gecko.id pour ne pas entrer en conflit avec le module officiel. J’ai aussi modifier le script de signature (qui devait être écrit pour une version obsolète de web-ext).

J’ai créé un nouvelle uuid et lancé le script de signature :

root@test # cat /proc/sys/kernel/random/uuid
c739dbf1-58c9-4794-ac07-0a733571414d
root@test # bash -x tools/make-firefox.sh --api-key="${jwt_issuer}" --api-secret="${jwt_secret}" --id="{c739dbf1-58c9-4794-ac07-0a733571414d}"
+ echo 'Building Google Search Navigator for Firefox'
Building Google Search Navigator for Firefox
+ BIN=build/firefox
+ OBJ=build/firefox/obj
+ echo 'Copying files...'
Copying files...
+ rm -rf build/firefox/obj
+ mkdir -p build/firefox/obj
+ cp src/background.js src/extension.js src/icon128.png src/icon16.png src/icon300.png src/icon48.png src/keymaster.js src/main.js src/manifest.json src/options.css src/options.html src/options.js src/search_results.css build/firefox/obj
+ echo 'Creating package...'
Creating package...
+ web-ext build --source-dir build/firefox/obj --artifacts-dir build/firefox
Applying config file: ./package.json
Building web extension from /root/google-search-navigator/build/firefox/obj
Your web extension is ready: build/firefox/google_search_navigator-0.2.7.zip
+ web-ext sign --source-dir build/firefox/obj --artifacts-dir build/firefox --api-key=… --api-secret=… '--id={c739dbf1-58c9-4794-ac07-0a733571414d}'
Applying config file: ./package.json
Building web extension from /root/google-search-navigator/build/firefox/obj
Validating add-on [..........................................................................................................................]
Validation results: https://addons.mozilla.org/en-US/developers/upload/39bef3d1967f420caf80440d99e90071
Downloading signed files: 100%
Downloaded:
    build/firefox/google_search_navigator-0.2.7-an+fx.xpi
Extension ID: {c739dbf1-58c9-4794-ac07-0a733571414d}
SUCCESS
+ echo 'Build complete'
Build complete

Et voila, il m’a ensuite suffit de dropper le fichier xpi sur une fenetre Firefox pour l’installer et pourvoir utiliser la toute dernière version du module.