Я пишу java апплут который читает кики (cookies) FireFoxа. Как (получить доступ, если необходимо и) читать файл (базу данных) cookies.sqlite (используя Java)?

Я попробовал с драйвером org.sqlite.JDBC но безуспешно. Получил следующий ексепшен: file is encrypted or is not a database.
Также пробовал SqlJetDb и получил ексепшин "org.tmatesoft.sqljet.core.SqlJetException: NOTADB: error code is NOTADB"
Есть ли необходимым расшифровка файла куки и нужно ли получать какой либо вид доступа к нему?
Спасибо.

CodeGust
Нет, файл этот незашифрован, и каких-либо особых прав доступа не требует. Из javascript-кода он открывается очень просто и незамысловато:

Выделить код

Код:

var dbFile=Services.dirsvc.get("ProfD", Ci.nsIFile);
dbFile.append("cookies.sqlite");
var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
var mDBConn = ssvc.openDatabase(dbFile);
var stmt=mDBConn.createStatement("select distinct host from moz_cookies order by 1");
var hosts=[];
while (stmt.step()) hosts.push(stmt.row.host);
stmt.finalize();
mDBConn.close();
Services.console.logStringMessage(hosts.join("\n"));

Спасибо! Выглядит эффективно, но я немогу заставить этот код работать.

Вод мои модификации, что неверно? Начальный код также не работает.

Выделить код

Код:

function readFF()
        {
            var dbFile=Services.dirsvc.get("C:\\Users\\MyUserName\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\q6xxxxxx.default\\", Ci.nsIFile);
            dbFile.append("cookies.sqlite");
            var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
            var mDBConn = ssvc.openDatabase(dbFile);
            var stmt=mDBConn.createStatement("select distinct host from moz_cookies order by 1");
            var stmt2=mDBConn.createStatement("select distinct name from moz_cookies order by 1");
            var stmt3=mDBConn.createStatement("select distinct expiry from moz_cookies order by 1");
            var hosts=[];
            var names=[];
            var expiries=[];
            while (stmt.step()) { 
                    hosts.push(stmt.row.host);
                    document.frm1.txt1.value += stmt.row.host; 
             }
            while (stmt2.step()) { 
                    names.push(stmt2.row.name);
                    document.frm1.txt2.value += stmt2.row.host;
            }
            while (stmt3.step()) {                    
                    expiries.push(stmt3.row.expiry);
                    document.frm1.txt3.value += stmt3.row.host; 
            }
            stmt.finalize();
            stmt2.finalize();
            stmt3.finalize();
            mDBConn.close();
            //Services.console.logStringMessage(hosts.join("\n"));
        }
</script> 
</head>
<body onload="readFF();">
hydrolizer пишет

CodeGust
Нет, файл этот незашифрован, и каких-либо особых прав доступа не требует. Из javascript-кода он открывается очень просто и незамысловато:

Выделить код

Код:

var dbFile=Services.dirsvc.get("ProfD", Ci.nsIFile);
dbFile.append("cookies.sqlite");
var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
var mDBConn = ssvc.openDatabase(dbFile);
var stmt=mDBConn.createStatement("select distinct host from moz_cookies order by 1");
var hosts=[];
while (stmt.step()) hosts.push(stmt.row.host);
stmt.finalize();
mDBConn.close();
Services.console.logStringMessage(hosts.join("\n"));
CodeGust пишет

Вод мои модификации, что неверно?

То, что вы пытаетесь приведенный мною код использовать в скрипте html-страницы - система безопасности не позволит вам этого сделать, т.к. это код для trusted content (для расширения, например). И Services.dirsvc.get не принимает в качестве параметра пути, этот метод принимает ключи, указывающие на спец. папки; ключ ProfD в моем примере - это и есть ключ для папки профиля. Если нужен абсолютный путь, придется действовать так.

Я могу запустить скрипт следующим образом с Java приложения? :

Выделить код

Код:

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval(new FileReader("script.js"));
System.out.println(engine.get("hosts[1]"));

(дает ексепшин sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "Services" is not defined.)

hydrolizer пишет
CodeGust пишет

Вод мои модификации, что неверно?

То, что вы пытаетесь приведенный мною код использовать в скрипте html-страницы - система безопасности не позволит вам этого сделать, т.к. это код для trusted content (для расширения, например). И Services.dirsvc.get не принимает в качестве параметра пути, этот метод принимает ключи, указывающие на спец. папки; ключ ProfD в моем примере - это и есть ключ для папки профиля. Если нужен абсолютный путь, придется действовать так.

CodeGust
Чтобы Services были defined, их надо импортировать - в начале кода вставьте

Выделить код

Код:

Components.utils.import("resource://gre/modules/Services.jsm");

И, думаю, дальше у вас код рванет на undefined Сс и Ci - это шорткаты для Components.classes и Components.interfaces. Тоже в начале кода вставьте

Выделить код

Код:

const { classes: Cc, interfaces: Ci } = Components;

Спасибо, добавил. Теперь дает ексепшин sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator

Выделить код

Код:

Components.utils.import("resource://gre/modules/Services.jsm");
const { classes: Cc, interfaces: Ci } = Components;

var dbFile=Services.dirsvc.get("ProfD", Ci.nsIFile);
dbFile.append("cookies.sqlite");
var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
var mDBConn = ssvc.openDatabase(dbFile);
var stmt=mDBConn.createStatement("select distinct host from moz_cookies order by 1");
var hosts=[];
while (stmt.step()) hosts.push(stmt.row.host);
stmt.finalize();
mDBConn.close();
Services.console.logStringMessage(hosts.join("\n"));

Теперь я внес изменение:
заменил
Components.utils.import("resource://gre/modules/Services.jsm");
на
Components.utils["import"]("resource://gre/modules/Services.jsm");

Новый ексепшин:
sun.org.mozilla.javascript.internal.EvaluatorException: identifier is a reserved word
в строчке
const { classes: Cc, interfaces: Ci } = Components;

Получаю другой ексепшин при модификации: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "Components" is not defined. (<Unknown source>#1) in <Unknown source> at line number 1

Выделить код

Код:

Components.utils["import"]("resource://gre/modules/Services.jsm");
var dbFile=Services.dirsvc.get("ProfD", Components.interfaces.nsIFile);
dbFile.append("cookies.sqlite");
var ssvc=Components.classes["@mozilla.org/storage/service;1"].getService(Components.interfaces.mozIStorageService);
var mDBConn = ssvc.openDatabase(dbFile);
var stmt=mDBConn.createStatement("select distinct host from moz_cookies order by 1");
var hosts=[];
while (stmt.step()) hosts.push(stmt.row.host);
stmt.finalize();
mDBConn.close();
Services.console.logStringMessage(hosts.join("\n"));
CodeGust пишет

sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "Components" is not defined

Я не знаю, в каком контексте работает ScriptEngineManager. Остается только предположить, что это контекст обычной веб-страницы, где недоступны XPCOM-компоненты и глобальные объекты chrome-контекста (контекста, в котором работает код расширений).

А откуда тогда идет запуск этого кода? В среде браузера как расширение?

CodeGust пишет

А откуда тогда идет запуск этого кода? В среде браузера как расширение?

Да. Можно попробовать, например, установить расширение Custom Buttons, и вставить этот код в новую кнопку. Потом посмотреть результат в консоли.

Just in case anybody will need it I have downloaded the latest sqlite jdbc 3.7.2 and now everything works fine.

Выделить код

Код:

Connection connection = null;
ResultSet resultSet = null;
Statement statement = null;
HashMap<String, String> firefoxHashMap = new HashMap<String, String>();
 
try {
        Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite:" + ffArrIndex[i]);
        statement = connection.createStatement();
        resultSet = statement.executeQuery("SELECT * FROM moz_cookies");
 
        while (resultSet.next()) {
                key = resultSet.getString("baseDomain");
                
                if (firefoxHashMap.isEmpty()) {
                        firefoxHashMap.put(key + firefoxLinkColor, "Id: " + resultSet.getString("id") + "\n");
                }
        }
} catch(Exception e) {}