Skip to content

Commit 7f8b2f9

Browse files
author
Kian Jamali
committed
Fix trusted types violation
1 parent 36e4416 commit 7f8b2f9

File tree

9 files changed

+44
-45
lines changed

9 files changed

+44
-45
lines changed

packages/auth/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"@firebase/component": "0.7.0",
128128
"@firebase/logger": "0.5.0",
129129
"@firebase/util": "1.13.0",
130+
"safevalues": "1.2.0",
130131
"tslib": "^2.1.0"
131132
},
132133
"license": "Apache-2.0",

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { testAuth, TestAuth } from '../../../test/helpers/mock_auth';
2626
import { _window } from '../auth_window';
2727
import * as js from '../load_js';
2828
import { _loadGapi, _resetLoader } from './gapi';
29+
import { unwrapResourceUrl } from 'safevalues';
2930

3031
use(sinonChai);
3132
use(chaiAsPromised);
@@ -41,7 +42,7 @@ describe('platform_browser/iframe/gapi', () => {
4142

4243
beforeEach(async () => {
4344
loadJsStub = sinon.stub(js, '_loadJS').callsFake(url => {
44-
onJsLoad(url.split('onload=')[1]);
45+
onJsLoad(unwrapResourceUrl(url).split('onload=')[1]);
4546
return Promise.resolve(new Event('load'));
4647
});
4748

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function loadGapi(auth: AuthInternal): Promise<gapi.iframes.Context> {
106106
};
107107
// Load GApi loader.
108108
return js
109-
._loadJS(appendParams(js._gapiScriptUrl(), { onload: cbName }))
109+
._loadJS(appendParams(js._gapiScriptUrl(), new Map([['onload', cbName]])))
110110
.catch(e => reject(e));
111111
}
112112
}).catch(error => {

packages/auth/src/platform_browser/index.ts

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

1818
import { FirebaseApp, getApp, _getProvider } from '@firebase/app';
19-
import { trustedResourceUrl } from 'safevalues';
19+
import { TrustedResourceUrl, trustedResourceUrl } from 'safevalues';
2020
import { setScriptSrc } from 'safevalues/dom';
2121

2222
import {
@@ -122,7 +122,7 @@ function getScriptParentElement(): HTMLDocument | HTMLHeadElement {
122122
}
123123

124124
_setExternalJSProvider({
125-
loadJS(url): Promise<Event> {
125+
loadJS(url: TrustedResourceUrl): Promise<Event> {
126126
// TODO: consider adding timeout support & cancellation
127127
return new Promise((resolve, reject) => {
128128
const el = document.createElement('script') as HTMLScriptElement;
@@ -141,7 +141,8 @@ _setExternalJSProvider({
141141

142142
gapiScript: trustedResourceUrl`https://apis.google.com/js/api.js`,
143143
recaptchaV2Script: trustedResourceUrl`https://www.google.com/recaptcha/api.js`,
144-
recaptchaEnterpriseScript: trustedResourceUrl`https://www.google.com/recaptcha/enterprise.js?render=`
144+
recaptchaEnterpriseScript:
145+
trustedResourceUrl`https://www.google.com/recaptcha/enterprise.js`
145146
});
146147

147148
registerAuth(ClientPlatform.BROWSER);

packages/auth/src/platform_browser/load_js.test.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import {
2626
} from './load_js';
2727
import { _createError } from '../core/util/assert';
2828
import { AuthErrorCode } from '../core/errors';
29+
import { TrustedResourceUrl, trustedResourceUrl, unwrapResourceUrl } from 'safevalues';
30+
import { setScriptSrc } from 'safevalues/dom';
2931

3032
use(sinonChai);
3133

@@ -41,10 +43,10 @@ describe('platform-browser/load_js', () => {
4143
describe('_loadJS', () => {
4244
it('sets the appropriate properties', () => {
4345
_setExternalJSProvider({
44-
loadJS(url: string): Promise<Event> {
46+
loadJS(url: TrustedResourceUrl): Promise<Event> {
4547
return new Promise((resolve, reject) => {
4648
const el = document.createElement('script');
47-
el.setAttribute('src', url);
49+
setScriptSrc(el, url);
4850
el.onload = resolve;
4951
el.onerror = e => {
5052
const error = _createError(AuthErrorCode.INTERNAL_ERROR);
@@ -55,20 +57,18 @@ describe('platform-browser/load_js', () => {
5557
el.charset = 'UTF-8';
5658
});
5759
},
58-
gapiScript: 'https://gapiScript',
59-
recaptchaV2Script: 'https://recaptchaV2Script',
60-
recaptchaEnterpriseScript: 'https://recaptchaEnterpriseScript'
60+
gapiScript: trustedResourceUrl`https://gapiScript`,
61+
recaptchaV2Script: trustedResourceUrl`https://recaptchaV2Script`,
62+
recaptchaEnterpriseScript: trustedResourceUrl`https://recaptchaEnterpriseScript`
6163
});
6264
const el = document.createElement('script');
6365
sinon.stub(el); // Prevent actually setting the src attribute
6466
sinon.stub(document, 'createElement').returns(el);
6567

68+
const testUrl = trustedResourceUrl`http://localhost/url`;
6669
// eslint-disable-next-line @typescript-eslint/no-floating-promises
67-
_loadJS('http://localhost/url');
68-
expect(el.setAttribute).to.have.been.calledWith(
69-
'src',
70-
'http://localhost/url'
71-
);
70+
_loadJS(testUrl);
71+
expect(el.src).to.eq(unwrapResourceUrl(testUrl));
7272
expect(el.type).to.eq('text/javascript');
7373
expect(el.charset).to.eq('UTF-8');
7474
});

packages/auth/src/platform_browser/load_js.ts

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

18-
import { TrustedResourceUrl } from 'safevalues';
18+
import { TrustedResourceUrl, trustedResourceUrl } from 'safevalues';
1919

2020
interface ExternalJSProvider {
2121
loadJS(url: TrustedResourceUrl): Promise<Event>;
@@ -24,42 +24,33 @@ interface ExternalJSProvider {
2424
gapiScript: TrustedResourceUrl;
2525
}
2626

27-
// externalJSProvider is set in index.ts
28-
let externalJSProvider: ExternalJSProvider;
27+
let externalJSProvider: ExternalJSProvider = {
28+
loadJS(url: TrustedResourceUrl): Promise<Event> {
29+
throw new Error('Unable to load external scripts');
30+
},
31+
32+
recaptchaV2Script: trustedResourceUrl``,
33+
recaptchaEnterpriseScript: trustedResourceUrl``,
34+
gapiScript: trustedResourceUrl``
35+
};
2936

3037
export function _setExternalJSProvider(p: ExternalJSProvider): void {
3138
externalJSProvider = p;
3239
}
3340

3441
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-
}
3942
return externalJSProvider.loadJS(url);
4043
}
4144

4245
export function _recaptchaV2ScriptUrl(): TrustedResourceUrl {
43-
// externalJSProvider is not defined during initialization.
44-
if (!externalJSProvider) {
45-
throw new Error('ExternalJSProvider not set.');
46-
}
4746
return externalJSProvider.recaptchaV2Script;
4847
}
4948

5049
export function _recaptchaEnterpriseScriptUrl(): TrustedResourceUrl {
51-
// externalJSProvider is not defined during initialization.
52-
if (!externalJSProvider) {
53-
throw new Error('ExternalJSProvider not set.');
54-
}
5550
return externalJSProvider.recaptchaEnterpriseScript;
5651
}
5752

5853
export function _gapiScriptUrl(): TrustedResourceUrl {
59-
// externalJSProvider is not defined during initialization.
60-
if (!externalJSProvider) {
61-
throw new Error('ExternalJSProvider not set.');
62-
}
6354
return externalJSProvider.gapiScript;
6455
}
6556

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

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

3030
import { Auth } from '../../model/public_types';
3131
import { AuthInternal } from '../../model/auth';
@@ -142,12 +142,12 @@ export class RecaptchaEnterpriseVerifier {
142142
);
143143
return;
144144
}
145-
const url = jsHelpers._recaptchaEnterpriseScriptUrl();
146-
// Append site key as query parameter.
147-
const urlWithParams = appendParams(url, new Map([['render', siteKey]]));
148-
145+
let url = jsHelpers._recaptchaEnterpriseScriptUrl();
146+
if (unwrapResourceUrl(url).toString().length !== 0) {
147+
url = appendParams(url, new Map([['render', siteKey]]));
148+
}
149149
jsHelpers
150-
._loadJS(urlWithParams)
150+
._loadJS(url)
151151
.then(() => {
152152
retrieveRecaptchaToken(siteKey, resolve, reject);
153153
})

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ export class ReCaptchaLoaderImpl implements ReCaptchaLoader {
9090
resolve(recaptcha);
9191
};
9292

93-
const url = appendParams(jsHelpers._recaptchaV2ScriptUrl(), {
94-
onload: _JSLOAD_CALLBACK,
95-
render: 'explicit',
96-
hl
97-
});
93+
const url = appendParams(jsHelpers._recaptchaV2ScriptUrl(), new Map([
94+
['onload', _JSLOAD_CALLBACK],
95+
['render', 'explicit'],
96+
['hl', hl]
97+
]));
9898

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

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14237,6 +14237,11 @@ safe-stable-stringify@^2.3.1:
1423714237
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1423814238
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1423914239

14240+
safevalues@1.2.0:
14241+
version "1.2.0"
14242+
resolved "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/safevalues/-/safevalues-1.2.0.tgz#f9e646d6ebf31788004ef192d2a7d646c9896bb2"
14243+
integrity sha512-zIsuhjYvJCjfsfjoim2ab6gLKFYAnTiDSJGh0cC3T44L/4kNLL90hBG2BzrXPrHA3f8Ms8FSJ1mljKH5dVR1cw==
14244+
1424014245
sauce-connect-launcher@^1.2.7:
1424114246
version "1.3.2"
1424214247
resolved "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.2.tgz#dfc675a258550809a8eaf457eb9162b943ddbaf0"

0 commit comments

Comments
 (0)