int auth_kbdint(SSH_SESSION *session){ int err=ssh_userauth_kbdint(session,NULL,NULL); char *name,*instruction,*prompt,*ptr; char buffer[128]; int i,n; char echo; while (err==SSH_AUTH_INFO){ name=ssh_userauth_kbdint_getname(session); instruction=ssh_userauth_kbdint_getinstruction(session); n=ssh_userauth_kbdint_getnprompts(session); if(strlen(name)>0) printf("%s\n",name); if(strlen(instruction)>0) printf("%s\n",instruction); for(i=0;i<n;++i){ prompt=ssh_userauth_kbdint_getprompt(session,i,&echo); if(echo){ printf("%s",prompt); fgets(buffer,sizeof(buffer),stdin); buffer[sizeof(buffer)-1]=0; if((ptr=strchr(buffer,'\n'))) *ptr=0; ssh_userauth_kbdint_setanswer(session,i,buffer); memset(buffer,0,strlen(buffer)); } else { ptr=getpass(prompt); ssh_userauth_kbdint_setanswer(session,i,ptr); } } err=ssh_userauth_kbdint(session,NULL,NULL); } return err; }
int authenticate_kbdint(ssh_session session, const char *password) { int err; err = ssh_userauth_kbdint(session, NULL, NULL); while (err == SSH_AUTH_INFO) { const char *instruction; const char *name; char buffer[128]; int i, n; name = ssh_userauth_kbdint_getname(session); instruction = ssh_userauth_kbdint_getinstruction(session); n = ssh_userauth_kbdint_getnprompts(session); if (name && strlen(name) > 0) { printf("%s\n", name); } if (instruction && strlen(instruction) > 0) { printf("%s\n", instruction); } for (i = 0; i < n; i++) { const char *answer; const char *prompt; char echo; prompt = ssh_userauth_kbdint_getprompt(session, i, &echo); if (prompt == NULL) { break; } if (echo) { char *p; printf("%s", prompt); if (fgets(buffer, sizeof(buffer), stdin) == NULL) { return SSH_AUTH_ERROR; } buffer[sizeof(buffer) - 1] = '\0'; if ((p = strchr(buffer, '\n'))) { *p = '\0'; } if (ssh_userauth_kbdint_setanswer(session, i, buffer) < 0) { return SSH_AUTH_ERROR; } memset(buffer, 0, strlen(buffer)); } else { if (password && strstr(prompt, "Password:")) { answer = password; } else { buffer[0] = '\0'; if (ssh_getpass(prompt, buffer, sizeof(buffer), 0, 0) < 0) { return SSH_AUTH_ERROR; } answer = buffer; } if (ssh_userauth_kbdint_setanswer(session, i, answer) < 0) { return SSH_AUTH_ERROR; } } } err=ssh_userauth_kbdint(session,NULL,NULL); } return err; }
static int auth_kbdint(ssh_session session, const char *user, const char *passwd) { const char *name = NULL; const char *instruction = NULL; const char *prompt = NULL; char buffer[256] = {0}; int err = SSH_AUTH_ERROR; int rc; err = ssh_userauth_kbdint(session, user, NULL); while (err == SSH_AUTH_INFO) { int n = 0; int i = 0; name = ssh_userauth_kbdint_getname(session); instruction = ssh_userauth_kbdint_getinstruction(session); n = ssh_userauth_kbdint_getnprompts(session); if (strlen(name) > 0) { printf("%s\n", name); } if (strlen(instruction) > 0) { printf("%s\n", instruction); } for (i = 0; i < n; ++i) { char echo; prompt = ssh_userauth_kbdint_getprompt(session, i, &echo); if (echo) { (*_authcb) (prompt, buffer, sizeof(buffer), 1, 0, NULL); rc = ssh_userauth_kbdint_setanswer(session, i, buffer); if (rc < 0) { return SSH_AUTH_ERROR; } ZERO_STRUCT(buffer); } else { if (passwd != NULL) { rc = ssh_userauth_kbdint_setanswer(session, i, passwd); if (rc < 0) { return SSH_AUTH_ERROR; } } else { (*_authcb) ("Password:", buffer, sizeof(buffer), 0, 0, NULL); rc = ssh_userauth_kbdint_setanswer(session, i, buffer); if (rc < 0) { return SSH_AUTH_ERROR; } ZERO_STRUCT(buffer); } } } err = ssh_userauth_kbdint(session, user, NULL); } return err; }
static int authenticate_kbdint(ssh_session session) { int rc = ssh_userauth_kbdint(session, NULL, NULL); while (rc == SSH_AUTH_INFO) { const char* name = ssh_userauth_kbdint_getname(session); const char* instruction = ssh_userauth_kbdint_getinstruction(session); int nprompts = ssh_userauth_kbdint_getnprompts(session); if (strlen(name) > 0) printf("%s\n", name); if (strlen(instruction) > 0) printf("%s\n", instruction); for (int iprompt = 0; iprompt < nprompts; iprompt++) { const char* prompt = NULL; char echo; prompt = ssh_userauth_kbdint_getprompt(session, iprompt, &echo); if (echo) { char buffer[128], *ptr; printf("%s", prompt); if (fgets(buffer, sizeof(buffer), stdin) == NULL) return SSH_AUTH_ERROR; buffer[sizeof(buffer) - 1] = '\0'; if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; if (ssh_userauth_kbdint_setanswer(session, iprompt, buffer) < 0) return SSH_AUTH_ERROR; memset(buffer, 0, strlen(buffer)); } else { if (!ftp->getpass_hook) return SSH_AUTH_ERROR; char* pw = ftp->getpass_hook(prompt); if (!pw) return SSH_AUTH_ERROR; rc = ssh_userauth_kbdint_setanswer(session, iprompt, pw); memset(pw, 0, strlen(pw)); free(pw); if (rc < 0) return SSH_AUTH_ERROR; } } rc = ssh_userauth_kbdint(session, NULL, NULL); } return rc; }
bool clSSH::LoginInteractiveKBD(bool throwExc) throw(clException) { if(!m_session) { THROW_OR_FALSE("NULL SSH session"); } int rc; rc = ssh_userauth_kbdint(m_session, NULL, NULL); if(rc == SSH_AUTH_INFO) { while(rc == SSH_AUTH_INFO) { const char* name, *instruction; int nprompts, iprompt; name = ssh_userauth_kbdint_getname(m_session); instruction = ssh_userauth_kbdint_getinstruction(m_session); nprompts = ssh_userauth_kbdint_getnprompts(m_session); wxUnusedVar(name); wxUnusedVar(instruction); for(iprompt = 0; iprompt < nprompts; iprompt++) { const char* prompt; char echo; prompt = ssh_userauth_kbdint_getprompt(m_session, iprompt, &echo); if(echo) { wxString answer = ::wxGetTextFromUser(prompt, "SSH"); if(answer.IsEmpty()) { THROW_OR_FALSE(wxString() << "Login error: " << ssh_get_error(m_session)); } if(ssh_userauth_kbdint_setanswer(m_session, iprompt, answer.mb_str(wxConvUTF8).data()) < 0) { THROW_OR_FALSE(wxString() << "Login error: " << ssh_get_error(m_session)); } } else { if(ssh_userauth_kbdint_setanswer(m_session, iprompt, GetPassword().mb_str(wxConvUTF8).data()) < 0) { THROW_OR_FALSE(wxString() << "Login error: " << ssh_get_error(m_session)); } } } rc = ssh_userauth_kbdint(m_session, NULL, NULL); } return true; // success } THROW_OR_FALSE("Interactive Keyboard is not enabled for this server"); return false; }
int SSHClient::authKbdint(ssh_session session) { // GNASH_REPORT_FUNCTION; int err = ssh_userauth_kbdint(session, NULL, NULL); char *name,*instruction,*prompt,*ptr; char buffer[128]; int i,n; char echo; while (err == SSH_AUTH_INFO){ name = const_cast<char *>(ssh_userauth_kbdint_getname(session)); instruction = const_cast<char *>(ssh_userauth_kbdint_getinstruction(session)); n=ssh_userauth_kbdint_getnprompts(session); if(strlen(name)>0) log_debug(name); if(strlen(instruction)>0) log_debug(instruction); for(i=0; i<n; ++i){ prompt = const_cast<char *>(ssh_userauth_kbdint_getprompt(session, i, &echo)); if(echo){ log_debug(prompt); fgets(buffer,sizeof(buffer),stdin); buffer[sizeof(buffer)-1]=0; if((ptr=strchr(buffer,'\n'))) *ptr=0; if (ssh_userauth_kbdint_setanswer(session, i, buffer) < 0) { return SSH_AUTH_ERROR; } memset(buffer,0,strlen(buffer)); } else { ptr=getpass(prompt); if (ssh_userauth_kbdint_setanswer(session, i, ptr) < 0) { return SSH_AUTH_ERROR; } } } err=ssh_userauth_kbdint(session, NULL, NULL); } return err; }
int authenticate_kbdint(ssh_session session, const char *password) { int err; const char *instruction; const char *name; int i, n; const char *answer; const char *prompt; char echo; err = ssh_userauth_kbdint(session, NULL, NULL); while (err == SSH_AUTH_INFO) { name = ssh_userauth_kbdint_getname(session); instruction = ssh_userauth_kbdint_getinstruction(session); n = ssh_userauth_kbdint_getnprompts(session); for (i = 0; i < n; i++) { prompt=ssh_userauth_kbdint_getprompt(session,i,&echo); if(prompt==NULL) break; if (password && strstr(prompt, "Password:")) { answer = password; err = ssh_userauth_kbdint_setanswer(session, i, answer); } if (err < 0) { return SSH_AUTH_ERROR; } } err=ssh_userauth_kbdint(session,NULL,NULL); } return err; }
INT_PTR KBIntDialog::OnInitDialog() { //TODO: fix the tab order const char * name = ssh_userauth_kbdint_getname(m_session); if (!name) name = ""; ::SetDlgItemTextA(m_hwnd, IDC_STATIC_NAMEFIELD, name); if (m_nrPrompt > 1) { //for each prompt, clone prompt and input fields HWND hPrompt1 = ::GetDlgItem(m_hwnd, IDC_EDIT_PROMPT1); HWND hAnswer1 = ::GetDlgItem(m_hwnd, IDC_EDIT_ANSWER1); HWND hMarker = ::GetDlgItem(m_hwnd, IDC_STATIC_MARKER); RECT promptRect; RECT answerRect; RECT markerRect; ::GetWindowRect(hPrompt1, &promptRect); ScreenRectToClient(m_hwnd, &promptRect); ::GetWindowRect(hAnswer1, &answerRect); ScreenRectToClient(m_hwnd, &answerRect); ::GetWindowRect(hMarker, &markerRect); ScreenRectToClient(m_hwnd, &markerRect); int deltaY = markerRect.top - promptRect.top; //int deltaX = 0; //unused int curPromptID = IDC_EDIT_PROMPT1; int curAnswerID = IDC_EDIT_ANSWER1; for(int i = 1; i < m_nrPrompt; i++) { curPromptID = curPromptID+2; curAnswerID = curAnswerID+2; promptRect.top += deltaY; promptRect.bottom += deltaY; answerRect.top += deltaY; answerRect.bottom += deltaY; ::CreateWindowEx(0, WC_EDIT, TEXT(""), WS_CHILD | WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | WS_VISIBLE, promptRect.left, promptRect.top, promptRect.right-promptRect.left, promptRect.bottom-promptRect.top, m_hwnd, (HMENU)curPromptID, m_hInstance, NULL); ::CreateWindowEx(WS_EX_CLIENTEDGE, WC_EDIT, TEXT(""), WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | WS_VISIBLE, answerRect.left, answerRect.top, answerRect.right-answerRect.left, answerRect.bottom-answerRect.top, m_hwnd, (HMENU)curPromptID, m_hInstance, NULL); } int totalDeltaY = deltaY * (m_nrPrompt-1); HWND hBtnOK = ::GetDlgItem(m_hwnd, IDOK); HWND hBtnCancel = ::GetDlgItem(m_hwnd, IDCANCEL); RECT btnRect; ::GetWindowRect(hBtnOK, &btnRect); ScreenRectToClient(m_hwnd, &btnRect); ::MoveWindow(hBtnOK, btnRect.left, btnRect.top+totalDeltaY, btnRect.right-btnRect.left, btnRect.bottom-btnRect.top, TRUE); ::GetWindowRect(hBtnCancel, &btnRect); ScreenRectToClient(m_hwnd, &btnRect); ::MoveWindow(hBtnCancel, btnRect.left, btnRect.top+totalDeltaY, btnRect.right-btnRect.left, btnRect.bottom-btnRect.top, TRUE); RECT winRect; ::GetWindowRect(m_hwnd, &winRect); Resize(winRect.right-winRect.left, winRect.bottom-winRect.top+totalDeltaY); } for(int i = 0; i < m_nrPrompt; i++) { char echo = 0; const char * prompt = ssh_userauth_kbdint_getprompt(m_session, i, &echo); ::SetDlgItemTextA(m_hwnd, IDC_EDIT_PROMPT1+(i*2), prompt); if (!echo) { HWND hCurAnswer = ::GetDlgItem(m_hwnd, IDC_EDIT_ANSWER1+(i*2)); //LONG_PTR style = ::GetWindowLongPtr(hCurAnswer, GWL_STYLE); //::SetWindowLongPtr(hCurAnswer, GWL_STYLE, style|ES_PASSWORD); ::SendMessage(hCurAnswer, EM_SETPASSWORDCHAR, (WPARAM)'*', 0); } } Dialog::OnInitDialog(); ::SetFocus(::GetDlgItem(m_hwnd, IDC_EDIT_ANSWER1)); return FALSE; }