extern "C" char * do_select(Plug plug, SOCKET skt, int startup) { void * frontend = nullptr; if (!is_ssh(plug) && !is_pfwd(plug)) { // If it is not SSH/PFwd plug, then it must be Proxy plug. // Get SSH/PFwd plug which it wraps. Proxy_Socket ProxySocket = (reinterpret_cast<Proxy_Plug>(plug))->proxy_socket; plug = ProxySocket->plug; } bool pfwd = is_pfwd(plug) != 0; if (pfwd) { plug = static_cast<Plug>(get_pfwd_backend(plug)); } frontend = get_ssh_frontend(plug); DebugAssert(frontend); TSecureShell * SecureShell = NB_STATIC_DOWNCAST(TSecureShell, frontend); if (!pfwd) { SecureShell->UpdateSocket(skt, startup != 0); } else { SecureShell->UpdatePortFwdSocket(skt, startup != 0); } return nullptr; }
//--------------------------------------------------------------------------- extern "C" char * do_select(Plug plug, SOCKET skt, int startup) { void * frontend; if (!is_ssh(plug) && !is_pfwd(plug)) { // If it is not SSH/PFwd plug, then it must be Proxy plug. // Get SSH/PFwd plug which it wraps. Proxy_Socket ProxySocket = ((Proxy_Plug)plug)->proxy_socket; plug = ProxySocket->plug; } bool pfwd = is_pfwd(plug); if (pfwd) { plug = (Plug)get_pfwd_backend(plug); } frontend = get_ssh_frontend(plug); assert(frontend); TSecureShell * SecureShell = reinterpret_cast<TSecureShell*>(frontend); if (!pfwd) { SecureShell->UpdateSocket(skt, startup); } else { SecureShell->UpdatePortFwdSocket(skt, startup); } return NULL; }
//--------------------------------------------------------------------------- int get_userpass_input(prompts_t * p, unsigned char * /*in*/, int /*inlen*/) { assert(p != NULL); TSecureShell * SecureShell = reinterpret_cast<TSecureShell *>(p->frontend); assert(SecureShell != NULL); int Result; TStrings * Prompts = new TStringList(); TStrings * Results = new TStringList(); try { for (int Index = 0; Index < int(p->n_prompts); Index++) { prompt_t * Prompt = p->prompts[Index]; Prompts->AddObject(Prompt->prompt, (TObject *)(FLAGMASK(Prompt->echo, pupEcho))); // this fails, when new passwords do not match on change password prompt, // and putty retries the prompt assert(Prompt->resultsize == 0); Results->Add(L""); } if (SecureShell->PromptUser(p->to_server, p->name, p->name_reqd, p->instruction, p->instr_reqd, Prompts, Results)) { for (int Index = 0; Index < int(p->n_prompts); Index++) { prompt_t * Prompt = p->prompts[Index]; prompt_set_result(Prompt, AnsiString(Results->Strings[Index]).c_str()); } Result = 1; } else { Result = 0; } } __finally { delete Prompts; delete Results; } return Result; }
int GetUserpassInput(prompts_t * p, const uint8_t * /*in*/, int /*inlen*/) { assert(p != nullptr); TSecureShell * SecureShell = NB_STATIC_DOWNCAST(TSecureShell, p->frontend); assert(SecureShell != nullptr); int Result; std::unique_ptr<TStrings> Prompts(new TStringList()); std::unique_ptr<TStrings> Results(new TStringList()); { for (size_t Index = 0; Index < p->n_prompts; ++Index) { prompt_t * Prompt = p->prompts[Index]; Prompts->AddObject(Prompt->prompt, reinterpret_cast<TObject *>(static_cast<size_t>(FLAGMASK(Prompt->echo, pupEcho)))); // this fails, when new passwords do not match on change password prompt, // and putty retries the prompt assert(Prompt->resultsize == 0); Results->Add(L""); } if (SecureShell->PromptUser(p->to_server != 0, p->name, p->name_reqd != 0, UnicodeString(p->instruction), p->instr_reqd != 0, Prompts.get(), Results.get())) { for (size_t Index = 0; Index < p->n_prompts; ++Index) { prompt_t * Prompt = p->prompts[Index]; prompt_set_result(Prompt, AnsiString(Results->GetString(Index).c_str()).c_str()); } Result = 1; } else { Result = 0; } } return Result; }
int GetUserpassInput(prompts_t * p, const uint8_t * /*in*/, int /*inlen*/) { DebugAssert(p != nullptr); TSecureShell * SecureShell = NB_STATIC_DOWNCAST(TSecureShell, p->frontend); DebugAssert(SecureShell != nullptr); int Result; std::unique_ptr<TStrings> Prompts(new TStringList()); std::unique_ptr<TStrings> Results(new TStringList()); { UnicodeString Name = UTF8ToString(p->name); UnicodeString AName = Name; TPromptKind PromptKind = SecureShell->IdentifyPromptKind(AName); bool UTF8Prompt = (PromptKind != pkPassphrase); for (size_t Index = 0; Index < p->n_prompts; ++Index) { prompt_t * Prompt = p->prompts[Index]; UnicodeString S; if (UTF8Prompt) { S = UTF8ToString(Prompt->prompt); } else { S = UnicodeString(AnsiString(Prompt->prompt)); } Prompts->AddObject(S, reinterpret_cast<TObject *>(static_cast<size_t>(FLAGMASK(Prompt->echo, pupEcho)))); // this fails, when new passwords do not match on change password prompt, // and putty retries the prompt DebugAssert(Prompt->resultsize == 0); Results->Add(L""); } UnicodeString Instructions = UTF8ToString(p->instruction); if (SecureShell->PromptUser(p->to_server != 0, Name, p->name_reqd != 0, Instructions, p->instr_reqd != 0, Prompts.get(), Results.get())) { for (size_t Index = 0; Index < p->n_prompts; ++Index) { prompt_t * Prompt = p->prompts[Index]; RawByteString S; if (UTF8Prompt) { S = RawByteString(UTF8String(Results->GetString(Index))); } else { S = RawByteString(AnsiString(Results->GetString(Index))); } prompt_set_result(Prompt, S.c_str()); } Result = 1; } else { Result = 0; } } __finally { // delete Prompts; // delete Results; }; return Result; }