nextjs-cms 0.5.9 → 0.5.10
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/api/axios/axiosInstance.d.ts +1 -1
- package/dist/api/axios/axiosInstance.js +8 -8
- package/dist/api/index.d.ts +855 -855
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -12
- package/dist/api/lib/serverActions.d.ts +239 -239
- package/dist/api/lib/serverActions.d.ts.map +1 -1
- package/dist/api/lib/serverActions.js +834 -834
- package/dist/api/root.d.ts +828 -828
- package/dist/api/root.js +30 -30
- package/dist/api/routers/accountSettings.d.ts +60 -60
- package/dist/api/routers/accountSettings.js +108 -108
- package/dist/api/routers/admins.d.ts +105 -105
- package/dist/api/routers/admins.js +219 -219
- package/dist/api/routers/auth.d.ts +47 -47
- package/dist/api/routers/auth.js +25 -25
- package/dist/api/routers/categorySection.d.ts +103 -103
- package/dist/api/routers/categorySection.js +38 -38
- package/dist/api/routers/cmsSettings.d.ts +48 -48
- package/dist/api/routers/cmsSettings.js +51 -51
- package/dist/api/routers/cpanel.d.ts +83 -83
- package/dist/api/routers/cpanel.js +216 -216
- package/dist/api/routers/files.d.ts +47 -47
- package/dist/api/routers/files.js +23 -23
- package/dist/api/routers/gallery.d.ts +35 -35
- package/dist/api/routers/gallery.js +62 -62
- package/dist/api/routers/googleAnalytics.d.ts +30 -30
- package/dist/api/routers/googleAnalytics.js +7 -7
- package/dist/api/routers/hasItemsSection.d.ts +139 -139
- package/dist/api/routers/hasItemsSection.js +34 -34
- package/dist/api/routers/navigation.d.ts +51 -51
- package/dist/api/routers/navigation.js +11 -11
- package/dist/api/routers/simpleSection.d.ts +57 -57
- package/dist/api/routers/simpleSection.js +12 -12
- package/dist/api/trpc.d.ts +106 -106
- package/dist/api/trpc.js +72 -72
- package/dist/auth/axios/axiosInstance.d.ts +1 -1
- package/dist/auth/axios/axiosInstance.js +8 -8
- package/dist/auth/csrf.d.ts +29 -29
- package/dist/auth/csrf.js +76 -76
- package/dist/auth/hooks/index.d.ts +3 -3
- package/dist/auth/hooks/index.d.ts.map +1 -1
- package/dist/auth/hooks/index.js +3 -3
- package/dist/auth/hooks/useAxiosPrivate.d.ts +4 -4
- package/dist/auth/hooks/useAxiosPrivate.js +74 -74
- package/dist/auth/hooks/useRefreshToken.d.ts +6 -6
- package/dist/auth/hooks/useRefreshToken.js +79 -79
- package/dist/auth/index.d.ts +22 -22
- package/dist/auth/index.js +44 -44
- package/dist/auth/jwt.d.ts +5 -5
- package/dist/auth/jwt.js +25 -25
- package/dist/auth/lib/actions.d.ts +32 -32
- package/dist/auth/lib/actions.d.ts.map +1 -1
- package/dist/auth/lib/actions.js +209 -209
- package/dist/auth/lib/client.d.ts +3 -3
- package/dist/auth/lib/client.js +46 -46
- package/dist/auth/lib/index.d.ts +2 -2
- package/dist/auth/lib/index.d.ts.map +1 -1
- package/dist/auth/lib/index.js +2 -2
- package/dist/auth/react.d.ts +105 -105
- package/dist/auth/react.d.ts.map +1 -1
- package/dist/auth/react.js +347 -347
- package/dist/auth/trpc.d.ts +5 -5
- package/dist/auth/trpc.d.ts.map +1 -1
- package/dist/auth/trpc.js +81 -81
- package/dist/core/config/config-loader.d.ts +91 -91
- package/dist/core/config/config-loader.js +230 -230
- package/dist/core/config/index.d.ts +2 -2
- package/dist/core/config/index.d.ts.map +1 -1
- package/dist/core/config/index.js +1 -1
- package/dist/core/config/loader.d.ts +1 -1
- package/dist/core/config/loader.js +42 -42
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +1 -1
- package/dist/core/db/table-checker/DbTable.d.ts +5 -5
- package/dist/core/db/table-checker/DbTable.js +5 -5
- package/dist/core/db/table-checker/MysqlTable.d.ts +33 -33
- package/dist/core/db/table-checker/MysqlTable.d.ts.map +1 -1
- package/dist/core/db/table-checker/MysqlTable.js +94 -94
- package/dist/core/db/table-checker/index.d.ts +1 -1
- package/dist/core/db/table-checker/index.d.ts.map +1 -1
- package/dist/core/db/table-checker/index.js +1 -1
- package/dist/core/factories/FieldFactory.d.ts +123 -123
- package/dist/core/factories/FieldFactory.d.ts.map +1 -1
- package/dist/core/factories/FieldFactory.js +411 -411
- package/dist/core/factories/SectionFactory.d.ts +109 -109
- package/dist/core/factories/SectionFactory.d.ts.map +1 -1
- package/dist/core/factories/SectionFactory.js +415 -415
- package/dist/core/factories/index.d.ts +2 -2
- package/dist/core/factories/index.d.ts.map +1 -1
- package/dist/core/factories/index.js +2 -2
- package/dist/core/fields/checkbox.d.ts +62 -62
- package/dist/core/fields/checkbox.d.ts.map +1 -1
- package/dist/core/fields/checkbox.js +62 -62
- package/dist/core/fields/color.d.ts +83 -83
- package/dist/core/fields/color.d.ts.map +1 -1
- package/dist/core/fields/color.js +91 -91
- package/dist/core/fields/date.d.ts +99 -99
- package/dist/core/fields/date.d.ts.map +1 -1
- package/dist/core/fields/date.js +108 -108
- package/dist/core/fields/document.d.ts +179 -179
- package/dist/core/fields/document.d.ts.map +1 -1
- package/dist/core/fields/document.js +277 -277
- package/dist/core/fields/field-group.d.ts +17 -17
- package/dist/core/fields/field-group.d.ts.map +1 -1
- package/dist/core/fields/field-group.js +6 -6
- package/dist/core/fields/field.d.ts +125 -125
- package/dist/core/fields/field.d.ts.map +1 -1
- package/dist/core/fields/field.js +148 -148
- package/dist/core/fields/fileField.d.ts +14 -14
- package/dist/core/fields/fileField.d.ts.map +1 -1
- package/dist/core/fields/fileField.js +5 -5
- package/dist/core/fields/index.d.ts +64 -64
- package/dist/core/fields/index.d.ts.map +1 -1
- package/dist/core/fields/index.js +18 -18
- package/dist/core/fields/map.d.ts +166 -166
- package/dist/core/fields/map.d.ts.map +1 -1
- package/dist/core/fields/map.js +152 -152
- package/dist/core/fields/number.d.ts +185 -185
- package/dist/core/fields/number.d.ts.map +1 -1
- package/dist/core/fields/number.js +241 -241
- package/dist/core/fields/password.d.ts +108 -108
- package/dist/core/fields/password.d.ts.map +1 -1
- package/dist/core/fields/password.js +133 -133
- package/dist/core/fields/photo.d.ts +288 -288
- package/dist/core/fields/photo.d.ts.map +1 -1
- package/dist/core/fields/photo.js +410 -410
- package/dist/core/fields/richText.d.ts +294 -294
- package/dist/core/fields/richText.d.ts.map +1 -1
- package/dist/core/fields/richText.js +338 -338
- package/dist/core/fields/select.d.ts +365 -365
- package/dist/core/fields/select.d.ts.map +1 -1
- package/dist/core/fields/select.js +499 -499
- package/dist/core/fields/selectMultiple.d.ts +235 -235
- package/dist/core/fields/selectMultiple.d.ts.map +1 -1
- package/dist/core/fields/selectMultiple.js +417 -417
- package/dist/core/fields/tags.d.ts +130 -130
- package/dist/core/fields/tags.d.ts.map +1 -1
- package/dist/core/fields/tags.js +105 -105
- package/dist/core/fields/text.d.ts +135 -135
- package/dist/core/fields/text.d.ts.map +1 -1
- package/dist/core/fields/text.js +157 -157
- package/dist/core/fields/textArea.d.ts +106 -106
- package/dist/core/fields/textArea.d.ts.map +1 -1
- package/dist/core/fields/textArea.js +126 -126
- package/dist/core/fields/video.d.ts +147 -147
- package/dist/core/fields/video.d.ts.map +1 -1
- package/dist/core/fields/video.js +248 -248
- package/dist/core/helpers/entity.d.ts +7 -7
- package/dist/core/helpers/entity.js +27 -27
- package/dist/core/helpers/index.d.ts +4 -4
- package/dist/core/helpers/index.d.ts.map +1 -1
- package/dist/core/helpers/index.js +3 -3
- package/dist/core/index.d.ts +7 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/sections/category.d.ts +282 -282
- package/dist/core/sections/category.d.ts.map +1 -1
- package/dist/core/sections/category.js +147 -147
- package/dist/core/sections/hasItems.d.ts +631 -631
- package/dist/core/sections/hasItems.d.ts.map +1 -1
- package/dist/core/sections/hasItems.js +144 -144
- package/dist/core/sections/index.d.ts +4 -4
- package/dist/core/sections/index.d.ts.map +1 -1
- package/dist/core/sections/index.js +4 -4
- package/dist/core/sections/section.d.ts +225 -225
- package/dist/core/sections/section.d.ts.map +1 -1
- package/dist/core/sections/section.js +341 -341
- package/dist/core/sections/simple.d.ts +98 -98
- package/dist/core/sections/simple.d.ts.map +1 -1
- package/dist/core/sections/simple.js +95 -95
- package/dist/core/security/dom.d.ts +10 -10
- package/dist/core/security/dom.js +92 -92
- package/dist/core/submit/ItemEditSubmit.d.ts +75 -75
- package/dist/core/submit/ItemEditSubmit.js +186 -186
- package/dist/core/submit/NewItemSubmit.d.ts +13 -13
- package/dist/core/submit/NewItemSubmit.js +93 -93
- package/dist/core/submit/SimpleSectionSubmit.d.ts +12 -12
- package/dist/core/submit/SimpleSectionSubmit.js +93 -93
- package/dist/core/submit/index.d.ts +4 -4
- package/dist/core/submit/index.js +4 -4
- package/dist/core/submit/submit.d.ts +115 -115
- package/dist/core/submit/submit.js +479 -479
- package/dist/core/types/index.d.ts +279 -279
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/index.js +1 -1
- package/dist/db/client.d.ts +8 -8
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +19 -19
- package/dist/db/config.d.ts +5 -5
- package/dist/db/config.js +22 -22
- package/dist/db/drizzle.config.d.ts +5 -5
- package/dist/db/drizzle.config.js +18 -18
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.js +3 -3
- package/dist/db/schema.d.ts +638 -638
- package/dist/db/schema.js +73 -73
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/translations/index.d.ts +2 -2
- package/dist/translations/index.js +15 -15
- package/dist/utils/CpanelApi.d.ts +24 -24
- package/dist/utils/CpanelApi.js +64 -64
- package/dist/utils/constants.d.ts +13 -13
- package/dist/utils/constants.js +61 -61
- package/dist/utils/index.d.ts +4 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/utils.d.ts +59 -59
- package/dist/utils/utils.js +132 -132
- package/dist/validators/checkbox.d.ts +3 -3
- package/dist/validators/checkbox.d.ts.map +1 -1
- package/dist/validators/checkbox.js +12 -12
- package/dist/validators/color.d.ts +3 -3
- package/dist/validators/color.d.ts.map +1 -1
- package/dist/validators/color.js +7 -7
- package/dist/validators/date.d.ts +3 -3
- package/dist/validators/date.d.ts.map +1 -1
- package/dist/validators/date.js +5 -5
- package/dist/validators/document.d.ts +3 -3
- package/dist/validators/document.d.ts.map +1 -1
- package/dist/validators/document.js +57 -57
- package/dist/validators/index.d.ts +14 -14
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +14 -14
- package/dist/validators/map.d.ts +3 -3
- package/dist/validators/map.d.ts.map +1 -1
- package/dist/validators/map.js +5 -5
- package/dist/validators/number.d.ts +3 -3
- package/dist/validators/number.d.ts.map +1 -1
- package/dist/validators/number.js +20 -20
- package/dist/validators/password.d.ts +3 -3
- package/dist/validators/password.d.ts.map +1 -1
- package/dist/validators/password.js +11 -11
- package/dist/validators/photo.d.ts +3 -3
- package/dist/validators/photo.d.ts.map +1 -1
- package/dist/validators/photo.js +100 -100
- package/dist/validators/richText.d.ts +3 -3
- package/dist/validators/richText.d.ts.map +1 -1
- package/dist/validators/richText.js +8 -8
- package/dist/validators/select-multiple.d.ts +9 -9
- package/dist/validators/select-multiple.d.ts.map +1 -1
- package/dist/validators/select-multiple.js +20 -20
- package/dist/validators/select.d.ts +3 -3
- package/dist/validators/select.d.ts.map +1 -1
- package/dist/validators/select.js +5 -5
- package/dist/validators/text.d.ts +3 -3
- package/dist/validators/text.d.ts.map +1 -1
- package/dist/validators/text.js +7 -7
- package/dist/validators/textarea.d.ts +3 -3
- package/dist/validators/textarea.d.ts.map +1 -1
- package/dist/validators/textarea.js +7 -7
- package/dist/validators/video.d.ts +3 -3
- package/dist/validators/video.d.ts.map +1 -1
- package/dist/validators/video.js +57 -57
- package/package.json +2 -3
package/dist/auth/csrf.js
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates a cookie with the value 'token|hash',
|
|
3
|
-
* where 'token' is the CSRF token and 'hash' is a hash made of the token and
|
|
4
|
-
* the secret, and the two values are joined by a pipe '|'. By storing the
|
|
5
|
-
* value and the hash of the value (with the secret used as a salt) we can
|
|
6
|
-
* verify the cookie was set by the server and not by a malicious attacker.
|
|
7
|
-
*
|
|
8
|
-
* For more details, see the following OWASP links:
|
|
9
|
-
* https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie
|
|
10
|
-
* https://owasp.org/www-chapter-london/assets/slides/David_Johansson-Double_Defeat_of_Double-Submit_Cookie.pdf
|
|
11
|
-
*/
|
|
12
|
-
export async function createCSRFToken(cookieValue) {
|
|
13
|
-
/**
|
|
14
|
-
* If there is a CSRF token cookie, we verify it
|
|
15
|
-
*/
|
|
16
|
-
if (cookieValue) {
|
|
17
|
-
/**
|
|
18
|
-
* Split the cookie value into the token and the hash
|
|
19
|
-
*/
|
|
20
|
-
const [csrfToken, csrfTokenHash] = cookieValue.split('|');
|
|
21
|
-
if (csrfToken && csrfTokenHash) {
|
|
22
|
-
/**
|
|
23
|
-
* Create a hash of the CSRF token and the secret
|
|
24
|
-
*/
|
|
25
|
-
const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
26
|
-
/**
|
|
27
|
-
* If hash matches then we trust the CSRF token value
|
|
28
|
-
*/
|
|
29
|
-
if (csrfTokenHash === expectedCsrfTokenHash) {
|
|
30
|
-
return { csrfToken };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* If this line is reached, then the CSRF token is not verified and we need to create a new one
|
|
36
|
-
*/
|
|
37
|
-
const csrfToken = randomString(32);
|
|
38
|
-
const csrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
39
|
-
const cookie = `${csrfToken}|${csrfTokenHash}`;
|
|
40
|
-
/**
|
|
41
|
-
* Return the cookie and the CSRF token value
|
|
42
|
-
*/
|
|
43
|
-
return { cookie, csrfToken };
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* This function is used to validate the CSRF token in POST, PUT, DELETE requests (or any request that changes data)
|
|
47
|
-
* @param cookieValue
|
|
48
|
-
* @param bodyValue
|
|
49
|
-
*/
|
|
50
|
-
export async function validateCSRFToken({ cookieValue, bodyValue }) {
|
|
51
|
-
if (cookieValue) {
|
|
52
|
-
const [csrfToken, csrfTokenHash] = cookieValue.split('|');
|
|
53
|
-
const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
54
|
-
if (csrfTokenHash === expectedCsrfTokenHash) {
|
|
55
|
-
// If hash matches then we trust the CSRF token value
|
|
56
|
-
// If this is a POST request and the CSRF Token in the POST request matches
|
|
57
|
-
// the cookie we have already verified is the one we have set, then the token is verified!
|
|
58
|
-
return csrfToken === bodyValue;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
export function randomString(size) {
|
|
64
|
-
const i2hex = (i) => ('0' + i.toString(16)).slice(-2);
|
|
65
|
-
const r = (a, i) => a + i2hex(i);
|
|
66
|
-
const bytes = crypto.getRandomValues(new Uint8Array(size));
|
|
67
|
-
return Array.from(bytes).reduce(r, '');
|
|
68
|
-
}
|
|
69
|
-
export async function createHash(message) {
|
|
70
|
-
const data = new TextEncoder().encode(message);
|
|
71
|
-
const hash = await crypto.subtle.digest('SHA-256', data);
|
|
72
|
-
return Array.from(new Uint8Array(hash))
|
|
73
|
-
.map((b) => b.toString(16).padStart(2, '0'))
|
|
74
|
-
.join('')
|
|
75
|
-
.toString();
|
|
76
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Creates a cookie with the value 'token|hash',
|
|
3
|
+
* where 'token' is the CSRF token and 'hash' is a hash made of the token and
|
|
4
|
+
* the secret, and the two values are joined by a pipe '|'. By storing the
|
|
5
|
+
* value and the hash of the value (with the secret used as a salt) we can
|
|
6
|
+
* verify the cookie was set by the server and not by a malicious attacker.
|
|
7
|
+
*
|
|
8
|
+
* For more details, see the following OWASP links:
|
|
9
|
+
* https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie
|
|
10
|
+
* https://owasp.org/www-chapter-london/assets/slides/David_Johansson-Double_Defeat_of_Double-Submit_Cookie.pdf
|
|
11
|
+
*/
|
|
12
|
+
export async function createCSRFToken(cookieValue) {
|
|
13
|
+
/**
|
|
14
|
+
* If there is a CSRF token cookie, we verify it
|
|
15
|
+
*/
|
|
16
|
+
if (cookieValue) {
|
|
17
|
+
/**
|
|
18
|
+
* Split the cookie value into the token and the hash
|
|
19
|
+
*/
|
|
20
|
+
const [csrfToken, csrfTokenHash] = cookieValue.split('|');
|
|
21
|
+
if (csrfToken && csrfTokenHash) {
|
|
22
|
+
/**
|
|
23
|
+
* Create a hash of the CSRF token and the secret
|
|
24
|
+
*/
|
|
25
|
+
const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
26
|
+
/**
|
|
27
|
+
* If hash matches then we trust the CSRF token value
|
|
28
|
+
*/
|
|
29
|
+
if (csrfTokenHash === expectedCsrfTokenHash) {
|
|
30
|
+
return { csrfToken };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* If this line is reached, then the CSRF token is not verified and we need to create a new one
|
|
36
|
+
*/
|
|
37
|
+
const csrfToken = randomString(32);
|
|
38
|
+
const csrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
39
|
+
const cookie = `${csrfToken}|${csrfTokenHash}`;
|
|
40
|
+
/**
|
|
41
|
+
* Return the cookie and the CSRF token value
|
|
42
|
+
*/
|
|
43
|
+
return { cookie, csrfToken };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* This function is used to validate the CSRF token in POST, PUT, DELETE requests (or any request that changes data)
|
|
47
|
+
* @param cookieValue
|
|
48
|
+
* @param bodyValue
|
|
49
|
+
*/
|
|
50
|
+
export async function validateCSRFToken({ cookieValue, bodyValue }) {
|
|
51
|
+
if (cookieValue) {
|
|
52
|
+
const [csrfToken, csrfTokenHash] = cookieValue.split('|');
|
|
53
|
+
const expectedCsrfTokenHash = await createHash(`${csrfToken}${process.env.CSRF_TOKEN_SECRET}`);
|
|
54
|
+
if (csrfTokenHash === expectedCsrfTokenHash) {
|
|
55
|
+
// If hash matches then we trust the CSRF token value
|
|
56
|
+
// If this is a POST request and the CSRF Token in the POST request matches
|
|
57
|
+
// the cookie we have already verified is the one we have set, then the token is verified!
|
|
58
|
+
return csrfToken === bodyValue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
export function randomString(size) {
|
|
64
|
+
const i2hex = (i) => ('0' + i.toString(16)).slice(-2);
|
|
65
|
+
const r = (a, i) => a + i2hex(i);
|
|
66
|
+
const bytes = crypto.getRandomValues(new Uint8Array(size));
|
|
67
|
+
return Array.from(bytes).reduce(r, '');
|
|
68
|
+
}
|
|
69
|
+
export async function createHash(message) {
|
|
70
|
+
const data = new TextEncoder().encode(message);
|
|
71
|
+
const hash = await crypto.subtle.digest('SHA-256', data);
|
|
72
|
+
return Array.from(new Uint8Array(hash))
|
|
73
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
74
|
+
.join('')
|
|
75
|
+
.toString();
|
|
76
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import useAxiosPrivate from
|
|
2
|
-
import useRefreshToken from
|
|
3
|
-
export { useAxiosPrivate, useRefreshToken };
|
|
1
|
+
import useAxiosPrivate from './useAxiosPrivate.jsx';
|
|
2
|
+
import useRefreshToken from './useRefreshToken.jsx';
|
|
3
|
+
export { useAxiosPrivate, useRefreshToken };
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,uBAAuB,CAAA;AACnD,OAAO,eAAe,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
|
package/dist/auth/hooks/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import useAxiosPrivate from
|
|
2
|
-
import useRefreshToken from
|
|
3
|
-
export { useAxiosPrivate, useRefreshToken };
|
|
1
|
+
import useAxiosPrivate from './useAxiosPrivate.jsx';
|
|
2
|
+
import useRefreshToken from './useRefreshToken.jsx';
|
|
3
|
+
export { useAxiosPrivate, useRefreshToken };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
declare const useAxiosPrivate: (options?: {
|
|
2
|
-
refreshTokenOn?: 401 | 404;
|
|
3
|
-
}) => import("axios").AxiosInstance;
|
|
4
|
-
export default useAxiosPrivate;
|
|
1
|
+
declare const useAxiosPrivate: (options?: {
|
|
2
|
+
refreshTokenOn?: 401 | 404;
|
|
3
|
+
}) => import("axios").AxiosInstance;
|
|
4
|
+
export default useAxiosPrivate;
|
|
5
5
|
//# sourceMappingURL=useAxiosPrivate.d.ts.map
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
import { axiosPrivate } from
|
|
2
|
-
import { useEffect } from 'react';
|
|
3
|
-
import useRefreshToken from
|
|
4
|
-
import axios from 'axios';
|
|
5
|
-
import { getCsrfToken } from
|
|
6
|
-
const useAxiosPrivate = (options) => {
|
|
7
|
-
const refresh = useRefreshToken();
|
|
8
|
-
const { refreshTokenOn = 401 } = options || {};
|
|
9
|
-
useEffect(() => {
|
|
10
|
-
/**
|
|
11
|
-
* Add a request interceptor
|
|
12
|
-
*/
|
|
13
|
-
const requestIntercept = axiosPrivate.interceptors.request.use(
|
|
14
|
-
/**
|
|
15
|
-
* Do something before request is sent
|
|
16
|
-
* @param config The request config object
|
|
17
|
-
*/
|
|
18
|
-
async (config) => {
|
|
19
|
-
if (config.method && ['post', 'put', 'delete'].includes(config.method.toLowerCase())) {
|
|
20
|
-
/**
|
|
21
|
-
* If the request is a POST, PUT, or DELETE request, the XSRF-TOKEN header is added to the request.
|
|
22
|
-
*/
|
|
23
|
-
config.headers['x-csrf-token'] = await getCsrfToken();
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Return the config object
|
|
27
|
-
*/
|
|
28
|
-
return config;
|
|
29
|
-
}, (error) => Promise.reject(error));
|
|
30
|
-
/**
|
|
31
|
-
* This is the response interceptor
|
|
32
|
-
*/
|
|
33
|
-
const responseIntercept = axiosPrivate.interceptors.response.use((response) => response, // Do nothing if the request is successful,
|
|
34
|
-
async (error) => {
|
|
35
|
-
// If the access token has expired, refresh it and retry the request
|
|
36
|
-
const prevRequest = error?.config; // The request that caused the error (the one that returned 401) is saved in the error object
|
|
37
|
-
if (error?.response?.status === refreshTokenOn && !prevRequest?.sent) {
|
|
38
|
-
// If the error is 401 and the request hasn't been sent before
|
|
39
|
-
prevRequest.sent = true; // Prevent infinite loops
|
|
40
|
-
const refreshStatus = await refresh(); // Refresh the access token cookie
|
|
41
|
-
if (refreshStatus === false)
|
|
42
|
-
return Promise.reject(error); // If the refresh failed, reject the promise
|
|
43
|
-
// NOTICE: This is needed to send the request as multipart form data,
|
|
44
|
-
// because resending the request with axios resets the Content-Type to application/json for some reason
|
|
45
|
-
// Use transformRequest to set Content-Type and include boundary for multipart form data
|
|
46
|
-
prevRequest.headers['Content-Type'] = 'multipart/form-data';
|
|
47
|
-
prevRequest.transformRequest = [
|
|
48
|
-
(data, headers) => {
|
|
49
|
-
// If the request data is FormData, set the boundary
|
|
50
|
-
if (data instanceof FormData) {
|
|
51
|
-
// @ts-ignore
|
|
52
|
-
headers['Content-Type'] += `; boundary=${data._boundary}`;
|
|
53
|
-
}
|
|
54
|
-
return data;
|
|
55
|
-
},
|
|
56
|
-
...axios.defaults.transformRequest, // Keep the default transformRequest functions
|
|
57
|
-
];
|
|
58
|
-
return axiosPrivate(prevRequest); // The request that returned 401 is retried with the new access token
|
|
59
|
-
}
|
|
60
|
-
return Promise.reject(error);
|
|
61
|
-
});
|
|
62
|
-
// Remove the interceptors when the component unmounts
|
|
63
|
-
// This is needed to prevent memory leaks
|
|
64
|
-
return () => {
|
|
65
|
-
// Eject the interceptors
|
|
66
|
-
axiosPrivate.interceptors.request.eject(requestIntercept);
|
|
67
|
-
axiosPrivate.interceptors.response.eject(responseIntercept);
|
|
68
|
-
};
|
|
69
|
-
}, [
|
|
70
|
-
/*auth, refresh*/
|
|
71
|
-
]);
|
|
72
|
-
return axiosPrivate;
|
|
73
|
-
};
|
|
74
|
-
export default useAxiosPrivate;
|
|
1
|
+
import { axiosPrivate } from '../axios/axiosInstance.jsx';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import useRefreshToken from './useRefreshToken.jsx';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { getCsrfToken } from '../react.jsx';
|
|
6
|
+
const useAxiosPrivate = (options) => {
|
|
7
|
+
const refresh = useRefreshToken();
|
|
8
|
+
const { refreshTokenOn = 401 } = options || {};
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
/**
|
|
11
|
+
* Add a request interceptor
|
|
12
|
+
*/
|
|
13
|
+
const requestIntercept = axiosPrivate.interceptors.request.use(
|
|
14
|
+
/**
|
|
15
|
+
* Do something before request is sent
|
|
16
|
+
* @param config The request config object
|
|
17
|
+
*/
|
|
18
|
+
async (config) => {
|
|
19
|
+
if (config.method && ['post', 'put', 'delete'].includes(config.method.toLowerCase())) {
|
|
20
|
+
/**
|
|
21
|
+
* If the request is a POST, PUT, or DELETE request, the XSRF-TOKEN header is added to the request.
|
|
22
|
+
*/
|
|
23
|
+
config.headers['x-csrf-token'] = await getCsrfToken();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Return the config object
|
|
27
|
+
*/
|
|
28
|
+
return config;
|
|
29
|
+
}, (error) => Promise.reject(error));
|
|
30
|
+
/**
|
|
31
|
+
* This is the response interceptor
|
|
32
|
+
*/
|
|
33
|
+
const responseIntercept = axiosPrivate.interceptors.response.use((response) => response, // Do nothing if the request is successful,
|
|
34
|
+
async (error) => {
|
|
35
|
+
// If the access token has expired, refresh it and retry the request
|
|
36
|
+
const prevRequest = error?.config; // The request that caused the error (the one that returned 401) is saved in the error object
|
|
37
|
+
if (error?.response?.status === refreshTokenOn && !prevRequest?.sent) {
|
|
38
|
+
// If the error is 401 and the request hasn't been sent before
|
|
39
|
+
prevRequest.sent = true; // Prevent infinite loops
|
|
40
|
+
const refreshStatus = await refresh(); // Refresh the access token cookie
|
|
41
|
+
if (refreshStatus === false)
|
|
42
|
+
return Promise.reject(error); // If the refresh failed, reject the promise
|
|
43
|
+
// NOTICE: This is needed to send the request as multipart form data,
|
|
44
|
+
// because resending the request with axios resets the Content-Type to application/json for some reason
|
|
45
|
+
// Use transformRequest to set Content-Type and include boundary for multipart form data
|
|
46
|
+
prevRequest.headers['Content-Type'] = 'multipart/form-data';
|
|
47
|
+
prevRequest.transformRequest = [
|
|
48
|
+
(data, headers) => {
|
|
49
|
+
// If the request data is FormData, set the boundary
|
|
50
|
+
if (data instanceof FormData) {
|
|
51
|
+
// @ts-ignore
|
|
52
|
+
headers['Content-Type'] += `; boundary=${data._boundary}`;
|
|
53
|
+
}
|
|
54
|
+
return data;
|
|
55
|
+
},
|
|
56
|
+
...axios.defaults.transformRequest, // Keep the default transformRequest functions
|
|
57
|
+
];
|
|
58
|
+
return axiosPrivate(prevRequest); // The request that returned 401 is retried with the new access token
|
|
59
|
+
}
|
|
60
|
+
return Promise.reject(error);
|
|
61
|
+
});
|
|
62
|
+
// Remove the interceptors when the component unmounts
|
|
63
|
+
// This is needed to prevent memory leaks
|
|
64
|
+
return () => {
|
|
65
|
+
// Eject the interceptors
|
|
66
|
+
axiosPrivate.interceptors.request.eject(requestIntercept);
|
|
67
|
+
axiosPrivate.interceptors.response.eject(responseIntercept);
|
|
68
|
+
};
|
|
69
|
+
}, [
|
|
70
|
+
/*auth, refresh*/
|
|
71
|
+
]);
|
|
72
|
+
return axiosPrivate;
|
|
73
|
+
};
|
|
74
|
+
export default useAxiosPrivate;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This hook is used to refresh the access token when it expires.
|
|
3
|
-
* It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
|
|
4
|
-
*/
|
|
5
|
-
declare const useRefreshToken: () => () => Promise<unknown>;
|
|
6
|
-
export default useRefreshToken;
|
|
1
|
+
/**
|
|
2
|
+
* This hook is used to refresh the access token when it expires.
|
|
3
|
+
* It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
|
|
4
|
+
*/
|
|
5
|
+
declare const useRefreshToken: () => () => Promise<unknown>;
|
|
6
|
+
export default useRefreshToken;
|
|
7
7
|
//# sourceMappingURL=useRefreshToken.d.ts.map
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { logout, refreshSession } from
|
|
2
|
-
/**
|
|
3
|
-
* This hook is used to refresh the access token when it expires.
|
|
4
|
-
* It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
|
|
5
|
-
*/
|
|
6
|
-
const useRefreshToken = () => {
|
|
7
|
-
let isRefreshing = false; // Is a refresh request being sent?
|
|
8
|
-
let failedQueue = []; // An array of requests that failed because of 401
|
|
9
|
-
const processQueue = (error, token = null) => {
|
|
10
|
-
failedQueue.forEach((prom) => {
|
|
11
|
-
if (error) {
|
|
12
|
-
prom.reject(error);
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
prom.resolve(token);
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
failedQueue = [];
|
|
19
|
-
};
|
|
20
|
-
const refresh = async () => {
|
|
21
|
-
try {
|
|
22
|
-
const response = await fetch('/api/auth/refresh');
|
|
23
|
-
const data = await response.json();
|
|
24
|
-
/**
|
|
25
|
-
* The refresh request is done
|
|
26
|
-
*/
|
|
27
|
-
isRefreshing = false;
|
|
28
|
-
if (response.status !== 200) {
|
|
29
|
-
/**
|
|
30
|
-
* If the refresh token is invalid, we log out the user
|
|
31
|
-
*/
|
|
32
|
-
await logout({
|
|
33
|
-
/**
|
|
34
|
-
* No need to delete the cookies, because they are both invalid.
|
|
35
|
-
*/
|
|
36
|
-
deleteCookies: false,
|
|
37
|
-
});
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
/**
|
|
42
|
-
* update the session
|
|
43
|
-
*/
|
|
44
|
-
await refreshSession();
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Process the failed requests
|
|
48
|
-
*/
|
|
49
|
-
processQueue(null, data?.accessToken);
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
/**
|
|
54
|
-
* If the refresh token is invalid, we log out the user
|
|
55
|
-
*/
|
|
56
|
-
await logout({
|
|
57
|
-
/**
|
|
58
|
-
* No need to delete the cookies, because they are both invalid.
|
|
59
|
-
*/
|
|
60
|
-
deleteCookies: false,
|
|
61
|
-
});
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
// TODO: Apply this inside useAxiosPrivate.tsx to prevent even the 401 errors from happening
|
|
66
|
-
// Let's use semaphores to prevent multiple refreshes at the same time
|
|
67
|
-
return async () => {
|
|
68
|
-
if (isRefreshing) {
|
|
69
|
-
// If a refresh request is being sent, we return a promise
|
|
70
|
-
// that will be resolved when the refresh request is done
|
|
71
|
-
return new Promise((resolve, reject) => {
|
|
72
|
-
failedQueue.push({ resolve, reject });
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
isRefreshing = true; // A refresh request is being sent
|
|
76
|
-
return await refresh(); // Send the refresh request and return the new access token
|
|
77
|
-
};
|
|
78
|
-
};
|
|
79
|
-
export default useRefreshToken;
|
|
1
|
+
import { logout, refreshSession } from '../react.jsx';
|
|
2
|
+
/**
|
|
3
|
+
* This hook is used to refresh the access token when it expires.
|
|
4
|
+
* It is used in the useAxiosPrivate hook to refresh the access token when a request returns a 401 error.
|
|
5
|
+
*/
|
|
6
|
+
const useRefreshToken = () => {
|
|
7
|
+
let isRefreshing = false; // Is a refresh request being sent?
|
|
8
|
+
let failedQueue = []; // An array of requests that failed because of 401
|
|
9
|
+
const processQueue = (error, token = null) => {
|
|
10
|
+
failedQueue.forEach((prom) => {
|
|
11
|
+
if (error) {
|
|
12
|
+
prom.reject(error);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
prom.resolve(token);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
failedQueue = [];
|
|
19
|
+
};
|
|
20
|
+
const refresh = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch('/api/auth/refresh');
|
|
23
|
+
const data = await response.json();
|
|
24
|
+
/**
|
|
25
|
+
* The refresh request is done
|
|
26
|
+
*/
|
|
27
|
+
isRefreshing = false;
|
|
28
|
+
if (response.status !== 200) {
|
|
29
|
+
/**
|
|
30
|
+
* If the refresh token is invalid, we log out the user
|
|
31
|
+
*/
|
|
32
|
+
await logout({
|
|
33
|
+
/**
|
|
34
|
+
* No need to delete the cookies, because they are both invalid.
|
|
35
|
+
*/
|
|
36
|
+
deleteCookies: false,
|
|
37
|
+
});
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
/**
|
|
42
|
+
* update the session
|
|
43
|
+
*/
|
|
44
|
+
await refreshSession();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Process the failed requests
|
|
48
|
+
*/
|
|
49
|
+
processQueue(null, data?.accessToken);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
/**
|
|
54
|
+
* If the refresh token is invalid, we log out the user
|
|
55
|
+
*/
|
|
56
|
+
await logout({
|
|
57
|
+
/**
|
|
58
|
+
* No need to delete the cookies, because they are both invalid.
|
|
59
|
+
*/
|
|
60
|
+
deleteCookies: false,
|
|
61
|
+
});
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
// TODO: Apply this inside useAxiosPrivate.tsx to prevent even the 401 errors from happening
|
|
66
|
+
// Let's use semaphores to prevent multiple refreshes at the same time
|
|
67
|
+
return async () => {
|
|
68
|
+
if (isRefreshing) {
|
|
69
|
+
// If a refresh request is being sent, we return a promise
|
|
70
|
+
// that will be resolved when the refresh request is done
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
failedQueue.push({ resolve, reject });
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
isRefreshing = true; // A refresh request is being sent
|
|
76
|
+
return await refresh(); // Send the refresh request and return the new access token
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
export default useRefreshToken;
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
export interface Session {
|
|
2
|
-
user: User;
|
|
3
|
-
}
|
|
4
|
-
export interface User {
|
|
5
|
-
id: string;
|
|
6
|
-
name: string;
|
|
7
|
-
locale?: string | null;
|
|
8
|
-
email?: string | null;
|
|
9
|
-
image?: string | null;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Internal function to get the auth session
|
|
13
|
-
*/
|
|
14
|
-
declare function __auth__internal(): Promise<Session | null>;
|
|
15
|
-
/**
|
|
16
|
-
* Cache the auth session to avoid unnecessary requests per a single server request.
|
|
17
|
-
*/
|
|
18
|
-
declare const auth: typeof __auth__internal;
|
|
19
|
-
/**
|
|
20
|
-
* Export the auth function
|
|
21
|
-
*/
|
|
22
|
-
export default auth;
|
|
1
|
+
export interface Session {
|
|
2
|
+
user: User;
|
|
3
|
+
}
|
|
4
|
+
export interface User {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
locale?: string | null;
|
|
8
|
+
email?: string | null;
|
|
9
|
+
image?: string | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Internal function to get the auth session
|
|
13
|
+
*/
|
|
14
|
+
declare function __auth__internal(): Promise<Session | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Cache the auth session to avoid unnecessary requests per a single server request.
|
|
17
|
+
*/
|
|
18
|
+
declare const auth: typeof __auth__internal;
|
|
19
|
+
/**
|
|
20
|
+
* Export the auth function
|
|
21
|
+
*/
|
|
22
|
+
export default auth;
|
|
23
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/auth/index.js
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import { decodeJWT } from
|
|
2
|
-
import { cookies } from 'next/headers';
|
|
3
|
-
import { cache } from 'react';
|
|
4
|
-
/**
|
|
5
|
-
* Get the authenticated user from the access token
|
|
6
|
-
* @param accessToken
|
|
7
|
-
*/
|
|
8
|
-
const getAuthedUser = (accessToken) => {
|
|
9
|
-
if (!accessToken)
|
|
10
|
-
return null;
|
|
11
|
-
try {
|
|
12
|
-
return decodeJWT(accessToken);
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
/**
|
|
19
|
-
* Internal function to get the auth session
|
|
20
|
-
*/
|
|
21
|
-
async function __auth__internal() {
|
|
22
|
-
const cookieJar = await cookies();
|
|
23
|
-
const jwt = getAuthedUser(cookieJar.get('access_token')?.value);
|
|
24
|
-
if (jwt) {
|
|
25
|
-
return {
|
|
26
|
-
user: {
|
|
27
|
-
id: jwt.id,
|
|
28
|
-
name: jwt.sub,
|
|
29
|
-
locale: jwt.locale,
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Cache the auth session to avoid unnecessary requests per a single server request.
|
|
39
|
-
*/
|
|
40
|
-
const auth = cache(__auth__internal);
|
|
41
|
-
/**
|
|
42
|
-
* Export the auth function
|
|
43
|
-
*/
|
|
44
|
-
export default auth;
|
|
1
|
+
import { decodeJWT } from './jwt.js';
|
|
2
|
+
import { cookies } from 'next/headers';
|
|
3
|
+
import { cache } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Get the authenticated user from the access token
|
|
6
|
+
* @param accessToken
|
|
7
|
+
*/
|
|
8
|
+
const getAuthedUser = (accessToken) => {
|
|
9
|
+
if (!accessToken)
|
|
10
|
+
return null;
|
|
11
|
+
try {
|
|
12
|
+
return decodeJWT(accessToken);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Internal function to get the auth session
|
|
20
|
+
*/
|
|
21
|
+
async function __auth__internal() {
|
|
22
|
+
const cookieJar = await cookies();
|
|
23
|
+
const jwt = getAuthedUser(cookieJar.get('access_token')?.value);
|
|
24
|
+
if (jwt) {
|
|
25
|
+
return {
|
|
26
|
+
user: {
|
|
27
|
+
id: jwt.id,
|
|
28
|
+
name: jwt.sub,
|
|
29
|
+
locale: jwt.locale,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Cache the auth session to avoid unnecessary requests per a single server request.
|
|
39
|
+
*/
|
|
40
|
+
const auth = cache(__auth__internal);
|
|
41
|
+
/**
|
|
42
|
+
* Export the auth function
|
|
43
|
+
*/
|
|
44
|
+
export default auth;
|