- PVSM.RU - https://www.pvsm.ru -
Когда начались утечки баз паролей/хэшей с разных форумов и соц. сетей я начал задумываться о том как и где хранить свои пароли, что бы их можно было быстро менять и при этом не забыть. Так я наткнулся на программу KeePass Password Safe [1], о её возможностях я расписывать не буду так как на Хабре статей предостаточно [2] и тематика данной статьи не о его возможностях. По мере эксплуатации KeePass обрастал плагинами, особенно для связки с браузерами, LastPass [3] был отброшен так как не хотелось где-то «у дяди» хранить пароли (особенно к рабочим системам), да и не факт, что их от туда тоже не сольют.
Сначала для Firefox было расширение KeeFox [4], но так как через KeePassRPC [5] (плагин KeePass) работает только оно — то сейчас это расширение давно отключено и не используется. Затем было найдено расширение PassIFox [6] (работает через плагин KeePass — KeePassHttp [7]) с ним же сразу и ChromeIPass [8] — а вот для Opera 11, Opera 12 (здесь и в дальнейшем подразумевается на движке Presto и это мой основной браузер) хорошей интеграции не было, был только UserJS-скрипт добавляющий в заголовок окна адрес страницы, было даже создано расширение [9] делающее тоже самое — для того чтобы KeePass мог определить адрес для которого нужно искать логин и пароль для подстановки по Ctrl+Alt+A (стандартный хот-кей авто-заполнения KeePass). Так как современных навыков по JavaScript у меня нет, я попытал счастья на OperaFan [10] с просьбой написать/переделать расширение для Opera — где меня и назвали параноиком. Продолжение истории о портировании ChromeIPass в Opera 12 (без сильно технических деталей) под катом.
Сразу оговорюсь, что не всё мне удалось портировать, но для меня получилось довольно работоспособно с учётом отсутствия альтернативы. Прошу не пинать за ляпы и ошибки реализации. Если кто что подскажет, поправит буду благодарен.
Понимаю, что Opera на движке Presto — это уже труп, но как писал выше — это мой основной браузер и пока я не вижу ему замены в плане потребления памяти, скорости и возможности допилить функционал. Использую последнюю сборку Opera AC с допиленными под себя плюшками.
Для портирования в Opera было выбрано расширение ChromeIPass так как посмотрев во внутрь его и расширения LastPass, RoboForm Lite [11] и увидев приблизительно похожие вызовы для Оперы и Хрома — я сделал предположение что они наиболее близки (со временем я понял, что сильно ошибался).
Первым пациентом была выбрана на то время версия ChromeIPass 1.0.7. Не было функционала запоминания паролей, скудно малые познания о написании расширений и их взаимодействии с браузером, мало свободного времени, расширение LastPass так же как и RoboForm были написаны универсальными сразу под Opera,Chrome и Safari и имели огромные размеры. Была простая замена chrome.extension.sendMessage на opera.extension.postMessage с естественным «epic fail». В общем предприняв несколько попыток я так и забросил портирование, хотя скриптов было мало и я был готов смириться с добавлением паролей через сам KeePass.
Два месяца назад я обнаружил, что версия ChromeIPass уже 2.6.6 и в нём появился функционал запоминания паролей и ещё ряд плюшек. И оно даже без каких либо изменений работает в Opera (на движке blink), подсунув в режиме разработчика, потом можно и конвертнуть в NEX.
В этот раз было принято решение однозначно добиться рабочего результата. Основательно почитав о взаимодействии Injected script, Background script и Popup script в Opera, погуглив, глянув в другие расширения, облазив уже закрытые форум и блоги на My Opera (пришлось даже копаться в Web Archive и кэше гугля) — я приступил к работе.
Был создан config.xml, переложены файлы в нужные директории, произведена замена chrome.extension.sendMessage на opera.extension.postMessage (в некоторых местах на e.source.postMessage где нужно было отвечать на событие — а не просто отсылать, e — это событие, т.к. в ChromeIPass есть объект event определённый в event.js).
Переделаны все вызовы с использованием механизма callback в Chrome на просто отсылку событий и добавлены реакции на эти события в обработчиках событий, там где эти callback-функции определены.
Переделаны chrome.tabs.*.addListener на opera.extension.tabs.* (для Оперы события обязательно в нижнем регистре иначе не работает) в init.js.
opera.extension.tabs.onupdate в Opera (chrome.tabs.onUpdated.addListener в Chrome) не отрабатывает.
Включена отладка (вывод сообщений в консоль) где была, добавление своих отладочных сообщений, что бы понять что и как и с чем взаимодействует.
Добавлено новое расширение в режиме разработчика в отдельно установленую оперу и запущен Dragonfly.
Очень много полезного было взято из постов и блога пользователя Joel Spadin aka spadija на my.opera.com и его расширений tab vault [12], autostack [13].
Для начала проверил как расширение работает с KeePass, в этой части почти ничего не переделывал.т.к. работает «на ура».
Было сделано внедрение CSS (было тут [14]), как потом обнаружил тот же способ используется в документации [15]
Потом была борьба за последовательность загрузки Injected scripts (в ChromeIPass их три: основной и два переделанных jQuery и jQuery UI). В Хроме с этим полегче чем в Опере.
Решение было найдено на форуме my.opera (уже недоступно) и для jQuery (в ChromeIPass jQuery переименован в cIPJQ, что бы не было конфликтов с подгружаемым jQuery с сайтов) был добавлен код его инициализации в init.js, что бы не вываливал ошибок и работал
var cIPJQ;
if (typeof cIPJQ === 'undefined') {
if (typeof window.cIPJQ !== 'undefined') {
cIPJQ = window.cIPJQ.noConflict(true);
} else {
opera.postError(['Error: could not load jQuery']);
}
}
Наступил на грабли, что opera.extension.bgProcess это объект window — а не сам background script.
Переделана работа с заменой адресов для popup, решение было взято отсюда [16], пока ещё есть в кэше гугля.
А вот с портами пришлось повозиться дольше всего. Так если сделать передачу порта от popup script в injected script и обратно (как указано в документации [17]) напрочь перестаёт работать e.source.postMessage на события от popup script в background script. Пришлось создавать ещё один MessageChannel для работы popup script c background script. И «понатыкивать» закрытия этих всех MessageChannel, т.к. есть проблемы что при создании табов функция opera.extension.tabs.getSelected() возвращает таб с port=null.
Для внедрения картинок сначала попробовал opera.extension.getFile() [18], но она оказалась асинхронной, по-этому загрузку картинок реализовал так же как и загрузку CSS (через XMLHttpRequest) и при внедрении стилей производил замену на base64 закодированные картинки.
Собственно само расширение:
rghost [19], sendspace [20]
с не закомментированными postError
rghost [21], sendspace [22]
<access origin="http://localhost:19455"/> в config.xml из-за ограничений в спецификации [23] по которой реализован контроль сетевого доступа расширений в Опере.Спасибо за внимание!
Автор: SkyRE
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/57302
Ссылки в тексте:
[1] KeePass Password Safe: http://keepass.info/
[2] предостаточно: http://habrahabr.ru/search/?q=KeePass
[3] LastPass: https://lastpass.com/
[4] KeeFox: http://keefox.org/
[5] KeePassRPC: http://keefox.org/2010/03/24/keepassrpc-plugin/
[6] PassIFox: https://addons.mozilla.org/en-US/firefox/addon/passifox/
[7] KeePassHttp: https://github.com/pfn/keepasshttp/
[8] ChromeIPass: http://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae?hl=en
[9] расширение: https://addons.opera.com/en/extensions/details/keepass-auto-type/
[10] OperaFan: http://operafan.net/forum/index.php?topic=18474.msg184329#msg184329
[11] RoboForm Lite: https://addons.opera.com/en/extensions/details/roboform-lite/
[12] tab vault: https://addons.opera.com/en/extensions/details/tab-vault/
[13] autostack: https://addons.opera.com/en/extensions/details/autostack/
[14] было тут: http://my.opera.com/community/forums/topic.dml?id=777482
[15] документации: http://dev.opera.com/articles/view/opera-extensions-prototypes-modifying-css
[16] отсюда: http://webcache.googleusercontent.com/search?q=cache:Ih5WL38BdAgJ:my.opera.com/community/forums/findpost.pl%3Fid%3D13297612+&cd=1&hl=ru&ct=clnk&gl=sk&client=opera
[17] как указано в документации: http://dev.opera.com/articles/view/opera-extensions-messaging/#popup_injectedscript
[18] opera.extension.getFile(): http://dev.opera.com/articles/view/extensions-api-resourceloader-getfile/
[19] rghost: http://rghost.ru/53154991
[20] sendspace: http://www.sendspace.com/file/765qq3
[21] rghost: http://rghost.ru/53155054
[22] sendspace: http://www.sendspace.com/file/9pgccc
[23] спецификации: http://www.w3.org/TR/widgets-access/#the-access-element
[24] спецификацию: http://dev.w3.org/2006/webapi/clipops/clipops.html
[25] Источник: http://habrahabr.ru/post/216239/
Нажмите здесь для печати.