Skip to content

Commit 36e4416

Browse files
author
Kian Jamali
committed
Patch trusted types violation
1 parent 60d1b18 commit 36e4416

File tree

5 files changed

+48
-33
lines changed

5 files changed

+48
-33
lines changed

packages/auth/src/platform_browser/iframe/gapi.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* limitations under the License.
1616
*/
1717

18+
import { appendParams } from 'safevalues';
19+
1820
import { AuthErrorCode } from '../../core/errors';
1921
import { _createError } from '../../core/util/assert';
2022
import { Delay } from '../../core/util/delay';
@@ -104,7 +106,7 @@ function loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {
104106
};
105107
// Load GApi loader.
106108
return js
107-
._loadJS(`${js._gapiScriptUrl()}?onload=${cbName}`)
109+
._loadJS(appendParams(js._gapiScriptUrl(), { onload: cbName }))
108110
.catch(e => reject(e));
109111
}
110112
}).catch(error => {

packages/auth/src/platform_browser/index.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717

1818
import { FirebaseApp, getApp, _getProvider } from '@firebase/app';
19+
import { trustedResourceUrl } from 'safevalues';
20+
import { setScriptSrc } from 'safevalues/dom';
1921

2022
import {
2123
initializeAuth,
@@ -120,11 +122,11 @@ function getScriptParentElement(): HTMLDocument | HTMLHeadElement {
120122
}
121123

122124
_setExternalJSProvider({
123-
loadJS(url: string): Promise<Event> {
125+
loadJS(url): Promise<Event> {
124126
// TODO: consider adding timeout support & cancellation
125127
return new Promise((resolve, reject) => {
126-
const el = document.createElement('script');
127-
el.setAttribute('src', url);
128+
const el = document.createElement('script') as HTMLScriptElement;
129+
setScriptSrc(el, url);
128130
el.onload = resolve;
129131
el.onerror = e => {
130132
const error = _createError(AuthErrorCode.INTERNAL_ERROR);
@@ -137,10 +139,9 @@ _setExternalJSProvider({
137139
});
138140
},
139141

140-
gapiScript: 'https://apis.google.com/js/api.js',
141-
recaptchaV2Script: 'https://www.google.com/recaptcha/api.js',
142-
recaptchaEnterpriseScript:
143-
'https://www.google.com/recaptcha/enterprise.js?render='
142+
gapiScript: trustedResourceUrl`https://apis.google.com/js/api.js`,
143+
recaptchaV2Script: trustedResourceUrl`https://www.google.com/recaptcha/api.js`,
144+
recaptchaEnterpriseScript: trustedResourceUrl`https://www.google.com/recaptcha/enterprise.js?render=`
144145
});
145146

146147
registerAuth(ClientPlatform.BROWSER);

packages/auth/src/platform_browser/load_js.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,51 @@
1515
* limitations under the License.
1616
*/
1717

18+
import { TrustedResourceUrl } from 'safevalues';
19+
1820
interface ExternalJSProvider {
19-
loadJS(url: string): Promise<Event>;
20-
recaptchaV2Script: string;
21-
recaptchaEnterpriseScript: string;
22-
gapiScript: string;
21+
loadJS(url: TrustedResourceUrl): Promise<Event>;
22+
recaptchaV2Script: TrustedResourceUrl;
23+
recaptchaEnterpriseScript: TrustedResourceUrl;
24+
gapiScript: TrustedResourceUrl;
2325
}
2426

25-
let externalJSProvider: ExternalJSProvider = {
26-
async loadJS() {
27-
throw new Error('Unable to load external scripts');
28-
},
29-
30-
recaptchaV2Script: '',
31-
recaptchaEnterpriseScript: '',
32-
gapiScript: ''
33-
};
27+
// externalJSProvider is set in index.ts
28+
let externalJSProvider: ExternalJSProvider;
3429

3530
export function _setExternalJSProvider(p: ExternalJSProvider): void {
3631
externalJSProvider = p;
3732
}
3833

39-
export function _loadJS(url: string): Promise<Event> {
34+
export function _loadJS(url: TrustedResourceUrl): Promise<Event> {
35+
// externalJSProvider is not defined during initialization.
36+
if (!externalJSProvider) {
37+
throw new Error('ExternalJSProvider not set.');
38+
}
4039
return externalJSProvider.loadJS(url);
4140
}
4241

43-
export function _recaptchaV2ScriptUrl(): string {
42+
export function _recaptchaV2ScriptUrl(): TrustedResourceUrl {
43+
// externalJSProvider is not defined during initialization.
44+
if (!externalJSProvider) {
45+
throw new Error('ExternalJSProvider not set.');
46+
}
4447
return externalJSProvider.recaptchaV2Script;
4548
}
4649

47-
export function _recaptchaEnterpriseScriptUrl(): string {
50+
export function _recaptchaEnterpriseScriptUrl(): TrustedResourceUrl {
51+
// externalJSProvider is not defined during initialization.
52+
if (!externalJSProvider) {
53+
throw new Error('ExternalJSProvider not set.');
54+
}
4855
return externalJSProvider.recaptchaEnterpriseScript;
4956
}
5057

51-
export function _gapiScriptUrl(): string {
58+
export function _gapiScriptUrl(): TrustedResourceUrl {
59+
// externalJSProvider is not defined during initialization.
60+
if (!externalJSProvider) {
61+
throw new Error('ExternalJSProvider not set.');
62+
}
5263
return externalJSProvider.gapiScript;
5364
}
5465

packages/auth/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
RecaptchaAuthProvider,
2626
EnforcementState
2727
} from '../../api';
28+
import { appendParams } from 'safevalues';
2829

2930
import { Auth } from '../../model/public_types';
3031
import { AuthInternal } from '../../model/auth';
@@ -141,12 +142,12 @@ export class RecaptchaEnterpriseVerifier {
141142
);
142143
return;
143144
}
144-
let url = jsHelpers._recaptchaEnterpriseScriptUrl();
145-
if (url.length !== 0) {
146-
url += siteKey;
147-
}
145+
const url = jsHelpers._recaptchaEnterpriseScriptUrl();
146+
// Append site key as query parameter.
147+
const urlWithParams = appendParams(url, new Map([['render', siteKey]]));
148+
148149
jsHelpers
149-
._loadJS(url)
150+
._loadJS(urlWithParams)
150151
.then(() => {
151152
retrieveRecaptchaToken(siteKey, resolve, reject);
152153
})

packages/auth/src/platform_browser/recaptcha/recaptcha_loader.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { querystring } from '@firebase/util';
18+
import { appendParams } from 'safevalues';
1919

2020
import { AuthErrorCode } from '../../core/errors';
2121
import { _assert, _createError } from '../../core/util/assert';
@@ -90,11 +90,11 @@ export class ReCaptchaLoaderImpl implements ReCaptchaLoader {
9090
resolve(recaptcha);
9191
};
9292

93-
const url = `${jsHelpers._recaptchaV2ScriptUrl()}?${querystring({
93+
const url = appendParams(jsHelpers._recaptchaV2ScriptUrl(), {
9494
onload: _JSLOAD_CALLBACK,
9595
render: 'explicit',
9696
hl
97-
})}`;
97+
});
9898

9999
jsHelpers._loadJS(url).catch(() => {
100100
clearTimeout(networkTimeout);

0 commit comments

Comments
 (0)