summaryrefslogtreecommitdiffstats
path: root/java/com/google/gerrit/sshd/SshSession.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/google/gerrit/sshd/SshSession.java')
-rw-r--r--java/com/google/gerrit/sshd/SshSession.java128
1 files changed, 128 insertions, 0 deletions
diff --git a/java/com/google/gerrit/sshd/SshSession.java b/java/com/google/gerrit/sshd/SshSession.java
new file mode 100644
index 0000000000..1a60a20f90
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshSession.java
@@ -0,0 +1,128 @@
+// 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.AttributeStore.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;
+
+ 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;
+ }
+
+ /** 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);
+ }
+
+ /** @return {@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();
+ }
+}