После новости про украденную базу паролей на LinkedIn, задумался о безопасности своих паролей.
Стал искать менеджер паролей под Ubuntu 12.04, остановился на KeePassX. Он меня полностью устроил, если бы не одна мелочь: в Ubuntu 12.04 я пользуюсь Gnome Classic, и Indicator Applet Complete для часов/systray. А этот апплет рисует меню по нажатию на иконку программы левой клавишей мышки, а при нажатии на правую — рисует свои меню. И если свернуть KeePassX в трэй, то восстановить его оттуда нельзя никак.
Пытался решить проблему несколькими путями: попробовал написать на форуме, нашел такой же баг, висящий аж с 2011 года, но, похоже, автор все силы бросил на KeePassX 2, и первую версию забросил.
Ну что же, тварь я дрожащая, или право имею программист? Я решил исправить проблему самостоятельно, а именно, путем добавления нового пункта в Systray меню, то есть чтобы можно было показать главное окно из меню systray.
Предупреждаю сразу, многим статья не будет интересна, это мой первый опыт с QT, да и на C/C++ последний раз писал году в 1999, и помню лишь базовые вещи. Статью решил написать, т.к. это мой первый успешный опыт изменения OpenSource программ на QT, может, кому-то это пригодится.
Если все еще интересно, добро пожаловать под кат.
Настройка проекта
Качаем исходные коды тут, распаковываем. Дальше работать будем в папке исходников.
Устанавливаем нужные библиотеки, и QT Creator заодно
$ sudo apt-get install build-essential qt4-qmake libxtst-dev qtcreator
Убедимся, что все библиотеки на месте:
$ qmake && make
Если все в порядке, то проект скомпилируется и можно будет запустить программу из каталога bin.
Запускаем QT Creator (у меня он находится в Applications/Programming), открываем проект keepassx.pro
Можно так же разрешить дебаг, в KeePassX он включается через явное задание переменной в src.pro:
Проверяем, что проект настроен верно: Build -> Build All, затем кнопка Run.
Добавляем пункт меню
QT использует event-модель, когда компоненты публикуют некие события (называемые Action), и на эти события можно подписаться.
Для начала добавим новое событие. Открываем форму MainWindow.ui, далее во вкладке Action Editor добавляем новое событие
Сохраняем, и тут первый сюрприз, который отнял у меня пару часов: QT Creator добавляет отсебятину в код формы. Так что нужно два раза кликнуть на элемент таблицы (в котором отображается список паролей для текущей группы, на форме он справа вверху) и убрать колонку «1».
Далее нужно добавить этот Action в меню. Открываем mainwindow.cpp, идем в самый конец метода setupMenus и меняем код следующим образом:
SysTrayMenu = new QMenu(APP_DISPLAY_NAME,this);
SysTrayMenu->addAction(ShowHideAction); // тут добавляем новый пункт меню, при нажатии на который будет происходить событие ShowHideAction
SysTrayMenu->addAction(FileUnLockWorkspaceAction);
SysTrayMenu->addSeparator();
SysTrayMenu->addAction(FileExitAction);
SysTray->setContextMenu(SysTrayMenu);
Теперь настало время написать метод, который будет вызываться при нажатии на наш элемент меню.
Без лишних заморочек, пишем в конце mainwindow.cpp
void KeepassMainWindow::OnShowHide(){
OnSysTrayActivated(QSystemTrayIcon::Trigger);
}
То есть просто вызываем уже существующий метод, который должен бы срабатывать при клике на иконку в трее, но не срабатывает.
Не забудем и про заголовки: меняем mainwindow.h, в private slots добавляем строку
void OnShowHide();
И последнее, теперь нужно связать событие ShowHideAction с методом OnShowHide. В конец метода setupConnections() добавляем
connect(ShowHideAction,SIGNAL(triggered()), this, SLOT(OnShowHide()));
Сохраняем все и пробуем запустить. Если все сделано правильно, то должен появится новый пункт в меню
Установка и сборка пакета
Теперь настало время установить новую версию в систему. Идем в терминал, на всякий случай перекомпилируем все тем же путем, как делали это в начале статьи, и затем выполняем
sudo checkinstall
Checkinstall спросит у вас пару вопросов, можно оставить все по-умолчанию, но рекомендую поменять версию на что-то типа 0.4.3-1, чтобы предотвратить откат к старой версии при обновлении пакетов.
Все, когда команда отработает, вы получите установленный KeePassX и заодно .deb пакет, который можно установить на другую машину.
Исходники доступны тут: github.com/relgames/keepassx
Автор: relgames