Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: remoting/host/verify_config_window_win.cc

Issue 10071025: [Chromoting] Make the Windows host controller ask the user to confirm host registration. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove global variable. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 // TODO(garykac): Lots of duplicated code in this file and
17 // disconnect_window_win.cc. These global floating windows are temporary so
18 // they should be deleted soon. If we need to expand this then we should
19 // create a class with the shared code.
Jamie 2012/04/13 16:40:03 Is this comment still true?
simonmorris 2012/04/13 16:48:03 No: the aim is now to use ATL instead. Done.
20
21 namespace remoting {
22
23 VerifyConfigWindowWin::VerifyConfigWindowWin(const std::string& email,
24 const std::string& host_id, const std::string& host_secret_hash)
25 : hwnd_(NULL),
26 email_(email),
27 host_id_(host_id),
28 host_secret_hash_(host_secret_hash) {
29 }
30
31 VerifyConfigWindowWin::~VerifyConfigWindowWin() {
32 EndDialog();
33 }
34
35 int VerifyConfigWindowWin::Run() {
36 // TODO(simonmorris): Provide a handle of a parent window for this dialog.
37 return DialogBoxParam(ATL::_AtlBaseModule.GetModuleInstance(),
38 MAKEINTRESOURCE(IDD_VERIFY_CONFIG_DIALOG),
39 NULL,
40 (DLGPROC)DialogProc,
41 (LPARAM)this);
42 }
43
44 BOOL CALLBACK VerifyConfigWindowWin::DialogProc(HWND hwnd, UINT msg,
45 WPARAM wParam, LPARAM lParam) {
46 VerifyConfigWindowWin* win = NULL;
47 if (msg == WM_INITDIALOG) {
48 win = reinterpret_cast<VerifyConfigWindowWin*>(lParam);
49 CHECK(win);
50 SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR)win);
51 } else {
52 LONG_PTR lp = GetWindowLongPtr(hwnd, DWLP_USER);
53 win = reinterpret_cast<VerifyConfigWindowWin*>(lp);
54 }
55 if (win == NULL)
56 return FALSE;
57 return win->OnDialogMessage(hwnd, msg, wParam, lParam);
58 }
59
60 BOOL VerifyConfigWindowWin::OnDialogMessage(HWND hwnd, UINT msg,
61 WPARAM wParam, LPARAM lParam) {
62 switch (msg) {
63 case WM_INITDIALOG:
64 hwnd_ = hwnd;
65 InitDialog();
66 return TRUE;
67 case WM_DESTROY:
68 ::EndDialog(hwnd, 0);
69 case WM_COMMAND:
70 switch (LOWORD(wParam)) {
71 case IDOK:
72 ::EndDialog(hwnd, VerifyHostSecretHash());
73 hwnd_ = NULL;
74 return TRUE;
75 case IDCANCEL:
76 ::EndDialog(hwnd, 0);
77 hwnd_ = NULL;
78 return TRUE;
79 }
80 }
81 return FALSE;
82 }
83
84 void VerifyConfigWindowWin::InitDialog() {
85 // TODO(simonmorris): Get these strings from the host, for l10n.
Jamie 2012/04/13 16:40:03 We'll need to do something for l10n, but getting t
simonmorris 2012/04/13 16:48:03 Done.
86 SetWindowText(hwnd_, L"Chrome Remote Desktop");
87
88 HWND hwndOk = GetDlgItem(hwnd_, IDOK);
89 CHECK(hwndOk);
90 SetWindowText(hwndOk, L"OK");
91
92 HWND hwndCancel = GetDlgItem(hwnd_, IDCANCEL);
93 CHECK(hwndCancel);
94 SetWindowText(hwndCancel, L"Cancel");
95
96 HWND hwndMessage = GetDlgItem(hwnd_, IDC_MESSAGE);
97 CHECK(hwndMessage);
98 SetWindowText(hwndMessage, L"To confirm that your Chrome Remote Desktop "
99 L"should be accessible by this account, please enter your PIN below.");
100
101 HWND hwndEmail = GetDlgItem(hwnd_, IDC_EMAIL);
102 CHECK(hwndEmail);
103 SetWindowText(hwndEmail, UTF8ToUTF16(email_).c_str());
104
105 HWND hwndPin = GetDlgItem(hwnd_, IDC_PIN);
106 CHECK(hwndPin);
107 SetFocus(hwndPin);
108 }
109
110 void VerifyConfigWindowWin::EndDialog() {
111 if (hwnd_) {
112 ::EndDialog(hwnd_, 0);
113 hwnd_ = NULL;
114 }
115 }
116
117 bool VerifyConfigWindowWin::VerifyHostSecretHash() {
118 const int kMaxPinLength = 256;
119 // TODO(simonmorris): Use ATL's string class, if it's more convenient.
120 scoped_array<WCHAR> pinWSTR(new WCHAR[kMaxPinLength]);
121 HWND hwndPin = GetDlgItem(hwnd_, IDC_PIN);
122 CHECK(hwndPin);
123 GetWindowText(hwndPin, pinWSTR.get(), kMaxPinLength);
124
125 // TODO(simonmorris): This code was copied from host_script_object.cc.
126 // Refactor to use PinIsValid(), from CL 10008092.
127 std::string pin(UTF16ToUTF8(pinWSTR.get()));
128 std::string hash = protocol::AuthenticationMethod::ApplyHashFunction(
129 protocol::AuthenticationMethod::HMAC_SHA256, host_id_, pin);
130 std::string hash_base64;
131 bool base64_result = base::Base64Encode(hash, &hash_base64);
132 if (!base64_result) {
133 LOG(FATAL) << "Base64Encode failed";
Jamie 2012/04/13 16:40:03 I think a "return false" here would help readabili
simonmorris 2012/04/13 16:48:03 Done.
134 }
135 hash_base64 = "hmac:" + hash_base64;
136
137 return (hash_base64 == host_secret_hash_);
138 }
139
140 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698