예제 #1
0
/* Callback function to launch context help. */
static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo)
{
    char *context = NULL;
#define CHECK_CTX(name) \
    do { \
	if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \
	    context = WINHELP_CTX_ ## name; \
    } while (0)
    CHECK_CTX(errors_hostkey_absent);
    CHECK_CTX(errors_hostkey_changed);
    CHECK_CTX(errors_cantloadkey);
    CHECK_CTX(option_cleanup);
    CHECK_CTX(pgp_fingerprints);
#undef CHECK_CTX
    if (context)
	launch_help(hwnd, context);
}
예제 #2
0
/*
 * Dialog-box function for the key list box.
 */
static INT_PTR CALLBACK KeyListProc(HWND hwnd,
                                    UINT msg,
                                    WPARAM wParam,
                                    LPARAM lParam)
{
  struct RSAKey *rkey;
  struct ssh2_userkey *skey;

  switch (msg) {
  case WM_INITDIALOG:
    /*
     * Centre the window.
     */
    { /* centre the window */
      RECT rs, rd;
      HWND hw;

      hw = GetDesktopWindow();
      if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd))
        MoveWindow(hwnd,
                   (rs.right + rs.left + rd.left - rd.right) / 2,
                   (rs.bottom + rs.top + rd.top - rd.bottom) / 2,
                   rd.right - rd.left,
                   rd.bottom - rd.top,
                   TRUE);
    }

    if (has_help())
      SetWindowLongPtr(hwnd,
                       GWL_EXSTYLE,
                       GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
    else {
      HWND item = GetDlgItem(hwnd, 103); /* the Help button */
      if (item)
        DestroyWindow(item);
    }

    keylist = hwnd;
    {
      static int tabs[] = {35, 75, 250};
      SendDlgItemMessage(hwnd,
                         100,
                         LB_SETTABSTOPS,
                         sizeof(tabs) / sizeof(*tabs),
                         (LPARAM)tabs);
    }
    keylist_update();
    return 0;
  case WM_COMMAND:
    switch (LOWORD(wParam)) {
    case IDOK:
    case IDCANCEL:
      keylist = NULL;
      DestroyWindow(hwnd);
      return 0;
    case 101: /* add key */
      if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) {
        if (passphrase_box) {
          MessageBeep(MB_ICONERROR);
          SetForegroundWindow(passphrase_box);
          break;
        }
        prompt_add_keyfile();
      }
      return 0;
    case 102: /* remove key */
      if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) {
        int i;
        int rCount, sCount;
        int *selectedArray;

        /* our counter within the array of selected items */
        int itemNum;

        /* get the number of items selected in the list */
        int numSelected = SendDlgItemMessage(hwnd, 100, LB_GETSELCOUNT, 0, 0);

        /* none selected? that was silly */
        if (numSelected == 0) {
          MessageBeep(0);
          break;
        }

        /* get item indices in an array */
        selectedArray = snewn(numSelected, int);
        SendDlgItemMessage(
            hwnd, 100, LB_GETSELITEMS, numSelected, (WPARAM)selectedArray);

        itemNum = numSelected - 1;
        rCount = pageant_count_ssh1_keys();
        sCount = pageant_count_ssh2_keys();

        /* go through the non-rsakeys until we've covered them all,
         * and/or we're out of selected items to check. note that
         * we go *backwards*, to avoid complications from deleting
         * things hence altering the offset of subsequent items
         */
        for (i = sCount - 1; (itemNum >= 0) && (i >= 0); i--) {
          skey = pageant_nth_ssh2_key(i);

          if (selectedArray[itemNum] == rCount + i) {
            pageant_delete_ssh2_key(skey);
            skey->alg->freekey(skey->data);
            sfree(skey);
            itemNum--;
          }
        }

        /* do the same for the rsa keys */
        for (i = rCount - 1; (itemNum >= 0) && (i >= 0); i--) {
          rkey = pageant_nth_ssh1_key(i);

          if (selectedArray[itemNum] == i) {
            pageant_delete_ssh1_key(rkey);
            freersakey(rkey);
            sfree(rkey);
            itemNum--;
          }
        }

        sfree(selectedArray);
        keylist_update();
      }
      return 0;
    case 103: /* help */
      if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) {
        launch_help(hwnd, WINHELP_CTX_pageant_general);
      }
      return 0;
    }
    return 0;
  case WM_HELP: {
    int id = ((LPHELPINFO)lParam)->iCtrlId;
    const char *topic = NULL;
    switch (id) {
    case 100:
      topic = WINHELP_CTX_pageant_keylist;
      break;
    case 101:
      topic = WINHELP_CTX_pageant_addkey;
      break;
    case 102:
      topic = WINHELP_CTX_pageant_remkey;
      break;
    }
    if (topic) {
      launch_help(hwnd, topic);
    } else {
      MessageBeep(0);
    }
  } break;
  case WM_CLOSE:
    keylist = NULL;
    DestroyWindow(hwnd);
    return 0;
  }