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:

committed by
Shawn O. Pearce

parent
09029fedd8
commit
910bd8655d
@@ -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");
|
||||
|
Reference in New Issue
Block a user