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

Side by Side Diff: chrome/browser/login_prompt.h

Issue 1528012: Notify all active login prompts when one login prompt is submitted. This allo... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 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
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_LOGIN_PROMPT_H_ 5 #ifndef CHROME_BROWSER_LOGIN_PROMPT_H_
6 #define CHROME_BROWSER_LOGIN_PROMPT_H_ 6 #define CHROME_BROWSER_LOGIN_PROMPT_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/lock.h" 11 #include "base/lock.h"
12 #include "base/ref_counted.h"
12 #include "chrome/browser/password_manager/password_manager.h" 13 #include "chrome/browser/password_manager/password_manager.h"
14 #include "chrome/common/notification_observer.h"
15 #include "chrome/common/notification_registrar.h"
13 16
14 namespace net { 17 namespace net {
15 class AuthChallengeInfo; 18 class AuthChallengeInfo;
16 } 19 }
17 20
18 class ConstrainedWindow; 21 class ConstrainedWindow;
19 class GURL; 22 class GURL;
20 class TabContents; 23 class TabContents;
21 class URLRequest; 24 class URLRequest;
22 25
23 // This is the base implementation for the OS-specific classes that route 26 // This is the base implementation for the OS-specific classes that route
24 // authentication info to the URLRequest that needs it. These functions must 27 // authentication info to the URLRequest that needs it. These functions must
25 // be implemented in a thread safe manner. 28 // be implemented in a thread safe manner.
26 class LoginHandler : public base::RefCountedThreadSafe<LoginHandler>, 29 class LoginHandler : public base::RefCountedThreadSafe<LoginHandler>,
27 public LoginModelObserver { 30 public LoginModelObserver,
31 public NotificationObserver {
28 public: 32 public:
29 explicit LoginHandler(URLRequest* request); 33 LoginHandler(net::AuthChallengeInfo* auth_info, URLRequest* request);
30 virtual ~LoginHandler(); 34 virtual ~LoginHandler();
31 35
32 // Builds the platform specific LoginHandler. Used from within 36 // Builds the platform specific LoginHandler. Used from within
33 // CreateLoginPrompt() which creates tasks. 37 // CreateLoginPrompt() which creates tasks.
34 static LoginHandler* Create(URLRequest* request); 38 static LoginHandler* Create(net::AuthChallengeInfo* auth_info,
39 URLRequest* request);
35 40
36 // Initializes the underlying platform specific view. 41 // Initializes the underlying platform specific view.
37 virtual void BuildViewForPasswordManager(PasswordManager* manager, 42 virtual void BuildViewForPasswordManager(PasswordManager* manager,
38 std::wstring explanation) = 0; 43 std::wstring explanation) = 0;
39 44
40 // Sets information about the authentication type (|form|) and the 45 // Sets information about the authentication type (|form|) and the
41 // |password_manager| for this profile. 46 // |password_manager| for this profile.
42 void SetPasswordForm(const webkit_glue::PasswordForm& form); 47 void SetPasswordForm(const webkit_glue::PasswordForm& form);
43 void SetPasswordManager(PasswordManager* password_manager); 48 void SetPasswordManager(PasswordManager* password_manager);
44 49
45 // Returns the TabContents that needs authentication. 50 // Returns the TabContents that needs authentication.
46 TabContents* GetTabContentsForLogin() const; 51 TabContents* GetTabContentsForLogin() const;
47 52
48 // Resend the request with authentication credentials. 53 // Resend the request with authentication credentials.
49 // This function can be called from either thread. 54 // This function can be called from either thread.
50 void SetAuth(const std::wstring& username, const std::wstring& password); 55 void SetAuth(const std::wstring& username, const std::wstring& password);
51 56
52 // Display the error page without asking for credentials again. 57 // Display the error page without asking for credentials again.
53 // This function can be called from either thread. 58 // This function can be called from either thread.
54 void CancelAuth(); 59 void CancelAuth();
55 60
56 // Notify the handler that the request was cancelled. 61 // Notify the handler that the request was cancelled.
57 // This function can only be called from the IO thread. 62 // This function can only be called from the IO thread.
58 void OnRequestCancelled(); 63 void OnRequestCancelled();
59 64
65 // Implements the NotificationObserver interface.
66 // Listens for AUTH_SUPPLIED and AUTH_CANCELLED notifications from other
67 // LoginHandlers so that this LoginHandler has the chance to dismiss itself
68 // if it was waiting for the same authentication.
69 virtual void Observe(NotificationType type,
70 const NotificationSource& source,
71 const NotificationDetails& details);
72
60 protected: 73 protected:
61
62 void SetModel(LoginModel* model); 74 void SetModel(LoginModel* model);
63 75
64 void SetDialog(ConstrainedWindow* dialog); 76 void SetDialog(ConstrainedWindow* dialog);
65 77
66 // Notify observers that authentication is needed or received. The automation 78 // Notify observers that authentication is needed.
67 // proxy uses this for testing. 79 void NotifyAuthNeeded();
68 void SendNotifications();
69 80
81 // Performs necessary cleanup before deletion.
70 void ReleaseSoon(); 82 void ReleaseSoon();
71 83
84 // Who/where/what asked for the authentication.
85 net::AuthChallengeInfo* auth_info() const { return auth_info_.get(); }
86
72 private: 87 private:
88 // Starts observing notifications from other LoginHandlers.
89 void AddObservers();
90
91 // Stops observing notifications from other LoginHandlers.
92 void RemoveObservers();
93
94 // Notify observers that authentication is supplied.
95 void NotifyAuthSupplied(const std::wstring& username,
96 const std::wstring& password);
97
98 // Notify observers that authentication is cancelled.
99 void NotifyAuthCancelled();
73 100
74 // Returns whether authentication had been handled (SetAuth or CancelAuth). 101 // Returns whether authentication had been handled (SetAuth or CancelAuth).
75 // If |set_handled| is true, it will mark authentication as handled. 102 // If |set_handled| is true, it will mark authentication as handled.
76 bool WasAuthHandled(bool set_handled); 103 bool WasAuthHandled(bool set_handled);
77 104
78 // Calls SetAuth from the IO loop. 105 // Calls SetAuth from the IO loop.
79 void SetAuthDeferred(const std::wstring& username, 106 void SetAuthDeferred(const std::wstring& username,
80 const std::wstring& password); 107 const std::wstring& password);
81 108
82 // Calls CancelAuth from the IO loop. 109 // Calls CancelAuth from the IO loop.
83 void CancelAuthDeferred(); 110 void CancelAuthDeferred();
84 111
85 // Closes the view_contents from the UI loop. 112 // Closes the view_contents from the UI loop.
86 void CloseContentsDeferred(); 113 void CloseContentsDeferred();
87 114
88 // True if we've handled auth (SetAuth or CancelAuth has been called). 115 // True if we've handled auth (SetAuth or CancelAuth has been called).
89 bool handled_auth_; 116 bool handled_auth_;
90 Lock handled_auth_lock_; 117 Lock handled_auth_lock_;
91 118
92 // The ConstrainedWindow that is hosting our LoginView. 119 // The ConstrainedWindow that is hosting our LoginView.
93 // This should only be accessed on the UI loop. 120 // This should only be accessed on the UI loop.
94 ConstrainedWindow* dialog_; 121 ConstrainedWindow* dialog_;
95 122
123 // Who/where/what asked for the authentication.
124 scoped_refptr<net::AuthChallengeInfo> auth_info_;
125
96 // The request that wants login data. 126 // The request that wants login data.
97 // This should only be accessed on the IO loop. 127 // This should only be accessed on the IO loop.
98 URLRequest* request_; 128 URLRequest* request_;
99 129
100 // The PasswordForm sent to the PasswordManager. This is so we can refer to it 130 // The PasswordForm sent to the PasswordManager. This is so we can refer to it
101 // when later notifying the password manager if the credentials were accepted 131 // when later notifying the password manager if the credentials were accepted
102 // or rejected. 132 // or rejected.
103 // This should only be accessed on the UI loop. 133 // This should only be accessed on the UI loop.
104 webkit_glue::PasswordForm password_form_; 134 webkit_glue::PasswordForm password_form_;
105 135
106 // Points to the password manager owned by the TabContents requesting auth. 136 // Points to the password manager owned by the TabContents requesting auth.
107 // Can be null if the TabContents is not a TabContents. 137 // Can be null if the TabContents is not a TabContents.
108 // This should only be accessed on the UI loop. 138 // This should only be accessed on the UI loop.
109 PasswordManager* password_manager_; 139 PasswordManager* password_manager_;
110 140
111 // Cached from the URLRequest, in case it goes NULL on us. 141 // Cached from the URLRequest, in case it goes NULL on us.
112 int render_process_host_id_; 142 int render_process_host_id_;
113 int tab_contents_id_; 143 int tab_contents_id_;
114 144
115 // If not null, points to a model we need to notify of our own destruction 145 // If not null, points to a model we need to notify of our own destruction
116 // so it doesn't try and access this when its too late. 146 // so it doesn't try and access this when its too late.
117 LoginModel* login_model_; 147 LoginModel* login_model_;
148
149 // Observes other login handlers so this login handler can respond.
150 NotificationRegistrar registrar_;
118 }; 151 };
119 152
120 // Details to provide the NotificationObserver. Used by the automation proxy 153 // Details to provide the NotificationObserver. Used by the automation proxy
121 // for testing. 154 // for testing.
122 class LoginNotificationDetails { 155 class LoginNotificationDetails {
123 public: 156 public:
124 explicit LoginNotificationDetails(LoginHandler* handler) 157 explicit LoginNotificationDetails(LoginHandler* handler)
125 : handler_(handler) {} 158 : handler_(handler) {}
126 LoginHandler* handler() const { return handler_; } 159 LoginHandler* handler() const { return handler_; }
127 160
128 private: 161 private:
129 LoginNotificationDetails() {} 162 LoginNotificationDetails() {}
130 163
131 LoginHandler* handler_; // Where to send the response. 164 LoginHandler* handler_; // Where to send the response.
132 165
133 DISALLOW_COPY_AND_ASSIGN(LoginNotificationDetails); 166 DISALLOW_COPY_AND_ASSIGN(LoginNotificationDetails);
134 }; 167 };
135 168
169 // Details to provide the NotificationObserver. Used by the automation proxy
170 // for testing and by other LoginHandlers to dismiss themselves when an
171 // identical auth is supplied.
172 class AuthSuppliedLoginNotificationDetails : public LoginNotificationDetails {
173 public:
174 AuthSuppliedLoginNotificationDetails(LoginHandler* handler,
175 const std::wstring& username,
176 const std::wstring& password)
177 : LoginNotificationDetails(handler),
178 username_(username),
179 password_(password) {}
180 const std::wstring& username() const { return username_; }
181 const std::wstring& password() const { return password_; }
182
183 private:
184 // The username that was used for the authentication.
185 const std::wstring username_;
186
187 // The password that was used for the authentication.
188 const std::wstring password_;
189
190 DISALLOW_COPY_AND_ASSIGN(AuthSuppliedLoginNotificationDetails);
191 };
192
136 // Prompts the user for their username and password. This is designed to 193 // Prompts the user for their username and password. This is designed to
137 // be called on the background (I/O) thread, in response to 194 // be called on the background (I/O) thread, in response to
138 // URLRequest::Delegate::OnAuthRequired. The prompt will be created 195 // URLRequest::Delegate::OnAuthRequired. The prompt will be created
139 // on the main UI thread via a call to UI loop's InvokeLater, and will send the 196 // on the main UI thread via a call to UI loop's InvokeLater, and will send the
140 // credentials back to the URLRequest on the calling thread. 197 // credentials back to the URLRequest on the calling thread.
141 // A LoginHandler object (which lives on the calling thread) is returned, 198 // A LoginHandler object (which lives on the calling thread) is returned,
142 // which can be used to set or cancel authentication programmatically. The 199 // which can be used to set or cancel authentication programmatically. The
143 // caller must invoke OnRequestCancelled() on this LoginHandler before 200 // caller must invoke OnRequestCancelled() on this LoginHandler before
144 // destroying the URLRequest. 201 // destroying the URLRequest.
145 LoginHandler* CreateLoginPrompt(net::AuthChallengeInfo* auth_info, 202 LoginHandler* CreateLoginPrompt(net::AuthChallengeInfo* auth_info,
146 URLRequest* request); 203 URLRequest* request);
147 204
148 // Helper to remove the ref from an URLRequest to the LoginHandler. 205 // Helper to remove the ref from an URLRequest to the LoginHandler.
149 // Should only be called from the IO thread, since it accesses an URLRequest. 206 // Should only be called from the IO thread, since it accesses an URLRequest.
150 void ResetLoginHandlerForRequest(URLRequest* request); 207 void ResetLoginHandlerForRequest(URLRequest* request);
151 208
152 // Get the signon_realm under which the identity should be saved. 209 // Get the signon_realm under which the identity should be saved.
153 std::string GetSignonRealm(const GURL& url, 210 std::string GetSignonRealm(const GURL& url,
154 const net::AuthChallengeInfo& auth_info); 211 const net::AuthChallengeInfo& auth_info);
155 212
156 #endif // CHROME_BROWSER_LOGIN_PROMPT_H_ 213 #endif // CHROME_BROWSER_LOGIN_PROMPT_H_
OLDNEW
« no previous file with comments | « chrome/browser/automation/automation_provider_observers.cc ('k') | chrome/browser/login_prompt.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698