#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 const& builder) : Gtk::ApplicationWindow(obj), builder{builder} { this->settings(); } MainWindow::MainWindow(Glib::RefPtr 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 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(); }