//--------------------------------------------------------------------------- void TConfiguration::SetStorage(TStorage Value) { if (FStorage != Value) { TStorage StorageBak = FStorage; try { std::unique_ptr<THierarchicalStorage> SourceStorage(CreateStorage(false)); std::unique_ptr<THierarchicalStorage> TargetStorage(CreateStorage(false)); SourceStorage->SetAccessMode(smRead); FStorage = Value; TargetStorage->SetAccessMode(smReadWrite); TargetStorage->SetExplicit(true); // copy before save as it removes the ini file, // when switching from ini to registry CopyData(SourceStorage.get(), TargetStorage.get()); // save all and explicit DoSave(true, true); } catch (...) { // If this fails, do not pretend that storage was switched. // For instance: // - When writing to an IFI file fails (unlikely, as we fallback to user profile) // - When removing INI file fails, when switching to registry // (possible, when the INI file is in Program files folder) FStorage = StorageBak; throw; } } }
void OpenSessionInPutty(const UnicodeString & PuttyPath, TSessionData * SessionData) { UnicodeString Program, Params, Dir; SplitCommand(PuttyPath, Program, Params, Dir); Program = ExpandEnvironmentVariables(Program); if (FindFile(Program)) { Params = ExpandEnvironmentVariables(Params); UnicodeString Password = GetGUIConfiguration()->GetPuttyPassword() ? SessionData->GetPassword() : UnicodeString(); UnicodeString Psw = Password; UnicodeString SessionName; std::unique_ptr<TRegistryStorage> Storage(new TRegistryStorage(GetConfiguration()->GetPuttySessionsKey())); Storage->SetAccessMode(smReadWrite); // make it compatible with putty Storage->SetMungeStringValues(false); Storage->SetForceAnsi(true); if (Storage->OpenRootKey(true)) { if (Storage->KeyExists(SessionData->GetStorageKey())) { SessionName = SessionData->GetSessionName(); } else { std::unique_ptr<TRegistryStorage> SourceStorage(new TRegistryStorage(GetConfiguration()->GetPuttySessionsKey())); SourceStorage->SetMungeStringValues(false); SourceStorage->SetForceAnsi(true); if (SourceStorage->OpenSubKey(StoredSessions->GetDefaultSettings()->GetName(), false) && Storage->OpenSubKey(GetGUIConfiguration()->GetPuttySession(), true)) { Storage->Copy(SourceStorage.get()); Storage->CloseSubKey(); } std::unique_ptr<TSessionData> ExportData(new TSessionData(L"")); ExportData->Assign(SessionData); ExportData->SetModified(true); ExportData->SetName(GetGUIConfiguration()->GetPuttySession()); ExportData->SetPassword(L""); if (SessionData->GetFSProtocol() == fsFTP) { if (GetGUIConfiguration()->GetTelnetForFtpInPutty()) { ExportData->SetPuttyProtocol(PuttyTelnetProtocol); ExportData->SetPortNumber(TelnetPortNumber); // PuTTY does not allow -pw for telnet Psw.Clear(); } else { ExportData->SetPuttyProtocol(PuttySshProtocol); ExportData->SetPortNumber(SshPortNumber); } } ExportData->Save(Storage.get(), true); SessionName = GetGUIConfiguration()->GetPuttySession(); } } if (!Params.IsEmpty()) { Params += L" "; } if (!Psw.IsEmpty()) { Params += FORMAT(L"-pw %s ", EscapePuttyCommandParam(Psw).c_str()); } //Params += FORMAT(L"-load %s", EscapePuttyCommandParam(SessionName).c_str()); Params += FORMAT(L"-l %s ", EscapePuttyCommandParam(SessionData->GetUserNameExpanded()).c_str()); Params += FORMAT(L"-P %d ", SessionData->GetPortNumber()); Params += FORMAT(L"%s ", EscapePuttyCommandParam(SessionData->GetHostNameExpanded()).c_str()); if (!ExecuteShell(Program, Params)) { throw Exception(FMTLOAD(EXECUTE_APP_ERROR, Program.c_str())); } } else { throw Exception(FMTLOAD(FILE_NOT_FOUND, Program.c_str())); } }