From bcd58fdfc6d8496d5fa250aa8d6e0d0d3a89d49d Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 28 Sep 2015 18:40:41 +0200 Subject: add group membership functions diff --git a/lib/RHRD/rddb.pm b/lib/RHRD/rddb.pm index a337557..f8832d1 100755 --- a/lib/RHRD/rddb.pm +++ b/lib/RHRD/rddb.pm @@ -534,6 +534,78 @@ sub set_group_reports return ($cnt, 'OK', "Success"); } +sub get_group_members +{ + my ($dbh, $groupname) = @_; + + my $sql = qq{select USER_NAME from USER_PERMS where GROUP_NAME = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($groupname) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my @users; + while(my ($user) = $sth->fetchrow_array()) { + push @users, $user; + } + $sth->finish(); + + return @users; +} + +sub is_group_member +{ + my ($dbh, $groupname, $username) = @_; + + my $sql = qq{select count(*) from USER_PERMS where GROUP_NAME = ? and USER_NAME = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $sth->execute($groupname, $username) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + my ($cnt) = $sth->fetchrow_array(); + $sth->finish(); + + return ($cnt, 'OK', "success"); +} + +sub add_group_member +{ + my ($dbh, $groupname, $username) = @_; + + my ($cnt, $result, $errostring) = is_group_member($dbh, $groupname, $username); + if($cnt > 0) { + return (undef, 'ERROR', "already a member"); + } + + my $sql = qq{insert into USER_PERMS (GROUP_NAME, USER_NAME) values (?, ?);}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + $cnt = $sth->execute($groupname, $username) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + $sth->finish(); + return ($cnt, 'OK', "success"); +} + +sub remove_group_member +{ + my ($dbh, $groupname, $username) = @_; + + my $sql = qq{delete from USER_PERMS where GROUP_NAME = ? and USER_NAME = ?;}; + my $sth = $dbh->prepare($sql) + or return (undef, 'ERROR', "Database Error: " . $dbh->errstr); + + my $cnt = $sth->execute($groupname, $username) + or return (undef, 'ERROR', "Database Error: " . $sth->errstr); + + $sth->finish(); + return ($cnt, 'OK', "success"); +} + ########################### SHOW handling ########################### sub get_showtitle_and_log diff --git a/test/get-range b/test/get-range index 1d4e12e..630d5d6 100755 --- a/test/get-range +++ b/test/get-range @@ -72,7 +72,7 @@ if(defined $dbh) { RHRD::rddb::closedb($dbh); } else { - print STDERR "$errorstring\n"; + print "$errorstring\n"; exit 1; } diff --git a/utils/rd-group b/utils/rd-group index a221d9f..1717caf 100755 --- a/utils/rd-group +++ b/utils/rd-group @@ -23,10 +23,17 @@ use strict; use RHRD::rddb; +# this is ridiculous but makes it a little harder to create/remove users... +if ($> != 0 ) { + print STDERR "this must be run as root!\n"; + exit 1; +} + my $num_args = $#ARGV + 1; if ($num_args < 2) { - print STDERR "Usage: rd-group ( (check|remove|get-carts|get-reports) |\n" . + print STDERR "Usage: rd-group ( (check|remove|get-members|get-carts|get-reports) |\n" . " add [ ] |\n" . + " (add-member|remove-member|is-member) |\n" . " set-carts [ [ [ [ ]]] |\n" . " set-reports [ [ [ ]]] )\n"; exit 1; @@ -59,6 +66,41 @@ if(defined $dbh) { print int($href->{cnt}) . " " . $href->{name} . " deleted\n"; } } + } elsif($cmd eq "get-members") { + my @users = RHRD::rddb::get_group_members($dbh, $groupname); + if(!defined $users[0] && defined $users[1]) { + print "$users[2]\n"; + RHRD::rddb::closedb($dbh); + exit 1; + } + for my $user (sort @users) { + print "$user\n"; + } + } elsif($cmd eq "add-member") { + (my $cnt, undef, $errorstring) = RHRD::rddb::add_group_member($dbh, $groupname, $ARGV[2]); + unless(defined $cnt) { + print "$errorstring\n"; + RHRD::rddb::closedb($dbh); + exit 1; + } + print int($cnt) . " rows affected\n"; + } elsif($cmd eq "remove-member") { + (my $cnt, undef, $errorstring) = RHRD::rddb::remove_group_member($dbh, $groupname, $ARGV[2]); + unless(defined $cnt) { + print "$errorstring\n"; + RHRD::rddb::closedb($dbh); + exit 1; + } + print int($cnt) . " rows affected\n"; + } elsif($cmd eq "is-member") { + (my $cnt, undef, $errorstring) = RHRD::rddb::is_group_member($dbh, $groupname, $ARGV[2]); + RHRD::rddb::closedb($dbh); + unless(defined $cnt) { + print "$errorstring\n"; + exit 1; + } + print $ARGV[2] . " is" . (($cnt) ? "" : " not") . " a member\n"; + exit (($cnt) ? 0 : 1); } elsif($cmd eq "get-carts") { my ($low, $high, $type, $enforce_range) = RHRD::rddb::get_group_carts($dbh, $groupname); unless(defined $low) { -- cgit v0.10.2