tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }