ラベル KeePassXC の投稿を表示しています。 すべての投稿を表示
ラベル KeePassXC の投稿を表示しています。 すべての投稿を表示

2019-07-12

XML形式の情報をCSV形式に変換したい

Microsoft Windowsで使用しているパスワード管理ソフトIDMの情報はXML形式で保存されています。またNetBSDで使用しようと思っているパスワード管理ソフトKeePassXCではCSV形式の情報を取り込むことができるようです。そこでXML形式の情報をCSV形式に変換する手法を検討しようと思います。

すぐに思いつくのが、手頃なツールでテキスト処理をおこなうことでしょう。pythonであれば、標準ライブラリElementTreeでXMLを扱えますし、同じく標準ライブラリCSVもあります。python以外を使っても構いませんし、XMLパースを行わず、XML形式を意識しないでテキスト処理をおこなうことも可能でしょう。

別な方法としてXSLTを利用することもできるようです。
  1. [XML]xsltprocを使って、XMLをCSVに変換する
  2. xmlからcsvへの変換(xsltprocコマンド)
  3. XML to CSV Using XSLT

XSLTについては、名前だけは知っていますが、実際に使ってみた経験はありません。それを言ったら、pythonでElementTreeやCSVを扱った経験もないのですが、python自体は経験がありますので、その延長線上でなんとかなると思っています。ここでXSLTを使ってみるのも、経験値を上げるには良いのではないかと思っています。

NetBSDではpkgsrcにあるtextproc/libxsltxsltprocが入っているようです。またIBMのサイトに次のような情報も見つけました。
  1. ヒント: XSLT の極意
  2. XSLTはどのような言語か

2019-07-10

KeePassXCの文字化け(「@」→「"」)が復旧

dynabook SS SX/15AにNetBSDを入れ、MATEデスクトップ環境を採用し、利用環境を整えています。ただ残念ながら所々に怪しい動作が残っています。Firefox(pkgsrcから入れるとNightlyになりますが)を入れ、パスワード管理ソフトとしてKeePassXCを入れました。

パスワード管理ソフトとして、Microsoft WindowsではIDMを使っています。NetBSDでは、過去にはKeePassを使おうとしていましたが、よく落ちて不安定なので、あまり利用していませんでした。そこでKeePassを止めてKeePassXCを使ってみることにしました。

KeePassXCを使うのが初めてなので、IDMで利用しているエントリを試しに入れてみて使い勝手を確認してみようとしました。ユーザーIDはメールアドレスなので「@」が含まれています。ところが入力時に「@」が「"」に化けてしまいます。このままでは利用できないので、調査しました。

全ての文字が化けている訳ではないようです(確かめた訳ではありませんが)。「@」が「"」に化けるというのは、ASCII配列キーボードとJIS配列キーボードの相違を思い起こさせます。

問題の在所を絞り込むために、幾つか条件を変えて挙動を確認しました。
  1. rootアカウントで動作を確認しました。rootアカウントではMATEデスクトップ環境を使用しておらず、昔懐かしtwmのシンプルな(質素な?)画面構成です。ここでは問題となっている文字化けが起きませんでした。と言う事は、MATEデスクトップ環境の何かに原因がありそうです。
  2. KeePassXCを起動する前に、環境変数LANGCにして起動してみました。しかし問題となる現象は変わりませんでした。
  3. xevを使ってKeePassXCがブラウザに送っているイベントを調べてみました。やはり「"」を送っているようです。
    KeyPress event, serial 39, synthetic NO, window 0x3200001,
        root 0x7e, subw 0x0, time 1699682, (657,286), root:(811,465),
        state 0x2001, keycode 11 (keysym 0x22, quotedbl), same_screen YES,
        XKeysymToKeycode returns keycode: 48
        XLookupString gives 1 bytes: (22) """
        XmbLookupString gives 1 bytes: (22) """
        XFilterEvent returns: False

MATEデスクトップ環境の設定の中に「キーボード」があるので、調べてみました。すると何故か以下のようなエントリが入っており、しかも「US English」が最上位になっています。
  1. US English
  2. Japanese
  3. Japanese (kana)
  4. Japanese

不思議なのは、キーボードの指定の最上位に「US English」があっても、通常のキー入力には何の問題もないのです。dynabook SS SX/15Aのキーボードは(ノートPCとしての)JIS配列です。これまで使っていて、JIS配列通りにキー入力が出来ています。しかし設定が怪しいので、「デフォルト」ボタンを押したら、「Japanese」のエントリを残して、他の3つのエントリが消えました。

この状態でKeePassXCの動作を確認したところ、問題となっていた文字化けは解消しました。キーボードの指定が変だったのが原因だったようです。

これでKeePassXCは正常に使える状態になったので、利用環境を整える調査を続行しようと思います。

「ブラウザー統合」を有効にしたKeePassXCとFirefoxが接続できない

dynabook SS SX/15AにNetBSDを入れて、利用環境を整えようとしています。ブラウザとしてFirefoxを使うので、パスワード管理ソフトとしてKeePassXCを使ってみようと考えています。pkginを使って入れた出来合いのバイナリパッケージは、「ブラウザー統合」が有効になっていませんでした。仕方ないので、「ブラウザー統合」が有効になるように定義して、自前でビルドしました。

自前ビルド版KeePassXC 2.4.0を立ち上げると、設定画面に「ブラウザー統合」が現れました。そこでFirefoxを選択したのですが、設定が記憶されません。立ち上げるたびに、Firefoxの設定が外れているので、毎回設定する必要がありますが、何が悪いのか分かりません。

ブラウザ(Firefox)側にはKeePassXCと連携するためのアドオンを入れる必要があります。入れたのですが、エラーが出てしまいます。
Cannot connect to KeePassXC.  Check that browser
integration is enabled in KeePassXC settings.

KeePassXCとブラウザが連携すると使い勝手が良いようなのですが、連携しなくてもKeePassXCは利用できる筈です。ひとまず非連携モードで使ってみました。

試しにエントリを準備してみました。使い勝手は、Microsoft WIndowsで利用ているIDMと似ている気がします。そのような使い勝手であることには納得しましたが、なぜか入力文字列が化けてしまいます。文字が全て化けるのではなく、メールアドレスに使われている「@」が「"」に変化してしまいます。どうしてこうなるのでしょう。これが解決しない事には、KeePassXCを本格的に利用するわけにはいきません。なんとかしたいと思います。

ちなみに、自前でビルドして「ブラウザー統合」が有効になりました。しかしブラウザ側と繋がらないし、なくても良さそうなので、 pkginから導入する出来合いのバイナリパッケージを使うことにしようと思います。

「ブラウザー統合」を有効にした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"

2019-07-09

KeePassXCの「ブラウザー統合」は有効に出来そうだけど、ビルド失敗

dynabook SS SX/15AにNetBSDを入れて利用しています。パスワード管理にKeePassXCを使おうと思いましたが、pkgsrcからビルドされるバイナリには拡張機能「ブラウザー統合」が有効になっていないことが分かりました。

この問題を解決するために、pkgsrcの枠組みに沿って変更するためには、どのようにするのが正しい方法なのか不明です。それは追々調べるとして、まずは「ブラウザー統合」を有効にしたバイナリをビルドしてみようと思います。

まずsecurity/keepassxc/Makefileを以下のように変更してみました。またlibsodiumが必要になるようなので、依存関係の定義を追加しました。libsodiumのパッケージ自体も入れておきます。
--- Makefile.org        2019-03-23 00:56:41.000000000 +0900
+++ Makefile    2019-07-09 20:05:49.976935366 +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"

この状態でビルドさせてみると「ブラウザー統合」が有効になっていることが確認できます。
===> Configuring for keepassxc-2.4.0 keepassxc-2.4.0
*SNIP*
-- Enabled features:
 * Auto-Type, Automatic password typing
 * Networking, Compile KeePassXC with network access code (e.g. for downloading website icons)
 * KeePassXC-Browser, Browser integration with KeePassXC-Browser

-- Disabled features:
 * SSHAgent, SSH agent integration compatible with KeeAgent
 * KeeShare, Sharing integration with KeeShare
 * KeeShare-Secure, Sharing integration with KeeShare with secure sources
 * YubiKey, YubiKey HMAC-SHA1 challenge-response

-- Configuring done
-- Generating done
-- Build files have been written to: /usr/pkgsrc/security/keepassxc/work/keepassxc-2.4.0/build

またlibsodiumなどの依存関係も大丈夫そうです。
=> Tool dependency glib2-tools-[0-9]*: found glib2-tools-2.60.3
=> Tool dependency cmake>=2.8.1nb1: found cmake-3.14.5
=> Build dependency x11-links>=1.13: found x11-links-1.15
=> Build dependency cwrappers>=20150314: found cwrappers-20180325
=> Full dependency qrencode>=4.0.2: found qrencode-4.0.2
=> Full dependency hicolor-icon-theme>=0.9nb1: found hicolor-icon-theme-0.17
=> Full dependency libgcrypt>=1.6.0: found libgcrypt-1.8.4
=> Full dependency libsodium>=0.3: found libsodium-1.0.17
=> Full dependency argon2>=20161029nb1: found argon2-20171227
=> Full dependency desktop-file-utils>=0.10nb1: found desktop-file-utils-0.23nb1
=> Full dependency qt5-qtbase>=5.11.2nb3: found qt5-qtbase-5.12.2nb1
=> Full dependency qt5-qtsvg>=5.11.2nb2: found qt5-qtsvg-5.12.2
=> Full dependency qt5-qttools>=5.11.2nb2: found qt5-qttools-5.12.2
=> Full dependency qt5-qtx11extras>=5.11.2nb2: found qt5-qtx11extras-5.12.2

これでビルド出来るかと思いきや、なにやらエラーが出てしまいました。
[  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

なかなか一筋縄ではいきません。この問題を解決する方法を探ってみます。