diff --git a/contrib/adc/help b/contrib/adc/help
index 4e96123..4f34e11 100755
--- a/contrib/adc/help
+++ b/contrib/adc/help
@@ -2,6 +2,25 @@
. $(dirname $0)/adc.common-functions
+# the help adc now takes some options; we need to process them first
+
+[ "$1" = "-list" ] && {
+ # the GL_ADC_PATH directory has files other than ADCs also, notably the
+ # include file for shell ADCs, and maybe a README or two. Those should be
+ # chmod -x.
+
+ # if you want to temporarily hide any ADC from being listed, do the same
+ # thing: chmod -x
+
+ cd $($GL_BINDIR/gl-query-rc GL_ADC_PATH)
+ for i in *
+ do
+ [ -x $i ] && echo $i
+ done
+
+ exit 0
+}
+
# the local site can have a file called gl-adc-help.txt, which will be used as
# the *entire* help text for this site...
diff --git a/contrib/real-users/gl-shell b/contrib/real-users/gl-shell
index 08eaae6..26fe2b4 100755
--- a/contrib/real-users/gl-shell
+++ b/contrib/real-users/gl-shell
@@ -7,40 +7,64 @@ use warnings;
# site-local changes
-# the original login shell your users had. Set this to something like
-# "/sbin/nologin" or "/bin/false" if you don't want them to have a normal
-# shell (i.e., you created these accounts *only* to provide a password
-# authentication passthru to gitolite)
+# the original login shell your users had (or) the shell to forward
+# non-gitolite commands to
my $shell = "/bin/bash";
+# suggested values if you really don't want them actually logging in:
+# /sbin/nologin - obvious
+# /usr/bin/passwd - same, but allows them to change their passwords
# the gitolite hosting user you want to forward git commands to. Typically
# this will be 'git' or perhaps 'gitolite', but actually could be anything
my $hosting_user = "gitolite-test";
+# ADCs...
+# either list all the ADCs you wish to allow forwarding to (SPACE-separated):
+my $ADC_list = "";
+# -- OR --
+# if you upgraded to the new 'help' adc with the '-list' option, set this to 1:
+my $detect_ADCs = 0;
+# if you do neither, ADCs are not forwarded
+
# ------------------------------------------------------------------------------
-# process normal logins (the ones that *don't* get forwarded to the gitolite
-# hosting user)
-
-# this is a normal login, not to be forwarded to the gitolite hosting user, if:
-# - there are no arguments
+# no arguments? nothing to forward
exec($shell) unless @ARGV;
-# - the first argument is not "-c"
-exec($shell, @ARGV) unless $ARGV[0] eq '-c';
-# - the second argument does not fit what git usually sends
-exec($shell, @ARGV) unless $ARGV[1] =~ /^(git-receive-pack|git-upload-pack|git-upload-archive) '(\S+)'$/;
-# - there *is* a local directory with the same name as the second part of argument #2
-exec($shell, @ARGV) if -d $2;
+
+# forward normal git ops
+forward(@ARGV) if
+ $ARGV[0] eq '-c' and
+ $ARGV[1] =~ /^(git-receive-pack|git-upload-pack|git-upload-archive) '(\S+)'$/ and
+ ( not -d "$2" );
+
+# forward gitolite special commands
+forward(@ARGV) if $ARGV[0] eq '-c' and $ARGV[1] =~ /^(info|expand|((set|get)(perms|desc)))( |$)/;
+
+# forward ADCs
+if ($ADC_list or $detect_ADCs) {
+ $ADC_list ||= `ssh $hosting_user\@localhost help -list`;
+ $ADC_list =~ s/\s+/ /g;
+
+ # find the command he's running
+ my $cmd = $1 if $ARGV[1] =~ /^(\S+)/;
+ # forward if the command appears somewhere in the ADC list
+ forward(@ARGV) if $ARGV[0] eq '-c' and $cmd and $ADC_list =~ /(^| )$cmd( |$)/;
+}
+
+# at this point it's back to local processing
+exec($shell, @ARGV);
# ------------------------------------------------------------------------------
-# if all that failed, it means we have to forward this to the hosting user
+# forward to the hosting user
+sub forward {
+ # this message is important in debugging and trouble shooting; see
+ # documentation
+ print STDERR "[forwarding to $hosting_user\@localhost]\n";
-# this message is important in debugging and trouble shooting; see documentation
-print STDERR "[forwarding to $hosting_user\@localhost]\n";
+ # but first we check for rsa key
+ -f ".ssh/id_rsa" or die "ask your admin to add you to gitolite";
-# but first we check for rsa key
--f ".ssh/id_rsa" or die "ask your admin to add you to gitolite";
-
-shift; # that pesky '-c'...
-exec("ssh", "$hosting_user\@localhost", @ARGV);
+ shift if $_[0] eq '-c';
+ exec("ssh", "$hosting_user\@localhost", @_);
+}
diff --git a/contrib/real-users/password-access.mkd b/contrib/real-users/password-access.mkd
index b527083..beff859 100644
--- a/contrib/real-users/password-access.mkd
+++ b/contrib/real-users/password-access.mkd
@@ -81,13 +81,6 @@ these pesky ssh keys.
normal users also. In fact, you can have users who give you a pub key
from their workstation the normal way, as well as use this method.
- * Special commands and ADCs will NOT work from the workstation for such
- users; they have to log on to their own userid on the server and run the
- appropriate command (such as `ssh git@localhost info`) from there. We could have handled the known special commands (info,
- expand, setperms, etc.), but considering that an ADC could be called
- *anything*, a general solution is impossible.
-
### what the 2 scripts actually do
@@ -125,7 +118,7 @@ Here's how to set this up. First, the **one-time** tasks:
`/usr/local/bin`.
* As root, customise the program `/usr/local/bin/gl-shell`. You will need
- to change only 2 variables at the top in a section clearly marked as
+ to change some variables at the top in a section clearly marked
'site-local changes'.
* As root, copy `contrib/real-users/gl-shell-setup` to some place on root's