зеркало из https://github.com/mozilla/gecko-dev.git
90 строки
2.5 KiB
C++
90 строки
2.5 KiB
C++
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
* vim: sw=2 ts=8 et :
|
||
|
*/
|
||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
|
||
|
#include "AppProcessChecker.h"
|
||
|
#include "ContentParent.h"
|
||
|
#include "mozIApplication.h"
|
||
|
#include "mozilla/hal_sandbox/PHalParent.h"
|
||
|
#include "nsIDOMApplicationRegistry.h"
|
||
|
#include "TabParent.h"
|
||
|
|
||
|
using namespace mozilla::dom;
|
||
|
using namespace mozilla::hal_sandbox;
|
||
|
using namespace mozilla::services;
|
||
|
|
||
|
namespace mozilla {
|
||
|
|
||
|
bool
|
||
|
AssertAppProcess(PBrowserParent* aActor,
|
||
|
AssertAppProcessType aType,
|
||
|
const char* aCapability)
|
||
|
{
|
||
|
if (!aActor) {
|
||
|
NS_WARNING("Testing process capability for null actor");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
TabParent* tab = static_cast<TabParent*>(aActor);
|
||
|
nsCOMPtr<mozIApplication> app = tab->GetOwnOrContainingApp();
|
||
|
bool aValid = false;
|
||
|
|
||
|
// isBrowser frames inherit their app descriptor to identify their
|
||
|
// data storage, but they don't inherit the capability associated
|
||
|
// with that descriptor.
|
||
|
if (app && !tab->IsBrowserElement()) {
|
||
|
switch (aType) {
|
||
|
case ASSERT_APP_PROCESS_PERMISSION:
|
||
|
if (!NS_SUCCEEDED(app->HasPermission(aCapability, &aValid))) {
|
||
|
aValid = false;
|
||
|
}
|
||
|
break;
|
||
|
case ASSERT_APP_PROCESS_MANIFEST_URL: {
|
||
|
nsAutoString manifestURL;
|
||
|
if (NS_SUCCEEDED(app->GetManifestURL(manifestURL)) &&
|
||
|
manifestURL.EqualsASCII(aCapability)) {
|
||
|
aValid = true;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!aValid) {
|
||
|
printf_stderr("Security problem: Content process does not have `%s'. It will be killed.\n", aCapability);
|
||
|
ContentParent* process = static_cast<ContentParent*>(aActor->Manager());
|
||
|
process->KillHard();
|
||
|
}
|
||
|
return aValid;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
AssertAppProcess(PContentParent* aActor,
|
||
|
AssertAppProcessType aType,
|
||
|
const char* aCapability)
|
||
|
{
|
||
|
const InfallibleTArray<PBrowserParent*>& browsers =
|
||
|
aActor->ManagedPBrowserParent();
|
||
|
for (uint32_t i = 0; i < browsers.Length(); ++i) {
|
||
|
if (AssertAppProcess(browsers[i], aType, aCapability)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
AssertAppProcess(PHalParent* aActor,
|
||
|
AssertAppProcessType aType,
|
||
|
const char* aCapability)
|
||
|
{
|
||
|
return AssertAppProcess(aActor->Manager(), aType, aCapability);
|
||
|
}
|
||
|
|
||
|
} // namespace mozilla
|