diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java new file mode 100644 index 0000000000..4c1283a6a4 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ssh/SshAddressesModule.java @@ -0,0 +1,106 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.ssh; + +import com.google.common.collect.Lists; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.util.SocketUtil; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; + +import org.eclipse.jgit.lib.Config; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.Arrays; +import java.util.List; + +public class SshAddressesModule extends AbstractModule { + private static final Logger log = + LoggerFactory.getLogger(SshAddressesModule.class); + + public static final int DEFAULT_PORT = 29418; + public static final int IANA_SSH_PORT = 22; + + @Override + protected void configure() { + } + + @Provides + @Singleton + @SshListenAddresses + List<SocketAddress> getListenAddresses(@GerritServerConfig Config cfg) { + List<SocketAddress> listen = Lists.newArrayListWithExpectedSize(2); + String[] want = cfg.getStringList("sshd", null, "listenaddress"); + if (want == null || want.length == 0) { + listen.add(new InetSocketAddress(DEFAULT_PORT)); + return listen; + } + + if (want.length == 1 && isOff(want[0])) { + return listen; + } + + for (final String desc : want) { + try { + listen.add(SocketUtil.resolve(desc, DEFAULT_PORT)); + } catch (IllegalArgumentException e) { + log.error("Bad sshd.listenaddress: " + desc + ": " + e.getMessage()); + } + } + return listen; + } + + private static boolean isOff(String listenHostname) { + return "off".equalsIgnoreCase(listenHostname) + || "none".equalsIgnoreCase(listenHostname) + || "no".equalsIgnoreCase(listenHostname); + } + + @Provides + @Singleton + @SshAdvertisedAddresses + List<String> getAdvertisedAddresses(@GerritServerConfig Config cfg, + @SshListenAddresses List<SocketAddress> listen) { + String[] want = cfg.getStringList("sshd", null, "advertisedaddress"); + if (want.length > 0) { + return Arrays.asList(want); + } + List<InetSocketAddress> pub = Lists.newArrayList(); + List<InetSocketAddress> local = Lists.newArrayList(); + + for (SocketAddress addr : listen) { + if (addr instanceof InetSocketAddress) { + InetSocketAddress inetAddr = (InetSocketAddress) addr; + if (inetAddr.getAddress().isLoopbackAddress()) { + local.add(inetAddr); + } else { + pub.add(inetAddr); + } + } + } + if (pub.isEmpty()) { + pub = local; + } + List<String> adv = Lists.newArrayListWithCapacity(pub.size()); + for (InetSocketAddress addr : pub) { + adv.add(SocketUtil.format(addr, IANA_SSH_PORT)); + } + return adv; + } +} |