| // Copyright (C) 2010 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.sshd; |
| |
| import com.google.gerrit.server.AccessPath; |
| import com.google.gerrit.server.CurrentUser; |
| import java.net.InetAddress; |
| import java.net.InetSocketAddress; |
| import java.net.SocketAddress; |
| import org.apache.sshd.common.AttributeRepository.AttributeKey; |
| |
| /** Global data related to an active SSH connection. */ |
| public class SshSession { |
| /** ServerSession attribute key for this object instance. */ |
| public static final AttributeKey<SshSession> KEY = new AttributeKey<>(); |
| |
| private final int sessionId; |
| private final SocketAddress remoteAddress; |
| private final String remoteAsString; |
| |
| private volatile CurrentUser identity; |
| private volatile String username; |
| private volatile String authError; |
| private volatile String peerAgent; |
| |
| private volatile boolean gracefulStop = false; |
| |
| SshSession(int sessionId, SocketAddress peer) { |
| this.sessionId = sessionId; |
| this.remoteAddress = peer; |
| this.remoteAsString = format(remoteAddress); |
| } |
| |
| SshSession(SshSession parent, SocketAddress peer, CurrentUser user) { |
| user.setAccessPath(AccessPath.SSH_COMMAND); |
| this.sessionId = parent.sessionId; |
| this.remoteAddress = peer; |
| if (parent.remoteAddress == peer) { |
| this.remoteAsString = parent.remoteAsString; |
| } else { |
| this.remoteAsString = format(peer) + "/" + parent.remoteAsString; |
| } |
| this.identity = user; |
| } |
| |
| /** Unique session number, assigned during connect. */ |
| public int getSessionId() { |
| return sessionId; |
| } |
| |
| public boolean requiresGracefulStop() { |
| return gracefulStop; |
| } |
| |
| public void setGracefulStop(boolean gracefulStop) { |
| this.gracefulStop = gracefulStop; |
| } |
| |
| /** Identity of the authenticated user account on the socket. */ |
| public CurrentUser getUser() { |
| return identity; |
| } |
| |
| public SocketAddress getRemoteAddress() { |
| return remoteAddress; |
| } |
| |
| public String getRemoteAddressAsString() { |
| return remoteAsString; |
| } |
| |
| public String getPeerAgent() { |
| return peerAgent; |
| } |
| |
| public void setPeerAgent(String agent) { |
| peerAgent = agent; |
| } |
| |
| String getUsername() { |
| return username; |
| } |
| |
| String getAuthenticationError() { |
| return authError; |
| } |
| |
| void authenticationSuccess(String user, CurrentUser id) { |
| username = user; |
| identity = id; |
| identity.setAccessPath(AccessPath.SSH_COMMAND); |
| authError = null; |
| } |
| |
| void authenticationError(String user, String error) { |
| username = user; |
| identity = null; |
| authError = error; |
| } |
| |
| void setAccessPath(AccessPath path) { |
| identity.setAccessPath(path); |
| } |
| |
| /** Returns {@code true} if the authentication did not succeed. */ |
| boolean isAuthenticationError() { |
| return authError != null; |
| } |
| |
| private static String format(SocketAddress remote) { |
| if (remote instanceof InetSocketAddress) { |
| final InetSocketAddress sa = (InetSocketAddress) remote; |
| |
| final InetAddress in = sa.getAddress(); |
| if (in != null) { |
| return in.getHostAddress(); |
| } |
| |
| final String hostName = sa.getHostName(); |
| if (hostName != null) { |
| return hostName; |
| } |
| } |
| return remote.toString(); |
| } |
| } |