| 1671 |
enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure); |
enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure); |
| 1672 |
enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner); |
enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner); |
| 1673 |
enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq); |
enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq); |
| 1674 |
|
enque_handler(pvar, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, handle_SSH2_userauth_passwd_changereq); |
| 1675 |
|
|
| 1676 |
enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented); |
enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented); |
| 1677 |
|
|
| 6923 |
SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_BANNER); |
SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_BANNER); |
| 6924 |
SSH2_dispatch_add_message(SSH2_MSG_DEBUG); // support for authorized_keys command (2006.2.23 yutaka) |
SSH2_dispatch_add_message(SSH2_MSG_DEBUG); // support for authorized_keys command (2006.2.23 yutaka) |
| 6925 |
|
|
| 6926 |
|
// XXX: パスワード変更対応。 |
| 6927 |
|
// ただし、OpenSSHやOpenSolaris(SSH-2.0-Sun_SSH_1.3)では、このメッセージを送ってこないため、 |
| 6928 |
|
// 未評価。ゆえに、実装はしたが、開放はしない。 |
| 6929 |
|
// (2010.11.11 yutaka) |
| 6930 |
|
#if 0 |
| 6931 |
|
SSH2_dispatch_add_message(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ); |
| 6932 |
|
#endif |
| 6933 |
|
|
| 6934 |
return do_SSH2_authrequest(pvar); |
return do_SSH2_authrequest(pvar); |
| 6935 |
} |
} |
| 6936 |
|
|
| 7481 |
buffer_t *msg; |
buffer_t *msg; |
| 7482 |
unsigned char *outmsg; |
unsigned char *outmsg; |
| 7483 |
int i; |
int i; |
| 7484 |
|
char *name, *inst, *lang; |
| 7485 |
|
char lprompt[512]; |
| 7486 |
|
|
| 7487 |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE); |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE); |
| 7488 |
|
|
| 7495 |
|
|
| 7496 |
///////// step1 |
///////// step1 |
| 7497 |
// get string |
// get string |
| 7498 |
slen = get_uint32_MSBfirst(data); |
name = buffer_get_string(&data, NULL); |
| 7499 |
data += 4; |
inst = buffer_get_string(&data, NULL); |
| 7500 |
s = data; // name |
lang = buffer_get_string(&data, NULL); |
| 7501 |
data += slen; |
lprompt[0] = 0; |
| 7502 |
|
if (strlen(inst) > 0) { |
| 7503 |
// get string |
strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE); |
| 7504 |
slen = get_uint32_MSBfirst(data); |
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
| 7505 |
data += 4; |
} |
| 7506 |
s = data; // instruction |
if (strlen(lang) > 0) { |
| 7507 |
data += slen; |
strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE); |
| 7508 |
|
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
| 7509 |
// get string |
} |
| 7510 |
slen = get_uint32_MSBfirst(data); |
free(name); |
| 7511 |
data += 4; |
free(inst); |
| 7512 |
s = data; // language tag |
free(lang); |
|
data += slen; |
|
| 7513 |
|
|
| 7514 |
// num-prompts |
// num-prompts |
| 7515 |
num = get_uint32_MSBfirst(data); |
num = get_uint32_MSBfirst(data); |
| 7524 |
} |
} |
| 7525 |
buffer_put_int(msg, num); |
buffer_put_int(msg, num); |
| 7526 |
|
|
| 7527 |
|
// パスワード変更の場合、メッセージがあれば、表示する。(2010.11.11 yutaka) |
| 7528 |
|
if (num == 0) { |
| 7529 |
|
if (strlen(lprompt) > 0) |
| 7530 |
|
MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION); |
| 7531 |
|
} |
| 7532 |
|
|
| 7533 |
// プロンプトの数だけ prompt & echo が繰り返される。 |
// プロンプトの数だけ prompt & echo が繰り返される。 |
| 7534 |
for (i = 0 ; i < num ; i++) { |
for (i = 0 ; i < num ; i++) { |
| 7535 |
// get string |
// get string |
| 7556 |
// TODO: ここでプロンプトを表示してユーザから入力させるのが正解。 |
// TODO: ここでプロンプトを表示してユーザから入力させるのが正解。 |
| 7557 |
s = pvar->auth_state.cur_cred.password; |
s = pvar->auth_state.cur_cred.password; |
| 7558 |
buffer_put_string(msg, s, strlen(s)); |
buffer_put_string(msg, s, strlen(s)); |
| 7559 |
|
|
| 7560 |
|
// リトライに対応できるよう、フラグをクリアする。(2010.11.11 yutaka) |
| 7561 |
|
pvar->keyboard_interactive_password_input = 0; |
| 7562 |
} |
} |
| 7563 |
|
|
| 7564 |
len = buffer_len(msg); |
len = buffer_len(msg); |
| 7674 |
|
|
| 7675 |
return TRUE; |
return TRUE; |
| 7676 |
} |
} |
| 7677 |
|
|
| 7678 |
|
#define PASSWD_MAXLEN 150 |
| 7679 |
|
|
| 7680 |
|
struct change_password { |
| 7681 |
|
char passwd[PASSWD_MAXLEN]; |
| 7682 |
|
char new_passwd[PASSWD_MAXLEN]; |
| 7683 |
|
}; |
| 7684 |
|
|
| 7685 |
|
static BOOL CALLBACK passwd_change_dialog(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) |
| 7686 |
|
{ |
| 7687 |
|
char retype_passwd[PASSWD_MAXLEN]; |
| 7688 |
|
struct change_password *cp = (struct change_password *)lParam; |
| 7689 |
|
|
| 7690 |
|
switch (msg) { |
| 7691 |
|
case WM_INITDIALOG: |
| 7692 |
|
return TRUE; |
| 7693 |
|
|
| 7694 |
|
case WM_COMMAND: |
| 7695 |
|
switch (LOWORD(wParam)) { |
| 7696 |
|
case IDOK: |
| 7697 |
|
SendMessage(GetDlgItem(dlg, IDC_PASSWD), WM_GETTEXT , sizeof(cp->passwd), (LPARAM)cp->passwd); |
| 7698 |
|
SendMessage(GetDlgItem(dlg, IDC_NEW_PASSWD), WM_GETTEXT , sizeof(cp->new_passwd), (LPARAM)cp->new_passwd); |
| 7699 |
|
SendMessage(GetDlgItem(dlg, IDC_CONFIRM_PASSWD), WM_GETTEXT , sizeof(retype_passwd), (LPARAM)retype_passwd); |
| 7700 |
|
|
| 7701 |
|
if (strcmp(cp->new_passwd, retype_passwd) == 0) { |
| 7702 |
|
EndDialog(dlg, 1); // dialog close |
| 7703 |
|
return TRUE; |
| 7704 |
|
} |
| 7705 |
|
MessageBox(NULL, "Mismatch; try again.", "ERROR", MB_OK | MB_ICONEXCLAMATION); |
| 7706 |
|
return FALSE; |
| 7707 |
|
|
| 7708 |
|
case IDCANCEL: |
| 7709 |
|
EndDialog(dlg, 0); // dialog close |
| 7710 |
|
return TRUE; |
| 7711 |
|
} |
| 7712 |
|
} |
| 7713 |
|
|
| 7714 |
|
return FALSE; |
| 7715 |
|
} |
| 7716 |
|
|
| 7717 |
|
BOOL handle_SSH2_userauth_passwd_changereq(PTInstVar pvar) |
| 7718 |
|
{ |
| 7719 |
|
int len; |
| 7720 |
|
char *data; |
| 7721 |
|
buffer_t *msg = NULL; |
| 7722 |
|
char *s, *username; |
| 7723 |
|
unsigned char *outmsg; |
| 7724 |
|
char *connect_id = "ssh-connection"; |
| 7725 |
|
char *info, *lang; |
| 7726 |
|
char buf[128]; |
| 7727 |
|
struct change_password cp; |
| 7728 |
|
|
| 7729 |
|
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ was received.", LOG_LEVEL_VERBOSE); |
| 7730 |
|
|
| 7731 |
|
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHPASSWD_INPUT), pvar->cv->HWin, passwd_change_dialog, (LPARAM)&cp); |
| 7732 |
|
|
| 7733 |
|
// 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード |
| 7734 |
|
data = pvar->ssh_state.payload; |
| 7735 |
|
// パケットサイズ - (パディングサイズ+1);真のパケットサイズ |
| 7736 |
|
len = pvar->ssh_state.payloadlen; |
| 7737 |
|
|
| 7738 |
|
info = buffer_get_string(&data, NULL); |
| 7739 |
|
lang = buffer_get_string(&data, NULL); |
| 7740 |
|
_snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s: info %s lang %s\n", __FUNCTION__, info, lang); |
| 7741 |
|
notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE); |
| 7742 |
|
free(info); |
| 7743 |
|
free(lang); |
| 7744 |
|
|
| 7745 |
|
msg = buffer_init(); |
| 7746 |
|
if (msg == NULL) { |
| 7747 |
|
// TODO: error check |
| 7748 |
|
return FALSE; |
| 7749 |
|
} |
| 7750 |
|
|
| 7751 |
|
// ペイロードの構築 |
| 7752 |
|
username = pvar->auth_state.user; // ユーザ名 |
| 7753 |
|
buffer_put_string(msg, username, strlen(username)); |
| 7754 |
|
|
| 7755 |
|
// password authentication method |
| 7756 |
|
s = connect_id; |
| 7757 |
|
buffer_put_string(msg, s, strlen(s)); |
| 7758 |
|
s = "password"; |
| 7759 |
|
buffer_put_string(msg, s, strlen(s)); |
| 7760 |
|
|
| 7761 |
|
buffer_put_char(msg, 1); // additional info |
| 7762 |
|
|
| 7763 |
|
s = cp.passwd; |
| 7764 |
|
buffer_put_string(msg, s, strlen(s)); |
| 7765 |
|
|
| 7766 |
|
s = cp.new_passwd; |
| 7767 |
|
buffer_put_string(msg, s, strlen(s)); |
| 7768 |
|
|
| 7769 |
|
// パケット送信 |
| 7770 |
|
len = buffer_len(msg); |
| 7771 |
|
outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_REQUEST, len); |
| 7772 |
|
memcpy(outmsg, buffer_ptr(msg), len); |
| 7773 |
|
finish_send_packet(pvar); |
| 7774 |
|
buffer_free(msg); |
| 7775 |
|
|
| 7776 |
|
return TRUE; |
| 7777 |
|
} |
| 7778 |
|
|
| 7779 |
BOOL send_pty_request(PTInstVar pvar, Channel_t *c) |
BOOL send_pty_request(PTInstVar pvar, Channel_t *c) |
| 7780 |
{ |
{ |