diff --git a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs index 7ef17ab5..999a2725 100644 --- a/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs +++ b/mRemoteV1/Config/Putty/AbstractPuttySessionsProvider.cs @@ -18,14 +18,34 @@ namespace mRemoteNG.Config.Putty public virtual IEnumerable GetSessions() { - foreach (var sessionName in GetSessionNames(true)) + var sessionNamesFromProvider = GetSessionNames(true); + foreach (var sessionName in GetSessionNamesToAdd(sessionNamesFromProvider)) { var sessionInfo = GetSession(sessionName); AddSession(sessionInfo); } + foreach (var session in GetSessionToRemove(sessionNamesFromProvider)) + { + RemoveSession(session); + } + RootInfo.SortRecursive(); return Sessions; } + private IEnumerable GetSessionNamesToAdd(IEnumerable sessionNamesFromProvider) + { + var currentlyKnownSessionNames = Sessions.Select(session => session.Name); + var sessionNamesToAdd = sessionNamesFromProvider.Except(currentlyKnownSessionNames); + return sessionNamesToAdd; + } + + private IEnumerable GetSessionToRemove(IEnumerable sessionNamesFromProvider) + { + var currentlyKnownSessionNames = Sessions.Select(session => session.Name); + var sessionNamesToRemove = currentlyKnownSessionNames.Except(sessionNamesFromProvider); + return Sessions.Where(session => sessionNamesToRemove.Contains(session.Name)); + } + protected virtual void AddSession(PuttySessionInfo sessionInfo) { if (string.IsNullOrEmpty(sessionInfo?.Name) || Sessions.Any(child => child.Name == sessionInfo.Name))