| Index: net/base/cert_verifier.cc
|
| ===================================================================
|
| --- net/base/cert_verifier.cc (revision 7188)
|
| +++ net/base/cert_verifier.cc (working copy)
|
| @@ -1,95 +1,46 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2008 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "net/base/host_resolver.h"
|
| +#include "net/base/cert_verifier.h"
|
|
|
| -#if defined(OS_WIN)
|
| -#include <ws2tcpip.h>
|
| -#include <wspiapi.h> // Needed for Win2k compat.
|
| -#elif defined(OS_POSIX)
|
| -#include <netdb.h>
|
| -#include <sys/socket.h>
|
| -#endif
|
| -
|
| #include "base/message_loop.h"
|
| -#include "base/string_util.h"
|
| #include "base/worker_pool.h"
|
| -#include "net/base/address_list.h"
|
| #include "net/base/net_errors.h"
|
| +#include "net/base/x509_certificate.h"
|
|
|
| -#if defined(OS_WIN)
|
| -#include "net/base/winsock_init.h"
|
| -#endif
|
| -
|
| namespace net {
|
|
|
| -//-----------------------------------------------------------------------------
|
| -
|
| -static HostMapper* host_mapper;
|
| -
|
| -HostMapper* SetHostMapper(HostMapper* value) {
|
| - std::swap(host_mapper, value);
|
| - return value;
|
| -}
|
| -
|
| -static int HostResolverProc(
|
| - const std::string& host, const std::string& port, struct addrinfo** out) {
|
| - struct addrinfo hints = {0};
|
| - hints.ai_family = PF_UNSPEC;
|
| - hints.ai_flags = AI_ADDRCONFIG;
|
| -
|
| - // Restrict result set to only this socket type to avoid duplicates.
|
| - hints.ai_socktype = SOCK_STREAM;
|
| -
|
| - int err = getaddrinfo(host.c_str(), port.c_str(), &hints, out);
|
| - return err ? ERR_NAME_NOT_RESOLVED : OK;
|
| -}
|
| -
|
| -static int ResolveAddrInfo(
|
| - const std::string& host, const std::string& port, struct addrinfo** out) {
|
| - int rv;
|
| - if (host_mapper) {
|
| - rv = HostResolverProc(host_mapper->Map(host), port, out);
|
| - } else {
|
| - rv = HostResolverProc(host, port, out);
|
| - }
|
| - return rv;
|
| -}
|
| -
|
| -//-----------------------------------------------------------------------------
|
| -
|
| -class HostResolver::Request :
|
| - public base::RefCountedThreadSafe<HostResolver::Request> {
|
| +class CertVerifier::Request :
|
| + public base::RefCountedThreadSafe<CertVerifier::Request> {
|
| public:
|
| - Request(HostResolver* resolver,
|
| - const std::string& host,
|
| - const std::string& port,
|
| - AddressList* addresses,
|
| + Request(CertVerifier* verifier,
|
| + X509Certificate* cert,
|
| + const std::string& hostname,
|
| + bool rev_checking_enabled,
|
| + int* cert_status,
|
| CompletionCallback* callback)
|
| - : host_(host),
|
| - port_(port),
|
| - resolver_(resolver),
|
| - addresses_(addresses),
|
| + : cert_(cert),
|
| + hostname_(hostname),
|
| + rev_checking_enabled_(rev_checking_enabled),
|
| + verifier_(verifier),
|
| + cert_status_(cert_status),
|
| callback_(callback),
|
| origin_loop_(MessageLoop::current()),
|
| error_(OK),
|
| - results_(NULL) {
|
| + result_(0) {
|
| }
|
| -
|
| - ~Request() {
|
| - if (results_)
|
| - freeaddrinfo(results_);
|
| - }
|
|
|
| - void DoLookup() {
|
| + ~Request() {}
|
| +
|
| + void DoVerify() {
|
| // Running on the worker thread
|
| - error_ = ResolveAddrInfo(host_, port_, &results_);
|
| + error_ = cert_->Verify(hostname_, rev_checking_enabled_, &result_);
|
|
|
| Task* reply = NewRunnableMethod(this, &Request::DoCallback);
|
|
|
| // The origin loop could go away while we are trying to post to it, so we
|
| - // need to call its PostTask method inside a lock. See ~HostResolver.
|
| + // need to call its PostTask method inside a lock. See ~CertVerifier.
|
| {
|
| AutoLock locked(origin_loop_lock_);
|
| if (origin_loop_) {
|
| @@ -97,47 +48,45 @@
|
| reply = NULL;
|
| }
|
| }
|
| -
|
| +
|
| // Does nothing if it got posted.
|
| delete reply;
|
| }
|
|
|
| void DoCallback() {
|
| // Running on the origin thread.
|
| - DCHECK(error_ || results_);
|
| + DCHECK(error_ || result_);
|
|
|
| // We may have been cancelled!
|
| - if (!resolver_)
|
| + if (!verifier_)
|
| return;
|
|
|
| - if (!error_) {
|
| - addresses_->Adopt(results_);
|
| - results_ = NULL;
|
| - }
|
| + *cert_status_ = result_;
|
|
|
| - // Drop the resolver's reference to us. Do this before running the
|
| - // callback since the callback might result in the resolver being
|
| + // Drop the verifier's reference to us. Do this before running the
|
| + // callback since the callback might result in the verifier being
|
| // destroyed.
|
| - resolver_->request_ = NULL;
|
| + verifier_->request_ = NULL;
|
|
|
| callback_->Run(error_);
|
| }
|
|
|
| void Cancel() {
|
| - resolver_ = NULL;
|
| + verifier_ = NULL;
|
|
|
| AutoLock locked(origin_loop_lock_);
|
| origin_loop_ = NULL;
|
| }
|
| -
|
| +
|
| private:
|
| // Set on the origin thread, read on the worker thread.
|
| - std::string host_;
|
| - std::string port_;
|
| + scoped_refptr<X509Certificate> cert_;
|
| + std::string hostname_;
|
| + bool rev_checking_enabled_;
|
|
|
| - // Only used on the origin thread (where Resolve was called).
|
| - HostResolver* resolver_;
|
| - AddressList* addresses_;
|
| + // Only used on the origin thread (where Verify was called).
|
| + CertVerifier* verifier_;
|
| + int* cert_status_;
|
| CompletionCallback* callback_;
|
|
|
| // Used to post ourselves onto the origin thread.
|
| @@ -146,43 +95,40 @@
|
|
|
| // Assigned on the worker thread, read on the origin thread.
|
| int error_;
|
| - struct addrinfo* results_;
|
| + int result_;
|
| };
|
|
|
| //-----------------------------------------------------------------------------
|
|
|
| -HostResolver::HostResolver() {
|
| -#if defined(OS_WIN)
|
| - EnsureWinsockInit();
|
| -#endif
|
| +CertVerifier::CertVerifier() {
|
| }
|
|
|
| -HostResolver::~HostResolver() {
|
| +CertVerifier::~CertVerifier() {
|
| if (request_)
|
| request_->Cancel();
|
| }
|
|
|
| -int HostResolver::Resolve(const std::string& hostname, int port,
|
| - AddressList* addresses,
|
| - CompletionCallback* callback) {
|
| - DCHECK(!request_) << "resolver already in use";
|
| +int CertVerifier::Verify(X509Certificate* cert,
|
| + const std::string& hostname,
|
| + bool rev_checking_enabled,
|
| + int* cert_status,
|
| + CompletionCallback* callback) {
|
| + DCHECK(!request_) << "verifier already in use";
|
|
|
| - const std::string& port_str = IntToString(port);
|
| -
|
| - // Do a synchronous resolution.
|
| + // Do a synchronous verification.
|
| if (!callback) {
|
| - struct addrinfo* results;
|
| - int rv = ResolveAddrInfo(hostname, port_str, &results);
|
| - if (rv == OK)
|
| - addresses->Adopt(results);
|
| + int result;
|
| + int rv = cert->Verify(hostname, rev_checking_enabled, &result);
|
| + *cert_status = result;
|
| return rv;
|
| }
|
|
|
| - request_ = new Request(this, hostname, port_str, addresses, callback);
|
| + request_ = new Request(this, cert, hostname, rev_checking_enabled,
|
| + cert_status, callback);
|
|
|
| // Dispatch to worker thread...
|
| if (!WorkerPool::PostTask(FROM_HERE,
|
| - NewRunnableMethod(request_.get(), &Request::DoLookup), true)) {
|
| + NewRunnableMethod(request_.get(), &Request::DoVerify), true)) {
|
| NOTREACHED();
|
| request_ = NULL;
|
| return ERR_FAILED;
|
|
|
| Property changes on: net\base\cert_verifier.cc
|
| ___________________________________________________________________
|
| Added: svn:mergeinfo
|
| Merged /branches/chrome_webkit_merge_branch/net/base/host_resolver.cc:r69-2775
|
|
|
|
|