Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 121 additions & 0 deletions SuperPutty/Data/PuttyDataHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
using System.Xml;
using System.IO;
using System.Linq;
using IniParser;
using IniParser.Model;

namespace SuperPutty.Data
{
Expand All @@ -27,7 +29,40 @@ public static RegistryKey RootAppKey
return key;
}
}

private static IniData GetIniDataIfEnabled()
{
// Ini suppoted Putty uses ini file (IniFile is Enabled) only when
// 1. "putty.ini" exists on the exe folder
string puttyIni = Path.ChangeExtension(SuperPuTTY.Settings.PuttyExe, ".ini");

if (File.Exists(puttyIni))
{
FileIniDataParser parser = new IniParser.FileIniDataParser();
IniData data = parser.ReadFile(puttyIni);

// 2. following Entry exists in putty.ini
// [Generic]
// UseIniFile=1
if (data["Generic"]["UseIniFile"] == "1")
{
return data;
}
}
return null;
}

public static List<string> GetSessionNames()
{
IniData data = GetIniDataIfEnabled();
if (data == null) {
return GetSessionNamesFromRegistry();
} else {
return GetSessionNamesFromIni(data);
}
}

private static List<string> GetSessionNamesFromRegistry()
{
List<string> names = new List<string> {SessionEmptySettings};
RegistryKey key = RootAppKey;
Expand All @@ -45,7 +80,62 @@ public static List<string> GetSessionNames()
return names;
}

private static ConnectionProtocol? ParseIniProtocol(string proto_str)
{
proto_str = proto_str.ToLower().Replace("\"", "");
switch (proto_str) {
case "ssh":
return ConnectionProtocol.SSH;
case "serial":
return ConnectionProtocol.Serial;
case "telnet":
return ConnectionProtocol.Telnet;
case "rlogin":
return ConnectionProtocol.Rlogin;
case "raw":
return ConnectionProtocol.Raw;
default: // "supdup", "bare-ssh"
return null; // not supported
}
}

public static List<string> GetSessionNamesFromIni(IniData data)
{
List<string> names = new List<string> {SessionEmptySettings};

SectionDataCollection sections = data.Sections;
foreach (SectionData section in sections)
{
string sectionName = section.SectionName;
if (sectionName.StartsWith("Session:"))
{
string session_name = HttpUtility.UrlDecode(sectionName.Substring(8)/*"Len("Session:")*/);

if (ParseIniProtocol(data[sectionName]["Protocol"]) == null)
continue; // skip unsupported protocol session
names.Add(session_name);
};
}

if (!names.Contains(SessionDefaultSettings))
{
names.Insert(1, SessionDefaultSettings);
}

return names;
}

public static List<SessionData> GetAllSessionsFromPuTTY()
{
IniData data = GetIniDataIfEnabled();
if (data == null) {
return GetAllSessionsFromPuTTYRegistry();
} else {
return GetAllSessionsFromPuTTYIni(data);
}
}

private static List<SessionData> GetAllSessionsFromPuTTYRegistry()
{
List<SessionData> sessions = new List<SessionData>();

Expand Down Expand Up @@ -77,6 +167,37 @@ public static List<SessionData> GetAllSessionsFromPuTTY()

return sessions;
}
private static List<SessionData> GetAllSessionsFromPuTTYIni(IniData data)
{
List<SessionData> sessions = new List<SessionData>();

SectionDataCollection sections = data.Sections;
foreach (SectionData section in sections)
{
string sectionName = section.SectionName;
// parse "[Session:UrlEncodedSessionName]" sections only
if (sectionName.StartsWith("Session:"))
{
string session_name = HttpUtility.UrlDecode(sectionName.Substring(8)/*Remove "Session:"*/);
ConnectionProtocol? proto = ParseIniProtocol(section.Keys["Protocol"]);
if (proto == null)
continue; // skip unsupported protocol

SessionData session = new SessionData
{
Host = section.Keys["HostName"],
Port = Convert.ToInt32(section.Keys["PortNumber"]),
Proto = (ConnectionProtocol)proto,
PuttySession = session_name,
SessionName = session_name,
Username = section.Keys["UserName"]
};
sessions.Add(session);
}
}

return sessions;
}

public static List<SessionData> GetAllSessionsFromPuTTYCM(string fileExport)
{
Expand Down
3 changes: 3 additions & 0 deletions SuperPutty/SuperPutty.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c, processorArchitecture=MSIL">
<HintPath>..\packages\ini-parser.2.5.2\lib\net20\INIFileParser.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.13.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.13\lib\net45\log4net.dll</HintPath>
</Reference>
Expand Down
1 change: 1 addition & 0 deletions SuperPutty/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<packages>
<package id="DockPanelSuite" version="3.1.0" targetFramework="net45" />
<package id="DockPanelSuite.ThemeVS2005" version="3.1.0" targetFramework="net45" />
<package id="ini-parser" version="2.5.2" targetFramework="net45" />
<package id="log4net" version="2.0.13" targetFramework="net45" />
<package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net45" />
<package id="SSH.NET" version="2020.0.1" targetFramework="net45" />
Expand Down