Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4106 by yutakapon, Mon Sep 27 10:26:38 2010 UTC revision 4152 by yutakapon, Wed Nov 10 16:15:13 2010 UTC
# Line 1671  static void init_protocol(PTInstVar pvar Line 1671  static void init_protocol(PTInstVar pvar
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    
# Line 6922  static BOOL handle_SSH2_service_accept(P Line 6923  static BOOL handle_SSH2_service_accept(P
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    
# Line 7472  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7481  BOOL handle_SSH2_userauth_inforeq(PTInst
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    
# Line 7484  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7495  BOOL handle_SSH2_userauth_inforeq(PTInst
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);
# Line 7514  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7524  BOOL handle_SSH2_userauth_inforeq(PTInst
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
# Line 7540  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7556  BOOL handle_SSH2_userauth_inforeq(PTInst
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);
# Line 7655  BOOL handle_SSH2_userauth_inforeq(PTInst Line 7674  BOOL handle_SSH2_userauth_inforeq(PTInst
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  {  {

Legend:
Removed from v.4106  
changed lines
  Added in v.4152

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26