📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の13版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
PolKit (以前は、PolicyKitとして知られていた) は、非特権ユーザセッションと特権システムコンテキストの間のネゴシエータとして機能するアプリケーションフレームワークである。<br> | |||
<br> | |||
PolKitは、ユーザ、グループ、名前により特定のアクションを制限する機能を持つ。<br> | |||
ユーザセッションのプロセスが、システムコンテキストでアクションを実行するごとに、PolKitはクエリされる。 | |||
所謂、ポリシーで指定された設定に基づいて、"yes"、"no"、"needs authentication"である可能性がある。<br> | |||
<br> | |||
<code>sudo</code>のような古典的な権限承認プログラムとは異なり、PolKitはセッション全体に対してroot権限を与えるのではなく、各アクションに対してのみ権限を与える。<br> | |||
<br><br> | <br><br> | ||
== PolKit-Qt-1 == | == PolKit-Qt-1 == | ||
==== PolKit-Qt- | ==== PolKit-Qt-1とは ==== | ||
* | PolKit-Qt-1のライセンスは、<u>LGPL-2.1</u>に基づく。<br> | ||
*: < | <br> | ||
Polkitは、Unix系システムでの権限管理と認可を制御するためのフレームワークであり、アプリケーションが特定のアクションを実行するために必要な権限を取得するための対話を提供する。<br> | |||
<br> | |||
Polkit-Qt-1ライブラリは、PolkitとQtアプリケーションを簡単に統合するためのツールキットである。<br> | |||
PolKit-Qt-1は、Qtソフトウェアの開発者がPolKit APIを簡単に利用できるようにすることを目的としている。<br> | |||
<br> | |||
また、<code>QAction</code>クラスと<code>QAbstractButton</code>ボタンの便利なラッパーもあり、これらのコンポーネントをPolKitと簡単に統合することもできる。<br> | |||
<br> | |||
PolKit-Qt-1は、以前のPolKit-Qtを直接置き換えるものではなく、PolKit-Qtのバックエンドであった旧PolicyKit(バージョン 0.9以下)と後方互換性はない。<br> | |||
現在、旧PolicyKitはメンテナンスされていないため、PolKit-Qtは、PolKit-Qt-1またはKAuth(KDEフレームワーク)に移植することが推奨される。<br> | |||
<br> | |||
Polkit-Qt-1ライブラリの主な特徴と機能を、以下に示す。<br> | |||
* 権限管理の統合 | |||
*: Qtベースのアプリケーションが簡単にPolkitを使用して権限管理を行うことができる。 | |||
* シンプルなAPI | |||
*: Qtのシグナルとスロットを活用して、直感的で使いやすいAPIを提供する。 | |||
* 非同期操作 | |||
*: 非同期に認証リクエストを処理するため、ユーザインターフェースがブロックされることを防ぐ。 | |||
* セキュリティ | |||
*: Polkit-Qt-1を使用することにより、アプリケーションが必要な権限だけを要求し、ユーザのセキュリティを保護する。 | |||
<br> | |||
PolKit-Qt-1は、以下に示す3つのライブラリに分かれている。<br> | |||
* polkit-qt-core-1 | |||
*: GUIを使用せず、アクションや認証を制御することができる。 | |||
*: また、PolKitの権威に関する有用な情報を取得して、制御することができる。 | |||
*: 主に、<code>Authority</code>クラスが含まれている。 | |||
*: <br> | *: <br> | ||
* | * polkit-qt-gui-1 | ||
*: | *: GUIアイテムをpolkitのアクションと簡単に関連付けることができる。 | ||
*: <code> | *: いくつかのラッパークラスを通して、<code>QAction</code>クラスや<code>QAbstractButton</code>クラスをPolKitアクションに関連付けることができ、 | ||
*: <code> | *: それらのプロパティをPolKitの結果に応じて変更させることができる。 | ||
*: <code>Action</codE>クラス、<code>ActionButton</code>クラス、<code>ActionButtons</code>クラスの各クラスが含まれている。 | |||
*: <br> | *: <br> | ||
*: [https://github.com/KDE/polkit-qt-1 PolKit-Qt-1のGithub]または[https://invent.kde.org/libraries/polkit-qt-1/-/tags 公式のGitLab]にアクセスして、ソースコードをダウンロードする。 | * polkit-qt-agent-1 | ||
*: 非常にシンプルな方法により、独自のPolKit認証エージェントを記述することができる。 | |||
<br> | |||
PolKit-Qt-1の内部仕様を知りたい場合は、[https://api.kde.org/polkit-qt-1/html/index.html PolKit-Qt-1の公式ドキュメント]を参照すること。<br> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Qtライブラリだけでなく、KDEフレームワークのようなQt拡張に依存するソフトウェアを開発する場合、KDEフレームワークのKAuthを使用することを推奨する。</u><br> | |||
<br><br> | |||
== PolKit-Qt-1のインストール == | |||
==== パッケージ管理システムからインストールする場合 ==== | |||
sudo zypper install libpolkit-qt5-1-devel | |||
<br> | |||
==== ソースコードからインストールする場合 ==== | |||
PolKit-Qt-1のビルドに必要なライブラリをインストールする。<br> | |||
# Qt 5を使用する場合 | |||
sudo zypper install pkg-config glib2-devel polkit-devel \ | |||
libQt5Core-devel libQt5Core-private-headers-devel libQt5Widgets-devel libQt5Widgets-private-headers-devel \ | |||
libQt5DBus-devel libQt5DBus-private-headers-devel libQt5Xml-devel libQt5Test-devel | |||
# Qt 6を使用する場合 | |||
sudo zypper install pkg-config glib2-devel polkit-devel \ | |||
qt6-base-common-devel qt6-base-devel qt6-core-devel libQt5Core-private-headers-devel qt6-widgets-devel libQt5Widgets-private-headers-devel \ | |||
qt6-dbus-devel libQt5DBus-private-headers-devel qt6-xml-devel qt6-test-devel | |||
<br> | |||
[https://github.com/KDE/polkit-qt-1 PolKit-Qt-1のGithub]または[https://invent.kde.org/libraries/polkit-qt-1/-/tags 公式のGitLab]にアクセスして、ソースコードをダウンロードする。<br> | |||
ダウンロードしたファイルを解凍する。<br> | |||
tar xf polkit-qt-1-<バージョン>.tar.gz | |||
cd polkit-qt-1-<バージョン>.tar.gz | |||
<br> | |||
または、<code>git clone</code>コマンドを実行して、ソースコードをダウンロードする。<br> | |||
git clone https://invent.kde.org/libraries/polkit-qt-1.git | |||
cd polkit-qt-1 | |||
<br> | |||
PolKit-Qt-1をインストールする。<br> | |||
# Qt 5を使用する場合 | |||
cmake \ | |||
-DCMAKE_C_COMPILER=<GCC 8以降のgccのパス> -DCMAKE_CXX_COMPILER=<G++ 8以降のg++のパス> \ | |||
-DCMAKE_INSTALL_PREFIX=<PolKit-Qt-1のインストールディレクトリ> \ | |||
-DCMAKE_BUILD_TYPE=Release \ | |||
-DBUILD_EXAMPLES=ON \ | |||
-DBUILD_TEST=ON \ | |||
-DSYSCONF_INSTALL_DIR=<PolKit-Qt-1のインストールディレクトリ> \ | |||
.. | |||
# Qt 6を使用する場合 | |||
cmake \ | |||
-DCMAKE_C_COMPILER=<GCC 8以降のgccのパス> -DCMAKE_CXX_COMPILER=<G++ 8以降のg++のパス> \ | |||
-DCMAKE_INSTALL_PREFIX=<PolKit-Qt-1のインストールディレクトリ> \ | |||
-DCMAKE_BUILD_TYPE=Release \ | |||
-DQT_MAJOR_VERSION=6 \ | |||
-DBUILD_EXAMPLES=ON \ | |||
-DBUILD_TEST=ON \ | |||
-DSYSCONF_INSTALL_DIR=<PolKit-Qt-1のインストールディレクトリ> \ | |||
.. | |||
<br> | |||
make -j $(nproc) | |||
make install | |||
<br> | <br> | ||
~/.profileファイル等に、環境変数を追記する。<br> | ~/.profileファイル等に、環境変数を追記する。<br> | ||
| 60行目: | 135行目: | ||
<br><br> | <br><br> | ||
== PolKit-Qt-1を使用した開発例 == | == PolKit-Qt-1を使用した開発例 1 == | ||
以下の例では、ネットワーク設定の変更に対する権限を確認して、必要に応じてユーザに対話を求めている。<br> | |||
<br> | |||
例えば、システム設定アプリケーションがシステムのネットワーク設定を変更しようとする場合、そのアクションには管理者権限が必要である。<br> | |||
Polkit-Qt-1ライブラリを使用することにより、この権限を要求する対話を簡単に実装できる。<br> | |||
<br> | |||
<syntaxhighlight lang="cmake"> | |||
find_package(PolkitQt-1) | |||
# Qt 5を使用する場合 | |||
target_link_libraries(<ターゲット名> PRIVATE | |||
PolkitQt5-1::Core | |||
PolkitQt5-1::Agent | |||
) | |||
# Qt 6を使用する場合 | |||
target_link_libraries(<ターゲット名> PRIVATE | |||
PolkitQt6-1::Core | |||
PolkitQt6-1::Agent | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <PolkitQt1/Authority> | |||
#include <PolkitQt1/Action> | |||
using namespace PolkitQt1; | |||
Authority::Result result = Authority::instance()->checkAuthorizationSync("org.example.modify_network", | |||
Authority::Subject::fromSystemBusName("org.freedesktop.DBus"), | |||
Authority::AllowUserInteraction); | |||
if (result == Authority::Yes) { | |||
// 権限が許可された場合の処理 | |||
} | |||
else { | |||
// 権限が拒否された場合の処理 | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== PolKit-Qt-1を使用した開発例 2 == | |||
==== 開発例に挙げるソフトウェア ==== | ==== 開発例に挙げるソフトウェア ==== | ||
実行ファイルの画面にあるボタンを押下する時、任意のディレクトリにroot権限でテキストファイルを作成または書き込みするソフトウェアを例に挙げる。<br> | 実行ファイルの画面にあるボタンを押下する時、任意のディレクトリにroot権限でテキストファイルを作成または書き込みするソフトウェアを例に挙げる。<br> | ||
| 76行目: | 191行目: | ||
*: ファイルの場所 : /usr/share/dbus-1/interfaces | *: ファイルの場所 : /usr/share/dbus-1/interfaces | ||
*: .xml拡張子 | *: .xml拡張子 | ||
*: <u>このファイルは、/usr/share/dbus-1/interfacesディレクトリに配置しなくてもよい。</u> | |||
*: ファイル名を、org.qt.policykit.examples.xmlファイルとする。 | *: ファイル名を、org.qt.policykit.examples.xmlファイルとする。 | ||
* D-Busポリシーファイル | * D-Busポリシーファイル | ||
*: サードパーティ製のソフトウェアは、歴史的に/etc/dbus-1/system.dディレクトリにファイルを配置していたが、<u>現在は非推奨とされている</u>。 | |||
*: そのため、/usr/share/dbus-1/system.dディレクトリに配置することが望ましい。 | |||
*: <br> | |||
*: この/etc/dbus-1/system.dディレクトリは、システム管理者のために予約されたものとして扱われるべきである。 | |||
*: <br> | |||
*: ファイルの場所 : | *: ファイルの場所 : | ||
*:: 優先順位 1 : /etc/dbus-1/system-local.conf (新規作成) | *:: 優先順位 1 : /etc/dbus-1/system-local.conf (新規作成) | ||
| 85行目: | 206行目: | ||
*: ファイル名を、org.qt.policykit.examples.confファイルとする。 | *: ファイル名を、org.qt.policykit.examples.confファイルとする。 | ||
* D-Busサービスファイル(D-Busアクティベーションファイル) | * D-Busサービスファイル(D-Busアクティベーションファイル) | ||
* | ** ファイルの場所 (root権限等) | ||
*: | **: /usr/share/dbus-1/system-services | ||
*: | **: <br> | ||
** ファイルの場所 (一般ユーザ権限等) | |||
**: /usr/share/dbus-1/services | |||
**: <br> | |||
*: D-Busでは、D-Busサービスにアクセスすると自動的にソフトウェアが実行される仕組みが存在する。 | |||
*: この機能を使用する場合は、/usr/share/dbus-1/servicesディレクトリにD-Busサービスファイルを作成する必要がある。 | |||
*: これにより、D-Busインターフェースのメソッドにアクセスする前に、ヘルパー実行ファイルを手動で実行する必要がなくなる。 | |||
*: <br> | |||
*: <syntaxhighlight lang="ini"># /usr/share/dbus-1/system-services/org.qt.policykit.examples.serviceファイル | |||
[D-BUS Service] | |||
Name=<D-Busサービス名> | |||
Exec=<ヘルパー実行ファイルのフルパス> | |||
User=root | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== ヘルパー実行ファイルの開発 ==== | ==== ヘルパー実行ファイルの開発 ==== | ||
<syntaxhighlight lang="make"> | |||
# SampleHelper.proファイル | # SampleHelper.proファイル | ||
| 135行目: | 272行目: | ||
target.path = $${prefix} | target.path = $${prefix} | ||
INSTALLS += target | INSTALLS += target | ||
</syntaxhighlight> | |||
<br> | <br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||