OLD | NEW |
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | 1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 /* vim:set ts=4 sw=4 sts=4 et cindent: */ | 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 /* This Source Code Form is subject to the terms of the Mozilla Public | 3 /* This Source Code Form is subject to the terms of the Mozilla Public |
4 * License, v. 2.0. If a copy of the MPL was not distributed with this | 4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | 6 |
7 #include "nsAboutRedirector.h" | 7 #include "nsAboutRedirector.h" |
8 #include "nsNetUtil.h" | 8 #include "nsNetUtil.h" |
9 #include "nsAboutProtocolUtils.h" | 9 #include "nsAboutProtocolUtils.h" |
10 #include "mozilla/ArrayUtils.h" | 10 #include "mozilla/ArrayUtils.h" |
11 #include "nsDOMString.h" | 11 #include "nsDOMString.h" |
12 | 12 |
13 NS_IMPL_ISUPPORTS(nsAboutRedirector, nsIAboutModule) | 13 NS_IMPL_ISUPPORTS(nsAboutRedirector, nsIAboutModule) |
14 | 14 |
15 struct RedirEntry { | 15 struct RedirEntry |
16 const char* id; | 16 { |
17 const char* url; | 17 const char* id; |
18 uint32_t flags; | 18 const char* url; |
| 19 uint32_t flags; |
19 }; | 20 }; |
20 | 21 |
21 /* | 22 /* |
22 Entries which do not have URI_SAFE_FOR_UNTRUSTED_CONTENT will run with chrome | 23 Entries which do not have URI_SAFE_FOR_UNTRUSTED_CONTENT will run with chrome |
23 privileges. This is potentially dangerous. Please use | 24 privileges. This is potentially dangerous. Please use |
24 URI_SAFE_FOR_UNTRUSTED_CONTENT in the third argument to each map item below | 25 URI_SAFE_FOR_UNTRUSTED_CONTENT in the third argument to each map item below |
25 unless your about: page really needs chrome privileges. Security review is | 26 unless your about: page really needs chrome privileges. Security review is |
26 required before adding new map entries without | 27 required before adding new map entries without |
27 URI_SAFE_FOR_UNTRUSTED_CONTENT. Also note, however, that adding | 28 URI_SAFE_FOR_UNTRUSTED_CONTENT. Also note, however, that adding |
28 URI_SAFE_FOR_UNTRUSTED_CONTENT will allow random web sites to link to that | 29 URI_SAFE_FOR_UNTRUSTED_CONTENT will allow random web sites to link to that |
29 URI. Perhaps we should separate the two concepts out... | 30 URI. Perhaps we should separate the two concepts out... |
30 */ | 31 */ |
31 static RedirEntry kRedirMap[] = { | 32 static RedirEntry kRedirMap[] = { |
32 { "", "chrome://global/content/about.xhtml", | 33 { |
33 nsIAboutModule::ALLOW_SCRIPT }, | 34 "", "chrome://global/content/about.xhtml", |
34 { "about", "chrome://global/content/aboutAbout.xhtml", 0 }, | 35 nsIAboutModule::ALLOW_SCRIPT |
| 36 }, |
| 37 { "about", "chrome://global/content/aboutAbout.xhtml", 0 }, |
35 /* | 38 /* |
36 Removed as part of https://issues.adblockplus.org/ticket/2531 | 39 Removed as part of https://issues.adblockplus.org/ticket/2531 |
37 { "credits", "http://www.mozilla.org/credits/", | 40 { |
38 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT }, | 41 "credits", "http://www.mozilla.org/credits/", |
39 { "mozilla", "chrome://global/content/mozilla.xhtml", | 42 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
40 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT }, | 43 }, |
| 44 { |
| 45 "mozilla", "chrome://global/content/mozilla.xhtml", |
| 46 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
| 47 }, |
41 */ | 48 */ |
42 { "plugins", "chrome://global/content/plugins.html", 0 }, | 49 { |
43 { "config", "chrome://global/content/config.xul", 0 }, | 50 "plugins", "chrome://global/content/plugins.html", |
| 51 nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
| 52 }, |
| 53 { "config", "chrome://global/content/config.xul", 0 }, |
44 #ifdef MOZ_CRASHREPORTER | 54 #ifdef MOZ_CRASHREPORTER |
45 { "crashes", "chrome://global/content/crashes.xhtml", 0 }, | 55 { "crashes", "chrome://global/content/crashes.xhtml", 0 }, |
46 #endif | 56 #endif |
47 { "logo", "chrome://branding/content/about.png", | 57 { |
48 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT}, | 58 "logo", "chrome://branding/content/about.png", |
49 { "buildconfig", "chrome://global/content/buildconfig.html", | 59 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
50 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT }, | 60 }, |
| 61 { |
| 62 "buildconfig", "chrome://global/content/buildconfig.html", |
| 63 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
| 64 }, |
51 /* | 65 /* |
52 Removed as part of https://issues.adblockplus.org/ticket/2531 | 66 Removed as part of https://issues.adblockplus.org/ticket/2531 |
53 { "license", "chrome://global/content/license.html", | 67 { |
54 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT }, | 68 "license", "chrome://global/content/license.html", |
| 69 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
| 70 }, |
55 */ | 71 */ |
56 { "neterror", "chrome://global/content/netError.xhtml", | 72 { |
57 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | | 73 "neterror", "chrome://global/content/netError.xhtml", |
| 74 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | |
| 75 nsIAboutModule::URI_CAN_LOAD_IN_CHILD | |
58 nsIAboutModule::ALLOW_SCRIPT | | 76 nsIAboutModule::ALLOW_SCRIPT | |
59 nsIAboutModule::HIDE_FROM_ABOUTABOUT }, | 77 nsIAboutModule::HIDE_FROM_ABOUTABOUT |
60 { "compartments", "chrome://global/content/aboutCompartments.xhtml", | 78 }, |
61 nsIAboutModule::ALLOW_SCRIPT | | 79 { |
62 nsIAboutModule::HIDE_FROM_ABOUTABOUT }, | 80 "memory", "chrome://global/content/aboutMemory.xhtml", |
63 { "memory", "chrome://global/content/aboutMemory.xhtml", | 81 nsIAboutModule::ALLOW_SCRIPT |
64 nsIAboutModule::ALLOW_SCRIPT }, | 82 }, |
| 83 { |
| 84 "compartments", "chrome://global/content/aboutCompartments.xhtml", |
| 85 nsIAboutModule::ALLOW_SCRIPT |
| 86 }, |
65 /* | 87 /* |
66 Removed as part of https://issues.adblockplus.org/ticket/2531 | 88 Removed as part of https://issues.adblockplus.org/ticket/2531 |
67 { "addons", "chrome://mozapps/content/extensions/extensions.xul", | 89 { |
68 nsIAboutModule::ALLOW_SCRIPT }, | 90 "addons", "chrome://mozapps/content/extensions/extensions.xul", |
| 91 nsIAboutModule::ALLOW_SCRIPT |
| 92 }, |
69 */ | 93 */ |
70 { "newaddon", "chrome://mozapps/content/extensions/newaddon.xul", | 94 { |
71 nsIAboutModule::ALLOW_SCRIPT | | 95 "newaddon", "chrome://mozapps/content/extensions/newaddon.xul", |
72 nsIAboutModule::HIDE_FROM_ABOUTABOUT }, | 96 nsIAboutModule::ALLOW_SCRIPT | |
| 97 nsIAboutModule::HIDE_FROM_ABOUTABOUT |
| 98 }, |
73 /* | 99 /* |
74 Removed as part of https://issues.adblockplus.org/ticket/2531 | 100 Removed as part of https://issues.adblockplus.org/ticket/2531 |
75 { "support", "chrome://global/content/aboutSupport.xhtml", | 101 { |
76 nsIAboutModule::ALLOW_SCRIPT }, | 102 "support", "chrome://global/content/aboutSupport.xhtml", |
77 { "telemetry", "chrome://global/content/aboutTelemetry.xhtml", | 103 nsIAboutModule::ALLOW_SCRIPT |
78 nsIAboutModule::ALLOW_SCRIPT }, | 104 }, |
| 105 { |
| 106 "telemetry", "chrome://global/content/aboutTelemetry.xhtml", |
| 107 nsIAboutModule::ALLOW_SCRIPT |
| 108 }, |
79 */ | 109 */ |
80 { "networking", "chrome://global/content/aboutNetworking.xhtml", | 110 { |
81 nsIAboutModule::ALLOW_SCRIPT }, | 111 "networking", "chrome://global/content/aboutNetworking.xhtml", |
82 { "webrtc", "chrome://global/content/aboutwebrtc/aboutWebrtc.xhtml", | 112 nsIAboutModule::ALLOW_SCRIPT |
83 nsIAboutModule::ALLOW_SCRIPT }, | 113 }, |
84 // about:srcdoc is unresolvable by specification. It is included here | 114 { |
85 // because the security manager would disallow srcdoc iframes otherwise. | 115 "webrtc", "chrome://global/content/aboutwebrtc/aboutWebrtc.xhtml", |
86 { "srcdoc", "about:blank", | 116 nsIAboutModule::ALLOW_SCRIPT |
87 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | | 117 }, |
88 nsIAboutModule::HIDE_FROM_ABOUTABOUT } | 118 // about:srcdoc is unresolvable by specification. It is included here |
| 119 // because the security manager would disallow srcdoc iframes otherwise. |
| 120 { |
| 121 "srcdoc", "about:blank", |
| 122 nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT | |
| 123 nsIAboutModule::HIDE_FROM_ABOUTABOUT |
| 124 } |
89 }; | 125 }; |
90 static const int kRedirTotal = mozilla::ArrayLength(kRedirMap); | 126 static const int kRedirTotal = mozilla::ArrayLength(kRedirMap); |
91 | 127 |
92 NS_IMETHODIMP | 128 NS_IMETHODIMP |
93 nsAboutRedirector::NewChannel(nsIURI* aURI, | 129 nsAboutRedirector::NewChannel(nsIURI* aURI, |
94 nsILoadInfo* aLoadInfo, | 130 nsILoadInfo* aLoadInfo, |
95 nsIChannel** result) | 131 nsIChannel** aResult) |
96 { | 132 { |
97 NS_ENSURE_ARG_POINTER(aURI); | 133 NS_ENSURE_ARG_POINTER(aURI); |
98 NS_ASSERTION(result, "must not be null"); | 134 NS_ASSERTION(aResult, "must not be null"); |
99 | 135 |
100 nsAutoCString path; | 136 nsAutoCString path; |
101 nsresult rv = NS_GetAboutModuleName(aURI, path); | 137 nsresult rv = NS_GetAboutModuleName(aURI, path); |
102 NS_ENSURE_SUCCESS(rv, rv); | 138 NS_ENSURE_SUCCESS(rv, rv); |
103 | 139 |
104 nsCOMPtr<nsIIOService> ioService = do_GetIOService(&rv); | 140 nsCOMPtr<nsIIOService> ioService = do_GetIOService(&rv); |
105 NS_ENSURE_SUCCESS(rv, rv); | 141 NS_ENSURE_SUCCESS(rv, rv); |
106 | 142 |
| 143 for (int i = 0; i < kRedirTotal; i++) { |
| 144 if (!strcmp(path.get(), kRedirMap[i].id)) { |
| 145 nsCOMPtr<nsIChannel> tempChannel; |
| 146 nsCOMPtr<nsIURI> tempURI; |
| 147 rv = NS_NewURI(getter_AddRefs(tempURI), kRedirMap[i].url); |
| 148 NS_ENSURE_SUCCESS(rv, rv); |
| 149 rv = NS_NewChannelInternal(getter_AddRefs(tempChannel), |
| 150 tempURI, |
| 151 aLoadInfo); |
| 152 if (NS_FAILED(rv)) { |
| 153 return rv; |
| 154 } |
107 | 155 |
108 for (int i=0; i<kRedirTotal; i++) | 156 tempChannel->SetOriginalURI(aURI); |
109 { | |
110 if (!strcmp(path.get(), kRedirMap[i].id)) | |
111 { | |
112 nsCOMPtr<nsIChannel> tempChannel; | |
113 nsCOMPtr<nsIURI> tempURI; | |
114 rv = NS_NewURI(getter_AddRefs(tempURI), kRedirMap[i].url); | |
115 NS_ENSURE_SUCCESS(rv, rv); | |
116 // Bug 1087720 (and Bug 1099296): | |
117 // Once all callsites have been updated to call NewChannel2() | |
118 // instead of NewChannel() we should have a non-null loadInfo | |
119 // consistently. Until then we have to branch on the loadInfo. | |
120 if (aLoadInfo) { | |
121 rv = NS_NewChannelInternal(getter_AddRefs(tempChannel), | |
122 tempURI, | |
123 aLoadInfo); | |
124 } | |
125 else { | |
126 rv = ioService->NewChannelFromURI(tempURI, | |
127 getter_AddRefs(tempChannel)); | |
128 } | |
129 if (NS_FAILED(rv)) | |
130 return rv; | |
131 | 157 |
132 tempChannel->SetOriginalURI(aURI); | 158 NS_ADDREF(*aResult = tempChannel); |
| 159 return rv; |
| 160 } |
| 161 } |
133 | 162 |
134 NS_ADDREF(*result = tempChannel); | 163 NS_ERROR("nsAboutRedirector called for unknown case"); |
135 return rv; | 164 return NS_ERROR_ILLEGAL_VALUE; |
136 } | |
137 } | |
138 | |
139 NS_ERROR("nsAboutRedirector called for unknown case"); | |
140 return NS_ERROR_ILLEGAL_VALUE; | |
141 } | 165 } |
142 | 166 |
143 NS_IMETHODIMP | 167 NS_IMETHODIMP |
144 nsAboutRedirector::GetURIFlags(nsIURI *aURI, uint32_t *result) | 168 nsAboutRedirector::GetURIFlags(nsIURI* aURI, uint32_t* aResult) |
145 { | 169 { |
146 NS_ENSURE_ARG_POINTER(aURI); | 170 NS_ENSURE_ARG_POINTER(aURI); |
147 | 171 |
148 nsAutoCString name; | 172 nsAutoCString name; |
149 nsresult rv = NS_GetAboutModuleName(aURI, name); | 173 nsresult rv = NS_GetAboutModuleName(aURI, name); |
150 NS_ENSURE_SUCCESS(rv, rv); | 174 NS_ENSURE_SUCCESS(rv, rv); |
151 | 175 |
152 for (int i=0; i < kRedirTotal; i++) | 176 for (int i = 0; i < kRedirTotal; i++) { |
153 { | 177 if (name.EqualsASCII(kRedirMap[i].id)) { |
154 if (name.EqualsASCII(kRedirMap[i].id)) | 178 *aResult = kRedirMap[i].flags; |
155 { | 179 return NS_OK; |
156 *result = kRedirMap[i].flags; | |
157 return NS_OK; | |
158 } | |
159 } | 180 } |
| 181 } |
160 | 182 |
161 NS_ERROR("nsAboutRedirector called for unknown case"); | 183 NS_ERROR("nsAboutRedirector called for unknown case"); |
162 return NS_ERROR_ILLEGAL_VALUE; | 184 return NS_ERROR_ILLEGAL_VALUE; |
163 } | 185 } |
164 | 186 |
165 NS_IMETHODIMP | 187 NS_IMETHODIMP |
166 nsAboutRedirector::GetIndexedDBOriginPostfix(nsIURI *aURI, nsAString &result) | 188 nsAboutRedirector::GetIndexedDBOriginPostfix(nsIURI* aURI, nsAString& aResult) |
167 { | 189 { |
168 SetDOMStringToNull(result); | 190 SetDOMStringToNull(aResult); |
169 return NS_ERROR_NOT_IMPLEMENTED; | 191 return NS_ERROR_NOT_IMPLEMENTED; |
170 } | 192 } |
171 | 193 |
172 nsresult | 194 nsresult |
173 nsAboutRedirector::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) | 195 nsAboutRedirector::Create(nsISupports* aOuter, REFNSIID aIID, void** aResult) |
174 { | 196 { |
175 nsAboutRedirector* about = new nsAboutRedirector(); | 197 nsAboutRedirector* about = new nsAboutRedirector(); |
176 if (about == nullptr) | 198 NS_ADDREF(about); |
177 return NS_ERROR_OUT_OF_MEMORY; | 199 nsresult rv = about->QueryInterface(aIID, aResult); |
178 NS_ADDREF(about); | 200 NS_RELEASE(about); |
179 nsresult rv = about->QueryInterface(aIID, aResult); | 201 return rv; |
180 NS_RELEASE(about); | |
181 return rv; | |
182 } | 202 } |
OLD | NEW |