SystemPrincipal.cpp (3253B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* The privileged system principal. */ 7 8 #include "nscore.h" 9 #include "SystemPrincipal.h" 10 #include "mozilla/ClearOnShutdown.h" 11 #include "nsCOMPtr.h" 12 #include "nsReadableUtils.h" 13 #include "nsCRT.h" 14 #include "nsString.h" 15 #include "nsIClassInfoImpl.h" 16 #include "pratom.h" 17 18 using namespace mozilla; 19 20 NS_IMPL_CLASSINFO(SystemPrincipal, nullptr, nsIClassInfo::SINGLETON, 21 NS_SYSTEMPRINCIPAL_CID) 22 NS_IMPL_QUERY_INTERFACE_CI(SystemPrincipal, nsIPrincipal, nsISerializable) 23 NS_IMPL_CI_INTERFACE_GETTER(SystemPrincipal, nsIPrincipal, nsISerializable) 24 25 static constexpr nsLiteralCString kSystemPrincipalSpec = 26 "[System Principal]"_ns; 27 28 SystemPrincipal::SystemPrincipal() 29 : BasePrincipal(eSystemPrincipal, kSystemPrincipalSpec, 30 OriginAttributes()) {} 31 32 static StaticMutex sSystemPrincipalMutex; 33 static StaticRefPtr<SystemPrincipal> sSystemPrincipal 34 MOZ_GUARDED_BY(sSystemPrincipalMutex); 35 36 already_AddRefed<SystemPrincipal> SystemPrincipal::Get() { 37 StaticMutexAutoLock lock(sSystemPrincipalMutex); 38 return do_AddRef(sSystemPrincipal); 39 } 40 41 already_AddRefed<SystemPrincipal> SystemPrincipal::Init() { 42 AssertIsOnMainThread(); 43 StaticMutexAutoLock lock(sSystemPrincipalMutex); 44 if (MOZ_UNLIKELY(sSystemPrincipal)) { 45 MOZ_ASSERT_UNREACHABLE("SystemPrincipal::Init() may only be called once"); 46 } else { 47 sSystemPrincipal = new SystemPrincipal(); 48 } 49 return do_AddRef(sSystemPrincipal); 50 } 51 52 void SystemPrincipal::Shutdown() { 53 AssertIsOnMainThread(); 54 StaticMutexAutoLock lock(sSystemPrincipalMutex); 55 MOZ_ASSERT(sSystemPrincipal); 56 sSystemPrincipal = nullptr; 57 } 58 59 nsresult SystemPrincipal::GetScriptLocation(nsACString& aStr) { 60 aStr.Assign(kSystemPrincipalSpec); 61 return NS_OK; 62 } 63 64 /////////////////////////////////////// 65 // Methods implementing nsIPrincipal // 66 /////////////////////////////////////// 67 68 NS_IMETHODIMP 69 SystemPrincipal::GetURI(nsIURI** aURI) { 70 *aURI = nullptr; 71 return NS_OK; 72 } 73 74 NS_IMETHODIMP 75 SystemPrincipal::GetIsOriginPotentiallyTrustworthy(bool* aResult) { 76 *aResult = true; 77 return NS_OK; 78 } 79 80 NS_IMETHODIMP 81 SystemPrincipal::GetDomain(nsIURI** aDomain) { 82 *aDomain = nullptr; 83 return NS_OK; 84 } 85 86 NS_IMETHODIMP 87 SystemPrincipal::SetDomain(nsIURI* aDomain) { return NS_OK; } 88 89 NS_IMETHODIMP 90 SystemPrincipal::GetBaseDomain(nsACString& aBaseDomain) { 91 // No base domain for chrome. 92 return NS_OK; 93 } 94 95 NS_IMETHODIMP 96 SystemPrincipal::GetAddonId(nsAString& aAddonId) { 97 aAddonId.Truncate(); 98 return NS_OK; 99 }; 100 101 ////////////////////////////////////////// 102 // Methods implementing nsISerializable // 103 ////////////////////////////////////////// 104 105 NS_IMETHODIMP 106 SystemPrincipal::Read(nsIObjectInputStream* aStream) { 107 // no-op: CID is sufficient to identify the mSystemPrincipal singleton 108 return NS_OK; 109 } 110 111 NS_IMETHODIMP 112 SystemPrincipal::Write(nsIObjectOutputStream* aStream) { 113 // Read is used still for legacy principals 114 MOZ_RELEASE_ASSERT(false, "Old style serialization is removed"); 115 return NS_OK; 116 }