Skip to content

Commit 0204abf

Browse files
authored
Add extra asserts around action code settings (auth-next) (#3911)
* Add extra asserts around action code settings (auth-next) * PR feedback
1 parent 2fce62a commit 0204abf

File tree

5 files changed

+138
-9
lines changed

5 files changed

+138
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/**
2+
* @license
3+
* Copyright 2020 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import { FirebaseError } from '@firebase/util';
19+
import { expect } from 'chai';
20+
21+
import { testAuth, TestAuth } from '../../../test/helpers/mock_auth';
22+
import { GetOobCodeRequest } from '../../api/authentication/email_and_password';
23+
import { _setActionCodeSettingsOnRequest } from './action_code_settings';
24+
25+
describe('core/strategies/action_code_settings', () => {
26+
let auth: TestAuth;
27+
const request: GetOobCodeRequest = {};
28+
29+
beforeEach(async () => {
30+
auth = await testAuth();
31+
});
32+
33+
it('should require a non empty continue URL', () => {
34+
expect(() =>
35+
_setActionCodeSettingsOnRequest(auth, request, {
36+
handleCodeInApp: true,
37+
iOS: {
38+
bundleId: 'my-bundle'
39+
},
40+
url: '',
41+
dynamicLinkDomain: 'fdl-domain'
42+
})
43+
).to.throw(FirebaseError, '(auth/invalid-continue-uri)');
44+
});
45+
46+
it('should allow undefined dynamic link URL', () => {
47+
expect(() =>
48+
_setActionCodeSettingsOnRequest(auth, request, {
49+
handleCodeInApp: true,
50+
iOS: {
51+
bundleId: 'my-´bundle'
52+
},
53+
url: 'my-url'
54+
})
55+
).to.not.throw();
56+
});
57+
58+
it('should require a non empty dynamic link URL', () => {
59+
expect(() =>
60+
_setActionCodeSettingsOnRequest(auth, request, {
61+
handleCodeInApp: true,
62+
iOS: {
63+
bundleId: 'my-´bundle'
64+
},
65+
url: 'my-url',
66+
dynamicLinkDomain: ''
67+
})
68+
).to.throw(FirebaseError, '(auth/invalid-dynamic-link-domain)');
69+
});
70+
71+
it('should require a non-empty bundle ID', () => {
72+
expect(() =>
73+
_setActionCodeSettingsOnRequest(auth, request, {
74+
handleCodeInApp: true,
75+
iOS: {
76+
bundleId: ''
77+
},
78+
url: 'my-url',
79+
dynamicLinkDomain: 'fdl-domain'
80+
})
81+
).to.throw(FirebaseError, '(auth/missing-ios-bundle-id)');
82+
});
83+
84+
it('should require a non-empty package name', () => {
85+
expect(() =>
86+
_setActionCodeSettingsOnRequest(auth, request, {
87+
handleCodeInApp: true,
88+
android: {
89+
packageName: ''
90+
},
91+
url: 'my-url',
92+
dynamicLinkDomain: 'fdl-domain'
93+
})
94+
).to.throw(FirebaseError, '(auth/missing-android-pkg-name)');
95+
});
96+
});

packages-exp/auth-exp/src/core/strategies/action_code_settings.ts

+35-2
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,56 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { ActionCodeSettings } from '@firebase/auth-types-exp';
18+
import { ActionCodeSettings, Auth } from '@firebase/auth-types-exp';
1919

2020
import { GetOobCodeRequest } from '../../api/authentication/email_and_password';
21+
import { AuthErrorCode } from '../errors';
22+
import { assert } from '../util/assert';
2123

22-
export function setActionCodeSettingsOnRequest(
24+
export function _setActionCodeSettingsOnRequest(
25+
auth: Auth,
2326
request: GetOobCodeRequest,
2427
actionCodeSettings: ActionCodeSettings
2528
): void {
29+
assert(
30+
actionCodeSettings.url.length > 0,
31+
AuthErrorCode.INVALID_CONTINUE_URI,
32+
{
33+
appName: auth.name
34+
}
35+
);
36+
assert(
37+
typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||
38+
actionCodeSettings.dynamicLinkDomain.length > 0,
39+
AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN,
40+
{
41+
appName: auth.name
42+
}
43+
);
44+
2645
request.continueUrl = actionCodeSettings.url;
2746
request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;
2847
request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;
2948

3049
if (actionCodeSettings.iOS) {
50+
assert(
51+
actionCodeSettings.iOS.bundleId.length > 0,
52+
AuthErrorCode.MISSING_IOS_BUNDLE_ID,
53+
{
54+
appName: auth.name
55+
}
56+
);
3157
request.iosBundleId = actionCodeSettings.iOS.bundleId;
3258
}
3359

3460
if (actionCodeSettings.android) {
61+
assert(
62+
actionCodeSettings.android.packageName.length > 0,
63+
AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME,
64+
{
65+
appName: auth.name
66+
}
67+
);
3568
request.androidInstallApp = actionCodeSettings.android.installApp;
3669
request.androidMinimumVersionCode =
3770
actionCodeSettings.android.minimumVersion;

packages-exp/auth-exp/src/core/strategies/email.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
import * as api from '../../api/authentication/email_and_password';
2525
import { User } from '../../model/user';
2626
import { _getCurrentUrl, _isHttpOrHttps } from '../util/location';
27-
import { setActionCodeSettingsOnRequest } from './action_code_settings';
27+
import { _setActionCodeSettingsOnRequest } from './action_code_settings';
2828
import { _castAuth } from '../auth/auth_impl';
2929

3030
export async function fetchSignInMethodsForEmail(
@@ -56,7 +56,7 @@ export async function sendEmailVerification(
5656
idToken
5757
};
5858
if (actionCodeSettings) {
59-
setActionCodeSettingsOnRequest(request, actionCodeSettings);
59+
_setActionCodeSettingsOnRequest(user.auth, request, actionCodeSettings);
6060
}
6161

6262
const { email } = await api.sendEmailVerification(user.auth, request);
@@ -79,7 +79,7 @@ export async function verifyBeforeUpdateEmail(
7979
newEmail
8080
};
8181
if (actionCodeSettings) {
82-
setActionCodeSettingsOnRequest(request, actionCodeSettings);
82+
_setActionCodeSettingsOnRequest(user.auth, request, actionCodeSettings);
8383
}
8484

8585
const { email } = await api.verifyAndChangeEmail(user.auth, request);

packages-exp/auth-exp/src/core/strategies/email_and_password.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { MultiFactorInfo } from '../../mfa/mfa_info';
2424
import { EmailAuthProvider } from '../providers/email';
2525
import { UserCredentialImpl } from '../user/user_credential_impl';
2626
import { assert } from '../util/assert';
27-
import { setActionCodeSettingsOnRequest } from './action_code_settings';
27+
import { _setActionCodeSettingsOnRequest } from './action_code_settings';
2828
import { signInWithCredential } from './credential';
2929
import { _castAuth } from '../auth/auth_impl';
3030
import { AuthErrorCode } from '../errors';
@@ -39,7 +39,7 @@ export async function sendPasswordResetEmail(
3939
email
4040
};
4141
if (actionCodeSettings) {
42-
setActionCodeSettingsOnRequest(request, actionCodeSettings);
42+
_setActionCodeSettingsOnRequest(auth, request, actionCodeSettings);
4343
}
4444

4545
await authentication.sendPasswordResetEmail(auth, request);

packages-exp/auth-exp/src/core/strategies/email_link.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import * as api from '../../api/authentication/email_and_password';
2121
import { ActionCodeURL } from '../action_code_url';
2222
import { EmailAuthProvider } from '../providers/email';
2323
import { _getCurrentUrl } from '../util/location';
24-
import { setActionCodeSettingsOnRequest } from './action_code_settings';
24+
import { _setActionCodeSettingsOnRequest } from './action_code_settings';
2525
import { signInWithCredential } from './credential';
2626
import { AuthErrorCode } from '../errors';
2727
import { assert } from '../util/assert';
@@ -36,7 +36,7 @@ export async function sendSignInLinkToEmail(
3636
email
3737
};
3838
if (actionCodeSettings) {
39-
setActionCodeSettingsOnRequest(request, actionCodeSettings);
39+
_setActionCodeSettingsOnRequest(auth, request, actionCodeSettings);
4040
}
4141

4242
await api.sendSignInLinkToEmail(auth, request);

0 commit comments

Comments
 (0)