Merge "Remove SshInfo from email templates and move to sysInjector"

This commit is contained in:
Edwin Kempin
2013-02-21 07:39:19 +00:00
committed by Gerrit Code Review
13 changed files with 213 additions and 125 deletions

View File

@@ -75,9 +75,16 @@ import com.google.gerrit.server.git.TagCache;
import com.google.gerrit.server.git.TransferConfig; import com.google.gerrit.server.git.TransferConfig;
import com.google.gerrit.server.git.validators.CommitValidationListener; import com.google.gerrit.server.git.validators.CommitValidationListener;
import com.google.gerrit.server.git.validators.CommitValidators; import com.google.gerrit.server.git.validators.CommitValidators;
import com.google.gerrit.server.mail.AddReviewerSender;
import com.google.gerrit.server.mail.CommitMessageEditedSender;
import com.google.gerrit.server.mail.CreateChangeSender;
import com.google.gerrit.server.mail.EmailModule; import com.google.gerrit.server.mail.EmailModule;
import com.google.gerrit.server.mail.FromAddressGenerator; import com.google.gerrit.server.mail.FromAddressGenerator;
import com.google.gerrit.server.mail.FromAddressGeneratorProvider; import com.google.gerrit.server.mail.FromAddressGeneratorProvider;
import com.google.gerrit.server.mail.MergeFailSender;
import com.google.gerrit.server.mail.MergedSender;
import com.google.gerrit.server.mail.RebasedPatchSetSender;
import com.google.gerrit.server.mail.ReplacePatchSetSender;
import com.google.gerrit.server.mail.VelocityRuntimeProvider; import com.google.gerrit.server.mail.VelocityRuntimeProvider;
import com.google.gerrit.server.patch.PatchListCacheImpl; import com.google.gerrit.server.patch.PatchListCacheImpl;
import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.patch.PatchSetInfoFactory;
@@ -91,6 +98,7 @@ import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.SectionSortCache; import com.google.gerrit.server.project.SectionSortCache;
import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ChangeQueryRewriter; import com.google.gerrit.server.query.change.ChangeQueryRewriter;
import com.google.gerrit.server.ssh.SshAddressesModule;
import com.google.gerrit.server.tools.ToolsCatalog; import com.google.gerrit.server.tools.ToolsCatalog;
import com.google.gerrit.server.util.IdGenerator; import com.google.gerrit.server.util.IdGenerator;
import com.google.gerrit.server.util.ThreadLocalRequestContext; import com.google.gerrit.server.util.ThreadLocalRequestContext;
@@ -152,21 +160,29 @@ public class GerritGlobalModule extends FactoryModule {
install(new EmailModule()); install(new EmailModule());
install(new GitModule()); install(new GitModule());
install(new PrologModule()); install(new PrologModule());
install(new SshAddressesModule());
install(ThreadLocalRequestContext.module()); install(ThreadLocalRequestContext.module());
bind(AccountResolver.class); bind(AccountResolver.class);
bind(ChangeQueryRewriter.class); bind(ChangeQueryRewriter.class);
factory(AccountInfoCacheFactory.Factory.class); factory(AccountInfoCacheFactory.Factory.class);
factory(AddReviewerSender.Factory.class);
factory(CapabilityControl.Factory.class); factory(CapabilityControl.Factory.class);
factory(ChangeQueryBuilder.Factory.class); factory(ChangeQueryBuilder.Factory.class);
factory(GroupInfoCacheFactory.Factory.class); factory(CommitMessageEditedSender.Factory.class);
factory(CreateChangeSender.Factory.class);
factory(GroupDetailFactory.Factory.class); factory(GroupDetailFactory.Factory.class);
factory(GroupInfoCacheFactory.Factory.class);
factory(InternalUser.Factory.class);
factory(MergedSender.Factory.class);
factory(MergeFailSender.Factory.class);
factory(PerformCreateGroup.Factory.class); factory(PerformCreateGroup.Factory.class);
factory(PerformRenameGroup.Factory.class); factory(PerformRenameGroup.Factory.class);
factory(InternalUser.Factory.class);
factory(ProjectNode.Factory.class); factory(ProjectNode.Factory.class);
factory(ProjectState.Factory.class); factory(ProjectState.Factory.class);
factory(RebasedPatchSetSender.Factory.class);
factory(ReplacePatchSetSender.Factory.class);
bind(PermissionCollection.Factory.class); bind(PermissionCollection.Factory.class);
bind(AccountVisibility.class) bind(AccountVisibility.class)
.toProvider(AccountVisibilityProvider.class) .toProvider(AccountVisibilityProvider.class)

View File

@@ -27,13 +27,6 @@ import com.google.gerrit.server.git.BanCommit;
import com.google.gerrit.server.git.MergeOp; import com.google.gerrit.server.git.MergeOp;
import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.SubmoduleOp; import com.google.gerrit.server.git.SubmoduleOp;
import com.google.gerrit.server.mail.AddReviewerSender;
import com.google.gerrit.server.mail.CommitMessageEditedSender;
import com.google.gerrit.server.mail.CreateChangeSender;
import com.google.gerrit.server.mail.MergeFailSender;
import com.google.gerrit.server.mail.MergedSender;
import com.google.gerrit.server.mail.RebasedPatchSetSender;
import com.google.gerrit.server.mail.ReplacePatchSetSender;
import com.google.gerrit.server.patch.AddReviewer; import com.google.gerrit.server.patch.AddReviewer;
import com.google.gerrit.server.patch.RemoveReviewer; import com.google.gerrit.server.patch.RemoveReviewer;
import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ChangeControl;
@@ -65,16 +58,9 @@ public class GerritRequestModule extends FactoryModule {
// easily park this stuff. // easily park this stuff.
// //
factory(AddReviewer.Factory.class); factory(AddReviewer.Factory.class);
factory(AddReviewerSender.Factory.class);
factory(CommitMessageEditedSender.Factory.class);
factory(CreateChangeSender.Factory.class);
factory(DeleteDraftPatchSet.Factory.class); factory(DeleteDraftPatchSet.Factory.class);
factory(PublishDraft.Factory.class); factory(PublishDraft.Factory.class);
factory(ReplacePatchSetSender.Factory.class);
factory(RebasedPatchSetSender.Factory.class);
factory(RemoveReviewer.Factory.class); factory(RemoveReviewer.Factory.class);
factory(MergedSender.Factory.class);
factory(MergeFailSender.Factory.class);
factory(GroupMembers.Factory.class); factory(GroupMembers.Factory.class);
factory(CreateProject.Factory.class); factory(CreateProject.Factory.class);
factory(SuggestParentCandidates.Factory.class); factory(SuggestParentCandidates.Factory.class);

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.mail;
import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -27,9 +26,8 @@ public class AddReviewerSender extends NewChangeSender {
} }
@Inject @Inject
public AddReviewerSender(EmailArguments ea, SshInfo si, @Assisted Change c) { public AddReviewerSender(EmailArguments ea, @Assisted Change c) {
super(ea, c); super(ea, c);
setSshInfo(si);
} }
@Override @Override

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.mail;
import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -26,9 +25,8 @@ public class CommitMessageEditedSender extends ReplacePatchSetSender {
} }
@Inject @Inject
public CommitMessageEditedSender(EmailArguments ea, SshInfo si, public CommitMessageEditedSender(EmailArguments ea, @Assisted Change c) {
@Assisted Change c) { super(ea, c);
super(ea, si, c);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType; import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.mail.ProjectWatch.Watchers; import com.google.gerrit.server.mail.ProjectWatch.Watchers;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -38,9 +37,8 @@ public class CreateChangeSender extends NewChangeSender {
} }
@Inject @Inject
public CreateChangeSender(EmailArguments ea, SshInfo si, @Assisted Change c) { public CreateChangeSender(EmailArguments ea, @Assisted Change c) {
super(ea, c); super(ea, c);
setSshInfo(si);
} }
@Override @Override

View File

@@ -31,11 +31,14 @@ import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ChangeQueryRewriter; import com.google.gerrit.server.query.change.ChangeQueryRewriter;
import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import org.apache.velocity.runtime.RuntimeInstance; import org.apache.velocity.runtime.RuntimeInstance;
import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
class EmailArguments { class EmailArguments {
@@ -54,6 +57,7 @@ class EmailArguments {
final String anonymousCowardName; final String anonymousCowardName;
final Provider<String> urlProvider; final Provider<String> urlProvider;
final AllProjectsName allProjectsName; final AllProjectsName allProjectsName;
final List<String> sshAddresses;
final ChangeQueryBuilder.Factory queryBuilder; final ChangeQueryBuilder.Factory queryBuilder;
final Provider<ChangeQueryRewriter> queryRewriter; final Provider<ChangeQueryRewriter> queryRewriter;
@@ -76,7 +80,8 @@ class EmailArguments {
ChangeQueryBuilder.Factory queryBuilder, ChangeQueryBuilder.Factory queryBuilder,
Provider<ChangeQueryRewriter> queryRewriter, Provider<ReviewDb> db, Provider<ChangeQueryRewriter> queryRewriter, Provider<ReviewDb> db,
RuntimeInstance velocityRuntime, RuntimeInstance velocityRuntime,
EmailSettings settings) { EmailSettings settings,
@SshAdvertisedAddresses List<String> sshAddresses) {
this.server = server; this.server = server;
this.projectCache = projectCache; this.projectCache = projectCache;
this.groupBackend = groupBackend; this.groupBackend = groupBackend;
@@ -97,5 +102,6 @@ class EmailArguments {
this.db = db; this.db = db;
this.velocityRuntime = velocityRuntime; this.velocityRuntime = velocityRuntime;
this.settings = settings; this.settings = settings;
this.sshAddresses = sshAddresses;
} }
} }

View File

@@ -14,22 +14,18 @@
package com.google.gerrit.server.mail; package com.google.gerrit.server.mail;
import com.google.common.collect.Iterables;
import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.server.mail.ProjectWatch.Watchers; import com.google.gerrit.server.mail.ProjectWatch.Watchers;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.jcraft.jsch.HostKey;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.List;
/** /**
* Common class for notifications that are related to a project and branch * Common class for notifications that are related to a project and branch
*/ */
@@ -39,7 +35,6 @@ public abstract class NotificationEmail extends OutgoingEmail {
protected Project.NameKey project; protected Project.NameKey project;
protected Branch.NameKey branch; protected Branch.NameKey branch;
private SshInfo sshInfo;
protected NotificationEmail(EmailArguments ea, protected NotificationEmail(EmailArguments ea,
String mc, Project.NameKey project, Branch.NameKey branch) { String mc, Project.NameKey project, Branch.NameKey branch) {
@@ -95,20 +90,11 @@ public abstract class NotificationEmail extends OutgoingEmail {
} }
} }
protected void setSshInfo(SshInfo si) {
this.sshInfo = si;
}
public String getSshHost() { public String getSshHost() {
if (sshInfo == null) { String host = Iterables.getFirst(args.sshAddresses, null);
if (host == null) {
return null; return null;
} }
final List<HostKey> hostKeys = sshInfo.getHostKeys();
if (hostKeys.isEmpty()) {
return null;
}
final String host = hostKeys.get(0).getHost();
if (host.startsWith("*:")) { if (host.startsWith("*:")) {
return getGerritHost() + host.substring(1); return getGerritHost() + host.substring(1);
} }

View File

@@ -16,7 +16,6 @@ package com.google.gerrit.server.mail;
import com.google.gerrit.common.errors.EmailException; import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -27,8 +26,8 @@ public class RebasedPatchSetSender extends ReplacePatchSetSender {
} }
@Inject @Inject
public RebasedPatchSetSender(EmailArguments ea, SshInfo si, @Assisted Change c) { public RebasedPatchSetSender(EmailArguments ea, @Assisted Change c) {
super(ea, si, c); super(ea, c);
} }
@Override @Override

View File

@@ -18,7 +18,6 @@ import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType; import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
@@ -38,9 +37,8 @@ public class ReplacePatchSetSender extends ReplyToChangeSender {
private final Set<Account.Id> extraCC = new HashSet<Account.Id>(); private final Set<Account.Id> extraCC = new HashSet<Account.Id>();
@Inject @Inject
public ReplacePatchSetSender(EmailArguments ea, SshInfo si, @Assisted Change c) { public ReplacePatchSetSender(EmailArguments ea, @Assisted Change c) {
super(ea, c, "newpatchset"); super(ea, c, "newpatchset");
setSshInfo(si);
} }
public void addReviewers(final Collection<Account.Id> cc) { public void addReviewers(final Collection<Account.Id> cc) {

View File

@@ -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;
}
}

View File

@@ -0,0 +1,30 @@
// 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 static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
/**
* Marker on the list of {@link SocketAddress}es configured to be advertised by
* the server.
*/
@Retention(RUNTIME)
@BindingAnnotation
public @interface SshAdvertisedAddresses {
}

View File

@@ -0,0 +1,30 @@
// 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 static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
/**
* Marker on the list of {@link SocketAddress}es on which the SSH daemon is
* configured to listen.
*/
@Retention(RUNTIME)
@BindingAnnotation
public @interface SshListenAddresses {
}

View File

@@ -14,6 +14,8 @@
package com.google.gerrit.sshd; package com.google.gerrit.sshd;
import static com.google.gerrit.server.ssh.SshAddressesModule.IANA_SSH_PORT;
import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
@@ -21,7 +23,9 @@ import com.google.gerrit.common.Version;
import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
import com.google.gerrit.server.ssh.SshInfo; import com.google.gerrit.server.ssh.SshInfo;
import com.google.gerrit.server.ssh.SshListenAddresses;
import com.google.gerrit.server.util.IdGenerator; import com.google.gerrit.server.util.IdGenerator;
import com.google.gerrit.server.util.SocketUtil; import com.google.gerrit.server.util.SocketUtil;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -114,13 +118,10 @@ import java.util.List;
*/ */
@Singleton @Singleton
public class SshDaemon extends SshServer implements SshInfo, LifecycleListener { public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
private static final int IANA_SSH_PORT = 22;
public static final int DEFAULT_PORT = 29418;
private static final Logger log = LoggerFactory.getLogger(SshDaemon.class); private static final Logger log = LoggerFactory.getLogger(SshDaemon.class);
private final List<SocketAddress> listen; private final List<SocketAddress> listen;
private final List<String> advertisedAddress; private final List<String> advertised;
private final boolean keepAlive; private final boolean keepAlive;
private final List<HostKey> hostKeys; private final List<HostKey> hostKeys;
private volatile IoAcceptor acceptor; private volatile IoAcceptor acceptor;
@@ -129,11 +130,13 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
SshDaemon(final CommandFactory commandFactory, final NoShell noShell, SshDaemon(final CommandFactory commandFactory, final NoShell noShell,
final PublickeyAuthenticator userAuth, final PublickeyAuthenticator userAuth,
final KeyPairProvider hostKeyProvider, final IdGenerator idGenerator, final KeyPairProvider hostKeyProvider, final IdGenerator idGenerator,
@GerritServerConfig final Config cfg, final SshLog sshLog) { @GerritServerConfig final Config cfg, final SshLog sshLog,
@SshListenAddresses final List<SocketAddress> listen,
@SshAdvertisedAddresses final List<String> advertised) {
setPort(IANA_SSH_PORT /* never used */); setPort(IANA_SSH_PORT /* never used */);
listen = parseListen(cfg); this.listen = listen;
advertisedAddress = parseAdvertisedAddress(cfg); this.advertised = advertised;
reuseAddress = cfg.getBoolean("sshd", "reuseaddress", true); reuseAddress = cfg.getBoolean("sshd", "reuseaddress", true);
keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true); keepAlive = cfg.getBoolean("sshd", "tcpkeepalive", true);
@@ -268,7 +271,7 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
buf.putRawPublicKey(pub); buf.putRawPublicKey(pub);
final byte[] keyBin = buf.getCompactData(); final byte[] keyBin = buf.getCompactData();
for (final String addr : myAdvertisedAddresses()) { for (final String addr : advertised) {
try { try {
r.add(new HostKey(addr, keyBin)); r.add(new HostKey(addr, keyBin));
} catch (JSchException e) { } catch (JSchException e) {
@@ -279,36 +282,6 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
return Collections.unmodifiableList(r); 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>();
for (final SocketAddress addr : listen) {
if (addr instanceof InetSocketAddress) {
final InetSocketAddress inetAddr = (InetSocketAddress) addr;
if (inetAddr.getAddress().isLoopbackAddress()) {
local.add(inetAddr);
} else {
pub.add(inetAddr);
}
}
}
return pub.isEmpty() ? local : pub;
}
private List<PublicKey> myHostKeys() { private List<PublicKey> myHostKeys() {
final KeyPairProvider p = getKeyPairProvider(); final KeyPairProvider p = getKeyPairProvider();
final List<PublicKey> keys = new ArrayList<PublicKey>(2); final List<PublicKey> keys = new ArrayList<PublicKey>(2);
@@ -336,42 +309,6 @@ public class SshDaemon extends SshServer implements SshInfo, LifecycleListener {
return r.toString(); 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");
if (want == null || want.length == 0) {
bind.add(new InetSocketAddress(DEFAULT_PORT));
return bind;
}
if (want.length == 1 && isOff(want[0])) {
return bind;
}
for (final String desc : want) {
try {
bind.add(SocketUtil.resolve(desc, DEFAULT_PORT));
} catch (IllegalArgumentException e) {
log.error("Bad sshd.listenaddress: " + desc + ": " + e.getMessage());
}
}
return bind;
}
private static boolean isOff(String listenHostname) {
return "off".equalsIgnoreCase(listenHostname)
|| "none".equalsIgnoreCase(listenHostname)
|| "no".equalsIgnoreCase(listenHostname);
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void initProviderBouncyCastle() { private void initProviderBouncyCastle() {
setKeyExchangeFactories(Arrays.<NamedFactory<KeyExchange>> asList( setKeyExchangeFactories(Arrays.<NamedFactory<KeyExchange>> asList(