Add a "priv list" console command to be used to list privs and subprivs.

        Patch by kareila. 

diffs (107 lines):

diff -r 74be904d8fa3 -r 629d071cfeac cgi-bin/LJ/Console/Command/Priv.pm
--- a/cgi-bin/LJ/Console/Command/Priv.pm        Wed Sep 08 16:04:51 2010 +0800
+++ b/cgi-bin/LJ/Console/Command/Priv.pm        Wed Sep 08 16:14:31 2010 +0800
@@ -19,15 +19,15 @@ use Carp qw(croak);
 
 sub cmd { "priv" }
 
-sub desc { "Grant or revoke user privileges." }
+sub desc { "Grant or revoke user privileges, or list available privileges and 
their arguments." }
 
 sub args_desc { [
-                 'action'    => "'grant', 'revoke', or 'revoke_all' to revoke 
all args for a given priv",
-                 'privs'     => "Comma-delimited list of priv names, priv:arg 
pairs, or package names (prefixed with #)",
-                 'usernames' => "Comma-delimited list of usernames",
+                 'action'    => "'list', 'grant', 'revoke', or 'revoke_all' to 
revoke all args for a given priv.",
+                 'privs'     => "Comma-delimited list of priv names, priv:arg 
pairs, or package names (prefixed with #). Required for all actions except 
'list'. Using 'list' with no arguments will return results for all privs.",
+                 'usernames' => "Comma-delimited list of usernames (not used 
for 'list').",
                  ] }
 
-sub usage { '<action> <privs> <usernames>' }
+sub usage { '<action> [ <privs> [ <usernames> ] ]' }
 
 sub can_execute {
     my $remote = LJ::get_remote();
@@ -37,26 +37,38 @@ sub execute {
 sub execute {
     my ($self, $action, $privs, $usernames, @args) = @_;
 
-    return $self->error("This command takes three arguments. Consult the 
reference.")
-        unless $action && $privs && $usernames && scalar(@args) == 0;
+    return $self->error( "This command takes one, two, or three arguments. 
Consult the reference." )
+        unless $action && scalar(@args) == 0;
 
-    return $self->error("Action must be one of 'grant', 'revoke', or 
'revoke_all'")
-        unless $action =~ /(?:grant|revoke|revoke\_all)/;
+    return $self->error( "Action must be one of 'list', 'grant', 'revoke', or 
'revoke_all'" )
+        unless $action =~ /(?:list|grant|revoke|revoke\_all)/;
 
-    my @users = split /,/, $usernames;
+    return $self->error( "'$action' requires two arguments. Consult the 
reference." )
+        if $action ne 'list' && !$usernames;
+
     my $dbh = LJ::get_db_reader();
 
     my @privs;
-    foreach my $priv (split /,/, $privs) {
-        if ($priv !~ /^#/) {
-            push @privs, [ split /:/, $priv, 2 ];
-        } else {
-            # now we have a priv package
-            my $pname = substr($priv, 1);
-            my $privs = $dbh->selectall_arrayref("SELECT c.privname, c.privarg 
"
-                                                 . "FROM priv_packages p, 
priv_packages_content c "
-                                                 . "WHERE c.pkgid = p.pkgid 
AND p.name = ?", undef, $pname);
-            push @privs, [ @$_ ] foreach @{$privs || []};
+    if ( $action eq 'list' && !$privs ) {
+        # list all privs
+        $privs = $dbh->selectcol_arrayref( "SELECT privcode FROM priv_list 
ORDER BY privcode" );
+        push @privs, [ $_, undef ] foreach @$privs;
+    } else {
+        foreach my $priv (split /,/, $privs) {
+            if ($priv !~ /^#/) {
+                push @privs, [ split /:/, $priv, 2 ];
+            } else {
+                # now we have a priv package
+                if ( $action eq 'list' ) {
+                    $self->error( "Use the priv_package command to list 
packages." );
+                    next;
+                }
+                my $pname = substr($priv, 1);
+                my $privs = $dbh->selectall_arrayref("SELECT c.privname, 
c.privarg "
+                                                     . "FROM priv_packages p, 
priv_packages_content c "
+                                                     . "WHERE c.pkgid = 
p.pkgid AND p.name = ?", undef, $pname);
+                push @privs, [ @$_ ] foreach @{$privs || []};
+            }
         }
     }
 
@@ -66,6 +78,19 @@ sub execute {
     my $remote = LJ::get_remote();
     foreach my $pair (@privs) {
         my ($priv, $arg) = @$pair;
+
+        if ( $action eq "list" ) {
+            my $args = LJ::list_valid_args( $priv );
+            my @arglist = sort keys %$args;
+            if ( @arglist ) {
+                $self->info( "Accepted arguments for $priv:" );
+                $self->info( " '$_' - $args->{$_}" ) foreach @arglist;
+            } else {
+                $self->error( "No arguments available for $priv." )
+            }
+            next;
+        }
+
         unless ( $remote && ( $remote->has_priv( "admin", "$priv" ) || 
$remote->has_priv( "admin", "$priv/$arg" ) ) ) {
             $self->error("You are not permitted to $action $priv:$arg");
             next;
@@ -84,7 +109,7 @@ sub execute {
             next;
         }
 
-        foreach my $user (@users) {
+        foreach my $user ( split /,/, $usernames ) {
             my $u = LJ::load_user($user);
             unless ($u) {
                 $self->error("Invalid username: $user");
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to