Страницы: 1
Я пишу 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();">
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"));
Отсутствует
Вод мои модификации, что неверно?
То, что вы пытаетесь приведенный мною код использовать в скрипте 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.)
CodeGust пишетВод мои модификации, что неверно?
То, что вы пытаетесь приведенный мною код использовать в скрипте html-страницы - система безопасности не позволит вам этого сделать, т.к. это код для trusted content (для расширения, например). И Services.dirsvc.get не принимает в качестве параметра пути, этот метод принимает ключи, указывающие на спец. папки; ключ ProfD в моем примере - это и есть ключ для папки профиля. Если нужен абсолютный путь, придется действовать так.
Отсутствует
CodeGust
Чтобы Services были defined, их надо импортировать - в начале кода вставьте
И, думаю, дальше у вас код рванет на undefined Сс и Ci - это шорткаты для Components.classes и Components.interfaces. Тоже в начале кода вставьте
Отсутствует
Спасибо, добавил. Теперь дает ексепшин 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 (07-07-2011 02:12:12)
Отсутствует
sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "Components" is not defined
Я не знаю, в каком контексте работает ScriptEngineManager. Остается только предположить, что это контекст обычной веб-страницы, где недоступны XPCOM-компоненты и глобальные объекты chrome-контекста (контекста, в котором работает код расширений).
Отсутствует
А откуда тогда идет запуск этого кода? В среде браузера как расширение?
Да. Можно попробовать, например, установить расширение 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) {}
Отредактировано CodeGust (18-10-2011 04:03:43)
Отсутствует
Страницы: 1