10 votes

Firefox Quantum pour Android - sauvegarde du profil sans Root ?

Sur Firefox Quantum pour Android (sur un téléphone non rooté), comment puis-je sauvegarder mon profil à un autre endroit ? Ce serait facile si mon téléphone était enraciné (il suffirait d'accéder directement au dossier et de le copier ailleurs), mais il ne l'est pas.

J'ai essayé de nombreuses choses différentes, dont certaines se sont rapprochées de façon très frustrante, mais rien n'a fonctionné :

  • Utiliser une application comme Helium Backup qui utilise adb pour sauvegarder les données de l'application. Cela fonctionne pour certaines applications, mais pour Firefox, cela me donne une boîte de dialogue "Backup Disallowed" avec le message "Firefox has disallowed backup of application data". Veuillez laisser un commentaire au développeur de Firefox et lui demander d'autoriser la sauvegarde des données de l'application."

  • Utilisation du navigateur pour naviguer dans le répertoire du profil et tenter de télécharger des éléments à partir de là. Je peux clairement voir mon profil en allant à file:///data/data/org.mozilla.firefox/files/mozilla/r3dact3d.default/, et théoriquement des fichiers individuels pourraient être téléchargés en un temps suffisant. Mais tenter d'ouvrir quoi que ce soit ne fait que naviguer vers ce fichier. Cela "fonctionne" pour les fichiers texte comme .ini puisque je peux manuellement copier/coller le contenu, mais pas pour les fichiers binaires (comme le très important browser.db) qui ouvre toujours une page blanche.

  • Je fais ce qui précède, mais en utilisant le débogage USB et en ouvrant WebIDE sur le Firefox de mon ordinateur portable pour faire des recherches. Je peux exécuter un Javascript arbitraire sur la page qui me montre mon répertoire de profil, mais rien ne me permet de télécharger les fichiers qu'elle me montre. Le mieux que je puisse faire est de modifier les balises d'ancrage pour ajouter un attribut de téléchargement (afin qu'elles téléchargent au lieu de naviguer), mais alors tous les liens affichent un message d'erreur "Impossible de télécharger le fichier" dans le pied de page (au lieu de "Téléchargement commencé..." auquel je m'attendrais). Je n'ai aucune idée de la signification de ce message d'erreur particulier, et la recherche sur Google ne m'aide pas.

  • Je fais ce qui précède, mais en maintenant le doigt appuyé sur chaque lien et en choisissant Ouvrir avec une application (au lieu d'Ouvrir le lien dans un nouvel onglet, etc.). Si j'arrive à faire apparaître une application d'exploration de fichiers, elle me donne toujours un message d'erreur similaire "Cet élément ne peut pas être enregistré".

  • J'essaie d'indiquer à Firefox (par le biais de about:config, peut-être) de sauvegarder ou de déplacer mon profil à un endroit différent auquel il ne serait pas nécessaire d'avoir recours à Root. Apparemment, Firefox ne permet pas une telle chose.

  • J'essaie de trouver une fonction de Firefox Sync qui sauvegarde un profil sur le mobile. Cette fonctionnalité ne semble pas exister.

  • Trouver un module complémentaire qui copiera le profil à un autre endroit. Avant Firefox Quantum, il existait un module complémentaire appelé Copy Profile qui faisait exactement la même chose. Ce module complémentaire n'est plus compatible avec Firefox Quantum et je n'arrive pas à trouver de solution de remplacement.

  • Utilisation d'adb pour mettre manuellement à niveau Firefox afin que le profil de copie fonctionne à nouveau. Au moins un utilisateur a j'ai déjà essayé quelque chose de similaire Le résultat est que les données des applications entre Firefox Quantum et Firefox non-Quantum sont configurées de manière suffisamment différente pour que l'application nouvellement rétrogradée se bloque immédiatement à l'ouverture.

J'ai du mal à croire qu'une tâche aussi importante et simple que la sauvegarde de mon profil Firefox soit impossible sur Android non enraciné. Quelqu'un d'autre a-t-il rencontré ce problème ou un problème similaire ? Des solutions ou des suggestions ?

Gracias.

3voto

regulatethis Points 1138

J'ai eu le même problème et j'ai été inspiré par votre idée d'utiliser WebIDE. Il s'avère qu'il est possible d'accéder aux fichiers de profil via JavaScript, du moins dans mon Firefox pour Android version 59.0.2, mais cela n'aide que partiellement à sauvegarder toutes les données de profil.

Principe

Le contenu du fichier peut être consulté en utilisant Ajax ( voir ici ), même s'ils sont binaires ( référence ). Il semble toutefois que vous ne puissiez accéder qu'aux fichiers qui se trouvent dans votre répertoire actuel ou dans un sous-répertoire.

Par exemple, le contenu de browser.db est accessible en naviguant vers file:///data/data/org.mozilla.firefox/files/mozilla/XXXXXXXX.default/ et ensuite l'exécuter dans la console via WebIDE :

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "browser.db");
xmlhttp.responseType = "arraybuffer";
xmlhttp.send();

Le résultat sera ensuite stocké dans xmlhttp.response comme un tampon de tableau. Si les données sont non binaires, "text" peut être utilisé à la place de "arraybuffer" .

Pour les petits fichiers non binaires, il peut être suffisant de les copier dans le presse-papiers avec la commande copy(xmlhttp.responseText) mais pour les gros fichiers, cela peut provoquer une erreur de mémoire.

La même technique peut être utilisée pour obtenir une liste des fichiers et des répertoires. Le problème est que cela (pour moi en tout cas) ne fonctionne que pour le répertoire vers lequel le navigateur a navigué, mais pas pour les sous-répertoires. Les données renvoyées sont une liste de fichiers en texte brut :

300: file:///data/data/org.mozilla.firefox/files/mozilla/XXXXXXXX.default/
200: filename content-length last-modified file-type
201: AlternateServices.txt 0 Thu,%2010%20May%202018%2015:33:20%20GMT FILE 
201: OfflineCache 0 Thu,%2009%20Nov%202017%2018:28:54%20GMT DIRECTORY
...

Sauvegarde

Pour être complet, voici les deux scripts que j'ai utilisés pour sauvegarder les fichiers. Les deux ne sont que des scripts rapides et minimaux. Les données sont transférées vers un serveur Python fonctionnant sur l'ordinateur, qui les stocke ensuite.

Important : Ils ne font que sauvegarder les fichiers dans le répertoire courant, mais pas les répertoires (Voir la limitation ci-dessus). Cependant, puisque la plupart du profil se trouve dans le répertoire racine, cela peut être suffisant. Si vous souhaitez également stocker les fichiers dans les sous-répertoires, vous devez coller et exécuter à nouveau le JavaScript pour chaque répertoire. Les répertoires nécessaires seront créés par le serveur.

Serveur Python (enregistrez ceci comme server.py puis exécuté, par exemple, avec python3 server.py 2222 en fonction du port que vous souhaitez utiliser)

import os
from http.server import BaseHTTPRequestHandler, HTTPServer

class FileReceiveHandler(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()

    def do_POST(self):
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        post_data = self.rfile.read(content_length) # <--- Gets the data itself
        print(self.path)

        # Store file
        relative_file_path = os.path.join('received_files', self.path.lstrip('/'))
        directories = os.path.dirname(relative_file_path)
        os.makedirs(directories, exist_ok=True)
        with open(relative_file_path, 'wb') as f:
            f.write(post_data)

        self._set_headers()
        self.wfile.write(b'received')

if __name__ == '__main__':
    from sys import argv
    port = int(argv[1]) if len(argv) == 2 else 80
    server_address = ('', port)
    httpd = HTTPServer(server_address, FileReceiveHandler)
    print('Starting server')
    httpd.serve_forever()

Ce site est la source que j'ai utilisée comme référence pour le serveur.

Source JavaScript pour le navigateur

Adaptez les deux premières lignes à votre propre chemin de profil et à l'adresse IP et au port locaux. Collez ensuite ce script directement dans la console de WebIDE avec le navigateur naviguant vers le répertoire du profil.

var profile_basepath = "file:///data/data/org.mozilla.firefox/files/mozilla/XXXXXXXX.default";
var server = "http://<your_local_ip>:2222";

function send() {
    var list_xmlhttp = new XMLHttpRequest();

    // Get files
    list_xmlhttp.onreadystatechange = function() {
        if(list_xmlhttp.status == 200 && list_xmlhttp.readyState == 4){
            itemslist = list_xmlhttp.response.split('\n');

            for (var i = 0; i < itemslist.length; i++) {
                if (itemslist[i].startsWith('201:')) {
                    parts = itemslist[i].split(' ');
                    if (parts[4] == 'FILE') {
                        handleFile(parts);
                    }
                }
            }
            console.log(itemslist);
        }
    };
    list_xmlhttp.open("GET", window.location.href, true);
    list_xmlhttp.responseType = "text";
    list_xmlhttp.send();
}

function handleFile(parts) {
    var filename = JSON.parse(JSON.stringify(parts[1]));

    // Get file content
    var file_xmlhttp = new XMLHttpRequest();
    file_xmlhttp.onreadystatechange = function() {
        if(file_xmlhttp.status == 200 && file_xmlhttp.readyState == 4){
            // Send file
            var filepath = window.location.href.substring(profile_basepath.length) + filename;
            var send_xmlhttp = new XMLHttpRequest();
            send_xmlhttp.open("POST", server + filepath, true);
            send_xmlhttp.send(file_xmlhttp.response);

            console.log(filepath + " sent");
        }
    }
    file_xmlhttp.open("GET", window.location.href + parts[1], true);
    file_xmlhttp.responseType = "arraybuffer";
    file_xmlhttp.send();
}

send();

Cela peut prendre un certain temps jusqu'à ce que le script soit terminé.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X