sshd.advertisedAddress: specify the displayed SSH host/port

Previously, gerrit would just do use the hostname of the machine, and
the actual listen port. However, I have an alias setup, with port 22
redirected to gerrit's ssh port, and I'd like it advertised to users.

Change-Id: I5d44928404fabbe2863be42702ca628bcbced76c
Signed-Off-By: James Y Knight <jyknight@google.com>
This commit is contained in:
James Y Knight
2011-01-11 20:05:56 -05:00
committed by Shawn O. Pearce
parent 09029fedd8
commit 910bd8655d
2 changed files with 43 additions and 2 deletions

View File

@@ -120,6 +120,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
private static final Logger log = LoggerFactory.getLogger(SshDaemon.class);
private final List<SocketAddress> listen;
private final List<String> advertisedAddress;
private final boolean keepAlive;
private final List<HostKey> hostKeys;
private volatile IoAcceptor acceptor;
@@ -132,6 +133,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
setPort(IANA_SSH_PORT /* never used */);
listen = parseListen(cfg);
advertisedAddress = parseAdvertisedAddress(cfg);
reuseAddress = cfg.getBoolean("sshd", "reuseaddress", true);
keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true);
@@ -262,9 +264,9 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
buf.putRawPublicKey(pub);
final byte[] keyBin = buf.getCompactData();
for (final InetSocketAddress addr : myAddresses()) {
for (final String addr : myAdvertisedAddresses()) {
try {
r.add(new HostKey(SocketUtil.format(addr, IANA_SSH_PORT), keyBin));
r.add(new HostKey(addr, keyBin));
} catch (JSchException e) {
log.warn("Cannot format SSHD host key", e);
}
@@ -273,6 +275,19 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
return Collections.unmodifiableList(r);
}
private List<String> myAdvertisedAddresses() {
if (advertisedAddress != null) {
return advertisedAddress;
} else {
List<InetSocketAddress> addrs = myAddresses();
List<String> strAddrs = new ArrayList<String>(addrs.size());
for (final InetSocketAddress addr : addrs) {
strAddrs.add(SocketUtil.format(addr, IANA_SSH_PORT));
}
return strAddrs;
}
}
private List<InetSocketAddress> myAddresses() {
ArrayList<InetSocketAddress> pub = new ArrayList<InetSocketAddress>();
ArrayList<InetSocketAddress> local = new ArrayList<InetSocketAddress>();
@@ -317,6 +332,14 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
return r.toString();
}
private List<String> parseAdvertisedAddress(final Config cfg) {
final String[] want = cfg.getStringList("sshd", null, "advertisedaddress");
if (want.length == 0) {
return null;
}
return Arrays.asList(want);
}
private List<SocketAddress> parseListen(final Config cfg) {
final ArrayList<SocketAddress> bind = new ArrayList<SocketAddress>(2);
final String[] want = cfg.getStringList("sshd", null, "listenaddress");