Добавил локализацию

pull/1/head
Igor Belitskiy 3 years ago
parent 0cd77e8ab3
commit 26593a42db

4
.gitignore vendored

@ -0,0 +1,4 @@
ublexec.glade~
test.cpp
.vscode
ublexec

@ -0,0 +1,135 @@
#!/usr/bin/make -f
#!/usr/bin/make -f
#SHELL := /bin/bash
MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST)))
MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH))))
MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH))
CMAKE_COMMAND = cmake
#CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source
#CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile
CMAKE_SOURCE_DIR = ./source
CMAKE_BUILD_DIR = ./compile
DEPENDS = cmake
#PKGNAME = $(MAKEFILE_DIR)
PKGNAME = ublexec
default_target: all
all: init build
init:
@echo "Initialize ..."; \
echo "-- Build path: ${CMAKE_BUILD_DIR}"
depend:
@echo "Check depends ..."; \
if [ ! -f /bin/${DEPENDS} ]; then \
echo "-- Depend '${DEPENDS}' not fount !"; \
exit 1; \
fi; \
echo "Check depends: OK"
# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
debug:
@echo "Debug ..."
if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
$(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="/usr"; \
fi; \
echo "Debug: OK"
prepare:
@echo "Prepare ..."; \
if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
$(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/usr"; \
fi; \
echo "Prepare: OK"
check:
@echo "Check ..."; \
if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \
echo "Check: OK"; \
else \
echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not fount !"; \
exit 1; \
fi
build: depend prepare
@echo "Build ..."; \
make --directory=${CMAKE_BUILD_DIR}; \
echo "Build: OK"
uninstall:
@echo "Uninstall ..."
@for FILE_PO in $(wildcard *.po); do \
LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
PATH_FILE_MO="/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
$(RM) "/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
done
# @for SIZE in 16x16 32x32 48x48 scalable; do \
$(RM) "/usr/share/icons/hicolor/$${SIZE}/apps/${PKGNAME}.svg"; \
$(RM) "/usr/share/icons/hicolor/$${SIZE}/apps/${PKGNAME}.png"; \
done
# @for FILE_SVG in $(wildcard *.svg); do \
for SIZE in 16x16 32x32 48x48 scalable; do \
$(RM) "/usr/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \
done; \
done
@$(RM) "/usr/bin/${PKGNAME}"
@$(RM) "/usr/share/applications/${PKGNAME}.desktop"
@$(RM) "/usr/share/polkit-1/actions/ru.ublinux.pkexec.${PKGNAME}.exec.policy"
@$(RM) -rd "/usr/share/${PKGNAME}"
@gtk-update-icon-cache -fiq /usr/share/icons/hicolor/ &>/dev/null
@update-desktop-database --quiet 2>/dev/null
@touch /usr/share/applications
@echo "Uninstall: OK"
install: check uninstall
@echo "Install ..."
@for FILE_PO in $(wildcard *.po); do \
LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
install -dm755 /usr/share/locale/$${LANG}/LC_MESSAGES; \
FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
PATH_FILE_MO="/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
echo $${FILE_PO}; \
msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
done
# @for SIZE in 16 32 48; do \
install -dm755 /usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps; \
rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data ${PKGNAME}.svg -o "/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/${PKGNAME}.svg"; \
done
@install -dm755 /usr/share/icons/hicolor/scalable/apps
# @install -Dm644 -t /usr/share/icons/hicolor/scalable/apps/ ${PKGNAME}.svg
@install -Dm755 -t /usr/bin/ ${CMAKE_BUILD_DIR}/${PKGNAME}
@install -Dm644 -t /usr/share/applications/ ${PKGNAME}.desktop
@install -Dm644 -t /usr/share/polkit-1/actions/ org.ublinux.pkexec.${PKGNAME}.exec.policy
@install -dm755 /usr/share/${PKGNAME}/{ui,images}
@install -Dm644 -t /usr/share/${PKGNAME}/ui/ ${PKGNAME}.glade
# @install -Dm644 -t /usr/share/${PKGNAME}/css/ style.css
# @install -Dm644 -t /usr/share/${PKGNAME}/images/ ${PKGNAME}.svg
# @install -Dm644 -t /usr/share/${PKGNAME}/images/ ${PKGNAME}.png
@gtk-update-icon-cache -fiq /usr/share/icons/hicolor/
@update-desktop-database --quiet 2>/dev/null
@touch /usr/share/applications
@echo "Install: OK"
clean:
@echo "Clean ..."
@$(RM) -rd ${CMAKE_BUILD_DIR}
@if [ -d ${CMAKE_BUILD_DIR} ]; then \
echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \
else \
echo "Clean: OK"; \
fi
help:
@echo "The following are some of the valid targets for this Makefile:"
@echo "... all (the default if no target is provided)"
@echo "... init"
@echo "... debug"
@echo "... prepare"
@echo "... compile"
@echo "... install"
@echo "... uninstall"
@echo "... clean"

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>UBLinux</vendor>
<vendor_url>https://ublinux.ru</vendor_url>
<action id="org.freedesktop.policykit.ublexec.pkexec.policy.run">
<description>Run "ublexec" as root</description>
<description xml:lang="ru">Запус "Выполнить" с правами root</description>
<message>Authentication is required to run ublexec</message>
<message xml:lang="ru">Требуется авторизация для запуска "Выполнить" с правами root</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/ublexec</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 3.7)
project(ublexec)
find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK REQUIRED gtkmm-3.0)
include_directories(${GTK_INCLUDE_DIRS})
link_directories(${GTK_LIBRARY_DIRS})
add_definitions(${GTK_CFLAGS_OTHER})
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wmissing-declarations -fdiagnostics-color=always")
set(SOURCE_FILES
main.cc
ublexec.cc
ublexec.h)
set(LIBRARIES
${GTK_LIBRARIES}
pthread)
add_executable(ublexec ${SOURCE_FILES})
target_link_libraries(ublexec ${LIBRARIES})
install(TARGETS ublexec DESTINATION bin)

@ -0,0 +1,86 @@
#include <cstddef>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <gtkmm.h>
#include <ostream>
#include <string>
#include <ctime>
#include <vector>
#include <map>
#include <fstream>
#include <filesystem>
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <gtkmm/plug.h>
#include <gtkmm/stock.h>
#include <gtkmm/window.h>
#include <string>
#include <gtkmm.h>
#include <gtkmm/plug.h>
#include <string>
#include <iostream>
#include <filesystem>
#include <iostream>
#include <sys/types.h>
#include <pwd.h>
#include <set>
#include "ublexec.h"
int main(int argc, char** argv)
{
string str_cmd_argv = "";
for (int i=1; i<argc; i++){
str_cmd_argv+= to_string(*argv[i]) + " ";
}
if (geteuid()!=0){
string cmd = "pkexec " + app_name + " " + str_cmd_argv ;
system(cmd.c_str());
return 0;
}
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example.plug");
auto builder = Gtk::Builder::create_from_file(path_glade);
bindtextdomain("ublexec", "/usr/share/locale/");
bind_textdomain_codeset("ublexec", "UTF-8");
textdomain("ublexec");
if (argc!=1){
Glib::init();
setlocale(LC_ALL, "");
Glib::OptionContext context;
CmdArgParser parser{
"Socket ID",
"Command line argument for socket ID communication.",
"No help available, sorry"
};
context.set_main_group(parser);
context.parse(argc, argv);
::Window socketID = parser.GetSocketID();
// Handle plug:
SettingsPlug plug{socketID, builder};
plug.show();
app->run(plug);
return 0;
}
else {
MainWindow* wnd = nullptr;
builder->get_widget_derived("window", wnd);
auto r = app->run(*wnd);
delete wnd;
return r;
}
}

@ -0,0 +1,431 @@
#include <cstddef>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <gtkmm.h>
#include <ostream>
#include <string>
#include <ctime>
#include <vector>
#include <map>
#include <fstream>
#include <filesystem>
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <gtkmm/plug.h>
#include <gtkmm/stock.h>
#include <gtkmm/window.h>
#include <string>
#include <gtkmm.h>
#include <gtkmm/plug.h>
#include <string>
#include <iostream>
#include <filesystem>
#include <iostream>
#include <sys/types.h>
#include <pwd.h>
#include <set>
#include "ublexec.h"
using namespace std;
string path_app= "/usr/bin/";
string path_glade= "/usr/share/ublexec/ui/ublexec.glade";
//string path_app = "/home/superadmin/Документы/Проект/ubconfig_new/ubcall/";
string app_name = "ublexec";
CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help)
: Glib::OptionGroup{p_name, p_description, p_help} {
Glib::OptionEntry socketIDArg;
socketIDArg.set_long_name("socket-id");
socketIDArg.set_short_name('s');
socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
socketIDArg.set_description("Settings manager socket");
add_entry(socketIDArg, m_socketID);
}
::Window CmdArgParser::GetSocketID() const{
return m_socketID;
}
MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr<Gtk::Builder> const& builder)
: Gtk::ApplicationWindow(obj), builder{builder} {
this->settings();
}
MainWindow::MainWindow(Glib::RefPtr<Gtk::Builder> const& builder) {
this->builder = builder;
this->settings();
}
void MainWindow::get_builder(){
builder->get_widget("btnFilemaneg", btnFilemaneg);
builder->get_widget("btnListApp", btnListApp);
builder->get_widget("btnStart", btnStart);
builder->get_widget("chbTerminal", chbTerminal);
builder->get_widget("chbAnotherUser", chbAnotherUser);
builder->get_widget("cbxExecuteEpriority", cbxExecuteEpriority);
builder->get_widget("cmbUser", cmbUser);
builder->get_widget("spinPriority", spinPriority);
builder->get_widget("scalePriority", scalePriority);
builder->get_widget("rbPkexec", rbPkexec);
builder->get_widget("rbSu", rbSu);
builder->get_widget("rbSudo", rbSudo);
builder->get_widget("txtCmd", txtCmd);
builder->get_widget("wndChooseDirWallpaper", wndChooseDirWallpaper);
builder->get_widget("btnFilemangerExit", btnFilemangerExit);
builder->get_widget("btnFilemangerOk", btnFilemangerOk);
builder->get_widget("lblTimeEpriorityLow", lblTimeEpriorityLow);
builder->get_widget("lblTime4EpriorityHigh", lblTime4EpriorityHigh);
//builder->get_widget("lblUserName", lblUserName);
builder->get_widget("messageError", messageError);
builder->get_widget("lblMessageError", lblMessageError);
builder->get_widget("btnMessageErrorOk", btnMessageErrorOk);
builder->get_widget("btnMessageErrorOk", btnMessageErrorOk);
builder->get_widget("btnMessageErrorOk", btnMessageErrorOk);
builder->get_widget("dialogStartMenu", dialogStartMenu);
builder->get_widget("btnStartMenuOK", btnStartMenuOK);
builder->get_widget("btnStartMenuExit", btnStartMenuExit);
builder->get_widget("boxlistProgramm", boxlistProgramm);
builder->get_widget("lblInfoHead", lblInfoHead);
builder->get_widget("lblinfoCmd", lblinfoCmd);
builder->get_widget("lblInfoTime", lblInfoTime);
builder->get_widget("labInfoExecutTerm", labInfoExecutTerm);
builder->get_widget("lblInfoUser", lblInfoUser);
builder->get_widget("lblInfoUserOther", lblInfoUserOther);
builder->get_widget("lblInfoUserName", lblInfoUserName);
builder->get_widget("lblInfoNooPriority", lblInfoNooPriority);
builder->get_widget("lblInfoExec", lblInfoExec);
builder->get_widget("lblInfoPriority", lblInfoPriority);
builder->get_widget("lblInfoPriority", lblInfoEnterProg);
}
void MainWindow::localization(){
this->set_title(gettext("ublexec"));
dialogStartMenu->set_title(gettext("Warning!"));
lblInfoHead->set_text(gettext("Running applications as a user with a specified priority"));
lblinfoCmd->set_text(gettext("Command Line"));
lblInfoTime->set_text(gettext("Team:"));
labInfoExecutTerm->set_text(gettext("Run in the terminal emulator"));
lblInfoUser->set_text(gettext("User"));
lblInfoUserOther->set_text(gettext("Run as another user"));
lblInfoUserName->set_text(gettext("User Name:"));
lblInfoNooPriority->set_text(gettext("Priority:"));
lblInfoExec->set_text(gettext("Run with a different priority"));
lblInfoPriority->set_text(gettext("Priority:"));
lblMessageError->set_text(gettext("Select an executable file or program"));
lblInfoEnterProg->set_text(gettext("Selecting Programs"));
btnStart->set_label(gettext("Run"));
}
void MainWindow::event(){
btnFilemaneg->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_filemaneg));
btnListApp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_list_app));
btnStart->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::start_cmd));
cmbUser->signal_changed().connect(sigc::mem_fun(*this, &MainWindow::changed_user));
//chbTerminal->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::execute_terminal));
chbAnotherUser->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_other_user));
spinPriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_scale_priority));
scalePriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_spin_priority));
btnFilemangerExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_filemaneg));
btnFilemangerOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::get_path_filemaneg));
cbxExecuteEpriority->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_execute_epriority));
btnMessageErrorOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::message_gui_close));
btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::start_menu_entry_app));
btnStartMenuExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_start_menu));
}
void MainWindow::settings(){
this->pars_apps();
this->builder = builder;
this->get_builder();
this->event();
this->localization();
spinPriority->set_range(-20,19);
spinPriority->set_increments(1.0,-1.0);
scalePriority->set_inverted(true);
this->pars_dir_bin();
this->pars_users();
this->activ_or_block_execute_epriority();
this->activ_or_block_other_user();
}
void MainWindow::close_start_menu(){
dialogStartMenu->hide();
}
void MainWindow::start_menu_entry_app(){}
void MainWindow::message_gui_close(){
messageError->hide();
}
void MainWindow::activ_or_block_execute_epriority(){
bool flag = cbxExecuteEpriority->get_active();
scalePriority->set_sensitive(flag);
spinPriority->set_sensitive(flag);
lblInfoNooPriority->set_sensitive(flag);
lblTimeEpriorityLow->set_sensitive(flag);
lblTime4EpriorityHigh->set_sensitive(flag);
}
void MainWindow::open_filemaneg(){
wndChooseDirWallpaper->show();
}
void MainWindow::close_filemaneg(){
wndChooseDirWallpaper->hide();
}
void MainWindow::get_path_filemaneg(){
path_file_name = wndChooseDirWallpaper->get_filename();
if (path_file_name.length()==0){}
else{
this->close_filemaneg();
}
}
void MainWindow::open_list_app(){
for (const auto & str_categor : set_categories){
Gtk::Label* Label1 = new Gtk::Label(str_categor);
Gtk::IconView* icon = new Gtk::IconView();
boxlistProgramm->pack_start(*icon);
boxlistProgramm->pack_start(*Label1);
dialogStartMenu->show_all();
}
}
void MainWindow::start_cmd(){
txtCmd->set_text("");
string str_cmd_terminal="";
string str_variants_root = "";
string str_nice_cmd = "";
//=========================================
if (chbAnotherUser->get_active()){
if (rbPkexec->get_active()){
if (geteuid()!=0){
if ((chbAnotherUser->get_active()) && (cmbUser->get_active_text().length()==0)) {
str_variants_root = "pcexec env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
else if (chbAnotherUser->get_active()){
str_variants_root = "pcexec --user " + cmbUser->get_active_text() + " env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
else{
str_variants_root = "pcexec env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
}
else{
if ((chbAnotherUser->get_active()) && (cmbUser->get_active_text().length()==0)) {
str_variants_root = "pkexec env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
else if (chbAnotherUser->get_active()){
str_variants_root = "pkexec --user " + cmbUser->get_active_text() + " env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
else{
str_variants_root = "pkexec env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ";
}
}
}
else if (rbSu->get_active()){
if (geteuid()!=0){
chbTerminal->set_active(true);
}
if ((chbAnotherUser->get_active()) && (cmbUser->get_active_text().length()==0)) {
str_variants_root="su ";
}
else if (chbAnotherUser->get_active()){
str_variants_root="su --user " + cmbUser->get_active_text() + " ";
}
else{
str_variants_root="su" ;
}
}
else if (rbSudo->get_active()){
if (geteuid()!=0){
chbTerminal->set_active(true);
}
if ((chbAnotherUser->get_active()) && (cmbUser->get_active_text().length()==0)) {
str_variants_root="sudo ";
}
else if (chbAnotherUser->get_active()){
str_variants_root="sudo --user " + cmbUser->get_active_text() + " ";
}
else{
str_variants_root="sudo ";
}
}
}
if (cbxExecuteEpriority->get_active()){
str_nice_cmd = "nice -n " + to_string(spinPriority->get_value_as_int()) + " ";
}
//=========================================
if (chbTerminal->get_active()){
str_cmd_terminal=" xterm -e ";
}
else{
str_cmd_terminal="";
}
//=========================================
if (path_file_name.length()==0){
messageError->show();
}
txtCmd->set_text(str_cmd_terminal + str_variants_root + str_nice_cmd);
path_file_name="";
}
void MainWindow::changed_user(){
Glib::ustring entry_user = cmbUser->get_active_text();
if (entry_user == "superadmin" || entry_user == "root"){
spinPriority->set_range(-20,19);
spinPriority->set_increments(1.0,-1.0);
scalePriority->set_range(-20,19);
scalePriority->set_value(0);
lblTimeEpriorityLow->set_text("19 (Низкий)");
lblTime4EpriorityHigh->set_text("-20 (Высокий)");
}
else{
spinPriority->set_range(0,19);
spinPriority->set_increments(1.0,-1.0);
scalePriority->set_range(0,19);
scalePriority->set_value(0);
lblTimeEpriorityLow->set_text("19 (Низкий)");
lblTime4EpriorityHigh->set_text("0 (Высокий)");
}
}
//void MainWindow::execute_terminal(){}
//void MainWindow::execute_another_User(){}
void MainWindow::activ_or_block_other_user(){
bool flag = chbAnotherUser->get_active();
cmbUser->set_sensitive(flag);
//lblInfoUserOther->set_sensitive(flag);
if (flag_pkexec==true){
rbPkexec->set_sensitive(flag);
}
if (flag_su==true){
rbSu->set_sensitive(flag);
}
if (flag_sudo==true){
rbSudo->set_sensitive(flag);
}
}
void MainWindow::change_scale_priority(){
scalePriority->set_value(spinPriority->get_value_as_int());
}
void MainWindow::change_spin_priority(){
spinPriority->set_value(scalePriority->get_value());
}
void MainWindow::pars_dir_bin(){
namespace fs = std::filesystem;
std::string path = "/bin";
string file_name = "";
for (const auto & entry : fs::directory_iterator(path)){
file_name = entry.path().filename().string();
if (file_name=="su"){
flag_su=true;
}
else if (file_name=="sudo"){
flag_sudo=true;
}
else if (file_name=="pkexec"){
flag_pkexec=true;
}
}
rbPkexec->set_sensitive(flag_pkexec);
rbSu->set_sensitive(flag_su);
rbSudo->set_sensitive(flag_sudo);
}
void MainWindow::pars_users(){
while (true) {
errno = 0; // so we can distinguish errors from no more entries
passwd* entry = getpwent();
if (!entry) {
if (errno) {
break;
}
break;
}
if (entry->pw_uid>=1000 && entry->pw_uid!=65534){
cmbUser->append(entry->pw_name);
}
}
endpwent();
}
void MainWindow::pars_apps(){
namespace fs = std::filesystem;
string file_name="";
std::string line;
int index_equals = 0;
string key = "";
string value = "";
for (const auto & entry : fs::directory_iterator("/usr/share/applications/")){
file_name = entry.path().filename().string();
if (file_name.find(".desktop")!=std::string::npos){
std::ifstream in(entry.path());
if (in.is_open()){
while (getline(in, line)){
index_equals=line.find("=");
if (index_equals!=std::string::npos){
key = line.substr(0, index_equals);
value = line.substr(index_equals+1,line.length());
struct_App App;
if (key=="Name"){
App.Name = value;
}
else if (key=="Type"){
App.Type = value;
}
else if (key=="Exec"){
App.Exec = value;
}
else if (key=="Icon"){
App.Icon = value;
}
else if (key=="Icon"){
App.Icon = value;
}
else if (key=="MimeType"){
App.Icon = value;
}
else if (key=="Categories"){
App.Categories = value;
string substr1 = ";";
int index=0;
int old_index=0;
while ((index = value.find(substr1, index)) != std::string::npos) {
if ((value.length()-1)!=index){
string s = value.substr(old_index, index);
if (s.find(";") != std::string::npos){
s=s.replace(0,s.length(), ";");
set_categories.insert(s);
}
else{
if (value.substr(old_index, index).find(";") == std::string::npos){
set_categories.insert(value.substr(old_index, index));
}
}
}
if ((value.length()-1)==index){
if (value.substr(old_index, index).find(";") == std::string::npos){
set_categories.insert(value.substr(index,value.length()));
}
}
old_index=index;
index += substr1.length();
}
}
}
}
}
}
}
}
SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr<Gtk::Builder> builder)
: Gtk::Plug{p_socketID} {
MainWindow* wnd = nullptr;
builder->get_widget_derived("window", wnd);
builder->get_widget("plugBox", plugBox);
plugBox->get_parent()->remove(*plugBox);
add(*plugBox);
show_all_children();
}

@ -0,0 +1,157 @@
#include <cstddef>
#include <cstdlib>
#include <iostream>
#include <memory>
#include <gtkmm.h>
#include <ostream>
#include <string>
#include <ctime>
#include <vector>
#include <map>
#include <fstream>
#include <filesystem>
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <gtkmm/plug.h>
#include <gtkmm/stock.h>
#include <gtkmm/window.h>
#include <string>
#include <gtkmm.h>
#include <gtkmm/plug.h>
#include <string>
#include <iostream>
#include <filesystem>
#include <iostream>
#include <sys/types.h>
#include <pwd.h>
#include <set>
using namespace std;
extern string path_app;
extern string app_name;
extern string path_glade;
class CmdArgParser : public Glib::OptionGroup
{
public:
CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help);
::Window GetSocketID() const;
private:
int m_socketID = 0;
};
// This is what is going to be plugged into xfce4-settings-manager:
//
// Documented here:
//
// https://developer.gnome.org/gtkmm-tutorial/3.22/sec-plugs-sockets-example.html.en
//
class MainWindow : public Gtk::ApplicationWindow {
public:
MainWindow(BaseObjectType* obj, Glib::RefPtr<Gtk::Builder> const& builder);
MainWindow(Glib::RefPtr<Gtk::Builder> const& builder);
void get_builder();
void localization();
void event();
void settings();
void close_start_menu();
void start_menu_entry_app();
void message_gui_close();
void activ_or_block_execute_epriority();
void open_filemaneg();
void close_filemaneg();
void get_path_filemaneg();
void open_list_app();
void start_cmd();
void changed_user();
void execute_terminal(){}
void execute_another_User(){}
void activ_or_block_other_user();
void change_scale_priority();
void change_spin_priority();
void pars_dir_bin();
void pars_users();
void pars_apps();
public:
Glib::RefPtr<Gtk::Builder> builder;
Gtk::Button *btnFilemaneg;
Gtk::Button *btnListApp;
Gtk::Button *btnStart;
Gtk::CheckButton *chbTerminal;
Gtk::CheckButton *chbAnotherUser;
Gtk::CheckButton *cbxExecuteEpriority;
Gtk::ComboBoxText *cmbUser;
Gtk::SpinButton *spinPriority;
Gtk::Scale *scalePriority;
Gtk::RadioButton *rbPkexec;
Gtk::RadioButton *rbSu;
Gtk::RadioButton *rbSudo;
Gtk::Entry *txtCmd;
Gtk::FileChooserDialog *wndChooseDirWallpaper;
Gtk::Button *btnFilemangerExit;
Gtk::Button *btnFilemangerOk;
Gtk::Label *lblTimeEpriority;
Gtk::Label *lblTimeEpriorityLow;
Gtk::Label *lblTime4EpriorityHigh;
Gtk::Label *lblUserName;
Gtk::MessageDialog *messageError;
Gtk::Button *btnMessageErrorOk;
Gtk::Label *lblMessageError;
Gtk::Button *btnStartMenuOK;
Gtk::Button *btnStartMenuExit;
Gtk::Box *boxlistProgramm;
Gtk::Dialog *dialogStartMenu;
Gtk::Label *lblInfoHead;
Gtk::Label * lblinfoCmd;
Gtk::Label * lblInfoTime;
Gtk::Label * labInfoExecutTerm;
Gtk::Label * lblInfoUser;
Gtk::Label * lblInfoUserOther;
Gtk::Label * lblInfoUserName;
Gtk::Label * lblInfoNooPriority;
Gtk::Label * lblInfoExec;
Gtk::Label * lblInfoPriority;
Gtk::Label * lblInfoEnterProg;
public:
string execute_cmd = "";
bool flag_pkexec = false;
bool flag_su = false;
bool flag_sudo = false;
string path_file_name;
struct struct_App{
string Name;
string Exec;
string Icon;
string MimeType;
string Type;
string Categories;};
list <struct_App> list_app;
set <string> set_categories;
};
class SettingsPlug : public Gtk::Plug{
public:
Gtk::Window *window;
SettingsPlug(::Window p_socketID, Glib::RefPtr<Gtk::Builder> builder);
private:
Gtk::Widget *plugBox;
Gtk::Widget *parent;
};

@ -0,0 +1,13 @@
[Desktop Entry]
Encoding=UTF-8
Name=ublexec
Name[ru]=Выполнить
GenericName=Execution from user rights
GenericName[ru]=Выполнить
Comment=Execution from user rights
Comment[ru]=Выполнить
Type=Application
Exec=ublexec
Icon=ublexec
Terminal=false
Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;

File diff suppressed because it is too large Load Diff

@ -0,0 +1,76 @@
# English translations for PACKAGE package.
# Copyright (C) 2023 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Automatically generated, 2023.
#
msgid ""
msgstr ""
msgid "ОК"
msgstr "ОК"
msgid "Exit"
msgstr "Выход"
msgid "Selecting Programs"
msgstr "Выбор программ"
msgid "Running applications as a user with a specified priority"
msgstr "Запуск приложений от имени пользователя с указанным приоритетом"
msgid "Team:"
msgstr "Команда:"
msgid "Run in the terminal emulator"
msgstr "Выполнить в эмуляторе терминале"
msgid "Command Line"
msgstr "Командная строка"
msgid "Run as another user"
msgstr "Выполнить от имени другого пользователя"
msgid "pkexec"
msgstr "pkexec"
msgid "su"
msgstr "su"
msgid "sudo"
msgstr "sudo"
msgid "User Name:"
msgstr "Имя поьзователя:"
msgid "User"
msgstr "Пользователь"
msgid "Run with a different priority"
msgstr "Выполнить c другим приоритетом"
msgid "Priority:"
msgstr "Приоритет:"
msgid "19 (Low)"
msgstr "19 (Низкий)"
msgid "-20 (High)"
msgstr "-20 (Высокий)"
msgid "Priority"
msgstr "Приоритет"
msgid "Run"
msgstr "Запустить"
msgid "Select an executable file or program"
msgstr "Выберите исполняемый файл или программу"
msgid "Please select File"
msgstr "Пожалуйста Выберите Файл"
msgid "Warning!"
msgstr "Внимание!"
msgid "ublexec"
msgstr "Выполнить"
Loading…
Cancel
Save