Author: kmachalkova Date: Tue Nov 18 17:22:41 2008 New Revision: 53387 URL: http://svn.opensuse.org/viewcvs/yast?rev=53387&view=rev Log: - Rewrite of Perl agent to store sudoers data in non-associative data structure + adapting business logic to use lists, not maps, added up/down buttons to help setting sudo rules priorities (bnc#439164, bnc#365178) Modified: trunk/sudo/agents/ag_etc_sudoers trunk/sudo/agents/sudo.scr trunk/sudo/src/Sudo.ycp trunk/sudo/src/complex.ycp trunk/sudo/src/dialog-cmnd.ycp trunk/sudo/src/dialog-host.ycp trunk/sudo/src/dialog-runas.ycp trunk/sudo/src/dialog-spec.ycp trunk/sudo/src/dialog-user.ycp trunk/sudo/src/dialogs.ycp Modified: trunk/sudo/agents/ag_etc_sudoers URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/agents/ag_etc_sudoers?rev=53... ============================================================================== --- trunk/sudo/agents/ag_etc_sudoers (original) +++ trunk/sudo/agents/ag_etc_sudoers Tue Nov 18 17:22:41 2008 @@ -11,7 +11,7 @@ my $filename = "/etc/sudoers"; -my %data; #= ( +my @data2 = (); #= ( # "Host_Alias" => [ ["# Host Alias Specification","SERVERS", "ns, www, mail"],["","FOO", "www.foo.org"] ], # "User_Alias" => [ ["# User Alias Specification", "BAT","foobar"], ["","WWW", "wwwrun"] ], # "Cmnd_Alias" => [ ["# Command Alias Specification", "HALT", "/usr/sbin/halt, /usr/sbin/shutdown -h now,"], ["","REBOOT", "/sbin/reboot"] ], @@ -21,6 +21,8 @@ # '%wheel' => [ ["# Same thing without password", "ALL", "(ALL) NOPASSWD: HALT,REBOOT"] ], # ); + + sub parse_file { if (!open(INFILE, $filename)) { @@ -37,18 +39,19 @@ next; } - my $alias = ""; - my @entry = (); + my $alias = ""; + + my @entry2 = (); if (/^(\S+)\s+(\S+)\s*=\s*([^#]*)/) { $alias =$1; - push(@entry,$comment,$2,$3); + push(@entry2, $comment, $alias, $2, $3); } elsif (/^(\S+)\s+(\S+)/) { $alias =$1; - push(@entry,$comment,$2,""); + push(@entry2, $comment, $alias, $2); } - push (@{$data{$alias}}, @entry); + push (@data2, @entry2); $comment = ""; } @@ -57,26 +60,18 @@ return 1; } -sub store_key { - my $key = $_[0]; +sub store_line { + my $line = $_[0]; + my ($comment, $type, $name, $members) = @{$line}; - if (exists ($data{$key})) { - my @key_data = @{$data{$key}}; - foreach my $entry (@key_data) { - my ($comment, $name, $members) = @{$entry}; - - if($comment){ - print OUTFILE $comment; - } - if($name) { - if($members) { - print OUTFILE $key,"\t", $name, " = ", $members, "\n"; - } - else { - print OUTFILE $key,"\t", $name,"\n"; - } - } - } + if($comment){ + print OUTFILE $comment; + } + if($members) { + print OUTFILE $type,"\t", $name, " = ", $members, "\n"; + } + else { + print OUTFILE $type,"\t", $name,"\n"; } } @@ -85,30 +80,10 @@ open(OUTFILE,">$filename.YaST2.new") or return y2error("Could not open file $filename.YaST2.new for writing: %1", $!), 0; - #Store Host Aliases first and delete old stuff - store_key("Host_Alias"); - delete($data{"Host_Alias"}); - - #Store User Aliases next - store_key("User_Alias"); - delete($data{"User_Alias"}); - - #Store Command Aliases next - store_key("Cmnd_Alias"); - delete($data{"Cmnd_Alias"}); - - #Defaults next - store_key("Defaults"); - delete($data{"Defaults"}); - - #Runas Aliases then - store_key("Runas_Alias"); - delete($data{"Runas_Alias"}); - #Dump the rest - foreach my $key (keys %data) { - store_key($key); - delete($data{$key}); + foreach my $line (@data2) { + store_line($line); + #delete($data{$key}); } close(OUTFILE); @@ -136,35 +111,14 @@ while ( <STDIN> ) { my ($command, $path, $argument) = ycp::ParseCommand ($_); - if ($command eq "Dir") { - if ($path eq ".") { - my @keys = keys %data; - ycp::Return(@keys); - } - else { - ycp::Return([]); - } - } - - elsif($command eq "Read") { - #Remove leading '.' - #$path =~ s/.//; - my @p = ycp::PathComponents($path); - - if (exists($data{$p[0]})) { - ycp::Return(@{$data{$p[0]} }); - } - else { - y2error("Unrecognized key '$p[0]'"); - ycp::Return(undef); - } + if($command eq "Read") { + ycp::Return(@data2); } elsif($command eq "Write") { my $result = "true"; - if ($path eq "." && ref($argument) eq "HASH") { - %data = %{$argument}; - + if ($path eq "." && ref($argument) eq "ARRAY") { + @data2 = @{$argument}; } elsif ($path eq "." && !defined($argument)) { $result = store_file() ? "true" : "false"; @@ -188,4 +142,4 @@ } #Debug only ! -#print STDERR Dumper(%data); +#print STDERR Dumper(@data2); Modified: trunk/sudo/agents/sudo.scr URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/agents/sudo.scr?rev=53387&am... ============================================================================== --- trunk/sudo/agents/sudo.scr (original) +++ trunk/sudo/agents/sudo.scr Tue Nov 18 17:22:41 2008 @@ -8,18 +8,21 @@ * Authors: * Bubli <kmachalkova@suse.cz> * Example: - * Dir(.sudo) - * (["User_Alias","Runas_Alias","Host_Alias","ALL", "%wheel"] ) * - * Read(.sudo.User_Alias) - * (["WEBMASTERS = will, wendy, wim"]) - * - * Write(.sudo.Host_Alias, "SERVERS = master, mail, www, ns") + * Read(.sudo) + * ([ + * ["#We let root and any user in group wheel run any command on any host as any user.\n", "root", "ALL", "(ALL) ALL"], + * ["", "%wheel", "ALL", "(ALL) ALL"] + * ] + * ) + * Write(.sudo, [ ["#first rule", "user", "HOST", "rule1"], ["#second rule", "otheruser", "HOST", "rule2"] ]) * (true) * * $Id: sudo.scr 11113 2005-10-20 14:15:16Z kmachalkova $ * - * Fore more information about possible keys and values + * Read returns and Write accepts list of lists of strings, ordered as follows: + # ["comment to this rule or alias", username | keyword, hostname | alias name, rule | csv list ] + * Fore more information about possible keywords, aliases and values * consult with the sudoers man pages `man sudoers`. */ Modified: trunk/sudo/src/Sudo.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/Sudo.ycp?rev=53387&r... ============================================================================== --- trunk/sudo/src/Sudo.ycp (original) +++ trunk/sudo/src/Sudo.ycp Tue Nov 18 17:22:41 2008 @@ -51,7 +51,7 @@ */ boolean modified = false; -integer sl = 500; +integer sl = 10; /** * Data was modified? * @return true if modified @@ -66,100 +66,100 @@ global string ValidCharsUsername = deletechars (String::CGraph (), "'"") + " "; -map <string, list < list <string> > > settings = $[]; +list < list <string> > settings2 = []; map <string, list<string> > host_aliases = $[]; +list< map <string, any> > host_aliases2 = []; map <string, list<string> > user_aliases = $[]; +list< map <string, any> > user_aliases2 = []; map <string, list<string> > cmnd_aliases = $[]; +list< map <string, any> > cmnd_aliases2 = []; map <string, list<string> > runas_aliases = $[]; +list< map <string, any> > runas_aliases2 = []; list <list <string> > defaults = []; list < map <string, any> > user_specs = []; +list < map <string, any> > rules = []; list <string> deleted_specs = []; global list <string> all_users = []; -boolean ReadSudoSettings() { - list <string> keys = SCR::Dir(.sudo); +boolean ReadSudoSettings2() { + settings2 = ( list < list <string> >)SCR::Read(.sudo); + y2milestone("Sudo settings %1", settings2); + + foreach( list <string> line, settings2, { + string type = line[1]:""; + + switch (type) { + case "Host_Alias": { + list <string> lst = splitstring(deletechars( line[3]:""," \t"), ","); + host_aliases2 = add( host_aliases2, $[ "c": line[0]: "", "name": line[2]:"", "mem": lst ] ); + break; + } + case "User_Alias": { + list <string> lst = splitstring(deletechars( line[3]:""," \t"), ","); + user_aliases2 = add( user_aliases2, $[ "c": line[0]: "", "name": line[2]:"", "mem": lst ] ); + break; + } + case "Cmnd_Alias": { + list <string> lst = maplist(string s, splitstring( line[3]:"", ","), { + return (substring(s,findfirstnotof(s," \t"))); + }); + cmnd_aliases2 = add( cmnd_aliases2, $[ "c": line[0]: "", "name": line[2]:"", "mem": lst ] ); + break; + } + case "Runas_Alias": { + list <string> lst = splitstring(deletechars( line[3]:""," \t"), ","); + runas_aliases2 = add( runas_aliases2, $[ "c": line[0]: "", "name": line[2]:"", "mem": lst ] ); + break; + } + case "Defaults": { + //do nothing, keep defaults untouched + defaults = add(defaults,line); + break; + } + //rules remained + default: { + map <string, any> m = $[]; + list <string> cmd = []; + + if ( regexpmatch(type, "^.*\\.*$")) + type = regexpsub(type, "^(.*)\\(.*)$", "\1\2"); + m["user"] = type; + + m["host"] = line[2]:""; + + //match "(.*)" + if (regexpmatch(line[3]:"","\(.*\)")){ + m["run_as"] = regexpsub(line[3]:"","(\(.*\))", "\1"); + } - if (keys != []) - foreach (string key, keys, { - list < list <string> > val = (list < list <string> >) SCR::Read(add(.sudo, key)); - if (val != nil) settings[key] = val; - }); - - y2milestone("settings %1", settings); - - foreach(string opt_key, list < list <string> > opt_val, settings, { - // #comment \n key value = porn.bat - // is returned as key : [["#comment","value","porn.bat"]] - // wrk[0] -> comment, wrk[1] -> value, wrk[2] -> porn.bat - foreach(list <string> wrk, opt_val, { - switch (opt_key) { - case "Host_Alias": { - host_aliases[ wrk[1]:"" ] = splitstring(deletechars(wrk[2]:""," \t"), ","); - break; - } - case "User_Alias": { - user_aliases[ wrk[1]:"" ] = splitstring(deletechars(wrk[2]:""," \t"), ","); - break; - } - case "Cmnd_Alias": { - cmnd_aliases[ wrk[1]:""] = maplist(string s, splitstring( wrk[2]:"", ","), { - return (substring(s,findfirstnotof(s," \t"))); - }); - break; - } - case "Runas_Alias": { - runas_aliases[ wrk[1]:"" ] = splitstring(deletechars(wrk[2]:""," \t"), ","); - break; - } - case "Defaults": { - //do nothing, keep defaults untouched - defaults = add(defaults,wrk); - break; - } - //User specifications remained - default: { - map <string, any> m = $[]; - list <string> cmd = []; - - if ( regexpmatch(opt_key, "^.*\\.*$")) - opt_key = regexpsub(opt_key, "^(.*)\\(.*)$", "\1\2"); - m["user"] = opt_key; - - m["host"] = wrk[1]:""; - - //match "(.*)" - if (regexpmatch(wrk[2]:"","\(.*\)")){ - m["run_as"] = regexpsub(wrk[2]:"","(\(.*\))", "\1"); - } - - if(issubstring(wrk[2]:"","NOPASSWD:")) { - m["no_passwd"] = (boolean) true; - } - else { - m["no_passwd"] = (boolean) false; - } - - cmd = splitstring(wrk[2]:"","):"); - m["commands"] = (list <string>) splitstring (cmd[ size(cmd) -1 ]:"",","); - m["commands"] = maplist(string s, m["commands"]:[],{ - return (substring(s,findfirstnotof(s," \t"))); - }); - m["comment"] = wrk[0]:""; + if(issubstring(line[3]:"","NOPASSWD:")) { + m["no_passwd"] = (boolean) true; + } + else { + m["no_passwd"] = (boolean) false; + } - user_specs = add(user_specs,m); - break; - } + cmd = splitstring(line[3]:"","):"); + m["commands"] = (list <string>) splitstring (cmd[ size(cmd) -1 ]:"",","); + m["commands"] = maplist(string s, m["commands"]:[],{ + return (substring(s,findfirstnotof(s," \t"))); + }); + m["comment"] = line[0]:""; + + rules = add(rules,m); + break; + } - }); + } }); - settings = filter(string k, list <list <string> > v, settings,{ - return (regexpmatch(k,".*_Alias")); - }); + y2milestone("user %1 host %2 runas %3 cmnd %4 def %5 rules %6", user_aliases2, host_aliases2, runas_aliases2, cmnd_aliases2, defaults, rules); + return true; } + global boolean ReadLocalUsers() { boolean current_progress = Progress::set(false); boolean gui = Users::GetGUI (); @@ -192,137 +192,79 @@ else return true; } -boolean WriteSudoSettings() { - if (GetModified()) - { - //Host aliases - settings["Host_Alias"] = maplist (list <string> s, settings["Host_Alias"]:[],{ - if (haskey(host_aliases,s[1]:"")) { - s[2] = mergestring(host_aliases[s[1]:""]:[],","); - host_aliases = remove(host_aliases,s[1]:""); - } - else { - s[1] = ""; - s[2] = ""; - } - return s; - }); - - foreach(string opt_key, list<string> opt_val, host_aliases, { - settings["Host_Alias"] = add(settings["Host_Alias"]:[], ["", opt_key, mergestring(opt_val,",")]); - }); - - //User aliases - settings["User_Alias"] = maplist (list <string> s, settings["User_Alias"]:[],{ - if (haskey(user_aliases,s[1]:"")) { - s[2] = mergestring(user_aliases[s[1]:""]:[],","); - user_aliases = remove(user_aliases,s[1]:""); - } - else { - s[1] = ""; - s[2] = ""; - } - return s; - }); - - foreach(string opt_key, list<string> opt_val, user_aliases, { - settings["User_Alias"] = add(settings["User_Alias"]:[], ["", opt_key, mergestring(opt_val,",")]); - }); - - //Runas aliases - settings["Runas_Alias"] = maplist (list <string> s, settings["Runas_Alias"]:[],{ - if (haskey(runas_aliases,s[1]:"")) { - s[2] = mergestring(runas_aliases[s[1]:""]:[],","); - runas_aliases = remove(runas_aliases,s[1]:""); - } - else { - s[1] = ""; - s[2] = ""; - } - return s; - }); - - foreach(string opt_key, list<string> opt_val, runas_aliases, { - settings["Runas_Alias"] = add(settings["Runas_Alias"]:[], ["", opt_key, mergestring(opt_val,",")]); - }); - - //Command Aliases - settings["Cmnd_Alias"] = maplist (list <string> s, settings["Cmnd_Alias"]:[],{ - if (haskey(cmnd_aliases,s[1]:"")) { - s[2] = mergestring(cmnd_aliases[s[1]:""]:[],","); - cmnd_aliases = remove(cmnd_aliases,s[1]:""); - } - else { - s[1] = ""; - s[2] = ""; - } - return s; - }); - - foreach(string opt_key, list<string> opt_val, cmnd_aliases, { - settings["Cmnd_Alias"] = add(settings["Cmnd_Alias"]:[], ["", opt_key, mergestring(opt_val,",")]); - }); - - //Restore defaults - settings["Defaults"] = defaults; +global boolean WriteSudoSettings2() +{ + list <list <string> > set = []; + + foreach(map <string, any> a, host_aliases2,{ + list <string> line = [ a["c"]:"", "Host_Alias", a["name"]:"", mergestring(a["mem"]:[],",") ]; + set = add(set, line); + }); + foreach(map <string, any> a, user_aliases2,{ + list <string> line = [ a["c"]:"", "User_Alias", a["name"]:"", mergestring(a["mem"]:[],",")]; + set = add(set, line); + }); + foreach(map <string, any> a, cmnd_aliases2,{ + list <string> line = [ a["c"]:"", "Cmnd_Alias", a["name"]:"", mergestring(a["mem"]:[],",")]; + set = add(set, line); + }); + set = ( list < list <string> > ) merge(set, defaults); + foreach(map <string, any> a, runas_aliases2,{ + list <string> line = [ a["c"]:"", "Runas_Alias", a["name"]:"", mergestring(a["mem"]:[],",")]; + set = add(set, line); + }); + + foreach(map <string, any> m, rules,{ + string user = (string) m["user"]:""; + + user = mergestring (splitstring(user, "\"), "\\"); + string host = (string) m["host"]:""; + string comment = (string) m["comment"]:""; + string rest = (string) m["run_as"]:"" + " " + (( (boolean) m["no_passwd"]:false) ? "NOPASSWD: " : "") + mergestring((list <string>)m["commands"]:[],","); - //Rest - foreach(map <string, any> m, user_specs,{ - string user = (string) m["user"]:""; - - user = mergestring (splitstring(user, "\"), "\\"); - string host = (string) m["host"]:""; - string comment = (string) m["comment"]:""; - string rest = (string) m["run_as"]:"" + " " + (( (boolean) m["no_passwd"]:false) ? "NOPASSWD: " : "") + mergestring((list <string>)m["commands"]:[],","); + set = add(set,[comment, user, host, rest]); + }); - if( !contains(settings[user]:[], [comment, host, rest]) ) - settings[user] = add(settings[user]:[],[comment, host, rest]); - }); + y2milestone("Sudo settings %1", set); - foreach(string key, list <list <string> > value, settings, { - if ( deleted_specs != [] && contains(deleted_specs, key)){ - settings = remove(settings, key); - } - }); + if (SCR::Write(.sudo, set)) + return SCR::Write(.sudo, nil); + return true; +} - y2milestone("Writing sudo settings %1", settings); +integer citem = -1; - if (SCR::Write(.sudo, settings)) - return SCR::Write(.sudo, nil); - else return false; - } - return true; +global void SetItem( integer i ) +{ + y2internal("Current item %1", i); + citem = i; } -global list <map <string, any> > GetUserSpecs(){ - return user_specs; +global integer GetItem() +{ + return citem; } -global void RemoveUserSpec(integer i) { - map <string, any> m = user_specs[i]: $[]; - string key = m["user"]:""; - y2milestone("Deleting %1 from user specifications", key); - - deleted_specs = add(deleted_specs, key); - user_specs = remove(user_specs,i); +global list <map <string, any> > GetRules(){ + return rules; } -global map <string, any> GetUserSpecMember(integer i) { - return user_specs[i]:$[]; +global void RemoveRule( integer i ) { + rules = remove( rules, i); } -global void SetUserSpecMember(integer i, map <string,any> spec) { - user_specs[i] = spec; +global map <string, any> GetRule(integer i) { + return rules[i]:$[]; } -global integer GetUserSpecSize(){ - return (size(user_specs)); +global void SetRule(integer i, map <string,any> spec) { + rules[i] = spec; } -global boolean SearchUserSpec(string what, string key) { +global boolean SearchRules(string what, string key) { boolean found = false; - foreach (map <string, any> m, user_specs, { + foreach (map <string, any> m, rules, { if (haskey(m, what)) { if (what == "commands") { if (contains(m[what]:[], key)){ @@ -362,100 +304,100 @@ global list <string> GetAliasNames (string what) { + list <string> ret = []; switch(what) { - case ("user"): return (maplist (string key, list <string> val, user_aliases,{ return key; })); - case ("run_as"): return (maplist (string key, list <string> val, runas_aliases,{ return key; })); - case ("host"): return (maplist (string key, list <string> val, host_aliases,{ return key; })); - case ("command"): return (maplist (string key, list <string> val, cmnd_aliases,{ return key; })); + case ("user"): + ret = maplist ( map <string, any> m, user_aliases2, + { return m["name"]:""; + }); + break; + case ("run_as"): + ret = maplist ( map <string, any> m, runas_aliases2, + { return m["name"]:""; + }); + break; + case ("host"): + ret = maplist ( map <string, any> m, host_aliases2, + { return m["name"]:""; + }); + break; + case ("command"): + ret = maplist ( map <string, any> m, cmnd_aliases2, + { return m["name"]:""; + }); + break; default: return []; } + return ret; } -/* Users */ -global map <string, list<string> > GetUserAliases() { - return user_aliases; -} +global boolean SearchAlias2(string name, list < map <string, any> > aliases ) { + list < map <string, any> > tmp = []; + tmp = filter( map <string, any> m, aliases, { + return (m["name"]:"" == name); + }); -global void RemoveUserAlias(string name) { - user_aliases = filter(string k, list<string> val, user_aliases, ``(k != name )); + return ( size(tmp) > 0 ); } -global list <string> GetUserAliasMembers(string name) { - return user_aliases[name]:[]; -} -global boolean SearchUserAlias(string name) { - return( haskey(user_aliases,name)); +/* Users */ +global list < map <string, any> > GetUserAliases2() { + return user_aliases2; } -/* end Users */ -/* Hosts */ -global void SetUserAliasMembers (string name, list <string> members) { - user_aliases[name] = members; +global void SetUserAlias(integer i, map <string,any> alias ) { + user_aliases2[i] = alias; } -global map <string, list<string> > GetHostAliases() { - return host_aliases; +global void RemoveUserAlias2( integer i) { + user_aliases2 = remove(user_aliases2, i); } -global void RemoveHostAlias(string name) { - host_aliases = filter(string k, list<string> val, host_aliases, ``(k != name )); -} +/* end Users */ -global list <string> GetHostAliasMembers(string name) { - return host_aliases[name]:[]; +/* Hosts */ +global list < map <string, any> > GetHostAliases2() { + return host_aliases2; } -global void SetHostAliasMembers (string name, list <string> members) { - host_aliases[name] = members; +global void RemoveHostAlias2( integer i) { + host_aliases2 = remove(host_aliases2, i); } -global boolean SearchHostAlias(string name) { - return( haskey(host_aliases,name)); +global void SetHostAlias(integer i, map <string,any> alias) { + host_aliases2[i] = alias; } /* end Hosts */ /* RunAs */ -global map <string, list<string> > GetRunAsAliases() { - return runas_aliases; +global list < map <string, any> > GetRunAsAliases2() { + return runas_aliases2; } -global void RemoveRunAsAlias(string name) { - runas_aliases = filter(string k, list<string> val, runas_aliases, ``(k != name )); +global void RemoveRunAsAlias2( integer i) { + runas_aliases2 = remove(runas_aliases2, i); } -global list <string> GetRunAsAliasMembers(string name) { - return runas_aliases[name]:[]; +global void SetRunAsAlias(integer i, map <string,any> alias) { + runas_aliases2[i] = alias; } -global void SetRunAsAliasMembers (string name, list <string> members) { - runas_aliases[name] = members; -} - -global boolean SearchRunAsAlias(string name) { - return( haskey(runas_aliases,name)); -} /* end RunAs */ -/* Commands */ -global map <string, list<string> > GetCmndAliases() { - return cmnd_aliases; -} -global void RemoveCmndAlias(string name) { - cmnd_aliases = filter(string k, list<string> val, cmnd_aliases, ``(k != name )); +/* Commands */ +global list < map <string, any> > GetCmndAliases2() { + return cmnd_aliases2; } -global list <string> GetCmndAliasMembers(string name) { - return cmnd_aliases[name]:[]; +global void SetCmndAlias(integer i, map <string,any> alias) { + cmnd_aliases2[i] = alias; } -global void SetCmndAliasMembers(string name, list <string> members) { - cmnd_aliases[name] = members; +global void RemoveCmndAlias2( integer i) { + cmnd_aliases2 = remove(cmnd_aliases2, i); } -global boolean SearchCmndAlias(string name) { - return( haskey(cmnd_aliases,name)); -} /*end Commands */ global boolean Abort() { @@ -507,7 +449,7 @@ if(PollAbort()) return false; Progress::NextStage(); /* Error message */ - if(!ReadSudoSettings()) Report::Error(Message::CannotReadCurrentSettings()); + if(!ReadSudoSettings2()) Report::Error(Message::CannotReadCurrentSettings()); sleep(sl); if(PollAbort()) return false; @@ -558,7 +500,7 @@ if(PollAbort()) return false; Progress::NextStage(); /* Error message */ - if(!WriteSudoSettings()) { + if(!WriteSudoSettings2()) { Report::Error (_("Cannot write settings.")); ret = false; } Modified: trunk/sudo/src/complex.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/complex.ycp?rev=53387&am... ============================================================================== --- trunk/sudo/src/complex.ycp (original) +++ trunk/sudo/src/complex.ycp Tue Nov 18 17:22:41 2008 @@ -117,7 +117,7 @@ } boolean ValidateCommand(string cmd){ - if(FileUtils::Exists(cmd) || haskey(Sudo::GetCmndAliases(), cmd) || cmd == "ALL" ) + if(FileUtils::Exists(cmd) || contains(Sudo::GetAliasNames("command"), cmd) || cmd == "ALL" ) return true; else { Popup::Error(sformat(_("File, directory or command alias '%1' does not exist."), cmd)); Modified: trunk/sudo/src/dialog-cmnd.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialog-cmnd.ycp?rev=5338... ============================================================================== --- trunk/sudo/src/dialog-cmnd.ycp (original) +++ trunk/sudo/src/dialog-cmnd.ycp Tue Nov 18 17:22:41 2008 @@ -23,14 +23,19 @@ any AddEditCmndAliasDialog (string what) { string caption = ""; + list < map <string, any> > ca = Sudo::GetCmndAliases2(); + map <string, any> it = ca [ Sudo::GetItem()]:$[]; + list <string> alias_members = []; + string name = ""; list <term> items = []; if (what == "Add") { - caption = _("New Command Alias"); + caption = _("New Command Alias"); } else if (what == "Edit") { - alias_members = Sudo::GetCmndAliasMembers(current_alias_name); - caption = _("Existing Command Alias"); + alias_members = it["mem"]:[]; + name = it["name"]:""; + caption = _("Existing Command Alias"); } term contents = `VBox ( @@ -51,7 +56,7 @@ Wizard::SetContentsButtons(caption, contents,HELPS["command_alias"]:"",Label::BackButton(), Label::OKButton()); UI::ChangeWidget (`id("cmnd_alias_name"), `ValidChars, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - RedrawCmndAlias(current_alias_name, alias_members); + RedrawCmndAlias(name, alias_members); any ret = nil; while(true) { @@ -63,29 +68,30 @@ else continue; /* next */ } else if(ret == `next) { - string new_alias = toupper ((string) UI::QueryWidget(`id("cmnd_alias_name"),`Value)); - if (new_alias == "") { - Popup::Error(_("Alias name must not be empty.")); - UI::SetFocus(`id("cmnd_alias_name")); - continue; - } - if (current_alias_name != new_alias) { - if (Sudo::SearchCmndAlias(new_alias) ) { - Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); - UI::SetFocus(`id("cmnd_alias_name")); - continue; - } - Sudo::RemoveCmndAlias(current_alias_name); - } - if (alias_members == []) { - Popup::Error(_("Alias must have at least one member.")); - UI::SetFocus(`id("cmnd_alias_members")); - continue; - } - - Sudo::SetCmndAliasMembers(new_alias,alias_members); - Sudo::SetModified(); - break; + string new_alias = toupper ((string) UI::QueryWidget(`id("cmnd_alias_name"),`Value)); + if (new_alias == "") { + Popup::Error(_("Alias name must not be empty.")); + UI::SetFocus(`id("cmnd_alias_name")); + continue; + } + if (name != new_alias) { + if (Sudo::SearchAlias2( name, Sudo::GetCmndAliases2()) ) { + Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); + UI::SetFocus(`id("cmnd_alias_name")); + continue; + } + } + if (alias_members == []) { + Popup::Error(_("Alias must have at least one member.")); + UI::SetFocus(`id("cmnd_alias_members")); + continue; + } + + it["name"] = new_alias; + it["mem"] = alias_members; + Sudo::SetCmndAlias( Sudo::GetItem(),it); + Sudo::SetModified(); + break; /* back */ }else if(ret == `back) { Modified: trunk/sudo/src/dialog-host.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialog-host.ycp?rev=5338... ============================================================================== --- trunk/sudo/src/dialog-host.ycp (original) +++ trunk/sudo/src/dialog-host.ycp Tue Nov 18 17:22:41 2008 @@ -27,13 +27,18 @@ any AddEditHostAliasDialog (string what) { string caption = ""; + list < map <string, any> > ha = Sudo::GetHostAliases2(); + map <string, any> it = ha [ Sudo::GetItem() ]:$[]; + list <string> alias_members = []; + string name = ""; list <term> items = []; if (what == "Add") { caption = _("New Host Alias"); } else if (what == "Edit") { - alias_members = Sudo::GetHostAliasMembers(current_alias_name); + alias_members = (list <string>) it["mem"]:[]; + name = (string) it["name"]:""; caption = _("Existing Host Alias"); } @@ -51,7 +56,7 @@ Wizard::SetContentsButtons(caption, contents, HELPS["host_alias"]:"",Label::BackButton(), Label::OKButton()); UI::ChangeWidget (`id("host_alias_name"), `ValidChars, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - RedrawHostAlias(current_alias_name, alias_members); + RedrawHostAlias( name, alias_members ); any ret = nil; while(true) { @@ -59,45 +64,51 @@ ret = UI::UserInput(); /* abort? */ if(ret == `abort) { - if(Sudo::Abort()) break; - else continue; + if(Sudo::Abort()) + break; + else + continue; /* next */ } else if(ret == `next) { - string new_alias = toupper((string) UI::QueryWidget(`id("host_alias_name"),`Value)); - if (new_alias == "") { - Popup::Error(_("Alias name must not be empty.")); - UI::SetFocus(`id("host_alias_name")); - continue; - } - if (current_alias_name != new_alias) { - if (Sudo::SearchHostAlias(new_alias)) { - Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); - UI::SetFocus(`id("host_alias_name")); - continue; - } - Sudo::RemoveHostAlias(current_alias_name); - } - if (alias_members == []) { - Popup::Error(_("Alias must have at least one member.")); - UI::SetFocus(`id("host_alias_members")); - continue; - } + string new_alias = toupper((string) UI::QueryWidget(`id("host_alias_name"),`Value)); - Sudo::SetHostAliasMembers(new_alias,alias_members); - Sudo::SetModified(); - break; + if (new_alias == "") { + Popup::Error(_("Alias name must not be empty.")); + UI::SetFocus(`id("host_alias_name")); + continue; + } + if (name != new_alias) { + if (Sudo::SearchAlias2(new_alias, Sudo::GetHostAliases2())) { + Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); + UI::SetFocus(`id("host_alias_name")); + continue; + } + + //Sudo::RemoveHostAlias(current_alias_name); + } + if (alias_members == []) { + Popup::Error(_("Alias must have at least one member.")); + UI::SetFocus(`id("host_alias_members")); + continue; + } + + it["name"] = new_alias; + it["mem"] = alias_members; + Sudo::SetHostAlias(Sudo::GetItem(),it); + Sudo::SetModified(); + break; - /* back */ + /* back */ }else if(ret == `back) { break; /* unknown */ - }else if(ret == "add_host"){ - string new_member = AddHostDialog(""); + }else if(ret == "add_host"){ + string new_member = AddHostDialog(""); - if(new_member != "") { - alias_members = add(alias_members, new_member); - RedrawHostAlias("",alias_members); - } + if(new_member != "") { + alias_members = add(alias_members, new_member); + RedrawHostAlias("",alias_members); + } /* edit hosts*/ } else if (ret == "edit_host") { string current_item = (string) UI::QueryWidget(`id("host_alias_members"), `CurrentItem); Modified: trunk/sudo/src/dialog-runas.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialog-runas.ycp?rev=533... ============================================================================== --- trunk/sudo/src/dialog-runas.ycp (original) +++ trunk/sudo/src/dialog-runas.ycp Tue Nov 18 17:22:41 2008 @@ -30,14 +30,19 @@ any AddEditRunAsAliasDialog (string what) { string caption = ""; + list < map <string, any> > ra = Sudo::GetRunAsAliases2(); + map <string, any> it = ra[ Sudo::GetItem() ]: $[]; + list <string> alias_members = []; + string name = ""; list <term> items = []; list <string> users = (list <string>) merge(Sudo::all_users,Sudo::GetAliasNames("run_as")) ; if (what == "Add") { caption = _("New RunAs Alias"); } else if (what == "Edit") { - alias_members = Sudo::GetRunAsAliasMembers(current_alias_name); + alias_members = (list <string>) it["mem"]:[]; + name = (string) it["name"]:""; foreach(string member, alias_members, { users = filter(string user, users, ``(user != member)); }); @@ -70,7 +75,7 @@ Wizard::SetContentsButtons(caption, contents,HELPS["runas_alias"]:"",Label::BackButton(), Label::OKButton()); UI::ChangeWidget (`id("runas_alias_name"), `ValidChars, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - RedrawRunAsAlias(current_alias_name, alias_members,users); + RedrawRunAsAlias(name, alias_members,users); any ret = nil; while(true) { @@ -81,30 +86,31 @@ if(Sudo::Abort()) break; else continue; /* next */ - }else if(ret == `next) { - string new_alias = toupper((string) UI::QueryWidget(`id("runas_alias_name"),`Value)); - if (new_alias == "") { - Popup::Error(_("Alias name must not be empty.")); - UI::SetFocus(`id("runas_alias_name")); - continue; - } - if (current_alias_name != new_alias) { - if(Sudo::SearchRunAsAlias(new_alias)) { - Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); - UI::SetFocus(`id("runas_alias_name")); - continue; - } - Sudo::RemoveRunAsAlias(current_alias_name); - } - if (alias_members == []) { - Popup::Error(_("Alias must have at least one member.")); - UI::SetFocus(`id("runas_alias_members")); - continue; - } - - Sudo::SetRunAsAliasMembers(new_alias,alias_members); - Sudo::SetModified(); - break; + }else if(ret == `next) { + string new_alias = toupper((string) UI::QueryWidget(`id("runas_alias_name"),`Value)); + if (new_alias == "") { + Popup::Error(_("Alias name must not be empty.")); + UI::SetFocus(`id("runas_alias_name")); + continue; + } + if (name != new_alias) { + if(Sudo::SearchAlias2( new_alias, Sudo::GetRunAsAliases2() )) { + Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); + UI::SetFocus(`id("runas_alias_name")); + continue; + } + } + if (alias_members == []) { + Popup::Error(_("Alias must have at least one member.")); + UI::SetFocus(`id("runas_alias_members")); + continue; + } + + it["name"] = new_alias; + it["mem"] = alias_members; + Sudo::SetRunAsAlias(Sudo::GetItem(), it); + Sudo::SetModified(); + break; /* back */ }else if(ret == `back) { break; Modified: trunk/sudo/src/dialog-spec.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialog-spec.ycp?rev=5338... ============================================================================== --- trunk/sudo/src/dialog-spec.ycp (original) +++ trunk/sudo/src/dialog-spec.ycp Tue Nov 18 17:22:41 2008 @@ -35,7 +35,7 @@ //Setting default values } else if (what == "Edit") { caption = _("Existing Sudo Rule "); - spec = Sudo::GetUserSpecMember(current_spec_idx); + spec = Sudo::GetRule( Sudo::GetItem() ); commands = spec["commands"]:[]; } @@ -114,7 +114,7 @@ if (spec["run_as"]:"" != "") { spec["run_as"] = "(" + spec["run_as"]:"" + ")"; } - Sudo::SetUserSpecMember(current_spec_idx,spec); + Sudo::SetRule( Sudo::GetItem(),spec); Sudo::SetModified(); break; /* back */ Modified: trunk/sudo/src/dialog-user.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialog-user.ycp?rev=5338... ============================================================================== --- trunk/sudo/src/dialog-user.ycp (original) +++ trunk/sudo/src/dialog-user.ycp Tue Nov 18 17:22:41 2008 @@ -29,17 +29,22 @@ any AddEditUserAliasDialog (string what) { string caption = ""; + list < map <string, any> > ua = Sudo::GetUserAliases2(); + map <string, any> it = ua [ Sudo::GetItem() ]: $[]; + list <string> alias_members = []; + string name = ""; list <term> items = []; list <string> users = (list <string>) merge(Sudo::all_users, Sudo::GetAliasNames("user")); if (what == "Add") { caption = _("New User Alias"); } else if (what == "Edit") { - alias_members = Sudo::GetUserAliasMembers(current_alias_name); + alias_members = (list <string>) it["mem"]:[]; foreach(string member, alias_members, { users = filter(string user, users, ``(user != member)); }); + name = (string) it["name"]:""; caption = _("Existing User Alias"); } @@ -69,7 +74,7 @@ Wizard::SetContentsButtons(caption, contents,HELPS["user_alias"]:"",Label::BackButton(), Label::OKButton()); UI::ChangeWidget (`id("user_alias_name"), `ValidChars, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - RedrawUserAlias(current_alias_name, alias_members,users); + RedrawUserAlias(name, alias_members,users); any ret = nil; while(true) { @@ -80,35 +85,36 @@ if(Sudo::Abort()) break; else continue; /* next */ - }else if(ret == `next) { - string new_alias = toupper ((string) UI::QueryWidget(`id("user_alias_name"),`Value)); - if (new_alias == "") { - Popup::Error(_("Alias name must not be empty.")); - UI::SetFocus(`id("user_alias_name")); - continue; - } - if (current_alias_name != new_alias) { - if (Sudo::SearchUserAlias(new_alias) ) { - Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); - UI::SetFocus(`id("user_alias_name")); - continue; - } - Sudo::RemoveUserAlias(current_alias_name); - } - if (alias_members == []) { - Popup::Error(_("Alias must have at least one member.")); - UI::SetFocus(`id("user_alias_members")); - continue; - } - - Sudo::SetUserAliasMembers(new_alias,alias_members); - Sudo::SetModified(); - break; + }else if(ret == `next) { + string new_alias = toupper ((string) UI::QueryWidget(`id("user_alias_name"),`Value)); + if (new_alias == "") { + Popup::Error(_("Alias name must not be empty.")); + UI::SetFocus(`id("user_alias_name")); + continue; + } + if (name != new_alias) { + if (Sudo::SearchAlias2( new_alias, Sudo::GetUserAliases2() ) ) { + Popup::Error(sformat(_("Alias with name %1 already exists"),new_alias)); + UI::SetFocus(`id("user_alias_name")); + continue; + } + } + if (alias_members == []) { + Popup::Error(_("Alias must have at least one member.")); + UI::SetFocus(`id("user_alias_members")); + continue; + } + + it["name"] = new_alias; + it["mem"] = alias_members; + Sudo::SetUserAlias( Sudo::GetItem(), it); + Sudo::SetModified(); + break; /* back */ }else if(ret == `back) { break; /* add users*/ - }else if(ret == "add_member"){ + }else if(ret == "add_member"){ string new_member = (string) UI::QueryWidget(`id("all_users"),`Value); alias_members = add(alias_members, new_member); Modified: trunk/sudo/src/dialogs.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/sudo/src/dialogs.ycp?rev=53387&am... ============================================================================== --- trunk/sudo/src/dialogs.ycp (original) +++ trunk/sudo/src/dialogs.ycp Tue Nov 18 17:22:41 2008 @@ -42,44 +42,100 @@ 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") { - current_spec_idx = Sudo::GetUserSpecSize(); - return `add_spec; + Sudo::SetItem( size(Sudo::GetRules()) ); + return `add_spec; } else if (ret == "edit_spec") { - current_spec_idx = (integer) UI::QueryWidget(`id("table_user_spec"), `CurrentItem); - if (Sudo::SystemRulePopup( Sudo::GetUserSpecMember(current_spec_idx), false)) - return `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::GetUserSpecMember(idx), true)) { - Sudo::RemoveUserSpec(idx); - items = filter(term tmp, items,{ - return tmp[0]:nil != `id(idx); - } ); - UI::ChangeWidget(`id("table_user_spec"), `Items, items); - Sudo::SetModified(); + 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 ); + } + } 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 ); + } } } void InitUserSpecs (string key) { list <term> items = []; - list <map <string,any> > specs = Sudo::GetUserSpecs(); + list <map <string,any> > rules = Sudo::GetRules(); integer idx = 0; - foreach(map <string, any> wrk, specs, { - string cmds = ""; - if (size(wrk["commands"]:[]) > 1) { - cmds = mergestring(wrk["commands"]:[],","); - } else - cmds = (wrk["commands"]:[])[0]:""; - items = add(items, `item(`id(idx), (string) wrk["user"]:"", (string) wrk["host"]:"", (string) wrk["run_as"]:"",(wrk["no_passwd"]:false)? _("Yes") : _("No"), cmds)); + 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["no_passwd"]:false)? _("Yes") : _("No"), cmds)); idx = idx + 1; }); @@ -90,29 +146,34 @@ symbol HandleHostAliases(string key, map event) { any ret = event["ID"]:nil; - if (ret == "add_host_alias") { - current_alias_name = ""; - return `add_h_alias; - } else if (ret == "edit_host_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_host_aliases"), `CurrentItem); - return `edit_h_alias; - } else if (ret == "delete_host_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_host_aliases"),`CurrentItem); + 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::SearchUserSpec("host",current_alias_name)) { + 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 ? -"), current_alias_name))) +"), name))) confirm_delete = false; } if (confirm_delete) { - Sudo::RemoveHostAlias(current_alias_name); - items = filter( term tmp, items, { - return tmp[0]:nil != `id(current_alias_name); - } ); + Sudo::RemoveHostAlias2( idx ); + items = CreateItems( Sudo::GetHostAliases2()); UI::ChangeWidget(`id("table_host_aliases"), `Items, items); Sudo::SetModified(); } @@ -122,12 +183,8 @@ } void InitHostAliases(string key) { - list <term> items = []; - map <string, list<string> > aliases = Sudo::GetHostAliases(); - - foreach(string key, list<string> value, aliases, { - items = add (items, `item(`id(key), key, mergestring(value,","))); - }); + 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); @@ -137,29 +194,29 @@ any ret = event["ID"]:nil; if (ret == "add_user_alias") { - /* No alias name set so far */ - current_alias_name = ""; - return `add_u_alias; + /* No alias name set so far */ + Sudo::SetItem( size( Sudo::GetUserAliases2()) ); + return `add_u_alias; } else if (ret == "edit_user_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_user_aliases"),`CurrentItem); - return `edit_u_alias; + Sudo::SetItem( (integer) UI::QueryWidget(`id("table_user_aliases"),`CurrentItem) ); + return `edit_u_alias; } else if (ret == "delete_user_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_user_aliases"),`CurrentItem); + 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::SearchUserSpec("user",current_alias_name)) { + 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 ? -"), current_alias_name))) - confirm_delete = false; +"), name))) + confirm_delete = false; } if (confirm_delete) { - Sudo::RemoveUserAlias(current_alias_name); - items = filter(term tmp, items, { - return tmp[0]:nil != `id(current_alias_name); - }); + Sudo::RemoveUserAlias2( idx ); + items = CreateItems( Sudo::GetUserAliases2()); UI::ChangeWidget(`id("table_user_aliases"), `Items, items); Sudo::SetModified(); } @@ -168,12 +225,8 @@ } void InitUserAliases (string key) { - list <term> items = []; - map <string, list<string> > aliases = Sudo::GetUserAliases(); - - foreach(string key, list<string> value, aliases, { - items = add (items, `item(`id(key), key, mergestring(value,","))); - }); + 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); @@ -184,28 +237,28 @@ if (ret == "add_runas_alias") { /* No alias name set so far */ - current_alias_name = ""; - return `add_r_alias; + Sudo::SetItem( size(Sudo::GetRunAsAliases2()) ); + return `add_r_alias; } else if (ret == "edit_runas_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_runas_aliases"),`CurrentItem); - return `edit_r_alias; + Sudo::SetItem( (integer) UI::QueryWidget(`id("table_runas_aliases"),`CurrentItem)); + return `edit_r_alias; } else if (ret == "delete_runas_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_runas_aliases"),`CurrentItem); + 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::SearchUserSpec("run_as","(" + current_alias_name + ")")) { + 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 ? -"), current_alias_name))) +"), name))) confirm_delete = false; } if (confirm_delete) { - Sudo::RemoveRunAsAlias(current_alias_name); - items = filter(term tmp, items, { - return tmp[0]:nil != `id(current_alias_name); - } ); + Sudo::RemoveRunAsAlias2( idx ); + items = CreateItems( Sudo::GetRunAsAliases2()); UI::ChangeWidget(`id("table_runas_aliases"), `Items, items); Sudo::SetModified(); } @@ -215,12 +268,8 @@ } void InitRunAsAliases (string key) { - list <term> items = []; - map <string, list<string> > aliases = Sudo::GetRunAsAliases(); - - foreach(string key, list<string> value, aliases, { - items = add (items, `item(`id(key), key, mergestring(value,","))); - }); + 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); @@ -232,28 +281,27 @@ if (ret == "add_command_alias") { /* No alias name set so far */ - current_alias_name = ""; - return `add_c_alias; + Sudo::SetItem( size(Sudo::GetCmndAliases2()) ); + return `add_c_alias; } else if (ret == "edit_command_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_command_aliases"),`CurrentItem); - return `edit_c_alias; + Sudo::SetItem( (integer) UI::QueryWidget(`id("table_command_aliases"),`CurrentItem) ); + return `edit_c_alias; } else if (ret == "delete_command_alias") { - current_alias_name = (string) UI::QueryWidget(`id("table_command_aliases"),`CurrentItem); + 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::SearchUserSpec("commands",current_alias_name)) { + 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 ? -"), current_alias_name))) +"), name))) confirm_delete = false; } if (confirm_delete) { - Sudo::RemoveCmndAlias(current_alias_name); - items = filter(term tmp, items, { - return tmp[0]:nil != `id(current_alias_name); - } ); + Sudo::RemoveCmndAlias2( idx ); + items = CreateItems( Sudo::GetCmndAliases2()); UI::ChangeWidget(`id("table_command_aliases"), `Items, items ); Sudo::SetModified(); } @@ -263,12 +311,8 @@ } void InitCmndAliases (string key) { - list <term> items = []; - map <string, list<string> > aliases = Sudo::GetCmndAliases(); - - foreach(string key, list<string> value, aliases, { - items = add (items, `item(`id(key), key, mergestring(value,","))); - }); + 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); @@ -320,8 +364,10 @@ map <string, map <string,any> > tabs = $[ "user_specs" : $[ "contents" : `VBox( + `HBox( `Table( `id("table_user_spec"), + `opt(`keepSorting), `header ( _("Users"), _("Hosts"), @@ -330,11 +376,18 @@ _("Commands") ), [] ), - `Left(`HBox ( + `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 "), @@ -344,6 +397,7 @@ "contents" : `VBox( `Table( `id("table_user_aliases"), + `opt(`keepSorting), `header ( _("Alias Name"), _("Members") @@ -364,6 +418,7 @@ "contents" : `VBox( `Table( `id("table_runas_aliases"), + `opt(`keepSorting), `header ( _("Alias Name"), _("Members") @@ -384,6 +439,7 @@ "contents" : `VBox( `Table( `id("table_host_aliases"), + `opt(`keepSorting), `header ( _("Alias Name"), _("Hosts") @@ -404,6 +460,7 @@ "contents" : `VBox( `Table( `id("table_command_aliases"), + `opt(`keepSorting), `header ( _("Alias Name"), _("Commands") -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org