среда, 28 января 2015 г.

Как отменить разрешение на запись в TiddlyFox

Сначала немного о предмете разговора. Есть такая полезная штука: TiddlyWiki. Это вроде как wiki (с поиском, тегами и прочим), но представляет собой один большой HTML-файл, у которого внутри много-много всякого JavaScript, на котором вся функциональность и написана. Понадобилось что-нибудь записать, открыл файл в браузере, записал, а оно себя автоматически в свой файл сохранило.

Раньше сохранение работало просто так, «из коробки». Но потом браузеры начали развиваться, думать о безопасности и в конце концов додумались, что давать скриптам доступ на запись к жёсткому диску как-то не комильфо. И автору TiddlyWiki пришлось изобретать обходные пути – штука-то полезная!



Для Firefox таким обходным путём является расширение TiddlyFox. Его надо просто поставить, а потом, когда первый раз открываешь файл со своей wiki, он спрашивает: «Хотите разрешить этому файлу сохраняться на диск?» Если ответить «да», то wiki сможет писать свои данные на диск, а предупреждение больше отображаться не будет.

Я пользовался TiddlyWiki уже давно. И, поскольку недавно вышла новая версия с кучей всего нового и полезного, решил я обновиться.

Обновление делается просто. Качаем с официального сайта файлик upgrade.html, сделанный на основе той же TiddlyWiki, открываем его в браузере и перетаскиваем в окно браузера свой файл, нуждающийся в обновлении. Оно там всё внутри перепиливает под новые стандарты и предлагает сохранить результат. Нажимаем кнопочку, сохраняем файл – и копируем его на старое место.

И вот я, как положено, скачал upgrade.html, положил себе в Dropbox (где все остальные wiki лежат) и запустил в браузере. Оно спросило разрешения на сохранение, я разрешил. Обновил свою рабочую wiki, а когда полез обновлять wiki со стихами, обнаружил, что upgrade.html превратился в точную копию рабочей wiki, которую я только что обновлял.

Скачать новый upgrade.html несложно. Но ведь при всяком обновлении он будет портиться, а запретить ему запись на диск я не могу – нет такой функции. Да, не надо было давать права! Как бы их отобрать обратно?

Беглые поиски в Интернете результатов не дали. То ли я не владею английским в должной мере, то ли никто с такой задачей не сталкивался. Что ж, спасение утопающих, как известно, дело рук самих утопающих!

Берём в руки файл расширения tiddlyfox.xpi. Две буквы PK, стоящие в начале, дают нам понять, что это переименованный .zip. Переименовываем его в tiddlyfox.zip, распаковываем и ищем файлы с расширением .js. Их немного и они короткие.

Вот и нашёлся нужный файл: content/overlay.js. Почему именно он? Потому что в нём есть текст вопроса, задающегося при открытии wiki:

approved = confirm("TiddlyFox: Do you want to enable TiddlyWiki file saving capability for " + uri);

Чудесно! Что там дальше происходит с нашим approved?

if(approved) {
    // Save the approval for next time
    setPermission(uri);
    TiddlyFox.injectMessageBox(doc); // Always inject the message box
    if(isTiddlyWikiClassic) {
        TiddlyFox.injectScript(doc); // Only inject the script for TiddlyWiki classic
        }
}

Ага! То есть, разрешение на запись даётся в функции setPermission(). И что же в ней написано?

function setPermission(uri) {
    try {
        var pm = Components.classes["@mozilla.org/permissionmanager;1"].createInstance(Components.interfaces.nsIPermissionManager);
        pm.add(makeURI(uri),TiddlyFox.TIDDLYFOX_PERMISSION,pm.ALLOW_ACTION,pm.EXPIRE_NEVER,0);
    } catch(e) {
        
    }
}

Из написанного становится ясно, что разрешения устанавливаются в каких-то потрохах Firefox-а, и что поменять их без долгих разбирательств будет нелегко. Что ж, если это потроха Firefox, то отправимся туда, где они хранятся – в профиль пользователя.

В профиле среди кучи файлов обнаружился permissions.sqlite. Это, судя по расширению, база данных в формате SQLite. Установим-ка программку для работы с ней:

$ sudo aptitude install sqlite3

Теперь откроем базу (командой sqlite3 permissions.sqlite) и посмотрим, что внутри.

Команда .tables говорит нам, что в базе содержится всего одна таблица под названием moz_hosts. Чтобы просмотреть её содержимое выполняем простенький запрос:

select * from moz_hosts;

На нас вываливается простыня текста, в конце которой есть упоминание upgrade.html под номером 97.

95|mpsnare.iesnare.com|falsestart-rsa|1|2|1421171906408|0|0
96|www.evernote.com|falsestart-rsa|1|2|1421430145408|0|0
97|file:///home/morthan/Dropbox/tiddly/upgrade.html|tiddlyfox.saving.permission|1|0|0|0|0

Нужно удалить эту строчку и всё будет нормально. А как называется поле номера?

sqlite> .schema moz_hosts
CREATE TABLE moz_hosts ( id INTEGER PRIMARY KEY,host TEXT,type TEXT,permission INTEGER,expireType INTEGER,expireTime INTEGER,appId INTEGER,isInBrowserElement INTEGER);


Ясно, это поле называется id. Тогда пишем запрос на удаление:

delete from moz_hosts where id=97;

И выходим командой .quit.

Открываем upgrade.html в браузере... Вуаля! Firefox опять спрашивает, разрешить ли ему запись! Но на этот раз я такой ошибки уже не сделаю. :-)

Комментариев нет:

Отправить комментарий