#!/usr/local/bin/perl # group_chooser.cgi # This CGI generated the HTML for choosing a group or list of groups. BEGIN { push(@INC, ".."); }; use WebminCore; $trust_unknown_referers = 1; &init_config(); if (&get_product_name() eq 'usermin') { &switch_to_remote_user(); } &ReadParse(undef, undef, 2); %access = &get_module_acl(); # Build list of primary groups setpwent(); while(@uinfo = getpwent()) { push(@{$members{$uinfo[3]}}, $uinfo[0]); } endpwent() if ($gconfig{'os_type'} ne 'hpux'); if ($in{'multi'}) { # selecting multiple groups. if ($in{'frame'} == 0) { # base frame &PrintHeader(); print "\n"; print "$text{'groups_title1'}\n"; print "\n"; print "\n"; print "\n"; print " \n"; print " \n"; print "\n"; print "\n"; } elsif ($in{'frame'} == 1) { # list of all groups to choose from &popup_header(); print "\n"; print "$text{'groups_all'}\n"; print "\n"; foreach $u (&get_groups_list()) { if ($in{'group'} eq $u->[0]) { print "\n"; } else { print "\n"; } print "\n"; print "\n"; } print "
$u->[0]$u->[3]
\n"; &popup_footer(); } elsif ($in{'frame'} == 2) { # show chosen groups &popup_header(); print "$text{'groups_sel'}\n"; print <<'EOF';
EOF &popup_footer(); } elsif ($in{'frame'} == 3) { # output OK and Cancel buttons &popup_header(); print "\n"; print "
\n"; print "\n"; print "\n"; print "  \n"; print "
\n"; &popup_footer(); } } else { # selecting just one group .. display a list of all groups to # choose from &popup_header($text{'groups_title2'}); print "\n"; print "\n"; foreach $u (&get_groups_list()) { if ($in{'group'} eq $u->[0]) { print "\n"; } else { print "\n"; } print "\n"; print "\n"; } print "
$u->[0]$u->[3]
\n"; &popup_footer(); } sub get_groups_list { local(@ginfo, @groups, %gcan, %found); if ($access{'gedit_mode'} == 2 || $access{'gedit_mode'} == 3) { map { $gcan{$_}++ } split(/\s+/, $access{'gedit'}); } setgrent(); while(@ginfo = getgrent()) { @mems = &unique( split(/ /, $ginfo[3]), @{$members{$ginfo[2]}} ); if (@mems > 3) { @mems = (@mems[0..1], "..."); } $ginfo[3] = join(' ', @mems); if ($access{'gedit_mode'} == 0 || $access{'gedit_mode'} == 2 && $gcan{$ginfo[0]} || $access{'gedit_mode'} == 3 && !$gcan{$ginfo[0]} || $access{'gedit_mode'} == 4 && (!$access{'gedit'} || $ginfo[2] >= $access{'gedit'}) && (!$access{'gedit2'} || $ginfo[2] <= $access{'gedit2'})) { push(@groups, [ @ginfo ]) if (!$found{$ginfo[0]}++); } } endgrent() if ($gconfig{'os_type'} ne 'hpux'); return sort { $a->[0] cmp $b->[0] } @groups; } # split_quoted(string) sub split_quoted { local @rv; local $str = $_[0]; while($str =~ /^\s*(\S*"[^"]+"\S*)(.*)$/ || $str =~ /^\s*(\S+)(.*)$/) { $str = $2; local $g = $1; $g =~ s/"//g; push(@rv, $g); } return @rv; }