@tern-secure/auth 1.1.0-canary.v20251030165007 → 1.1.0-canary.v20251125170702
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/492_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/687_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/68_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/framework_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
- package/dist/signin_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.css +2 -0
- package/dist/signup_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/ternsecure.browser.js +30 -0
- package/dist/ternsecure.css +2 -0
- package/dist/ternsecure.js +17 -0
- package/dist/ternsecure.mjs +17 -0
- package/dist/types/auth/AuthCookieManager.d.ts +17 -6
- package/dist/types/auth/cookies/authTime_cookie.d.ts +6 -0
- package/dist/types/index.browser.d.ts +1 -0
- package/dist/types/index.d.ts +3 -10
- package/dist/types/instance/c_coreApiClient.d.ts +2 -2
- package/dist/types/instance/constants.d.ts +3 -0
- package/dist/types/instance/coreApiClient.d.ts +0 -1
- package/dist/types/instance/events.d.ts +0 -1
- package/dist/types/instance/{TernAuth.d.ts → ternsecure.d.ts} +31 -19
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/resources/Base.d.ts +16 -3
- package/dist/types/resources/Error.d.ts +0 -1
- package/dist/types/resources/Session.d.ts +2 -2
- package/dist/types/resources/SignIn.d.ts +27 -10
- package/dist/types/resources/SignUp.d.ts +12 -10
- package/dist/types/resources/internal.d.ts +1 -2
- package/dist/types/ui/Renderer.d.ts +26 -0
- package/dist/types/ui/common/ProviderInitialIcon.d.ts +6 -0
- package/dist/types/ui/common/VerificationCodeCard.d.ts +12 -0
- package/dist/types/ui/common/VerificationLinkCard.d.ts +7 -0
- package/dist/types/ui/common/constants.d.ts +8 -0
- package/dist/types/ui/common/index.d.ts +3 -0
- package/dist/types/ui/components/sign-in/ResetPassword.d.ts +1 -0
- package/dist/types/ui/components/sign-in/ResetPasswordSuccess.d.ts +1 -0
- package/dist/types/ui/components/sign-in/SignIn.d.ts +4 -0
- package/dist/types/ui/components/sign-in/SignInEmailLinkCard.d.ts +2 -0
- package/dist/types/ui/components/sign-in/SignInFactorOne.d.ts +1 -0
- package/dist/types/ui/components/sign-in/SignInFactorOneCodeForm.d.ts +7 -0
- package/dist/types/ui/components/sign-in/SignInFactorOnePasswordCard.d.ts +6 -0
- package/dist/types/ui/components/sign-in/SignInFactorOnePhoneCodeCard.d.ts +7 -0
- package/dist/types/ui/components/sign-in/SignInPassword.d.ts +8 -0
- package/dist/types/ui/components/sign-in/SignInSocialButtons.d.ts +1 -0
- package/dist/types/ui/components/sign-in/SignInStart.d.ts +7 -0
- package/dist/types/ui/components/sign-in/SignInVerifyEmail.d.ts +1 -0
- package/dist/types/ui/components/sign-in/index.d.ts +4 -0
- package/dist/types/ui/components/sign-up/SignUp.d.ts +8 -0
- package/dist/types/ui/components/sign-up/SignUpEmailLinkCard.d.ts +2 -0
- package/dist/types/ui/components/sign-up/SignUpSocialButtons.d.ts +1 -0
- package/dist/types/ui/components/sign-up/SignUpStart.d.ts +1 -0
- package/dist/types/ui/components/sign-up/SignUpVerifyEmail.d.ts +1 -0
- package/dist/types/ui/components/sign-up/index.d.ts +2 -0
- package/dist/types/ui/components/sign-up/util.d.ts +14 -0
- package/dist/types/ui/components/user-button/index.d.ts +1 -0
- package/dist/types/ui/components/user-button/userButton.d.ts +1 -0
- package/dist/types/ui/ctx/TernAuthContext.d.ts +4 -0
- package/dist/types/ui/ctx/TernAuthUIComponentCtx.d.ts +8 -0
- package/dist/types/ui/ctx/TernSecureContextWrapper.d.ts +8 -0
- package/dist/types/ui/ctx/TernSecureOptions.d.ts +10 -0
- package/dist/types/ui/ctx/components/SignIn.d.ts +21 -0
- package/dist/types/ui/ctx/components/SignUp.d.ts +14 -0
- package/dist/types/ui/ctx/components/UserButton.d.ts +10 -0
- package/dist/types/ui/ctx/components/index.d.ts +3 -0
- package/dist/types/ui/ctx/index.d.ts +4 -0
- package/dist/types/ui/ctx/utils.d.ts +3 -0
- package/dist/types/ui/customize/FieldControl.d.ts +15 -0
- package/dist/types/ui/customize/FieldLabelControl.d.ts +11 -0
- package/dist/types/ui/customize/Form.d.ts +36 -0
- package/dist/types/ui/elements/CodeControl.d.ts +47 -0
- package/dist/types/ui/elements/ErrorCard.d.ts +10 -0
- package/dist/types/ui/elements/LoadingCard.d.ts +1 -0
- package/dist/types/ui/elements/RouterLink.d.ts +42 -0
- package/dist/types/ui/elements/SocialButtons.d.ts +6 -0
- package/dist/types/ui/elements/TimerButton.d.ts +9 -0
- package/dist/types/ui/elements/alert.d.ts +8 -0
- package/dist/types/ui/elements/avatar.d.ts +6 -0
- package/dist/types/ui/elements/button.d.ts +10 -0
- package/dist/types/ui/elements/card.d.ts +9 -0
- package/dist/types/ui/elements/ctx/CardStateCtx.d.ts +26 -0
- package/dist/types/ui/elements/ctx/index.d.ts +1 -0
- package/dist/types/ui/elements/field.d.ts +24 -0
- package/dist/types/ui/elements/index.d.ts +16 -0
- package/dist/types/ui/elements/input.d.ts +3 -0
- package/dist/types/ui/elements/label.d.ts +4 -0
- package/dist/types/ui/elements/separator.d.ts +4 -0
- package/dist/types/ui/hooks/index.d.ts +6 -0
- package/dist/types/ui/hooks/useEmailLink.d.ts +11 -0
- package/dist/types/ui/hooks/useFetch.d.ts +44 -0
- package/dist/types/ui/hooks/useLoadingStatus.d.ts +14 -0
- package/dist/types/ui/hooks/useNavigateToFlowStart.d.ts +3 -0
- package/dist/types/ui/hooks/useSafeState.d.ts +9 -0
- package/dist/types/ui/hooks/useWindowEventListener.d.ts +3 -0
- package/dist/types/ui/icons/index.d.ts +13 -0
- package/dist/types/ui/lazyLoading/common.d.ts +2 -0
- package/dist/types/ui/lazyLoading/components.d.ts +11 -0
- package/dist/types/ui/lazyLoading/providersCtx.d.ts +26 -0
- package/dist/types/ui/portal/index.d.ts +12 -0
- package/dist/types/ui/router/BaseRouter.d.ts +21 -0
- package/dist/types/ui/router/HashRouter.d.ts +8 -0
- package/dist/types/ui/router/PathRouter.d.ts +8 -0
- package/dist/types/ui/router/Route.d.ts +19 -0
- package/dist/types/ui/router/RouterCtx.d.ts +32 -0
- package/dist/types/ui/router/Switch.d.ts +4 -0
- package/dist/types/ui/router/index.d.ts +7 -0
- package/dist/types/ui/router/newPaths.d.ts +1 -0
- package/dist/types/ui/router/pathToRegexp.d.ts +127 -0
- package/dist/types/ui/types.d.ts +18 -0
- package/dist/types/ui/utils/form.d.ts +19 -0
- package/dist/types/ui/utils/index.d.ts +1 -0
- package/dist/types/ui/utils/sleep.d.ts +1 -0
- package/dist/types/utils/construct.d.ts +3 -1
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/normalizeRoutingOptions.d.ts +6 -0
- package/dist/types/utils/path.d.ts +0 -1
- package/dist/types/utils/querystring.d.ts +0 -1
- package/dist/types/utils/redirectUrls.d.ts +4 -9
- package/dist/types/utils/windowNavigate.d.ts +0 -1
- package/dist/ui-common_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/userbutton_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/dist/vendors_ternsecure_f36de9_1.1.0-canary.v20251125170702.js +1 -0
- package/package.json +64 -25
- package/dist/cjs/auth/AuthCookieManager.js +0 -100
- package/dist/cjs/auth/AuthCookieManager.js.map +0 -1
- package/dist/cjs/auth/cookies/session.js +0 -83
- package/dist/cjs/auth/cookies/session.js.map +0 -1
- package/dist/cjs/auth/request.js +0 -159
- package/dist/cjs/auth/request.js.map +0 -1
- package/dist/cjs/global.d.js +0 -2
- package/dist/cjs/global.d.js.map +0 -1
- package/dist/cjs/index.js +0 -47
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/instance/TernAuth.js +0 -562
- package/dist/cjs/instance/TernAuth.js.map +0 -1
- package/dist/cjs/instance/TernAuthServer.js +0 -95
- package/dist/cjs/instance/TernAuthServer.js.map +0 -1
- package/dist/cjs/instance/c_coreApiClient.js +0 -264
- package/dist/cjs/instance/c_coreApiClient.js.map +0 -1
- package/dist/cjs/instance/coreApiClient.js +0 -255
- package/dist/cjs/instance/coreApiClient.js.map +0 -1
- package/dist/cjs/instance/events.js +0 -39
- package/dist/cjs/instance/events.js.map +0 -1
- package/dist/cjs/instance/jwtClient.js +0 -72
- package/dist/cjs/instance/jwtClient.js.map +0 -1
- package/dist/cjs/resources/Base.js +0 -137
- package/dist/cjs/resources/Base.js.map +0 -1
- package/dist/cjs/resources/Error.js +0 -31
- package/dist/cjs/resources/Error.js.map +0 -1
- package/dist/cjs/resources/Session.js +0 -105
- package/dist/cjs/resources/Session.js.map +0 -1
- package/dist/cjs/resources/SignIn.js +0 -256
- package/dist/cjs/resources/SignIn.js.map +0 -1
- package/dist/cjs/resources/SignUp.js +0 -72
- package/dist/cjs/resources/SignUp.js.map +0 -1
- package/dist/cjs/resources/Token.js +0 -32
- package/dist/cjs/resources/Token.js.map +0 -1
- package/dist/cjs/resources/UserData.js +0 -43
- package/dist/cjs/resources/UserData.js.map +0 -1
- package/dist/cjs/resources/cookie.js +0 -154
- package/dist/cjs/resources/cookie.js.map +0 -1
- package/dist/cjs/resources/index.js +0 -23
- package/dist/cjs/resources/index.js.map +0 -1
- package/dist/cjs/resources/internal.js +0 -35
- package/dist/cjs/resources/internal.js.map +0 -1
- package/dist/cjs/utils/construct.js +0 -253
- package/dist/cjs/utils/construct.js.map +0 -1
- package/dist/cjs/utils/index.js +0 -29
- package/dist/cjs/utils/index.js.map +0 -1
- package/dist/cjs/utils/jwt.js +0 -46
- package/dist/cjs/utils/jwt.js.map +0 -1
- package/dist/cjs/utils/mapDecode.js +0 -33
- package/dist/cjs/utils/mapDecode.js.map +0 -1
- package/dist/cjs/utils/path.js +0 -33
- package/dist/cjs/utils/path.js.map +0 -1
- package/dist/cjs/utils/querystring.js +0 -70
- package/dist/cjs/utils/querystring.js.map +0 -1
- package/dist/cjs/utils/redirectUrls.js +0 -156
- package/dist/cjs/utils/redirectUrls.js.map +0 -1
- package/dist/cjs/utils/windowNavigate.js +0 -45
- package/dist/cjs/utils/windowNavigate.js.map +0 -1
- package/dist/esm/auth/AuthCookieManager.js +0 -76
- package/dist/esm/auth/AuthCookieManager.js.map +0 -1
- package/dist/esm/auth/cookies/session.js +0 -58
- package/dist/esm/auth/cookies/session.js.map +0 -1
- package/dist/esm/auth/request.js +0 -134
- package/dist/esm/auth/request.js.map +0 -1
- package/dist/esm/global.d.js +0 -1
- package/dist/esm/global.d.js.map +0 -1
- package/dist/esm/index.js +0 -16
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/instance/TernAuth.js +0 -548
- package/dist/esm/instance/TernAuth.js.map +0 -1
- package/dist/esm/instance/TernAuthServer.js +0 -73
- package/dist/esm/instance/TernAuthServer.js.map +0 -1
- package/dist/esm/instance/c_coreApiClient.js +0 -236
- package/dist/esm/instance/c_coreApiClient.js.map +0 -1
- package/dist/esm/instance/coreApiClient.js +0 -226
- package/dist/esm/instance/coreApiClient.js.map +0 -1
- package/dist/esm/instance/events.js +0 -14
- package/dist/esm/instance/events.js.map +0 -1
- package/dist/esm/instance/jwtClient.js +0 -47
- package/dist/esm/instance/jwtClient.js.map +0 -1
- package/dist/esm/resources/Base.js +0 -113
- package/dist/esm/resources/Base.js.map +0 -1
- package/dist/esm/resources/Error.js +0 -9
- package/dist/esm/resources/Error.js.map +0 -1
- package/dist/esm/resources/Session.js +0 -81
- package/dist/esm/resources/Session.js.map +0 -1
- package/dist/esm/resources/SignIn.js +0 -240
- package/dist/esm/resources/SignIn.js.map +0 -1
- package/dist/esm/resources/SignUp.js +0 -48
- package/dist/esm/resources/SignUp.js.map +0 -1
- package/dist/esm/resources/Token.js +0 -8
- package/dist/esm/resources/Token.js.map +0 -1
- package/dist/esm/resources/UserData.js +0 -19
- package/dist/esm/resources/UserData.js.map +0 -1
- package/dist/esm/resources/cookie.js +0 -130
- package/dist/esm/resources/cookie.js.map +0 -1
- package/dist/esm/resources/index.js +0 -2
- package/dist/esm/resources/index.js.map +0 -1
- package/dist/esm/resources/internal.js +0 -8
- package/dist/esm/resources/internal.js.map +0 -1
- package/dist/esm/utils/construct.js +0 -215
- package/dist/esm/utils/construct.js.map +0 -1
- package/dist/esm/utils/index.js +0 -5
- package/dist/esm/utils/index.js.map +0 -1
- package/dist/esm/utils/jwt.js +0 -22
- package/dist/esm/utils/jwt.js.map +0 -1
- package/dist/esm/utils/mapDecode.js +0 -9
- package/dist/esm/utils/mapDecode.js.map +0 -1
- package/dist/esm/utils/path.js +0 -9
- package/dist/esm/utils/path.js.map +0 -1
- package/dist/esm/utils/querystring.js +0 -45
- package/dist/esm/utils/querystring.js.map +0 -1
- package/dist/esm/utils/redirectUrls.js +0 -132
- package/dist/esm/utils/redirectUrls.js.map +0 -1
- package/dist/esm/utils/windowNavigate.js +0 -19
- package/dist/esm/utils/windowNavigate.js.map +0 -1
- package/dist/types/auth/AuthCookieManager.d.ts.map +0 -1
- package/dist/types/auth/cookies/session.d.ts +0 -8
- package/dist/types/auth/cookies/session.d.ts.map +0 -1
- package/dist/types/auth/request.d.ts +0 -49
- package/dist/types/auth/request.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/instance/TernAuth.d.ts.map +0 -1
- package/dist/types/instance/TernAuthServer.d.ts +0 -32
- package/dist/types/instance/TernAuthServer.d.ts.map +0 -1
- package/dist/types/instance/c_coreApiClient.d.ts.map +0 -1
- package/dist/types/instance/coreApiClient.d.ts.map +0 -1
- package/dist/types/instance/events.d.ts.map +0 -1
- package/dist/types/instance/jwtClient.d.ts +0 -22
- package/dist/types/instance/jwtClient.d.ts.map +0 -1
- package/dist/types/resources/Base.d.ts.map +0 -1
- package/dist/types/resources/Error.d.ts.map +0 -1
- package/dist/types/resources/Session.d.ts.map +0 -1
- package/dist/types/resources/SignIn.d.ts.map +0 -1
- package/dist/types/resources/SignUp.d.ts.map +0 -1
- package/dist/types/resources/Token.d.ts +0 -5
- package/dist/types/resources/Token.d.ts.map +0 -1
- package/dist/types/resources/UserData.d.ts +0 -8
- package/dist/types/resources/UserData.d.ts.map +0 -1
- package/dist/types/resources/cookie.d.ts +0 -24
- package/dist/types/resources/cookie.d.ts.map +0 -1
- package/dist/types/resources/index.d.ts +0 -2
- package/dist/types/resources/index.d.ts.map +0 -1
- package/dist/types/resources/internal.d.ts.map +0 -1
- package/dist/types/utils/construct.d.ts.map +0 -1
- package/dist/types/utils/index.d.ts.map +0 -1
- package/dist/types/utils/jwt.d.ts +0 -12
- package/dist/types/utils/jwt.d.ts.map +0 -1
- package/dist/types/utils/mapDecode.d.ts +0 -4
- package/dist/types/utils/mapDecode.d.ts.map +0 -1
- package/dist/types/utils/path.d.ts.map +0 -1
- package/dist/types/utils/querystring.d.ts.map +0 -1
- package/dist/types/utils/redirectUrls.d.ts.map +0 -1
- package/dist/types/utils/windowNavigate.d.ts.map +0 -1
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { TernSecureBase } from "./Base";
|
|
2
|
-
class Cookie extends TernSecureBase {
|
|
3
|
-
pathroot = "cookies";
|
|
4
|
-
idToken;
|
|
5
|
-
sessionToken;
|
|
6
|
-
refreshToken;
|
|
7
|
-
customToken;
|
|
8
|
-
constructor() {
|
|
9
|
-
super();
|
|
10
|
-
}
|
|
11
|
-
getTokenInCookie = (tokenName) => {
|
|
12
|
-
return this.baseGet({
|
|
13
|
-
path: `${this.pathroot}/get`,
|
|
14
|
-
search: { tokenName }
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
parseTokenResponse = (apiResponse, tokenType) => {
|
|
18
|
-
if (!apiResponse) {
|
|
19
|
-
return {
|
|
20
|
-
success: false,
|
|
21
|
-
error: `${tokenType} not found in httpOnly cookies`
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
const { success, token, error } = apiResponse;
|
|
25
|
-
return {
|
|
26
|
-
success,
|
|
27
|
-
token,
|
|
28
|
-
error
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
getIdToken = async () => {
|
|
32
|
-
const res = await this.getTokenInCookie("idToken");
|
|
33
|
-
return this.parseTokenResponse(res, "idToken");
|
|
34
|
-
};
|
|
35
|
-
getSessionToken = async () => {
|
|
36
|
-
var _a;
|
|
37
|
-
try {
|
|
38
|
-
const response = await this.getTokenInCookie("sessionToken");
|
|
39
|
-
if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
|
|
40
|
-
return {
|
|
41
|
-
success: false,
|
|
42
|
-
error: "Session token not found in httpOnly cookies"
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
return {
|
|
46
|
-
success: true,
|
|
47
|
-
token: response.response.token
|
|
48
|
-
};
|
|
49
|
-
} catch (error) {
|
|
50
|
-
return {
|
|
51
|
-
success: false,
|
|
52
|
-
error: `Failed to retrieve session token: ${error instanceof Error ? error.message : String(error)}`
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
getRefreshToken = async () => {
|
|
57
|
-
var _a;
|
|
58
|
-
try {
|
|
59
|
-
const response = await this.getTokenInCookie("refreshToken");
|
|
60
|
-
if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
|
|
61
|
-
return {
|
|
62
|
-
success: false,
|
|
63
|
-
error: "Refresh token not found in httpOnly cookies"
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return {
|
|
67
|
-
success: true,
|
|
68
|
-
token: response.response.token
|
|
69
|
-
};
|
|
70
|
-
} catch (error) {
|
|
71
|
-
return {
|
|
72
|
-
success: false,
|
|
73
|
-
error: `Failed to retrieve refresh token: ${error instanceof Error ? error.message : String(error)}`
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
getCustomToken = async () => {
|
|
78
|
-
var _a;
|
|
79
|
-
try {
|
|
80
|
-
const response = await this.getTokenInCookie("customToken");
|
|
81
|
-
if (!response || !((_a = response.response) == null ? void 0 : _a.token)) {
|
|
82
|
-
return {
|
|
83
|
-
success: false,
|
|
84
|
-
error: "Custom token not found in httpOnly cookies"
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
success: true,
|
|
89
|
-
token: response.response.token
|
|
90
|
-
};
|
|
91
|
-
} catch (error) {
|
|
92
|
-
return {
|
|
93
|
-
success: false,
|
|
94
|
-
error: `Failed to retrieve custom token: ${error instanceof Error ? error.message : String(error)}`
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
getAllTokens = async () => {
|
|
99
|
-
const [idToken, sessionToken, refreshToken, customToken] = await Promise.all([
|
|
100
|
-
this.getIdToken(),
|
|
101
|
-
this.getSessionToken(),
|
|
102
|
-
this.getRefreshToken(),
|
|
103
|
-
this.getCustomToken()
|
|
104
|
-
]);
|
|
105
|
-
return {
|
|
106
|
-
idToken,
|
|
107
|
-
sessionToken,
|
|
108
|
-
refreshToken,
|
|
109
|
-
customToken
|
|
110
|
-
};
|
|
111
|
-
};
|
|
112
|
-
hasToken = async (tokenType) => {
|
|
113
|
-
switch (tokenType) {
|
|
114
|
-
case "idToken":
|
|
115
|
-
return (await this.getIdToken()).success;
|
|
116
|
-
case "sessionToken":
|
|
117
|
-
return (await this.getSessionToken()).success;
|
|
118
|
-
case "refreshToken":
|
|
119
|
-
return (await this.getRefreshToken()).success;
|
|
120
|
-
case "customToken":
|
|
121
|
-
return (await this.getCustomToken()).success;
|
|
122
|
-
default:
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
export {
|
|
128
|
-
Cookie
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=cookie.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/resources/cookie.ts"],"sourcesContent":["import type { CookieResource } from '@tern-secure/types';\n\n//import { eventBus, events } from '../instance/events';\nimport { TernSecureBase } from './Base';\n\nexport type TokenResult = {\n success: boolean;\n token?: string;\n error?: string;\n};\n\ntype CookieTokenResponse = {\n success: boolean;\n token?: string;\n error?: string;\n};\n\nexport class Cookie extends TernSecureBase implements CookieResource {\n pathroot = 'cookies';\n\n idToken?: string;\n sessionToken?: string;\n refreshToken?: string;\n customToken?: string;\n\n constructor() {\n super();\n }\n\n private getTokenInCookie = (tokenName: string) => {\n return this.baseGet({\n path: `${this.pathroot}/get`,\n search: { tokenName },\n });\n };\n\n\n private parseTokenResponse = (\n apiResponse: any,\n tokenType: string,\n ): TokenResult => {\n if (!apiResponse) {\n return {\n success: false,\n error: `${tokenType} not found in httpOnly cookies`,\n };\n }\n\n const { success, token, error } = apiResponse as CookieTokenResponse;\n\n return {\n success,\n token,\n error,\n };\n };\n\n getIdToken = async (): Promise<TokenResult> => {\n const res = await this.getTokenInCookie('idToken');\n //eventBus.emit(events.TokenJwt, { tokenType: 'idToken', response: res });\n return this.parseTokenResponse(res, 'idToken');\n };\n\n getSessionToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('sessionToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Session token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve session token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getRefreshToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('refreshToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Refresh token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve refresh token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getCustomToken = async (): Promise<TokenResult> => {\n try {\n const response = await this.getTokenInCookie('customToken');\n\n if (!response || !response.response?.token) {\n return {\n success: false,\n error: 'Custom token not found in httpOnly cookies',\n };\n }\n\n return {\n success: true,\n token: response.response.token,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve custom token: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n };\n\n getAllTokens = async (): Promise<Record<string, TokenResult>> => {\n const [idToken, sessionToken, refreshToken, customToken] = await Promise.all([\n this.getIdToken(),\n this.getSessionToken(),\n this.getRefreshToken(),\n this.getCustomToken(),\n ]);\n\n return {\n idToken,\n sessionToken,\n refreshToken,\n customToken,\n };\n };\n\n hasToken = async (tokenType: keyof CookieResource): Promise<boolean> => {\n switch (tokenType) {\n case 'idToken':\n return (await this.getIdToken()).success;\n case 'sessionToken':\n return (await this.getSessionToken()).success;\n case 'refreshToken':\n return (await this.getRefreshToken()).success;\n case 'customToken':\n return (await this.getCustomToken()).success;\n default:\n return false;\n }\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/resources/index.ts"],"sourcesContent":["export * from './SignIn';"],"mappings":"AAAA,cAAc;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/resources/internal.ts"],"sourcesContent":["export type { TernSecureAuth } from '../instance/TernAuth';\nexport * from './Session';\nexport * from './SignUp';\nexport * from './SignIn';\nexport * from './Base';\nexport * from '../auth/AuthCookieManager';\nexport * from '../utils';\nexport * from './Error';\n"],"mappings":"AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { camelToSnake } from "@tern-secure/shared/caseUtils";
|
|
2
|
-
import { globs } from "@tern-secure/shared/globs";
|
|
3
|
-
import { logger } from "@tern-secure/shared/logger";
|
|
4
|
-
import { joinPaths } from "./path";
|
|
5
|
-
import { getQueryParams } from "./querystring";
|
|
6
|
-
const DUMMY_URL_BASE = "http://ternsecure-dummy";
|
|
7
|
-
const BANNED_URI_PROTOCOLS = ["javascript:"];
|
|
8
|
-
function buildURL(params, options = {}) {
|
|
9
|
-
const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest } = params;
|
|
10
|
-
let baseFallback = "";
|
|
11
|
-
if (typeof window !== "undefined" && !!window.location) {
|
|
12
|
-
baseFallback = window.location.href;
|
|
13
|
-
} else {
|
|
14
|
-
baseFallback = "http://react-native-fake-base-url";
|
|
15
|
-
}
|
|
16
|
-
const url = new URL(base || "", baseFallback);
|
|
17
|
-
if (searchParams instanceof URLSearchParams) {
|
|
18
|
-
searchParams.forEach((value, key) => {
|
|
19
|
-
if (value !== null && value !== void 0) {
|
|
20
|
-
url.searchParams.set(camelToSnake(key), value);
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
Object.assign(url, rest);
|
|
25
|
-
if (hashPath || hashSearch || hashSearchParams) {
|
|
26
|
-
const dummyUrlForHash = new URL(DUMMY_URL_BASE + url.hash.substring(1));
|
|
27
|
-
dummyUrlForHash.pathname = joinPaths(dummyUrlForHash.pathname, hashPath || "");
|
|
28
|
-
const searchParamsFromHashSearchString = getQueryParams(hashSearch || "");
|
|
29
|
-
for (const [key, val] of Object.entries(searchParamsFromHashSearchString)) {
|
|
30
|
-
dummyUrlForHash.searchParams.append(key, val);
|
|
31
|
-
}
|
|
32
|
-
if (hashSearchParams) {
|
|
33
|
-
const paramsArr = Array.isArray(hashSearchParams) ? hashSearchParams : [hashSearchParams];
|
|
34
|
-
for (const _params of paramsArr) {
|
|
35
|
-
if (!(_params instanceof URLSearchParams) && typeof _params !== "object") {
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const params2 = new URLSearchParams(_params);
|
|
39
|
-
params2.forEach((value, key) => {
|
|
40
|
-
if (value !== null && value !== void 0) {
|
|
41
|
-
dummyUrlForHash.searchParams.set(camelToSnake(key), value);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
const newHash = dummyUrlForHash.href.replace(DUMMY_URL_BASE, "");
|
|
47
|
-
if (newHash !== "/") {
|
|
48
|
-
url.hash = newHash;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const { stringify, skipOrigin } = options;
|
|
52
|
-
if (stringify) {
|
|
53
|
-
return skipOrigin ? url.href.replace(url.origin, "") : url.href;
|
|
54
|
-
}
|
|
55
|
-
return url;
|
|
56
|
-
}
|
|
57
|
-
const constructFullUrl = (path) => {
|
|
58
|
-
if (typeof window === "undefined") return path;
|
|
59
|
-
const baseUrl = window.location.origin;
|
|
60
|
-
if (path.startsWith("http")) {
|
|
61
|
-
return path;
|
|
62
|
-
}
|
|
63
|
-
return `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
64
|
-
};
|
|
65
|
-
const hasRedirectLoop = (currentPath, redirectPath) => {
|
|
66
|
-
if (!currentPath || !redirectPath) return false;
|
|
67
|
-
const cleanCurrentPath = currentPath.split("?")[0];
|
|
68
|
-
const cleanRedirectPath = redirectPath.split("?")[0];
|
|
69
|
-
return cleanCurrentPath === cleanRedirectPath;
|
|
70
|
-
};
|
|
71
|
-
const urlWithRedirect = (options) => {
|
|
72
|
-
const {
|
|
73
|
-
signInUrl,
|
|
74
|
-
signInPathParam = "/sign-in",
|
|
75
|
-
currentPath,
|
|
76
|
-
signUpUrl,
|
|
77
|
-
signUpPathParam = "/sign-up"
|
|
78
|
-
} = options;
|
|
79
|
-
const baseUrl = window.location.origin;
|
|
80
|
-
if (typeof window === "undefined") {
|
|
81
|
-
return signInUrl;
|
|
82
|
-
}
|
|
83
|
-
const url = new URL(signInUrl, baseUrl);
|
|
84
|
-
if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {
|
|
85
|
-
url.searchParams.set("redirect", currentPath);
|
|
86
|
-
}
|
|
87
|
-
return url.toString();
|
|
88
|
-
};
|
|
89
|
-
const storePreviousPath = (path) => {
|
|
90
|
-
if (typeof window !== "undefined") {
|
|
91
|
-
sessionStorage.setItem("previousPath", path);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
const getPreviousPath = () => {
|
|
95
|
-
if (typeof window !== "undefined") {
|
|
96
|
-
return sessionStorage.getItem("previousPath");
|
|
97
|
-
}
|
|
98
|
-
return null;
|
|
99
|
-
};
|
|
100
|
-
const getValidRedirectUrl = (searchParams, configuredRedirect) => {
|
|
101
|
-
const urlRedirect = searchParams.get("redirect");
|
|
102
|
-
if (urlRedirect) {
|
|
103
|
-
return validateUrl(urlRedirect);
|
|
104
|
-
}
|
|
105
|
-
if (configuredRedirect) {
|
|
106
|
-
return validateUrl(configuredRedirect);
|
|
107
|
-
}
|
|
108
|
-
return "/";
|
|
109
|
-
};
|
|
110
|
-
const validateUrl = (url) => {
|
|
111
|
-
try {
|
|
112
|
-
if (url.startsWith("http")) {
|
|
113
|
-
const urlObj = new URL(url);
|
|
114
|
-
if (typeof window !== "undefined" && urlObj.origin !== window.location.origin) {
|
|
115
|
-
return "/";
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return "/";
|
|
119
|
-
} catch {
|
|
120
|
-
return "/";
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
function toURL(url) {
|
|
124
|
-
return new URL(url.toString(), window.location.origin);
|
|
125
|
-
}
|
|
126
|
-
function stripOrigin(url) {
|
|
127
|
-
url = toURL(url);
|
|
128
|
-
return url.href.replace(url.origin, "");
|
|
129
|
-
}
|
|
130
|
-
const trimTrailingSlash = (path) => {
|
|
131
|
-
return (path || "").replace(/\/+$/, "");
|
|
132
|
-
};
|
|
133
|
-
function isValidUrl(val) {
|
|
134
|
-
if (!val) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
new URL(val);
|
|
139
|
-
return true;
|
|
140
|
-
} catch {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function relativeToAbsoluteUrl(url, origin) {
|
|
145
|
-
try {
|
|
146
|
-
return new URL(url);
|
|
147
|
-
} catch {
|
|
148
|
-
return new URL(url, origin);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
const disallowedPatterns = [
|
|
152
|
-
/\0/,
|
|
153
|
-
// Null bytes
|
|
154
|
-
/^\/\//,
|
|
155
|
-
// Protocol-relative
|
|
156
|
-
// eslint-disable-next-line no-control-regex
|
|
157
|
-
/[\x00-\x1F]/
|
|
158
|
-
// Control characters
|
|
159
|
-
];
|
|
160
|
-
function isProblematicUrl(url) {
|
|
161
|
-
if (hasBannedProtocol(url)) {
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
for (const pattern of disallowedPatterns) {
|
|
165
|
-
if (pattern.test(url.pathname)) {
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
function hasBannedProtocol(val) {
|
|
172
|
-
if (!isValidUrl(val)) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
const protocol = new URL(val).protocol;
|
|
176
|
-
return BANNED_URI_PROTOCOLS.some((bp) => bp === protocol);
|
|
177
|
-
}
|
|
178
|
-
const isAllowedRedirect = (allowedRedirectOrigins, currentOrigin) => (_url) => {
|
|
179
|
-
if (!currentOrigin) return true;
|
|
180
|
-
let url = _url;
|
|
181
|
-
if (typeof url === "string") {
|
|
182
|
-
url = relativeToAbsoluteUrl(url, currentOrigin);
|
|
183
|
-
}
|
|
184
|
-
if (!allowedRedirectOrigins) {
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
const isSameOrigin = currentOrigin === url.origin;
|
|
188
|
-
const isAllowed = !isProblematicUrl(url) && (isSameOrigin || allowedRedirectOrigins.map(
|
|
189
|
-
(origin) => typeof origin === "string" ? globs.toRegexp(trimTrailingSlash(origin)) : origin
|
|
190
|
-
).some((origin) => origin.test(trimTrailingSlash(url.origin))));
|
|
191
|
-
if (!isAllowed) {
|
|
192
|
-
logger.warnOnce(
|
|
193
|
-
`Clerk: Redirect URL ${url} is not on one of the allowedRedirectOrigins, falling back to the default redirect URL.`
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
return isAllowed;
|
|
197
|
-
};
|
|
198
|
-
export {
|
|
199
|
-
buildURL,
|
|
200
|
-
constructFullUrl,
|
|
201
|
-
getPreviousPath,
|
|
202
|
-
getValidRedirectUrl,
|
|
203
|
-
hasBannedProtocol,
|
|
204
|
-
hasRedirectLoop,
|
|
205
|
-
isAllowedRedirect,
|
|
206
|
-
isProblematicUrl,
|
|
207
|
-
isValidUrl,
|
|
208
|
-
relativeToAbsoluteUrl,
|
|
209
|
-
storePreviousPath,
|
|
210
|
-
stripOrigin,
|
|
211
|
-
toURL,
|
|
212
|
-
trimTrailingSlash,
|
|
213
|
-
urlWithRedirect
|
|
214
|
-
};
|
|
215
|
-
//# sourceMappingURL=construct.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/construct.ts"],"sourcesContent":["import { camelToSnake } from '@tern-secure/shared/caseUtils';\nimport { globs } from '@tern-secure/shared/globs';\nimport { logger } from '@tern-secure/shared/logger';\n\nimport { joinPaths } from './path';\nimport { getQueryParams } from './querystring';\n\nconst DUMMY_URL_BASE = 'http://ternsecure-dummy';\n\nconst BANNED_URI_PROTOCOLS = ['javascript:'] as const;\n\nexport type constructUrlWithRedirectProps = {\n signInUrl: string;\n signInPathParam?: string;\n currentPath: string;\n signUpUrl?: string;\n signUpPathParam?: string;\n};\n\ninterface BuildURLParams extends Partial<URL> {\n base?: string;\n hashPath?: string;\n hashSearch?: string;\n hashSearchParams?:\n | URLSearchParams\n | Record<string, string>\n | Array<URLSearchParams | Record<string, string>>;\n}\n\ninterface BuildURLOptions<T> {\n skipOrigin?: boolean;\n stringify?: T;\n}\n\n/**\n *\n * buildURL(params: URLParams, options: BuildURLOptions): string\n *\n * Builds a URL safely by using the native URL() constructor. It can\n * also build a secondary path and search URL that lives inside the hash\n * of the main URL. For example:\n *\n * https://foo.com/bar?qux=42#/hash-bar?hash-qux=42\n *\n * References:\n * https://developer.mozilla.org/en-US/docs/Web/API/URL\n *\n * @param {BuildURLParams} params\n * @param {BuildURLOptions} options\n * @returns {URL | string} Returns the URL href\n */\nexport function buildURL<B extends boolean>(\n params: BuildURLParams,\n options?: BuildURLOptions<B>,\n): B extends true ? string : URL;\n\nexport function buildURL(\n params: BuildURLParams,\n options: BuildURLOptions<boolean> = {},\n): URL | string {\n const { base, hashPath, hashSearch, searchParams, hashSearchParams, ...rest } = params;\n\n let baseFallback = '';\n if (typeof window !== 'undefined' && !!window.location) {\n baseFallback = window.location.href;\n } else {\n baseFallback = 'http://react-native-fake-base-url';\n }\n\n const url = new URL(base || '', baseFallback);\n\n // Handle search parameters\n // params.searchParams comes from Partial<URL>, so it's URLSearchParams | undefined\n if (searchParams instanceof URLSearchParams) {\n searchParams.forEach((value, key) => {\n if (value !== null && value !== undefined) {\n url.searchParams.set(camelToSnake(key), value);\n }\n });\n }\n\n Object.assign(url, rest);\n\n // Handle hash-related parameters\n if (hashPath || hashSearch || hashSearchParams) {\n const dummyUrlForHash = new URL(DUMMY_URL_BASE + url.hash.substring(1));\n\n dummyUrlForHash.pathname = joinPaths(dummyUrlForHash.pathname, hashPath || '');\n\n const searchParamsFromHashSearchString = getQueryParams(hashSearch || '');\n\n for (const [key, val] of Object.entries(searchParamsFromHashSearchString)) {\n dummyUrlForHash.searchParams.append(key, val);\n }\n\n if (hashSearchParams) {\n const paramsArr = Array.isArray(hashSearchParams) ? hashSearchParams : [hashSearchParams];\n for (const _params of paramsArr) {\n if (!(_params instanceof URLSearchParams) && typeof _params !== 'object') {\n continue;\n }\n const params = new URLSearchParams(_params);\n params.forEach((value, key) => {\n if (value !== null && value !== undefined) {\n dummyUrlForHash.searchParams.set(camelToSnake(key), value);\n }\n });\n }\n }\n\n const newHash = dummyUrlForHash.href.replace(DUMMY_URL_BASE, '');\n if (newHash !== '/') {\n // Assign them to the hash of the main url\n url.hash = newHash;\n }\n }\n\n const { stringify, skipOrigin } = options;\n if (stringify) {\n return skipOrigin ? url.href.replace(url.origin, '') : url.href;\n }\n return url;\n}\n\n/**\n * Constructs a full URL with the current origin\n * @param path - The path to construct the URL for\n * @returns The full URL with origin\n */\nexport const constructFullUrl = (path: string) => {\n if (typeof window === 'undefined') return path;\n const baseUrl = window.location.origin;\n if (path.startsWith('http')) {\n return path;\n }\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n};\n\n/**\n * Checks if the current URL has a redirect loop\n * @param currentPath - The current pathname\n * @param redirectPath - The path we're trying to redirect to\n * @returns boolean indicating if there's a redirect loop\n */\nexport const hasRedirectLoop = (currentPath: string, redirectPath: string): boolean => {\n if (!currentPath || !redirectPath) return false;\n\n // Remove any query parameters for comparison\n const cleanCurrentPath = currentPath.split('?')[0];\n const cleanRedirectPath = redirectPath.split('?')[0];\n\n return cleanCurrentPath === cleanRedirectPath;\n};\n\nexport const urlWithRedirect = (options: constructUrlWithRedirectProps): string => {\n const {\n signInUrl,\n signInPathParam = '/sign-in',\n currentPath,\n signUpUrl,\n signUpPathParam = '/sign-up',\n } = options;\n\n const baseUrl = window.location.origin;\n\n if (typeof window === 'undefined') {\n return signInUrl;\n }\n\n const url = new URL(signInUrl, baseUrl);\n\n if (!currentPath.includes(signInPathParam) && !currentPath.includes(signUpPathParam)) {\n url.searchParams.set('redirect', currentPath);\n }\n\n return url.toString();\n};\n\n/**\n * Stores the current path before signing out\n */\nexport const storePreviousPath = (path: string): void => {\n if (typeof window !== 'undefined') {\n sessionStorage.setItem('previousPath', path);\n }\n};\n\n/**\n * Gets the stored previous path\n */\nexport const getPreviousPath = (): string | null => {\n if (typeof window !== 'undefined') {\n return sessionStorage.getItem('previousPath');\n }\n return null;\n};\n\n/**\n * Gets a validated redirect URL ensuring it's from the same origin\n * @param redirectUrl - The URL to validate\n * @param searchParams - The search parameters to check for redirect\n * @returns A validated redirect URL\n */\nexport const getValidRedirectUrl = (\n searchParams: URLSearchParams,\n configuredRedirect?: string,\n): string => {\n // Check URL search param first (highest priority)\n const urlRedirect = searchParams.get('redirect');\n if (urlRedirect) {\n return validateUrl(urlRedirect);\n }\n\n // Then check configured redirect (for first visits)\n if (configuredRedirect) {\n return validateUrl(configuredRedirect);\n }\n\n // Default fallback\n return '/';\n};\n\n/**\n * Validates and sanitizes URLs\n */\nconst validateUrl = (url: string): string => {\n try {\n // For absolute URLs\n if (url.startsWith('http')) {\n const urlObj = new URL(url);\n if (typeof window !== 'undefined' && urlObj.origin !== window.location.origin) {\n return '/';\n }\n }\n\n // For relative URLs\n return '/';\n } catch {\n return '/';\n }\n};\n\nexport function toURL(url: string | URL): URL {\n return new URL(url.toString(), window.location.origin);\n}\n\n/**\n *\n * stripOrigin(url: URL | string): string\n *\n * Strips the origin part of a URL and preserves path, search and hash is applicable\n *\n * References:\n * https://developer.mozilla.org/en-US/docs/Web/API/URL\n *\n * @param {URL | string} url\n * @returns {string} Returns the URL href without the origin\n */\nexport function stripOrigin(url: URL | string): string {\n url = toURL(url);\n return url.href.replace(url.origin, '');\n}\n\n/**\n * trimTrailingSlash(path: string): string\n *\n * Strips the trailing slashes from a string\n *\n * @returns {string} Returns the string without trailing slashes\n * @param path\n */\nexport const trimTrailingSlash = (path: string): string => {\n return (path || '').replace(/\\/+$/, '');\n};\n\nexport function isValidUrl(val: unknown): val is string {\n if (!val) {\n return false;\n }\n\n try {\n new URL(val as string);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function relativeToAbsoluteUrl(url: string, origin: string | URL): URL {\n try {\n return new URL(url);\n } catch {\n return new URL(url, origin);\n }\n}\n\n// Regular expression to detect disallowed patterns\nconst disallowedPatterns = [\n /\\0/, // Null bytes\n /^\\/\\//, // Protocol-relative\n // eslint-disable-next-line no-control-regex\n /[\\x00-\\x1F]/, // Control characters\n];\n\n/**\n * Check for potentially problematic URLs that could have been crafted to intentionally bypass the origin check. Note that the URLs passed to this\n * function are assumed to be from an \"allowed origin\", so we are not executing origin-specific checks here.\n */\nexport function isProblematicUrl(url: URL): boolean {\n if (hasBannedProtocol(url)) {\n return true;\n }\n // Check against disallowed patterns\n for (const pattern of disallowedPatterns) {\n if (pattern.test(url.pathname)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function hasBannedProtocol(val: string | URL) {\n if (!isValidUrl(val)) {\n return false;\n }\n const protocol = new URL(val).protocol;\n return BANNED_URI_PROTOCOLS.some(bp => bp === protocol);\n}\n\nexport const isAllowedRedirect =\n (allowedRedirectOrigins: Array<string | RegExp> | undefined, currentOrigin: string) =>\n (_url: URL | string) => {\n // On server-side (no origin), allow all redirects\n // They will be validated on client-side\n if (!currentOrigin) return true;\n\n let url = _url;\n if (typeof url === 'string') {\n url = relativeToAbsoluteUrl(url, currentOrigin);\n }\n\n if (!allowedRedirectOrigins) {\n return true;\n }\n\n const isSameOrigin = currentOrigin === url.origin;\n\n const isAllowed =\n !isProblematicUrl(url) &&\n (isSameOrigin ||\n allowedRedirectOrigins\n .map(origin =>\n typeof origin === 'string' ? globs.toRegexp(trimTrailingSlash(origin)) : origin,\n )\n .some(origin => origin.test(trimTrailingSlash(url.origin))));\n\n if (!isAllowed) {\n logger.warnOnce(\n `Clerk: Redirect URL ${url} is not on one of the allowedRedirectOrigins, falling back to the default redirect URL.`,\n );\n }\n return isAllowed;\n };\n"],"mappings":"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","names":["params"]}
|
package/dist/esm/utils/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from './construct';\nexport * from './querystring';\nexport * from './redirectUrls';\nexport * from './windowNavigate';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
package/dist/esm/utils/jwt.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { decodeJwt, decodeProtectedHeader } from "jose";
|
|
2
|
-
import { mapJwtPayloadToDecodedIdToken } from "./mapDecode";
|
|
3
|
-
function decode(token) {
|
|
4
|
-
const header = decodeProtectedHeader(token);
|
|
5
|
-
const payload = decodeJwt(token);
|
|
6
|
-
const parts = (token || "").split(".");
|
|
7
|
-
const [signature] = parts;
|
|
8
|
-
const data = {
|
|
9
|
-
header,
|
|
10
|
-
payload,
|
|
11
|
-
signature
|
|
12
|
-
};
|
|
13
|
-
const decoded = mapJwtPayloadToDecodedIdToken(payload);
|
|
14
|
-
return {
|
|
15
|
-
encoded: data,
|
|
16
|
-
decoded
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export {
|
|
20
|
-
decode
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=jwt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/jwt.ts"],"sourcesContent":["import { decodeJwt, decodeProtectedHeader } from 'jose';\n\nimport type { DecodedIdToken, JWTPayload, JWTProtectedHeader } from './mapDecode';\nimport { mapJwtPayloadToDecodedIdToken } from './mapDecode';\n\ntype JWT = {\n encoded: { header: JWTProtectedHeader; payload: JWTPayload; signature: string };\n decoded: DecodedIdToken;\n};\n\nexport function decode(token: string): JWT {\n const header = decodeProtectedHeader(token);\n const payload = decodeJwt(token);\n\n const parts = (token || '').split('.');\n const [signature] = parts;\n\n const data = {\n header,\n payload,\n signature,\n };\n\n const decoded = mapJwtPayloadToDecodedIdToken(payload);\n\n return {\n encoded: data,\n decoded,\n };\n}\n"],"mappings":"AAAA,SAAS,WAAW,6BAA6B;AAGjD,SAAS,qCAAqC;AAOvC,SAAS,OAAO,OAAoB;AACzC,QAAM,SAAS,sBAAsB,KAAK;AAC1C,QAAM,UAAU,UAAU,KAAK;AAE/B,QAAM,SAAS,SAAS,IAAI,MAAM,GAAG;AACrC,QAAM,CAAC,SAAS,IAAI;AAEpB,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,8BAA8B,OAAO;AAErD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/mapDecode.ts"],"sourcesContent":["import type { DecodedIdToken, JWTPayload, JWTProtectedHeader } from '@tern-secure/types';\n\nexport function mapJwtPayloadToDecodedIdToken(payload: JWTPayload) {\n const decodedIdToken = payload as DecodedIdToken;\n decodedIdToken.uid = decodedIdToken.sub;\n return decodedIdToken;\n}\n\nexport type { DecodedIdToken, JWTPayload, JWTProtectedHeader };\n"],"mappings":"AAEO,SAAS,8BAA8B,SAAqB;AACjE,QAAM,iBAAiB;AACvB,iBAAe,MAAM,eAAe;AACpC,SAAO;AACT;","names":[]}
|
package/dist/esm/utils/path.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
const SEPARATOR = "/";
|
|
2
|
-
const MULTIPLE_SEPARATOR_REGEX = new RegExp(SEPARATOR + "{1,}", "g");
|
|
3
|
-
function joinPaths(a, b) {
|
|
4
|
-
return [a, b].filter((p) => p).join(SEPARATOR).replace(MULTIPLE_SEPARATOR_REGEX, SEPARATOR);
|
|
5
|
-
}
|
|
6
|
-
export {
|
|
7
|
-
joinPaths
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=path.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/path.ts"],"sourcesContent":["const SEPARATOR = '/';\nconst MULTIPLE_SEPARATOR_REGEX = new RegExp(SEPARATOR + '{1,}', 'g');\n\ntype PathString = string | null | undefined;\n\nexport function joinPaths(a: PathString, b: PathString): string {\n return [a, b]\n .filter(p => p)\n .join(SEPARATOR)\n .replace(MULTIPLE_SEPARATOR_REGEX, SEPARATOR);\n}\n"],"mappings":"AAAA,MAAM,YAAY;AAClB,MAAM,2BAA2B,IAAI,OAAO,YAAY,QAAQ,GAAG;AAI5D,SAAS,UAAU,GAAe,GAAuB;AAC9D,SAAO,CAAC,GAAG,CAAC,EACT,OAAO,OAAK,CAAC,EACb,KAAK,SAAS,EACd,QAAQ,0BAA0B,SAAS;AAChD;","names":[]}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const getQueryParams = (queryString) => {
|
|
2
|
-
const queryParamsObject = {};
|
|
3
|
-
const queryParams = new URLSearchParams(queryString);
|
|
4
|
-
queryParams.forEach((value, key) => {
|
|
5
|
-
if (key in queryParamsObject) {
|
|
6
|
-
const existingValue = queryParamsObject[key];
|
|
7
|
-
if (Array.isArray(existingValue)) {
|
|
8
|
-
existingValue.push(value);
|
|
9
|
-
} else {
|
|
10
|
-
queryParamsObject[key] = [existingValue, value];
|
|
11
|
-
}
|
|
12
|
-
} else {
|
|
13
|
-
queryParamsObject[key] = value;
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
return queryParamsObject;
|
|
17
|
-
};
|
|
18
|
-
const stringifyQueryParams = (params, opts = {}) => {
|
|
19
|
-
if (params === null || params === void 0) {
|
|
20
|
-
return "";
|
|
21
|
-
}
|
|
22
|
-
if (!params || typeof params !== "object") {
|
|
23
|
-
return "";
|
|
24
|
-
}
|
|
25
|
-
const queryParams = new URLSearchParams();
|
|
26
|
-
Object.keys(params).forEach((key) => {
|
|
27
|
-
const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;
|
|
28
|
-
const value = params[key];
|
|
29
|
-
if (Array.isArray(value)) {
|
|
30
|
-
value.forEach((v) => v !== void 0 && queryParams.append(encodedKey, v || ""));
|
|
31
|
-
} else if (value === void 0) {
|
|
32
|
-
return;
|
|
33
|
-
} else if (typeof value === "object" && value !== null) {
|
|
34
|
-
queryParams.append(encodedKey, JSON.stringify(value));
|
|
35
|
-
} else {
|
|
36
|
-
queryParams.append(encodedKey, String(value ?? ""));
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
return queryParams.toString();
|
|
40
|
-
};
|
|
41
|
-
export {
|
|
42
|
-
getQueryParams,
|
|
43
|
-
stringifyQueryParams
|
|
44
|
-
};
|
|
45
|
-
//# sourceMappingURL=querystring.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/querystring.ts"],"sourcesContent":["export const getQueryParams = (queryString: string) => {\n const queryParamsObject: { [key: string]: string | string[] } = {};\n const queryParams = new URLSearchParams(queryString);\n queryParams.forEach((value, key) => {\n if (key in queryParamsObject) {\n // If the key already exists, we need to handle it as an array\n const existingValue = queryParamsObject[key];\n if (Array.isArray(existingValue)) {\n existingValue.push(value);\n } else {\n queryParamsObject[key] = [existingValue, value];\n }\n } else {\n queryParamsObject[key] = value;\n }\n });\n return queryParamsObject as Record<string, string>;\n};\n\ntype StringifyQueryParamsOptions = {\n keyEncoder?: (key: string) => string;\n};\n\nexport const stringifyQueryParams = (\n params:\n | Record<string, string | undefined | null | object | boolean | Array<string | undefined | null>>\n | null\n | undefined\n | string,\n opts: StringifyQueryParamsOptions = {},\n) => {\n if (params === null || params === undefined) {\n return '';\n }\n if (!params || typeof params !== 'object') {\n return '';\n }\n\n const queryParams = new URLSearchParams();\n\n Object.keys(params).forEach(key => {\n const encodedKey = opts.keyEncoder ? opts.keyEncoder(key) : key;\n const value = params[key];\n if (Array.isArray(value)) {\n value.forEach(v => v !== undefined && queryParams.append(encodedKey, v || ''));\n } else if (value === undefined) {\n return;\n } else if (typeof value === 'object' && value !== null) {\n queryParams.append(encodedKey, JSON.stringify(value));\n } else {\n queryParams.append(encodedKey, String(value ?? ''));\n }\n });\n\n return queryParams.toString();\n};\n"],"mappings":"AAAO,MAAM,iBAAiB,CAAC,gBAAwB;AACrD,QAAM,oBAA0D,CAAC;AACjE,QAAM,cAAc,IAAI,gBAAgB,WAAW;AACnD,cAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,QAAI,OAAO,mBAAmB;AAE5B,YAAM,gBAAgB,kBAAkB,GAAG;AAC3C,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,sBAAc,KAAK,KAAK;AAAA,MAC1B,OAAO;AACL,0BAAkB,GAAG,IAAI,CAAC,eAAe,KAAK;AAAA,MAChD;AAAA,IACF,OAAO;AACL,wBAAkB,GAAG,IAAI;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAMO,MAAM,uBAAuB,CAClC,QAKA,OAAoC,CAAC,MAClC;AACH,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,gBAAgB;AAExC,SAAO,KAAK,MAAM,EAAE,QAAQ,SAAO;AACjC,UAAM,aAAa,KAAK,aAAa,KAAK,WAAW,GAAG,IAAI;AAC5D,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,OAAK,MAAM,UAAa,YAAY,OAAO,YAAY,KAAK,EAAE,CAAC;AAAA,IAC/E,WAAW,UAAU,QAAW;AAC9B;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,kBAAY,OAAO,YAAY,KAAK,UAAU,KAAK,CAAC;AAAA,IACtD,OAAO;AACL,kBAAY,OAAO,YAAY,OAAO,SAAS,EAAE,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS;AAC9B;","names":[]}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { camelToSnake } from "@tern-secure/shared/caseUtils";
|
|
2
|
-
import { applyFunctionToObj, filterProps, removeUndefined } from "@tern-secure/shared/object";
|
|
3
|
-
import { isAllowedRedirect, relativeToAbsoluteUrl } from "./construct";
|
|
4
|
-
class RedirectUrls {
|
|
5
|
-
static keys = [
|
|
6
|
-
"signInForceRedirectUrl",
|
|
7
|
-
"signInFallbackRedirectUrl",
|
|
8
|
-
"signUpForceRedirectUrl",
|
|
9
|
-
"signUpFallbackRedirectUrl",
|
|
10
|
-
"afterSignInUrl",
|
|
11
|
-
"afterSignUpUrl",
|
|
12
|
-
"redirectUrl"
|
|
13
|
-
];
|
|
14
|
-
static preserved = ["redirectUrl"];
|
|
15
|
-
options;
|
|
16
|
-
fromOptions;
|
|
17
|
-
fromProps;
|
|
18
|
-
fromSearchParams;
|
|
19
|
-
constructor(options, props = {}, searchParams = {}) {
|
|
20
|
-
this.options = options;
|
|
21
|
-
this.fromOptions = this.#parse(options || {});
|
|
22
|
-
this.fromProps = this.#parse(props || {});
|
|
23
|
-
this.fromSearchParams = this.#parseSearchParams(searchParams || {});
|
|
24
|
-
}
|
|
25
|
-
getAfterSignInUrl() {
|
|
26
|
-
return this.#getRedirectUrl("signIn");
|
|
27
|
-
}
|
|
28
|
-
getAfterSignUpUrl() {
|
|
29
|
-
return this.#getRedirectUrl("signUp");
|
|
30
|
-
}
|
|
31
|
-
getPreservedSearchParams() {
|
|
32
|
-
return this.#toSearchParams(this.#flattenPreserved());
|
|
33
|
-
}
|
|
34
|
-
toSearchParams() {
|
|
35
|
-
return this.#toSearchParams(this.#flattenAll());
|
|
36
|
-
}
|
|
37
|
-
#toSearchParams(obj) {
|
|
38
|
-
const camelCased = Object.fromEntries(
|
|
39
|
-
Object.entries(obj).map(([key, value]) => [camelToSnake(key), value])
|
|
40
|
-
);
|
|
41
|
-
return new URLSearchParams(removeUndefined(camelCased));
|
|
42
|
-
}
|
|
43
|
-
#flattenPreserved() {
|
|
44
|
-
return Object.fromEntries(
|
|
45
|
-
Object.entries({ ...this.fromSearchParams }).filter(
|
|
46
|
-
([key]) => RedirectUrls.preserved.includes(key)
|
|
47
|
-
)
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
#flattenAll() {
|
|
51
|
-
const signUpForceRedirectUrl = this.fromSearchParams.signUpForceRedirectUrl || this.fromProps.signUpForceRedirectUrl || this.fromOptions.signUpForceRedirectUrl;
|
|
52
|
-
const signUpFallbackRedirectUrl = this.fromSearchParams.signUpFallbackRedirectUrl || this.fromProps.signUpFallbackRedirectUrl || this.fromOptions.signUpFallbackRedirectUrl;
|
|
53
|
-
const signInForceRedirectUrl = this.fromSearchParams.signInForceRedirectUrl || this.fromProps.signInForceRedirectUrl || this.fromOptions.signInForceRedirectUrl;
|
|
54
|
-
const signInFallbackRedirectUrl = this.fromSearchParams.signInFallbackRedirectUrl || this.fromProps.signInFallbackRedirectUrl || this.fromOptions.signInFallbackRedirectUrl;
|
|
55
|
-
const afterSignInUrl = this.fromSearchParams.afterSignInUrl || this.fromProps.afterSignInUrl || this.fromOptions.afterSignInUrl;
|
|
56
|
-
const afterSignUpUrl = this.fromSearchParams.afterSignUpUrl || this.fromProps.afterSignUpUrl || this.fromOptions.afterSignUpUrl;
|
|
57
|
-
const redirectUrl = this.fromSearchParams.redirectUrl || this.fromProps.redirectUrl || this.fromOptions.redirectUrl;
|
|
58
|
-
const res = {
|
|
59
|
-
signUpForceRedirectUrl,
|
|
60
|
-
signUpFallbackRedirectUrl,
|
|
61
|
-
signInForceRedirectUrl,
|
|
62
|
-
signInFallbackRedirectUrl,
|
|
63
|
-
afterSignInUrl,
|
|
64
|
-
afterSignUpUrl,
|
|
65
|
-
redirectUrl
|
|
66
|
-
};
|
|
67
|
-
return res;
|
|
68
|
-
}
|
|
69
|
-
#getRedirectUrl(prefix) {
|
|
70
|
-
const forceKey = `${prefix}ForceRedirectUrl`;
|
|
71
|
-
const fallbackKey = `${prefix}FallbackRedirectUrl`;
|
|
72
|
-
let newKeyInUse;
|
|
73
|
-
let result;
|
|
74
|
-
result = this.fromSearchParams[forceKey] || this.fromProps[forceKey] || this.fromOptions[forceKey];
|
|
75
|
-
if (result) {
|
|
76
|
-
newKeyInUse = forceKey;
|
|
77
|
-
}
|
|
78
|
-
result ||= this.fromSearchParams.redirectUrl;
|
|
79
|
-
if (result) {
|
|
80
|
-
newKeyInUse = "redirectUrl";
|
|
81
|
-
}
|
|
82
|
-
result ||= this.fromSearchParams[fallbackKey] || this.fromProps[fallbackKey] || this.fromOptions[fallbackKey];
|
|
83
|
-
if (result) {
|
|
84
|
-
newKeyInUse = fallbackKey;
|
|
85
|
-
}
|
|
86
|
-
if (!result) {
|
|
87
|
-
if (typeof window === "undefined") {
|
|
88
|
-
return "/";
|
|
89
|
-
}
|
|
90
|
-
return window.location.href;
|
|
91
|
-
}
|
|
92
|
-
return result || "/";
|
|
93
|
-
}
|
|
94
|
-
#parse(obj) {
|
|
95
|
-
const res = {};
|
|
96
|
-
RedirectUrls.keys.forEach((key) => {
|
|
97
|
-
res[key] = obj[key];
|
|
98
|
-
});
|
|
99
|
-
return applyFunctionToObj(
|
|
100
|
-
this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))),
|
|
101
|
-
(val) => val.toString()
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
#parseSearchParams(obj) {
|
|
105
|
-
const res = {};
|
|
106
|
-
RedirectUrls.keys.forEach((key) => {
|
|
107
|
-
if (obj instanceof URLSearchParams) {
|
|
108
|
-
res[key] = obj.get(camelToSnake(key));
|
|
109
|
-
} else {
|
|
110
|
-
res[key] = obj[camelToSnake(key)];
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
return applyFunctionToObj(
|
|
114
|
-
this.#filterRedirects(this.#toAbsoluteUrls(filterProps(res, Boolean))),
|
|
115
|
-
(val) => val.toString()
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
#toAbsoluteUrls(obj) {
|
|
119
|
-
const origin = typeof window !== "undefined" ? window.location.origin : "";
|
|
120
|
-
if (!origin) return obj;
|
|
121
|
-
return applyFunctionToObj(obj, (url) => relativeToAbsoluteUrl(url, origin));
|
|
122
|
-
}
|
|
123
|
-
#filterRedirects = (obj) => {
|
|
124
|
-
var _a;
|
|
125
|
-
const origin = typeof window !== "undefined" ? window.location.origin : "";
|
|
126
|
-
return filterProps(obj, isAllowedRedirect((_a = this.options) == null ? void 0 : _a.allowedRedirectOrigins, origin));
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
export {
|
|
130
|
-
RedirectUrls
|
|
131
|
-
};
|
|
132
|
-
//# sourceMappingURL=redirectUrls.js.map
|