1 /* -*- Mode: C++; tab-width: 2; 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/. */
6 #include "mozilla/Permission.h"
7 #include "nsIClassInfoImpl.h"
8 #include "nsIEffectiveTLDService.h"
10 #include "nsNetUtil.h"
11 #include "mozilla/BasePrincipal.h"
12 #include "mozilla/StaticPrefs_permissions.h"
13 #include "mozilla/PermissionManager.h"
17 // Permission Implementation
19 NS_IMPL_CLASSINFO(Permission
, nullptr, 0, {0})
20 NS_IMPL_ISUPPORTS_CI(Permission
, nsIPermission
)
22 Permission::Permission(nsIPrincipal
* aPrincipal
, const nsACString
& aType
,
23 uint32_t aCapability
, uint32_t aExpireType
,
24 int64_t aExpireTime
, int64_t aModificationTime
)
25 : mPrincipal(aPrincipal
),
27 mCapability(aCapability
),
28 mExpireType(aExpireType
),
29 mExpireTime(aExpireTime
),
30 mModificationTime(aModificationTime
) {}
32 already_AddRefed
<nsIPrincipal
> Permission::ClonePrincipalForPermission(
33 nsIPrincipal
* aPrincipal
) {
34 MOZ_ASSERT(aPrincipal
);
36 mozilla::OriginAttributes attrs
= aPrincipal
->OriginAttributesRef();
37 PermissionManager::MaybeStripOriginAttributes(false, attrs
);
39 nsAutoCString originNoSuffix
;
40 nsresult rv
= aPrincipal
->GetOriginNoSuffix(originNoSuffix
);
41 NS_ENSURE_SUCCESS(rv
, nullptr);
44 rv
= NS_NewURI(getter_AddRefs(uri
), originNoSuffix
);
45 NS_ENSURE_SUCCESS(rv
, nullptr);
47 return mozilla::BasePrincipal::CreateContentPrincipal(uri
, attrs
);
50 already_AddRefed
<Permission
> Permission::Create(
51 nsIPrincipal
* aPrincipal
, const nsACString
& aType
, uint32_t aCapability
,
52 uint32_t aExpireType
, int64_t aExpireTime
, int64_t aModificationTime
) {
53 NS_ENSURE_TRUE(aPrincipal
, nullptr);
55 nsCOMPtr
<nsIPrincipal
> principal
=
56 Permission::ClonePrincipalForPermission(aPrincipal
);
57 NS_ENSURE_TRUE(principal
, nullptr);
59 RefPtr
<Permission
> permission
=
60 new Permission(principal
, aType
, aCapability
, aExpireType
, aExpireTime
,
62 return permission
.forget();
66 Permission::GetPrincipal(nsIPrincipal
** aPrincipal
) {
67 nsCOMPtr
<nsIPrincipal
> copy
= mPrincipal
;
68 copy
.forget(aPrincipal
);
73 Permission::GetType(nsACString
& aType
) {
79 Permission::GetCapability(uint32_t* aCapability
) {
80 *aCapability
= mCapability
;
85 Permission::GetExpireType(uint32_t* aExpireType
) {
86 *aExpireType
= mExpireType
;
91 Permission::GetExpireTime(int64_t* aExpireTime
) {
92 *aExpireTime
= mExpireTime
;
97 Permission::GetModificationTime(int64_t* aModificationTime
) {
98 *aModificationTime
= mModificationTime
;
103 Permission::Matches(nsIPrincipal
* aPrincipal
, bool aExactHost
, bool* aMatches
) {
104 NS_ENSURE_ARG_POINTER(aPrincipal
);
105 NS_ENSURE_ARG_POINTER(aMatches
);
107 return mPrincipal
->EqualsForPermission(aPrincipal
, aExactHost
, aMatches
);
111 Permission::MatchesURI(nsIURI
* aURI
, bool aExactHost
, bool* aMatches
) {
112 NS_ENSURE_ARG_POINTER(aURI
);
114 mozilla::OriginAttributes attrs
;
115 nsCOMPtr
<nsIPrincipal
> principal
=
116 mozilla::BasePrincipal::CreateContentPrincipal(aURI
, attrs
);
117 NS_ENSURE_TRUE(principal
, NS_ERROR_FAILURE
);
119 return Matches(principal
, aExactHost
, aMatches
);
122 } // namespace mozilla