ACC SHELL

Path : /usr/share/YaST2/include/sudo/
File Upload :
Current File : //usr/share/YaST2/include/sudo/dialogs.ycp

/* ------------------------------------------------------------------------------
 * Copyright (c) 2006 Novell, Inc. All Rights Reserved.
 *
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of version 2 of the GNU General Public License as published by the
 * Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, contact Novell, Inc.
 *
 * To contact Novell about this file by physical or electronic mail, you may find
 * current contact information at www.novell.com.
 * ------------------------------------------------------------------------------
 */

/**
 * File:	include/sudo/dialogs.ycp
 * Package:	Configuration of sudo
 * Summary:	Dialogs definitions
 * Authors:	Bubli <kmachalkova@suse.cz>
 *
 * $Id: dialogs.ycp 27914 2006-02-13 14:32:08Z locilka $
 */

{

textdomain "sudo";

import "Label";
import "Wizard";
import "Sudo";
import "DialogTree";

include "sudo/helps.ycp";
include "sudo/complex.ycp";


string sudo_caption = _("Sudo Configuration");

list <term> CreateItems ( list <map <string, any> > aliases )
{
    list < term > items = [];
    integer i = 0;

    foreach( map <string, any> ent, aliases, {
	items = add (items, `item(`id(i), ent["name"]:"", mergestring(ent["mem"]:[],",")));
	i = i+1;
    });

    return items;
}

void SwapUIItems( integer idx1, integer idx2)
{
    list <term> items = (list <term>) UI::QueryWidget(`id("table_user_spec"), `Items);
    list args1 = argsof(items[idx1]:`none());
    list args2 = argsof(items[idx2]:`none());

    items[idx1] = toterm( `item, merge([`id(idx1)], sublist(args2,1)) );
    items[idx2] = toterm( `item, merge([`id(idx2)], sublist(args1,1)) );

    UI::ChangeWidget(`id("table_user_spec"), `Items, items);
}

void SwapItems( integer idx1, integer idx2)
{
    map <string, any> item1 = Sudo::GetRule( idx1 );
    map <string, any> item2 = Sudo::GetRule( idx2 );

    Sudo::SetRule(idx2, item1);
    Sudo::SetRule(idx1, item2);

}

symbol HandleUserSpecs(string key, map event) {
	any ret = event["ID"]:nil;

	if (ret == "add_spec") {
	    Sudo::SetItem( size(Sudo::GetRules()) );
	    return `add_spec;
	} else if (ret == "edit_spec") {
	    integer idx = (integer) UI::QueryWidget(`id("table_user_spec"), `CurrentItem);
	    Sudo::SetItem( idx );
	    if (Sudo::SystemRulePopup( Sudo::GetRule(idx), false)) 
		return `edit_spec;
	} else if (ret == "delete_spec") {
		integer idx = (integer) UI::QueryWidget(`id("table_user_spec"), `CurrentItem);
		list <term> items = (list <term>) UI::QueryWidget(`id("table_user_spec"), `Items);

		if (Sudo::SystemRulePopup( Sudo::GetRule(idx), true)) {
		    Sudo::RemoveRule(idx);
		    items = remove(items, idx);

		    integer i = 0;
		    items = maplist(term tmp, items,{
		        list args = argsof( tmp );
		        term t = toterm( `item, merge ([`id(i)], sublist( args,1 )) );
			i = i+1;
			return t;
		    } ); 
		    UI::ChangeWidget(`id("table_user_spec"), `Items, items);
		    Sudo::SetModified();
		}
		EnableDisableButtons("edit_spec", "delete_spec", items);
	} else if ( ret == "up"){
	    integer idx = (integer) UI::QueryWidget(`id("table_user_spec"), `CurrentItem);
	    if (idx != 0) {
	        SwapItems( idx, idx - 1);
		SwapUIItems( idx, idx - 1 );
		UI::ChangeWidget(`id("table_user_spec"), `CurrentItem, idx-1);
		Sudo::SetModified();
	    }
	} else if ( ret == "down"){
	    integer idx = (integer) UI::QueryWidget(`id("table_user_spec"), `CurrentItem);
	    if ( idx != (size( Sudo::GetRules())-1) ) {
	        SwapItems( idx, idx + 1 );
		SwapUIItems( idx, idx + 1 );
		UI::ChangeWidget(`id("table_user_spec"), `CurrentItem, idx+1);
		Sudo::SetModified();
	    }
	}
}

void InitUserSpecs (string key) {
	list <term> items = [];
	list <map <string,any> > rules = Sudo::GetRules();
	integer idx = 0;

	foreach(map <string, any> ent, rules, {
	    string cmds = "";
	    if (size(ent["commands"]:[]) > 1) {
		 cmds = mergestring(ent["commands"]:[],",");
	    }
	    else
		cmds = (ent["commands"]:[])[0]:"";

	    items = add(items, `item(`id(idx), 
			(string) ent["user"]:"", (string) ent["host"]:"", (string) ent["run_as"]:"",
			(ent["tag"]:"" == "NOPASSWD:") ? _("Yes") : _("No"), cmds));
		idx = idx + 1;
	});

	UI::ChangeWidget(`id("table_user_spec"),`Items,items);
	EnableDisableButtons("edit_spec", "delete_spec", items);
}

symbol HandleHostAliases(string key, map event) {
	any ret = event["ID"]:nil;

	if (ret == "add_host_alias") 
	{
	    Sudo::SetItem( size( Sudo::GetHostAliases2()) );
	    //current_alias_name = "";
	    return `add_h_alias;
	}
	else if (ret == "edit_host_alias")
	{
	    Sudo::SetItem( (integer) UI::QueryWidget(`id("table_host_aliases"), `CurrentItem) );
	    return `edit_h_alias;
	}
	else if (ret == "delete_host_alias") {
		integer idx = (integer) UI::QueryWidget(`id("table_host_aliases"),`CurrentItem);
		list <term> items = (list <term>) UI::QueryWidget(`id("table_host_aliases"), `Items);
		string name = Sudo::GetHostAliases2()[idx, "name"]:"";

		boolean confirm_delete = true;

		if(Sudo::SearchRules("host",name)) {
			if (!Popup::ContinueCancel (sformat(_("Host alias %1 is being used in one of sudo rules.
Deleting it may result in an inconsistent sudo configuration file. Really delete it ?
"), name)))
				confirm_delete = false;
		}

		if (confirm_delete) {
			Sudo::RemoveHostAlias2( idx );
			items = CreateItems( Sudo::GetHostAliases2());
			UI::ChangeWidget(`id("table_host_aliases"), `Items, items);
			Sudo::SetModified();
		}
		EnableDisableButtons("edit_host_alias", "delete_host_alias", items);
	}

}

void InitHostAliases(string key) {
	list <map <string, any> > aliases = Sudo::GetHostAliases2();
	list <term> items = CreateItems( aliases );

	UI::ChangeWidget(`id("table_host_aliases"),`Items,items);
	EnableDisableButtons("edit_host_alias", "delete_host_alias", items);
}

symbol HandleUserAliases(string key, map event) {
	any ret = event["ID"]:nil;

	if (ret == "add_user_alias") {
	    /* No alias name set so far */
	    Sudo::SetItem( size( Sudo::GetUserAliases2()) );
	    return `add_u_alias;
	} else if (ret == "edit_user_alias") {
	    Sudo::SetItem( (integer) UI::QueryWidget(`id("table_user_aliases"),`CurrentItem) );
	    return `edit_u_alias;
	} else if (ret == "delete_user_alias") {
		integer idx = (integer) UI::QueryWidget(`id("table_user_aliases"),`CurrentItem);
		list <term> items = (list <term>) UI::QueryWidget(`id("table_user_aliases"), `Items);
		string name = Sudo::GetUserAliases2()[idx, "name"]:"";

		boolean confirm_delete = true;

		if(Sudo::SearchRules("user",name)) {
			if ( !Popup::ContinueCancel (sformat(_("User alias %1 is being used in one of sudo rules .
Deleting it may result in an inconsistent sudo configuration file. Really delete it ?
"), name))) 
			confirm_delete = false;
		}

		if (confirm_delete) {
			Sudo::RemoveUserAlias2( idx );
			items = CreateItems( Sudo::GetUserAliases2());
			UI::ChangeWidget(`id("table_user_aliases"), `Items,  items);
			Sudo::SetModified();
		}
		EnableDisableButtons("edit_user_alias", "delete_user_alias", items);
	}
}

void InitUserAliases (string key) {
	list < map <string, any> > aliases = Sudo::GetUserAliases2();
	list <term> items = CreateItems( aliases );

	UI::ChangeWidget(`id("table_user_aliases"),`Items,items);
	EnableDisableButtons("edit_user_alias", "delete_user_alias", items);
}

symbol HandleRunAsAliases(string key, map event) {
	any ret = event["ID"]:nil;

	if (ret == "add_runas_alias") {
		/* No alias name set so far */
	    Sudo::SetItem( size(Sudo::GetRunAsAliases2()) );
	    return `add_r_alias;
	} else if (ret == "edit_runas_alias") {
	    Sudo::SetItem( (integer) UI::QueryWidget(`id("table_runas_aliases"),`CurrentItem));
	    return `edit_r_alias;
	} else if (ret == "delete_runas_alias") {
		integer idx = (integer) UI::QueryWidget(`id("table_runas_aliases"),`CurrentItem);
		list <term> items = (list <term>) UI::QueryWidget(`id("table_runas_aliases"), `Items);
		string name = Sudo::GetRunAsAliases2()[idx, "name"]:"";

		boolean confirm_delete = true;

		if(Sudo::SearchRules("run_as","(" + name + ")")) {
			if (!Popup::ContinueCancel (sformat(_("RunAs alias %1 is being used in one of sudo rules.
Deleting it may result in an inconsistent sudo configuration file. Really delete it ?
"), name)))
				confirm_delete = false;
		}

		if (confirm_delete) {
			Sudo::RemoveRunAsAlias2( idx );
			items = CreateItems( Sudo::GetRunAsAliases2());
			UI::ChangeWidget(`id("table_runas_aliases"), `Items,  items);
			Sudo::SetModified();
		}
		EnableDisableButtons("edit_runas_alias", "delete_runas_alias", items);
	}

}

void InitRunAsAliases (string key) {
        list < map <string, any> > aliases = Sudo::GetRunAsAliases2();
	list <term> items = CreateItems( aliases );

	UI::ChangeWidget(`id("table_runas_aliases"),`Items,items);
	EnableDisableButtons("edit_runas_alias", "delete_runas_alias", items);

}

symbol HandleCmndAliases(string key, map event) {
	any ret = event["ID"]:nil;

	if (ret == "add_command_alias") {
		/* No alias name set so far */
	   Sudo::SetItem( size(Sudo::GetCmndAliases2()) );
	   return `add_c_alias;
	} else if (ret == "edit_command_alias") {
	    Sudo::SetItem( (integer) UI::QueryWidget(`id("table_command_aliases"),`CurrentItem) );
	    return `edit_c_alias;
	} else if (ret == "delete_command_alias") {
		integer idx = (integer) UI::QueryWidget(`id("table_command_aliases"),`CurrentItem);
		list <term> items = (list <term>) UI::QueryWidget(`id("table_command_aliases"), `Items);
		string name = Sudo::GetCmndAliases2()[idx, "name"]:"";
		boolean confirm_delete = true;

		if(Sudo::SearchRules("commands",name)) {
			if (!Popup::ContinueCancel (sformat(_("Command alias %1 is being used in one of sudo rules.
Deleting it may result in an inconsistent sudo configuration file. Really delete it ?
"), name)))
				confirm_delete = false;
		}

		if (confirm_delete) {
			Sudo::RemoveCmndAlias2( idx );
			items = CreateItems( Sudo::GetCmndAliases2());
			UI::ChangeWidget(`id("table_command_aliases"), `Items, items );
			Sudo::SetModified();
		}
		EnableDisableButtons("edit_command_alias", "delete_command_alias", items);
	}

}

void InitCmndAliases (string key) {
        list < map <string, any> > aliases = Sudo::GetCmndAliases2();
	list <term> items = CreateItems( aliases );

	UI::ChangeWidget(`id("table_command_aliases"),`Items,items);
	EnableDisableButtons("edit_command_alias", "delete_command_alias", items);

}

map <string, map <string,any > > widgets_handling = $[
	"UserSpecifications" : $[
		"widget" : `custom,
		"custom_widget" : `VBox(),
		"init" : InitUserSpecs,
		"handle" : HandleUserSpecs,
		"help" : HELPS["spec"]:"",
	],
	"UserAliases" : $[
		"widget" : `custom,
		"custom_widget" : `VBox(),
		"init" : InitUserAliases,
		"handle" : HandleUserAliases,
		"help" : HELPS["user_aliases"]:"",
	],
	"RunAsAliases" : $[
		"widget" : `custom,
		"custom_widget" : `VBox(),
		"init" : InitRunAsAliases,
		"handle" : HandleRunAsAliases,
		"help" : HELPS["runas_aliases"]:"",
	],
	"HostAliases" : $[
		"widget" : `custom,
		"custom_widget" : `VBox(),
		"init" : InitHostAliases,
		"handle" : HandleHostAliases,
		"help" : HELPS["host_aliases"]:"",
	],
	"CommandAliases" : $[
		"widget" : `custom,
		"custom_widget" : `VBox(),
		"init" : InitCmndAliases,
		"handle" : HandleCmndAliases,
		"help" : HELPS["command_aliases"]:"",
	],
];

map<symbol,any> functions = $[
	`abort : Sudo::Abort,
];

map <string, map <string,any> > tabs = $[
	"user_specs" : $[
		"contents" : `VBox(
					`HBox(
						`Table(
							`id("table_user_spec"),
							`opt(`keepSorting),
							`header (
								_("Users"),
								_("Hosts"),
								_("RunAs"),
								_("NOPASSWD"),
								_("Commands")
							), []
						),
						`VBox(
							`PushButton(`id("up"), _("Up")),
							`PushButton(`id("down"), _("Down"))
						
						)
					),
					`Left(`HBox (
							`PushButton(`id("add_spec"), `opt(`key_F3), " " + Label::AddButton() + " "),
							`PushButton(`id("edit_spec"), `opt(`key_F4), " " + Label::EditButton() + " "),
							`PushButton(`id("delete_spec"),`opt(`key_F5), " " + Label::DeleteButton() + " ")
						))
					 
					),
		"caption" : sudo_caption + ": " + _("Rules for sudo"),
		"tree_item_label" : _("Rules for sudo "),
		"widget_names" : ["UserSpecifications"],
	],
	"user_aliases" : $[
		"contents" : `VBox(
						`Table(
							`id("table_user_aliases"),
							`opt(`keepSorting),
							`header (
								_("Alias Name"),
								_("Members")
							), []
						),
						`Left(`HBox (
							`PushButton(`id("add_user_alias"), `opt(`key_F3), " " + Label::AddButton() + " "),
							`PushButton(`id("edit_user_alias"), `opt(`key_F4), " " + Label::EditButton() + " "),
							`PushButton(`id("delete_user_alias"), `opt(`key_F5), " " + Label::DeleteButton() + " ")
						))

					),
		"caption" : sudo_caption + ": " + _("User Aliases"),
		"tree_item_label" : _("User Aliases"),
		"widget_names" : ["UserAliases"],
	 ] ,
	"runas_aliases" : $[
		"contents" : `VBox(
						`Table(
							`id("table_runas_aliases"),
							`opt(`keepSorting),
							`header (
								_("Alias Name"),
								_("Members")
							), []
						),
						`Left(`HBox (
							`PushButton(`id("add_runas_alias"), `opt(`key_F3), " " + Label::AddButton() + " "),
							`PushButton(`id("edit_runas_alias"), `opt(`key_F4), " " + Label::EditButton() + " "),
							`PushButton(`id("delete_runas_alias"), `opt(`key_F5), " " + Label::DeleteButton() + " ")
						))

					),
		"caption" : sudo_caption + ": " + _("RunAs Aliases"),
		"tree_item_label" : _("RunAs Aliases"),
		"widget_names" : ["RunAsAliases"],
	 ],
	"host_aliases" : $[
		"contents" : `VBox(
						`Table(
							`id("table_host_aliases"),
							`opt(`keepSorting),
							`header (
								_("Alias Name"),
								_("Hosts")
							), []
						),
						`Left(`HBox (
							`PushButton(`id("add_host_alias"), `opt(`key_F3), " " + Label::AddButton() + " "),
							`PushButton(`id("edit_host_alias"), `opt(`key_F4), " " + Label::EditButton() + " "),
							`PushButton(`id("delete_host_alias"), `opt(`key_F5), " " + Label::DeleteButton() + " ")
						))

					),
		"caption" : sudo_caption + ": " + _("Host Aliases"),
		"tree_item_label" : _("Host Aliases"),
		"widget_names" : ["HostAliases"],
	 ],
	"cmnd_aliases" : $[
		"contents" : `VBox(
						`Table(
							`id("table_command_aliases"),
							`opt(`keepSorting),
							`header (
								_("Alias Name"),
								_("Commands")
							), []
						),
						`Left(`HBox (
							`PushButton(`id("add_command_alias"), `opt(`key_F3), " " + Label::AddButton() + " "),
							`PushButton(`id("edit_command_alias"), `opt(`key_F4), " " + Label::EditButton() + " "),
							`PushButton(`id("delete_command_alias"), `opt(`key_F5), " " + Label::DeleteButton() + " ")
						))

					),
		"caption" : sudo_caption + ": " + _("Command Aliases"),
		"tree_item_label" : _("Command Aliases"),
		"widget_names" : ["CommandAliases"],
	 ],
];

any RunSudoDialogs() {

	list <string> tree_dialogs = ["user_specs", "user_aliases", "runas_aliases", "host_aliases", "cmnd_aliases"];


	return DialogTree::ShowAndRun ($[
		"ids_order" : tree_dialogs,
		"initial_screen" : initial_screen,
		"screens" : tabs,
		"widget_descr" : widgets_handling,
		"back_button" : nil, //Label::BackButton(),
		"abort_button" : Label::CancelButton(),
		"next_button" : Label::OKButton(),
		"functions" : functions,
	]);
}

}

ACC SHELL 2018