| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "SessionData.h"
- #include "Common.h"
- #include "Configuration.h"
- #include "Exceptions.h"
- #include "FileBuffer.h"
- #include "ScpMain.h"
- #include "Security.h"
- #include "TextsCore.h"
- #include "PuttyIntf.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- //---------------------------------------------------------------------------
- const char * DefaultSessionName = "Default Settings";
- const char CipherNames[CIPHER_COUNT][10] = {"WARN", "3des", "blowfish", "aes", "des"};
- const char SshProtList[][10] = {"1 only", "1", "2", "2 only"};
- const char ProxyMethodList[][10] = {"none", "SOCKS4", "SOCKS5", "HTTP", "Telnet", "Cmd" };
- const TCipher DefaultCipherList[CIPHER_COUNT] =
- { cipAES, cipBlowfish, cip3DES, cipWarn, cipDES };
- const char FSProtocolNames[FSPROTOCOL_COUNT][11] = { "SCP", "SFTP (SCP)", "SFTP" };
- //--- TSessionData ----------------------------------------------------
- __fastcall TSessionData::TSessionData(AnsiString aName):
- TNamedObject(aName)
- {
- Default();
- FModified = true;
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::Default()
- {
- HostName = "";
- PortNumber = default_port;
- UserName = "";
- Password = "";
- PingInterval = 30;
- PingType = ptOff;
- Timeout = 15;
- AgentFwd = false;
- AuthTIS = false;
- AuthKI = true;
- Compression = false;
- SshProt = ssh2;
- Ssh2DES = false;
- for (int Index = 0; Index < CIPHER_COUNT; Index++)
- {
- Cipher[Index] = DefaultCipherList[Index];
- }
- PublicKeyFile = "";
- FProtocol = ptSSH;
- TcpNoDelay = true;
- ProxyMethod = pmNone;
- ProxyHost = "proxy";
- ProxyPort = 80;
- ProxyUsername = "";
- ProxyPassword = "";
- ProxyTelnetCommand = "connect %host %port\\n";
- //ProxySOCKSVersion = 5;
- ProxyDNS = asAuto;
- ProxyLocalhost = false;
- for (int Index = 0; Index < LENOF(FBugs); Index++)
- {
- Bug[(TSshBug)Index] = asAuto;
- }
- Special = false;
- FSProtocol = fsSFTP;
- // FS common
- LocalDirectory = "";
- RemoteDirectory = "";
- UpdateDirectories = false;
- CacheDirectories = true;
- CacheDirectoryChanges = true;
- PreserveDirectoryChanges = true;
- LockInHome = false;
- ResolveSymlinks = true;
- // SCP
- ReturnVar = "";
- LookupUserGroups = true;
- EOLType = eolLF;
- Shell = ""; //default shell
- ReturnVar = "";
- ClearAliases = true;
- UnsetNationalVars = true;
- AliasGroupList = false;
- IgnoreLsWarnings = true;
- Scp1Compatibility = false;
- TimeDifference = 0;
- // SFTP
- SFTPDownloadQueue = 4;
- SFTPUploadQueue = 4;
- SFTPListingQueue = 2;
- CustomParam1 = "";
- CustomParam2 = "";
- Selected = false;
- FModified = false;
- // add also to TSessionLog::AddStartupInfo()
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::Assign(TPersistent * Source)
- {
- if (Source && Source->InheritsFrom(__classid(TSessionData)))
- {
- #define DUPL(P) P = ((TSessionData *)Source)->P
- DUPL(Name);
- DUPL(HostName);
- DUPL(PortNumber);
- DUPL(UserName);
- DUPL(Password);
- DUPL(PingInterval);
- DUPL(PingType);
- DUPL(Timeout);
- DUPL(AgentFwd);
- DUPL(AuthTIS);
- DUPL(Compression);
- DUPL(SshProt);
- DUPL(Ssh2DES);
- DUPL(CipherList);
- DUPL(PublicKeyFile);
- DUPL(FSProtocol);
- DUPL(LocalDirectory);
- DUPL(RemoteDirectory);
- DUPL(UpdateDirectories);
- DUPL(CacheDirectories);
- DUPL(CacheDirectoryChanges);
- DUPL(PreserveDirectoryChanges);
- DUPL(ResolveSymlinks);
- DUPL(LockInHome);
- DUPL(Special);
- DUPL(Selected);
- DUPL(ReturnVar);
- DUPL(LookupUserGroups);
- DUPL(EOLType);
- DUPL(Shell);
- DUPL(ClearAliases);
- DUPL(Scp1Compatibility);
- DUPL(UnsetNationalVars);
- DUPL(AliasGroupList);
- DUPL(IgnoreLsWarnings);
- DUPL(TimeDifference);
- // new in 53b
- DUPL(TcpNoDelay);
- DUPL(AuthKI);
- DUPL(ProxyMethod);
- DUPL(ProxyHost);
- DUPL(ProxyPort);
- DUPL(ProxyUsername);
- DUPL(ProxyPassword);
- DUPL(ProxyTelnetCommand);
- DUPL(ProxyDNS);
- DUPL(ProxyLocalhost);
- for (int Index = 0; Index < LENOF(FBugs); Index++)
- {
- DUPL(Bug[(TSshBug)Index]);
- }
- DUPL(CustomParam1);
- DUPL(CustomParam2);
- #undef DUPL
- FModified = ((TSessionData *)Source)->Modified;
- }
- else
- {
- TNamedObject::Assign(Source);
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::StoreToConfig(void * config)
- {
- Config * cfg = (Config *)config;
- // clear all (parameters not set below)
- memset(cfg, 0, sizeof(*cfg));
- // user-configurable settings
- ASCOPY(cfg->host, HostName);
- ASCOPY(cfg->username, UserName);
- cfg->port = PortNumber;
- cfg->protocol = PROT_SSH;
- // ping_interval is not used anyway
- cfg->ping_interval = (PingType == ptNullPacket) ? PingInterval : 0;
- cfg->compression = Compression;
- cfg->agentfwd = AgentFwd;
- for (int c = 0; c < CIPHER_COUNT; c++)
- {
- int pcipher;
- switch (Cipher[c]) {
- case cipWarn: pcipher = CIPHER_WARN; break;
- case cip3DES: pcipher = CIPHER_3DES; break;
- case cipBlowfish: pcipher = CIPHER_BLOWFISH; break;
- case cipAES: pcipher = CIPHER_AES; break;
- case cipDES: pcipher = CIPHER_DES; break;
- default: assert(false);
- }
- cfg->ssh_cipherlist[c] = pcipher;
- }
- AnsiString SPublicKeyFile = PublicKeyFile;
- if (SPublicKeyFile.IsEmpty()) SPublicKeyFile = Configuration->DefaultKeyFile;
- SPublicKeyFile = StripPathQuotes(SPublicKeyFile);
- ASCOPY(cfg->keyfile.path, SPublicKeyFile);
- cfg->sshprot = SshProt;
- cfg->ssh2_des_cbc = Ssh2DES;
- cfg->try_tis_auth = AuthTIS;
- cfg->try_ki_auth = AuthKI;
- cfg->proxy_type = ProxyMethod;
- ASCOPY(cfg->proxy_host, ProxyHost);
- cfg->proxy_port = ProxyPort;
- ASCOPY(cfg->proxy_username, ProxyUsername);
- ASCOPY(cfg->proxy_password, ProxyPassword);
- ASCOPY(cfg->proxy_telnet_command, ProxyTelnetCommand);
- cfg->proxy_dns = ProxyDNS;
- cfg->even_proxy_localhost = ProxyLocalhost;
- #pragma option push -w-eas
- // after 0.53b values were reversed, however putty still stores
- // settings to registry in save way as before
- cfg->sshbug_ignore1 = Bug[sbIgnore1];
- cfg->sshbug_plainpw1 = Bug[sbPlainPW1];
- cfg->sshbug_rsa1 = Bug[sbRSA1];
- cfg->sshbug_hmac2 = Bug[sbHMAC2];
- cfg->sshbug_derivekey2 = Bug[sbDeriveKey2];
- cfg->sshbug_rsapad2 = Bug[sbRSAPad2];
- cfg->sshbug_dhgex2 = Bug[sbDHGEx2];
- // new after 0.53b
- cfg->sshbug_pksessid2 = Bug[sbPKSessID2];
- #pragma option pop
- if (FSProtocol == fsSCPonly)
- {
- cfg->ssh_subsys = FALSE;
- if (Shell.IsEmpty())
- {
- // Following forces Putty to open default shell
- // see ssh.c: do_ssh2_authconn() and ssh1_protocol()
- cfg->remote_cmd[0] = '\0';
- }
- else
- {
- ASCOPY(cfg->remote_cmd, Shell);
- }
- cfg->remote_cmd_ptr = &cfg->remote_cmd[0];
- cfg->remote_cmd_ptr2 = NULL; // no second attempt for SCPonly
- }
- else
- {
- cfg->ssh_subsys = TRUE;
- strcpy(cfg->remote_cmd, "sftp");
- cfg->remote_cmd_ptr = &cfg->remote_cmd[0];
- if (FSProtocol != fsSFTPonly)
- {
- cfg->ssh_subsys2 = FALSE;
- if (Shell.IsEmpty())
- {
- cfg->remote_cmd2[0] = '\0';
- }
- else
- {
- ASCOPY(cfg->remote_cmd2, Shell);
- }
- cfg->remote_cmd_ptr2 = &cfg->remote_cmd2[0];
- }
- else
- {
- // see psftp_connect() from psftp.c
- cfg->ssh_subsys2 = FALSE;
- cfg->remote_cmd_ptr2 =
- "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n"
- "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n"
- "exec sftp-server";
- }
- }
- // permanent settings
- cfg->nopty = TRUE;
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::Load(THierarchicalStorage * Storage)
- {
- if (Storage->OpenSubKey(StorageKey, False))
- {
- PortNumber = Storage->ReadInteger("PortNumber", PortNumber);
- UserName = Storage->ReadString("UserName", UserName);
- // must be loaded after UserName, because HostName may be in format user@host
- HostName = Storage->ReadString("HostName", HostName);
- if (!Configuration->DisablePasswordStoring)
- {
- FPassword = Storage->ReadString("Password", FPassword);
- }
- PingInterval =
- Storage->ReadInteger("PingInterval", PingInterval/60)*60 +
- Storage->ReadInteger("PingIntervalSec", PingInterval%60);
- PingType = static_cast<TPingType>
- (Storage->ReadInteger("PingType", PingInterval > 0 ? ptNullPacket : ptOff));
- if (PingInterval == 0)
- {
- PingInterval = 60;
- }
- Timeout = Storage->ReadInteger("Timeout", Timeout);
- AgentFwd = Storage->ReadBool("AgentFwd", AgentFwd);
- AuthTIS = Storage->ReadBool("AuthTIS", AuthTIS);
- AuthKI = Storage->ReadBool("AuthKI", AuthKI);
- Compression = Storage->ReadBool("Compression", Compression);
- SshProt = (TSshProt)Storage->ReadInteger("SshProt", SshProt);
- Ssh2DES = Storage->ReadBool("Ssh2DES", Ssh2DES);
- CipherList = Storage->ReadString("Cipher", CipherList);
- PublicKeyFile = Storage->ReadString("PublicKeyFile", PublicKeyFile);
- FSProtocol = (TFSProtocol)Storage->ReadInteger("FSProtocol", FSProtocol);
- LocalDirectory = Storage->ReadString("LocalDirectory", LocalDirectory);
- RemoteDirectory = Storage->ReadString("RemoteDirectory", RemoteDirectory);
- UpdateDirectories = Storage->ReadBool("UpdateDirectories", UpdateDirectories);
- CacheDirectories = Storage->ReadBool("CacheDirectories", CacheDirectories);
- CacheDirectoryChanges = Storage->ReadBool("CacheDirectoryChanges", CacheDirectoryChanges);
- PreserveDirectoryChanges = Storage->ReadBool("PreserveDirectoryChanges", PreserveDirectoryChanges);
- ResolveSymlinks = Storage->ReadBool("ResolveSymlinks", ResolveSymlinks);
- LockInHome = Storage->ReadBool("LockInHome", LockInHome);
- Special = Storage->ReadBool("Special", Special);
- Shell = Storage->ReadString("Shell", Shell);
- ClearAliases = Storage->ReadBool("ClearAliases", ClearAliases);
- UnsetNationalVars = Storage->ReadBool("UnsetNationalVars", UnsetNationalVars);
- AliasGroupList = Storage->ReadBool("AliasGroupList", AliasGroupList);
- IgnoreLsWarnings = Storage->ReadBool("IgnoreLsWarnings", IgnoreLsWarnings);
- Scp1Compatibility = Storage->ReadBool("Scp1Compatibility", Scp1Compatibility);
- TimeDifference = Storage->ReadFloat("TimeDifference", TimeDifference);
- ReturnVar = Storage->ReadString("ReturnVar", ReturnVar);
- LookupUserGroups = Storage->ReadBool("LookupUserGroups", LookupUserGroups);
- EOLType = (TEOLType)Storage->ReadInteger("EOLType", EOLType);
- // new in 53b
- TcpNoDelay = Storage->ReadBool("TcpNoDelay", TcpNoDelay);
- ProxyMethod = (TProxyMethod)Storage->ReadInteger("ProxyMethod", -1);
- if (ProxyMethod < 0)
- {
- int ProxyType = Storage->ReadInteger("ProxyType", pxNone);
- int ProxySOCKSVersion;
- switch (ProxyType) {
- case pxHTTP:
- ProxyMethod = pmHTTP;
- break;
- case pxTelnet:
- ProxyMethod = pmTelnet;
- break;
- case pxSocks:
- ProxySOCKSVersion = Storage->ReadInteger("ProxySOCKSVersion", 5);
- ProxyMethod = ProxySOCKSVersion == 5 ? pmSocks5 : pmSocks4;
- break;
- default:
- case pxNone:
- ProxyMethod = pmNone;
- break;
- }
- }
- ProxyHost = Storage->ReadString("ProxyHost", ProxyHost);
- ProxyPort = Storage->ReadInteger("ProxyPort", ProxyPort);
- ProxyUsername = Storage->ReadString("ProxyUsername", ProxyUsername);
- FProxyPassword = Storage->ReadString("ProxyPassword", FProxyPassword);
- ProxyTelnetCommand = Storage->ReadStringRaw("ProxyTelnetCommand", ProxyTelnetCommand);
- ProxyDNS = TAutoSwitch((Storage->ReadInteger("ProxyDNS", ProxyDNS) + 1) % 3);
- ProxyLocalhost = Storage->ReadBool("ProxyLocalhost", ProxyLocalhost);
- #define READ_BUG(BUG) \
- Bug[sb##BUG] = TAutoSwitch(2 - Storage->ReadInteger("Bug"#BUG, \
- 2 - Bug[sb##BUG]));
- READ_BUG(Ignore1);
- READ_BUG(PlainPW1);
- READ_BUG(RSA1);
- READ_BUG(HMAC2);
- READ_BUG(DeriveKey2);
- READ_BUG(RSAPad2);
- READ_BUG(DHGEx2);
- READ_BUG(PKSessID2);
- #undef READ_BUG
- if ((Bug[sbHMAC2] == asAuto) &&
- Storage->ReadBool("BuggyMAC", false))
- {
- Bug[sbHMAC2] = asOn;
- }
- // read only (used only on Import from Putty dialog)
- ProtocolStr = Storage->ReadString("Protocol", ProtocolStr);
- CustomParam1 = Storage->ReadString("CustomParam1", CustomParam1);
- CustomParam2 = Storage->ReadString("CustomParam2", CustomParam2);
- Storage->CloseSubKey();
- };
- FModified = false;
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::Save(THierarchicalStorage * Storage, bool PuttyExport)
- {
- if (Modified && Storage->OpenSubKey(StorageKey, true))
- {
- Storage->WriteString("HostName", HostName);
- Storage->WriteInteger("PortNumber", PortNumber);
- Storage->WriteString("UserName", UserName);
- if (!Configuration->DisablePasswordStoring && !PuttyExport)
- {
- Storage->WriteString("Password", FPassword);
- }
- Storage->WriteInteger("PingInterval", PingInterval/60);
- Storage->WriteInteger("PingIntervalSec", PingInterval%60);
- Storage->WriteInteger("PingType", PingType);
- Storage->WriteInteger("Timeout", Timeout);
- Storage->WriteBool("AgentFwd", AgentFwd);
- Storage->WriteBool("AuthTIS", AuthTIS);
- Storage->WriteBool("AuthKI", AuthKI);
- Storage->WriteBool("Compression", Compression);
- Storage->WriteInteger("SshProt", SshProt);
- Storage->WriteBool("Ssh2DES", Ssh2DES);
- Storage->WriteString("Cipher", CipherList);
- Storage->WriteBool("TcpNoDelay", TcpNoDelay);
- if (PuttyExport)
- {
- Storage->WriteStringRaw("PublicKeyFile", PublicKeyFile);
- }
- else
- {
- Storage->WriteString("PublicKeyFile", PublicKeyFile);
- Storage->WriteInteger("FSProtocol", FSProtocol);
- Storage->WriteString("LocalDirectory", LocalDirectory);
- Storage->WriteString("RemoteDirectory", RemoteDirectory);
- Storage->WriteBool("UpdateDirectories", UpdateDirectories);
- Storage->WriteBool("CacheDirectories", CacheDirectories);
- Storage->WriteBool("CacheDirectoryChanges", CacheDirectoryChanges);
- Storage->WriteBool("PreserveDirectoryChanges", PreserveDirectoryChanges);
- Storage->WriteBool("ResolveSymlinks", ResolveSymlinks);
- Storage->WriteBool("LockInHome", LockInHome);
- // Special is never stored (if it would, login dialog must be modified not to
- // duplicate Special parameter when Special session is loaded and then stored
- // under different name)
- // Storage->WriteBool("Special", Special);
- Storage->WriteString("Shell", Shell);
- Storage->WriteBool("ClearAliases", ClearAliases);
- Storage->WriteBool("UnsetNationalVars", UnsetNationalVars);
- Storage->WriteBool("AliasGroupList", AliasGroupList);
- Storage->WriteBool("IgnoreLsWarnings", IgnoreLsWarnings);
- Storage->WriteBool("Scp1Compatibility", Scp1Compatibility);
- Storage->WriteFloat("TimeDifference", TimeDifference);
- Storage->WriteString("ReturnVar", ReturnVar);
- Storage->WriteBool("LookupUserGroups", LookupUserGroups);
- Storage->WriteInteger("EOLType", EOLType);
- }
- Storage->WriteInteger("ProxyMethod", ProxyMethod);
- if (PuttyExport)
- {
- // support for Putty 0.53b and older
- int ProxyType;
- int ProxySOCKSVersion = 5;
- switch (ProxyMethod) {
- case pmHTTP:
- ProxyType = pxHTTP;
- break;
- case pmTelnet:
- ProxyType = pxTelnet;
- break;
- case pmSocks5:
- ProxyType = pxSocks;
- ProxySOCKSVersion = 5;
- break;
- case pmSocks4:
- ProxyType = pxSocks;
- ProxySOCKSVersion = 4;
- break;
- default:
- case pmNone:
- ProxyType = pxNone;
- break;
- }
- Storage->WriteInteger("ProxyType", ProxyType);
- Storage->WriteInteger("ProxySOCKSVersion", ProxySOCKSVersion);
- }
- Storage->WriteString("ProxyHost", ProxyHost);
- Storage->WriteInteger("ProxyPort", ProxyPort);
- Storage->WriteString("ProxyUsername", ProxyUsername);
- Storage->WriteString("ProxyPassword", FProxyPassword);
- Storage->WriteStringRaw("ProxyTelnetCommand", ProxyTelnetCommand);
- Storage->WriteInteger("ProxyDNS", (ProxyDNS+2) % 3);
- Storage->WriteBool("ProxyLocalhost", ProxyLocalhost);
- #define WRITE_BUG(BUG) Storage->WriteInteger("Bug"#BUG, 2 - Bug[sb##BUG]);
- WRITE_BUG(Ignore1);
- WRITE_BUG(PlainPW1);
- WRITE_BUG(RSA1);
- WRITE_BUG(HMAC2);
- WRITE_BUG(DeriveKey2);
- WRITE_BUG(RSAPad2);
- WRITE_BUG(DHGEx2);
- WRITE_BUG(PKSessID2);
- #undef WRITE_BUG
- if (PuttyExport)
- {
- Storage->WriteString("Protocol", ProtocolStr);
- }
- if (!PuttyExport)
- {
- Storage->WriteString("CustomParam1", CustomParam1);
- Storage->WriteString("CustomParam2", CustomParam2);
- }
- Storage->CloseSubKey();
- FModified = false;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::Remove()
- {
- THierarchicalStorage * Storage = Configuration->CreateScpStorage(true);
- try
- {
- if (Storage->OpenSubKey(Configuration->StoredSessionsSubKey, false))
- {
- Storage->RecursiveDeleteSubKey(StorageKey);
- }
- }
- __finally
- {
- delete Storage;
- }
- }
- //---------------------------------------------------------------------
- bool __fastcall TSessionData::ParseUrl(AnsiString Url, int Params,
- AnsiString * ConnectInfo, AnsiString * HostName, int * PortNumber,
- AnsiString * UserName, AnsiString * Password, AnsiString * Path)
- {
- int PSlash = Url.Pos("/");
- if (PSlash == 0)
- {
- PSlash = Url.Length() + 1;
- }
- AnsiString AConnectInfo;
- AConnectInfo = Url.SubString(1, PSlash - 1);
- int P = AConnectInfo.Pos("@");
- bool Result = (P > 0) || ((Params & puRequireUsername) == 0);
- if (Result)
- {
- if (Path != NULL)
- {
- bool ExcludeLeadingSlash = (Params & puExcludeLeadingSlash) != 0;
- int Delta = ExcludeLeadingSlash ? 1 : 0;
- AnsiString APath = Url.SubString(PSlash + Delta,
- Url.Length() - PSlash - Delta + 1);
- if (ExcludeLeadingSlash || (APath != "/"))
- {
- *Path = APath;
- }
- }
- if (ConnectInfo != NULL)
- {
- *ConnectInfo = AConnectInfo;
- }
- AnsiString UserInfo;
- AnsiString HostInfo;
- if (P > 0)
- {
- UserInfo = AConnectInfo.SubString(1, P - 1);
- HostInfo = AConnectInfo.SubString(P + 1, AConnectInfo.Length() - P);
- }
- else
- {
- HostInfo = AConnectInfo;
- }
- if (HostName != NULL)
- {
- *HostName = CutToChar(HostInfo, ':', true);
- }
- else
- {
- CutToChar(HostInfo, ':', true);
- }
- if (PortNumber != NULL)
- {
- *PortNumber = HostInfo.IsEmpty() ? -1 : StrToIntDef(HostInfo, -1);
- }
- if (UserName != NULL)
- {
- *UserName = CutToChar(UserInfo, ':', false);
- }
- else
- {
- CutToChar(UserInfo, ':', false);
- }
- if (Password != NULL)
- {
- *Password = UserInfo;
- }
- }
- return Result;
- }
- //---------------------------------------------------------------------
- bool __fastcall TSessionData::ParseUrl(AnsiString Url, int Params)
- {
- AnsiString AHostName = HostName;
- int APortNumber = PortNumber;
- AnsiString AUserName = UserName;
- AnsiString APassword = Password;
- AnsiString ARemoteDirectory = RemoteDirectory;
- bool Result = ParseUrl(Url, Params, NULL, &AHostName, &APortNumber,
- &AUserName, &APassword, &ARemoteDirectory);
- if (Result)
- {
- HostName = AHostName;
- if (APortNumber >= 0)
- {
- PortNumber = APortNumber;
- }
- UserName = AUserName;
- Password = APassword;
- RemoteDirectory = ARemoteDirectory;
- }
- return Result;
- }
- //---------------------------------------------------------------------
- bool __fastcall TSessionData::GetCanLogin()
- {
- return !FHostName.IsEmpty() && !FUserName.IsEmpty();
- }
- //---------------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetSessionKey()
- {
- return FORMAT("%s@%s", (UserName, HostName));
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetStorageKey()
- {
- return MungeStr(Name);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetHostName(AnsiString value)
- {
- if (FHostName != value)
- {
- // HostName is key for password encryption
- AnsiString XPassword = Password;
- int P = value.LastDelimiter("@");
- if (P > 0)
- {
- UserName = value.SubString(1, P - 1);
- value = value.SubString(P + 1, value.Length() - P);
- }
- FHostName = value;
- FModified = true;
- Password = XPassword;
- if (!XPassword.IsEmpty())
- {
- memset(XPassword.c_str(), 0, XPassword.Length());
- }
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPortNumber(int value)
- {
- SET_SESSION_PROPERTY(PortNumber);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetShell(AnsiString value)
- {
- SET_SESSION_PROPERTY(Shell);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetClearAliases(bool value)
- {
- SET_SESSION_PROPERTY(ClearAliases);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetAliasGroupList(bool value)
- {
- SET_SESSION_PROPERTY(AliasGroupList);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetIgnoreLsWarnings(bool value)
- {
- SET_SESSION_PROPERTY(IgnoreLsWarnings);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetUnsetNationalVars(bool value)
- {
- SET_SESSION_PROPERTY(UnsetNationalVars);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetUserName(AnsiString value)
- {
- // UserName is key for password encryption
- AnsiString XPassword = Password;
- SET_SESSION_PROPERTY(UserName);
- Password = XPassword;
- if (!XPassword.IsEmpty())
- {
- memset(XPassword.c_str(), 0, XPassword.Length());
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPassword(AnsiString value)
- {
- value = EncryptPassword(value, UserName+HostName);
- SET_SESSION_PROPERTY(Password);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetPassword()
- {
- return DecryptPassword(FPassword, UserName+HostName);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPingInterval(int value)
- {
- SET_SESSION_PROPERTY(PingInterval);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetAgentFwd(bool value)
- {
- SET_SESSION_PROPERTY(AgentFwd);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetAuthTIS(bool value)
- {
- SET_SESSION_PROPERTY(AuthTIS);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetAuthKI(bool value)
- {
- SET_SESSION_PROPERTY(AuthKI);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCompression(bool value)
- {
- SET_SESSION_PROPERTY(Compression);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSshProt(TSshProt value)
- {
- SET_SESSION_PROPERTY(SshProt);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSsh2DES(bool value)
- {
- SET_SESSION_PROPERTY(Ssh2DES);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetSshProtStr()
- {
- return SshProtList[FSshProt];
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCipher(int Index, TCipher value)
- {
- assert(Index >= 0 && Index < CIPHER_COUNT);
- SET_SESSION_PROPERTY(Ciphers[Index]);
- }
- //---------------------------------------------------------------------
- TCipher __fastcall TSessionData::GetCipher(int Index)
- {
- assert(Index >= 0 && Index < CIPHER_COUNT);
- return FCiphers[Index];
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCipherList(AnsiString value)
- {
- bool Used[CIPHER_COUNT];
- for (int C = 0; C < CIPHER_COUNT; C++) Used[C] = false;
- AnsiString CipherStr;
- int Index = 0;
- while (!value.IsEmpty() && (Index < CIPHER_COUNT))
- {
- CipherStr = CutToChar(value, ',', true);
- for (int C = 0; C < CIPHER_COUNT; C++)
- {
- if (!CipherStr.AnsiCompareIC(CipherNames[C]))
- {
- Cipher[Index] = (TCipher)C;
- Used[C] = true;
- Index++;
- break;
- }
- }
- }
- for (int C = 0; C < CIPHER_COUNT && Index < CIPHER_COUNT; C++)
- {
- if (!Used[DefaultCipherList[C]]) Cipher[Index++] = DefaultCipherList[C];
- }
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetCipherList()
- {
- AnsiString Result;
- for (int Index = 0; Index < CIPHER_COUNT; Index++)
- {
- Result += AnsiString(Index ? "," : "") + CipherNames[Cipher[Index]];
- }
- return Result;
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPublicKeyFile(AnsiString value)
- {
- SET_SESSION_PROPERTY(PublicKeyFile);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetDefaultLogFileName()
- {
- return GetTemporaryPath() + MakeValidFileName(SessionName) + ".log";
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetReturnVar(AnsiString value)
- {
- SET_SESSION_PROPERTY(ReturnVar);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetLookupUserGroups(bool value)
- {
- SET_SESSION_PROPERTY(LookupUserGroups);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetEOLType(TEOLType value)
- {
- SET_SESSION_PROPERTY(EOLType);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetTimeout(int value)
- {
- SET_SESSION_PROPERTY(Timeout);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetFSProtocol(TFSProtocol value)
- {
- SET_SESSION_PROPERTY(FSProtocol);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetFSProtocolStr()
- {
- assert(FSProtocol >= 0 && FSProtocol < FSPROTOCOL_COUNT);
- return FSProtocolNames[FSProtocol];
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetDetectReturnVar(bool value)
- {
- if (value != DetectReturnVar)
- {
- ReturnVar = value ? "" : "$?";
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TSessionData::GetDetectReturnVar()
- {
- return ReturnVar.IsEmpty();
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetDefaultShell(bool value)
- {
- if (value != DefaultShell)
- {
- Shell = value ? "" : "/bin/bash";
- }
- }
- //---------------------------------------------------------------------------
- bool __fastcall TSessionData::GetDefaultShell()
- {
- return Shell.IsEmpty();
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetProtocolStr(AnsiString value)
- {
- for (int Index = 0; backends[Index].name != NULL; Index++)
- {
- if (!value.AnsiCompareIC(backends[Index].name))
- {
- FProtocol = (TProtocol)backends[Index].protocol;
- break;
- }
- }
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetProtocolStr()
- {
- for (int Index = 0; backends[Index].name != NULL; Index++)
- {
- if ((TProtocol)backends[Index].protocol == Protocol)
- {
- return backends[Index].name;
- }
- }
- return "raw";
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPingIntervalDT(TDateTime value)
- {
- unsigned short hour, min, sec, msec;
- value.DecodeTime(&hour, &min, &sec, &msec);
- PingInterval = ((int)hour)*60*60 + ((int)min)*60 + sec;
- }
- //---------------------------------------------------------------------------
- TDateTime __fastcall TSessionData::GetPingIntervalDT()
- {
- return TDateTime((unsigned short)(PingInterval/60/60),
- (unsigned short)(PingInterval/60%60), (unsigned short)(PingInterval%60), 0);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetPingType(TPingType value)
- {
- SET_SESSION_PROPERTY(PingType);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetSessionName()
- {
- if (!Name.IsEmpty() && !TNamedObjectList::IsHidden(this) &&
- (Name != DefaultSessionName))
- {
- return Name;
- }
- else if (!HostName.IsEmpty() && !UserName.IsEmpty())
- {
- return FORMAT("%s@%s", (UserName, HostName));
- }
- else if (!HostName.IsEmpty())
- {
- return HostName;
- }
- else
- {
- return "session";
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetTimeDifference(TDateTime value)
- {
- SET_SESSION_PROPERTY(TimeDifference);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetLocalDirectory(AnsiString value)
- {
- SET_SESSION_PROPERTY(LocalDirectory);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetRemoteDirectory(AnsiString value)
- {
- SET_SESSION_PROPERTY(RemoteDirectory);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetUpdateDirectories(bool value)
- {
- SET_SESSION_PROPERTY(UpdateDirectories);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCacheDirectories(bool value)
- {
- SET_SESSION_PROPERTY(CacheDirectories);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCacheDirectoryChanges(bool value)
- {
- SET_SESSION_PROPERTY(CacheDirectoryChanges);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetPreserveDirectoryChanges(bool value)
- {
- SET_SESSION_PROPERTY(PreserveDirectoryChanges);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetResolveSymlinks(bool value)
- {
- SET_SESSION_PROPERTY(ResolveSymlinks);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetLockInHome(bool value)
- {
- SET_SESSION_PROPERTY(LockInHome);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSpecial(bool value)
- {
- SET_SESSION_PROPERTY(Special);
- }
- //---------------------------------------------------------------------------
- void __fastcall TSessionData::SetScp1Compatibility(bool value)
- {
- SET_SESSION_PROPERTY(Scp1Compatibility);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetTcpNoDelay(bool value)
- {
- SET_SESSION_PROPERTY(TcpNoDelay);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyMethod(TProxyMethod value)
- {
- SET_SESSION_PROPERTY(ProxyMethod);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyHost(AnsiString value)
- {
- SET_SESSION_PROPERTY(ProxyHost);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyPort(int value)
- {
- SET_SESSION_PROPERTY(ProxyPort);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyUsername(AnsiString value)
- {
- SET_SESSION_PROPERTY(ProxyUsername);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyPassword(AnsiString value)
- {
- // proxy password unencrypted to maintain compatibility with Putty
- SET_SESSION_PROPERTY(ProxyPassword);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetProxyPassword()
- {
- return FProxyPassword;
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyTelnetCommand(AnsiString value)
- {
- SET_SESSION_PROPERTY(ProxyTelnetCommand);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyDNS(TAutoSwitch value)
- {
- SET_SESSION_PROPERTY(ProxyDNS);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetProxyLocalhost(bool value)
- {
- SET_SESSION_PROPERTY(ProxyLocalhost);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetBug(TSshBug Bug, TAutoSwitch value)
- {
- assert(Bug >= 0 && Bug < LENOF(FBugs));
- SET_SESSION_PROPERTY(Bugs[Bug]);
- }
- //---------------------------------------------------------------------
- TAutoSwitch __fastcall TSessionData::GetBug(TSshBug Bug)
- {
- assert(Bug >= 0 && Bug < LENOF(FBugs));
- return FBugs[Bug];
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCustomParam1(AnsiString value)
- {
- SET_SESSION_PROPERTY(CustomParam1);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetCustomParam2(AnsiString value)
- {
- SET_SESSION_PROPERTY(CustomParam2);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSFTPDownloadQueue(int value)
- {
- SET_SESSION_PROPERTY(SFTPDownloadQueue);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSFTPUploadQueue(int value)
- {
- SET_SESSION_PROPERTY(SFTPUploadQueue);
- }
- //---------------------------------------------------------------------
- void __fastcall TSessionData::SetSFTPListingQueue(int value)
- {
- SET_SESSION_PROPERTY(SFTPListingQueue);
- }
- //---------------------------------------------------------------------
- AnsiString __fastcall TSessionData::GetInfoTip()
- {
- return FmtLoadStr(SESSION_INFO_TIP,
- ARRAYOFCONST((
- (HostName.IsEmpty() ? AnsiString() : HostName),
- (UserName.IsEmpty() ? AnsiString() : UserName),
- (PublicKeyFile.IsEmpty() ? LoadStr(NO_STR) : LoadStr(YES_STR)),
- SshProtStr,
- FSProtocolStr)));
- }
- //=== TStoredSessionList ----------------------------------------------
- __fastcall TStoredSessionList::TStoredSessionList(bool aReadOnly):
- TNamedObjectList(), FReadOnly(aReadOnly)
- {
- assert(Configuration);
- LastStorage = Configuration->Storage;
- FDefaultSettings = new TSessionData(DefaultSessionName);
- }
- //---------------------------------------------------------------------
- __fastcall TStoredSessionList::~TStoredSessionList()
- {
- assert(Configuration);
- if (!FReadOnly && (Configuration->Storage != LastStorage)) Save();
- delete FDefaultSettings;
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Load(THierarchicalStorage * Storage, bool AsModified)
- {
- TStringList *SubKeys = new TStringList();
- try {
- Storage->GetSubKeyNames(SubKeys);
- for (int Index = 0; Index < SubKeys->Count; Index++)
- {
- TSessionData *SessionData;
- AnsiString SessionName = UnMungeStr(SubKeys->Strings[Index]);
- if (SessionName == FDefaultSettings->Name) SessionData = FDefaultSettings;
- else SessionData = (TSessionData*)FindByName(SessionName);
- if (!SessionData)
- {
- SessionData = new TSessionData(SessionName);
- Add(SessionData);
- }
- SessionData->Load(Storage);
- if (AsModified)
- {
- SessionData->Modified = true;
- }
- }
- } __finally {
- delete SubKeys;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Load(AnsiString aKey)
- {
- TRegistryStorage * Storage = new TRegistryStorage(aKey);
- try {
- LastStorage = stRegistry;
- if (Storage->OpenRootKey(False)) Load(Storage);
- } __finally {
- delete Storage;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Load()
- {
- THierarchicalStorage * Storage = Configuration->CreateScpStorage(true);
- try {
- LastStorage = Configuration->Storage;
- if (Storage->OpenSubKey(Configuration->StoredSessionsSubKey, False))
- Load(Storage);
- } __finally {
- delete Storage;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Save(THierarchicalStorage * Storage)
- {
- for (int Index = 0; Index < Count+HiddenCount; Index++)
- {
- TSessionData *SessionData = (TSessionData *)Items[Index];
- if (SessionData->Modified)
- SessionData->Save(Storage);
- }
- if (FDefaultSettings->Modified)
- FDefaultSettings->Save(Storage);
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Save(AnsiString aKey)
- {
- TRegistryStorage * Storage = new TRegistryStorage(aKey);
- try
- {
- LastStorage = stRegistry;
- Storage->AccessMode = smReadWrite;
- if (Storage->OpenRootKey(True)) Save(Storage);
- }
- __finally
- {
- delete Storage;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Save()
- {
- if (LastStorage != Configuration->Storage)
- {
- // make sure, that all data will be stored, when saving to new storage
- for (int Index = 0; Index < Count+HiddenCount; Index++)
- ((TSessionData*)Items[Index])->Modified = true;
- FDefaultSettings->Modified = true;
- LastStorage = Configuration->Storage;
- }
- THierarchicalStorage * Storage = Configuration->CreateScpStorage(true);
- try {
- Storage->AccessMode = smReadWrite;
- if (Storage->OpenSubKey(Configuration->StoredSessionsSubKey, True))
- Save(Storage);
- } __finally {
- delete Storage;
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::SelectAll(bool Select)
- {
- for (int Index = 0; Index < Count; Index++)
- Sessions[Index]->Selected = Select;
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Import(TStoredSessionList * From,
- bool OnlySelected)
- {
- for (int Index = 0; Index < From->Count; Index++)
- {
- if (!OnlySelected || From->Sessions[Index]->Selected)
- {
- TSessionData *Session = new TSessionData("");
- Session->Assign(From->Sessions[Index]);
- Session->Modified = true;
- Session->MakeUniqueIn(this);
- Add(Session);
- }
- }
- Save();
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::SelectSessionsToImport
- (TStoredSessionList * Dest, bool SSHOnly)
- {
- for (int Index = 0; Index < Count; Index++)
- {
- Sessions[Index]->Selected =
- (!SSHOnly || (Sessions[Index]->Protocol == ptSSH)) &&
- !Dest->FindByName(Sessions[Index]->Name);
- }
- }
- //---------------------------------------------------------------------
- void __fastcall TStoredSessionList::Cleanup()
- {
- try {
- if (Configuration->Storage == stRegistry) Clear();
- TRegistryStorage * Storage = new TRegistryStorage(Configuration->RegistryStorageKey);
- try {
- Storage->AccessMode = smReadWrite;
- if (Storage->OpenRootKey(False))
- Storage->RecursiveDeleteSubKey(Configuration->StoredSessionsSubKey);
- } __finally {
- delete Storage;
- }
- } catch (Exception &E) {
- throw ExtException(&E, CLEANUP_SESSIONS_ERROR);
- }
- }
- //---------------------------------------------------------------------------
- int __fastcall TStoredSessionList::IndexOf(TSessionData * Data)
- {
- for (int Index = 0; Index < Count; Index++)
- if (Data == Sessions[Index]) return Index;
- return -1;
- }
- //---------------------------------------------------------------------------
- TSessionData * __fastcall TStoredSessionList::NewSession(
- AnsiString SessionName, TSessionData * Session)
- {
- TSessionData * DuplicateSession = (TSessionData*)FindByName(SessionName);
- if (!DuplicateSession)
- {
- DuplicateSession = new TSessionData("");
- DuplicateSession->Assign(Session);
- DuplicateSession->Name = SessionName;
- // make sure, that new stored session is saved to registry
- DuplicateSession->Modified = true;
- Add(DuplicateSession);
- }
- else
- {
- DuplicateSession->Assign(Session);
- DuplicateSession->Name = SessionName;
- DuplicateSession->Modified = true;
- }
- // list was saved here before to default storage, but it would not allow
- // to work with special lists (export/import) not using default storage
- return DuplicateSession;
- }
- //---------------------------------------------------------------------------
- void __fastcall TStoredSessionList::SetDefaultSettings(TSessionData * value)
- {
- assert(FDefaultSettings);
- if (FDefaultSettings != value)
- {
- FDefaultSettings->Assign(value);
- FDefaultSettings->Name = DefaultSessionName;
- Save();
- }
- }
|