public abstract class SessionHelper extends AbstractKexFactoryManager implements Session
AbstractSession class smallerAbstractCloseable.StateSession.TimeoutStatusAttributeRepository.AttributeKey<T>closeFuture, lock, statelogDEFAULT_SSH_VERSION_PREFIX, FALLBACK_SSH_VERSION_PREFIX, MAX_VERSION_LINE_LENGTHEMPTYNONECLOSE_WAIT_TIMEOUT, DEFAULT_CLOSE_WAIT_TIMEOUT| Modifier | Constructor and Description |
|---|---|
protected |
SessionHelper(boolean serverSession,
FactoryManager factoryManager,
IoSession ioSession)
Create a new session.
|
| Modifier and Type | Method and Description |
|---|---|
Collection<AttributeRepository.AttributeKey<?>> |
attributeKeys() |
protected long |
calculateNextIgnorePacketCount(Random r,
long freq,
int variance) |
protected AbstractMap.SimpleImmutableEntry<Session.TimeoutStatus,String> |
checkAuthenticationTimeout(long now,
long authTimeoutMs)
Checks if authentication timeout expired
|
protected void |
checkForTimeouts()
Checks whether the session has timed out (both auth and idle timeouts are checked).
|
protected AbstractMap.SimpleImmutableEntry<Session.TimeoutStatus,String> |
checkIdleTimeout(long now,
long idleTimeoutMs)
Checks if idle timeout expired
|
void |
clearAttributes()
Removes all currently stored user-defined attributes
|
<T> T |
computeAttributeIfAbsent(AttributeRepository.AttributeKey<T> key,
Function<? super AttributeRepository.AttributeKey<T>,? extends T> resolver)
If the specified key is not already associated with a value (or is mapped
to
null), attempts to compute its value using the given mapping
function and enters it into this map unless null. |
protected Map<KexProposalOption,String> |
createProposal(String hostKeyTypes)
Create our proposal for SSH negotiation
|
void |
disconnect(int reason,
String msg)
Send a disconnect packet with the given reason and message.
|
protected List<String> |
doReadIdentification(Buffer buffer,
boolean server)
Read the remote identification from this buffer.
|
void |
exceptionCaught(Throwable t)
Handle any exceptions that occurred on this session.
|
<T> T |
getAttribute(AttributeRepository.AttributeKey<T> key)
Returns the value of the user-defined attribute.
|
int |
getAttributesCount() |
long |
getAuthTimeout() |
long |
getAuthTimeoutStart() |
SshdSocketAddress |
getBoundLocalPortForward(int port) |
SshdSocketAddress |
getBoundRemotePortForward(int port) |
ChannelStreamPacketWriterResolver |
getChannelStreamPacketWriterResolver() |
protected abstract ConnectionService |
getConnectionService() |
FactoryManager |
getFactoryManager() |
protected ForwardingFilter |
getForwardingFilter() |
long |
getIdleTimeout() |
long |
getIdleTimeoutStart() |
IoSession |
getIoSession() |
List<Map.Entry<Integer,SshdSocketAddress>> |
getLocalForwardsBindings() |
Object |
getLock() |
PropertyResolver |
getParentPropertyResolver() |
Map<String,Object> |
getProperties()
A map of properties that can be used to configure the SSH server or
client.
|
List<Map.Entry<Integer,SshdSocketAddress>> |
getRemoteForwardsBindings() |
ReservedSessionMessagesHandler |
getReservedSessionMessagesHandler() |
NavigableSet<Integer> |
getStartedLocalPortForwards() |
NavigableSet<Integer> |
getStartedRemotePortForwards() |
Session.TimeoutStatus |
getTimeoutStatus()
Check if timeout has occurred.
|
UnknownChannelReferenceHandler |
getUnknownChannelReferenceHandler() |
String |
getUsername() |
protected void |
handleDebug(Buffer buffer) |
protected void |
handleDisconnect(Buffer buffer) |
protected void |
handleDisconnect(int code,
String msg,
String lang,
Buffer buffer) |
protected void |
handleIgnore(Buffer buffer) |
protected void |
handleUnimplemented(Buffer buffer) |
protected void |
invokeSessionSignaller(Invoker<SessionListener,Void> invoker) |
boolean |
isAuthenticated() |
boolean |
isLocalPortForwardingStartedForPort(int port)
Test if local port forwarding is started
|
boolean |
isRemotePortForwardingStartedForPort(int port)
Test if remote port forwarding is started
|
boolean |
isServerSession() |
protected Map<KexProposalOption,String> |
mergeProposals(Map<KexProposalOption,String> current,
Map<KexProposalOption,String> proposal) |
<T> T |
removeAttribute(AttributeRepository.AttributeKey<T> key)
Removes the user-defined attribute
|
long |
resetAuthTimeout()
Re-start the authentication timeout timer
|
long |
resetIdleTimeout()
Re-start idle timeout timer
|
protected byte[] |
resizeKey(byte[] e,
int kdfSize,
Digest hash,
byte[] k,
byte[] h)
Method used while putting new keys into use that will resize the key used to
initialize the cipher to the needed length.
|
ChannelStreamPacketWriterResolver |
resolveChannelStreamPacketWriterResolver() |
protected String |
resolveIdentificationString(String configPropName)
Resolves the identification to send to the peer session by consulting
the associated
FactoryManager. |
protected SocketAddress |
resolvePeerAddress(SocketAddress knownAddress) |
protected ReservedSessionMessagesHandler |
resolveReservedSessionMessagesHandler() |
UnknownChannelReferenceHandler |
resolveUnknownChannelReferenceHandler()
Check if current manager has a specific handler set for it - if not,
try and resolve one from the "parent" container (if any)
|
IoWriteFuture |
sendDebugMessage(boolean display,
Object msg,
String lang)
Sends an
SSH_MSG_DEBUG to the peer session |
protected IoWriteFuture |
sendIdentification(String ident)
Send our identification.
|
IoWriteFuture |
sendIgnoreMessage(byte... data)
Sends an
SSH_MSG_IGNORE to the peer session |
protected IoWriteFuture |
sendNewKeys()
Send a message to put new keys into use.
|
protected IoWriteFuture |
sendNotImplemented(long seqNoValue)
Sends a
SSH_MSG_UNIMPLEMENTED message |
<T> T |
setAttribute(AttributeRepository.AttributeKey<T> key,
T value)
Sets a user-defined attribute.
|
void |
setAuthenticated() |
void |
setChannelStreamPacketWriterResolver(ChannelStreamPacketWriterResolver resolver) |
void |
setReservedSessionMessagesHandler(ReservedSessionMessagesHandler handler) |
void |
setUnknownChannelReferenceHandler(UnknownChannelReferenceHandler unknownChannelReferenceHandler) |
void |
setUsername(String username) |
protected void |
signalDisconnect(int code,
String msg,
String lang,
boolean initiator) |
protected void |
signalDisconnect(SessionListener listener,
int code,
String msg,
String lang,
boolean initiator) |
protected void |
signalExceptionCaught(SessionListener listener,
Throwable t) |
protected void |
signalExceptionCaught(Throwable t) |
protected void |
signalNegotiationEnd(Map<KexProposalOption,String> c2sOptions,
Map<KexProposalOption,String> s2cOptions,
Map<KexProposalOption,String> negotiatedGuess,
Throwable reason) |
protected void |
signalNegotiationEnd(SessionListener listener,
Map<KexProposalOption,String> c2sOptions,
Map<KexProposalOption,String> s2cOptions,
Map<KexProposalOption,String> negotiatedGuess,
Throwable reason) |
protected void |
signalNegotiationStart(Map<KexProposalOption,String> c2sOptions,
Map<KexProposalOption,String> s2cOptions) |
protected void |
signalNegotiationStart(SessionListener listener,
Map<KexProposalOption,String> c2sOptions,
Map<KexProposalOption,String> s2cOptions) |
protected void |
signalSessionClosed() |
protected void |
signalSessionClosed(SessionListener listener) |
protected void |
signalSessionCreated(IoSession ioSession) |
protected void |
signalSessionCreated(SessionListener listener) |
protected void |
signalSessionEvent(SessionListener.Event event)
Sends a session event to all currently registered session listeners
|
protected void |
signalSessionEvent(SessionListener listener,
SessionListener.Event event) |
String |
toString() |
IoWriteFuture |
writePacket(Buffer buffer,
long timeout,
TimeUnit unit)
Encode and send the given buffer with the specified timeout.
|
getCipherFactories, getCompressionFactories, getDelegate, getKeyExchangeFactories, getMacFactories, getSignatureFactories, resolveEffectiveFactories, resolveEffectiveProvider, setCipherFactories, setCompressionFactories, setKeyExchangeFactories, setMacFactories, setSignatureFactoriesdoCloseGracefully, doCloseImmediately, getInnerCloseableaddCloseFutureListener, builder, close, isClosed, isClosing, preClose, removeCloseFutureListenergetSimplifiedLoggerclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitcreateBuffer, createBuffer, getCipherInformation, getCompressionInformation, getKex, getLocalAddress, getMacInformation, getNegotiatedKexParameter, getRemoteAddress, getService, prepareBuffer, reExchangeKeys, request, resolveAttribute, resolveAttribute, startServicegetClientVersion, getServerVersion, getSessionId, isValidVersionPrefixgetBoolean, getBooleanProperty, getInteger, getIntProperty, getLong, getLongProperty, getObject, getString, getStringPropertyofAttributesMap, ofKeyValuePairgetCipherFactories, getCipherFactoriesNameList, getCipherFactoriesNames, getCompressionFactories, getCompressionFactoriesNameList, getCompressionFactoriesNames, getKeyExchangeFactories, getMacFactories, getMacFactoriesNameList, getMacFactoriesNames, setCipherFactories, setCipherFactoriesNameList, setCipherFactoriesNames, setCipherFactoriesNames, setCompressionFactories, setCompressionFactoriesNameList, setCompressionFactoriesNames, setCompressionFactoriesNames, setKeyExchangeFactories, setMacFactories, setMacFactoriesNameList, setMacFactoriesNames, setMacFactoriesNamesgetSignatureFactories, getSignatureFactories, getSignatureFactoriesNameList, getSignatureFactoriesNames, resolveSignatureFactories, setSignatureFactories, setSignatureFactoriesNameList, setSignatureFactoriesNames, setSignatureFactoriesNamesaddSessionListener, getSessionListenerProxy, removeSessionListeneraddChannelListener, getChannelListenerProxy, removeChannelListenerresolveChannelStreamPacketWriteraddPortForwardingEventListener, getPortForwardingEventListenerProxy, removePortForwardingEventListenerwritePacketaddCloseFutureListener, close, close, close, getMaxCloseWaitTime, isClosed, isClosing, isOpen, removeCloseFutureListenerprotected SessionHelper(boolean serverSession,
FactoryManager factoryManager,
IoSession ioSession)
serverSession - true if this is a server session, false if client onefactoryManager - the factory managerioSession - the underlying I/O sessionpublic IoSession getIoSession()
getIoSession in interface SessionIoSession associated to this sessionpublic boolean isServerSession()
public FactoryManager getFactoryManager()
getFactoryManager in interface FactoryManagerHolderFactoryManagerpublic PropertyResolver getParentPropertyResolver()
getParentPropertyResolver in interface PropertyResolvernull if no parentpublic Map<String,Object> getProperties()
PropertyResolverA map of properties that can be used to configure the SSH server or client. This map will never be changed by either the server or client and is not supposed to be changed at runtime (changes are not bound to have any effect on a running client or server), though it may affect the creation of sessions later as these values are usually not cached.
Note: the type of the mapped property should match the
expected configuration value type - Long, Integer, Boolean,
String, etc.... If it doesn't, the toString() result of the
mapped value is used to convert it to the required type. E.g., if the
mapped value is the string "1234" and the expected value
is a long then it will be parsed into one. Also, if the mapped
value is an Integer but a long is expected, then it will
be converted into one.
getProperties in interface PropertyResolverMap containing configuration values, never null.
Note: may be immutable.public int getAttributesCount()
getAttributesCount in interface AttributeRepositorypublic <T> T getAttribute(AttributeRepository.AttributeKey<T> key)
AttributeRepositorygetAttribute in interface AttributeRepositoryT - The generic attribute typekey - The key of the attribute; must not be null.null if there is no value associated with the specified keypublic Collection<AttributeRepository.AttributeKey<?>> attributeKeys()
attributeKeys in interface AttributeRepositoryCollection snapshot of all the currently registered
attributes in the repositorypublic <T> T computeAttributeIfAbsent(AttributeRepository.AttributeKey<T> key, Function<? super AttributeRepository.AttributeKey<T>,? extends T> resolver)
AttributeStorenull), attempts to compute its value using the given mapping
function and enters it into this map unless null.computeAttributeIfAbsent in interface AttributeStoreT - The generic attribute typekey - The key of the attribute; must not be null.resolver - The (never null) mapping function to use if value
not already mapped. If returns null then value is not mapped to
the provided key.null if value not mapped and resolver
did not return a non-null value for itpublic <T> T setAttribute(AttributeRepository.AttributeKey<T> key, T value)
AttributeStoresetAttribute in interface AttributeStoreT - The generic attribute typekey - The key of the attribute; must not be null.value - The value of the attribute; must not be null.null if it is new.public <T> T removeAttribute(AttributeRepository.AttributeKey<T> key)
AttributeStoreremoveAttribute in interface AttributeStoreT - The generic attribute typekey - The key of the attribute; must not be null.null if no previous valuepublic void clearAttributes()
AttributeStoreclearAttributes in interface AttributeStorepublic String getUsername()
getUsername in interface UsernameHoldernull/empty if holder
not yet initializedpublic void setUsername(String username)
setUsername in interface MutableUserHolderpublic boolean isAuthenticated()
isAuthenticated in interface SessionContexttrue if session has successfully completed the authentication phasepublic void setAuthenticated()
throws IOException
setAuthenticated in interface SessionIOExceptionprotected void checkForTimeouts()
throws IOException
IOException - If failed to checkcheckAuthenticationTimeout(long, long),
checkIdleTimeout(long, long)public long getAuthTimeoutStart()
getAuthTimeoutStart in interface Sessionpublic long resetAuthTimeout()
SessionresetAuthTimeout in interface SessionSession.getAuthTimeoutStart()protected AbstractMap.SimpleImmutableEntry<Session.TimeoutStatus,String> checkAuthenticationTimeout(long now, long authTimeoutMs)
now - The current time in millisauthTimeoutMs - The configured timeout in millis - if non-positive then no timeoutAbstractMap.SimpleImmutableEntry specifying the timeout status and disconnect reason
message if timeout expired, null or NoTimeout if no timeout occurredgetAuthTimeout()public long getIdleTimeoutStart()
getIdleTimeoutStart in interface Sessionprotected AbstractMap.SimpleImmutableEntry<Session.TimeoutStatus,String> checkIdleTimeout(long now, long idleTimeoutMs)
now - The current time in millisidleTimeoutMs - The configured timeout in millis - if non-positive then no timeoutAbstractMap.SimpleImmutableEntry specifying the timeout status and disconnect reason
message if timeout expired, null or NoTimeout if no timeout occurredgetIdleTimeout()public long resetIdleTimeout()
SessionresetIdleTimeout in interface SessionSession.getIdleTimeoutStart()public Session.TimeoutStatus getTimeoutStatus()
SessiongetTimeoutStatus in interface Sessionnullpublic Object getLock()
public ReservedSessionMessagesHandler getReservedSessionMessagesHandler()
getReservedSessionMessagesHandler in interface ReservedSessionMessagesManagerReservedSessionMessagesHandler - may be nullpublic void setReservedSessionMessagesHandler(ReservedSessionMessagesHandler handler)
setReservedSessionMessagesHandler in interface ReservedSessionMessagesManagerhandler - The ReservedSessionMessagesHandler to use - may be nullprotected IoWriteFuture sendNotImplemented(long seqNoValue) throws IOException
SSH_MSG_UNIMPLEMENTED messageseqNoValue - The referenced sequence numberIoWriteFuture that can be used to wait for packet write completionIOException - if an error occurred sending the packetprotected void handleUnimplemented(Buffer buffer) throws Exception
Exceptionpublic IoWriteFuture sendDebugMessage(boolean display, Object msg, String lang) throws IOException
SessionSSH_MSG_DEBUG to the peer sessionsendDebugMessage in interface Sessiondisplay - true if OK to display the message at the peer as-ismsg - The message object whose toString() value to be used - if
null then the "null" string is sentlang - The language - null/empty if some pre-agreed default is usedIoWriteFuture that can be used to check when the packet has actually been sentIOException - if an error occurred when encoding sending the packetprotected ReservedSessionMessagesHandler resolveReservedSessionMessagesHandler()
public UnknownChannelReferenceHandler getUnknownChannelReferenceHandler()
getUnknownChannelReferenceHandler in interface UnknownChannelReferenceHandlerManagerUnknownChannelReferenceHandlerManager to use - if
null then any reference to unknown channel causes an SshChannelNotFoundExceptionpublic void setUnknownChannelReferenceHandler(UnknownChannelReferenceHandler unknownChannelReferenceHandler)
setUnknownChannelReferenceHandler in interface UnknownChannelReferenceHandlerManagerunknownChannelReferenceHandler - The UnknownChannelReferenceHandlerManager to use - if
null then any reference to unknown channel causes an SshChannelNotFoundExceptionpublic UnknownChannelReferenceHandler resolveUnknownChannelReferenceHandler()
UnknownChannelReferenceHandlerManagerresolveUnknownChannelReferenceHandler in interface UnknownChannelReferenceHandlerManagerpublic ChannelStreamPacketWriterResolver getChannelStreamPacketWriterResolver()
getChannelStreamPacketWriterResolver in interface ChannelStreamPacketWriterResolverManagerpublic void setChannelStreamPacketWriterResolver(ChannelStreamPacketWriterResolver resolver)
setChannelStreamPacketWriterResolver in interface ChannelStreamPacketWriterResolverManagerpublic ChannelStreamPacketWriterResolver resolveChannelStreamPacketWriterResolver()
resolveChannelStreamPacketWriterResolver in interface ChannelStreamPacketWriterResolverManagerpublic IoWriteFuture sendIgnoreMessage(byte... data) throws IOException
SessionSSH_MSG_IGNORE to the peer sessionsendIgnoreMessage in interface Sessiondata - The message dataIoWriteFuture that can be used to check when the packet has actually been sentIOException - if an error occurred when encoding sending the packetpublic IoWriteFuture writePacket(Buffer buffer, long timeout, TimeUnit unit) throws IOException
SessionIoWriteFuture will be set with a
TimeoutException exception to indicate a timeout.writePacket in interface Sessionbuffer - the buffer to encode and spendtimeout - the timeoutunit - the time unit of the timeout parameterIOException - if an error occurred when encoding sending the packetprotected void signalSessionCreated(IoSession ioSession) throws Exception
Exceptionprotected void signalSessionCreated(SessionListener listener)
protected void signalSessionEvent(SessionListener.Event event) throws IOException
event - The event to sendIOException - If any of the registered listeners threw an exception.protected void signalSessionEvent(SessionListener listener, SessionListener.Event event) throws IOException
IOExceptionprotected void invokeSessionSignaller(Invoker<SessionListener,Void> invoker) throws Throwable
Throwableprotected byte[] resizeKey(byte[] e,
int kdfSize,
Digest hash,
byte[] k,
byte[] h)
throws Exception
e - the key to resizekdfSize - the cipher key-derivation-factor (in bytes)hash - the hash algorithmk - the key exchange k parameterh - the key exchange h parameterException - if a problem occur while resizing the keyprotected SocketAddress resolvePeerAddress(SocketAddress knownAddress)
knownAddress - Any externally set peer address - e.g., due to some
proxy mechanism meta-datanull otherwise, the IoSession
peer addressprotected long calculateNextIgnorePacketCount(Random r, long freq, int variance)
protected String resolveIdentificationString(String configPropName)
FactoryManager. If a value is set, then it is
appended to the standard SessionContext.DEFAULT_SSH_VERSION_PREFIX.
Otherwise a default value is returned consisting of the prefix and
the core artifact name + version in uppercase - e.g.,'
"SSH-2.0-APACHE-SSHD-1.2.3.4"configPropName - The property used to query the factory managerprotected IoWriteFuture sendIdentification(String ident) throws IOException
ident - our identification to sendIoWriteFuture that can be used to wait for notification
that identification has been sendIOException - If failed to send the packetprotected List<String> doReadIdentification(Buffer buffer, boolean server)
null value will be returned. Else the identification
string will be returned and the data read will be consumed from the buffer.buffer - the buffer containing the identification stringserver - true if it is called by the server session,
false if by the client sessionList of all received remote identification lines until
the version line was read or null if more data is needed.
The identification line is the last one in the listprotected Map<KexProposalOption,String> createProposal(String hostKeyTypes)
hostKeyTypes - The comma-separated list of supported host key typesMapprotected Map<KexProposalOption,String> mergeProposals(Map<KexProposalOption,String> current, Map<KexProposalOption,String> proposal)
protected void signalNegotiationStart(Map<KexProposalOption,String> c2sOptions, Map<KexProposalOption,String> s2cOptions)
protected void signalNegotiationStart(SessionListener listener, Map<KexProposalOption,String> c2sOptions, Map<KexProposalOption,String> s2cOptions)
protected void signalNegotiationEnd(Map<KexProposalOption,String> c2sOptions, Map<KexProposalOption,String> s2cOptions, Map<KexProposalOption,String> negotiatedGuess, Throwable reason)
protected void signalNegotiationEnd(SessionListener listener, Map<KexProposalOption,String> c2sOptions, Map<KexProposalOption,String> s2cOptions, Map<KexProposalOption,String> negotiatedGuess, Throwable reason)
protected IoWriteFuture sendNewKeys() throws IOException
IoWriteFuture that can be used to wait and
check the result of sending the packetIOException - if an error occurs sending the messagepublic void disconnect(int reason,
String msg)
throws IOException
Sessiondisconnect in interface Sessionreason - the reason code for this disconnectmsg - the text messageIOException - if an error occurred sending the packetprotected void handleDisconnect(int code,
String msg,
String lang,
Buffer buffer)
throws Exception
Exceptionprotected void signalDisconnect(int code,
String msg,
String lang,
boolean initiator)
protected void signalDisconnect(SessionListener listener, int code, String msg, String lang, boolean initiator)
public void exceptionCaught(Throwable t)
SshException.exceptionCaught in interface Sessiont - the exception to processprotected void signalExceptionCaught(Throwable t)
protected void signalExceptionCaught(SessionListener listener, Throwable t)
protected void signalSessionClosed()
protected void signalSessionClosed(SessionListener listener)
protected abstract ConnectionService getConnectionService()
protected ForwardingFilter getForwardingFilter()
public List<Map.Entry<Integer,SshdSocketAddress>> getLocalForwardsBindings()
getLocalForwardsBindings in interface PortForwardingInformationProviderSshdSocketAddresspublic boolean isLocalPortForwardingStartedForPort(int port)
PortForwardingInformationProviderisLocalPortForwardingStartedForPort in interface PortForwardingInformationProviderport - The local porttrue if local port forwarding is startedgetBoundLocalPortForwardpublic NavigableSet<Integer> getStartedLocalPortForwards()
getStartedLocalPortForwards in interface PortForwardingInformationProviderNavigableSet snapshot of the currently started
local port forwardspublic SshdSocketAddress getBoundLocalPortForward(int port)
getBoundLocalPortForward in interface PortForwardingInformationProviderport - The port numberSshdSocketAddress for the port
- null if none boundisLocalPortForwardingStartedForPort,
PortForwardingInformationProvider.getStartedLocalPortForwards()public List<Map.Entry<Integer,SshdSocketAddress>> getRemoteForwardsBindings()
getRemoteForwardsBindings in interface PortForwardingInformationProviderSshdSocketAddresspublic boolean isRemotePortForwardingStartedForPort(int port)
PortForwardingInformationProviderisRemotePortForwardingStartedForPort in interface PortForwardingInformationProviderport - The remote porttrue if remote port forwarding is startedgetBoundRemotePortForwardpublic NavigableSet<Integer> getStartedRemotePortForwards()
getStartedRemotePortForwards in interface PortForwardingInformationProviderNavigableSet snapshot of the currently started
remote port forwardspublic SshdSocketAddress getBoundRemotePortForward(int port)
getBoundRemotePortForward in interface PortForwardingInformationProviderport - The port numberSshdSocketAddress for the port
- null if none boundisRemotePortForwardingStartedForPort,
PortForwardingInformationProvider.getStartedRemotePortForwards()public long getAuthTimeout()
getAuthTimeout in interface Sessionpublic long getIdleTimeout()
getIdleTimeout in interface SessionCopyright © 2008–2021 The Apache Software Foundation. All rights reserved.