Skip to content

Commit 20444f9

Browse files
committed
Add extra asserts around action code settings (auth-next)
1 parent 49378bf commit 20444f9

File tree

5 files changed

+155
-8
lines changed

5 files changed

+155
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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+
import { ActionCodeSettings } from '@firebase/auth-types-exp';
21+
22+
import { testAuth, TestAuth } from '../../../test/helpers/mock_auth';
23+
import { GetOobCodeRequest } from '../../api/authentication/email_and_password';
24+
import { setActionCodeSettingsOnRequest_ } from './action_code_settings';
25+
26+
describe('core/strategies/action_code_settings', () => {
27+
let auth: TestAuth;
28+
const request: GetOobCodeRequest = {
29+
};
30+
31+
beforeEach(async () => {
32+
auth = await testAuth();
33+
});
34+
35+
36+
it('should require a continue URL', () => {
37+
expect(() =>
38+
setActionCodeSettingsOnRequest_(auth, request, {
39+
handleCodeInApp: true,
40+
iOS: {
41+
bundleId: 'my-bundle'
42+
},
43+
dynamicLinkDomain: 'fdl-domain'
44+
} as unknown as ActionCodeSettings)
45+
).to.throw(
46+
FirebaseError,
47+
'(auth/missing-continue-uri)'
48+
);
49+
});
50+
51+
it('should require a non empty continue URL', () => {
52+
expect(() =>
53+
setActionCodeSettingsOnRequest_(auth, request, {
54+
handleCodeInApp: true,
55+
iOS: {
56+
bundleId: 'my-bundle'
57+
},
58+
url: '',
59+
dynamicLinkDomain: 'fdl-domain'
60+
})
61+
).to.throw(
62+
FirebaseError,
63+
'(auth/invalid-continue-uri)'
64+
);
65+
});
66+
67+
it('should allow undefined dynamic link URL', () => {
68+
expect(() =>
69+
setActionCodeSettingsOnRequest_(auth, request, {
70+
handleCodeInApp: true,
71+
iOS: {
72+
bundleId: 'my-´bundle'
73+
},
74+
url: 'my-url'
75+
})
76+
).to.not.throw();
77+
});
78+
79+
it('should require a non empty dynamic link URL', () => {
80+
expect(() =>
81+
setActionCodeSettingsOnRequest_(auth, request, {
82+
handleCodeInApp: true,
83+
iOS: {
84+
bundleId: 'my-´bundle'
85+
},
86+
url: 'my-url',
87+
dynamicLinkDomain: ''
88+
})
89+
).to.throw(
90+
FirebaseError,
91+
'(auth/invalid-dynamic-link-domain)'
92+
);
93+
});
94+
95+
it('should require a non-empty bundle ID', () => {
96+
expect(() =>
97+
setActionCodeSettingsOnRequest_(auth, request, {
98+
handleCodeInApp: true,
99+
iOS: {
100+
bundleId: ''
101+
},
102+
url: 'my-url',
103+
dynamicLinkDomain: 'fdl-domain'
104+
})
105+
).to.throw(
106+
FirebaseError,
107+
'(auth/missing-ios-bundle-id)'
108+
);
109+
});
110+
111+
it('should require a non-empty package name', () => {
112+
expect(() =>
113+
setActionCodeSettingsOnRequest_(auth, request, {
114+
handleCodeInApp: true,
115+
android: {
116+
packageName: ''
117+
},
118+
url: 'my-url',
119+
dynamicLinkDomain: 'fdl-domain'
120+
})
121+
).to.throw(
122+
FirebaseError,
123+
'(auth/missing-android-pkg-name)'
124+
);
125+
});
126+
});

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

+22-1
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,41 @@
1818
import { ActionCodeSettings } 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';
23+
import { AuthCore } from '../../model/auth';
2124

22-
export function setActionCodeSettingsOnRequest(
25+
export function setActionCodeSettingsOnRequest_(
26+
auth: AuthCore,
2327
request: GetOobCodeRequest,
2428
actionCodeSettings: ActionCodeSettings
2529
): void {
30+
assert(typeof actionCodeSettings.url !== 'undefined', AuthErrorCode.MISSING_CONTINUE_URI, {
31+
appName: auth.name
32+
});
33+
assert(actionCodeSettings.url.length > 0, AuthErrorCode.INVALID_CONTINUE_URI, {
34+
appName: auth.name
35+
});
36+
assert(typeof actionCodeSettings.dynamicLinkDomain === 'undefined' ||
37+
actionCodeSettings.dynamicLinkDomain.length > 0, AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN, {
38+
appName: auth.name
39+
});
40+
2641
request.continueUrl = actionCodeSettings.url;
2742
request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain;
2843
request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp;
2944

3045
if (actionCodeSettings.iOS) {
46+
assert(actionCodeSettings.iOS.bundleId.length > 0, AuthErrorCode.MISSING_IOS_BUNDLE_ID, {
47+
appName: auth.name
48+
});
3149
request.iosBundleId = actionCodeSettings.iOS.bundleId;
3250
}
3351

3452
if (actionCodeSettings.android) {
53+
assert(actionCodeSettings.android.packageName.length > 0, AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME, {
54+
appName: auth.name
55+
});
3556
request.androidInstallApp = actionCodeSettings.android.installApp;
3657
request.androidMinimumVersionCode =
3758
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)