mirror of
https://github.com/morgan9e/gnome-shell-extension-freon
synced 2026-04-14 00:14:14 +09:00
74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
import GLib from 'gi://GLib';
|
|
import Gio from 'gi://Gio';
|
|
|
|
export default class PkexecUtil {
|
|
constructor(name) {
|
|
this._name = name;
|
|
this._policy = 'com.github.UshakovVasilii.freon.' + name + '.policy';
|
|
this._actions = '/usr/share/polkit-1/actions'
|
|
this._pkexec = GLib.find_program_in_path('pkexec');
|
|
// Currently hardcoded in policy file.
|
|
this._bin = '/usr/sbin/' + name;
|
|
this._dir = this.dir();
|
|
}
|
|
|
|
dir() {
|
|
let uri = (new Error()).stack.split('\n')[1];
|
|
let prefix = this.constructor.name + '@file://'
|
|
if (!uri.startsWith(prefix)) {
|
|
log('[FREON] failed to guess extension directory');
|
|
return null;
|
|
}
|
|
return Gio.File.new_for_path(uri.substring(prefix.length)).get_parent().get_path();
|
|
}
|
|
|
|
available_pkexec() {
|
|
return !!this._pkexec;
|
|
}
|
|
|
|
available_bin() {
|
|
return GLib.find_program_in_path(this._name) == this._bin;
|
|
}
|
|
|
|
installed() {
|
|
return GLib.file_test(this._actions + '/' + this._policy, GLib.FileTest.EXISTS);
|
|
}
|
|
|
|
run(command) {
|
|
return GLib.spawn_command_line_sync(this._pkexec + ' ' + command);
|
|
}
|
|
|
|
install() {
|
|
if (!this._dir)
|
|
{
|
|
log('[FREON] cannot find ' + this._name + ' pkexec policy file ' + this._policy);
|
|
return false;
|
|
}
|
|
try {
|
|
this.run('install "' + this._dir + '/policies/' + this._policy + '" ' + this._actions);
|
|
} catch(e) {}
|
|
if (!this.installed())
|
|
{
|
|
log('[FREON] failed to install ' + this._name + ' pkexec policy');
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
checkOrInstall() {
|
|
if (!this.available_pkexec()) {
|
|
log('[FREON] pkexec is not available');
|
|
return false;
|
|
}
|
|
if (!this.available_bin()) {
|
|
log('[FREON] ' + this._bin + ' is not available');
|
|
return false;
|
|
}
|
|
if (!this.installed()) {
|
|
log('[FREON] ' + this._name + ' policy is not installed yet');
|
|
return this.install();
|
|
}
|
|
return true;
|
|
}
|
|
}
|