2019-07-10

「ブラウザー統合」を有効にしたKeePassXCがビルドできた

dynabook SS SX/15AにNetBSDを入れて利用しています。このマシンには元々はMicrosoft Windows Vistaが入っていました。その頃に利用していたIDMというパスワード管理ソフトの代替を探していましたが、KeePassXCが良さそうなので使ってみることにしました。手間暇を惜しむためにpkginを利用して出来合いのバイナリパッケージを使うことにしています。

KeePassXCを起動してみると、なぜか設定画面に「ブラウザー統合」がありません。調べてみたところ、どうやらpkgsrcから作成すると「ブラウザー統合」が無効になっていることが分かりました。そこで「ブラウザー統合」を有効にしたものをpkgsrcから自前でビルドしてみようと思います。

ところがビルドしようとしたらエラーが出ました。
[  5%] Built target keepassxcbrowser_autogen
[  5%] Building CXX object src/browser/CMakeFiles/keepassxcbrowser.dir/NativeMessagingBase.cpp.o
In file included from /usr/include/stddef.h:37:0,
                 from /usr/include/g++/cstddef:50,
                 from /usr/pkg/qt5/include/QtCore/qglobal.h:46,
                 from /usr/pkg/qt5/include/QtCore/qatomic.h:41,
                 from /usr/pkg/qt5/include/QtCore/QAtomicInteger:1,
                 from /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.h:22,
                 from /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp:19:
/usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp: In member function 'void NativeMessagingBase::newNativeMessage()':
/usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp:65:5: error: invalid static_cast from type 'std::nullptr_t' to type 'intptr_t {aka int}'
     EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, nullptr);
     ^
*** Error code 1

Stop.
make[2]: stopped in /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/build
*** Error code 1

このエラーを見るとEV_SET()に問題がありそうです。調べてみると、EV_SET()が使われているのは、どうやらここだけのようです。
% find work/keepassxc-2.4.0/src -type f | xargs grep EV_SET
work/keepassxc-2.4.0/src/browser/NativeMessagingBase.cpp:    EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, nullptr);

しかも、この箇所はLINUX以外のUNIX系OSにしか影響がないようです。ソースの変更状況を確認するとKeePassXC 2.3.0-betaの頃に入ったコードのようです。
    53  void NativeMessagingBase::newNativeMessage()
    54  {
    55  #if defined(Q_OS_UNIX) && !defined(Q_OS_LINUX)
    56      struct kevent ev[1];
    57      struct timespec ts = {5, 0};
    58
    59      int fd = kqueue();
    60      if (fd == -1) {
    61          m_notifier->setEnabled(false);
    62          return;
    63      }
    64
    65      EV_SET(ev, fileno(stdin), EVFILT_READ, EV_ADD, 0, 0, NULL);
    66      if (kevent(fd, ev, 1, nullptr, 0, &ts) == -1) {
    67          m_notifier->setEnabled(false);
    68          ::close(fd);
    69          return;
    70      }
    71
    72      int ret = kevent(fd, NULL, 0, ev, 1, &ts);
    73      if (ret < 1) {
    74          m_notifier->setEnabled(false);
    75          ::close(fd);
    76          return;
    77      }
    78  #elif defined(Q_OS_LINUX)
    79      int fd = epoll_create(5);
    80      struct epoll_event event;
    81      event.events = EPOLLIN;
    82      event.data.fd = 0;
    83      if (epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event) != 0) {
    84          m_notifier->setEnabled(false);
    85          ::close(fd);
    86          return;
    87      }
    88
    89      if (epoll_wait(fd, &event, 1, 5000) < 1) {
    90          m_notifier->setEnabled(false);
    91          ::close(fd);
    92          return;
    93      }
    94  #endif
    95      readLength();
    96  #ifndef Q_OS_WIN
    97      ::close(fd);
    98  #endif
    99  }

EV_SET()に問題がありそうだという事、またLINUX系ディストリビューションには影響がない(から、そちらからのフィードバックで修正される)事は分かりましたが、どのように直したら良いのかわかりません。ただしエラーメッセージを見る分にはキャスト絡みのようです。Webを検索したら「*BSD で kqueue・kevent を使ってみよう」というページが見つかりました。それを見ると、EV_SET()の最後のパラメータはNULLが指定されています。これが問題の原因なのでしょうか。

試しにnullptrNULLに書き換えてみたところ、エラーが消えてビルドに成功しました。ただし、このような変更が正しいのかは、確信がありません。nullptrというのはC++11で導入されたようですが、次のような情報も見つかりました。
  1. NULLとnullptrの違い 
  2. C NULLがC 11 nullptrと等しいか 

ビルド出来ましたが、keepassxc-proxyというのも出来ていました。このためPLISTを変更する必要がありました。
--- PLIST.org   2019-03-23 00:56:41.000000000 +0900
+++ PLIST.new   2019-07-10 09:31:09.155023065 +0900
@@ -1,5 +1,6 @@
 @comment $NetBSD: PLIST,v 1.4 2019/03/22 15:56:41 ryoon Exp $
 bin/keepassxc
+bin/keepassxc-proxy
 bin/keepassxc-cli
 lib/keepassxc/libkeepassx-autotype-xcb.so
 man/man1/keepassxc-cli.1

ちなみにMakefileは次のように変更しました。
--- Makefile.org        2019-03-23 00:56:41.000000000 +0900
+++ Makefile.new        2019-07-10 15:29:19.274685074 +0900
@@ -18,7 +18,7 @@
 USE_CMAKE=     yes
 USE_LANGUAGES= c c++
 CMAKE_ARG_PATH=        ..
-CMAKE_ARGS+=   -DKEEPASSXC_BUILD_TYPE=Release
+CMAKE_ARGS+=   -DKEEPASSXC_BUILD_TYPE=Release -DWITH_XC_BROWSER=ON -DWITH_XC_NETWORKING=ON
 CONFIGURE_DIRS=        build
 
 NOT_PAX_MPROTECT_SAFE+=        bin/keepassxc
@@ -36,6 +36,7 @@
 .include "../../devel/zlib/buildlink3.mk"
 .include "../../graphics/hicolor-icon-theme/buildlink3.mk"
 .include "../../security/libgcrypt/buildlink3.mk"
+.include "../../security/libsodium/buildlink3.mk"
 .include "../../security/argon2/buildlink3.mk"
 .include "../../sysutils/desktop-file-utils/desktopdb.mk"
 .include "../../x11/qt5-qtbase/buildlink3.mk"

0 件のコメント:

コメントを投稿