OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "remoting/host/verify_config_window_win.h" |
| 6 |
| 7 #include <atlbase.h> |
| 8 #include <windows.h> |
| 9 |
| 10 #include "base/base64.h" |
| 11 #include "base/compiler_specific.h" |
| 12 #include "base/logging.h" |
| 13 #include "base/utf_string_conversions.h" |
| 14 #include "remoting/host/elevated_controller_resource.h" |
| 15 #include "remoting/protocol/authentication_method.h" |
| 16 |
| 17 namespace remoting { |
| 18 |
| 19 VerifyConfigWindowWin::VerifyConfigWindowWin(const std::string& email, |
| 20 const std::string& host_id, const std::string& host_secret_hash) |
| 21 : hwnd_(NULL), |
| 22 email_(email), |
| 23 host_id_(host_id), |
| 24 host_secret_hash_(host_secret_hash) { |
| 25 } |
| 26 |
| 27 VerifyConfigWindowWin::~VerifyConfigWindowWin() { |
| 28 EndDialog(); |
| 29 } |
| 30 |
| 31 bool VerifyConfigWindowWin::Run() { |
| 32 // TODO(simonmorris): Provide a handle of a parent window for this dialog. |
| 33 return (DialogBoxParam(ATL::_AtlBaseModule.GetModuleInstance(), |
| 34 MAKEINTRESOURCE(IDD_VERIFY_CONFIG_DIALOG), |
| 35 NULL, |
| 36 (DLGPROC)DialogProc, |
| 37 (LPARAM)this) != 0); |
| 38 } |
| 39 |
| 40 BOOL CALLBACK VerifyConfigWindowWin::DialogProc(HWND hwnd, UINT msg, |
| 41 WPARAM wParam, LPARAM lParam) { |
| 42 VerifyConfigWindowWin* win = NULL; |
| 43 if (msg == WM_INITDIALOG) { |
| 44 win = reinterpret_cast<VerifyConfigWindowWin*>(lParam); |
| 45 CHECK(win); |
| 46 SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)win); |
| 47 } else { |
| 48 LONG_PTR lp = GetWindowLongPtr(hwnd, DWLP_USER); |
| 49 win = reinterpret_cast<VerifyConfigWindowWin*>(lp); |
| 50 } |
| 51 if (win == NULL) |
| 52 return FALSE; |
| 53 return win->OnDialogMessage(hwnd, msg, wParam, lParam); |
| 54 } |
| 55 |
| 56 BOOL VerifyConfigWindowWin::OnDialogMessage(HWND hwnd, UINT msg, |
| 57 WPARAM wParam, LPARAM lParam) { |
| 58 switch (msg) { |
| 59 case WM_INITDIALOG: |
| 60 hwnd_ = hwnd; |
| 61 InitDialog(); |
| 62 return TRUE; |
| 63 case WM_DESTROY: |
| 64 ::EndDialog(hwnd, 0); |
| 65 case WM_COMMAND: |
| 66 switch (LOWORD(wParam)) { |
| 67 case IDOK: |
| 68 ::EndDialog(hwnd, VerifyHostSecretHash()); |
| 69 hwnd_ = NULL; |
| 70 return TRUE; |
| 71 case IDCANCEL: |
| 72 ::EndDialog(hwnd, 0); |
| 73 hwnd_ = NULL; |
| 74 return TRUE; |
| 75 } |
| 76 } |
| 77 return FALSE; |
| 78 } |
| 79 |
| 80 void VerifyConfigWindowWin::InitDialog() { |
| 81 // TODO(simonmorris): l10n. |
| 82 SetWindowText(hwnd_, L"Chrome Remote Desktop"); |
| 83 |
| 84 HWND hwndOk = GetDlgItem(hwnd_, IDOK); |
| 85 CHECK(hwndOk); |
| 86 SetWindowText(hwndOk, L"OK"); |
| 87 |
| 88 HWND hwndCancel = GetDlgItem(hwnd_, IDCANCEL); |
| 89 CHECK(hwndCancel); |
| 90 SetWindowText(hwndCancel, L"Cancel"); |
| 91 |
| 92 HWND hwndMessage = GetDlgItem(hwnd_, IDC_MESSAGE); |
| 93 CHECK(hwndMessage); |
| 94 SetWindowText(hwndMessage, L"To confirm that your Chrome Remote Desktop " |
| 95 L"should be accessible by this account, please enter your PIN below."); |
| 96 |
| 97 HWND hwndEmail = GetDlgItem(hwnd_, IDC_EMAIL); |
| 98 CHECK(hwndEmail); |
| 99 SetWindowText(hwndEmail, UTF8ToUTF16(email_).c_str()); |
| 100 |
| 101 HWND hwndPin = GetDlgItem(hwnd_, IDC_PIN); |
| 102 CHECK(hwndPin); |
| 103 SetFocus(hwndPin); |
| 104 } |
| 105 |
| 106 void VerifyConfigWindowWin::EndDialog() { |
| 107 if (hwnd_) { |
| 108 ::EndDialog(hwnd_, 0); |
| 109 hwnd_ = NULL; |
| 110 } |
| 111 } |
| 112 |
| 113 bool VerifyConfigWindowWin::VerifyHostSecretHash() { |
| 114 const int kMaxPinLength = 256; |
| 115 // TODO(simonmorris): Use ATL's string class, if it's more convenient. |
| 116 scoped_array<WCHAR> pinWSTR(new WCHAR[kMaxPinLength]); |
| 117 HWND hwndPin = GetDlgItem(hwnd_, IDC_PIN); |
| 118 CHECK(hwndPin); |
| 119 GetWindowText(hwndPin, pinWSTR.get(), kMaxPinLength); |
| 120 |
| 121 // TODO(simonmorris): This code was copied from host_script_object.cc. |
| 122 // Refactor to use PinIsValid(), from CL 10008092. |
| 123 std::string pin(UTF16ToUTF8(pinWSTR.get())); |
| 124 std::string hash = protocol::AuthenticationMethod::ApplyHashFunction( |
| 125 protocol::AuthenticationMethod::HMAC_SHA256, host_id_, pin); |
| 126 std::string hash_base64; |
| 127 bool base64_result = base::Base64Encode(hash, &hash_base64); |
| 128 if (!base64_result) { |
| 129 LOG(FATAL) << "Base64Encode failed"; |
| 130 return false; |
| 131 } |
| 132 hash_base64 = "hmac:" + hash_base64; |
| 133 |
| 134 return (hash_base64 == host_secret_hash_); |
| 135 } |
| 136 |
| 137 } // namespace remoting |
OLD | NEW |