From 1e253ffb013bf0d19705ac5d61e2538aeb7aa5ce Mon Sep 17 00:00:00 2001 From: "kaie%netscape.com" Date: Thu, 20 Feb 2003 00:19:45 +0000 Subject: [PATCH] b=173369 Migrating NSS databases from the "CFM" build to the "mach-o" build r=javi sr=peterv a=asa git-svn-id: svn://10.0.0.236/trunk@138009 18797224-902f-48f8-a5cc-f745e15eee43 --- .../manager/ssl/src/nsNSSComponent.cpp | 143 +++++++++++++++++- .../security/manager/ssl/src/nsNSSComponent.h | 4 + 2 files changed, 143 insertions(+), 4 deletions(-) diff --git a/mozilla/security/manager/ssl/src/nsNSSComponent.cpp b/mozilla/security/manager/ssl/src/nsNSSComponent.cpp index 2d3acbcc882..2cdd2d17d33 100644 --- a/mozilla/security/manager/ssl/src/nsNSSComponent.cpp +++ b/mozilla/security/manager/ssl/src/nsNSSComponent.cpp @@ -923,6 +923,115 @@ nsNSSComponent::InitializeCRLUpdateTimer() return NS_OK; } +#ifdef XP_MACOSX +void +nsNSSComponent::TryCFM2MachOMigration(nsIFile *cfmPath, nsIFile *machoPath) +{ + // We will modify the parameters. + // + // If neither cert7.db, cert8.db, key3.db, are available, + // copy from filenames that were used in the old days + // test for key3.db first, since a new profile might only contain cert8.db, + // but not cert7.db - this optimizes number of tests + + NS_NAMED_LITERAL_CSTRING(cstr_key3db, "key3.db"); + NS_NAMED_LITERAL_CSTRING(cstr_cert7db, "cert7.db"); + NS_NAMED_LITERAL_CSTRING(cstr_cert8db, "cert8.db"); + NS_NAMED_LITERAL_CSTRING(cstr_keydatabase3, "Key Database3"); + NS_NAMED_LITERAL_CSTRING(cstr_certificate7, "Certificates7"); + NS_NAMED_LITERAL_CSTRING(cstr_certificate8, "Certificates8"); + + PRBool bExists; + nsresult rv; + + nsCOMPtr macho_key3db; + rv = machoPath->Clone(getter_AddRefs(macho_key3db)); + if (NS_FAILED(rv)) { + return; + } + + macho_key3db->AppendNative(cstr_key3db); + rv = macho_key3db->Exists(&bExists); + if (NS_FAILED(rv) || bExists) { + return; + } + + nsCOMPtr macho_cert7db; + rv = machoPath->Clone(getter_AddRefs(macho_cert7db)); + if (NS_FAILED(rv)) { + return; + } + + macho_cert7db->AppendNative(cstr_cert7db); + rv = macho_cert7db->Exists(&bExists); + if (NS_FAILED(rv) || bExists) { + return; + } + + nsCOMPtr macho_cert8db; + rv = machoPath->Clone(getter_AddRefs(macho_cert8db)); + if (NS_FAILED(rv)) { + return; + } + + macho_cert8db->AppendNative(cstr_cert8db); + rv = macho_cert7db->Exists(&bExists); + if (NS_FAILED(rv) || bExists) { + return; + } + + // None of the new files exist. Try to copy any available old files. + + nsCOMPtr cfm_key3; + rv = cfmPath->Clone(getter_AddRefs(cfm_key3)); + if (NS_FAILED(rv)) { + return; + } + + cfm_key3->AppendNative(cstr_keydatabase3); + rv = cfm_key3->Exists(&bExists); + if (NS_FAILED(rv)) { + return; + } + + if (bExists) { + cfm_key3->CopyToFollowingLinksNative(machoPath, cstr_key3db); + } + + nsCOMPtr cfm_cert7; + rv = cfmPath->Clone(getter_AddRefs(cfm_cert7)); + if (NS_FAILED(rv)) { + return; + } + + cfm_cert7->AppendNative(cstr_certificate7); + rv = cfm_cert7->Exists(&bExists); + if (NS_FAILED(rv)) { + return; + } + + if (bExists) { + cfm_cert7->CopyToFollowingLinksNative(machoPath, cstr_cert7db); + } + + nsCOMPtr cfm_cert8; + rv = cfmPath->Clone(getter_AddRefs(cfm_cert8)); + if (NS_FAILED(rv)) { + return; + } + + cfm_cert8->AppendNative(cstr_certificate8); + rv = cfm_cert8->Exists(&bExists); + if (NS_FAILED(rv)) { + return; + } + + if (bExists) { + cfm_cert8->CopyToFollowingLinksNative(machoPath, cstr_cert8db); + } +} +#endif + nsresult nsNSSComponent::InitializeNSS() { @@ -962,18 +1071,44 @@ nsNSSComponent::InitializeNSS() return rv; } - #ifdef XP_MAC - // On the Mac we place all NSS DBs in the Security + // XP_MAC == CFM + // XP_MACOSX == MachO + + #if defined(XP_MAC) && defined(XP_MACOSX) + #error "This code assumes XP_MAC and XP_MACOSX will never be defined at the same time" + #endif + + #if defined(XP_MAC) || defined(XP_MACOSX) + // On Mac CFM we place all NSS DBs in the Security // Folder in the profile directory. - profilePath->AppendNative(NS_LITERAL_CSTRING("Security")); + nsCOMPtr cfmSecurityPath; + cfmSecurityPath = profilePath; // alias for easier code reading + cfmSecurityPath->AppendNative(NS_LITERAL_CSTRING("Security")); + #endif + + #if defined(XP_MAC) + // on CFM, cfmSecurityPath and profilePath point to the same oject profilePath->Create(nsIFile::DIRECTORY_TYPE, 0); //This is for Mac, don't worry about //permissions. - #endif + #elif defined(XP_MACOSX) + // On MachO, we need to access both directories, + // and therefore need separate nsIFile instances. + // Keep cfmSecurityPath instance, obtain new instance for MachO profilePath. + rv = cfmSecurityPath->GetParent(getter_AddRefs(profilePath)); + if (NS_FAILED(rv)) + return rv; + #endif rv = profilePath->GetNativePath(profileStr); if (NS_FAILED(rv)) return rv; + #if defined(XP_MACOSX) + // function may modify the parameters + // ignore return code from conversion, we continue anyway + TryCFM2MachOMigration(cfmSecurityPath, profilePath); + #endif + PRBool supress_warning_preference = PR_FALSE; rv = mPref->GetBoolPref("security.suppress_nss_rw_impossible_warning", &supress_warning_preference); diff --git a/mozilla/security/manager/ssl/src/nsNSSComponent.h b/mozilla/security/manager/ssl/src/nsNSSComponent.h index 790f79c2cbd..6b2823ffc88 100644 --- a/mozilla/security/manager/ssl/src/nsNSSComponent.h +++ b/mozilla/security/manager/ssl/src/nsNSSComponent.h @@ -178,6 +178,10 @@ private: nsresult InitializeNSS(); nsresult ShutdownNSS(); + +#ifdef XP_MACOSX + void TryCFM2MachOMigration(nsIFile *cfmPath, nsIFile *machoPath); +#endif enum AlertIdentifier { ai_nss_init_problem,