mirror of
https://github.com/Infisical/infisical.git
synced 2025-07-13 09:35:39 +00:00
Compare commits
1199 Commits
misc/add-p
...
audit-log-
Author | SHA1 | Date | |
---|---|---|---|
a614b81a7a | |||
c0b296ccd5 | |||
da82cfdf6b | |||
92147b5398 | |||
526e184bd9 | |||
9943312063 | |||
c2cefb2b0c | |||
7571c9b426 | |||
bf707667b5 | |||
d2e6743f22 | |||
9e896563ed | |||
64744d042d | |||
2648ac1c90 | |||
22ae1aeee4 | |||
cd13733621 | |||
0191eb48f3 | |||
9d39910152 | |||
c5a8786d1c | |||
9137fa4ca5 | |||
84687c0558 | |||
78da7ec343 | |||
a678ebb4ac | |||
83dd38db49 | |||
00d4ae9fbd | |||
218338e5d2 | |||
456107fbf3 | |||
2003f5b671 | |||
d2c6bcc7a7 | |||
06bd593b60 | |||
aea43c0a8e | |||
06f5af1200 | |||
f903e5b3d4 | |||
c6f8915d3f | |||
65b1354ef1 | |||
cda8579ca4 | |||
5badb811e1 | |||
7f8b489724 | |||
8723a16913 | |||
b4593a2e11 | |||
1b1acdcb0b | |||
1bbf78e295 | |||
a8f08730a1 | |||
9af9050aa2 | |||
3b767a4deb | |||
18f5f5d04e | |||
6a6f08fc4d | |||
cc564119e0 | |||
189b0dd5ee | |||
9cbef2c07b | |||
9a960a85cd | |||
2a9e31d305 | |||
fb2f1731dd | |||
42648a134c | |||
defb66ce65 | |||
a3d06fdf1b | |||
9049c441d6 | |||
51ecc9dfa0 | |||
13c9879fb6 | |||
8c6b903204 | |||
23b20ebdab | |||
37d490ede3 | |||
edecfb1f62 | |||
ae35a863bc | |||
73025f5094 | |||
82634983ce | |||
af2f3017b7 | |||
a8f0eceeb9 | |||
36ff5e054b | |||
eff73f1810 | |||
68357b5669 | |||
03c2e93bea | |||
8c1f3837e7 | |||
7b47d91cc1 | |||
c37afaa050 | |||
811920f8bb | |||
7b295c5a21 | |||
527a727c1c | |||
0139064aaa | |||
a3859170fe | |||
62ad82f7b1 | |||
02b97cbf5b | |||
8a65343f79 | |||
cf6181eb73 | |||
984ffd2a53 | |||
a1c44bd7a2 | |||
d7860e2491 | |||
db33349f49 | |||
7ab67db84d | |||
e14bb6b901 | |||
3a17281e37 | |||
91d6d5d07b | |||
ac7b23da45 | |||
1fdc82e494 | |||
3daae6f965 | |||
833963af0c | |||
aa560b8199 | |||
a215b99b3c | |||
fbd9ecd980 | |||
3b839d4826 | |||
b52ec37f76 | |||
5709afe0d3 | |||
566a243520 | |||
147c21ab9f | |||
abfe185a5b | |||
f62eb9f8a2 | |||
ec60080e27 | |||
9fdc56bd6c | |||
9163da291e | |||
f6c10683a5 | |||
307e6900ee | |||
bb59bb1868 | |||
139f880be1 | |||
69157cb912 | |||
44eb761d5b | |||
f6002d81b3 | |||
af240bd58c | |||
414de3c4d0 | |||
1a7b810bad | |||
0379ba4eb1 | |||
c2ce1aa5aa | |||
c8e155f0ca | |||
5ced43574d | |||
19ff045d2e | |||
4784f47a72 | |||
abbf541c9f | |||
28a27daf29 | |||
fcdd121a58 | |||
5bfd92bf8d | |||
83f0a500bd | |||
325d277021 | |||
45af2c0b49 | |||
9ca71f663a | |||
e5c7aba745 | |||
cada75bd0c | |||
a37689eeca | |||
38c9242e5b | |||
8dafa75aa2 | |||
aea61bae38 | |||
37a10d1435 | |||
a64c2173e7 | |||
ec0603a464 | |||
bf8d60fcdc | |||
b47846a780 | |||
ea403b0393 | |||
9ab89fdef6 | |||
dea22ab844 | |||
8bdf294a34 | |||
0b2c967e63 | |||
c89876aa10 | |||
76b3aab4c0 | |||
944319b9b6 | |||
ac6f79815a | |||
6734bf245f | |||
b32584ce73 | |||
3e41b359c5 | |||
2352bca03e | |||
9f3236b47d | |||
01c5f516f8 | |||
74067751a6 | |||
fa7318eeb1 | |||
fb9c580e53 | |||
1bfdbb7314 | |||
6b3279cbe5 | |||
48ac6b4aff | |||
b0c1c9ce26 | |||
d82d22a198 | |||
c66510f473 | |||
09cdd5ec91 | |||
e028b4e26d | |||
b8f7ffbf53 | |||
0d97fc27c7 | |||
098c1d840b | |||
cce2a54265 | |||
d1033cb324 | |||
7134e1dc66 | |||
8aa26b77ed | |||
4b06880320 | |||
124cd9f812 | |||
d531d069d1 | |||
522a5d477d | |||
d2f0db669a | |||
4dd78d745b | |||
4fef5c305d | |||
e5bbc46b0f | |||
30f3543850 | |||
114915f913 | |||
b5801af9a8 | |||
20366a8c07 | |||
60a4c72a5d | |||
447e28511c | |||
650ed656e3 | |||
13d2cbd8b0 | |||
abfc5736fd | |||
54ac450b63 | |||
3871fa552c | |||
9c72ee7f10 | |||
22e8617661 | |||
2f29a513cc | |||
cb6c28ac26 | |||
d3833c33b3 | |||
978a3e5828 | |||
27bf91e58f | |||
f2c3c76c60 | |||
85023916e4 | |||
3723afe595 | |||
02afd6a8e7 | |||
14d6f6c048 | |||
929eac4350 | |||
c6074dd69a | |||
a9b26755ba | |||
033e5d3f81 | |||
90634e1913 | |||
58b61a861a | |||
3c8ec7d7fb | |||
26a59286c5 | |||
392792bb1e | |||
d79a6b8f25 | |||
217a09c97b | |||
a389ede03d | |||
10939fecc0 | |||
48f40ff938 | |||
969896e431 | |||
fd85da5739 | |||
2caf6ff94b | |||
ed7d709a70 | |||
aff97374a9 | |||
e8e90585ca | |||
abd9dbf714 | |||
89aed3640b | |||
5513ff7631 | |||
9fb7676739 | |||
6ac734d6c4 | |||
8044999785 | |||
be51e4372d | |||
460b545925 | |||
2f26c1930b | |||
68abd0f044 | |||
f3c11a0a17 | |||
f4779de051 | |||
defe7b8f0b | |||
cf3113ac89 | |||
953cc3a850 | |||
fc9ae05f89 | |||
de22a3c56b | |||
7c4baa6fd4 | |||
f285648c95 | |||
0f04890d8f | |||
61274243e2 | |||
9366428091 | |||
62482852aa | |||
cc02c00b61 | |||
2e256e4282 | |||
1b4bae6a84 | |||
1f0bcae0fc | |||
dcd21883d1 | |||
9af5a66bab | |||
d7913a75c2 | |||
205442bff5 | |||
8ab51aba12 | |||
e8d19eb823 | |||
3d1f054b87 | |||
5d30215ea7 | |||
29fedfdde5 | |||
b5317d1d75 | |||
86c145301e | |||
6446311b6d | |||
3e80f1907c | |||
79e62eec25 | |||
c41730c5fb | |||
aac63d3097 | |||
f0b9d3c816 | |||
ea393d144a | |||
c4c0f86598 | |||
1f7617d132 | |||
c95680b95d | |||
18f1f93b5f | |||
70ea761375 | |||
5b4790ee78 | |||
5ab2a6bb5d | |||
dcac85fe6c | |||
2f07471404 | |||
137fd5ef07 | |||
883c7835a1 | |||
e33f34ceb4 | |||
af5805a5ca | |||
bcf1c49a1b | |||
84fedf8eda | |||
97755981eb | |||
8291663802 | |||
d9aed45504 | |||
8ada11edf3 | |||
4bd62aa462 | |||
0366e58a5b | |||
9f6dca23db | |||
18e733c71f | |||
f0a95808e7 | |||
90a0d0f744 | |||
7f9c9be2c8 | |||
070982081c | |||
f462c3f85d | |||
8683693103 | |||
737fffcceb | |||
ffac24ce75 | |||
c505c5877f | |||
b59fa14bb6 | |||
d4bf8a33dc | |||
0eb36d7e35 | |||
ae2da0066a | |||
6566393e21 | |||
1d7da56b40 | |||
af245b1f16 | |||
3d2465ae41 | |||
c17df7e951 | |||
4d4953e95a | |||
f4f34802bc | |||
59cc857aef | |||
a6713b2f76 | |||
3c9a7c77ff | |||
f1bfea61d0 | |||
144ad2f25f | |||
43e0d400f9 | |||
b80b77ec36 | |||
02a2309953 | |||
f1587d8375 | |||
42aaddccd5 | |||
39abeaaab5 | |||
198e74cd88 | |||
8ed0a1de84 | |||
b336c0c3d6 | |||
305f2d79de | |||
d4a6faa92c | |||
4800e9c36e | |||
842a2e9a06 | |||
de81d2d380 | |||
f5d769fa05 | |||
b3ace353ce | |||
48353ab201 | |||
2137d13157 | |||
647e13d654 | |||
bb2a933a39 | |||
6f75debb9c | |||
90588bc3c9 | |||
4a09fc5e63 | |||
f0ec8c883f | |||
8024d7448f | |||
c65b79e00d | |||
f5238598aa | |||
982aa80092 | |||
c305ddd463 | |||
b30706607f | |||
2a3d19dcb2 | |||
b4ff620b44 | |||
23f1888123 | |||
7764f63299 | |||
cb3365afd4 | |||
58705ffc3f | |||
67e57d8993 | |||
90ff13a6b5 | |||
36145a15c1 | |||
4f64ed6b42 | |||
27cb686216 | |||
e201d77a8f | |||
d47959ca83 | |||
3b2953ca58 | |||
1daa503e0e | |||
d69e8d2a8d | |||
7c7af347fc | |||
f85efdc6f8 | |||
8680c52412 | |||
0ad3c67f82 | |||
f75fff0565 | |||
1fa1d0a15a | |||
e5a967b918 | |||
3cfe2223b6 | |||
a43d4fd430 | |||
80b6fb677c | |||
5bc8acd0a7 | |||
2575845df7 | |||
641d58c157 | |||
430f5d516c | |||
5cec194e74 | |||
5ede4f6f4b | |||
4d3581f835 | |||
665f7fa5c3 | |||
9f4b1d2565 | |||
59e2a20180 | |||
4fee5a5839 | |||
61e245ea58 | |||
8d6712aa58 | |||
a767870ad6 | |||
a0c432628a | |||
08a74a63b5 | |||
8329240822 | |||
ec3cbb9460 | |||
f167ba0fb8 | |||
f291aa1c01 | |||
72131373ec | |||
16c48de031 | |||
436a5afab5 | |||
9445f717f4 | |||
251e83a3fb | |||
66df285245 | |||
73fe2659b5 | |||
091f02d1cd | |||
57e97a146b | |||
66140dc151 | |||
a8c54d27ef | |||
9ac4453523 | |||
a6a9c2404d | |||
e5352e7aa8 | |||
c52180c890 | |||
20f0eeed35 | |||
d2c7ed62d0 | |||
7e9743b4c2 | |||
34cf544b3a | |||
12fd063cd5 | |||
8fb6063686 | |||
459b262865 | |||
7581300a67 | |||
7d90d183fb | |||
f27d4ee973 | |||
470d7cca6a | |||
7473e3e21e | |||
8e3918ada3 | |||
6720217cee | |||
f385386a4b | |||
62a0d6e614 | |||
8c64c731f9 | |||
d51f6ca4fd | |||
5abcbe36ca | |||
7a13c27055 | |||
e7ac783b10 | |||
0a509e5033 | |||
bd54054bc3 | |||
cfe51d4a52 | |||
d0c01755fe | |||
41e65775ab | |||
e3f4a2e604 | |||
f6e6bdb691 | |||
819a021e9c | |||
80113c2cea | |||
9cdd7380df | |||
07d491acd1 | |||
3276853427 | |||
1f1fb3f3d1 | |||
a8eb72a8c5 | |||
2b8220a71b | |||
f76d3e2a14 | |||
d35331b0a8 | |||
ff6d94cbd0 | |||
01ef498397 | |||
59ac14380a | |||
7b5c86f4ef | |||
a745be2546 | |||
02f311515c | |||
e8cb3f8b4a | |||
4c8063c532 | |||
6a9b2d3d48 | |||
0a39e138a1 | |||
0dce2045ec | |||
b4c118d246 | |||
90e675de1e | |||
741e0ec78f | |||
3f654e115d | |||
1921346b4f | |||
76c95ace63 | |||
f4ae40cb86 | |||
b790dbb36f | |||
14449b8b41 | |||
489bd124d2 | |||
bcdcaa33a4 | |||
e8a8542757 | |||
e61d35d824 | |||
714d6831bd | |||
956f75eb43 | |||
73902c3ad6 | |||
da792d144d | |||
f7b09f5fc2 | |||
bfee34f38d | |||
840b64a049 | |||
c2612f242c | |||
092b89c59e | |||
3d76ae3399 | |||
23aa97feff | |||
0c5155f8e6 | |||
796d6bfc85 | |||
4afe2f2377 | |||
6eaa16bd07 | |||
1e07c2fe23 | |||
149f98a1b7 | |||
14745b560c | |||
dcfa0a2386 | |||
199339ac32 | |||
2aeb02b74a | |||
fe75627ab7 | |||
191486519f | |||
cab8fb0d8e | |||
8bfd728ce4 | |||
c9eab0af18 | |||
d7dfc531fc | |||
a89bd08c08 | |||
4bfb9e8e74 | |||
da5f054a65 | |||
9b13619efa | |||
c076a900dc | |||
8a5279cf0d | |||
d45c29cd23 | |||
77fe2ffb3b | |||
edf4e75e55 | |||
de917a5d74 | |||
46f9927cf1 | |||
92508d19e6 | |||
a73c0c05af | |||
c12bfa766c | |||
3432a16d4f | |||
19a403f467 | |||
7a00ade119 | |||
35127db635 | |||
1b9eecc8f4 | |||
f0b8c1537c | |||
4e60cff4bd | |||
ed1100bc90 | |||
dabe7e42ec | |||
c8ca6710ba | |||
7adac40756 | |||
400dc75656 | |||
4ecb2eb383 | |||
23a7c1b8cc | |||
e51278c276 | |||
c014c12ecb | |||
097b04afee | |||
f304024235 | |||
63ccfc40ac | |||
5311daed64 | |||
d5e9ac82d0 | |||
b43ecef112 | |||
f9c012387c | |||
5b51ab3216 | |||
b26e56c97e | |||
7cced29c74 | |||
06a7e804eb | |||
0f00474243 | |||
3df010f266 | |||
333ce9d164 | |||
9621df4f8b | |||
3f2de2c5ef | |||
b2b1c13393 | |||
ee98992d9e | |||
1fb0c638d6 | |||
c1ad49a532 | |||
d1fcc739c9 | |||
8c0287681b | |||
c7458d94aa | |||
93570df318 | |||
e798b4a7ba | |||
36c93f47d9 | |||
dbbcb157ef | |||
d5f0b4dad9 | |||
bdc23d22e7 | |||
0fd1b1c9d7 | |||
79df946f02 | |||
da2fa7f3ca | |||
08c1740afc | |||
3cac4ef927 | |||
2667f8f0f2 | |||
b39537472b | |||
6b60b2562d | |||
c2a7827080 | |||
64e09b0dcd | |||
a7176d44dd | |||
09d4cdc634 | |||
547ef17c10 | |||
841408042e | |||
e5fb1ac808 | |||
8a93c0bd59 | |||
c0f8f50981 | |||
fec47ef81c | |||
348f4b9787 | |||
aa577b095c | |||
f515cc83d7 | |||
17bbdbe7bb | |||
427de068d5 | |||
dbf7ecc9b6 | |||
1ef9885062 | |||
de48c3e161 | |||
852664e2cb | |||
fbc8264732 | |||
4303547d8c | |||
f1c8a66d31 | |||
baa05714ab | |||
0c21c19c95 | |||
c487614c38 | |||
a55c8cacea | |||
62308fb0a3 | |||
55aa1e87c0 | |||
c5c7adbc42 | |||
f686882ce6 | |||
e35417e11b | |||
ff0f4cf46a | |||
2d4476f99c | |||
81df491d5e | |||
d2c5603664 | |||
096930cb8f | |||
f9c00cf442 | |||
d32b6ad41d | |||
53968e07d0 | |||
64093e9175 | |||
c315eed4d4 | |||
78fd852588 | |||
0c1f761a9a | |||
c363f485eb | |||
433d83641d | |||
35bb7f299c | |||
160e2b773b | |||
f0a70e23ac | |||
a6271a6187 | |||
b2fbec740f | |||
26bed22b94 | |||
86e5f46d89 | |||
720789025c | |||
811b3d5934 | |||
cac702415f | |||
dbe7acdc80 | |||
b33985b338 | |||
670376336e | |||
c59eddb00a | |||
fe40ba497b | |||
c5b7e3d8be | |||
47e778a0b8 | |||
8b443e0957 | |||
f7fb015bd8 | |||
0d7cd357c3 | |||
e40f65836f | |||
2d3c63e8b9 | |||
bdb36d6be4 | |||
3ee8f7aa20 | |||
2be56f6a70 | |||
1ff1f3fad3 | |||
36a5291dc3 | |||
977fd7a057 | |||
bf413c75bc | |||
3250a18050 | |||
0ae96dfff4 | |||
8ad6488bd9 | |||
e264b68b7e | |||
2eb1451c56 | |||
9e881534ec | |||
a24158b187 | |||
2832ff5c76 | |||
4c6cca0864 | |||
c06bbf0b9b | |||
69392a4a51 | |||
130f1a167e | |||
4cc80e38f4 | |||
d5ee74bb1a | |||
8ab710817d | |||
ec776b94ae | |||
ca39e75434 | |||
14be4eb601 | |||
d1faed5672 | |||
9c6b300ad4 | |||
210ddf506a | |||
33d740a4de | |||
86dee1ec5d | |||
6dfe2851e1 | |||
95b843779b | |||
265b25a4c6 | |||
54f6e0b5c6 | |||
f2cdefaeec | |||
2d588d87ac | |||
5ee2eb1aa2 | |||
219aa3c641 | |||
cf5391d6d4 | |||
2ca476f21e | |||
bf81469341 | |||
8445127fad | |||
fb1cf3eb02 | |||
f8c822eda7 | |||
ea5a5e0aa7 | |||
f20e4e189d | |||
c7ec6236e1 | |||
c4dea2d51f | |||
e89b0fdf3f | |||
d57f76d230 | |||
55efa00b8c | |||
29ba92dadb | |||
7ba79dec19 | |||
6ea8bff224 | |||
65f4e1bea1 | |||
73ce3b8bb7 | |||
e63af81e60 | |||
6c2c2b319b | |||
82c2be64a1 | |||
a064e31117 | |||
051d0780a8 | |||
5c9563f18b | |||
5406871c30 | |||
8b89edc277 | |||
b394e191a8 | |||
92030884ec | |||
4583eb1732 | |||
4c8bf9bd92 | |||
a6554deb80 | |||
ae00e74c17 | |||
adfd5a1b59 | |||
d6c321d34d | |||
09a7346f32 | |||
1ae82dc460 | |||
80fada6b55 | |||
e4abac91b4 | |||
b4f37193ac | |||
c8be5a637a | |||
ff5f66a75f | |||
45485f8bd3 | |||
bf72638600 | |||
545df3bf28 | |||
766254c4e3 | |||
4c22024d13 | |||
4bd1eb6f70 | |||
6847e5bb89 | |||
022ecf75e1 | |||
5d35ce6c6c | |||
635f027752 | |||
6334ad0d07 | |||
89e8f200e9 | |||
e57935a7d3 | |||
617d07177c | |||
ce170a6a47 | |||
cb8e36ae15 | |||
16ce1f441e | |||
8043b61c9f | |||
d374ff2093 | |||
eb7c533261 | |||
ac5bfbb6c9 | |||
1f80ff040d | |||
9a935c9177 | |||
f8939835e1 | |||
9d24eb15dc | |||
ed4882dfac | |||
7acd7fd522 | |||
2148b636f5 | |||
e40b4a0a4b | |||
d9bc4da6f1 | |||
7f8d5ec11a | |||
d2b0ca94d8 | |||
5255f0ac17 | |||
311bf8b515 | |||
4f67834eaa | |||
78c4c3e847 | |||
b8aa36be99 | |||
594445814a | |||
141d0ede2d | |||
ab78a79415 | |||
a467b13069 | |||
c425c03939 | |||
8fa6af9ba4 | |||
f0a2845637 | |||
9cc17452fa | |||
93ba6f7b58 | |||
0fcb66e9ab | |||
135f425fcf | |||
9c149cb4bf | |||
ce45c1a43d | |||
1a14c71564 | |||
e7fe2ea51e | |||
caa129b565 | |||
30d7e63a67 | |||
a4c21d85ac | |||
c34a139b19 | |||
f2a55da9b6 | |||
a3584d6a8a | |||
36f1559e5e | |||
07902f7db9 | |||
6fddecdf82 | |||
99e2c85f8f | |||
6e1504dc73 | |||
07d930f608 | |||
1101707d8b | |||
696bbcb072 | |||
54435d0ad9 | |||
952e60f08a | |||
6c52847dec | |||
698260cba6 | |||
5367d1ac2e | |||
8ffc88ba28 | |||
caeda09b21 | |||
1201baf35c | |||
5d5f843a9f | |||
caca23b56c | |||
01ea22f167 | |||
92b9abb52b | |||
e2680d9aee | |||
aa049dc43b | |||
419e9ac755 | |||
b7b36a475d | |||
83c53b9d5a | |||
8cc457d49a | |||
540374f543 | |||
4edb90d644 | |||
1a7151aba7 | |||
80d2d9d2cf | |||
4268fdea44 | |||
781965767d | |||
fef7e43869 | |||
9e651a58e3 | |||
0fbf8efd3a | |||
dcb77bbdd4 | |||
36f7e7d81b | |||
9159a9fa36 | |||
8f97b3ad87 | |||
be80444ec2 | |||
6f2043dc26 | |||
6ae7b5e996 | |||
95fcf560a5 | |||
d8ee05bfba | |||
400157a468 | |||
274952544f | |||
d23beaedf1 | |||
73e89fc4db | |||
817e762e6b | |||
ce5712606f | |||
ce67e5f137 | |||
440c45fd42 | |||
893a042c25 | |||
f3fb65fcc3 | |||
c0add863be | |||
5878904f77 | |||
98ab969356 | |||
d4523b0ca4 | |||
2be8c47ae8 | |||
8730d14104 | |||
d924580599 | |||
6e3fe0fe24 | |||
9d11babc4d | |||
ce97179b49 | |||
f9ebb919e5 | |||
739ef8e05a | |||
d5f5abef8e | |||
644659bc10 | |||
21e4fa83ef | |||
a6a6c72397 | |||
4061feba21 | |||
90a415722c | |||
f3d5790e2c | |||
0d0fddb53a | |||
9f2e379d4d | |||
14e898351f | |||
16e0aa13c8 | |||
dc130ecd7f | |||
b70c6b6260 | |||
a701635f08 | |||
9eb98dd276 | |||
96e9bc3b2f | |||
22f32e060b | |||
b4f26aac25 | |||
b634a6c371 | |||
080ae5ce6f | |||
90d213a8ab | |||
52a26b51af | |||
3b28e946cf | |||
dfcf613023 | |||
f711f8a35c | |||
9c8bb71878 | |||
d0547c354a | |||
88abdd9529 | |||
f3a04f1a2f | |||
082d6c44c4 | |||
a0aafcc1bf | |||
3ae2ec1f51 | |||
ce4e35e908 | |||
4db82e37c1 | |||
b350841b86 | |||
3a8789af76 | |||
79ebfc92e9 | |||
ffca4aa054 | |||
52b3f7e8c8 | |||
9de33d8c23 | |||
ad623f8753 | |||
9cedae61a9 | |||
97aed61c54 | |||
972dbac7db | |||
5c0e265703 | |||
4efbb8dca6 | |||
09db9e340b | |||
5e3d4edec9 | |||
86348eb434 | |||
d31d28666a | |||
3362ec29cd | |||
3a0e2bf88b | |||
86862b932c | |||
85fefb2a82 | |||
858ec2095e | |||
a5bb80d2cf | |||
3156057278 | |||
b5da1d7a6c | |||
8fa8161602 | |||
b12aca62ff | |||
c9cd843184 | |||
47442b16f5 | |||
0bdb5d3f19 | |||
cd9ab0024e | |||
f4bed26781 | |||
abedb4b53c | |||
29561d37e9 | |||
75e9ea9c5d | |||
d0c10838e1 | |||
4773336a04 | |||
4dc587576b | |||
7097731539 | |||
4261281b0f | |||
ff7ff06a6a | |||
6cbeb4ddf9 | |||
f7a4731565 | |||
5a07c3d1d4 | |||
d96e880015 | |||
4df6c8c2cc | |||
70860e0d26 | |||
3f3b81f9bf | |||
5181cac9c8 | |||
5af39b1a40 | |||
a70aff5f31 | |||
a9723134f9 | |||
fe237fbf4a | |||
98e79207cc | |||
26375715e4 | |||
5c435f7645 | |||
f7a9e13209 | |||
04908edb5b | |||
e8753a3ce8 | |||
1947989ca5 | |||
c22e616771 | |||
40711ac707 | |||
a47e6910b1 | |||
78c4a591a9 | |||
f6b7717517 | |||
0885620981 | |||
f67511fa19 | |||
e6c97510ca | |||
476671e6ef | |||
b21a5b6425 | |||
d1d5dd29c6 | |||
41d7987a6e | |||
66a5691ffd | |||
6bdf62d453 | |||
652a48b520 | |||
3148c54e18 | |||
44367f9149 | |||
286dc39ed2 | |||
bd4cf64fc6 | |||
f4e3d7d576 | |||
8298f9974f | |||
da347e96e1 | |||
5df96234a0 | |||
e78682560c | |||
1602fac5ca | |||
0100bf7032 | |||
e2c49878c6 | |||
e74117b7fd | |||
335aada941 | |||
b949fe06c3 | |||
28e539c481 | |||
5c4c881b60 | |||
8ffb92bfb3 | |||
db9a1726c2 | |||
15986633c7 | |||
c4809bbb54 | |||
6305aab0d1 | |||
456493ff5a | |||
8cfaefcec5 | |||
e39e80a0e7 | |||
8cae92f29e | |||
918911f2e4 | |||
a1aee45eb2 | |||
5fe93dc35a | |||
5e0e7763a3 | |||
f663d1d4a6 | |||
650f6d9585 | |||
90c36eeded | |||
7994034639 | |||
48619ed24c | |||
21fb8df39b | |||
f03a7cc249 | |||
b5c3f17ec1 | |||
99d88f7687 | |||
8e3559828f | |||
93d7c812e7 | |||
f2dcbfa91c | |||
d08510ebe4 | |||
767159bf8f | |||
98457cdb34 | |||
8ed8f1200d | |||
30252c2bcb | |||
9687f33122 | |||
a5282a56c9 | |||
cc3551c417 | |||
9e6fe39609 | |||
2bc91c42a7 | |||
accb21f7ed | |||
8f010e740f | |||
f3768c90c7 | |||
3190ff2eb1 | |||
c7ec825830 | |||
5b7f445e33 | |||
7fe53ab00e | |||
90c17820fc | |||
e739b29b3c | |||
1a89f2a479 | |||
78568bffe2 | |||
1407a122b9 | |||
8168b5faf8 | |||
8b9e035bf6 | |||
d36d0784ca | |||
e69354b546 | |||
64bd5ddcc8 | |||
72088634d8 | |||
f3a84f6001 | |||
13672481a8 | |||
058394f892 | |||
4f26b43789 | |||
4817eb2fc6 | |||
c623c615a1 | |||
034a8112b7 | |||
5fc6fd71ce | |||
f45c917922 | |||
debef510e4 | |||
be37e27dbf | |||
3b62f956e9 | |||
f49e3788cc | |||
1147f87eed | |||
995e3254ba | |||
67d0c53912 | |||
a6fbcb3e01 | |||
db1ca2b89f | |||
f91bbe1f31 | |||
e5f475e8d6 | |||
1e4ca2f48f | |||
8d5e7406c3 | |||
3b230dad9a | |||
782bf2cdc9 | |||
982b506eb8 | |||
e5bc609a2a | |||
b812761bdd | |||
14362dbe6a | |||
b7b90aea33 | |||
14cc21787d | |||
8d147867ed | |||
eb4e727922 | |||
bb276a0dba | |||
7cdb015b81 | |||
ce446fa723 | |||
82f6c9fb58 | |||
6369d13862 | |||
9f91970be2 | |||
c7398d924a | |||
df57364985 | |||
84322f4f68 | |||
f551806737 | |||
5518df116f | |||
73c6c076e8 | |||
ba2a772247 | |||
8fbe46256b | |||
b75bb93d83 | |||
db4db04ba6 | |||
db44d958d3 | |||
12beb06682 | |||
804f8be07d | |||
e81991c545 | |||
28a3bf0b94 | |||
5712c24370 | |||
65bc522ae9 | |||
b950e07ad6 | |||
498bf8244c | |||
4a391c7ac2 | |||
d49c1e4b72 | |||
424e4670e5 | |||
5e803e76d7 | |||
6648397a64 | |||
85edbbcdc3 | |||
a64f8ac776 | |||
b46a0dfc21 | |||
95ef113aea | |||
07bf65b1c3 | |||
12071e4816 | |||
a40d4efa39 | |||
6d509d85f4 | |||
5b200f42a3 | |||
64f724ed95 | |||
b0d5be6221 | |||
2b21c9d348 | |||
f0a45fb7d8 | |||
40398efb06 | |||
a16c1336fc | |||
ef4df9691d | |||
6a23583391 | |||
e8d00161eb | |||
0a5a073db1 | |||
0f14685d54 | |||
d5888d5bbb | |||
8ff95aedd5 | |||
2b948a18f3 | |||
4d173ad163 | |||
7041b88b9d | |||
f06004370d | |||
c1fa344f02 | |||
df75b3b8d3 | |||
e0322c8a7f | |||
e3725dd3ab | |||
dc6a94ccda | |||
e5229a5377 | |||
2e8003ca95 | |||
04989372b1 | |||
77de085ffc | |||
afcae17e91 | |||
c985690e9a | |||
bb2a70b986 | |||
3ac3710273 | |||
92cb034155 | |||
2493bbbc97 | |||
77b42836e7 | |||
949615606f | |||
6cd7657e41 | |||
38bf5e8b1d | |||
a6bafb8adc | |||
e9e1f4ff5d | |||
13afc9c996 | |||
67d4da40ec | |||
ec633c3e3d | |||
1efdb31037 | |||
44aa743d56 | |||
fefb71dd86 | |||
1748052cb0 | |||
c01a98ccf1 | |||
9ea9f90928 | |||
6319f53802 | |||
966294bd0e | |||
e1dee0678e | |||
8b25f202fe | |||
eb31318d39 | |||
7f6dcd3afa | |||
2b4a6ad907 | |||
ba8fcb6891 | |||
c2df8cf869 | |||
e383872486 | |||
490c589a44 | |||
b358f2dbb7 | |||
10ed6f6b52 | |||
e0f1311f6d | |||
1cff92d000 | |||
db8f43385d | |||
41b45c212d | |||
ef9269fe10 | |||
4d95052896 | |||
260679b01d | |||
a77cc77be8 | |||
9bc5c55cd0 | |||
2cbad206b5 | |||
56b7328231 | |||
edefa7698c | |||
60ea4bb579 | |||
04d553f052 | |||
6d10afc9d2 | |||
c2949964b3 | |||
6faad102e2 | |||
8bfd3913da | |||
d1e5ae2d85 | |||
e5555ffd3f | |||
6b95bb0ceb | |||
b0e25a8bd1 | |||
d483e70748 | |||
4b94848a79 | |||
879b12002c | |||
bc93db8603 | |||
c43a87947f | |||
9e1d38a27b | |||
78d5bc823d | |||
e8d424bbb0 | |||
f0c52cc8da | |||
e58dbe853e | |||
f493a617b1 | |||
05d132a1bb | |||
bd7c4fc4eb | |||
45c84d4936 | |||
8e8e2e0dfe | |||
32a3e1d200 | |||
7447d17e94 | |||
4efa4ad8df | |||
c6e56f0380 | |||
d61216ed62 | |||
580de0565b | |||
bbfd4a44c3 | |||
01e13ca7bd | |||
f5fdd1a266 | |||
bda74ce13e | |||
6a973be6f3 | |||
7f836ed9bc | |||
4d847ab2cb | |||
80cecbb937 | |||
8b6c97d5bc | |||
5641d334cd |
12
.env.example
12
.env.example
@ -107,6 +107,18 @@ INF_APP_CONNECTION_GITHUB_APP_PRIVATE_KEY=
|
|||||||
INF_APP_CONNECTION_GITHUB_APP_SLUG=
|
INF_APP_CONNECTION_GITHUB_APP_SLUG=
|
||||||
INF_APP_CONNECTION_GITHUB_APP_ID=
|
INF_APP_CONNECTION_GITHUB_APP_ID=
|
||||||
|
|
||||||
|
#gitlab app connection
|
||||||
|
INF_APP_CONNECTION_GITLAB_OAUTH_CLIENT_ID=
|
||||||
|
INF_APP_CONNECTION_GITLAB_OAUTH_CLIENT_SECRET=
|
||||||
|
|
||||||
|
#github radar app connection
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_ID=
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_CLIENT_SECRET=
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_PRIVATE_KEY=
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_SLUG=
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_ID=
|
||||||
|
INF_APP_CONNECTION_GITHUB_RADAR_APP_WEBHOOK_SECRET=
|
||||||
|
|
||||||
#gcp app connection
|
#gcp app connection
|
||||||
INF_APP_CONNECTION_GCP_SERVICE_ACCOUNT_CREDENTIAL=
|
INF_APP_CONNECTION_GCP_SERVICE_ACCOUNT_CREDENTIAL=
|
||||||
|
|
||||||
|
53
.github/workflows/check-non-re2-regex.yml
vendored
Normal file
53
.github/workflows/check-non-re2-regex.yml
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
name: Detect Non-RE2 Regex
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-non-re2-regex:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get diff of backend/*
|
||||||
|
run: |
|
||||||
|
git diff --unified=0 "origin/${{ github.base_ref }}"...HEAD -- backend/ > diff.txt
|
||||||
|
|
||||||
|
- name: Scan backend diff for non-RE2 regex
|
||||||
|
run: |
|
||||||
|
# Extract only added lines (excluding file headers)
|
||||||
|
grep '^+' diff.txt | grep -v '^+++' | sed 's/^\+//' > added_lines.txt
|
||||||
|
|
||||||
|
if [ ! -s added_lines.txt ]; then
|
||||||
|
echo "✅ No added lines in backend/ to check for regex usage."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
regex_usage_pattern='(^|[^A-Za-z0-9_"'"'"'`\.\/\\])(\/(?:\\.|[^\/\n\\])+\/[gimsuyv]*(?=\s*[\.\(;,)\]}:]|$)|new RegExp\()'
|
||||||
|
|
||||||
|
# Find all added lines that contain regex patterns
|
||||||
|
if grep -E "$regex_usage_pattern" added_lines.txt > potential_violations.txt 2>/dev/null; then
|
||||||
|
# Filter out lines that contain 'new RE2' (allowing for whitespace variations)
|
||||||
|
if grep -v -E 'new\s+RE2\s*\(' potential_violations.txt > actual_violations.txt 2>/dev/null && [ -s actual_violations.txt ]; then
|
||||||
|
echo "🚨 ERROR: Found forbidden regex pattern in added/modified backend code."
|
||||||
|
echo ""
|
||||||
|
echo "The following lines use raw regex literals (/.../) or new RegExp(...):"
|
||||||
|
echo "Please replace with 'new RE2(...)' for RE2 compatibility."
|
||||||
|
echo ""
|
||||||
|
echo "Offending lines:"
|
||||||
|
cat actual_violations.txt
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "✅ All identified regex usages are correctly using 'new RE2(...)'."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✅ No regex patterns found in added/modified backend lines."
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Cleanup temporary files
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
rm -f diff.txt added_lines.txt potential_violations.txt actual_violations.txt
|
@ -3,7 +3,62 @@ name: Release Infisical Core Helm chart
|
|||||||
on: [workflow_dispatch]
|
on: [workflow_dispatch]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Add Helm repositories
|
||||||
|
run: |
|
||||||
|
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
|
||||||
|
helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
helm repo update
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/infisical-standalone-postgres
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Create namespace
|
||||||
|
run: kubectl create namespace infisical-standalone-postgres
|
||||||
|
|
||||||
|
- name: Create Infisical secrets
|
||||||
|
run: |
|
||||||
|
kubectl create secret generic infisical-secrets \
|
||||||
|
--namespace infisical-standalone-postgres \
|
||||||
|
--from-literal=AUTH_SECRET=6c1fe4e407b8911c104518103505b218 \
|
||||||
|
--from-literal=ENCRYPTION_KEY=6c1fe4e407b8911c104518103505b218 \
|
||||||
|
--from-literal=SITE_URL=http://localhost:8080
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: |
|
||||||
|
ct install \
|
||||||
|
--config ct.yaml \
|
||||||
|
--charts helm-charts/infisical-standalone-postgres \
|
||||||
|
--helm-extra-args="--timeout=300s" \
|
||||||
|
--helm-extra-set-args="--set ingress.nginx.enabled=false --set infisical.autoDatabaseSchemaMigration=false --set infisical.replicaCount=1 --set infisical.image.tag=v0.132.2-postgres" \
|
||||||
|
--namespace infisical-standalone-postgres
|
||||||
|
|
||||||
release:
|
release:
|
||||||
|
needs: test-helm
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
32
.github/workflows/release-k8-operator-helm.yml
vendored
32
.github/workflows/release-k8-operator-helm.yml
vendored
@ -3,8 +3,40 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/secrets-operator
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: ct install --config ct.yaml --charts helm-charts/secrets-operator
|
||||||
|
|
||||||
release-helm:
|
release-helm:
|
||||||
name: Release Helm Chart
|
name: Release Helm Chart
|
||||||
|
needs: test-helm
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
@ -83,7 +83,7 @@ jobs:
|
|||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
goreleaser:
|
goreleaser:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest-8-cores
|
||||||
needs: [cli-integration-tests]
|
needs: [cli-integration-tests]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
43
.github/workflows/release_helm_gateway.yaml
vendored
43
.github/workflows/release_helm_gateway.yaml
vendored
@ -3,8 +3,51 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/infisical-gateway
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Create namespace
|
||||||
|
run: kubectl create namespace infisical-gateway
|
||||||
|
|
||||||
|
- name: Create gateway secret
|
||||||
|
run: kubectl create secret generic infisical-gateway-environment --from-literal=TOKEN=my-test-token -n infisical-gateway
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: |
|
||||||
|
ct install \
|
||||||
|
--config ct.yaml \
|
||||||
|
--charts helm-charts/infisical-gateway \
|
||||||
|
--helm-extra-args="--timeout=300s" \
|
||||||
|
--namespace infisical-gateway
|
||||||
|
|
||||||
release-helm:
|
release-helm:
|
||||||
name: Release Helm Chart
|
name: Release Helm Chart
|
||||||
|
needs: test-helm
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
49
.github/workflows/run-helm-chart-tests-infisical-gateway.yml
vendored
Normal file
49
.github/workflows/run-helm-chart-tests-infisical-gateway.yml
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
name: Run Helm Chart Tests for Gateway
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "helm-charts/infisical-gateway/**"
|
||||||
|
- ".github/workflows/run-helm-chart-tests-infisical-gateway.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/infisical-gateway
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Create namespace
|
||||||
|
run: kubectl create namespace infisical-gateway
|
||||||
|
|
||||||
|
- name: Create gateway secret
|
||||||
|
run: kubectl create secret generic infisical-gateway-environment --from-literal=TOKEN=my-test-token -n infisical-gateway
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: |
|
||||||
|
ct install \
|
||||||
|
--config ct.yaml \
|
||||||
|
--charts helm-charts/infisical-gateway \
|
||||||
|
--helm-extra-args="--timeout=300s" \
|
||||||
|
--namespace infisical-gateway
|
68
.github/workflows/run-helm-chart-tests-infisical-standalone-postgres.yml
vendored
Normal file
68
.github/workflows/run-helm-chart-tests-infisical-standalone-postgres.yml
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
name: Run Helm Chart Tests for Infisical Standalone Postgres
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "helm-charts/infisical-standalone-postgres/**"
|
||||||
|
- ".github/workflows/run-helm-chart-tests-infisical-standalone-postgres.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Add Helm repositories
|
||||||
|
run: |
|
||||||
|
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
|
||||||
|
helm repo add bitnami https://charts.bitnami.com/bitnami
|
||||||
|
helm repo update
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/infisical-standalone-postgres
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Create namespace
|
||||||
|
run: kubectl create namespace infisical-standalone-postgres
|
||||||
|
|
||||||
|
- name: Create Infisical secrets
|
||||||
|
run: |
|
||||||
|
kubectl create secret generic infisical-secrets \
|
||||||
|
--namespace infisical-standalone-postgres \
|
||||||
|
--from-literal=AUTH_SECRET=6c1fe4e407b8911c104518103505b218 \
|
||||||
|
--from-literal=ENCRYPTION_KEY=6c1fe4e407b8911c104518103505b218 \
|
||||||
|
--from-literal=SITE_URL=http://localhost:8080
|
||||||
|
|
||||||
|
- name: Create bootstrap secret
|
||||||
|
run: |
|
||||||
|
kubectl create secret generic infisical-bootstrap-credentials \
|
||||||
|
--namespace infisical-standalone-postgres \
|
||||||
|
--from-literal=INFISICAL_ADMIN_EMAIL=admin@example.com \
|
||||||
|
--from-literal=INFISICAL_ADMIN_PASSWORD=admin-password
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: |
|
||||||
|
ct install \
|
||||||
|
--config ct.yaml \
|
||||||
|
--charts helm-charts/infisical-standalone-postgres \
|
||||||
|
--helm-extra-args="--timeout=300s" \
|
||||||
|
--helm-extra-set-args="--set ingress.nginx.enabled=false --set infisical.autoDatabaseSchemaMigration=false --set infisical.replicaCount=1 --set infisical.image.tag=v0.132.2-postgres --set infisical.autoBootstrap.enabled=true" \
|
||||||
|
--namespace infisical-standalone-postgres
|
38
.github/workflows/run-helm-chart-tests-secret-operator.yml
vendored
Normal file
38
.github/workflows/run-helm-chart-tests-secret-operator.yml
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
name: Run Helm Chart Tests for Secret Operator
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "helm-charts/secrets-operator/**"
|
||||||
|
- ".github/workflows/run-helm-chart-tests-secret-operator.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-helm:
|
||||||
|
name: Test Helm Chart
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Helm
|
||||||
|
uses: azure/setup-helm@v4.2.0
|
||||||
|
with:
|
||||||
|
version: v3.17.0
|
||||||
|
|
||||||
|
- uses: actions/setup-python@v5.3.0
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
|
- name: Set up chart-testing
|
||||||
|
uses: helm/chart-testing-action@v2.7.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (lint)
|
||||||
|
run: ct lint --config ct.yaml --charts helm-charts/secrets-operator
|
||||||
|
|
||||||
|
- name: Create kind cluster
|
||||||
|
uses: helm/kind-action@v1.12.0
|
||||||
|
|
||||||
|
- name: Run chart-testing (install)
|
||||||
|
run: ct install --config ct.yaml --charts helm-charts/secrets-operator
|
@ -40,3 +40,9 @@ cli/detect/config/gitleaks.toml:gcp-api-key:578
|
|||||||
cli/detect/config/gitleaks.toml:gcp-api-key:579
|
cli/detect/config/gitleaks.toml:gcp-api-key:579
|
||||||
cli/detect/config/gitleaks.toml:gcp-api-key:581
|
cli/detect/config/gitleaks.toml:gcp-api-key:581
|
||||||
cli/detect/config/gitleaks.toml:gcp-api-key:582
|
cli/detect/config/gitleaks.toml:gcp-api-key:582
|
||||||
|
.github/workflows/run-helm-chart-tests-infisical-standalone-postgres.yml:generic-api-key:51
|
||||||
|
.github/workflows/run-helm-chart-tests-infisical-standalone-postgres.yml:generic-api-key:50
|
||||||
|
.github/workflows/helm-release-infisical-core.yml:generic-api-key:48
|
||||||
|
.github/workflows/helm-release-infisical-core.yml:generic-api-key:47
|
||||||
|
backend/src/services/smtp/smtp-service.ts:generic-api-key:79
|
||||||
|
frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/CloudflarePagesSyncFields.tsx:cloudflare-api-key:7
|
||||||
|
@ -134,7 +134,7 @@ RUN printf "[FreeTDS]\nDescription = FreeTDS Driver\nDriver = /usr/lib/x86_64-li
|
|||||||
|
|
||||||
# Install Infisical CLI
|
# Install Infisical CLI
|
||||||
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash \
|
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash \
|
||||||
&& apt-get update && apt-get install -y infisical=0.41.2 \
|
&& apt-get update && apt-get install -y infisical=0.41.89 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
RUN groupadd -r -g 1001 nodejs && useradd -r -u 1001 -g nodejs non-root-user
|
RUN groupadd -r -g 1001 nodejs && useradd -r -u 1001 -g nodejs non-root-user
|
||||||
|
@ -128,7 +128,7 @@ RUN apt-get update && apt-get install -y \
|
|||||||
|
|
||||||
# Install Infisical CLI
|
# Install Infisical CLI
|
||||||
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash \
|
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash \
|
||||||
&& apt-get update && apt-get install -y infisical=0.41.2 \
|
&& apt-get update && apt-get install -y infisical=0.41.89 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
WORKDIR /
|
WORKDIR /
|
||||||
|
@ -55,7 +55,7 @@ COPY --from=build /app .
|
|||||||
# Install Infisical CLI
|
# Install Infisical CLI
|
||||||
RUN apt-get install -y curl bash && \
|
RUN apt-get install -y curl bash && \
|
||||||
curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
||||||
apt-get update && apt-get install -y infisical=0.41.2 git
|
apt-get update && apt-get install -y infisical=0.41.89 git
|
||||||
|
|
||||||
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s \
|
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s \
|
||||||
CMD node healthcheck.js
|
CMD node healthcheck.js
|
||||||
|
@ -57,7 +57,7 @@ RUN mkdir -p /etc/softhsm2/tokens && \
|
|||||||
# Install Infisical CLI
|
# Install Infisical CLI
|
||||||
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
apt-get install -y infisical=0.41.2
|
apt-get install -y infisical=0.41.89
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ RUN wget https://www.openssl.org/source/openssl-3.1.2.tar.gz \
|
|||||||
# Install Infisical CLI
|
# Install Infisical CLI
|
||||||
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
RUN curl -1sLf 'https://artifacts-cli.infisical.com/setup.deb.sh' | bash && \
|
||||||
apt-get update && \
|
apt-get update && \
|
||||||
apt-get install -y infisical=0.41.2
|
apt-get install -y infisical=0.41.89
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ import { Lock } from "@app/lib/red-lock";
|
|||||||
export const mockKeyStore = (): TKeyStoreFactory => {
|
export const mockKeyStore = (): TKeyStoreFactory => {
|
||||||
const store: Record<string, string | number | Buffer> = {};
|
const store: Record<string, string | number | Buffer> = {};
|
||||||
|
|
||||||
|
const getRegex = (pattern: string) =>
|
||||||
|
new RE2(`^${pattern.replace(/[-[\]/{}()+?.\\^$|]/g, "\\$&").replace(/\*/g, ".*")}$`);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
setItem: async (key, value) => {
|
setItem: async (key, value) => {
|
||||||
store[key] = value;
|
store[key] = value;
|
||||||
@ -23,7 +26,7 @@ export const mockKeyStore = (): TKeyStoreFactory => {
|
|||||||
return 1;
|
return 1;
|
||||||
},
|
},
|
||||||
deleteItems: async ({ pattern, batchSize = 500, delay = 1500, jitter = 200 }) => {
|
deleteItems: async ({ pattern, batchSize = 500, delay = 1500, jitter = 200 }) => {
|
||||||
const regex = new RE2(`^${pattern.replace(/[-[\]/{}()+?.\\^$|]/g, "\\$&").replace(/\*/g, ".*")}$`);
|
const regex = getRegex(pattern);
|
||||||
let totalDeleted = 0;
|
let totalDeleted = 0;
|
||||||
const keys = Object.keys(store);
|
const keys = Object.keys(store);
|
||||||
|
|
||||||
@ -53,6 +56,27 @@ export const mockKeyStore = (): TKeyStoreFactory => {
|
|||||||
incrementBy: async () => {
|
incrementBy: async () => {
|
||||||
return 1;
|
return 1;
|
||||||
},
|
},
|
||||||
|
getItems: async (keys) => {
|
||||||
|
const values = keys.map((key) => {
|
||||||
|
const value = store[key];
|
||||||
|
if (typeof value === "string") {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
getKeysByPattern: async (pattern) => {
|
||||||
|
const regex = getRegex(pattern);
|
||||||
|
const keys = Object.keys(store);
|
||||||
|
return keys.filter((key) => regex.test(key));
|
||||||
|
},
|
||||||
|
deleteItemsByKeyIn: async (keys) => {
|
||||||
|
for (const key of keys) {
|
||||||
|
delete store[key];
|
||||||
|
}
|
||||||
|
return keys.length;
|
||||||
|
},
|
||||||
acquireLock: () => {
|
acquireLock: () => {
|
||||||
return Promise.resolve({
|
return Promise.resolve({
|
||||||
release: () => {}
|
release: () => {}
|
||||||
|
@ -26,6 +26,7 @@ export const mockQueue = (): TQueueServiceFactory => {
|
|||||||
getRepeatableJobs: async () => [],
|
getRepeatableJobs: async () => [],
|
||||||
clearQueue: async () => {},
|
clearQueue: async () => {},
|
||||||
stopJobById: async () => {},
|
stopJobById: async () => {},
|
||||||
|
stopJobByIdPg: async () => {},
|
||||||
stopRepeatableJobByJobId: async () => true,
|
stopRepeatableJobByJobId: async () => true,
|
||||||
stopRepeatableJobByKey: async () => true
|
stopRepeatableJobByKey: async () => true
|
||||||
};
|
};
|
||||||
|
@ -15,8 +15,8 @@ import { mockSmtpServer } from "./mocks/smtp";
|
|||||||
import { initDbConnection } from "@app/db";
|
import { initDbConnection } from "@app/db";
|
||||||
import { queueServiceFactory } from "@app/queue";
|
import { queueServiceFactory } from "@app/queue";
|
||||||
import { keyStoreFactory } from "@app/keystore/keystore";
|
import { keyStoreFactory } from "@app/keystore/keystore";
|
||||||
import { Redis } from "ioredis";
|
|
||||||
import { initializeHsmModule } from "@app/ee/services/hsm/hsm-fns";
|
import { initializeHsmModule } from "@app/ee/services/hsm/hsm-fns";
|
||||||
|
import { buildRedisFromConfig } from "@app/lib/config/redis";
|
||||||
|
|
||||||
dotenv.config({ path: path.join(__dirname, "../../.env.test"), debug: true });
|
dotenv.config({ path: path.join(__dirname, "../../.env.test"), debug: true });
|
||||||
export default {
|
export default {
|
||||||
@ -30,7 +30,7 @@ export default {
|
|||||||
dbRootCert: envConfig.DB_ROOT_CERT
|
dbRootCert: envConfig.DB_ROOT_CERT
|
||||||
});
|
});
|
||||||
|
|
||||||
const redis = new Redis(envConfig.REDIS_URL);
|
const redis = buildRedisFromConfig(envConfig);
|
||||||
await redis.flushdb("SYNC");
|
await redis.flushdb("SYNC");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -55,8 +55,8 @@ export default {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const smtp = mockSmtpServer();
|
const smtp = mockSmtpServer();
|
||||||
const queue = queueServiceFactory(envConfig.REDIS_URL, { dbConnectionUrl: envConfig.DB_CONNECTION_URI });
|
const queue = queueServiceFactory(envConfig, { dbConnectionUrl: envConfig.DB_CONNECTION_URI });
|
||||||
const keyStore = keyStoreFactory(envConfig.REDIS_URL);
|
const keyStore = keyStoreFactory(envConfig);
|
||||||
|
|
||||||
const hsmModule = initializeHsmModule(envConfig);
|
const hsmModule = initializeHsmModule(envConfig);
|
||||||
hsmModule.initialize();
|
hsmModule.initialize();
|
||||||
|
1944
backend/package-lock.json
generated
1944
backend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -131,6 +131,7 @@
|
|||||||
"@aws-sdk/client-elasticache": "^3.637.0",
|
"@aws-sdk/client-elasticache": "^3.637.0",
|
||||||
"@aws-sdk/client-iam": "^3.525.0",
|
"@aws-sdk/client-iam": "^3.525.0",
|
||||||
"@aws-sdk/client-kms": "^3.609.0",
|
"@aws-sdk/client-kms": "^3.609.0",
|
||||||
|
"@aws-sdk/client-route-53": "^3.810.0",
|
||||||
"@aws-sdk/client-secrets-manager": "^3.504.0",
|
"@aws-sdk/client-secrets-manager": "^3.504.0",
|
||||||
"@aws-sdk/client-sts": "^3.600.0",
|
"@aws-sdk/client-sts": "^3.600.0",
|
||||||
"@casl/ability": "^6.5.0",
|
"@casl/ability": "^6.5.0",
|
||||||
@ -148,6 +149,7 @@
|
|||||||
"@fastify/static": "^7.0.4",
|
"@fastify/static": "^7.0.4",
|
||||||
"@fastify/swagger": "^8.14.0",
|
"@fastify/swagger": "^8.14.0",
|
||||||
"@fastify/swagger-ui": "^2.1.0",
|
"@fastify/swagger-ui": "^2.1.0",
|
||||||
|
"@gitbeaker/rest": "^42.5.0",
|
||||||
"@google-cloud/kms": "^4.5.0",
|
"@google-cloud/kms": "^4.5.0",
|
||||||
"@infisical/quic": "^1.0.8",
|
"@infisical/quic": "^1.0.8",
|
||||||
"@node-saml/passport-saml": "^5.0.1",
|
"@node-saml/passport-saml": "^5.0.1",
|
||||||
@ -174,6 +176,7 @@
|
|||||||
"@slack/oauth": "^3.0.2",
|
"@slack/oauth": "^3.0.2",
|
||||||
"@slack/web-api": "^7.8.0",
|
"@slack/web-api": "^7.8.0",
|
||||||
"@ucast/mongo2js": "^1.3.4",
|
"@ucast/mongo2js": "^1.3.4",
|
||||||
|
"acme-client": "^5.4.0",
|
||||||
"ajv": "^8.12.0",
|
"ajv": "^8.12.0",
|
||||||
"argon2": "^0.31.2",
|
"argon2": "^0.31.2",
|
||||||
"aws-sdk": "^2.1553.0",
|
"aws-sdk": "^2.1553.0",
|
||||||
|
@ -84,6 +84,11 @@ const getZodDefaultValue = (type: unknown, value: string | number | boolean | Ob
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const bigIntegerColumns: Record<string, string[]> = {
|
||||||
|
"folder_commits": ["commitId"]
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const tables = (
|
const tables = (
|
||||||
await db("information_schema.tables")
|
await db("information_schema.tables")
|
||||||
@ -108,6 +113,9 @@ const main = async () => {
|
|||||||
const columnName = columnNames[colNum];
|
const columnName = columnNames[colNum];
|
||||||
const colInfo = columns[columnName];
|
const colInfo = columns[columnName];
|
||||||
let ztype = getZodPrimitiveType(colInfo.type);
|
let ztype = getZodPrimitiveType(colInfo.type);
|
||||||
|
if (bigIntegerColumns[tableName]?.includes(columnName)) {
|
||||||
|
ztype = "z.coerce.bigint()";
|
||||||
|
}
|
||||||
if (["zodBuffer"].includes(ztype)) {
|
if (["zodBuffer"].includes(ztype)) {
|
||||||
zodImportSet.add(ztype);
|
zodImportSet.add(ztype);
|
||||||
}
|
}
|
||||||
|
51
backend/src/@types/fastify.d.ts
vendored
51
backend/src/@types/fastify.d.ts
vendored
@ -3,16 +3,15 @@ import "fastify";
|
|||||||
import { Redis } from "ioredis";
|
import { Redis } from "ioredis";
|
||||||
|
|
||||||
import { TUsers } from "@app/db/schemas";
|
import { TUsers } from "@app/db/schemas";
|
||||||
import { TAccessApprovalPolicyServiceFactory } from "@app/ee/services/access-approval-policy/access-approval-policy-service";
|
import { TAccessApprovalPolicyServiceFactory } from "@app/ee/services/access-approval-policy/access-approval-policy-types";
|
||||||
import { TAccessApprovalRequestServiceFactory } from "@app/ee/services/access-approval-request/access-approval-request-service";
|
import { TAccessApprovalRequestServiceFactory } from "@app/ee/services/access-approval-request/access-approval-request-types";
|
||||||
import { TAssumePrivilegeServiceFactory } from "@app/ee/services/assume-privilege/assume-privilege-service";
|
import { TAssumePrivilegeServiceFactory } from "@app/ee/services/assume-privilege/assume-privilege-types";
|
||||||
import { TAuditLogServiceFactory } from "@app/ee/services/audit-log/audit-log-service";
|
import { TAuditLogServiceFactory, TCreateAuditLogDTO } from "@app/ee/services/audit-log/audit-log-types";
|
||||||
import { TCreateAuditLogDTO } from "@app/ee/services/audit-log/audit-log-types";
|
import { TAuditLogStreamServiceFactory } from "@app/ee/services/audit-log-stream/audit-log-stream-types";
|
||||||
import { TAuditLogStreamServiceFactory } from "@app/ee/services/audit-log-stream/audit-log-stream-service";
|
import { TCertificateAuthorityCrlServiceFactory } from "@app/ee/services/certificate-authority-crl/certificate-authority-crl-types";
|
||||||
import { TCertificateAuthorityCrlServiceFactory } from "@app/ee/services/certificate-authority-crl/certificate-authority-crl-service";
|
|
||||||
import { TCertificateEstServiceFactory } from "@app/ee/services/certificate-est/certificate-est-service";
|
import { TCertificateEstServiceFactory } from "@app/ee/services/certificate-est/certificate-est-service";
|
||||||
import { TDynamicSecretServiceFactory } from "@app/ee/services/dynamic-secret/dynamic-secret-service";
|
import { TDynamicSecretServiceFactory } from "@app/ee/services/dynamic-secret/dynamic-secret-types";
|
||||||
import { TDynamicSecretLeaseServiceFactory } from "@app/ee/services/dynamic-secret-lease/dynamic-secret-lease-service";
|
import { TDynamicSecretLeaseServiceFactory } from "@app/ee/services/dynamic-secret-lease/dynamic-secret-lease-types";
|
||||||
import { TExternalKmsServiceFactory } from "@app/ee/services/external-kms/external-kms-service";
|
import { TExternalKmsServiceFactory } from "@app/ee/services/external-kms/external-kms-service";
|
||||||
import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service";
|
import { TGatewayServiceFactory } from "@app/ee/services/gateway/gateway-service";
|
||||||
import { TGithubOrgSyncServiceFactory } from "@app/ee/services/github-org-sync/github-org-sync-service";
|
import { TGithubOrgSyncServiceFactory } from "@app/ee/services/github-org-sync/github-org-sync-service";
|
||||||
@ -25,24 +24,25 @@ import { TKmipServiceFactory } from "@app/ee/services/kmip/kmip-service";
|
|||||||
import { TLdapConfigServiceFactory } from "@app/ee/services/ldap-config/ldap-config-service";
|
import { TLdapConfigServiceFactory } from "@app/ee/services/ldap-config/ldap-config-service";
|
||||||
import { TLicenseServiceFactory } from "@app/ee/services/license/license-service";
|
import { TLicenseServiceFactory } from "@app/ee/services/license/license-service";
|
||||||
import { TOidcConfigServiceFactory } from "@app/ee/services/oidc/oidc-config-service";
|
import { TOidcConfigServiceFactory } from "@app/ee/services/oidc/oidc-config-service";
|
||||||
import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service";
|
import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service-types";
|
||||||
import { TProjectTemplateServiceFactory } from "@app/ee/services/project-template/project-template-service";
|
import { TPitServiceFactory } from "@app/ee/services/pit/pit-service";
|
||||||
import { TProjectUserAdditionalPrivilegeServiceFactory } from "@app/ee/services/project-user-additional-privilege/project-user-additional-privilege-service";
|
import { TProjectTemplateServiceFactory } from "@app/ee/services/project-template/project-template-types";
|
||||||
import { TRateLimitServiceFactory } from "@app/ee/services/rate-limit/rate-limit-service";
|
import { TProjectUserAdditionalPrivilegeServiceFactory } from "@app/ee/services/project-user-additional-privilege/project-user-additional-privilege-types";
|
||||||
import { RateLimitConfiguration } from "@app/ee/services/rate-limit/rate-limit-types";
|
import { RateLimitConfiguration, TRateLimitServiceFactory } from "@app/ee/services/rate-limit/rate-limit-types";
|
||||||
import { TSamlConfigServiceFactory } from "@app/ee/services/saml-config/saml-config-service";
|
import { TSamlConfigServiceFactory } from "@app/ee/services/saml-config/saml-config-types";
|
||||||
import { TScimServiceFactory } from "@app/ee/services/scim/scim-service";
|
import { TScimServiceFactory } from "@app/ee/services/scim/scim-types";
|
||||||
import { TSecretApprovalPolicyServiceFactory } from "@app/ee/services/secret-approval-policy/secret-approval-policy-service";
|
import { TSecretApprovalPolicyServiceFactory } from "@app/ee/services/secret-approval-policy/secret-approval-policy-service";
|
||||||
import { TSecretApprovalRequestServiceFactory } from "@app/ee/services/secret-approval-request/secret-approval-request-service";
|
import { TSecretApprovalRequestServiceFactory } from "@app/ee/services/secret-approval-request/secret-approval-request-service";
|
||||||
import { TSecretRotationServiceFactory } from "@app/ee/services/secret-rotation/secret-rotation-service";
|
import { TSecretRotationServiceFactory } from "@app/ee/services/secret-rotation/secret-rotation-service";
|
||||||
import { TSecretRotationV2ServiceFactory } from "@app/ee/services/secret-rotation-v2/secret-rotation-v2-service";
|
import { TSecretRotationV2ServiceFactory } from "@app/ee/services/secret-rotation-v2/secret-rotation-v2-service";
|
||||||
import { TSecretScanningServiceFactory } from "@app/ee/services/secret-scanning/secret-scanning-service";
|
import { TSecretScanningServiceFactory } from "@app/ee/services/secret-scanning/secret-scanning-service";
|
||||||
|
import { TSecretScanningV2ServiceFactory } from "@app/ee/services/secret-scanning-v2/secret-scanning-v2-service";
|
||||||
import { TSecretSnapshotServiceFactory } from "@app/ee/services/secret-snapshot/secret-snapshot-service";
|
import { TSecretSnapshotServiceFactory } from "@app/ee/services/secret-snapshot/secret-snapshot-service";
|
||||||
import { TSshCertificateAuthorityServiceFactory } from "@app/ee/services/ssh/ssh-certificate-authority-service";
|
import { TSshCertificateAuthorityServiceFactory } from "@app/ee/services/ssh/ssh-certificate-authority-service";
|
||||||
import { TSshCertificateTemplateServiceFactory } from "@app/ee/services/ssh-certificate-template/ssh-certificate-template-service";
|
import { TSshCertificateTemplateServiceFactory } from "@app/ee/services/ssh-certificate-template/ssh-certificate-template-service";
|
||||||
import { TSshHostServiceFactory } from "@app/ee/services/ssh-host/ssh-host-service";
|
import { TSshHostServiceFactory } from "@app/ee/services/ssh-host/ssh-host-service";
|
||||||
import { TSshHostGroupServiceFactory } from "@app/ee/services/ssh-host-group/ssh-host-group-service";
|
import { TSshHostGroupServiceFactory } from "@app/ee/services/ssh-host-group/ssh-host-group-service";
|
||||||
import { TTrustedIpServiceFactory } from "@app/ee/services/trusted-ip/trusted-ip-service";
|
import { TTrustedIpServiceFactory } from "@app/ee/services/trusted-ip/trusted-ip-types";
|
||||||
import { TAuthMode } from "@app/server/plugins/auth/inject-identity";
|
import { TAuthMode } from "@app/server/plugins/auth/inject-identity";
|
||||||
import { TApiKeyServiceFactory } from "@app/services/api-key/api-key-service";
|
import { TApiKeyServiceFactory } from "@app/services/api-key/api-key-service";
|
||||||
import { TAppConnectionServiceFactory } from "@app/services/app-connection/app-connection-service";
|
import { TAppConnectionServiceFactory } from "@app/services/app-connection/app-connection-service";
|
||||||
@ -53,14 +53,17 @@ import { ActorAuthMethod, ActorType } from "@app/services/auth/auth-type";
|
|||||||
import { TAuthTokenServiceFactory } from "@app/services/auth-token/auth-token-service";
|
import { TAuthTokenServiceFactory } from "@app/services/auth-token/auth-token-service";
|
||||||
import { TCertificateServiceFactory } from "@app/services/certificate/certificate-service";
|
import { TCertificateServiceFactory } from "@app/services/certificate/certificate-service";
|
||||||
import { TCertificateAuthorityServiceFactory } from "@app/services/certificate-authority/certificate-authority-service";
|
import { TCertificateAuthorityServiceFactory } from "@app/services/certificate-authority/certificate-authority-service";
|
||||||
|
import { TInternalCertificateAuthorityServiceFactory } from "@app/services/certificate-authority/internal/internal-certificate-authority-service";
|
||||||
import { TCertificateTemplateServiceFactory } from "@app/services/certificate-template/certificate-template-service";
|
import { TCertificateTemplateServiceFactory } from "@app/services/certificate-template/certificate-template-service";
|
||||||
import { TCmekServiceFactory } from "@app/services/cmek/cmek-service";
|
import { TCmekServiceFactory } from "@app/services/cmek/cmek-service";
|
||||||
import { TExternalGroupOrgRoleMappingServiceFactory } from "@app/services/external-group-org-role-mapping/external-group-org-role-mapping-service";
|
import { TExternalGroupOrgRoleMappingServiceFactory } from "@app/services/external-group-org-role-mapping/external-group-org-role-mapping-service";
|
||||||
import { TExternalMigrationServiceFactory } from "@app/services/external-migration/external-migration-service";
|
import { TExternalMigrationServiceFactory } from "@app/services/external-migration/external-migration-service";
|
||||||
|
import { TFolderCommitServiceFactory } from "@app/services/folder-commit/folder-commit-service";
|
||||||
import { TGroupProjectServiceFactory } from "@app/services/group-project/group-project-service";
|
import { TGroupProjectServiceFactory } from "@app/services/group-project/group-project-service";
|
||||||
import { THsmServiceFactory } from "@app/services/hsm/hsm-service";
|
import { THsmServiceFactory } from "@app/services/hsm/hsm-service";
|
||||||
import { TIdentityServiceFactory } from "@app/services/identity/identity-service";
|
import { TIdentityServiceFactory } from "@app/services/identity/identity-service";
|
||||||
import { TIdentityAccessTokenServiceFactory } from "@app/services/identity-access-token/identity-access-token-service";
|
import { TIdentityAccessTokenServiceFactory } from "@app/services/identity-access-token/identity-access-token-service";
|
||||||
|
import { TIdentityAliCloudAuthServiceFactory } from "@app/services/identity-alicloud-auth/identity-alicloud-auth-service";
|
||||||
import { TIdentityAwsAuthServiceFactory } from "@app/services/identity-aws-auth/identity-aws-auth-service";
|
import { TIdentityAwsAuthServiceFactory } from "@app/services/identity-aws-auth/identity-aws-auth-service";
|
||||||
import { TIdentityAzureAuthServiceFactory } from "@app/services/identity-azure-auth/identity-azure-auth-service";
|
import { TIdentityAzureAuthServiceFactory } from "@app/services/identity-azure-auth/identity-azure-auth-service";
|
||||||
import { TIdentityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service";
|
import { TIdentityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service";
|
||||||
@ -71,6 +74,7 @@ import { TAllowedFields } from "@app/services/identity-ldap-auth/identity-ldap-a
|
|||||||
import { TIdentityOciAuthServiceFactory } from "@app/services/identity-oci-auth/identity-oci-auth-service";
|
import { TIdentityOciAuthServiceFactory } from "@app/services/identity-oci-auth/identity-oci-auth-service";
|
||||||
import { TIdentityOidcAuthServiceFactory } from "@app/services/identity-oidc-auth/identity-oidc-auth-service";
|
import { TIdentityOidcAuthServiceFactory } from "@app/services/identity-oidc-auth/identity-oidc-auth-service";
|
||||||
import { TIdentityProjectServiceFactory } from "@app/services/identity-project/identity-project-service";
|
import { TIdentityProjectServiceFactory } from "@app/services/identity-project/identity-project-service";
|
||||||
|
import { TIdentityTlsCertAuthServiceFactory } from "@app/services/identity-tls-cert-auth/identity-tls-cert-auth-types";
|
||||||
import { TIdentityTokenAuthServiceFactory } from "@app/services/identity-token-auth/identity-token-auth-service";
|
import { TIdentityTokenAuthServiceFactory } from "@app/services/identity-token-auth/identity-token-auth-service";
|
||||||
import { TIdentityUaServiceFactory } from "@app/services/identity-ua/identity-ua-service";
|
import { TIdentityUaServiceFactory } from "@app/services/identity-ua/identity-ua-service";
|
||||||
import { TIntegrationServiceFactory } from "@app/services/integration/integration-service";
|
import { TIntegrationServiceFactory } from "@app/services/integration/integration-service";
|
||||||
@ -82,6 +86,7 @@ import { TOrgAdminServiceFactory } from "@app/services/org-admin/org-admin-servi
|
|||||||
import { TPkiAlertServiceFactory } from "@app/services/pki-alert/pki-alert-service";
|
import { TPkiAlertServiceFactory } from "@app/services/pki-alert/pki-alert-service";
|
||||||
import { TPkiCollectionServiceFactory } from "@app/services/pki-collection/pki-collection-service";
|
import { TPkiCollectionServiceFactory } from "@app/services/pki-collection/pki-collection-service";
|
||||||
import { TPkiSubscriberServiceFactory } from "@app/services/pki-subscriber/pki-subscriber-service";
|
import { TPkiSubscriberServiceFactory } from "@app/services/pki-subscriber/pki-subscriber-service";
|
||||||
|
import { TPkiTemplatesServiceFactory } from "@app/services/pki-templates/pki-templates-service";
|
||||||
import { TProjectServiceFactory } from "@app/services/project/project-service";
|
import { TProjectServiceFactory } from "@app/services/project/project-service";
|
||||||
import { TProjectBotServiceFactory } from "@app/services/project-bot/project-bot-service";
|
import { TProjectBotServiceFactory } from "@app/services/project-bot/project-bot-service";
|
||||||
import { TProjectEnvServiceFactory } from "@app/services/project-env/project-env-service";
|
import { TProjectEnvServiceFactory } from "@app/services/project-env/project-env-service";
|
||||||
@ -110,11 +115,16 @@ import { TWorkflowIntegrationServiceFactory } from "@app/services/workflow-integ
|
|||||||
declare module "@fastify/request-context" {
|
declare module "@fastify/request-context" {
|
||||||
interface RequestContextData {
|
interface RequestContextData {
|
||||||
reqId: string;
|
reqId: string;
|
||||||
|
orgId?: string;
|
||||||
identityAuthInfo?: {
|
identityAuthInfo?: {
|
||||||
identityId: string;
|
identityId: string;
|
||||||
oidc?: {
|
oidc?: {
|
||||||
claims: Record<string, string>;
|
claims: Record<string, string>;
|
||||||
};
|
};
|
||||||
|
kubernetes?: {
|
||||||
|
namespace: string;
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
identityPermissionMetadata?: Record<string, unknown>; // filled by permission service
|
identityPermissionMetadata?: Record<string, unknown>; // filled by permission service
|
||||||
assumedPrivilegeDetails?: { requesterId: string; actorId: string; actorType: ActorType; projectId: string };
|
assumedPrivilegeDetails?: { requesterId: string; actorId: string; actorType: ActorType; projectId: string };
|
||||||
@ -208,6 +218,8 @@ declare module "fastify" {
|
|||||||
identityUa: TIdentityUaServiceFactory;
|
identityUa: TIdentityUaServiceFactory;
|
||||||
identityKubernetesAuth: TIdentityKubernetesAuthServiceFactory;
|
identityKubernetesAuth: TIdentityKubernetesAuthServiceFactory;
|
||||||
identityGcpAuth: TIdentityGcpAuthServiceFactory;
|
identityGcpAuth: TIdentityGcpAuthServiceFactory;
|
||||||
|
identityAliCloudAuth: TIdentityAliCloudAuthServiceFactory;
|
||||||
|
identityTlsCertAuth: TIdentityTlsCertAuthServiceFactory;
|
||||||
identityAwsAuth: TIdentityAwsAuthServiceFactory;
|
identityAwsAuth: TIdentityAwsAuthServiceFactory;
|
||||||
identityAzureAuth: TIdentityAzureAuthServiceFactory;
|
identityAzureAuth: TIdentityAzureAuthServiceFactory;
|
||||||
identityOciAuth: TIdentityOciAuthServiceFactory;
|
identityOciAuth: TIdentityOciAuthServiceFactory;
|
||||||
@ -268,6 +280,11 @@ declare module "fastify" {
|
|||||||
microsoftTeams: TMicrosoftTeamsServiceFactory;
|
microsoftTeams: TMicrosoftTeamsServiceFactory;
|
||||||
assumePrivileges: TAssumePrivilegeServiceFactory;
|
assumePrivileges: TAssumePrivilegeServiceFactory;
|
||||||
githubOrgSync: TGithubOrgSyncServiceFactory;
|
githubOrgSync: TGithubOrgSyncServiceFactory;
|
||||||
|
folderCommit: TFolderCommitServiceFactory;
|
||||||
|
pit: TPitServiceFactory;
|
||||||
|
secretScanningV2: TSecretScanningV2ServiceFactory;
|
||||||
|
internalCertificateAuthority: TInternalCertificateAuthorityServiceFactory;
|
||||||
|
pkiTemplate: TPkiTemplatesServiceFactory;
|
||||||
};
|
};
|
||||||
// this is exclusive use for middlewares in which we need to inject data
|
// this is exclusive use for middlewares in which we need to inject data
|
||||||
// everywhere else access using service layer
|
// everywhere else access using service layer
|
||||||
|
137
backend/src/@types/knex.d.ts
vendored
137
backend/src/@types/knex.d.ts
vendored
@ -6,6 +6,9 @@ import {
|
|||||||
TAccessApprovalPoliciesApprovers,
|
TAccessApprovalPoliciesApprovers,
|
||||||
TAccessApprovalPoliciesApproversInsert,
|
TAccessApprovalPoliciesApproversInsert,
|
||||||
TAccessApprovalPoliciesApproversUpdate,
|
TAccessApprovalPoliciesApproversUpdate,
|
||||||
|
TAccessApprovalPoliciesBypassers,
|
||||||
|
TAccessApprovalPoliciesBypassersInsert,
|
||||||
|
TAccessApprovalPoliciesBypassersUpdate,
|
||||||
TAccessApprovalPoliciesInsert,
|
TAccessApprovalPoliciesInsert,
|
||||||
TAccessApprovalPoliciesUpdate,
|
TAccessApprovalPoliciesUpdate,
|
||||||
TAccessApprovalRequests,
|
TAccessApprovalRequests,
|
||||||
@ -68,12 +71,33 @@ import {
|
|||||||
TDynamicSecrets,
|
TDynamicSecrets,
|
||||||
TDynamicSecretsInsert,
|
TDynamicSecretsInsert,
|
||||||
TDynamicSecretsUpdate,
|
TDynamicSecretsUpdate,
|
||||||
|
TExternalCertificateAuthorities,
|
||||||
|
TExternalCertificateAuthoritiesInsert,
|
||||||
|
TExternalCertificateAuthoritiesUpdate,
|
||||||
TExternalGroupOrgRoleMappings,
|
TExternalGroupOrgRoleMappings,
|
||||||
TExternalGroupOrgRoleMappingsInsert,
|
TExternalGroupOrgRoleMappingsInsert,
|
||||||
TExternalGroupOrgRoleMappingsUpdate,
|
TExternalGroupOrgRoleMappingsUpdate,
|
||||||
TExternalKms,
|
TExternalKms,
|
||||||
TExternalKmsInsert,
|
TExternalKmsInsert,
|
||||||
TExternalKmsUpdate,
|
TExternalKmsUpdate,
|
||||||
|
TFolderCheckpointResources,
|
||||||
|
TFolderCheckpointResourcesInsert,
|
||||||
|
TFolderCheckpointResourcesUpdate,
|
||||||
|
TFolderCheckpoints,
|
||||||
|
TFolderCheckpointsInsert,
|
||||||
|
TFolderCheckpointsUpdate,
|
||||||
|
TFolderCommitChanges,
|
||||||
|
TFolderCommitChangesInsert,
|
||||||
|
TFolderCommitChangesUpdate,
|
||||||
|
TFolderCommits,
|
||||||
|
TFolderCommitsInsert,
|
||||||
|
TFolderCommitsUpdate,
|
||||||
|
TFolderTreeCheckpointResources,
|
||||||
|
TFolderTreeCheckpointResourcesInsert,
|
||||||
|
TFolderTreeCheckpointResourcesUpdate,
|
||||||
|
TFolderTreeCheckpoints,
|
||||||
|
TFolderTreeCheckpointsInsert,
|
||||||
|
TFolderTreeCheckpointsUpdate,
|
||||||
TGateways,
|
TGateways,
|
||||||
TGatewaysInsert,
|
TGatewaysInsert,
|
||||||
TGatewaysUpdate,
|
TGatewaysUpdate,
|
||||||
@ -101,6 +125,9 @@ import {
|
|||||||
TIdentityAccessTokens,
|
TIdentityAccessTokens,
|
||||||
TIdentityAccessTokensInsert,
|
TIdentityAccessTokensInsert,
|
||||||
TIdentityAccessTokensUpdate,
|
TIdentityAccessTokensUpdate,
|
||||||
|
TIdentityAlicloudAuths,
|
||||||
|
TIdentityAlicloudAuthsInsert,
|
||||||
|
TIdentityAlicloudAuthsUpdate,
|
||||||
TIdentityAwsAuths,
|
TIdentityAwsAuths,
|
||||||
TIdentityAwsAuthsInsert,
|
TIdentityAwsAuthsInsert,
|
||||||
TIdentityAwsAuthsUpdate,
|
TIdentityAwsAuthsUpdate,
|
||||||
@ -137,6 +164,9 @@ import {
|
|||||||
TIdentityProjectMemberships,
|
TIdentityProjectMemberships,
|
||||||
TIdentityProjectMembershipsInsert,
|
TIdentityProjectMembershipsInsert,
|
||||||
TIdentityProjectMembershipsUpdate,
|
TIdentityProjectMembershipsUpdate,
|
||||||
|
TIdentityTlsCertAuths,
|
||||||
|
TIdentityTlsCertAuthsInsert,
|
||||||
|
TIdentityTlsCertAuthsUpdate,
|
||||||
TIdentityTokenAuths,
|
TIdentityTokenAuths,
|
||||||
TIdentityTokenAuthsInsert,
|
TIdentityTokenAuthsInsert,
|
||||||
TIdentityTokenAuthsUpdate,
|
TIdentityTokenAuthsUpdate,
|
||||||
@ -155,6 +185,9 @@ import {
|
|||||||
TIntegrations,
|
TIntegrations,
|
||||||
TIntegrationsInsert,
|
TIntegrationsInsert,
|
||||||
TIntegrationsUpdate,
|
TIntegrationsUpdate,
|
||||||
|
TInternalCertificateAuthorities,
|
||||||
|
TInternalCertificateAuthoritiesInsert,
|
||||||
|
TInternalCertificateAuthoritiesUpdate,
|
||||||
TInternalKms,
|
TInternalKms,
|
||||||
TInternalKmsInsert,
|
TInternalKmsInsert,
|
||||||
TInternalKmsUpdate,
|
TInternalKmsUpdate,
|
||||||
@ -270,6 +303,9 @@ import {
|
|||||||
TSecretApprovalPoliciesApprovers,
|
TSecretApprovalPoliciesApprovers,
|
||||||
TSecretApprovalPoliciesApproversInsert,
|
TSecretApprovalPoliciesApproversInsert,
|
||||||
TSecretApprovalPoliciesApproversUpdate,
|
TSecretApprovalPoliciesApproversUpdate,
|
||||||
|
TSecretApprovalPoliciesBypassers,
|
||||||
|
TSecretApprovalPoliciesBypassersInsert,
|
||||||
|
TSecretApprovalPoliciesBypassersUpdate,
|
||||||
TSecretApprovalPoliciesInsert,
|
TSecretApprovalPoliciesInsert,
|
||||||
TSecretApprovalPoliciesUpdate,
|
TSecretApprovalPoliciesUpdate,
|
||||||
TSecretApprovalRequests,
|
TSecretApprovalRequests,
|
||||||
@ -324,9 +360,24 @@ import {
|
|||||||
TSecretRotationV2SecretMappingsInsert,
|
TSecretRotationV2SecretMappingsInsert,
|
||||||
TSecretRotationV2SecretMappingsUpdate,
|
TSecretRotationV2SecretMappingsUpdate,
|
||||||
TSecrets,
|
TSecrets,
|
||||||
|
TSecretScanningConfigs,
|
||||||
|
TSecretScanningConfigsInsert,
|
||||||
|
TSecretScanningConfigsUpdate,
|
||||||
|
TSecretScanningDataSources,
|
||||||
|
TSecretScanningDataSourcesInsert,
|
||||||
|
TSecretScanningDataSourcesUpdate,
|
||||||
|
TSecretScanningFindings,
|
||||||
|
TSecretScanningFindingsInsert,
|
||||||
|
TSecretScanningFindingsUpdate,
|
||||||
TSecretScanningGitRisks,
|
TSecretScanningGitRisks,
|
||||||
TSecretScanningGitRisksInsert,
|
TSecretScanningGitRisksInsert,
|
||||||
TSecretScanningGitRisksUpdate,
|
TSecretScanningGitRisksUpdate,
|
||||||
|
TSecretScanningResources,
|
||||||
|
TSecretScanningResourcesInsert,
|
||||||
|
TSecretScanningResourcesUpdate,
|
||||||
|
TSecretScanningScans,
|
||||||
|
TSecretScanningScansInsert,
|
||||||
|
TSecretScanningScansUpdate,
|
||||||
TSecretSharing,
|
TSecretSharing,
|
||||||
TSecretSharingInsert,
|
TSecretSharingInsert,
|
||||||
TSecretSharingUpdate,
|
TSecretSharingUpdate,
|
||||||
@ -538,6 +589,16 @@ declare module "knex/types/tables" {
|
|||||||
TCertificateAuthorityCrlInsert,
|
TCertificateAuthorityCrlInsert,
|
||||||
TCertificateAuthorityCrlUpdate
|
TCertificateAuthorityCrlUpdate
|
||||||
>;
|
>;
|
||||||
|
[TableName.InternalCertificateAuthority]: KnexOriginal.CompositeTableType<
|
||||||
|
TInternalCertificateAuthorities,
|
||||||
|
TInternalCertificateAuthoritiesInsert,
|
||||||
|
TInternalCertificateAuthoritiesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.ExternalCertificateAuthority]: KnexOriginal.CompositeTableType<
|
||||||
|
TExternalCertificateAuthorities,
|
||||||
|
TExternalCertificateAuthoritiesInsert,
|
||||||
|
TExternalCertificateAuthoritiesUpdate
|
||||||
|
>;
|
||||||
[TableName.Certificate]: KnexOriginal.CompositeTableType<TCertificates, TCertificatesInsert, TCertificatesUpdate>;
|
[TableName.Certificate]: KnexOriginal.CompositeTableType<TCertificates, TCertificatesInsert, TCertificatesUpdate>;
|
||||||
[TableName.CertificateTemplate]: KnexOriginal.CompositeTableType<
|
[TableName.CertificateTemplate]: KnexOriginal.CompositeTableType<
|
||||||
TCertificateTemplates,
|
TCertificateTemplates,
|
||||||
@ -731,6 +792,16 @@ declare module "knex/types/tables" {
|
|||||||
TIdentityGcpAuthsInsert,
|
TIdentityGcpAuthsInsert,
|
||||||
TIdentityGcpAuthsUpdate
|
TIdentityGcpAuthsUpdate
|
||||||
>;
|
>;
|
||||||
|
[TableName.IdentityAliCloudAuth]: KnexOriginal.CompositeTableType<
|
||||||
|
TIdentityAlicloudAuths,
|
||||||
|
TIdentityAlicloudAuthsInsert,
|
||||||
|
TIdentityAlicloudAuthsUpdate
|
||||||
|
>;
|
||||||
|
[TableName.IdentityTlsCertAuth]: KnexOriginal.CompositeTableType<
|
||||||
|
TIdentityTlsCertAuths,
|
||||||
|
TIdentityTlsCertAuthsInsert,
|
||||||
|
TIdentityTlsCertAuthsUpdate
|
||||||
|
>;
|
||||||
[TableName.IdentityAwsAuth]: KnexOriginal.CompositeTableType<
|
[TableName.IdentityAwsAuth]: KnexOriginal.CompositeTableType<
|
||||||
TIdentityAwsAuths,
|
TIdentityAwsAuths,
|
||||||
TIdentityAwsAuthsInsert,
|
TIdentityAwsAuthsInsert,
|
||||||
@ -804,6 +875,12 @@ declare module "knex/types/tables" {
|
|||||||
TAccessApprovalPoliciesApproversUpdate
|
TAccessApprovalPoliciesApproversUpdate
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
[TableName.AccessApprovalPolicyBypasser]: KnexOriginal.CompositeTableType<
|
||||||
|
TAccessApprovalPoliciesBypassers,
|
||||||
|
TAccessApprovalPoliciesBypassersInsert,
|
||||||
|
TAccessApprovalPoliciesBypassersUpdate
|
||||||
|
>;
|
||||||
|
|
||||||
[TableName.AccessApprovalRequest]: KnexOriginal.CompositeTableType<
|
[TableName.AccessApprovalRequest]: KnexOriginal.CompositeTableType<
|
||||||
TAccessApprovalRequests,
|
TAccessApprovalRequests,
|
||||||
TAccessApprovalRequestsInsert,
|
TAccessApprovalRequestsInsert,
|
||||||
@ -827,6 +904,11 @@ declare module "knex/types/tables" {
|
|||||||
TSecretApprovalPoliciesApproversInsert,
|
TSecretApprovalPoliciesApproversInsert,
|
||||||
TSecretApprovalPoliciesApproversUpdate
|
TSecretApprovalPoliciesApproversUpdate
|
||||||
>;
|
>;
|
||||||
|
[TableName.SecretApprovalPolicyBypasser]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretApprovalPoliciesBypassers,
|
||||||
|
TSecretApprovalPoliciesBypassersInsert,
|
||||||
|
TSecretApprovalPoliciesBypassersUpdate
|
||||||
|
>;
|
||||||
[TableName.SecretApprovalRequest]: KnexOriginal.CompositeTableType<
|
[TableName.SecretApprovalRequest]: KnexOriginal.CompositeTableType<
|
||||||
TSecretApprovalRequests,
|
TSecretApprovalRequests,
|
||||||
TSecretApprovalRequestsInsert,
|
TSecretApprovalRequestsInsert,
|
||||||
@ -1074,5 +1156,60 @@ declare module "knex/types/tables" {
|
|||||||
TGithubOrgSyncConfigsInsert,
|
TGithubOrgSyncConfigsInsert,
|
||||||
TGithubOrgSyncConfigsUpdate
|
TGithubOrgSyncConfigsUpdate
|
||||||
>;
|
>;
|
||||||
|
[TableName.FolderCommit]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderCommits,
|
||||||
|
TFolderCommitsInsert,
|
||||||
|
TFolderCommitsUpdate
|
||||||
|
>;
|
||||||
|
[TableName.FolderCommitChanges]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderCommitChanges,
|
||||||
|
TFolderCommitChangesInsert,
|
||||||
|
TFolderCommitChangesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.FolderCheckpoint]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderCheckpoints,
|
||||||
|
TFolderCheckpointsInsert,
|
||||||
|
TFolderCheckpointsUpdate
|
||||||
|
>;
|
||||||
|
[TableName.FolderCheckpointResources]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderCheckpointResources,
|
||||||
|
TFolderCheckpointResourcesInsert,
|
||||||
|
TFolderCheckpointResourcesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.FolderTreeCheckpoint]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderTreeCheckpoints,
|
||||||
|
TFolderTreeCheckpointsInsert,
|
||||||
|
TFolderTreeCheckpointsUpdate
|
||||||
|
>;
|
||||||
|
[TableName.FolderTreeCheckpointResources]: KnexOriginal.CompositeTableType<
|
||||||
|
TFolderTreeCheckpointResources,
|
||||||
|
TFolderTreeCheckpointResourcesInsert,
|
||||||
|
TFolderTreeCheckpointResourcesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.SecretScanningDataSource]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretScanningDataSources,
|
||||||
|
TSecretScanningDataSourcesInsert,
|
||||||
|
TSecretScanningDataSourcesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.SecretScanningResource]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretScanningResources,
|
||||||
|
TSecretScanningResourcesInsert,
|
||||||
|
TSecretScanningResourcesUpdate
|
||||||
|
>;
|
||||||
|
[TableName.SecretScanningScan]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretScanningScans,
|
||||||
|
TSecretScanningScansInsert,
|
||||||
|
TSecretScanningScansUpdate
|
||||||
|
>;
|
||||||
|
[TableName.SecretScanningFinding]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretScanningFindings,
|
||||||
|
TSecretScanningFindingsInsert,
|
||||||
|
TSecretScanningFindingsUpdate
|
||||||
|
>;
|
||||||
|
[TableName.SecretScanningConfig]: KnexOriginal.CompositeTableType<
|
||||||
|
TSecretScanningConfigs,
|
||||||
|
TSecretScanningConfigsInsert,
|
||||||
|
TSecretScanningConfigsUpdate
|
||||||
|
>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import knex, { Knex } from "knex";
|
import knex, { Knex } from "knex";
|
||||||
|
|
||||||
export type TDbClient = ReturnType<typeof initDbConnection>;
|
export type TDbClient = Knex;
|
||||||
export const initDbConnection = ({
|
export const initDbConnection = ({
|
||||||
dbConnectionUri,
|
dbConnectionUri,
|
||||||
dbRootCert,
|
dbRootCert,
|
||||||
@ -50,6 +50,8 @@ export const initDbConnection = ({
|
|||||||
}
|
}
|
||||||
: false
|
: false
|
||||||
},
|
},
|
||||||
|
// https://knexjs.org/guide/#pool
|
||||||
|
pool: { min: 0, max: 10 },
|
||||||
migrations: {
|
migrations: {
|
||||||
tableName: "infisical_migrations"
|
tableName: "infisical_migrations"
|
||||||
}
|
}
|
||||||
@ -70,7 +72,8 @@ export const initDbConnection = ({
|
|||||||
},
|
},
|
||||||
migrations: {
|
migrations: {
|
||||||
tableName: "infisical_migrations"
|
tableName: "infisical_migrations"
|
||||||
}
|
},
|
||||||
|
pool: { min: 0, max: 10 }
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -107,7 +110,8 @@ export const initAuditLogDbConnection = ({
|
|||||||
},
|
},
|
||||||
migrations: {
|
migrations: {
|
||||||
tableName: "infisical_migrations"
|
tableName: "infisical_migrations"
|
||||||
}
|
},
|
||||||
|
pool: { min: 0, max: 10 }
|
||||||
});
|
});
|
||||||
|
|
||||||
// we add these overrides so that auditLogDb and the primary DB are interchangeable
|
// we add these overrides so that auditLogDb and the primary DB are interchangeable
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasTable(TableName.Certificate)) {
|
||||||
|
const hasProjectIdColumn = await knex.schema.hasColumn(TableName.Certificate, "projectId");
|
||||||
|
if (!hasProjectIdColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||||
|
t.string("projectId", 36).nullable();
|
||||||
|
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex.raw(`
|
||||||
|
UPDATE "${TableName.Certificate}" cert
|
||||||
|
SET "projectId" = ca."projectId"
|
||||||
|
FROM "${TableName.CertificateAuthority}" ca
|
||||||
|
WHERE cert."caId" = ca.id
|
||||||
|
`);
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||||
|
t.string("projectId").notNullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||||
|
t.uuid("caId").nullable().alter();
|
||||||
|
t.uuid("caCertId").nullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasTable(TableName.Certificate)) {
|
||||||
|
if (await knex.schema.hasColumn(TableName.Certificate, "projectId")) {
|
||||||
|
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||||
|
t.dropForeign("projectId");
|
||||||
|
t.dropColumn("projectId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Altering back to notNullable for caId and caCertId will fail
|
||||||
|
}
|
@ -0,0 +1,166 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasFolderCommitTable = await knex.schema.hasTable(TableName.FolderCommit);
|
||||||
|
if (!hasFolderCommitTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderCommit, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.bigIncrements("commitId");
|
||||||
|
t.jsonb("actorMetadata").notNullable();
|
||||||
|
t.string("actorType").notNullable();
|
||||||
|
t.string("message");
|
||||||
|
t.uuid("folderId").notNullable();
|
||||||
|
t.uuid("envId").notNullable();
|
||||||
|
t.foreign("envId").references("id").inTable(TableName.Environment).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderId");
|
||||||
|
t.index("envId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFolderCommitChangesTable = await knex.schema.hasTable(TableName.FolderCommitChanges);
|
||||||
|
if (!hasFolderCommitChangesTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderCommitChanges, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.uuid("folderCommitId").notNullable();
|
||||||
|
t.foreign("folderCommitId").references("id").inTable(TableName.FolderCommit).onDelete("CASCADE");
|
||||||
|
t.string("changeType").notNullable();
|
||||||
|
t.boolean("isUpdate").notNullable().defaultTo(false);
|
||||||
|
t.uuid("secretVersionId");
|
||||||
|
t.foreign("secretVersionId").references("id").inTable(TableName.SecretVersionV2).onDelete("CASCADE");
|
||||||
|
t.uuid("folderVersionId");
|
||||||
|
t.foreign("folderVersionId").references("id").inTable(TableName.SecretFolderVersion).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderCommitId");
|
||||||
|
t.index("secretVersionId");
|
||||||
|
t.index("folderVersionId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFolderCheckpointTable = await knex.schema.hasTable(TableName.FolderCheckpoint);
|
||||||
|
if (!hasFolderCheckpointTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderCheckpoint, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.uuid("folderCommitId").notNullable();
|
||||||
|
t.foreign("folderCommitId").references("id").inTable(TableName.FolderCommit).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderCommitId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFolderCheckpointResourcesTable = await knex.schema.hasTable(TableName.FolderCheckpointResources);
|
||||||
|
if (!hasFolderCheckpointResourcesTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderCheckpointResources, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.uuid("folderCheckpointId").notNullable();
|
||||||
|
t.foreign("folderCheckpointId").references("id").inTable(TableName.FolderCheckpoint).onDelete("CASCADE");
|
||||||
|
t.uuid("secretVersionId");
|
||||||
|
t.foreign("secretVersionId").references("id").inTable(TableName.SecretVersionV2).onDelete("CASCADE");
|
||||||
|
t.uuid("folderVersionId");
|
||||||
|
t.foreign("folderVersionId").references("id").inTable(TableName.SecretFolderVersion).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderCheckpointId");
|
||||||
|
t.index("secretVersionId");
|
||||||
|
t.index("folderVersionId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFolderTreeCheckpointTable = await knex.schema.hasTable(TableName.FolderTreeCheckpoint);
|
||||||
|
if (!hasFolderTreeCheckpointTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderTreeCheckpoint, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.uuid("folderCommitId").notNullable();
|
||||||
|
t.foreign("folderCommitId").references("id").inTable(TableName.FolderCommit).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderCommitId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasFolderTreeCheckpointResourcesTable = await knex.schema.hasTable(TableName.FolderTreeCheckpointResources);
|
||||||
|
if (!hasFolderTreeCheckpointResourcesTable) {
|
||||||
|
await knex.schema.createTable(TableName.FolderTreeCheckpointResources, (t) => {
|
||||||
|
t.uuid("id").primary().defaultTo(knex.fn.uuid());
|
||||||
|
t.uuid("folderTreeCheckpointId").notNullable();
|
||||||
|
t.foreign("folderTreeCheckpointId").references("id").inTable(TableName.FolderTreeCheckpoint).onDelete("CASCADE");
|
||||||
|
t.uuid("folderId").notNullable();
|
||||||
|
t.uuid("folderCommitId").notNullable();
|
||||||
|
t.foreign("folderCommitId").references("id").inTable(TableName.FolderCommit).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
|
||||||
|
t.index("folderTreeCheckpointId");
|
||||||
|
t.index("folderId");
|
||||||
|
t.index("folderCommitId");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderCommitTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderCommit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderCommitChangesTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderCommitChanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderCheckpointTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderCheckpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderCheckpointResourcesTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderCheckpointResources);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderTreeCheckpointTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderTreeCheckpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFolderTreeCheckpointResourcesTable) {
|
||||||
|
await createOnUpdateTrigger(knex, TableName.FolderTreeCheckpointResources);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasFolderCheckpointResourcesTable = await knex.schema.hasTable(TableName.FolderCheckpointResources);
|
||||||
|
const hasFolderTreeCheckpointResourcesTable = await knex.schema.hasTable(TableName.FolderTreeCheckpointResources);
|
||||||
|
const hasFolderCommitTable = await knex.schema.hasTable(TableName.FolderCommit);
|
||||||
|
const hasFolderCommitChangesTable = await knex.schema.hasTable(TableName.FolderCommitChanges);
|
||||||
|
const hasFolderTreeCheckpointTable = await knex.schema.hasTable(TableName.FolderTreeCheckpoint);
|
||||||
|
const hasFolderCheckpointTable = await knex.schema.hasTable(TableName.FolderCheckpoint);
|
||||||
|
|
||||||
|
if (hasFolderTreeCheckpointResourcesTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderTreeCheckpointResources);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderTreeCheckpointResources);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolderCheckpointResourcesTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderCheckpointResources);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderCheckpointResources);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolderTreeCheckpointTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderTreeCheckpoint);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderTreeCheckpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolderCheckpointTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderCheckpoint);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderCheckpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolderCommitChangesTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderCommitChanges);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderCommitChanges);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolderCommitTable) {
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.FolderCommit);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.FolderCommit);
|
||||||
|
}
|
||||||
|
}
|
107
backend/src/db/migrations/20250517002225_secret-scanning-v2.ts
Normal file
107
backend/src/db/migrations/20250517002225_secret-scanning-v2.ts
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "@app/db/schemas";
|
||||||
|
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "@app/db/utils";
|
||||||
|
import {
|
||||||
|
SecretScanningFindingStatus,
|
||||||
|
SecretScanningScanStatus
|
||||||
|
} from "@app/ee/services/secret-scanning-v2/secret-scanning-v2-enums";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretScanningDataSource))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretScanningDataSource, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("externalId").index(); // if we need a unique way of identifying this data source from an external resource
|
||||||
|
t.string("name", 48).notNullable();
|
||||||
|
t.string("description");
|
||||||
|
t.string("type").notNullable();
|
||||||
|
t.jsonb("config").notNullable();
|
||||||
|
t.binary("encryptedCredentials"); // webhook credentials, etc.
|
||||||
|
t.uuid("connectionId");
|
||||||
|
t.boolean("isAutoScanEnabled").defaultTo(true);
|
||||||
|
t.foreign("connectionId").references("id").inTable(TableName.AppConnection);
|
||||||
|
t.string("projectId").notNullable();
|
||||||
|
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
t.boolean("isDisconnected").notNullable().defaultTo(false);
|
||||||
|
t.unique(["projectId", "name"]);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.SecretScanningDataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretScanningResource))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretScanningResource, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("externalId").notNullable();
|
||||||
|
t.string("name").notNullable();
|
||||||
|
t.string("type").notNullable();
|
||||||
|
t.uuid("dataSourceId").notNullable();
|
||||||
|
t.foreign("dataSourceId").references("id").inTable(TableName.SecretScanningDataSource).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
t.unique(["dataSourceId", "externalId"]);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.SecretScanningResource);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretScanningScan))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretScanningScan, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("status").notNullable().defaultTo(SecretScanningScanStatus.Queued);
|
||||||
|
t.string("statusMessage", 1024);
|
||||||
|
t.string("type").notNullable();
|
||||||
|
t.uuid("resourceId").notNullable();
|
||||||
|
t.foreign("resourceId").references("id").inTable(TableName.SecretScanningResource).onDelete("CASCADE");
|
||||||
|
t.timestamp("createdAt").defaultTo(knex.fn.now());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretScanningFinding))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretScanningFinding, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("dataSourceName").notNullable();
|
||||||
|
t.string("dataSourceType").notNullable();
|
||||||
|
t.string("resourceName").notNullable();
|
||||||
|
t.string("resourceType").notNullable();
|
||||||
|
t.string("rule").notNullable();
|
||||||
|
t.string("severity").notNullable();
|
||||||
|
t.string("status").notNullable().defaultTo(SecretScanningFindingStatus.Unresolved);
|
||||||
|
t.string("remarks");
|
||||||
|
t.string("fingerprint").notNullable();
|
||||||
|
t.jsonb("details").notNullable();
|
||||||
|
t.string("projectId").notNullable();
|
||||||
|
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||||
|
t.uuid("scanId");
|
||||||
|
t.foreign("scanId").references("id").inTable(TableName.SecretScanningScan).onDelete("SET NULL");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
t.unique(["projectId", "fingerprint"]);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.SecretScanningFinding);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretScanningConfig))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretScanningConfig, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("projectId").notNullable().unique();
|
||||||
|
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||||
|
t.string("content", 5000);
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.SecretScanningConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretScanningFinding);
|
||||||
|
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.SecretScanningFinding);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretScanningScan);
|
||||||
|
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretScanningResource);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.SecretScanningResource);
|
||||||
|
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretScanningDataSource);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.SecretScanningDataSource);
|
||||||
|
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretScanningConfig);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.SecretScanningConfig);
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
await knex.schema.alterTable(TableName.SecretSync, (t) => {
|
||||||
|
t.string("name", 64).notNullable().alter();
|
||||||
|
});
|
||||||
|
await knex.schema.alterTable(TableName.ProjectTemplates, (t) => {
|
||||||
|
t.string("name", 64).notNullable().alter();
|
||||||
|
});
|
||||||
|
await knex.schema.alterTable(TableName.AppConnection, (t) => {
|
||||||
|
t.string("name", 64).notNullable().alter();
|
||||||
|
});
|
||||||
|
await knex.schema.alterTable(TableName.SecretRotationV2, (t) => {
|
||||||
|
t.string("name", 64).notNullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(): Promise<void> {
|
||||||
|
// No down migration or it will error
|
||||||
|
}
|
205
backend/src/db/migrations/20250521110635_add-external-ca-pki.ts
Normal file
205
backend/src/db/migrations/20250521110635_add-external-ca-pki.ts
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
import slugify from "@sindresorhus/slugify";
|
||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { alphaNumericNanoId } from "@app/lib/nanoid";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasCATable = await knex.schema.hasTable(TableName.CertificateAuthority);
|
||||||
|
const hasExternalCATable = await knex.schema.hasTable(TableName.ExternalCertificateAuthority);
|
||||||
|
const hasInternalCATable = await knex.schema.hasTable(TableName.InternalCertificateAuthority);
|
||||||
|
|
||||||
|
if (hasCATable && !hasInternalCATable) {
|
||||||
|
await knex.schema.createTableLike(TableName.InternalCertificateAuthority, TableName.CertificateAuthority, (t) => {
|
||||||
|
t.uuid("caId").nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
// @ts-expect-error intentional: migration
|
||||||
|
await knex(TableName.InternalCertificateAuthority).insert(knex(TableName.CertificateAuthority).select("*"));
|
||||||
|
await knex(TableName.InternalCertificateAuthority).update("caId", knex.ref("id"));
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.InternalCertificateAuthority, (t) => {
|
||||||
|
t.dropColumn("projectId");
|
||||||
|
t.dropColumn("requireTemplateForIssuance");
|
||||||
|
t.dropColumn("createdAt");
|
||||||
|
t.dropColumn("updatedAt");
|
||||||
|
t.dropColumn("status");
|
||||||
|
t.uuid("parentCaId")
|
||||||
|
.nullable()
|
||||||
|
.references("id")
|
||||||
|
.inTable(TableName.CertificateAuthority)
|
||||||
|
.onDelete("CASCADE")
|
||||||
|
.alter();
|
||||||
|
t.uuid("activeCaCertId").nullable().references("id").inTable(TableName.CertificateAuthorityCert).alter();
|
||||||
|
t.uuid("caId").notNullable().references("id").inTable(TableName.CertificateAuthority).onDelete("CASCADE").alter();
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.CertificateAuthority, (t) => {
|
||||||
|
t.renameColumn("requireTemplateForIssuance", "enableDirectIssuance");
|
||||||
|
t.string("name").nullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
// prefill name for existing internal CAs and flip enableDirectIssuance
|
||||||
|
const cas = await knex(TableName.CertificateAuthority).select("id", "friendlyName", "enableDirectIssuance");
|
||||||
|
await Promise.all(
|
||||||
|
cas.map((ca) => {
|
||||||
|
const slugifiedName = ca.friendlyName
|
||||||
|
? slugify(`${ca.friendlyName.slice(0, 16)}-${alphaNumericNanoId(8)}`)
|
||||||
|
: slugify(alphaNumericNanoId(12));
|
||||||
|
|
||||||
|
return knex(TableName.CertificateAuthority)
|
||||||
|
.where({ id: ca.id })
|
||||||
|
.update({ name: slugifiedName, enableDirectIssuance: !ca.enableDirectIssuance });
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.CertificateAuthority, (t) => {
|
||||||
|
t.dropColumn("parentCaId");
|
||||||
|
t.dropColumn("type");
|
||||||
|
t.dropColumn("friendlyName");
|
||||||
|
t.dropColumn("organization");
|
||||||
|
t.dropColumn("ou");
|
||||||
|
t.dropColumn("country");
|
||||||
|
t.dropColumn("province");
|
||||||
|
t.dropColumn("locality");
|
||||||
|
t.dropColumn("commonName");
|
||||||
|
t.dropColumn("dn");
|
||||||
|
t.dropColumn("serialNumber");
|
||||||
|
t.dropColumn("maxPathLength");
|
||||||
|
t.dropColumn("keyAlgorithm");
|
||||||
|
t.dropColumn("notBefore");
|
||||||
|
t.dropColumn("notAfter");
|
||||||
|
t.dropColumn("activeCaCertId");
|
||||||
|
t.boolean("enableDirectIssuance").notNullable().defaultTo(true).alter();
|
||||||
|
t.string("name").notNullable().alter();
|
||||||
|
t.unique(["name", "projectId"]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasExternalCATable) {
|
||||||
|
await knex.schema.createTable(TableName.ExternalCertificateAuthority, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.string("type").notNullable();
|
||||||
|
t.uuid("appConnectionId").nullable();
|
||||||
|
t.foreign("appConnectionId").references("id").inTable(TableName.AppConnection);
|
||||||
|
t.uuid("dnsAppConnectionId").nullable();
|
||||||
|
t.foreign("dnsAppConnectionId").references("id").inTable(TableName.AppConnection);
|
||||||
|
t.uuid("caId").notNullable().references("id").inTable(TableName.CertificateAuthority).onDelete("CASCADE");
|
||||||
|
t.binary("credentials");
|
||||||
|
t.json("configuration");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasTable(TableName.PkiSubscriber)) {
|
||||||
|
await knex.schema.alterTable(TableName.PkiSubscriber, (t) => {
|
||||||
|
t.string("ttl").nullable().alter();
|
||||||
|
|
||||||
|
t.boolean("enableAutoRenewal").notNullable().defaultTo(false);
|
||||||
|
t.integer("autoRenewalPeriodInDays");
|
||||||
|
t.datetime("lastAutoRenewAt");
|
||||||
|
|
||||||
|
t.string("lastOperationStatus");
|
||||||
|
t.text("lastOperationMessage");
|
||||||
|
t.dateTime("lastOperationAt");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasCATable = await knex.schema.hasTable(TableName.CertificateAuthority);
|
||||||
|
const hasExternalCATable = await knex.schema.hasTable(TableName.ExternalCertificateAuthority);
|
||||||
|
const hasInternalCATable = await knex.schema.hasTable(TableName.InternalCertificateAuthority);
|
||||||
|
|
||||||
|
if (hasCATable && hasInternalCATable) {
|
||||||
|
// First add all columns as nullable
|
||||||
|
await knex.schema.alterTable(TableName.CertificateAuthority, (t) => {
|
||||||
|
t.uuid("parentCaId").nullable().references("id").inTable(TableName.CertificateAuthority).onDelete("CASCADE");
|
||||||
|
t.string("type").nullable();
|
||||||
|
t.string("friendlyName").nullable();
|
||||||
|
t.string("organization").nullable();
|
||||||
|
t.string("ou").nullable();
|
||||||
|
t.string("country").nullable();
|
||||||
|
t.string("province").nullable();
|
||||||
|
t.string("locality").nullable();
|
||||||
|
t.string("commonName").nullable();
|
||||||
|
t.string("dn").nullable();
|
||||||
|
t.string("serialNumber").nullable().unique();
|
||||||
|
t.integer("maxPathLength").nullable();
|
||||||
|
t.string("keyAlgorithm").nullable();
|
||||||
|
t.timestamp("notBefore").nullable();
|
||||||
|
t.timestamp("notAfter").nullable();
|
||||||
|
t.uuid("activeCaCertId").nullable().references("id").inTable(TableName.CertificateAuthorityCert);
|
||||||
|
t.renameColumn("enableDirectIssuance", "requireTemplateForIssuance");
|
||||||
|
t.dropColumn("name");
|
||||||
|
});
|
||||||
|
|
||||||
|
// flip requireTemplateForIssuance for existing internal CAs
|
||||||
|
const cas = await knex(TableName.CertificateAuthority).select("id", "requireTemplateForIssuance");
|
||||||
|
await Promise.all(
|
||||||
|
cas.map((ca) => {
|
||||||
|
return (
|
||||||
|
knex(TableName.CertificateAuthority)
|
||||||
|
.where({ id: ca.id })
|
||||||
|
// @ts-expect-error intentional: migration
|
||||||
|
.update({ requireTemplateForIssuance: !ca.requireTemplateForIssuance })
|
||||||
|
);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await knex.raw(`
|
||||||
|
UPDATE ${TableName.CertificateAuthority} ca
|
||||||
|
SET
|
||||||
|
type = ica.type,
|
||||||
|
"friendlyName" = ica."friendlyName",
|
||||||
|
organization = ica.organization,
|
||||||
|
ou = ica.ou,
|
||||||
|
country = ica.country,
|
||||||
|
province = ica.province,
|
||||||
|
locality = ica.locality,
|
||||||
|
"commonName" = ica."commonName",
|
||||||
|
dn = ica.dn,
|
||||||
|
"parentCaId" = ica."parentCaId",
|
||||||
|
"serialNumber" = ica."serialNumber",
|
||||||
|
"maxPathLength" = ica."maxPathLength",
|
||||||
|
"keyAlgorithm" = ica."keyAlgorithm",
|
||||||
|
"notBefore" = ica."notBefore",
|
||||||
|
"notAfter" = ica."notAfter",
|
||||||
|
"activeCaCertId" = ica."activeCaCertId"
|
||||||
|
FROM ${TableName.InternalCertificateAuthority} ica
|
||||||
|
WHERE ca.id = ica."caId"
|
||||||
|
`);
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.CertificateAuthority, (t) => {
|
||||||
|
t.string("type").notNullable().alter();
|
||||||
|
t.string("friendlyName").notNullable().alter();
|
||||||
|
t.string("organization").notNullable().alter();
|
||||||
|
t.string("ou").notNullable().alter();
|
||||||
|
t.string("country").notNullable().alter();
|
||||||
|
t.string("province").notNullable().alter();
|
||||||
|
t.string("locality").notNullable().alter();
|
||||||
|
t.string("commonName").notNullable().alter();
|
||||||
|
t.string("dn").notNullable().alter();
|
||||||
|
t.string("keyAlgorithm").notNullable().alter();
|
||||||
|
t.boolean("requireTemplateForIssuance").notNullable().defaultTo(false).alter();
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex.schema.dropTable(TableName.InternalCertificateAuthority);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasExternalCATable) {
|
||||||
|
await knex.schema.dropTable(TableName.ExternalCertificateAuthority);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasTable(TableName.PkiSubscriber)) {
|
||||||
|
await knex.schema.alterTable(TableName.PkiSubscriber, (t) => {
|
||||||
|
t.dropColumn("enableAutoRenewal");
|
||||||
|
t.dropColumn("autoRenewalPeriodInDays");
|
||||||
|
t.dropColumn("lastAutoRenewAt");
|
||||||
|
|
||||||
|
t.dropColumn("lastOperationStatus");
|
||||||
|
t.dropColumn("lastOperationMessage");
|
||||||
|
t.dropColumn("lastOperationAt");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
48
backend/src/db/migrations/20250527030702_policy-bypassers.ts
Normal file
48
backend/src/db/migrations/20250527030702_policy-bypassers.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasTable(TableName.AccessApprovalPolicyBypasser))) {
|
||||||
|
await knex.schema.createTable(TableName.AccessApprovalPolicyBypasser, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
|
||||||
|
t.uuid("bypasserGroupId").nullable();
|
||||||
|
t.foreign("bypasserGroupId").references("id").inTable(TableName.Groups).onDelete("CASCADE");
|
||||||
|
|
||||||
|
t.uuid("bypasserUserId").nullable();
|
||||||
|
t.foreign("bypasserUserId").references("id").inTable(TableName.Users).onDelete("CASCADE");
|
||||||
|
|
||||||
|
t.uuid("policyId").notNullable();
|
||||||
|
t.foreign("policyId").references("id").inTable(TableName.AccessApprovalPolicy).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.AccessApprovalPolicyBypasser);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasTable(TableName.SecretApprovalPolicyBypasser))) {
|
||||||
|
await knex.schema.createTable(TableName.SecretApprovalPolicyBypasser, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
|
||||||
|
t.uuid("bypasserGroupId").nullable();
|
||||||
|
t.foreign("bypasserGroupId").references("id").inTable(TableName.Groups).onDelete("CASCADE");
|
||||||
|
|
||||||
|
t.uuid("bypasserUserId").nullable();
|
||||||
|
t.foreign("bypasserUserId").references("id").inTable(TableName.Users).onDelete("CASCADE");
|
||||||
|
|
||||||
|
t.uuid("policyId").notNullable();
|
||||||
|
t.foreign("policyId").references("id").inTable(TableName.SecretApprovalPolicy).onDelete("CASCADE");
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
});
|
||||||
|
await createOnUpdateTrigger(knex, TableName.SecretApprovalPolicyBypasser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
await knex.schema.dropTableIfExists(TableName.SecretApprovalPolicyBypasser);
|
||||||
|
await knex.schema.dropTableIfExists(TableName.AccessApprovalPolicyBypasser);
|
||||||
|
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.SecretApprovalPolicyBypasser);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.AccessApprovalPolicyBypasser);
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.DynamicSecret, "usernameTemplate");
|
||||||
|
if (!hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.DynamicSecret, (t) => {
|
||||||
|
t.string("usernameTemplate").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.DynamicSecret, "usernameTemplate");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.DynamicSecret, (t) => {
|
||||||
|
t.dropColumn("usernameTemplate");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,139 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityAccessToken, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAccessToken, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityUniversalAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityUniversalAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityAwsAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAwsAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityOidcAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityOidcAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityAzureAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAzureAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityGcpAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityGcpAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityJwtAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityJwtAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityLdapAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityLdapAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityOciAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityOciAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.IdentityTokenAuth, "accessTokenPeriod"))) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityTokenAuth, (t) => {
|
||||||
|
t.bigInteger("accessTokenPeriod").defaultTo(0).notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityAccessToken, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAccessToken, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityUniversalAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityUniversalAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityAwsAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAwsAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityOidcAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityOidcAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityAzureAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAzureAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityGcpAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityGcpAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityJwtAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityJwtAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityLdapAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityLdapAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityOciAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityOciAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await knex.schema.hasColumn(TableName.IdentityTokenAuth, "accessTokenPeriod")) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityTokenAuth, (t) => {
|
||||||
|
t.dropColumn("accessTokenPeriod");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasColumn(TableName.SecretFolderVersion, "description"))) {
|
||||||
|
await knex.schema.alterTable(TableName.SecretFolderVersion, (t) => {
|
||||||
|
t.string("description").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasColumn(TableName.SecretFolderVersion, "description")) {
|
||||||
|
await knex.schema.alterTable(TableName.SecretFolderVersion, (t) => {
|
||||||
|
t.dropColumn("description");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
import slugify from "@sindresorhus/slugify";
|
||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { alphaNumericNanoId } from "@app/lib/nanoid";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasNameCol = await knex.schema.hasColumn(TableName.CertificateTemplate, "name");
|
||||||
|
if (hasNameCol) {
|
||||||
|
const templates = await knex(TableName.CertificateTemplate).select("id", "name");
|
||||||
|
await Promise.all(
|
||||||
|
templates.map((el) => {
|
||||||
|
const slugifiedName = el.name
|
||||||
|
? slugify(`${el.name.slice(0, 16)}-${alphaNumericNanoId(8)}`)
|
||||||
|
: slugify(alphaNumericNanoId(12));
|
||||||
|
|
||||||
|
return knex(TableName.CertificateTemplate).where({ id: el.id }).update({ name: slugifiedName });
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(): Promise<void> {}
|
@ -0,0 +1,27 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasTable(TableName.SecretSharing)) {
|
||||||
|
const hasEncryptedSalt = await knex.schema.hasColumn(TableName.SecretSharing, "encryptedSalt");
|
||||||
|
|
||||||
|
if (hasEncryptedSalt) {
|
||||||
|
await knex.schema.alterTable(TableName.SecretSharing, (t) => {
|
||||||
|
t.dropColumn("encryptedSalt");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
if (await knex.schema.hasTable(TableName.SecretSharing)) {
|
||||||
|
const hasEncryptedSalt = await knex.schema.hasColumn(TableName.SecretSharing, "encryptedSalt");
|
||||||
|
|
||||||
|
if (!hasEncryptedSalt) {
|
||||||
|
await knex.schema.alterTable(TableName.SecretSharing, (t) => {
|
||||||
|
t.binary("encryptedSalt").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { ApprovalStatus } from "@app/ee/services/secret-approval-request/secret-approval-request-types";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasPrivilegeDeletedAtColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.AccessApprovalRequest,
|
||||||
|
"privilegeDeletedAt"
|
||||||
|
);
|
||||||
|
const hasStatusColumn = await knex.schema.hasColumn(TableName.AccessApprovalRequest, "status");
|
||||||
|
|
||||||
|
if (!hasPrivilegeDeletedAtColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (t) => {
|
||||||
|
t.timestamp("privilegeDeletedAt").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasStatusColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (t) => {
|
||||||
|
t.string("status").defaultTo(ApprovalStatus.PENDING).notNullable();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update existing rows based on business logic
|
||||||
|
// If privilegeId is not null, set status to "approved"
|
||||||
|
await knex(TableName.AccessApprovalRequest).whereNotNull("privilegeId").update({ status: ApprovalStatus.APPROVED });
|
||||||
|
|
||||||
|
// If privilegeId is null and there's a rejected reviewer, set to "rejected"
|
||||||
|
const rejectedRequestIds = await knex(TableName.AccessApprovalRequestReviewer)
|
||||||
|
.select("requestId")
|
||||||
|
.where("status", "rejected")
|
||||||
|
.distinct()
|
||||||
|
.pluck("requestId");
|
||||||
|
|
||||||
|
if (rejectedRequestIds.length > 0) {
|
||||||
|
await knex(TableName.AccessApprovalRequest)
|
||||||
|
.whereNull("privilegeId")
|
||||||
|
.whereIn("id", rejectedRequestIds)
|
||||||
|
.update({ status: ApprovalStatus.REJECTED });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasPrivilegeDeletedAtColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.AccessApprovalRequest,
|
||||||
|
"privilegeDeletedAt"
|
||||||
|
);
|
||||||
|
const hasStatusColumn = await knex.schema.hasColumn(TableName.AccessApprovalRequest, "status");
|
||||||
|
|
||||||
|
if (hasPrivilegeDeletedAtColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (t) => {
|
||||||
|
t.dropColumn("privilegeDeletedAt");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasStatusColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalRequest, (t) => {
|
||||||
|
t.dropColumn("status");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
139
backend/src/db/migrations/20250602155451_fix-secret-versions.ts
Normal file
139
backend/src/db/migrations/20250602155451_fix-secret-versions.ts
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/* eslint-disable no-await-in-loop */
|
||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { chunkArray } from "@app/lib/fn";
|
||||||
|
import { selectAllTableCols } from "@app/lib/knex";
|
||||||
|
import { logger } from "@app/lib/logger";
|
||||||
|
|
||||||
|
import { SecretType, TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
logger.info("Starting secret version fix migration");
|
||||||
|
|
||||||
|
// Get all shared secret IDs first to optimize versions query
|
||||||
|
const secretIds = await knex(TableName.SecretV2)
|
||||||
|
.where("type", SecretType.Shared)
|
||||||
|
.select("id")
|
||||||
|
.then((rows) => rows.map((row) => row.id));
|
||||||
|
|
||||||
|
logger.info(`Found ${secretIds.length} shared secrets to process`);
|
||||||
|
|
||||||
|
if (secretIds.length === 0) {
|
||||||
|
logger.info("No shared secrets found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const secretIdChunks = chunkArray(secretIds, 5000);
|
||||||
|
|
||||||
|
for (let chunkIndex = 0; chunkIndex < secretIdChunks.length; chunkIndex += 1) {
|
||||||
|
const currentSecretIds = secretIdChunks[chunkIndex];
|
||||||
|
logger.info(`Processing chunk ${chunkIndex + 1} of ${secretIdChunks.length}`);
|
||||||
|
|
||||||
|
// Get secrets and versions for current chunk
|
||||||
|
const [sharedSecrets, allVersions] = await Promise.all([
|
||||||
|
knex(TableName.SecretV2).whereIn("id", currentSecretIds).select(selectAllTableCols(TableName.SecretV2)),
|
||||||
|
knex(TableName.SecretVersionV2).whereIn("secretId", currentSecretIds).select("secretId", "version")
|
||||||
|
]);
|
||||||
|
|
||||||
|
const versionsBySecretId = new Map<string, number[]>();
|
||||||
|
|
||||||
|
allVersions.forEach((v) => {
|
||||||
|
const versions = versionsBySecretId.get(v.secretId);
|
||||||
|
if (versions) {
|
||||||
|
versions.push(v.version);
|
||||||
|
} else {
|
||||||
|
versionsBySecretId.set(v.secretId, [v.version]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const versionsToAdd = [];
|
||||||
|
const secretsToUpdate = [];
|
||||||
|
|
||||||
|
// Process each shared secret
|
||||||
|
for (const secret of sharedSecrets) {
|
||||||
|
const existingVersions = versionsBySecretId.get(secret.id) || [];
|
||||||
|
|
||||||
|
if (existingVersions.length === 0) {
|
||||||
|
// No versions exist - add current version
|
||||||
|
versionsToAdd.push({
|
||||||
|
secretId: secret.id,
|
||||||
|
version: secret.version,
|
||||||
|
key: secret.key,
|
||||||
|
encryptedValue: secret.encryptedValue,
|
||||||
|
encryptedComment: secret.encryptedComment,
|
||||||
|
reminderNote: secret.reminderNote,
|
||||||
|
reminderRepeatDays: secret.reminderRepeatDays,
|
||||||
|
skipMultilineEncoding: secret.skipMultilineEncoding,
|
||||||
|
metadata: secret.metadata,
|
||||||
|
folderId: secret.folderId,
|
||||||
|
actorType: "platform"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const latestVersion = Math.max(...existingVersions);
|
||||||
|
|
||||||
|
if (latestVersion !== secret.version) {
|
||||||
|
// Latest version doesn't match - create new version and update secret
|
||||||
|
const nextVersion = latestVersion + 1;
|
||||||
|
|
||||||
|
versionsToAdd.push({
|
||||||
|
secretId: secret.id,
|
||||||
|
version: nextVersion,
|
||||||
|
key: secret.key,
|
||||||
|
encryptedValue: secret.encryptedValue,
|
||||||
|
encryptedComment: secret.encryptedComment,
|
||||||
|
reminderNote: secret.reminderNote,
|
||||||
|
reminderRepeatDays: secret.reminderRepeatDays,
|
||||||
|
skipMultilineEncoding: secret.skipMultilineEncoding,
|
||||||
|
metadata: secret.metadata,
|
||||||
|
folderId: secret.folderId,
|
||||||
|
actorType: "platform"
|
||||||
|
});
|
||||||
|
|
||||||
|
secretsToUpdate.push({
|
||||||
|
id: secret.id,
|
||||||
|
newVersion: nextVersion
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
`Chunk ${chunkIndex + 1}: Adding ${versionsToAdd.length} versions, updating ${secretsToUpdate.length} secrets`
|
||||||
|
);
|
||||||
|
|
||||||
|
// Batch insert new versions
|
||||||
|
if (versionsToAdd.length > 0) {
|
||||||
|
const insertBatches = chunkArray(versionsToAdd, 9000);
|
||||||
|
for (let i = 0; i < insertBatches.length; i += 1) {
|
||||||
|
await knex.batchInsert(TableName.SecretVersionV2, insertBatches[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (secretsToUpdate.length > 0) {
|
||||||
|
const updateBatches = chunkArray(secretsToUpdate, 1000);
|
||||||
|
|
||||||
|
for (const updateBatch of updateBatches) {
|
||||||
|
const ids = updateBatch.map((u) => u.id);
|
||||||
|
const versionCases = updateBatch.map((u) => `WHEN '${u.id}' THEN ${u.newVersion}`).join(" ");
|
||||||
|
|
||||||
|
await knex.raw(
|
||||||
|
`
|
||||||
|
UPDATE ${TableName.SecretV2}
|
||||||
|
SET version = CASE id ${versionCases} END,
|
||||||
|
"updatedAt" = NOW()
|
||||||
|
WHERE id IN (${ids.map(() => "?").join(",")})
|
||||||
|
`,
|
||||||
|
ids
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("Secret version fix migration completed");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(): Promise<void> {
|
||||||
|
logger.info("Rollback not implemented for secret version fix migration");
|
||||||
|
// Note: Rolling back this migration would be complex and potentially destructive
|
||||||
|
// as it would require tracking which version entries were added
|
||||||
|
}
|
@ -0,0 +1,345 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { chunkArray } from "@app/lib/fn";
|
||||||
|
import { selectAllTableCols } from "@app/lib/knex";
|
||||||
|
import { logger } from "@app/lib/logger";
|
||||||
|
import { ActorType } from "@app/services/auth/auth-type";
|
||||||
|
import { ChangeType } from "@app/services/folder-commit/folder-commit-service";
|
||||||
|
|
||||||
|
import {
|
||||||
|
ProjectType,
|
||||||
|
SecretType,
|
||||||
|
TableName,
|
||||||
|
TFolderCheckpoints,
|
||||||
|
TFolderCommits,
|
||||||
|
TFolderTreeCheckpoints,
|
||||||
|
TSecretFolders
|
||||||
|
} from "../schemas";
|
||||||
|
|
||||||
|
const sortFoldersByHierarchy = (folders: TSecretFolders[]) => {
|
||||||
|
// Create a map for quick lookup of children by parent ID
|
||||||
|
const childrenMap = new Map<string, TSecretFolders[]>();
|
||||||
|
|
||||||
|
// Set of all folder IDs
|
||||||
|
const allFolderIds = new Set<string>();
|
||||||
|
|
||||||
|
// Build the set of all folder IDs
|
||||||
|
folders.forEach((folder) => {
|
||||||
|
if (folder.id) {
|
||||||
|
allFolderIds.add(folder.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Group folders by their parentId
|
||||||
|
folders.forEach((folder) => {
|
||||||
|
if (folder.parentId) {
|
||||||
|
const children = childrenMap.get(folder.parentId) || [];
|
||||||
|
children.push(folder);
|
||||||
|
childrenMap.set(folder.parentId, children);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Find root folders - those with no parentId or with a parentId that doesn't exist
|
||||||
|
const rootFolders = folders.filter((folder) => !folder.parentId || !allFolderIds.has(folder.parentId));
|
||||||
|
|
||||||
|
// Process each level of the hierarchy
|
||||||
|
const result = [];
|
||||||
|
let currentLevel = rootFolders;
|
||||||
|
|
||||||
|
while (currentLevel.length > 0) {
|
||||||
|
result.push(...currentLevel);
|
||||||
|
|
||||||
|
const nextLevel = [];
|
||||||
|
for (const folder of currentLevel) {
|
||||||
|
if (folder.id) {
|
||||||
|
const children = childrenMap.get(folder.id) || [];
|
||||||
|
nextLevel.push(...children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
currentLevel = nextLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.reverse();
|
||||||
|
};
|
||||||
|
|
||||||
|
const getSecretsByFolderIds = async (knex: Knex, folderIds: string[]): Promise<Record<string, string[]>> => {
|
||||||
|
const secrets = await knex(TableName.SecretV2)
|
||||||
|
.whereIn(`${TableName.SecretV2}.folderId`, folderIds)
|
||||||
|
.where(`${TableName.SecretV2}.type`, SecretType.Shared)
|
||||||
|
.join<TableName.SecretVersionV2>(TableName.SecretVersionV2, (queryBuilder) => {
|
||||||
|
void queryBuilder
|
||||||
|
.on(`${TableName.SecretVersionV2}.secretId`, `${TableName.SecretV2}.id`)
|
||||||
|
.andOn(`${TableName.SecretVersionV2}.version`, `${TableName.SecretV2}.version`);
|
||||||
|
})
|
||||||
|
.select(selectAllTableCols(TableName.SecretV2))
|
||||||
|
.select(knex.ref("id").withSchema(TableName.SecretVersionV2).as("secretVersionId"));
|
||||||
|
|
||||||
|
const secretsMap: Record<string, string[]> = {};
|
||||||
|
|
||||||
|
secrets.forEach((secret) => {
|
||||||
|
if (!secretsMap[secret.folderId]) {
|
||||||
|
secretsMap[secret.folderId] = [];
|
||||||
|
}
|
||||||
|
secretsMap[secret.folderId].push(secret.secretVersionId);
|
||||||
|
});
|
||||||
|
|
||||||
|
return secretsMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getFoldersByParentIds = async (knex: Knex, parentIds: string[]): Promise<Record<string, string[]>> => {
|
||||||
|
const folders = await knex(TableName.SecretFolder)
|
||||||
|
.whereIn(`${TableName.SecretFolder}.parentId`, parentIds)
|
||||||
|
.where(`${TableName.SecretFolder}.isReserved`, false)
|
||||||
|
.join<TableName.SecretFolderVersion>(TableName.SecretFolderVersion, (queryBuilder) => {
|
||||||
|
void queryBuilder
|
||||||
|
.on(`${TableName.SecretFolderVersion}.folderId`, `${TableName.SecretFolder}.id`)
|
||||||
|
.andOn(`${TableName.SecretFolderVersion}.version`, `${TableName.SecretFolder}.version`);
|
||||||
|
})
|
||||||
|
.select(selectAllTableCols(TableName.SecretFolder))
|
||||||
|
.select(knex.ref("id").withSchema(TableName.SecretFolderVersion).as("folderVersionId"));
|
||||||
|
|
||||||
|
const foldersMap: Record<string, string[]> = {};
|
||||||
|
|
||||||
|
folders.forEach((folder) => {
|
||||||
|
if (!folder.parentId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!foldersMap[folder.parentId]) {
|
||||||
|
foldersMap[folder.parentId] = [];
|
||||||
|
}
|
||||||
|
foldersMap[folder.parentId].push(folder.folderVersionId);
|
||||||
|
});
|
||||||
|
|
||||||
|
return foldersMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
logger.info("Initializing folder commits");
|
||||||
|
const hasFolderCommitTable = await knex.schema.hasTable(TableName.FolderCommit);
|
||||||
|
if (hasFolderCommitTable) {
|
||||||
|
// Get Projects to Initialize
|
||||||
|
const projects = await knex(TableName.Project)
|
||||||
|
.where(`${TableName.Project}.version`, 3)
|
||||||
|
.where(`${TableName.Project}.type`, ProjectType.SecretManager)
|
||||||
|
.select(selectAllTableCols(TableName.Project));
|
||||||
|
logger.info(`Found ${projects.length} projects to initialize`);
|
||||||
|
|
||||||
|
// Process Projects in batches of 100
|
||||||
|
const batches = chunkArray(projects, 100);
|
||||||
|
let i = 0;
|
||||||
|
for (const batch of batches) {
|
||||||
|
i += 1;
|
||||||
|
logger.info(`Processing project batch ${i} of ${batches.length}`);
|
||||||
|
let foldersCommitsList = [];
|
||||||
|
|
||||||
|
const rootFoldersMap: Record<string, string> = {};
|
||||||
|
const envRootFoldersMap: Record<string, string> = {};
|
||||||
|
|
||||||
|
// Get All Folders for the Project
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const folders = await knex(TableName.SecretFolder)
|
||||||
|
.join(TableName.Environment, `${TableName.SecretFolder}.envId`, `${TableName.Environment}.id`)
|
||||||
|
.whereIn(
|
||||||
|
`${TableName.Environment}.projectId`,
|
||||||
|
batch.map((project) => project.id)
|
||||||
|
)
|
||||||
|
.where(`${TableName.SecretFolder}.isReserved`, false)
|
||||||
|
.select(selectAllTableCols(TableName.SecretFolder));
|
||||||
|
logger.info(`Found ${folders.length} folders to initialize in project batch ${i} of ${batches.length}`);
|
||||||
|
|
||||||
|
// Sort Folders by Hierarchy (parents before nested folders)
|
||||||
|
const sortedFolders = sortFoldersByHierarchy(folders);
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const folderSecretsMap = await getSecretsByFolderIds(
|
||||||
|
knex,
|
||||||
|
sortedFolders.map((folder) => folder.id)
|
||||||
|
);
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const folderFoldersMap = await getFoldersByParentIds(
|
||||||
|
knex,
|
||||||
|
sortedFolders.map((folder) => folder.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get folder commit changes
|
||||||
|
for (const folder of sortedFolders) {
|
||||||
|
const subFolderVersionIds = folderFoldersMap[folder.id];
|
||||||
|
const secretVersionIds = folderSecretsMap[folder.id];
|
||||||
|
const changes = [];
|
||||||
|
if (subFolderVersionIds) {
|
||||||
|
changes.push(
|
||||||
|
...subFolderVersionIds.map((folderVersionId) => ({
|
||||||
|
folderId: folder.id,
|
||||||
|
changeType: ChangeType.ADD,
|
||||||
|
secretVersionId: undefined,
|
||||||
|
folderVersionId,
|
||||||
|
isUpdate: false
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (secretVersionIds) {
|
||||||
|
changes.push(
|
||||||
|
...secretVersionIds.map((secretVersionId) => ({
|
||||||
|
folderId: folder.id,
|
||||||
|
changeType: ChangeType.ADD,
|
||||||
|
secretVersionId,
|
||||||
|
folderVersionId: undefined,
|
||||||
|
isUpdate: false
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (changes.length > 0) {
|
||||||
|
const folderCommit = {
|
||||||
|
commit: {
|
||||||
|
actorMetadata: {},
|
||||||
|
actorType: ActorType.PLATFORM,
|
||||||
|
message: "Initialized folder",
|
||||||
|
folderId: folder.id,
|
||||||
|
envId: folder.envId
|
||||||
|
},
|
||||||
|
changes
|
||||||
|
};
|
||||||
|
foldersCommitsList.push(folderCommit);
|
||||||
|
if (!folder.parentId) {
|
||||||
|
rootFoldersMap[folder.id] = folder.envId;
|
||||||
|
envRootFoldersMap[folder.envId] = folder.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info(`Retrieved folder changes for project batch ${i} of ${batches.length}`);
|
||||||
|
|
||||||
|
const filteredBrokenProjectFolders: string[] = [];
|
||||||
|
|
||||||
|
foldersCommitsList = foldersCommitsList.filter((folderCommit) => {
|
||||||
|
if (!envRootFoldersMap[folderCommit.commit.envId]) {
|
||||||
|
filteredBrokenProjectFolders.push(folderCommit.commit.folderId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
`Filtered ${filteredBrokenProjectFolders.length} broken project folders: ${JSON.stringify(filteredBrokenProjectFolders)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
// Insert New Commits in batches of 9000
|
||||||
|
const newCommits = foldersCommitsList.map((folderCommit) => folderCommit.commit);
|
||||||
|
const commitBatches = chunkArray(newCommits, 9000);
|
||||||
|
|
||||||
|
let j = 0;
|
||||||
|
for (const commitBatch of commitBatches) {
|
||||||
|
j += 1;
|
||||||
|
logger.info(`Inserting folder commits - batch ${j} of ${commitBatches.length}`);
|
||||||
|
// Create folder commit
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const newCommitsInserted = (await knex
|
||||||
|
.batchInsert(TableName.FolderCommit, commitBatch)
|
||||||
|
.returning("*")) as TFolderCommits[];
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder commits - batch ${j} of ${commitBatches.length}`);
|
||||||
|
|
||||||
|
const newCommitsMap: Record<string, string> = {};
|
||||||
|
const newCommitsMapInverted: Record<string, string> = {};
|
||||||
|
const newCheckpointsMap: Record<string, string> = {};
|
||||||
|
newCommitsInserted.forEach((commit) => {
|
||||||
|
newCommitsMap[commit.folderId] = commit.id;
|
||||||
|
newCommitsMapInverted[commit.id] = commit.folderId;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create folder checkpoints
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const newCheckpoints = (await knex
|
||||||
|
.batchInsert(
|
||||||
|
TableName.FolderCheckpoint,
|
||||||
|
Object.values(newCommitsMap).map((commitId) => ({
|
||||||
|
folderCommitId: commitId
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
.returning("*")) as TFolderCheckpoints[];
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder checkpoints - batch ${j} of ${commitBatches.length}`);
|
||||||
|
|
||||||
|
newCheckpoints.forEach((checkpoint) => {
|
||||||
|
newCheckpointsMap[newCommitsMapInverted[checkpoint.folderCommitId]] = checkpoint.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create folder commit changes
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
await knex.batchInsert(
|
||||||
|
TableName.FolderCommitChanges,
|
||||||
|
foldersCommitsList
|
||||||
|
.map((folderCommit) => folderCommit.changes)
|
||||||
|
.flat()
|
||||||
|
.map((change) => ({
|
||||||
|
folderCommitId: newCommitsMap[change.folderId],
|
||||||
|
changeType: change.changeType,
|
||||||
|
secretVersionId: change.secretVersionId,
|
||||||
|
folderVersionId: change.folderVersionId,
|
||||||
|
isUpdate: false
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder commit changes - batch ${j} of ${commitBatches.length}`);
|
||||||
|
|
||||||
|
// Create folder checkpoint resources
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
await knex.batchInsert(
|
||||||
|
TableName.FolderCheckpointResources,
|
||||||
|
foldersCommitsList
|
||||||
|
.map((folderCommit) => folderCommit.changes)
|
||||||
|
.flat()
|
||||||
|
.map((change) => ({
|
||||||
|
folderCheckpointId: newCheckpointsMap[change.folderId],
|
||||||
|
folderVersionId: change.folderVersionId,
|
||||||
|
secretVersionId: change.secretVersionId
|
||||||
|
}))
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder checkpoint resources - batch ${j} of ${commitBatches.length}`);
|
||||||
|
|
||||||
|
// Create Folder Tree Checkpoint
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
const newTreeCheckpoints = (await knex
|
||||||
|
.batchInsert(
|
||||||
|
TableName.FolderTreeCheckpoint,
|
||||||
|
Object.keys(rootFoldersMap).map((folderId) => ({
|
||||||
|
folderCommitId: newCommitsMap[folderId]
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
.returning("*")) as TFolderTreeCheckpoints[];
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder tree checkpoints - batch ${j} of ${commitBatches.length}`);
|
||||||
|
|
||||||
|
const newTreeCheckpointsMap: Record<string, string> = {};
|
||||||
|
newTreeCheckpoints.forEach((checkpoint) => {
|
||||||
|
newTreeCheckpointsMap[rootFoldersMap[newCommitsMapInverted[checkpoint.folderCommitId]]] = checkpoint.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create Folder Tree Checkpoint Resources
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
await knex
|
||||||
|
.batchInsert(
|
||||||
|
TableName.FolderTreeCheckpointResources,
|
||||||
|
newCommitsInserted.map((folderCommit) => ({
|
||||||
|
folderTreeCheckpointId: newTreeCheckpointsMap[folderCommit.envId],
|
||||||
|
folderId: folderCommit.folderId,
|
||||||
|
folderCommitId: folderCommit.id
|
||||||
|
}))
|
||||||
|
)
|
||||||
|
.returning("*");
|
||||||
|
|
||||||
|
logger.info(`Finished inserting folder tree checkpoint resources - batch ${j} of ${commitBatches.length}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.info("Folder commits initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasFolderCommitTable = await knex.schema.hasTable(TableName.FolderCommit);
|
||||||
|
if (hasFolderCommitTable) {
|
||||||
|
// delete all existing entries
|
||||||
|
await knex(TableName.FolderCommit).del();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasStepColumn = await knex.schema.hasColumn(TableName.AccessApprovalPolicyApprover, "sequence");
|
||||||
|
const hasApprovalRequiredColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.AccessApprovalPolicyApprover,
|
||||||
|
"approvalsRequired"
|
||||||
|
);
|
||||||
|
if (!hasStepColumn || !hasApprovalRequiredColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalPolicyApprover, (t) => {
|
||||||
|
if (!hasStepColumn) t.integer("sequence").defaultTo(1);
|
||||||
|
if (!hasApprovalRequiredColumn) t.integer("approvalsRequired").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// set rejected status for all access request that was rejected and still has status pending
|
||||||
|
const subquery = knex(TableName.AccessApprovalRequest)
|
||||||
|
.leftJoin(
|
||||||
|
TableName.AccessApprovalRequestReviewer,
|
||||||
|
`${TableName.AccessApprovalRequestReviewer}.requestId`,
|
||||||
|
`${TableName.AccessApprovalRequest}.id`
|
||||||
|
)
|
||||||
|
.where(`${TableName.AccessApprovalRequest}.status` as "status", "pending")
|
||||||
|
.where(`${TableName.AccessApprovalRequestReviewer}.status` as "status", "rejected")
|
||||||
|
.select(`${TableName.AccessApprovalRequest}.id`);
|
||||||
|
|
||||||
|
await knex(TableName.AccessApprovalRequest).where("id", "in", subquery).update("status", "rejected");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasStepColumn = await knex.schema.hasColumn(TableName.AccessApprovalPolicyApprover, "sequence");
|
||||||
|
const hasApprovalRequiredColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.AccessApprovalPolicyApprover,
|
||||||
|
"approvalsRequired"
|
||||||
|
);
|
||||||
|
if (hasStepColumn || hasApprovalRequiredColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.AccessApprovalPolicyApprover, (t) => {
|
||||||
|
if (hasStepColumn) t.dropColumn("sequence");
|
||||||
|
if (hasApprovalRequiredColumn) t.dropColumn("approvalsRequired");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasTokenReviewModeColumn = await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "tokenReviewMode");
|
||||||
|
|
||||||
|
if (!hasTokenReviewModeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (table) => {
|
||||||
|
table.string("tokenReviewMode").notNullable().defaultTo("api");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasTokenReviewModeColumn = await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "tokenReviewMode");
|
||||||
|
|
||||||
|
if (hasTokenReviewModeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (table) => {
|
||||||
|
table.dropColumn("tokenReviewMode");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasShowSnapshotsLegacyColumn = await knex.schema.hasColumn(TableName.Project, "showSnapshotsLegacy");
|
||||||
|
if (!hasShowSnapshotsLegacyColumn) {
|
||||||
|
await knex.schema.table(TableName.Project, (table) => {
|
||||||
|
table.boolean("showSnapshotsLegacy").notNullable().defaultTo(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasShowSnapshotsLegacyColumn = await knex.schema.hasColumn(TableName.Project, "showSnapshotsLegacy");
|
||||||
|
if (hasShowSnapshotsLegacyColumn) {
|
||||||
|
await knex.schema.table(TableName.Project, (table) => {
|
||||||
|
table.dropColumn("showSnapshotsLegacy");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasConfigColumn = await knex.schema.hasColumn(TableName.DynamicSecretLease, "config");
|
||||||
|
if (!hasConfigColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.DynamicSecretLease, (table) => {
|
||||||
|
table.jsonb("config");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasConfigColumn = await knex.schema.hasColumn(TableName.DynamicSecretLease, "config");
|
||||||
|
if (hasConfigColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.DynamicSecretLease, (table) => {
|
||||||
|
table.dropColumn("config");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { selectAllTableCols } from "@app/lib/knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
const BATCH_SIZE = 1000;
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasKubernetesHostColumn = await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "kubernetesHost");
|
||||||
|
|
||||||
|
if (hasKubernetesHostColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (table) => {
|
||||||
|
table.string("kubernetesHost").nullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasKubernetesHostColumn = await knex.schema.hasColumn(TableName.IdentityKubernetesAuth, "kubernetesHost");
|
||||||
|
|
||||||
|
// find all rows where kubernetesHost is null
|
||||||
|
const rows = await knex(TableName.IdentityKubernetesAuth)
|
||||||
|
.whereNull("kubernetesHost")
|
||||||
|
.select(selectAllTableCols(TableName.IdentityKubernetesAuth));
|
||||||
|
|
||||||
|
if (rows.length > 0) {
|
||||||
|
for (let i = 0; i < rows.length; i += BATCH_SIZE) {
|
||||||
|
const batch = rows.slice(i, i + BATCH_SIZE);
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
await knex(TableName.IdentityKubernetesAuth)
|
||||||
|
.whereIn(
|
||||||
|
"id",
|
||||||
|
batch.map((row) => row.id)
|
||||||
|
)
|
||||||
|
.update({ kubernetesHost: "" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasKubernetesHostColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityKubernetesAuth, (table) => {
|
||||||
|
table.string("kubernetesHost").notNullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasTable(TableName.IdentityAliCloudAuth))) {
|
||||||
|
await knex.schema.createTable(TableName.IdentityAliCloudAuth, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.bigInteger("accessTokenTTL").defaultTo(7200).notNullable();
|
||||||
|
t.bigInteger("accessTokenMaxTTL").defaultTo(7200).notNullable();
|
||||||
|
t.bigInteger("accessTokenNumUsesLimit").defaultTo(0).notNullable();
|
||||||
|
t.jsonb("accessTokenTrustedIps").notNullable();
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
t.uuid("identityId").notNullable().unique();
|
||||||
|
t.foreign("identityId").references("id").inTable(TableName.Identity).onDelete("CASCADE");
|
||||||
|
t.string("type").notNullable();
|
||||||
|
|
||||||
|
t.string("allowedArns").notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await createOnUpdateTrigger(knex, TableName.IdentityAliCloudAuth);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
await knex.schema.dropTableIfExists(TableName.IdentityAliCloudAuth);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.IdentityAliCloudAuth);
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasCol = await knex.schema.hasColumn(TableName.Identity, "hasDeleteProtection");
|
||||||
|
if (!hasCol) {
|
||||||
|
await knex.schema.alterTable(TableName.Identity, (t) => {
|
||||||
|
t.boolean("hasDeleteProtection").notNullable().defaultTo(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasCol = await knex.schema.hasColumn(TableName.Identity, "hasDeleteProtection");
|
||||||
|
if (hasCol) {
|
||||||
|
await knex.schema.alterTable(TableName.Identity, (t) => {
|
||||||
|
t.dropColumn("hasDeleteProtection");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.IdentityAwsAuth, "allowedPrincipalArns");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAwsAuth, (t) => {
|
||||||
|
t.string("allowedPrincipalArns", 2048).notNullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.IdentityAwsAuth, "allowedPrincipalArns");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.IdentityAwsAuth, (t) => {
|
||||||
|
t.string("allowedPrincipalArns", 255).notNullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasEncryptedGithubAppConnectionClientIdColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionClientId"
|
||||||
|
);
|
||||||
|
const hasEncryptedGithubAppConnectionClientSecretColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionClientSecret"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionSlugColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionSlug"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionAppIdColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionId"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionAppPrivateKeyColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionPrivateKey"
|
||||||
|
);
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.SuperAdmin, (t) => {
|
||||||
|
if (!hasEncryptedGithubAppConnectionClientIdColumn) {
|
||||||
|
t.binary("encryptedGitHubAppConnectionClientId").nullable();
|
||||||
|
}
|
||||||
|
if (!hasEncryptedGithubAppConnectionClientSecretColumn) {
|
||||||
|
t.binary("encryptedGitHubAppConnectionClientSecret").nullable();
|
||||||
|
}
|
||||||
|
if (!hasEncryptedGithubAppConnectionSlugColumn) {
|
||||||
|
t.binary("encryptedGitHubAppConnectionSlug").nullable();
|
||||||
|
}
|
||||||
|
if (!hasEncryptedGithubAppConnectionAppIdColumn) {
|
||||||
|
t.binary("encryptedGitHubAppConnectionId").nullable();
|
||||||
|
}
|
||||||
|
if (!hasEncryptedGithubAppConnectionAppPrivateKeyColumn) {
|
||||||
|
t.binary("encryptedGitHubAppConnectionPrivateKey").nullable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasEncryptedGithubAppConnectionClientIdColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionClientId"
|
||||||
|
);
|
||||||
|
const hasEncryptedGithubAppConnectionClientSecretColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionClientSecret"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionSlugColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionSlug"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionAppIdColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionId"
|
||||||
|
);
|
||||||
|
|
||||||
|
const hasEncryptedGithubAppConnectionAppPrivateKeyColumn = await knex.schema.hasColumn(
|
||||||
|
TableName.SuperAdmin,
|
||||||
|
"encryptedGitHubAppConnectionPrivateKey"
|
||||||
|
);
|
||||||
|
|
||||||
|
await knex.schema.alterTable(TableName.SuperAdmin, (t) => {
|
||||||
|
if (hasEncryptedGithubAppConnectionClientIdColumn) {
|
||||||
|
t.dropColumn("encryptedGitHubAppConnectionClientId");
|
||||||
|
}
|
||||||
|
if (hasEncryptedGithubAppConnectionClientSecretColumn) {
|
||||||
|
t.dropColumn("encryptedGitHubAppConnectionClientSecret");
|
||||||
|
}
|
||||||
|
if (hasEncryptedGithubAppConnectionSlugColumn) {
|
||||||
|
t.dropColumn("encryptedGitHubAppConnectionSlug");
|
||||||
|
}
|
||||||
|
if (hasEncryptedGithubAppConnectionAppIdColumn) {
|
||||||
|
t.dropColumn("encryptedGitHubAppConnectionId");
|
||||||
|
}
|
||||||
|
if (hasEncryptedGithubAppConnectionAppPrivateKeyColumn) {
|
||||||
|
t.dropColumn("encryptedGitHubAppConnectionPrivateKey");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
if (!(await knex.schema.hasTable(TableName.IdentityTlsCertAuth))) {
|
||||||
|
await knex.schema.createTable(TableName.IdentityTlsCertAuth, (t) => {
|
||||||
|
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||||
|
t.bigInteger("accessTokenTTL").defaultTo(7200).notNullable();
|
||||||
|
t.bigInteger("accessTokenMaxTTL").defaultTo(7200).notNullable();
|
||||||
|
t.bigInteger("accessTokenNumUsesLimit").defaultTo(0).notNullable();
|
||||||
|
t.jsonb("accessTokenTrustedIps").notNullable();
|
||||||
|
t.timestamps(true, true, true);
|
||||||
|
t.uuid("identityId").notNullable().unique();
|
||||||
|
t.foreign("identityId").references("id").inTable(TableName.Identity).onDelete("CASCADE");
|
||||||
|
t.string("allowedCommonNames").nullable();
|
||||||
|
t.binary("encryptedCaCertificate").notNullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
await createOnUpdateTrigger(knex, TableName.IdentityTlsCertAuth);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
await knex.schema.dropTableIfExists(TableName.IdentityTlsCertAuth);
|
||||||
|
await dropOnUpdateTrigger(knex, TableName.IdentityTlsCertAuth);
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { ProjectType, TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type");
|
||||||
|
const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct");
|
||||||
|
if (hasTypeColumn && !hasDefaultTypeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.Project, (t) => {
|
||||||
|
t.string("type").nullable().alter();
|
||||||
|
t.string("defaultProduct").notNullable().defaultTo(ProjectType.SecretManager);
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex(TableName.Project).update({
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore this is because this field is created later
|
||||||
|
defaultProduct: knex.raw(`
|
||||||
|
CASE
|
||||||
|
WHEN "type" IS NULL OR "type" = '' THEN 'secret-manager'
|
||||||
|
ELSE "type"
|
||||||
|
END
|
||||||
|
`)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const hasTemplateTypeColumn = await knex.schema.hasColumn(TableName.ProjectTemplates, "type");
|
||||||
|
if (hasTemplateTypeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.ProjectTemplates, (t) => {
|
||||||
|
t.string("type").nullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultProduct");
|
||||||
|
if (hasDefaultTypeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.Project, (t) => {
|
||||||
|
t.dropColumn("defaultProduct");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
21
backend/src/db/migrations/20250627010508_env-overrides.ts
Normal file
21
backend/src/db/migrations/20250627010508_env-overrides.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.SuperAdmin, "encryptedEnvOverrides");
|
||||||
|
if (!hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.SuperAdmin, (t) => {
|
||||||
|
t.binary("encryptedEnvOverrides").nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.SuperAdmin, "encryptedEnvOverrides");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.SuperAdmin, (t) => {
|
||||||
|
t.dropColumn("encryptedEnvOverrides");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.OrgMembership, "lastInvitedAt");
|
||||||
|
await knex.schema.alterTable(TableName.OrgMembership, (t) => {
|
||||||
|
if (!hasColumn) {
|
||||||
|
t.datetime("lastInvitedAt").nullable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.OrgMembership, "lastInvitedAt");
|
||||||
|
await knex.schema.alterTable(TableName.OrgMembership, (t) => {
|
||||||
|
if (hasColumn) {
|
||||||
|
t.dropColumn("lastInvitedAt");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
|
||||||
|
import { TableName } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.OrgMembership, "lastInvitedAt");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.OrgMembership, (t) => {
|
||||||
|
t.datetime("lastInvitedAt").nullable().defaultTo(knex.fn.now()).alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasColumn = await knex.schema.hasColumn(TableName.OrgMembership, "lastInvitedAt");
|
||||||
|
if (hasColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.OrgMembership, (t) => {
|
||||||
|
t.datetime("lastInvitedAt").nullable().alter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -3,12 +3,27 @@ import { Knex } from "knex";
|
|||||||
import { initializeHsmModule } from "@app/ee/services/hsm/hsm-fns";
|
import { initializeHsmModule } from "@app/ee/services/hsm/hsm-fns";
|
||||||
import { hsmServiceFactory } from "@app/ee/services/hsm/hsm-service";
|
import { hsmServiceFactory } from "@app/ee/services/hsm/hsm-service";
|
||||||
import { TKeyStoreFactory } from "@app/keystore/keystore";
|
import { TKeyStoreFactory } from "@app/keystore/keystore";
|
||||||
|
import { folderCheckpointDALFactory } from "@app/services/folder-checkpoint/folder-checkpoint-dal";
|
||||||
|
import { folderCheckpointResourcesDALFactory } from "@app/services/folder-checkpoint-resources/folder-checkpoint-resources-dal";
|
||||||
|
import { folderCommitDALFactory } from "@app/services/folder-commit/folder-commit-dal";
|
||||||
|
import { folderCommitServiceFactory } from "@app/services/folder-commit/folder-commit-service";
|
||||||
|
import { folderCommitChangesDALFactory } from "@app/services/folder-commit-changes/folder-commit-changes-dal";
|
||||||
|
import { folderTreeCheckpointDALFactory } from "@app/services/folder-tree-checkpoint/folder-tree-checkpoint-dal";
|
||||||
|
import { folderTreeCheckpointResourcesDALFactory } from "@app/services/folder-tree-checkpoint-resources/folder-tree-checkpoint-resources-dal";
|
||||||
|
import { identityDALFactory } from "@app/services/identity/identity-dal";
|
||||||
import { internalKmsDALFactory } from "@app/services/kms/internal-kms-dal";
|
import { internalKmsDALFactory } from "@app/services/kms/internal-kms-dal";
|
||||||
import { kmskeyDALFactory } from "@app/services/kms/kms-key-dal";
|
import { kmskeyDALFactory } from "@app/services/kms/kms-key-dal";
|
||||||
import { kmsRootConfigDALFactory } from "@app/services/kms/kms-root-config-dal";
|
import { kmsRootConfigDALFactory } from "@app/services/kms/kms-root-config-dal";
|
||||||
import { kmsServiceFactory } from "@app/services/kms/kms-service";
|
import { kmsServiceFactory } from "@app/services/kms/kms-service";
|
||||||
import { orgDALFactory } from "@app/services/org/org-dal";
|
import { orgDALFactory } from "@app/services/org/org-dal";
|
||||||
import { projectDALFactory } from "@app/services/project/project-dal";
|
import { projectDALFactory } from "@app/services/project/project-dal";
|
||||||
|
import { resourceMetadataDALFactory } from "@app/services/resource-metadata/resource-metadata-dal";
|
||||||
|
import { secretFolderDALFactory } from "@app/services/secret-folder/secret-folder-dal";
|
||||||
|
import { secretFolderVersionDALFactory } from "@app/services/secret-folder/secret-folder-version-dal";
|
||||||
|
import { secretTagDALFactory } from "@app/services/secret-tag/secret-tag-dal";
|
||||||
|
import { secretV2BridgeDALFactory } from "@app/services/secret-v2-bridge/secret-v2-bridge-dal";
|
||||||
|
import { secretVersionV2BridgeDALFactory } from "@app/services/secret-v2-bridge/secret-version-dal";
|
||||||
|
import { userDALFactory } from "@app/services/user/user-dal";
|
||||||
|
|
||||||
import { TMigrationEnvConfig } from "./env-config";
|
import { TMigrationEnvConfig } from "./env-config";
|
||||||
|
|
||||||
@ -50,3 +65,77 @@ export const getMigrationEncryptionServices = async ({ envConfig, db, keyStore }
|
|||||||
|
|
||||||
return { kmsService };
|
return { kmsService };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const getMigrationPITServices = async ({
|
||||||
|
db,
|
||||||
|
keyStore,
|
||||||
|
envConfig
|
||||||
|
}: {
|
||||||
|
db: Knex;
|
||||||
|
keyStore: TKeyStoreFactory;
|
||||||
|
envConfig: TMigrationEnvConfig;
|
||||||
|
}) => {
|
||||||
|
const projectDAL = projectDALFactory(db);
|
||||||
|
const folderCommitDAL = folderCommitDALFactory(db);
|
||||||
|
const folderCommitChangesDAL = folderCommitChangesDALFactory(db);
|
||||||
|
const folderCheckpointDAL = folderCheckpointDALFactory(db);
|
||||||
|
const folderTreeCheckpointDAL = folderTreeCheckpointDALFactory(db);
|
||||||
|
const userDAL = userDALFactory(db);
|
||||||
|
const identityDAL = identityDALFactory(db);
|
||||||
|
const folderDAL = secretFolderDALFactory(db);
|
||||||
|
const folderVersionDAL = secretFolderVersionDALFactory(db);
|
||||||
|
const secretVersionV2BridgeDAL = secretVersionV2BridgeDALFactory(db);
|
||||||
|
const folderCheckpointResourcesDAL = folderCheckpointResourcesDALFactory(db);
|
||||||
|
const secretV2BridgeDAL = secretV2BridgeDALFactory({ db, keyStore });
|
||||||
|
const folderTreeCheckpointResourcesDAL = folderTreeCheckpointResourcesDALFactory(db);
|
||||||
|
const secretTagDAL = secretTagDALFactory(db);
|
||||||
|
|
||||||
|
const orgDAL = orgDALFactory(db);
|
||||||
|
const kmsRootConfigDAL = kmsRootConfigDALFactory(db);
|
||||||
|
const kmsDAL = kmskeyDALFactory(db);
|
||||||
|
const internalKmsDAL = internalKmsDALFactory(db);
|
||||||
|
const resourceMetadataDAL = resourceMetadataDALFactory(db);
|
||||||
|
|
||||||
|
const hsmModule = initializeHsmModule(envConfig);
|
||||||
|
hsmModule.initialize();
|
||||||
|
|
||||||
|
const hsmService = hsmServiceFactory({
|
||||||
|
hsmModule: hsmModule.getModule(),
|
||||||
|
envConfig
|
||||||
|
});
|
||||||
|
|
||||||
|
const kmsService = kmsServiceFactory({
|
||||||
|
kmsRootConfigDAL,
|
||||||
|
keyStore,
|
||||||
|
kmsDAL,
|
||||||
|
internalKmsDAL,
|
||||||
|
orgDAL,
|
||||||
|
projectDAL,
|
||||||
|
hsmService,
|
||||||
|
envConfig
|
||||||
|
});
|
||||||
|
|
||||||
|
await hsmService.startService();
|
||||||
|
await kmsService.startService();
|
||||||
|
|
||||||
|
const folderCommitService = folderCommitServiceFactory({
|
||||||
|
folderCommitDAL,
|
||||||
|
folderCommitChangesDAL,
|
||||||
|
folderCheckpointDAL,
|
||||||
|
folderTreeCheckpointDAL,
|
||||||
|
userDAL,
|
||||||
|
identityDAL,
|
||||||
|
folderDAL,
|
||||||
|
folderVersionDAL,
|
||||||
|
secretVersionV2BridgeDAL,
|
||||||
|
projectDAL,
|
||||||
|
folderCheckpointResourcesDAL,
|
||||||
|
secretV2BridgeDAL,
|
||||||
|
folderTreeCheckpointResourcesDAL,
|
||||||
|
kmsService,
|
||||||
|
secretTagDAL,
|
||||||
|
resourceMetadataDAL
|
||||||
|
});
|
||||||
|
|
||||||
|
return { folderCommitService };
|
||||||
|
};
|
||||||
|
@ -13,7 +13,9 @@ export const AccessApprovalPoliciesApproversSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
approverUserId: z.string().uuid().nullable().optional(),
|
approverUserId: z.string().uuid().nullable().optional(),
|
||||||
approverGroupId: z.string().uuid().nullable().optional()
|
approverGroupId: z.string().uuid().nullable().optional(),
|
||||||
|
sequence: z.number().default(0).nullable().optional(),
|
||||||
|
approvalsRequired: z.number().default(1).nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TAccessApprovalPoliciesApprovers = z.infer<typeof AccessApprovalPoliciesApproversSchema>;
|
export type TAccessApprovalPoliciesApprovers = z.infer<typeof AccessApprovalPoliciesApproversSchema>;
|
||||||
|
26
backend/src/db/schemas/access-approval-policies-bypassers.ts
Normal file
26
backend/src/db/schemas/access-approval-policies-bypassers.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const AccessApprovalPoliciesBypassersSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
bypasserGroupId: z.string().uuid().nullable().optional(),
|
||||||
|
bypasserUserId: z.string().uuid().nullable().optional(),
|
||||||
|
policyId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TAccessApprovalPoliciesBypassers = z.infer<typeof AccessApprovalPoliciesBypassersSchema>;
|
||||||
|
export type TAccessApprovalPoliciesBypassersInsert = Omit<
|
||||||
|
z.input<typeof AccessApprovalPoliciesBypassersSchema>,
|
||||||
|
TImmutableDBKeys
|
||||||
|
>;
|
||||||
|
export type TAccessApprovalPoliciesBypassersUpdate = Partial<
|
||||||
|
Omit<z.input<typeof AccessApprovalPoliciesBypassersSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
@ -18,7 +18,9 @@ export const AccessApprovalRequestsSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
requestedByUserId: z.string().uuid(),
|
requestedByUserId: z.string().uuid(),
|
||||||
note: z.string().nullable().optional()
|
note: z.string().nullable().optional(),
|
||||||
|
privilegeDeletedAt: z.date().nullable().optional(),
|
||||||
|
status: z.string().default("pending")
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TAccessApprovalRequests = z.infer<typeof AccessApprovalRequestsSchema>;
|
export type TAccessApprovalRequests = z.infer<typeof AccessApprovalRequestsSchema>;
|
||||||
|
@ -11,25 +11,10 @@ export const CertificateAuthoritiesSchema = z.object({
|
|||||||
id: z.string().uuid(),
|
id: z.string().uuid(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
parentCaId: z.string().uuid().nullable().optional(),
|
|
||||||
projectId: z.string(),
|
projectId: z.string(),
|
||||||
type: z.string(),
|
enableDirectIssuance: z.boolean().default(true),
|
||||||
status: z.string(),
|
status: z.string(),
|
||||||
friendlyName: z.string(),
|
name: z.string()
|
||||||
organization: z.string(),
|
|
||||||
ou: z.string(),
|
|
||||||
country: z.string(),
|
|
||||||
province: z.string(),
|
|
||||||
locality: z.string(),
|
|
||||||
commonName: z.string(),
|
|
||||||
dn: z.string(),
|
|
||||||
serialNumber: z.string().nullable().optional(),
|
|
||||||
maxPathLength: z.number().nullable().optional(),
|
|
||||||
keyAlgorithm: z.string(),
|
|
||||||
notBefore: z.date().nullable().optional(),
|
|
||||||
notAfter: z.date().nullable().optional(),
|
|
||||||
activeCaCertId: z.string().uuid().nullable().optional(),
|
|
||||||
requireTemplateForIssuance: z.boolean().default(false)
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TCertificateAuthorities = z.infer<typeof CertificateAuthoritiesSchema>;
|
export type TCertificateAuthorities = z.infer<typeof CertificateAuthoritiesSchema>;
|
||||||
|
@ -11,7 +11,7 @@ export const CertificatesSchema = z.object({
|
|||||||
id: z.string().uuid(),
|
id: z.string().uuid(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
caId: z.string().uuid(),
|
caId: z.string().uuid().nullable().optional(),
|
||||||
status: z.string(),
|
status: z.string(),
|
||||||
serialNumber: z.string(),
|
serialNumber: z.string(),
|
||||||
friendlyName: z.string(),
|
friendlyName: z.string(),
|
||||||
@ -21,11 +21,12 @@ export const CertificatesSchema = z.object({
|
|||||||
revokedAt: z.date().nullable().optional(),
|
revokedAt: z.date().nullable().optional(),
|
||||||
revocationReason: z.number().nullable().optional(),
|
revocationReason: z.number().nullable().optional(),
|
||||||
altNames: z.string().nullable().optional(),
|
altNames: z.string().nullable().optional(),
|
||||||
caCertId: z.string().uuid(),
|
caCertId: z.string().uuid().nullable().optional(),
|
||||||
certificateTemplateId: z.string().uuid().nullable().optional(),
|
certificateTemplateId: z.string().uuid().nullable().optional(),
|
||||||
keyUsages: z.string().array().nullable().optional(),
|
keyUsages: z.string().array().nullable().optional(),
|
||||||
extendedKeyUsages: z.string().array().nullable().optional(),
|
extendedKeyUsages: z.string().array().nullable().optional(),
|
||||||
pkiSubscriberId: z.string().uuid().nullable().optional()
|
pkiSubscriberId: z.string().uuid().nullable().optional(),
|
||||||
|
projectId: z.string()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TCertificates = z.infer<typeof CertificatesSchema>;
|
export type TCertificates = z.infer<typeof CertificatesSchema>;
|
||||||
|
@ -16,7 +16,8 @@ export const DynamicSecretLeasesSchema = z.object({
|
|||||||
statusDetails: z.string().nullable().optional(),
|
statusDetails: z.string().nullable().optional(),
|
||||||
dynamicSecretId: z.string().uuid(),
|
dynamicSecretId: z.string().uuid(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date()
|
updatedAt: z.date(),
|
||||||
|
config: z.unknown().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TDynamicSecretLeases = z.infer<typeof DynamicSecretLeasesSchema>;
|
export type TDynamicSecretLeases = z.infer<typeof DynamicSecretLeasesSchema>;
|
||||||
|
@ -28,7 +28,8 @@ export const DynamicSecretsSchema = z.object({
|
|||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
encryptedInput: zodBuffer,
|
encryptedInput: zodBuffer,
|
||||||
projectGatewayId: z.string().uuid().nullable().optional(),
|
projectGatewayId: z.string().uuid().nullable().optional(),
|
||||||
gatewayId: z.string().uuid().nullable().optional()
|
gatewayId: z.string().uuid().nullable().optional(),
|
||||||
|
usernameTemplate: z.string().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TDynamicSecrets = z.infer<typeof DynamicSecretsSchema>;
|
export type TDynamicSecrets = z.infer<typeof DynamicSecretsSchema>;
|
||||||
|
29
backend/src/db/schemas/external-certificate-authorities.ts
Normal file
29
backend/src/db/schemas/external-certificate-authorities.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { zodBuffer } from "@app/lib/zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const ExternalCertificateAuthoritiesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
type: z.string(),
|
||||||
|
appConnectionId: z.string().uuid().nullable().optional(),
|
||||||
|
dnsAppConnectionId: z.string().uuid().nullable().optional(),
|
||||||
|
caId: z.string().uuid(),
|
||||||
|
credentials: zodBuffer.nullable().optional(),
|
||||||
|
configuration: z.unknown().nullable().optional()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TExternalCertificateAuthorities = z.infer<typeof ExternalCertificateAuthoritiesSchema>;
|
||||||
|
export type TExternalCertificateAuthoritiesInsert = Omit<
|
||||||
|
z.input<typeof ExternalCertificateAuthoritiesSchema>,
|
||||||
|
TImmutableDBKeys
|
||||||
|
>;
|
||||||
|
export type TExternalCertificateAuthoritiesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof ExternalCertificateAuthoritiesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
23
backend/src/db/schemas/folder-checkpoint-resources.ts
Normal file
23
backend/src/db/schemas/folder-checkpoint-resources.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderCheckpointResourcesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
folderCheckpointId: z.string().uuid(),
|
||||||
|
secretVersionId: z.string().uuid().nullable().optional(),
|
||||||
|
folderVersionId: z.string().uuid().nullable().optional(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderCheckpointResources = z.infer<typeof FolderCheckpointResourcesSchema>;
|
||||||
|
export type TFolderCheckpointResourcesInsert = Omit<z.input<typeof FolderCheckpointResourcesSchema>, TImmutableDBKeys>;
|
||||||
|
export type TFolderCheckpointResourcesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof FolderCheckpointResourcesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
19
backend/src/db/schemas/folder-checkpoints.ts
Normal file
19
backend/src/db/schemas/folder-checkpoints.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderCheckpointsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
folderCommitId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderCheckpoints = z.infer<typeof FolderCheckpointsSchema>;
|
||||||
|
export type TFolderCheckpointsInsert = Omit<z.input<typeof FolderCheckpointsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TFolderCheckpointsUpdate = Partial<Omit<z.input<typeof FolderCheckpointsSchema>, TImmutableDBKeys>>;
|
23
backend/src/db/schemas/folder-commit-changes.ts
Normal file
23
backend/src/db/schemas/folder-commit-changes.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderCommitChangesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
folderCommitId: z.string().uuid(),
|
||||||
|
changeType: z.string(),
|
||||||
|
isUpdate: z.boolean().default(false),
|
||||||
|
secretVersionId: z.string().uuid().nullable().optional(),
|
||||||
|
folderVersionId: z.string().uuid().nullable().optional(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderCommitChanges = z.infer<typeof FolderCommitChangesSchema>;
|
||||||
|
export type TFolderCommitChangesInsert = Omit<z.input<typeof FolderCommitChangesSchema>, TImmutableDBKeys>;
|
||||||
|
export type TFolderCommitChangesUpdate = Partial<Omit<z.input<typeof FolderCommitChangesSchema>, TImmutableDBKeys>>;
|
24
backend/src/db/schemas/folder-commits.ts
Normal file
24
backend/src/db/schemas/folder-commits.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderCommitsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
commitId: z.coerce.bigint(),
|
||||||
|
actorMetadata: z.unknown(),
|
||||||
|
actorType: z.string(),
|
||||||
|
message: z.string().nullable().optional(),
|
||||||
|
folderId: z.string().uuid(),
|
||||||
|
envId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderCommits = z.infer<typeof FolderCommitsSchema>;
|
||||||
|
export type TFolderCommitsInsert = Omit<z.input<typeof FolderCommitsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TFolderCommitsUpdate = Partial<Omit<z.input<typeof FolderCommitsSchema>, TImmutableDBKeys>>;
|
26
backend/src/db/schemas/folder-tree-checkpoint-resources.ts
Normal file
26
backend/src/db/schemas/folder-tree-checkpoint-resources.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderTreeCheckpointResourcesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
folderTreeCheckpointId: z.string().uuid(),
|
||||||
|
folderId: z.string().uuid(),
|
||||||
|
folderCommitId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderTreeCheckpointResources = z.infer<typeof FolderTreeCheckpointResourcesSchema>;
|
||||||
|
export type TFolderTreeCheckpointResourcesInsert = Omit<
|
||||||
|
z.input<typeof FolderTreeCheckpointResourcesSchema>,
|
||||||
|
TImmutableDBKeys
|
||||||
|
>;
|
||||||
|
export type TFolderTreeCheckpointResourcesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof FolderTreeCheckpointResourcesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
19
backend/src/db/schemas/folder-tree-checkpoints.ts
Normal file
19
backend/src/db/schemas/folder-tree-checkpoints.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const FolderTreeCheckpointsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
folderCommitId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TFolderTreeCheckpoints = z.infer<typeof FolderTreeCheckpointsSchema>;
|
||||||
|
export type TFolderTreeCheckpointsInsert = Omit<z.input<typeof FolderTreeCheckpointsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TFolderTreeCheckpointsUpdate = Partial<Omit<z.input<typeof FolderTreeCheckpointsSchema>, TImmutableDBKeys>>;
|
@ -12,7 +12,8 @@ export const IdentitiesSchema = z.object({
|
|||||||
name: z.string(),
|
name: z.string(),
|
||||||
authMethod: z.string().nullable().optional(),
|
authMethod: z.string().nullable().optional(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date()
|
updatedAt: z.date(),
|
||||||
|
hasDeleteProtection: z.boolean().default(false)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentities = z.infer<typeof IdentitiesSchema>;
|
export type TIdentities = z.infer<typeof IdentitiesSchema>;
|
||||||
|
@ -21,7 +21,8 @@ export const IdentityAccessTokensSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
name: z.string().nullable().optional(),
|
name: z.string().nullable().optional(),
|
||||||
authMethod: z.string()
|
authMethod: z.string(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityAccessTokens = z.infer<typeof IdentityAccessTokensSchema>;
|
export type TIdentityAccessTokens = z.infer<typeof IdentityAccessTokensSchema>;
|
||||||
|
25
backend/src/db/schemas/identity-alicloud-auths.ts
Normal file
25
backend/src/db/schemas/identity-alicloud-auths.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const IdentityAlicloudAuthsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
accessTokenTTL: z.coerce.number().default(7200),
|
||||||
|
accessTokenMaxTTL: z.coerce.number().default(7200),
|
||||||
|
accessTokenNumUsesLimit: z.coerce.number().default(0),
|
||||||
|
accessTokenTrustedIps: z.unknown(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date(),
|
||||||
|
identityId: z.string().uuid(),
|
||||||
|
type: z.string(),
|
||||||
|
allowedArns: z.string()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TIdentityAlicloudAuths = z.infer<typeof IdentityAlicloudAuthsSchema>;
|
||||||
|
export type TIdentityAlicloudAuthsInsert = Omit<z.input<typeof IdentityAlicloudAuthsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TIdentityAlicloudAuthsUpdate = Partial<Omit<z.input<typeof IdentityAlicloudAuthsSchema>, TImmutableDBKeys>>;
|
@ -19,7 +19,8 @@ export const IdentityAwsAuthsSchema = z.object({
|
|||||||
type: z.string(),
|
type: z.string(),
|
||||||
stsEndpoint: z.string(),
|
stsEndpoint: z.string(),
|
||||||
allowedPrincipalArns: z.string(),
|
allowedPrincipalArns: z.string(),
|
||||||
allowedAccountIds: z.string()
|
allowedAccountIds: z.string(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityAwsAuths = z.infer<typeof IdentityAwsAuthsSchema>;
|
export type TIdentityAwsAuths = z.infer<typeof IdentityAwsAuthsSchema>;
|
||||||
|
@ -18,7 +18,8 @@ export const IdentityAzureAuthsSchema = z.object({
|
|||||||
identityId: z.string().uuid(),
|
identityId: z.string().uuid(),
|
||||||
tenantId: z.string(),
|
tenantId: z.string(),
|
||||||
resource: z.string(),
|
resource: z.string(),
|
||||||
allowedServicePrincipalIds: z.string()
|
allowedServicePrincipalIds: z.string(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityAzureAuths = z.infer<typeof IdentityAzureAuthsSchema>;
|
export type TIdentityAzureAuths = z.infer<typeof IdentityAzureAuthsSchema>;
|
||||||
|
@ -19,7 +19,8 @@ export const IdentityGcpAuthsSchema = z.object({
|
|||||||
type: z.string(),
|
type: z.string(),
|
||||||
allowedServiceAccounts: z.string().nullable().optional(),
|
allowedServiceAccounts: z.string().nullable().optional(),
|
||||||
allowedProjects: z.string().nullable().optional(),
|
allowedProjects: z.string().nullable().optional(),
|
||||||
allowedZones: z.string().nullable().optional()
|
allowedZones: z.string().nullable().optional(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityGcpAuths = z.infer<typeof IdentityGcpAuthsSchema>;
|
export type TIdentityGcpAuths = z.infer<typeof IdentityGcpAuthsSchema>;
|
||||||
|
@ -25,7 +25,8 @@ export const IdentityJwtAuthsSchema = z.object({
|
|||||||
boundClaims: z.unknown(),
|
boundClaims: z.unknown(),
|
||||||
boundSubject: z.string(),
|
boundSubject: z.string(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date()
|
updatedAt: z.date(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityJwtAuths = z.infer<typeof IdentityJwtAuthsSchema>;
|
export type TIdentityJwtAuths = z.infer<typeof IdentityJwtAuthsSchema>;
|
||||||
|
@ -18,7 +18,7 @@ export const IdentityKubernetesAuthsSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
identityId: z.string().uuid(),
|
identityId: z.string().uuid(),
|
||||||
kubernetesHost: z.string(),
|
kubernetesHost: z.string().nullable().optional(),
|
||||||
encryptedCaCert: z.string().nullable().optional(),
|
encryptedCaCert: z.string().nullable().optional(),
|
||||||
caCertIV: z.string().nullable().optional(),
|
caCertIV: z.string().nullable().optional(),
|
||||||
caCertTag: z.string().nullable().optional(),
|
caCertTag: z.string().nullable().optional(),
|
||||||
@ -30,7 +30,9 @@ export const IdentityKubernetesAuthsSchema = z.object({
|
|||||||
allowedAudience: z.string(),
|
allowedAudience: z.string(),
|
||||||
encryptedKubernetesTokenReviewerJwt: zodBuffer.nullable().optional(),
|
encryptedKubernetesTokenReviewerJwt: zodBuffer.nullable().optional(),
|
||||||
encryptedKubernetesCaCertificate: zodBuffer.nullable().optional(),
|
encryptedKubernetesCaCertificate: zodBuffer.nullable().optional(),
|
||||||
gatewayId: z.string().uuid().nullable().optional()
|
gatewayId: z.string().uuid().nullable().optional(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0),
|
||||||
|
tokenReviewMode: z.string().default("api")
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityKubernetesAuths = z.infer<typeof IdentityKubernetesAuthsSchema>;
|
export type TIdentityKubernetesAuths = z.infer<typeof IdentityKubernetesAuthsSchema>;
|
||||||
|
@ -24,7 +24,8 @@ export const IdentityLdapAuthsSchema = z.object({
|
|||||||
searchFilter: z.string(),
|
searchFilter: z.string(),
|
||||||
allowedFields: z.unknown().nullable().optional(),
|
allowedFields: z.unknown().nullable().optional(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date()
|
updatedAt: z.date(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityLdapAuths = z.infer<typeof IdentityLdapAuthsSchema>;
|
export type TIdentityLdapAuths = z.infer<typeof IdentityLdapAuthsSchema>;
|
||||||
|
@ -18,7 +18,8 @@ export const IdentityOciAuthsSchema = z.object({
|
|||||||
identityId: z.string().uuid(),
|
identityId: z.string().uuid(),
|
||||||
type: z.string(),
|
type: z.string(),
|
||||||
tenancyOcid: z.string(),
|
tenancyOcid: z.string(),
|
||||||
allowedUsernames: z.string().nullable().optional()
|
allowedUsernames: z.string().nullable().optional(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityOciAuths = z.infer<typeof IdentityOciAuthsSchema>;
|
export type TIdentityOciAuths = z.infer<typeof IdentityOciAuthsSchema>;
|
||||||
|
@ -27,7 +27,8 @@ export const IdentityOidcAuthsSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
encryptedCaCertificate: zodBuffer.nullable().optional(),
|
encryptedCaCertificate: zodBuffer.nullable().optional(),
|
||||||
claimMetadataMapping: z.unknown().nullable().optional()
|
claimMetadataMapping: z.unknown().nullable().optional(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityOidcAuths = z.infer<typeof IdentityOidcAuthsSchema>;
|
export type TIdentityOidcAuths = z.infer<typeof IdentityOidcAuthsSchema>;
|
||||||
|
27
backend/src/db/schemas/identity-tls-cert-auths.ts
Normal file
27
backend/src/db/schemas/identity-tls-cert-auths.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { zodBuffer } from "@app/lib/zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const IdentityTlsCertAuthsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
accessTokenTTL: z.coerce.number().default(7200),
|
||||||
|
accessTokenMaxTTL: z.coerce.number().default(7200),
|
||||||
|
accessTokenNumUsesLimit: z.coerce.number().default(0),
|
||||||
|
accessTokenTrustedIps: z.unknown(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date(),
|
||||||
|
identityId: z.string().uuid(),
|
||||||
|
allowedCommonNames: z.string().nullable().optional(),
|
||||||
|
encryptedCaCertificate: zodBuffer
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TIdentityTlsCertAuths = z.infer<typeof IdentityTlsCertAuthsSchema>;
|
||||||
|
export type TIdentityTlsCertAuthsInsert = Omit<z.input<typeof IdentityTlsCertAuthsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TIdentityTlsCertAuthsUpdate = Partial<Omit<z.input<typeof IdentityTlsCertAuthsSchema>, TImmutableDBKeys>>;
|
@ -15,7 +15,8 @@ export const IdentityTokenAuthsSchema = z.object({
|
|||||||
accessTokenTrustedIps: z.unknown(),
|
accessTokenTrustedIps: z.unknown(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
identityId: z.string().uuid()
|
identityId: z.string().uuid(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityTokenAuths = z.infer<typeof IdentityTokenAuthsSchema>;
|
export type TIdentityTokenAuths = z.infer<typeof IdentityTokenAuthsSchema>;
|
||||||
|
@ -17,7 +17,8 @@ export const IdentityUniversalAuthsSchema = z.object({
|
|||||||
accessTokenTrustedIps: z.unknown(),
|
accessTokenTrustedIps: z.unknown(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
identityId: z.string().uuid()
|
identityId: z.string().uuid(),
|
||||||
|
accessTokenPeriod: z.coerce.number().default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TIdentityUniversalAuths = z.infer<typeof IdentityUniversalAuthsSchema>;
|
export type TIdentityUniversalAuths = z.infer<typeof IdentityUniversalAuthsSchema>;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
export * from "./access-approval-policies";
|
export * from "./access-approval-policies";
|
||||||
export * from "./access-approval-policies-approvers";
|
export * from "./access-approval-policies-approvers";
|
||||||
|
export * from "./access-approval-policies-bypassers";
|
||||||
export * from "./access-approval-requests";
|
export * from "./access-approval-requests";
|
||||||
export * from "./access-approval-requests-reviewers";
|
export * from "./access-approval-requests-reviewers";
|
||||||
export * from "./api-keys";
|
export * from "./api-keys";
|
||||||
@ -20,8 +21,15 @@ export * from "./certificate-templates";
|
|||||||
export * from "./certificates";
|
export * from "./certificates";
|
||||||
export * from "./dynamic-secret-leases";
|
export * from "./dynamic-secret-leases";
|
||||||
export * from "./dynamic-secrets";
|
export * from "./dynamic-secrets";
|
||||||
|
export * from "./external-certificate-authorities";
|
||||||
export * from "./external-group-org-role-mappings";
|
export * from "./external-group-org-role-mappings";
|
||||||
export * from "./external-kms";
|
export * from "./external-kms";
|
||||||
|
export * from "./folder-checkpoint-resources";
|
||||||
|
export * from "./folder-checkpoints";
|
||||||
|
export * from "./folder-commit-changes";
|
||||||
|
export * from "./folder-commits";
|
||||||
|
export * from "./folder-tree-checkpoint-resources";
|
||||||
|
export * from "./folder-tree-checkpoints";
|
||||||
export * from "./gateways";
|
export * from "./gateways";
|
||||||
export * from "./git-app-install-sessions";
|
export * from "./git-app-install-sessions";
|
||||||
export * from "./git-app-org";
|
export * from "./git-app-org";
|
||||||
@ -31,6 +39,7 @@ export * from "./group-project-memberships";
|
|||||||
export * from "./groups";
|
export * from "./groups";
|
||||||
export * from "./identities";
|
export * from "./identities";
|
||||||
export * from "./identity-access-tokens";
|
export * from "./identity-access-tokens";
|
||||||
|
export * from "./identity-alicloud-auths";
|
||||||
export * from "./identity-aws-auths";
|
export * from "./identity-aws-auths";
|
||||||
export * from "./identity-azure-auths";
|
export * from "./identity-azure-auths";
|
||||||
export * from "./identity-gcp-auths";
|
export * from "./identity-gcp-auths";
|
||||||
@ -43,12 +52,14 @@ export * from "./identity-org-memberships";
|
|||||||
export * from "./identity-project-additional-privilege";
|
export * from "./identity-project-additional-privilege";
|
||||||
export * from "./identity-project-membership-role";
|
export * from "./identity-project-membership-role";
|
||||||
export * from "./identity-project-memberships";
|
export * from "./identity-project-memberships";
|
||||||
|
export * from "./identity-tls-cert-auths";
|
||||||
export * from "./identity-token-auths";
|
export * from "./identity-token-auths";
|
||||||
export * from "./identity-ua-client-secrets";
|
export * from "./identity-ua-client-secrets";
|
||||||
export * from "./identity-universal-auths";
|
export * from "./identity-universal-auths";
|
||||||
export * from "./incident-contacts";
|
export * from "./incident-contacts";
|
||||||
export * from "./integration-auths";
|
export * from "./integration-auths";
|
||||||
export * from "./integrations";
|
export * from "./integrations";
|
||||||
|
export * from "./internal-certificate-authorities";
|
||||||
export * from "./internal-kms";
|
export * from "./internal-kms";
|
||||||
export * from "./kmip-client-certificates";
|
export * from "./kmip-client-certificates";
|
||||||
export * from "./kmip-clients";
|
export * from "./kmip-clients";
|
||||||
@ -90,6 +101,7 @@ export * from "./saml-configs";
|
|||||||
export * from "./scim-tokens";
|
export * from "./scim-tokens";
|
||||||
export * from "./secret-approval-policies";
|
export * from "./secret-approval-policies";
|
||||||
export * from "./secret-approval-policies-approvers";
|
export * from "./secret-approval-policies-approvers";
|
||||||
|
export * from "./secret-approval-policies-bypassers";
|
||||||
export * from "./secret-approval-request-secret-tags";
|
export * from "./secret-approval-request-secret-tags";
|
||||||
export * from "./secret-approval-request-secret-tags-v2";
|
export * from "./secret-approval-request-secret-tags-v2";
|
||||||
export * from "./secret-approval-requests";
|
export * from "./secret-approval-requests";
|
||||||
@ -107,7 +119,12 @@ export * from "./secret-rotation-outputs";
|
|||||||
export * from "./secret-rotation-v2-secret-mappings";
|
export * from "./secret-rotation-v2-secret-mappings";
|
||||||
export * from "./secret-rotations";
|
export * from "./secret-rotations";
|
||||||
export * from "./secret-rotations-v2";
|
export * from "./secret-rotations-v2";
|
||||||
|
export * from "./secret-scanning-configs";
|
||||||
|
export * from "./secret-scanning-data-sources";
|
||||||
|
export * from "./secret-scanning-findings";
|
||||||
export * from "./secret-scanning-git-risks";
|
export * from "./secret-scanning-git-risks";
|
||||||
|
export * from "./secret-scanning-resources";
|
||||||
|
export * from "./secret-scanning-scans";
|
||||||
export * from "./secret-sharing";
|
export * from "./secret-sharing";
|
||||||
export * from "./secret-snapshot-folders";
|
export * from "./secret-snapshot-folders";
|
||||||
export * from "./secret-snapshot-secrets";
|
export * from "./secret-snapshot-secrets";
|
||||||
|
38
backend/src/db/schemas/internal-certificate-authorities.ts
Normal file
38
backend/src/db/schemas/internal-certificate-authorities.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const InternalCertificateAuthoritiesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
parentCaId: z.string().uuid().nullable().optional(),
|
||||||
|
type: z.string(),
|
||||||
|
friendlyName: z.string(),
|
||||||
|
organization: z.string(),
|
||||||
|
ou: z.string(),
|
||||||
|
country: z.string(),
|
||||||
|
province: z.string(),
|
||||||
|
locality: z.string(),
|
||||||
|
commonName: z.string(),
|
||||||
|
dn: z.string(),
|
||||||
|
serialNumber: z.string().nullable().optional(),
|
||||||
|
maxPathLength: z.number().nullable().optional(),
|
||||||
|
keyAlgorithm: z.string(),
|
||||||
|
notBefore: z.date().nullable().optional(),
|
||||||
|
notAfter: z.date().nullable().optional(),
|
||||||
|
activeCaCertId: z.string().uuid().nullable().optional(),
|
||||||
|
caId: z.string().uuid()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TInternalCertificateAuthorities = z.infer<typeof InternalCertificateAuthoritiesSchema>;
|
||||||
|
export type TInternalCertificateAuthoritiesInsert = Omit<
|
||||||
|
z.input<typeof InternalCertificateAuthoritiesSchema>,
|
||||||
|
TImmutableDBKeys
|
||||||
|
>;
|
||||||
|
export type TInternalCertificateAuthoritiesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof InternalCertificateAuthoritiesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
@ -13,6 +13,8 @@ export enum TableName {
|
|||||||
SshCertificate = "ssh_certificates",
|
SshCertificate = "ssh_certificates",
|
||||||
SshCertificateBody = "ssh_certificate_bodies",
|
SshCertificateBody = "ssh_certificate_bodies",
|
||||||
CertificateAuthority = "certificate_authorities",
|
CertificateAuthority = "certificate_authorities",
|
||||||
|
ExternalCertificateAuthority = "external_certificate_authorities",
|
||||||
|
InternalCertificateAuthority = "internal_certificate_authorities",
|
||||||
CertificateTemplateEstConfig = "certificate_template_est_configs",
|
CertificateTemplateEstConfig = "certificate_template_est_configs",
|
||||||
CertificateAuthorityCert = "certificate_authority_certs",
|
CertificateAuthorityCert = "certificate_authority_certs",
|
||||||
CertificateAuthoritySecret = "certificate_authority_secret",
|
CertificateAuthoritySecret = "certificate_authority_secret",
|
||||||
@ -78,11 +80,13 @@ export enum TableName {
|
|||||||
IdentityGcpAuth = "identity_gcp_auths",
|
IdentityGcpAuth = "identity_gcp_auths",
|
||||||
IdentityAzureAuth = "identity_azure_auths",
|
IdentityAzureAuth = "identity_azure_auths",
|
||||||
IdentityUaClientSecret = "identity_ua_client_secrets",
|
IdentityUaClientSecret = "identity_ua_client_secrets",
|
||||||
|
IdentityAliCloudAuth = "identity_alicloud_auths",
|
||||||
IdentityAwsAuth = "identity_aws_auths",
|
IdentityAwsAuth = "identity_aws_auths",
|
||||||
IdentityOciAuth = "identity_oci_auths",
|
IdentityOciAuth = "identity_oci_auths",
|
||||||
IdentityOidcAuth = "identity_oidc_auths",
|
IdentityOidcAuth = "identity_oidc_auths",
|
||||||
IdentityJwtAuth = "identity_jwt_auths",
|
IdentityJwtAuth = "identity_jwt_auths",
|
||||||
IdentityLdapAuth = "identity_ldap_auths",
|
IdentityLdapAuth = "identity_ldap_auths",
|
||||||
|
IdentityTlsCertAuth = "identity_tls_cert_auths",
|
||||||
IdentityOrgMembership = "identity_org_memberships",
|
IdentityOrgMembership = "identity_org_memberships",
|
||||||
IdentityProjectMembership = "identity_project_memberships",
|
IdentityProjectMembership = "identity_project_memberships",
|
||||||
IdentityProjectMembershipRole = "identity_project_membership_role",
|
IdentityProjectMembershipRole = "identity_project_membership_role",
|
||||||
@ -93,10 +97,12 @@ export enum TableName {
|
|||||||
ScimToken = "scim_tokens",
|
ScimToken = "scim_tokens",
|
||||||
AccessApprovalPolicy = "access_approval_policies",
|
AccessApprovalPolicy = "access_approval_policies",
|
||||||
AccessApprovalPolicyApprover = "access_approval_policies_approvers",
|
AccessApprovalPolicyApprover = "access_approval_policies_approvers",
|
||||||
|
AccessApprovalPolicyBypasser = "access_approval_policies_bypassers",
|
||||||
AccessApprovalRequest = "access_approval_requests",
|
AccessApprovalRequest = "access_approval_requests",
|
||||||
AccessApprovalRequestReviewer = "access_approval_requests_reviewers",
|
AccessApprovalRequestReviewer = "access_approval_requests_reviewers",
|
||||||
SecretApprovalPolicy = "secret_approval_policies",
|
SecretApprovalPolicy = "secret_approval_policies",
|
||||||
SecretApprovalPolicyApprover = "secret_approval_policies_approvers",
|
SecretApprovalPolicyApprover = "secret_approval_policies_approvers",
|
||||||
|
SecretApprovalPolicyBypasser = "secret_approval_policies_bypassers",
|
||||||
SecretApprovalRequest = "secret_approval_requests",
|
SecretApprovalRequest = "secret_approval_requests",
|
||||||
SecretApprovalRequestReviewer = "secret_approval_requests_reviewers",
|
SecretApprovalRequestReviewer = "secret_approval_requests_reviewers",
|
||||||
SecretApprovalRequestSecret = "secret_approval_requests_secrets",
|
SecretApprovalRequestSecret = "secret_approval_requests_secrets",
|
||||||
@ -155,10 +161,21 @@ export enum TableName {
|
|||||||
MicrosoftTeamsIntegrations = "microsoft_teams_integrations",
|
MicrosoftTeamsIntegrations = "microsoft_teams_integrations",
|
||||||
ProjectMicrosoftTeamsConfigs = "project_microsoft_teams_configs",
|
ProjectMicrosoftTeamsConfigs = "project_microsoft_teams_configs",
|
||||||
SecretReminderRecipients = "secret_reminder_recipients",
|
SecretReminderRecipients = "secret_reminder_recipients",
|
||||||
GithubOrgSyncConfig = "github_org_sync_configs"
|
GithubOrgSyncConfig = "github_org_sync_configs",
|
||||||
|
FolderCommit = "folder_commits",
|
||||||
|
FolderCommitChanges = "folder_commit_changes",
|
||||||
|
FolderCheckpoint = "folder_checkpoints",
|
||||||
|
FolderCheckpointResources = "folder_checkpoint_resources",
|
||||||
|
FolderTreeCheckpoint = "folder_tree_checkpoints",
|
||||||
|
FolderTreeCheckpointResources = "folder_tree_checkpoint_resources",
|
||||||
|
SecretScanningDataSource = "secret_scanning_data_sources",
|
||||||
|
SecretScanningResource = "secret_scanning_resources",
|
||||||
|
SecretScanningScan = "secret_scanning_scans",
|
||||||
|
SecretScanningFinding = "secret_scanning_findings",
|
||||||
|
SecretScanningConfig = "secret_scanning_configs"
|
||||||
}
|
}
|
||||||
|
|
||||||
export type TImmutableDBKeys = "id" | "createdAt" | "updatedAt";
|
export type TImmutableDBKeys = "id" | "createdAt" | "updatedAt" | "commitId";
|
||||||
|
|
||||||
export const UserDeviceSchema = z
|
export const UserDeviceSchema = z
|
||||||
.object({
|
.object({
|
||||||
@ -232,8 +249,10 @@ export enum IdentityAuthMethod {
|
|||||||
UNIVERSAL_AUTH = "universal-auth",
|
UNIVERSAL_AUTH = "universal-auth",
|
||||||
KUBERNETES_AUTH = "kubernetes-auth",
|
KUBERNETES_AUTH = "kubernetes-auth",
|
||||||
GCP_AUTH = "gcp-auth",
|
GCP_AUTH = "gcp-auth",
|
||||||
|
ALICLOUD_AUTH = "alicloud-auth",
|
||||||
AWS_AUTH = "aws-auth",
|
AWS_AUTH = "aws-auth",
|
||||||
AZURE_AUTH = "azure-auth",
|
AZURE_AUTH = "azure-auth",
|
||||||
|
TLS_CERT_AUTH = "tls-cert-auth",
|
||||||
OCI_AUTH = "oci-auth",
|
OCI_AUTH = "oci-auth",
|
||||||
OIDC_AUTH = "oidc-auth",
|
OIDC_AUTH = "oidc-auth",
|
||||||
JWT_AUTH = "jwt-auth",
|
JWT_AUTH = "jwt-auth",
|
||||||
@ -244,16 +263,8 @@ export enum ProjectType {
|
|||||||
SecretManager = "secret-manager",
|
SecretManager = "secret-manager",
|
||||||
CertificateManager = "cert-manager",
|
CertificateManager = "cert-manager",
|
||||||
KMS = "kms",
|
KMS = "kms",
|
||||||
SSH = "ssh"
|
SSH = "ssh",
|
||||||
}
|
SecretScanning = "secret-scanning"
|
||||||
|
|
||||||
export enum ActionProjectType {
|
|
||||||
SecretManager = ProjectType.SecretManager,
|
|
||||||
CertificateManager = ProjectType.CertificateManager,
|
|
||||||
KMS = ProjectType.KMS,
|
|
||||||
SSH = ProjectType.SSH,
|
|
||||||
// project operations that happen on all types
|
|
||||||
Any = "any"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SortDirection {
|
export enum SortDirection {
|
||||||
|
@ -18,7 +18,8 @@ export const OrgMembershipsSchema = z.object({
|
|||||||
orgId: z.string().uuid(),
|
orgId: z.string().uuid(),
|
||||||
roleId: z.string().uuid().nullable().optional(),
|
roleId: z.string().uuid().nullable().optional(),
|
||||||
projectFavorites: z.string().array().nullable().optional(),
|
projectFavorites: z.string().array().nullable().optional(),
|
||||||
isActive: z.boolean().default(true)
|
isActive: z.boolean().default(true),
|
||||||
|
lastInvitedAt: z.date().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TOrgMemberships = z.infer<typeof OrgMembershipsSchema>;
|
export type TOrgMemberships = z.infer<typeof OrgMembershipsSchema>;
|
||||||
|
@ -16,10 +16,16 @@ export const PkiSubscribersSchema = z.object({
|
|||||||
name: z.string(),
|
name: z.string(),
|
||||||
commonName: z.string(),
|
commonName: z.string(),
|
||||||
subjectAlternativeNames: z.string().array(),
|
subjectAlternativeNames: z.string().array(),
|
||||||
ttl: z.string(),
|
ttl: z.string().nullable().optional(),
|
||||||
keyUsages: z.string().array(),
|
keyUsages: z.string().array(),
|
||||||
extendedKeyUsages: z.string().array(),
|
extendedKeyUsages: z.string().array(),
|
||||||
status: z.string()
|
status: z.string(),
|
||||||
|
enableAutoRenewal: z.boolean().default(false),
|
||||||
|
autoRenewalPeriodInDays: z.number().nullable().optional(),
|
||||||
|
lastAutoRenewAt: z.date().nullable().optional(),
|
||||||
|
lastOperationStatus: z.string().nullable().optional(),
|
||||||
|
lastOperationMessage: z.string().nullable().optional(),
|
||||||
|
lastOperationAt: z.date().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TPkiSubscribers = z.infer<typeof PkiSubscribersSchema>;
|
export type TPkiSubscribers = z.infer<typeof PkiSubscribersSchema>;
|
||||||
|
@ -16,7 +16,7 @@ export const ProjectTemplatesSchema = z.object({
|
|||||||
orgId: z.string().uuid(),
|
orgId: z.string().uuid(),
|
||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
type: z.string().default("secret-manager")
|
type: z.string().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TProjectTemplates = z.infer<typeof ProjectTemplatesSchema>;
|
export type TProjectTemplates = z.infer<typeof ProjectTemplatesSchema>;
|
||||||
|
@ -25,10 +25,12 @@ export const ProjectsSchema = z.object({
|
|||||||
kmsSecretManagerKeyId: z.string().uuid().nullable().optional(),
|
kmsSecretManagerKeyId: z.string().uuid().nullable().optional(),
|
||||||
kmsSecretManagerEncryptedDataKey: zodBuffer.nullable().optional(),
|
kmsSecretManagerEncryptedDataKey: zodBuffer.nullable().optional(),
|
||||||
description: z.string().nullable().optional(),
|
description: z.string().nullable().optional(),
|
||||||
type: z.string(),
|
type: z.string().nullable().optional(),
|
||||||
enforceCapitalization: z.boolean().default(false),
|
enforceCapitalization: z.boolean().default(false),
|
||||||
hasDeleteProtection: z.boolean().default(false).nullable().optional(),
|
hasDeleteProtection: z.boolean().default(false).nullable().optional(),
|
||||||
secretSharing: z.boolean().default(true)
|
secretSharing: z.boolean().default(true),
|
||||||
|
showSnapshotsLegacy: z.boolean().default(false),
|
||||||
|
defaultProduct: z.string().default("secret-manager")
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TProjects = z.infer<typeof ProjectsSchema>;
|
export type TProjects = z.infer<typeof ProjectsSchema>;
|
||||||
|
26
backend/src/db/schemas/secret-approval-policies-bypassers.ts
Normal file
26
backend/src/db/schemas/secret-approval-policies-bypassers.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretApprovalPoliciesBypassersSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
bypasserGroupId: z.string().uuid().nullable().optional(),
|
||||||
|
bypasserUserId: z.string().uuid().nullable().optional(),
|
||||||
|
policyId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretApprovalPoliciesBypassers = z.infer<typeof SecretApprovalPoliciesBypassersSchema>;
|
||||||
|
export type TSecretApprovalPoliciesBypassersInsert = Omit<
|
||||||
|
z.input<typeof SecretApprovalPoliciesBypassersSchema>,
|
||||||
|
TImmutableDBKeys
|
||||||
|
>;
|
||||||
|
export type TSecretApprovalPoliciesBypassersUpdate = Partial<
|
||||||
|
Omit<z.input<typeof SecretApprovalPoliciesBypassersSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
@ -14,7 +14,8 @@ export const SecretFolderVersionsSchema = z.object({
|
|||||||
createdAt: z.date(),
|
createdAt: z.date(),
|
||||||
updatedAt: z.date(),
|
updatedAt: z.date(),
|
||||||
envId: z.string().uuid(),
|
envId: z.string().uuid(),
|
||||||
folderId: z.string().uuid()
|
folderId: z.string().uuid(),
|
||||||
|
description: z.string().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TSecretFolderVersions = z.infer<typeof SecretFolderVersionsSchema>;
|
export type TSecretFolderVersions = z.infer<typeof SecretFolderVersionsSchema>;
|
||||||
|
20
backend/src/db/schemas/secret-scanning-configs.ts
Normal file
20
backend/src/db/schemas/secret-scanning-configs.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretScanningConfigsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
projectId: z.string(),
|
||||||
|
content: z.string().nullable().optional(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretScanningConfigs = z.infer<typeof SecretScanningConfigsSchema>;
|
||||||
|
export type TSecretScanningConfigsInsert = Omit<z.input<typeof SecretScanningConfigsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TSecretScanningConfigsUpdate = Partial<Omit<z.input<typeof SecretScanningConfigsSchema>, TImmutableDBKeys>>;
|
32
backend/src/db/schemas/secret-scanning-data-sources.ts
Normal file
32
backend/src/db/schemas/secret-scanning-data-sources.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { zodBuffer } from "@app/lib/zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretScanningDataSourcesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
externalId: z.string().nullable().optional(),
|
||||||
|
name: z.string(),
|
||||||
|
description: z.string().nullable().optional(),
|
||||||
|
type: z.string(),
|
||||||
|
config: z.unknown(),
|
||||||
|
encryptedCredentials: zodBuffer.nullable().optional(),
|
||||||
|
connectionId: z.string().uuid().nullable().optional(),
|
||||||
|
isAutoScanEnabled: z.boolean().default(true).nullable().optional(),
|
||||||
|
projectId: z.string(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date(),
|
||||||
|
isDisconnected: z.boolean().default(false)
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretScanningDataSources = z.infer<typeof SecretScanningDataSourcesSchema>;
|
||||||
|
export type TSecretScanningDataSourcesInsert = Omit<z.input<typeof SecretScanningDataSourcesSchema>, TImmutableDBKeys>;
|
||||||
|
export type TSecretScanningDataSourcesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof SecretScanningDataSourcesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
32
backend/src/db/schemas/secret-scanning-findings.ts
Normal file
32
backend/src/db/schemas/secret-scanning-findings.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretScanningFindingsSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
dataSourceName: z.string(),
|
||||||
|
dataSourceType: z.string(),
|
||||||
|
resourceName: z.string(),
|
||||||
|
resourceType: z.string(),
|
||||||
|
rule: z.string(),
|
||||||
|
severity: z.string(),
|
||||||
|
status: z.string().default("unresolved"),
|
||||||
|
remarks: z.string().nullable().optional(),
|
||||||
|
fingerprint: z.string(),
|
||||||
|
details: z.unknown(),
|
||||||
|
projectId: z.string(),
|
||||||
|
scanId: z.string().uuid().nullable().optional(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretScanningFindings = z.infer<typeof SecretScanningFindingsSchema>;
|
||||||
|
export type TSecretScanningFindingsInsert = Omit<z.input<typeof SecretScanningFindingsSchema>, TImmutableDBKeys>;
|
||||||
|
export type TSecretScanningFindingsUpdate = Partial<
|
||||||
|
Omit<z.input<typeof SecretScanningFindingsSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
24
backend/src/db/schemas/secret-scanning-resources.ts
Normal file
24
backend/src/db/schemas/secret-scanning-resources.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretScanningResourcesSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
externalId: z.string(),
|
||||||
|
name: z.string(),
|
||||||
|
type: z.string(),
|
||||||
|
dataSourceId: z.string().uuid(),
|
||||||
|
createdAt: z.date(),
|
||||||
|
updatedAt: z.date()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretScanningResources = z.infer<typeof SecretScanningResourcesSchema>;
|
||||||
|
export type TSecretScanningResourcesInsert = Omit<z.input<typeof SecretScanningResourcesSchema>, TImmutableDBKeys>;
|
||||||
|
export type TSecretScanningResourcesUpdate = Partial<
|
||||||
|
Omit<z.input<typeof SecretScanningResourcesSchema>, TImmutableDBKeys>
|
||||||
|
>;
|
21
backend/src/db/schemas/secret-scanning-scans.ts
Normal file
21
backend/src/db/schemas/secret-scanning-scans.ts
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Code generated by automation script, DO NOT EDIT.
|
||||||
|
// Automated by pulling database and generating zod schema
|
||||||
|
// To update. Just run npm run generate:schema
|
||||||
|
// Written by akhilmhdh.
|
||||||
|
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { TImmutableDBKeys } from "./models";
|
||||||
|
|
||||||
|
export const SecretScanningScansSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
status: z.string().default("queued"),
|
||||||
|
statusMessage: z.string().nullable().optional(),
|
||||||
|
type: z.string(),
|
||||||
|
resourceId: z.string().uuid(),
|
||||||
|
createdAt: z.date().nullable().optional()
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSecretScanningScans = z.infer<typeof SecretScanningScansSchema>;
|
||||||
|
export type TSecretScanningScansInsert = Omit<z.input<typeof SecretScanningScansSchema>, TImmutableDBKeys>;
|
||||||
|
export type TSecretScanningScansUpdate = Partial<Omit<z.input<typeof SecretScanningScansSchema>, TImmutableDBKeys>>;
|
@ -28,7 +28,6 @@ export const SecretSharingSchema = z.object({
|
|||||||
encryptedSecret: zodBuffer.nullable().optional(),
|
encryptedSecret: zodBuffer.nullable().optional(),
|
||||||
identifier: z.string().nullable().optional(),
|
identifier: z.string().nullable().optional(),
|
||||||
type: z.string().default("share"),
|
type: z.string().default("share"),
|
||||||
encryptedSalt: zodBuffer.nullable().optional(),
|
|
||||||
authorizedEmails: z.unknown().nullable().optional()
|
authorizedEmails: z.unknown().nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -29,7 +29,13 @@ export const SuperAdminSchema = z.object({
|
|||||||
adminIdentityIds: z.string().array().nullable().optional(),
|
adminIdentityIds: z.string().array().nullable().optional(),
|
||||||
encryptedMicrosoftTeamsAppId: zodBuffer.nullable().optional(),
|
encryptedMicrosoftTeamsAppId: zodBuffer.nullable().optional(),
|
||||||
encryptedMicrosoftTeamsClientSecret: zodBuffer.nullable().optional(),
|
encryptedMicrosoftTeamsClientSecret: zodBuffer.nullable().optional(),
|
||||||
encryptedMicrosoftTeamsBotId: zodBuffer.nullable().optional()
|
encryptedMicrosoftTeamsBotId: zodBuffer.nullable().optional(),
|
||||||
|
encryptedGitHubAppConnectionClientId: zodBuffer.nullable().optional(),
|
||||||
|
encryptedGitHubAppConnectionClientSecret: zodBuffer.nullable().optional(),
|
||||||
|
encryptedGitHubAppConnectionSlug: zodBuffer.nullable().optional(),
|
||||||
|
encryptedGitHubAppConnectionId: zodBuffer.nullable().optional(),
|
||||||
|
encryptedGitHubAppConnectionPrivateKey: zodBuffer.nullable().optional(),
|
||||||
|
encryptedEnvOverrides: zodBuffer.nullable().optional()
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TSuperAdmin = z.infer<typeof SuperAdminSchema>;
|
export type TSuperAdmin = z.infer<typeof SuperAdminSchema>;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
import { ApproverType } from "@app/ee/services/access-approval-policy/access-approval-policy-types";
|
import { ApproverType, BypasserType } from "@app/ee/services/access-approval-policy/access-approval-policy-types";
|
||||||
import { EnforcementLevel } from "@app/lib/types";
|
import { EnforcementLevel } from "@app/lib/types";
|
||||||
import { readLimit, writeLimit } from "@app/server/config/rateLimiter";
|
import { readLimit, writeLimit } from "@app/server/config/rateLimiter";
|
||||||
import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
|
import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
|
||||||
@ -23,11 +23,41 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
|
|||||||
environment: z.string(),
|
environment: z.string(),
|
||||||
approvers: z
|
approvers: z
|
||||||
.discriminatedUnion("type", [
|
.discriminatedUnion("type", [
|
||||||
z.object({ type: z.literal(ApproverType.Group), id: z.string() }),
|
z.object({
|
||||||
z.object({ type: z.literal(ApproverType.User), id: z.string().optional(), name: z.string().optional() })
|
type: z.literal(ApproverType.Group),
|
||||||
|
id: z.string(),
|
||||||
|
sequence: z.number().int().default(1)
|
||||||
|
}),
|
||||||
|
z.object({
|
||||||
|
type: z.literal(ApproverType.User),
|
||||||
|
id: z.string().optional(),
|
||||||
|
username: z.string().optional(),
|
||||||
|
sequence: z.number().int().default(1)
|
||||||
|
})
|
||||||
])
|
])
|
||||||
.array()
|
.array()
|
||||||
.min(1, { message: "At least one approver should be provided" }),
|
.max(100, "Cannot have more than 100 approvers")
|
||||||
|
.min(1, { message: "At least one approver should be provided" })
|
||||||
|
.refine(
|
||||||
|
// @ts-expect-error this is ok
|
||||||
|
(el) => el.every((i) => Boolean(i?.id) || Boolean(i?.username)),
|
||||||
|
"Must provide either username or id"
|
||||||
|
),
|
||||||
|
bypassers: z
|
||||||
|
.discriminatedUnion("type", [
|
||||||
|
z.object({ type: z.literal(BypasserType.Group), id: z.string() }),
|
||||||
|
z.object({ type: z.literal(BypasserType.User), id: z.string().optional(), username: z.string().optional() })
|
||||||
|
])
|
||||||
|
.array()
|
||||||
|
.max(100, "Cannot have more than 100 bypassers")
|
||||||
|
.optional(),
|
||||||
|
approvalsRequired: z
|
||||||
|
.object({
|
||||||
|
numberOfApprovals: z.number().int(),
|
||||||
|
stepNumber: z.number().int()
|
||||||
|
})
|
||||||
|
.array()
|
||||||
|
.optional(),
|
||||||
approvals: z.number().min(1).default(1),
|
approvals: z.number().min(1).default(1),
|
||||||
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
|
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
|
||||||
allowedSelfApprovals: z.boolean().default(true)
|
allowedSelfApprovals: z.boolean().default(true)
|
||||||
@ -69,10 +99,16 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
|
|||||||
approvals: sapPubSchema
|
approvals: sapPubSchema
|
||||||
.extend({
|
.extend({
|
||||||
approvers: z
|
approvers: z
|
||||||
.object({ type: z.nativeEnum(ApproverType), id: z.string().nullable().optional() })
|
.object({
|
||||||
|
type: z.nativeEnum(ApproverType),
|
||||||
|
id: z.string().nullable().optional(),
|
||||||
|
sequence: z.number().nullable().optional(),
|
||||||
|
approvalsRequired: z.number().nullable().optional()
|
||||||
|
})
|
||||||
.array()
|
.array()
|
||||||
.nullable()
|
.nullable()
|
||||||
.optional()
|
.optional(),
|
||||||
|
bypassers: z.object({ type: z.nativeEnum(BypasserType), id: z.string().nullable().optional() }).array()
|
||||||
})
|
})
|
||||||
.array()
|
.array()
|
||||||
.nullable()
|
.nullable()
|
||||||
@ -142,14 +178,44 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
|
|||||||
.transform((val) => (val === "" ? "/" : val)),
|
.transform((val) => (val === "" ? "/" : val)),
|
||||||
approvers: z
|
approvers: z
|
||||||
.discriminatedUnion("type", [
|
.discriminatedUnion("type", [
|
||||||
z.object({ type: z.literal(ApproverType.Group), id: z.string() }),
|
z.object({
|
||||||
z.object({ type: z.literal(ApproverType.User), id: z.string().optional(), name: z.string().optional() })
|
type: z.literal(ApproverType.Group),
|
||||||
|
id: z.string(),
|
||||||
|
sequence: z.number().int().default(1)
|
||||||
|
}),
|
||||||
|
z.object({
|
||||||
|
type: z.literal(ApproverType.User),
|
||||||
|
id: z.string().optional(),
|
||||||
|
username: z.string().optional(),
|
||||||
|
sequence: z.number().int().default(1)
|
||||||
|
})
|
||||||
])
|
])
|
||||||
.array()
|
.array()
|
||||||
.min(1, { message: "At least one approver should be provided" }),
|
.min(1, { message: "At least one approver should be provided" })
|
||||||
|
.max(100, "Cannot have more than 100 approvers")
|
||||||
|
.refine(
|
||||||
|
// @ts-expect-error this is ok
|
||||||
|
(el) => el.every((i) => Boolean(i?.id) || Boolean(i?.username)),
|
||||||
|
"Must provide either username or id"
|
||||||
|
),
|
||||||
|
bypassers: z
|
||||||
|
.discriminatedUnion("type", [
|
||||||
|
z.object({ type: z.literal(BypasserType.Group), id: z.string() }),
|
||||||
|
z.object({ type: z.literal(BypasserType.User), id: z.string().optional(), username: z.string().optional() })
|
||||||
|
])
|
||||||
|
.array()
|
||||||
|
.max(100, "Cannot have more than 100 bypassers")
|
||||||
|
.optional(),
|
||||||
approvals: z.number().min(1).optional(),
|
approvals: z.number().min(1).optional(),
|
||||||
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
|
enforcementLevel: z.nativeEnum(EnforcementLevel).default(EnforcementLevel.Hard),
|
||||||
allowedSelfApprovals: z.boolean().default(true)
|
allowedSelfApprovals: z.boolean().default(true),
|
||||||
|
approvalsRequired: z
|
||||||
|
.object({
|
||||||
|
numberOfApprovals: z.number().int(),
|
||||||
|
stepNumber: z.number().int()
|
||||||
|
})
|
||||||
|
.array()
|
||||||
|
.optional()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
200: z.object({
|
200: z.object({
|
||||||
@ -216,6 +282,16 @@ export const registerAccessApprovalPolicyRouter = async (server: FastifyZodProvi
|
|||||||
.object({
|
.object({
|
||||||
type: z.nativeEnum(ApproverType),
|
type: z.nativeEnum(ApproverType),
|
||||||
id: z.string().nullable().optional(),
|
id: z.string().nullable().optional(),
|
||||||
|
name: z.string().nullable().optional(),
|
||||||
|
approvalsRequired: z.number().nullable().optional()
|
||||||
|
})
|
||||||
|
.array()
|
||||||
|
.nullable()
|
||||||
|
.optional(),
|
||||||
|
bypassers: z
|
||||||
|
.object({
|
||||||
|
type: z.nativeEnum(BypasserType),
|
||||||
|
id: z.string().nullable().optional(),
|
||||||
name: z.string().nullable().optional()
|
name: z.string().nullable().optional()
|
||||||
})
|
})
|
||||||
.array()
|
.array()
|
||||||
|
@ -60,7 +60,8 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
method: "GET",
|
method: "GET",
|
||||||
schema: {
|
schema: {
|
||||||
querystring: z.object({
|
querystring: z.object({
|
||||||
projectSlug: z.string().trim()
|
projectSlug: z.string().trim(),
|
||||||
|
policyId: z.string().trim().optional()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
200: z.object({
|
200: z.object({
|
||||||
@ -73,6 +74,7 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
const { count } = await server.services.accessApprovalRequest.getCount({
|
const { count } = await server.services.accessApprovalRequest.getCount({
|
||||||
projectSlug: req.query.projectSlug,
|
projectSlug: req.query.projectSlug,
|
||||||
|
policyId: req.query.policyId,
|
||||||
actor: req.permission.type,
|
actor: req.permission.type,
|
||||||
actorId: req.permission.id,
|
actorId: req.permission.id,
|
||||||
actorOrgId: req.permission.orgId,
|
actorOrgId: req.permission.orgId,
|
||||||
@ -89,7 +91,7 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
schema: {
|
schema: {
|
||||||
querystring: z.object({
|
querystring: z.object({
|
||||||
projectSlug: z.string().trim(),
|
projectSlug: z.string().trim(),
|
||||||
authorProjectMembershipId: z.string().trim().optional(),
|
authorUserId: z.string().trim().optional(),
|
||||||
envSlug: z.string().trim().optional()
|
envSlug: z.string().trim().optional()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
@ -112,7 +114,16 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
id: z.string(),
|
id: z.string(),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
approvals: z.number(),
|
approvals: z.number(),
|
||||||
approvers: z.string().array(),
|
approvers: z
|
||||||
|
.object({
|
||||||
|
userId: z.string().nullable().optional(),
|
||||||
|
sequence: z.number().nullable().optional(),
|
||||||
|
approvalsRequired: z.number().nullable().optional(),
|
||||||
|
email: z.string().nullable().optional(),
|
||||||
|
username: z.string().nullable().optional()
|
||||||
|
})
|
||||||
|
.array(),
|
||||||
|
bypassers: z.string().array(),
|
||||||
secretPath: z.string().nullish(),
|
secretPath: z.string().nullish(),
|
||||||
envId: z.string(),
|
envId: z.string(),
|
||||||
enforcementLevel: z.string(),
|
enforcementLevel: z.string(),
|
||||||
@ -134,7 +145,7 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
handler: async (req) => {
|
handler: async (req) => {
|
||||||
const { requests } = await server.services.accessApprovalRequest.listApprovalRequests({
|
const { requests } = await server.services.accessApprovalRequest.listApprovalRequests({
|
||||||
projectSlug: req.query.projectSlug,
|
projectSlug: req.query.projectSlug,
|
||||||
authorProjectMembershipId: req.query.authorProjectMembershipId,
|
authorUserId: req.query.authorUserId,
|
||||||
envSlug: req.query.envSlug,
|
envSlug: req.query.envSlug,
|
||||||
actor: req.permission.type,
|
actor: req.permission.type,
|
||||||
actorId: req.permission.id,
|
actorId: req.permission.id,
|
||||||
@ -154,7 +165,8 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
requestId: z.string().trim()
|
requestId: z.string().trim()
|
||||||
}),
|
}),
|
||||||
body: z.object({
|
body: z.object({
|
||||||
status: z.enum([ApprovalStatus.APPROVED, ApprovalStatus.REJECTED])
|
status: z.enum([ApprovalStatus.APPROVED, ApprovalStatus.REJECTED]),
|
||||||
|
bypassReason: z.string().min(10).max(1000).optional()
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
200: z.object({
|
200: z.object({
|
||||||
@ -170,7 +182,8 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv
|
|||||||
actorOrgId: req.permission.orgId,
|
actorOrgId: req.permission.orgId,
|
||||||
actorAuthMethod: req.permission.authMethod,
|
actorAuthMethod: req.permission.authMethod,
|
||||||
requestId: req.params.requestId,
|
requestId: req.params.requestId,
|
||||||
status: req.body.status
|
status: req.body.status,
|
||||||
|
bypassReason: req.body.bypassReason
|
||||||
});
|
});
|
||||||
|
|
||||||
return { review };
|
return { review };
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
import z from "zod";
|
import z from "zod";
|
||||||
|
|
||||||
import { readLimit } from "@app/server/config/rateLimiter";
|
|
||||||
import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
|
|
||||||
import { AppConnection } from "@app/services/app-connection/app-connection-enums";
|
|
||||||
import {
|
import {
|
||||||
CreateOCIConnectionSchema,
|
CreateOCIConnectionSchema,
|
||||||
SanitizedOCIConnectionSchema,
|
SanitizedOCIConnectionSchema,
|
||||||
UpdateOCIConnectionSchema
|
UpdateOCIConnectionSchema
|
||||||
} from "@app/services/app-connection/oci";
|
} from "@app/ee/services/app-connections/oci";
|
||||||
|
import { readLimit } from "@app/server/config/rateLimiter";
|
||||||
|
import { verifyAuth } from "@app/server/plugins/auth/verify-auth";
|
||||||
|
import { AppConnection } from "@app/services/app-connection/app-connection-enums";
|
||||||
import { AuthMode } from "@app/services/auth/auth-type";
|
import { AuthMode } from "@app/services/auth/auth-type";
|
||||||
|
|
||||||
import { registerAppConnectionEndpoints } from "./app-connection-endpoints";
|
import { registerAppConnectionEndpoints } from "../../../../server/routes/v1/app-connection-routers/app-connection-endpoints";
|
||||||
|
|
||||||
export const registerOCIConnectionRouter = async (server: FastifyZodProvider) => {
|
export const registerOCIConnectionRouter = async (server: FastifyZodProvider) => {
|
||||||
registerAppConnectionEndpoints({
|
registerAppConnectionEndpoints({
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user