#include "ublexec.h" using namespace std; const string path_app = "/usr/bin/"; const string path_glade = "/usr/share/ublexec/ui/ublexec.glade"; const string path_css = "/usr/share/ublexec/css/ublexec.css"; const string app_name = "ublexec"; int flag_prog_file = 0; string name_app_cmd = ""; string version_application = "2.24"; const string path_img_head_background = "/usr/share/ublexec/images/logo-background.png"; int socket_ext_id_I = 0; int socket_trd_id_I = 0; 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_flags(Glib::OptionEntry::FLAG_IN_MAIN); socketIDArg.set_description("Settings manager socket"); Glib::OptionEntry socketExtId; socketExtId.set_long_name("socket-ext-id"); socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); socketExtId.set_description("Settings manager secondary socket"); Glib::OptionEntry socketTrdId; socketTrdId.set_long_name("socket-trd-id"); socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); socketTrdId.set_description("Settings manager secondary socket"); add_entry(socketIDArg, m_socketID); add_entry(socketExtId, socket_ext_id_I); add_entry(socketTrdId, socket_trd_id_I); } ::Window CmdArgParser::GetSocketID() const{ return m_socketID; } MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder) : Gtk::ApplicationWindow(obj), builder{builder} { this->builder = builder; this->settings(); } MainWindow::MainWindow(Glib::RefPtr const& builder) { this->builder = builder; this->settings(); } void MainWindow::get_builder() { builder->get_widget("imgHeadBackground", imgHeadBackground); builder->get_widget("overHead", overHead); 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("wndChooseFileWallpaper", wndChooseFileWallpaper); builder->get_widget("btnFilemangerExit", btnFilemangerExit); builder->get_widget("btnFilemangerOk", btnFilemangerOk); builder->get_widget("lblTimeEpriorityLow", lblTimeEpriorityLow); builder->get_widget("lblTime4EpriorityHigh", lblTime4EpriorityHigh); builder->get_widget("messageError", messageError); builder->get_widget("lblMessageError", lblMessageError); builder->get_widget("btnMessageErrorOk", btnMessageErrorOk); builder->get_widget("dialogStartMenu", dialogStartMenu); builder->get_widget("btnStartMenuOK", btnStartMenuOK); builder->get_widget("btnStartMenuExit", btnStartMenuExit); 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("boxColor", boxColor); builder->get_widget("lblGraphics", lblGraphics); builder->get_widget("lblTools", lblTools); builder->get_widget("lblInternet", lblInternet); builder->get_widget("lblMultimedia", lblMultimedia); builder->get_widget("lblSettings", lblSettings); builder->get_widget("lblEducation", lblEducation); builder->get_widget("lblOffice", lblOffice); builder->get_widget("lblOther", lblOther); builder->get_widget("lblDevelopment", lblDevelopment); builder->get_widget("iconGraphics", iconGraphics); builder->get_widget("iconTools", iconTools); builder->get_widget("iconInternet", iconInternet); builder->get_widget("iconMultimedia", iconMultimedia); builder->get_widget("iconSettings", iconSettings); builder->get_widget("iconEducation", iconEducation); builder->get_widget("iconOffice", iconOffice); builder->get_widget("iconOther", iconOther); builder->get_widget("iconDevelopment", iconDevelopment); builder->get_widget("iconSystem", iconSystem); builder->get_widget("lblSystem", lblSystem); builder->get_widget("lblHeaderName", lblHeaderName); builder->get_widget("btnSynopsis", btnSynopsis); builder->get_widget("btnAbout", btnAbout); builder->get_widget("aboutWindows", aboutWindows); builder->get_widget("btnSettings", btnSettings); builder->get_widget("btnBoxAboutDialog", btnBoxAboutDialog); builder->get_widget("boxAbout", boxAbout); builder->get_widget("cmbTerminal", cmbTerminal); builder->get_widget("lblHeaderAboutTopic", lblHeaderAboutTopic); builder->get_widget("lblwebHeaderName", lblwebHeaderName); builder->get_widget("lblhelpText", lblhelpText); builder->get_widget("lblhelpHeader", lblhelpHeader); builder->get_widget("chkAlwaysOpenHelp", chkAlwaysOpenHelp); builder->get_widget("btnReadHelp", btnReadHelp); builder->get_widget("btnCancelHelp", btnCancelHelp); builder->get_widget("wndShowWeb", wndShowWeb); builder->get_widget("lblHeadeWndWeb", lblHeadeWndWeb); #ifdef WEBKIT_FOUND builder->get_widget("wndWeb", wndWeb); #endif } void MainWindow::set_icon_array() { array_icon[0] = this->iconGraphics; array_icon[1] = this->iconTools; array_icon[2] = this->iconInternet; array_icon[3] = this->iconMultimedia; array_icon[4] = this->iconSettings; array_icon[5] = this->iconEducation; array_icon[6] = this->iconOffice; array_icon[7] = this->iconOther; array_icon[8] = this->iconDevelopment; array_icon[9] = this->iconSystem; } void MainWindow::template_apps_obj(Gtk::IconView *icon, Glib::RefPtr >k_list_app) { gtk_list_app = Gtk::ListStore::create(m_Columns); gtk_list_app->set_sort_column(m_Columns.m_col_description, Gtk::SORT_ASCENDING); icon->set_model(gtk_list_app); icon->set_text_column(m_Columns.m_col_description); } void MainWindow::add_CSS() { Glib::RefPtr cssProvider = Gtk::CssProvider::create(); cssProvider->load_from_path(path_css); Glib::RefPtr styleContext = Gtk::StyleContext::create(); Glib::RefPtr screen = Gdk::Screen::get_default();//get default screen styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);//add provider for screen in all application Glib::RefPtr context_lbl_head = lblInfoHead->get_style_context(); Glib::RefPtr boxAbout_css = boxAbout->get_style_context(); imgHeadBackground->set(path_img_head_background); for (auto &view: array_icon) { Glib::RefPtr view_css = view->get_style_context(); view_css->add_class("view_app"); } context_lbl_head->add_class("textHead"); if (socket_ext_id_I == 0){ boxAbout_css->add_class("bkim_no_plug"); } } void MainWindow::localization() { time_t now = time(0); tm *ltm = localtime(&now); unsigned int year= 1900+ ltm->tm_year; string str_authors = string(copyright) + to_string(year); aboutWindows->set_copyright(str_authors); aboutWindows->set_website(website); btnSynopsis->set_label(str_help); btnAbout->set_label(str_about_1); aboutWindows->set_comments(define_name_app); aboutWindows->set_website_label(home_page ); aboutWindows->set_version(_(version_application.c_str())); aboutWindows->set_title(space_name_app ); lblHeaderAboutTopic->set_label(space_name_app ); lblHeaderName->set_text(define_name_app); this->set_title(define_name_app); btnStart->set_label(str_run); wndChooseFileWallpaper->set_title(str_please_select_file); dialogStartMenu->set_title(str_selecting_programs); lblInfoHead->set_text(str_run_applications_as_another); lblinfoCmd->set_text(str_localization_cmd_line); lblInfoTime->set_text(str_localization_team); labInfoExecutTerm->set_text(str_run_terminal); lblInfoUser->set_text(str_localization_user); lblInfoUserOther->set_text(str_run_of_user); lblInfoUserName->set_text(str_localization_username); lblInfoNooPriority->set_text(str_localization_priority); lblInfoExec->set_text(str_change_priority); lblInfoPriority->set_text(string(str_localization_priority) + ":"); lblMessageError->set_text(str_select_app_program); messageError->set_title(str_localization_attention); lblGraphics->set_text(str_localization_graphics); lblTools->set_text(str_localization_tools); lblInternet->set_text(str_localization_internet); lblMultimedia->set_text(str_localization_multimedia); lblSettings->set_text(str_localization_settings); lblEducation->set_text(str_localization_education); lblOffice->set_text(str_localization_office); lblOther->set_text(str_localization_other); lblDevelopment->set_text(str_localization_development); lblSystem->set_text(str_localization_system); btnListApp->set_tooltip_text(str_application_overview); btnFilemaneg->set_tooltip_text(str_file_overview); btnMessageErrorOk->set_label(str_close); lblhelpHeader->set_text(read_documentation_web); lblhelpText->set_text(redirected_documentation); btnReadHelp->set_label(read_online); btnCancelHelp->set_label(cancel); chkAlwaysOpenHelp->set_label(always_redirect); lblwebHeaderName->set_label(name_app_1); lblHeadeWndWeb->set_label(define_name_app); lblwebHeaderName->set_label(define_name_app); } void MainWindow::event() { btnCancelHelp->signal_clicked().connect([&]() {wndShowWeb->hide();}); chkAlwaysOpenHelp->signal_toggled().connect([&]() {flag_open_browser = true;}); btnReadHelp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_browser)); btnSynopsis->signal_activate().connect(sigc::mem_fun(*this, &MainWindow::synopsis_show)); 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::entry_app)); chbTerminal->signal_toggled().connect([&]() {cmbTerminal->set_sensitive(chbTerminal->get_active());denamic_cmd();}); 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_entry_app)); btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::ok_close_entry_app)); iconGraphics->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Graphics)); iconTools->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Tools)); iconInternet->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Internet)); iconMultimedia->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Multimedia)); iconSettings->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Settings)); iconEducation->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Education)); iconOffice->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Office)); iconOther->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Other)); iconDevelopment->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Development)); iconSystem->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_System)); btnSynopsis->signal_activate().connect(sigc::mem_fun(*this, &MainWindow::synopsis_show)); btnAbout->signal_activate().connect([&]() {aboutWindows->show();}); cmbUser->signal_changed().connect([&]() {changed_user();this->denamic_cmd();}); rbSudo->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); txtCmd->signal_focus_out_event().connect(sigc::mem_fun(*this, &MainWindow::focus_out_txt_cmd)); txtCmd->signal_focus_in_event().connect(sigc::mem_fun(*this, &MainWindow::focus_in_txt_cmd)); txtCmd->signal_delete_text().connect(sigc::mem_fun(*this, &MainWindow::delete_cmd)); rbSu->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); rbPkexec->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); cmbTerminal->signal_changed().connect([&]() {this->denamic_cmd();}); } void MainWindow::sudo_nice(){ string response = this->call("id -Gn"); if (geteuid() == 0 || cmbUser->get_active_text() == "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(nice_19); lblTime4EpriorityHigh->set_text(nice__20); } else if (rbSudo->get_active() && response.find("wheel") != string::npos){ spinPriority->set_range(-20, 19); spinPriority->set_increments(1.0, -1.0); scalePriority->set_range(-20, 19); scalePriority->set_value(0); lblTimeEpriorityLow->set_text(nice_19); lblTime4EpriorityHigh->set_text(nice__20); } else if (rbSu->get_active()){ spinPriority->set_range(0, 19); spinPriority->set_increments(1.0, -1.0); scalePriority->set_range(0, 19); scalePriority->set_value(0); lblTimeEpriorityLow->set_text(nice_19); lblTime4EpriorityHigh->set_text(nice_0); } else if (rbPkexec->get_active()){ spinPriority->set_range(0, 19); spinPriority->set_increments(1.0, -1.0); scalePriority->set_range(0, 19); scalePriority->set_value(0); lblTimeEpriorityLow->set_text(nice_19); lblTime4EpriorityHigh->set_text(nice_0); } this->denamic_cmd(); } void MainWindow::changed_user() { Glib::ustring entry_user = cmbUser->get_active_text(); string response = this->call("id -Gn"); bool flag_wheel_sudo = (rbSudo->get_active()==true && response.find("wheel") != string::npos); if (geteuid() == 0 || entry_user == "root" || flag_wheel_sudo==true) { spinPriority->set_range(-20, 19); spinPriority->set_increments(1.0, -1.0); scalePriority->set_range(-20, 19); scalePriority->set_value(0); lblTimeEpriorityLow->set_text(nice_19); lblTime4EpriorityHigh->set_text(nice__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(nice_19); lblTime4EpriorityHigh->set_text(nice_0); } } void MainWindow::delete_cmd(const int &x, const int &y) { if (x == 0) {} if (y > 1) { chbTerminal->set_active(false); chbAnotherUser->set_active(false); cbxExecuteEpriority->set_active(false); name_app = ""; path_file = ""; user_cmd = ""; txtCmd->set_text(""); } } bool MainWindow::focus_in_txt_cmd(GdkEventFocus* event) { if (event) {} if (user_cmd.length() != 0) { } else if (name_app.length() != 0) { } else if (path_file.length() != 0) { } else{ user_cmd = txtCmd->get_text(); } cmd_old = txtCmd->get_text(); return true; } void MainWindow::synopsis_show() { if (flag_open_browser == true) { this->open_browser(); } else { wndShowWeb->show_all(); } } void MainWindow::open_browser() { #ifdef WEBKIT_FOUND webkit_web_view_load_uri(one, link_doc); wndWeb->show_all(); #else string cmd = cmd_xdg + string(_(link_doc)) + " &"; string buf = ""; if (geteuid() == 0) { string response_user = getlogin(); int size_s = std::snprintf(nullptr, 0, cmd_execute, response_user.c_str(), cmd.c_str()) + 1; auto size = static_cast(size_s); std::unique_ptr buf(new char[ size ]); std::snprintf( buf.get(), size, cmd_execute, response_user.c_str(), cmd.c_str() ); cmd = std::string( buf.get(), buf.get() + size - 1 ); } index_error = system(cmd.c_str()); #endif } void MainWindow::icon_clear() { list_Graphics->clear(); list_Tools->clear(); list_Internet->clear(); list_Multimedia->clear(); list_Settings->clear(); list_Education->clear(); list_Office->clear(); list_Other->clear(); list_Development->clear(); list_System->clear(); } void MainWindow::ok_close_entry_app() { this->icon_clear(); dialogStartMenu->hide(); } void MainWindow::select_Graphics() { this->tempate_icon_select(this->iconGraphics, list_Graphics); } void MainWindow::select_Tools() { this->tempate_icon_select(this->iconTools, list_Tools); } void MainWindow::select_Internet() { this->tempate_icon_select(this->iconInternet, list_Internet); } void MainWindow::select_Multimedia() { this->tempate_icon_select(this->iconMultimedia, list_Multimedia); } void MainWindow::select_Settings() { this->tempate_icon_select(this->iconSettings, list_Settings); } void MainWindow::select_Education() { this->tempate_icon_select(this->iconEducation, list_Education); } void MainWindow::select_Office() { this->tempate_icon_select(this->iconOffice, list_Office); } void MainWindow::select_Other() { this->tempate_icon_select(this->iconOther, list_Other); } void MainWindow::select_Development() { this->tempate_icon_select(this->iconDevelopment, list_Development); } void MainWindow::select_System() { this->tempate_icon_select(this->iconSystem, list_System); } void MainWindow::tempate_icon_select(Gtk::IconView *icon, Glib::RefPtr >k_list) { auto selected = (*icon).get_selected_items(); if(!selected.empty()) { this->set_icon_array(); this->unselect_icon(icon); const Gtk::TreeModel::Path& path = *selected.begin(); Gtk::TreeModel::iterator iter = gtk_list->get_iter(path); Gtk::TreeModel::Row row = *iter; auto app_name_exec = row[m_Columns.app_name_exec]; const Glib::ustring description = row[m_Columns.m_col_description]; path_file = ""; name_app = ""; user_cmd = ""; txtCmd->set_text(app_name_exec); name_app = txtCmd->get_text(); size_t len_name_app = name_app.length(); string array_del[] = {"%f", "%F", "%d", "%D", "%n", "%N", "%U"}; for (auto &del_sim: array_del) { str_remove(name_app, del_sim); if (name_app.length() != len_name_app) { txtCmd->set_text(name_app); break; } } this->denamic_cmd(); } } void MainWindow::unselect_icon(Gtk::IconView *icon_entry) { for (int index=0; index<10; ++index) { Gtk::IconView *icon = this->array_icon[index]; if (icon_entry != icon) { icon->unselect_all(); } } } void MainWindow::settings() { if (flag_prog_file == 1){ user_cmd = name_app_cmd; } if (flag_prog_file == 2){ path_file = name_app_cmd; } this->pars_apps(); this->get_builder(); this->event(); this->localization(); this->set_icon_array(); this->add_CSS(); spinPriority->set_range(0, 19); spinPriority->set_increments(1.0, -1.0); scalePriority->set_range(0, 19); scalePriority->set_value(0); lblTimeEpriorityLow->set_text(nice_19); lblTime4EpriorityHigh->set_text(nice_0); scalePriority->set_inverted(true); Gtk::Widget *boxWidget; builder->get_widget("boxColor", boxWidget); overHead->add_overlay(*boxWidget); this->pars_dir_bin(); this->pars_dir_terminal(); this->pars_users(); this->is_user_wheel(); cmbUser->set_active_text(user_exec_app); this->activ_or_block_execute_epriority(); this->changed_user(); cmbUser->set_sensitive(false); lblInfoUserName->set_sensitive(false); rbPkexec->set_sensitive(false); rbSu->set_sensitive(false); rbSudo->set_sensitive(false); btnBoxAboutDialog->set_visible(false); cmbTerminal->set_sensitive(false); ubl_make_plugs(boxAbout, boxAbout, socket_ext_id_I, 0); #ifdef WEBKIT_FOUND one = WEBKIT_WEB_VIEW( webkit_web_view_new() ); three = Glib::wrap(GTK_WIDGET(one)); wndWeb->add(*three); #endif } void MainWindow::close_entry_app() { this->icon_clear(); 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); lblTimeEpriorityLow->set_sensitive(flag); lblTime4EpriorityHigh->set_sensitive(flag); this->denamic_cmd(); } void MainWindow::open_filemaneg() { wndChooseFileWallpaper->set_current_folder("/bin/"); wndChooseFileWallpaper->show(); } void MainWindow::close_filemaneg() { wndChooseFileWallpaper->hide(); } void MainWindow::get_path_filemaneg() { name_app = ""; user_cmd = ""; path_file = wndChooseFileWallpaper->get_filename(); if (path_file.length() == 0) {} else{ txtCmd->set_text(path_file); this->close_filemaneg(); } this->denamic_cmd(); } vector MainWindow::find_all(string &text, string &word) { size_t index{}; vector list_index; while ((index = text.find(word, index)) != std::string::npos) { index += word.length(); list_index.push_back(index); } return list_index; } void MainWindow::tempalte_row(string Name, string Exec, string path , Glib::RefPtr &dtk_list) { Gtk::TreeModel::Row row = *(dtk_list->append()); string s_remove[] = {".png", ".jpg", ".jpeg", ".svg", ".xpm"}; string str_search = "/"; if (path.find(str_search) != string::npos){ vector list_index = this->find_all(path, str_search); int index = list_index.size(); if (index>1){ index = index-1; index = list_index.at(index); if (index){ size_t len_path = path.length(); path = path.substr(index, len_path); } } } for (string &del: s_remove){ if (path.find(del) != string::npos){ str_remove(path, del); } } row[m_Columns.m_col_filename] = path; row[m_Columns.m_col_description] = Name; row[m_Columns.icon_name] = path; row[m_Columns.app_name_exec] = Exec; row[m_Columns.float_h_align] = 0.5; row[m_Columns.float_w_align] = 0.5; } void MainWindow::open_list_app() { this->template_apps_obj(iconGraphics, list_Graphics); this->template_apps_obj(iconTools, list_Tools); this->template_apps_obj(iconInternet, list_Internet); this->template_apps_obj(iconMultimedia, list_Multimedia); this->template_apps_obj(iconSettings, list_Settings); this->template_apps_obj(iconEducation, list_Education); this->template_apps_obj(iconOffice, list_Office); this->template_apps_obj(iconOther, list_Other); this->template_apps_obj(iconDevelopment, list_Development); this->template_apps_obj(iconSystem, list_System); string path = ""; for ( const auto &st_app: list_app) { for ( const auto &str_categor: st_app.Categories) { path = st_app.Icon; if (str_categor == "Graphics") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Graphics); } else if (str_categor == "Utility") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Tools); } else if (str_categor == "Network") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Internet); } else if (str_categor == "AudioVideo") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Multimedia); } else if (str_categor == "Settings") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Settings); } else if (str_categor == "Education") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Education); } else if (str_categor == "Office") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Office); } else if (str_categor == "Other") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Other); } else if (str_categor == "Development") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_Development); } else if (str_categor == "System") { this->tempalte_row(st_app.Name,st_app.Exec, path, list_System); } } } dialogStartMenu->show_all(); } string MainWindow::start_cmd(string user_cmd) { string str_cmd_terminal = ""; string str_variants_root = ""; string str_nice_cmd = ""; if (chbAnotherUser->get_active()) { if (rbPkexec->get_active()) { str_variants_root = "pkexec --user " + cmbUser->get_active_text(); if (cbxExecuteEpriority->get_active()) { str_variants_root += " nice -n " + to_string(spinPriority->get_value_as_int()); } str_variants_root += " env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY "; } else if (rbSu->get_active()) { chbTerminal->set_active(true); string str_user = cmbUser->get_active_text(); if (str_user != "root") { str_variants_root = "su -l " + cmbUser->get_active_text(); } else{ str_variants_root = "su "; } str_variants_root += " -c \" DISPLAY=$DISPLAY "; if (cbxExecuteEpriority->get_active()) { str_variants_root += "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; } } else if (rbSudo->get_active()) { chbTerminal->set_active(true); if (user_exec_app==cmbUser->get_active_text()) { str_variants_root = "sudo "; } else{ str_variants_root = "sudo -u " + cmbUser->get_active_text() + " "; } if (cbxExecuteEpriority->get_active()) { str_variants_root += "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; } } } if (cmbUser->get_active_text().length() != 0) { string user_cmd_X = "xhost +SI:localuser:"; user_cmd_X += cmbUser->get_active_text(); user_cmd_X += " > /dev/null 2>&1"; index_error = system(user_cmd_X.c_str()); } if ((cbxExecuteEpriority->get_active()) && (chbAnotherUser->get_active() == false)) { str_nice_cmd = "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; } if (user_cmd.length() == 0 && name_app.length() == 0 && path_file.length() == 0) { messageError->set_title(str_localization_attention); messageError->show(); return ""; } if (chbTerminal->get_active() == true) { string name_terminal_arr = ""; string name_terminal = cmbTerminal->get_active_text(); if (name_terminal.length() != 0) { int len_termunal_cmd = sizeof(termunal_cmd)/sizeof(*termunal_cmd); for (int index = 0; index 0) { if (access(path_file.c_str(), X_OK) != -1) { cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " " + path_file; } else{ cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " xdg-open '" + path_file + "' "; } } else if (name_app.length() > 0) { cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + name_app; } else if (user_cmd.length() > 0) { cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " " + user_cmd; } if ((cmd.find("-e su ") != string::npos) || (cmd.find("-x su ") != string::npos)) { cmd+=" \""; } cmd = "nohup " + cmd; cmd += " > /dev/null 2>&1"; return cmd; } void MainWindow::call_app(string &cmd) { if (cmd.length() != 0) { std::thread t([&](string cmd) {int index = system(cmd.c_str()); if (index){}}, cmd); t.detach(); } } void MainWindow::denamic_cmd() { if (chbTerminal->get_active() == true || chbAnotherUser->get_active() == true || cbxExecuteEpriority->get_active() == true) { if (txtCmd->get_text().length() == 0) { chbTerminal->set_active(false); chbAnotherUser->set_active(false); cbxExecuteEpriority->set_active(false); path_file = ""; name_app = ""; user_cmd = ""; txtCmd->set_text(user_cmd); messageError->set_title(str_localization_attention); messageError->show(); } else{ txtCmd->set_text(this->start_cmd(user_cmd)); } } else{ if (user_cmd.length() != 0) { txtCmd->set_text(this->start_cmd(user_cmd)); } else if (path_file.length() != 0) { txtCmd->set_text(this->start_cmd(user_cmd)); } else if (name_app.length() != 0) { txtCmd->set_text(this->start_cmd(user_cmd)); } } } string MainWindow::call(string cmd) { FILE *fp; int status; char path[PATH_MAX] = {0}; fp = popen(cmd.c_str(), "r"); if (fp == NULL) { exit(1); } while (fgets(path, PATH_MAX, fp) != NULL) { break; } status = pclose(fp); if (status == -1) { exit(1); } return path; } bool MainWindow::focus_out_txt_cmd(GdkEventFocus* event) { if (event) {} if (cmd_old != txtCmd->get_text()) { user_cmd = txtCmd->get_text(); } return true; } void MainWindow::entry_app() { this->denamic_cmd(); if (name_app.length() == 0 && path_file.length() == 0) { } string cmd = txtCmd->get_text(); this->call_app(cmd); } void MainWindow::activ_or_block_other_user() { bool flag = chbAnotherUser->get_active(); cmbUser->set_sensitive(flag); lblInfoUserName->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); } this->denamic_cmd(); } void MainWindow::change_scale_priority() { scalePriority->set_value(spinPriority->get_value_as_int()); this->denamic_cmd(); } void MainWindow::change_spin_priority() { spinPriority->set_value(scalePriority->get_value()); this->denamic_cmd(); } 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_dir_terminal() { namespace fs = std::filesystem; std::string path = "/bin"; string file_name = ""; string name_terminal = ""; for (const auto & entry: fs::directory_iterator(path)) { file_name = entry.path().filename().string(); int len_termunal_cmd = sizeof(termunal_cmd)/sizeof(*termunal_cmd); for (int index = 0; index < len_termunal_cmd; ++index) { name_terminal = termunal_cmd[index]; size_t index_term = name_terminal.find(" "); if (index_term != string::npos){ name_terminal = name_terminal.substr(0, index_term); if (name_terminal == file_name) { cmbTerminal->append(name_terminal); cmbTerminal->set_active_text(name_terminal); } } } } } void MainWindow::is_user_wheel(){ string response = this->call("id -Gn"); if (response.find("wheel") == string::npos){ flag_sudo = false; rbSudo->set_sensitive(flag_sudo); } size_t user_index = response.find(" "); if (user_index!=string::npos){ user_exec_app = response.substr(0, user_index); } } unsigned short MainWindow::read_uid_min_max(string filename, string search){ std::string line; int uid = 0; string remove_tab = "\t"; string remove_space = " "; std::ifstream in(filename); // окрываем файл для чтения if (in.is_open()){ while (getline(in, line)){ try{ if (line.find(search) != string::npos && (line.find("SYS_"+search) == string::npos)) { this->str_remove(line, search); this->str_remove(line, remove_space); this->str_remove(line, remove_tab); uid = atoi(line.c_str()); } } catch (int x) { if (search == "UID_MIN"){ uid = 1000; } else{ uid = 65534; } } } } else{ if (search == "UID_MIN") { uid = 1000; } else{ uid = 65534; } } in.close(); return uid; } void MainWindow::pars_users() { unsigned short uid_min = this->read_uid_min_max("/etc/login.defs", "UID_MIN"); unsigned short uid_max = this->read_uid_min_max("/etc/login.defs", "UID_MAX"); while (true) { errno = 0; passwd* entry = getpwent(); if (!entry) { if (errno) { break; } break; } if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) { cmbUser->append(entry->pw_name); } } endpwent(); } vector MainWindow::split(const std::string &s, char delim) { std::stringstream ss(s); std::string item; std::vector elems; while (std::getline(ss, item, delim)) { elems.push_back(item); } return elems; } void MainWindow::str_remove(std::string& source, std::string to_remove) { string::size_type n = to_remove.length(); for (string::size_type i = source.find(to_remove); i != string::npos; i = source.find(to_remove)) source.erase(i, n); } void MainWindow::pars_apps() { if (list_app.size() != 0 ) {return;} namespace fs = std::filesystem; struct struct_App App; string file_name = ""; string str_Categories; string path = "/usr/share/applications/"; for (const auto & entry : fs::directory_iterator(path)) { file_name = entry.path().filename().string(); path = "/usr/share/applications/"+file_name; if (file_name.find(".desktop") != std::string::npos) { GKeyFile *gfile=g_key_file_new(); g_key_file_load_from_file(gfile, path.c_str(), G_KEY_FILE_KEEP_TRANSLATIONS, NULL); char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", NULL); char *Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); char *Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); char *Categories = g_key_file_get_locale_string(gfile, "Desktop Entry", "Categories", setlocale(LC_ALL, ""), NULL); char *Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); char *Mime = g_key_file_get_string(gfile, "Desktop Entry", "MimeType", NULL); if (Type == NULL) continue; if (Name == NULL) continue; if (Exec == NULL) continue; if (Categories == NULL) continue; if (Icon == NULL) continue; str_Categories = Categories; App.Name = Name; App.Type = Type; App.Exec = Exec; App.Icon = Icon; if (Mime != NULL) { App.MimeType = Mime; } else{ App.MimeType = ""; } App.Name_desktop = file_name; App.Categories = split(str_Categories, ';'); } list_app.push_back(App); } } 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(); } MainWindow::~MainWindow() { } void help() { cout << str_help_h; }