Home | History | Annotate | Download | only in shell
      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 "content/shell/shell_login_dialog.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/logging.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "content/public/browser/browser_thread.h"
     11 #include "content/public/browser/resource_dispatcher_host.h"
     12 #include "net/base/auth.h"
     13 #include "net/url_request/url_request.h"
     14 #include "ui/base/text/text_elider.h"
     15 
     16 namespace content {
     17 
     18 ShellLoginDialog::ShellLoginDialog(
     19     net::AuthChallengeInfo* auth_info,
     20     net::URLRequest* request) : auth_info_(auth_info),
     21                                 request_(request) {
     22   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
     23   BrowserThread::PostTask(
     24       BrowserThread::UI, FROM_HERE,
     25       base::Bind(&ShellLoginDialog::PrepDialog, this,
     26                  ASCIIToUTF16(auth_info->challenger.ToString()),
     27                  UTF8ToUTF16(auth_info->realm)));
     28 }
     29 
     30 void ShellLoginDialog::OnRequestCancelled() {
     31   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
     32   BrowserThread::PostTask(
     33       BrowserThread::UI, FROM_HERE,
     34       base::Bind(&ShellLoginDialog::PlatformRequestCancelled, this));
     35 }
     36 
     37 void ShellLoginDialog::UserAcceptedAuth(const string16& username,
     38                                         const string16& password) {
     39   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     40   BrowserThread::PostTask(
     41       BrowserThread::IO, FROM_HERE,
     42       base::Bind(&ShellLoginDialog::SendAuthToRequester, this,
     43                  true, username, password));
     44 }
     45 
     46 void ShellLoginDialog::UserCancelledAuth() {
     47   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     48   BrowserThread::PostTask(
     49       BrowserThread::IO, FROM_HERE,
     50       base::Bind(&ShellLoginDialog::SendAuthToRequester, this,
     51                  false, string16(), string16()));
     52   BrowserThread::PostTask(
     53       BrowserThread::UI, FROM_HERE,
     54       base::Bind(&ShellLoginDialog::PlatformCleanUp, this));
     55 }
     56 
     57 ShellLoginDialog::~ShellLoginDialog() {
     58   // Cannot post any tasks here; this object is going away and cannot be
     59   // referenced/dereferenced.
     60 }
     61 
     62 #if !defined(OS_MACOSX) && !defined(TOOLKIT_GTK)
     63 // Bogus implementations for linking. They are never called because
     64 // ResourceDispatcherHostDelegate::CreateLoginDelegate returns NULL.
     65 // TODO: implement ShellLoginDialog for other platforms, drop this #if
     66 void ShellLoginDialog::PlatformCreateDialog(const string16& message) {}
     67 void ShellLoginDialog::PlatformCleanUp() {}
     68 void ShellLoginDialog::PlatformRequestCancelled() {}
     69 #endif
     70 
     71 void ShellLoginDialog::PrepDialog(const string16& host,
     72                                   const string16& realm) {
     73   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     74   // The realm is controlled by the remote server, so there is no reason to
     75   // believe it is of a reasonable length.
     76   string16 elided_realm;
     77   ui::ElideString(realm, 120, &elided_realm);
     78 
     79   string16 explanation =
     80       ASCIIToUTF16("The server ") + host +
     81       ASCIIToUTF16(" requires a username and password.");
     82 
     83   if (!elided_realm.empty()) {
     84     explanation += ASCIIToUTF16(" The server says: ");
     85     explanation += elided_realm;
     86     explanation += ASCIIToUTF16(".");
     87   }
     88 
     89   PlatformCreateDialog(explanation);
     90 }
     91 
     92 void ShellLoginDialog::SendAuthToRequester(bool success,
     93                                            const string16& username,
     94                                            const string16& password) {
     95   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
     96   if (success)
     97     request_->SetAuth(net::AuthCredentials(username, password));
     98   else
     99     request_->CancelAuth();
    100   ResourceDispatcherHost::Get()->ClearLoginDelegateForRequest(request_);
    101 
    102   BrowserThread::PostTask(
    103       BrowserThread::UI, FROM_HERE,
    104       base::Bind(&ShellLoginDialog::PlatformCleanUp, this));
    105 }
    106 
    107 }  // namespace content
    108