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

Unified Diff: net/base/cert_database_mac.cc

Issue 13006020: net: extract net/cert out of net/base (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/cert_database_ios.cc ('k') | net/base/cert_database_nss.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/cert_database_mac.cc
diff --git a/net/base/cert_database_mac.cc b/net/base/cert_database_mac.cc
deleted file mode 100644
index 2d3ef14616efafd12a85d492dbf727fb52ae2171..0000000000000000000000000000000000000000
--- a/net/base/cert_database_mac.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (c) 2012 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/cert_database.h"
-
-#include <Security/Security.h>
-
-#include "base/logging.h"
-#include "base/mac/mac_logging.h"
-#include "base/message_loop.h"
-#include "base/observer_list_threadsafe.h"
-#include "base/process_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "crypto/mac_security_services_lock.h"
-#include "net/base/net_errors.h"
-#include "net/base/x509_certificate.h"
-
-namespace net {
-
-// Helper that observes events from the Keychain and forwards them to the
-// given CertDatabase.
-class CertDatabase::Notifier {
- public:
- // Creates a new Notifier that will forward Keychain events to |cert_db|.
- // |message_loop| must refer to a thread with an associated CFRunLoop - a
- // TYPE_UI thread. Events will be dispatched from this message loop.
- Notifier(CertDatabase* cert_db, MessageLoop* message_loop)
- : cert_db_(cert_db),
- registered_(false),
- called_shutdown_(false) {
- // Ensure an associated CFRunLoop.
- DCHECK(message_loop->IsType(MessageLoop::TYPE_UI));
- task_runner_ = message_loop->message_loop_proxy();
- task_runner_->PostTask(FROM_HERE,
- base::Bind(&Notifier::Init,
- base::Unretained(this)));
- }
-
- // Should be called from the |task_runner_|'s thread. Use Shutdown()
- // to shutdown on arbitrary threads.
- ~Notifier() {
- DCHECK(called_shutdown_);
- // Only unregister from the same thread where registration was performed.
- if (registered_ && task_runner_->RunsTasksOnCurrentThread())
- SecKeychainRemoveCallback(&Notifier::KeychainCallback);
- }
-
- void Shutdown() {
- called_shutdown_ = true;
- if (!task_runner_->DeleteSoon(FROM_HERE, this)) {
- // If the task runner is no longer running, it's safe to just delete
- // the object, since no further events will or can be delivered by
- // Keychain Services.
- delete this;
- }
- }
-
- private:
- void Init() {
- SecKeychainEventMask event_mask =
- kSecKeychainListChangedMask | kSecTrustSettingsChangedEventMask;
- OSStatus status = SecKeychainAddCallback(&Notifier::KeychainCallback,
- event_mask, this);
- if (status == noErr)
- registered_ = true;
- }
-
- // SecKeychainCallback function that receives notifications from securityd
- // and forwards them to the |cert_db_|.
- static OSStatus KeychainCallback(SecKeychainEvent keychain_event,
- SecKeychainCallbackInfo* info,
- void* context);
-
- CertDatabase* const cert_db_;
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
- bool registered_;
- bool called_shutdown_;
-};
-
-// static
-OSStatus CertDatabase::Notifier::KeychainCallback(
- SecKeychainEvent keychain_event,
- SecKeychainCallbackInfo* info,
- void* context) {
- Notifier* that = reinterpret_cast<Notifier*>(context);
-
- if (info->version > SEC_KEYCHAIN_SETTINGS_VERS1) {
- NOTREACHED();
- return errSecWrongSecVersion;
- }
-
- if (info->pid == base::GetCurrentProcId()) {
- // Ignore events generated by the current process, as the assumption is
- // that they have already been handled. This may miss events that
- // originated as a result of spawning native dialogs that allow the user
- // to modify Keychain settings. However, err on the side of missing
- // events rather than sending too many events.
- return errSecSuccess;
- }
-
- switch (keychain_event) {
- case kSecKeychainListChangedEvent:
- case kSecTrustSettingsChangedEvent:
- that->cert_db_->NotifyObserversOfCertTrustChanged(NULL);
- break;
- }
-
- return errSecSuccess;
-}
-
-void CertDatabase::SetMessageLoopForKeychainEvents() {
- // Shutdown will take care to delete the notifier on the right thread.
- if (notifier_.get())
- notifier_.release()->Shutdown();
-
- notifier_.reset(new Notifier(this, MessageLoopForUI::current()));
-}
-
-CertDatabase::CertDatabase()
- : observer_list_(new ObserverListThreadSafe<Observer>) {
-}
-
-CertDatabase::~CertDatabase() {
- // Shutdown will take care to delete the notifier on the right thread.
- if (notifier_.get())
- notifier_.release()->Shutdown();
-}
-
-int CertDatabase::CheckUserCert(X509Certificate* cert) {
- if (!cert)
- return ERR_CERT_INVALID;
- if (cert->HasExpired())
- return ERR_CERT_DATE_INVALID;
-
- // Verify the Keychain already has the corresponding private key:
- SecIdentityRef identity = NULL;
- OSStatus err = SecIdentityCreateWithCertificate(NULL, cert->os_cert_handle(),
- &identity);
- if (err == errSecItemNotFound)
- return ERR_NO_PRIVATE_KEY_FOR_CERT;
-
- if (err != noErr || !identity) {
- // TODO(snej): Map the error code more intelligently.
- return ERR_CERT_INVALID;
- }
-
- CFRelease(identity);
- return OK;
-}
-
-int CertDatabase::AddUserCert(X509Certificate* cert) {
- OSStatus err;
- {
- base::AutoLock locked(crypto::GetMacSecurityServicesLock());
- err = SecCertificateAddToKeychain(cert->os_cert_handle(), NULL);
- }
- switch (err) {
- case noErr:
- CertDatabase::NotifyObserversOfCertAdded(cert);
- // Fall through.
- case errSecDuplicateItem:
- return OK;
- default:
- OSSTATUS_LOG(ERROR, err) << "CertDatabase failed to add cert to keychain";
- // TODO(snej): Map the error code more intelligently.
- return ERR_ADD_USER_CERT_FAILED;
- }
-}
-
-} // namespace net
« no previous file with comments | « net/base/cert_database_ios.cc ('k') | net/base/cert_database_nss.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698