You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublexec/source/ublexec.cc

444 lines
17 KiB

#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_css = "/usr/share/ublexec/css/style.css";
//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("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("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);
builder->get_widget("boxColor", boxColor);
}
void MainWindow::add_CSS(){
Glib::RefPtr<Gtk::CssProvider> cssProvider = Gtk::CssProvider::create();
cssProvider->load_from_path(path_css);
Glib::RefPtr<Gtk::StyleContext> styleContext = Gtk::StyleContext::create();
Glib::RefPtr<Gdk::Screen> 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<Gtk::StyleContext> context = boxColor->get_style_context();
context->add_class("cssboxColor1");
}
void MainWindow::localization(){
this->set_title(gettext("ublexec"));
btnStart->set_label(gettext("Run"));
wndChooseFileWallpaper->set_title(gettext("Please select File"));
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"));
}
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();
this->add_CSS();
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(){
wndChooseFileWallpaper->show();
}
void MainWindow::close_filemaneg(){
wndChooseFileWallpaper->hide();
}
void MainWindow::get_path_filemaneg(){
path_file_name = wndChooseFileWallpaper->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();
}