>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Чтение (доступ к) файлу cookies.sqlite (с помощью Java) http://forum.mozilla-russia.org/viewtopic.php?id=50545 |
CodeGust > 04-07-2011 23:45:13 |
Я пишу java апплут который читает кики (cookies) FireFoxа. Как (получить доступ, если необходимо и) читать файл (базу данных) cookies.sqlite (используя Java)? Я попробовал с драйвером org.sqlite.JDBC но безуспешно. Получил следующий ексепшен: file is encrypted or is not a database. |
hydrolizer > 05-07-2011 06:28:36 |
CodeGust Выделить код Код: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 > 06-07-2011 04:09:08 |
Спасибо! Выглядит эффективно, но я немогу заставить этот код работать. Вод мои модификации, что неверно? Начальный код также не работает. Выделить код Код: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 пишет
|
hydrolizer > 06-07-2011 05:05:14 |
CodeGust пишет
То, что вы пытаетесь приведенный мною код использовать в скрипте html-страницы - система безопасности не позволит вам этого сделать, т.к. это код для trusted content (для расширения, например). И Services.dirsvc.get не принимает в качестве параметра пути, этот метод принимает ключи, указывающие на спец. папки; ключ ProfD в моем примере - это и есть ключ для папки профиля. Если нужен абсолютный путь, придется действовать так. |
CodeGust > 06-07-2011 06:17:38 |
Я могу запустить скрипт следующим образом с 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 пишет
|
hydrolizer > 06-07-2011 06:29:04 |
CodeGust И, думаю, дальше у вас код рванет на undefined Сс и Ci - это шорткаты для Components.classes и Components.interfaces. Тоже в начале кода вставьте |
CodeGust > 06-07-2011 06:38:19 |
Спасибо, добавил. Теперь дает ексепшин 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")); |
CodeGust > 07-07-2011 01:51:08 |
Теперь я внес изменение: Новый ексепшин: Получаю другой ексепшин при модификации: 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")); |
hydrolizer > 07-07-2011 06:14:45 |
CodeGust пишет
Я не знаю, в каком контексте работает ScriptEngineManager. Остается только предположить, что это контекст обычной веб-страницы, где недоступны XPCOM-компоненты и глобальные объекты chrome-контекста (контекста, в котором работает код расширений). |
CodeGust > 07-07-2011 11:54:13 |
А откуда тогда идет запуск этого кода? В среде браузера как расширение? |
hydrolizer > 07-07-2011 12:56:14 |
CodeGust пишет
Да. Можно попробовать, например, установить расширение Custom Buttons, и вставить этот код в новую кнопку. Потом посмотреть результат в консоли. |
CodeGust > 18-10-2011 03:57:16 |
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) {} |