15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/dns_blackhole_checker.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default prefix added to the base talkgadget URL.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDefaultHostTalkGadgetPrefix[] = "chromoting-host";
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base talkgadget URL.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTalkGadgetUrl[] = ".talkgadget.google.com/talkgadget/"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              "oauth/chrome-remote-desktop-host";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DnsBlackholeChecker::DnsBlackholeChecker(
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string talkgadget_prefix)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : url_request_context_getter_(url_request_context_getter),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      talkgadget_prefix_(talkgadget_prefix) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DnsBlackholeChecker::~DnsBlackholeChecker() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is called in response to the TalkGadget http request initiated from
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CheckStatus().
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DnsBlackholeChecker::OnURLFetchComplete(const net::URLFetcher* source) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int response = source->GetResponseCode();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow = false;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (source->GetResponseCode() == 200) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Successfully connected to host talkgadget.";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allow = true;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Unable to connect to host talkgadget (" << response << ")";
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_fetcher_.reset(NULL);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_.Run(allow);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_.Reset();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DnsBlackholeChecker::CheckForDnsBlackhole(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Callback<void(bool)>& callback) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we're not currently in the middle of a connection check.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url_fetcher_.get()) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(callback_.is_null());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback_ = callback;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string talkgadget_url("https://");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (talkgadget_prefix_.empty()) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      talkgadget_url += kDefaultHostTalkGadgetPrefix;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      talkgadget_url += talkgadget_prefix_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    talkgadget_url += kTalkGadgetUrl;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Verifying connection to " << talkgadget_url;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_fetcher_.reset(net::URLFetcher::Create(GURL(talkgadget_url),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               net::URLFetcher::GET, this));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_fetcher_->SetRequestContext(url_request_context_getter_.get());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_fetcher_->Start();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(INFO) << "Pending connection check";
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
70